Skip to main content

Singapore ๐Ÿ‡ธ๐Ÿ‡ฌ

InvoiceNow (Peppol Singapore) and e-invoicing requirements.

Overviewโ€‹

AspectDetails
B2G StatusInvoiceNow encouraged
B2B StatusGrowing adoption via InvoiceNow
FormatPeppol BIS 3.0
Primary Scheme0195 (UEN)
AuthorityIMDA (Infocomm Media Development Authority)
InvoiceNow Network

Singapore's InvoiceNow is built on Peppol infrastructure. GoRoute connects to InvoiceNow via the Peppol network.

Identifier Schemesโ€‹

UEN - Unique Entity Number (0195)โ€‹

The standard Singapore business identifier:

# Format varies by entity type
participant = {
"scheme": "0195",
"identifier": "200012345A", # Business UEN
"name": "Example Pte Ltd",
"country": "SG"
}

UEN Formatsโ€‹

TypeFormatExample
Business10 chars (YYYYNNNNNX)200012345A
Local Company9-10 chars (NNNNNNNNX)12345678A
Foreign CompanyT + year + 2 chars + 5 digits + letterT20FC01234A
OthersVariousS12AB3456C

Validation:

import re

def validate_uen(uen: str) -> bool:
"""Validate Singapore UEN."""
if not uen or len(uen) < 9 or len(uen) > 10:
return False

# Business UEN: starts with year (19xx or 20xx)
business_pattern = r'^(19|20)\d{2}[0-9]{5}[A-Z]$'

# Local company: 9 digits + letter
local_pattern = r'^\d{9}[A-Z]$'

# Foreign company: starts with T
foreign_pattern = r'^T\d{2}[A-Z]{2}\d{5}[A-Z]$'

return (re.match(business_pattern, uen) or
re.match(local_pattern, uen) or
re.match(foreign_pattern, uen)) is not None

GST Registration Number (9914)โ€‹

For GST-registered businesses:

# Format: same as UEN, or M + 8 digits + letter
participant = {
"scheme": "9914",
"identifier": "200012345A",
"name": "Example Pte Ltd",
"country": "SG"
}

InvoiceNowโ€‹

What is InvoiceNow?โ€‹

InvoiceNow is Singapore's national e-invoicing network, built on Peppol:

Supplier โ†’ GoRoute (Peppol AP) โ†’ InvoiceNow โ†’ Receiver

Benefitsโ€‹

  • Direct delivery to accounting systems
  • Faster payment processing
  • Reduced errors in data entry
  • IMDA grants available for adoption

Invoice Requirementsโ€‹

Standard Singapore Invoiceโ€‹

<Invoice>
<cbc:CustomizationID>urn:cen.eu:en16931:2017#conformant#urn:fdc:peppol.eu:2017:poacc:billing:international:sg:3.0</cbc:CustomizationID>
<cbc:ProfileID>urn:fdc:peppol.eu:2017:poacc:billing:01:1.0</cbc:ProfileID>

<cbc:ID>SG-INV-2024-00123</cbc:ID>
<cbc:IssueDate>2024-01-15</cbc:IssueDate>
<cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode>
<cbc:DocumentCurrencyCode>SGD</cbc:DocumentCurrencyCode>

<!-- Singapore Seller -->
<cac:AccountingSupplierParty>
<cac:Party>
<cbc:EndpointID schemeID="0195">200012345A</cbc:EndpointID>

<cac:PartyTaxScheme>
<cbc:CompanyID>200012345A</cbc:CompanyID>
<cac:TaxScheme>
<cbc:ID>GST</cbc:ID>
</cac:TaxScheme>
</cac:PartyTaxScheme>

<cac:PartyLegalEntity>
<cbc:RegistrationName>Example Pte Ltd</cbc:RegistrationName>
<cbc:CompanyID schemeID="0195">200012345A</cbc:CompanyID>
</cac:PartyLegalEntity>
</cac:Party>
</cac:AccountingSupplierParty>
</Invoice>

Singapore-Specific CustomizationIDโ€‹

<!-- Singapore Peppol BIS extension -->
<cbc:CustomizationID>urn:cen.eu:en16931:2017#conformant#urn:fdc:peppol.eu:2017:poacc:billing:international:sg:3.0</cbc:CustomizationID>

GST Requirementsโ€‹

GST Formatโ€‹

Singapore GST uses either UEN or M-number:

# GST number formats
gst_numbers = {
"standard": "200012345A", # Same as UEN
"m_format": "M12345678A" # M + 8 digits + letter
}

GST Ratesโ€‹

CodeRateDescription
SR9%Standard rate (from 2024)
ZR0%Zero-rated (exports)
ES0%Exempt supply
OS0%Out of scope
GST Rate Change

Singapore GST increased to 9% on January 1, 2024 (from 8% in 2023, and 7% before).

Example Invoiceโ€‹

<?xml version="1.0" encoding="UTF-8"?>
<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2">

<cbc:CustomizationID>urn:cen.eu:en16931:2017#conformant#urn:fdc:peppol.eu:2017:poacc:billing:international:sg:3.0</cbc:CustomizationID>
<cbc:ProfileID>urn:fdc:peppol.eu:2017:poacc:billing:01:1.0</cbc:ProfileID>

<cbc:ID>SG-INV-2024-00123</cbc:ID>
<cbc:IssueDate>2024-01-15</cbc:IssueDate>
<cbc:DueDate>2024-02-15</cbc:DueDate>
<cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode>
<cbc:DocumentCurrencyCode>SGD</cbc:DocumentCurrencyCode>

<!-- Singapore Seller -->
<cac:AccountingSupplierParty>
<cac:Party>
<cbc:EndpointID schemeID="0195">200012345A</cbc:EndpointID>
<cac:PartyName>
<cbc:Name>Example Pte Ltd</cbc:Name>
</cac:PartyName>
<cac:PostalAddress>
<cbc:StreetName>123 Orchard Road</cbc:StreetName>
<cbc:AdditionalStreetName>#10-01</cbc:AdditionalStreetName>
<cbc:CityName>Singapore</cbc:CityName>
<cbc:PostalZone>238867</cbc:PostalZone>
<cac:Country>
<cbc:IdentificationCode>SG</cbc:IdentificationCode>
</cac:Country>
</cac:PostalAddress>
<cac:PartyTaxScheme>
<cbc:CompanyID>200012345A</cbc:CompanyID>
<cac:TaxScheme>
<cbc:ID>GST</cbc:ID>
</cac:TaxScheme>
</cac:PartyTaxScheme>
<cac:PartyLegalEntity>
<cbc:RegistrationName>Example Pte Ltd</cbc:RegistrationName>
<cbc:CompanyID schemeID="0195">200012345A</cbc:CompanyID>
</cac:PartyLegalEntity>
<cac:Contact>
<cbc:Name>John Tan</cbc:Name>
<cbc:Telephone>+6562345678</cbc:Telephone>
<cbc:ElectronicMail>invoice@example.com.sg</cbc:ElectronicMail>
</cac:Contact>
</cac:Party>
</cac:AccountingSupplierParty>

<!-- Singapore Buyer -->
<cac:AccountingCustomerParty>
<cac:Party>
<cbc:EndpointID schemeID="0195">198712345K</cbc:EndpointID>
<cac:PartyName>
<cbc:Name>Customer Pte Ltd</cbc:Name>
</cac:PartyName>
<cac:PostalAddress>
<cbc:StreetName>1 Marina Boulevard</cbc:StreetName>
<cbc:AdditionalStreetName>#20-01</cbc:AdditionalStreetName>
<cbc:CityName>Singapore</cbc:CityName>
<cbc:PostalZone>018989</cbc:PostalZone>
<cac:Country>
<cbc:IdentificationCode>SG</cbc:IdentificationCode>
</cac:Country>
</cac:PostalAddress>
<cac:PartyTaxScheme>
<cbc:CompanyID>198712345K</cbc:CompanyID>
<cac:TaxScheme>
<cbc:ID>GST</cbc:ID>
</cac:TaxScheme>
</cac:PartyTaxScheme>
<cac:PartyLegalEntity>
<cbc:RegistrationName>Customer Pte Ltd</cbc:RegistrationName>
</cac:PartyLegalEntity>
</cac:Party>
</cac:AccountingCustomerParty>

<cac:PaymentMeans>
<cbc:PaymentMeansCode>30</cbc:PaymentMeansCode>
<cac:PayeeFinancialAccount>
<cbc:ID>1234567890</cbc:ID>
<cbc:Name>Example Pte Ltd</cbc:Name>
<cac:FinancialInstitutionBranch>
<cbc:ID>DBSSSGSG</cbc:ID>
<cbc:Name>DBS Bank</cbc:Name>
</cac:FinancialInstitutionBranch>
</cac:PayeeFinancialAccount>
</cac:PaymentMeans>

<cac:TaxTotal>
<cbc:TaxAmount currencyID="SGD">90.00</cbc:TaxAmount>
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="SGD">1000.00</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="SGD">90.00</cbc:TaxAmount>
<cac:TaxCategory>
<cbc:ID>SR</cbc:ID>
<cbc:Percent>9</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>GST</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:TaxSubtotal>
</cac:TaxTotal>

<cac:LegalMonetaryTotal>
<cbc:LineExtensionAmount currencyID="SGD">1000.00</cbc:LineExtensionAmount>
<cbc:TaxExclusiveAmount currencyID="SGD">1000.00</cbc:TaxExclusiveAmount>
<cbc:TaxInclusiveAmount currencyID="SGD">1090.00</cbc:TaxInclusiveAmount>
<cbc:PayableAmount currencyID="SGD">1090.00</cbc:PayableAmount>
</cac:LegalMonetaryTotal>

<cac:InvoiceLine>
<cbc:ID>1</cbc:ID>
<cbc:InvoicedQuantity unitCode="HUR">10</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="SGD">1000.00</cbc:LineExtensionAmount>
<cac:Item>
<cbc:Name>IT Consulting Services</cbc:Name>
<cac:ClassifiedTaxCategory>
<cbc:ID>SR</cbc:ID>
<cbc:Percent>9</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>GST</cbc:ID>
</cac:TaxScheme>
</cac:ClassifiedTaxCategory>
</cac:Item>
<cac:Price>
<cbc:PriceAmount currencyID="SGD">100.00</cbc:PriceAmount>
</cac:Price>
</cac:InvoiceLine>
</Invoice>

Looking Up Singapore Businessesโ€‹

# Lookup UEN on Peppol/InvoiceNow
response = requests.get(
"https://app.goroute.ai/peppol-api/api/v1/participants/lookup",
params={
"scheme": "0195",
"identifier": "200012345A"
},
headers={"X-API-Key": "your_api_key"}
)

# Check InvoiceNow registration
if response.json()["registered"]:
print("Business is on InvoiceNow!")

IMDA Grantsโ€‹

IMDA offers grants for InvoiceNow adoption:

  • Productivity Solutions Grant (PSG) for accounting software
  • SME Go Digital programs
  • Check IMDA for current incentives

Cross-Border Invoicingโ€‹

Singapore to EUโ€‹

# Send from Singapore to EU
response = requests.post(
"https://app.goroute.ai/peppol-api/api/v1/send",
headers={"X-API-Key": "your_api_key"},
json={
"sender": {
"scheme": "0195",
"identifier": "200012345A"
},
"receiver": {
"scheme": "9930", # German VAT
"identifier": "DE123456789"
},
"document": base64_invoice
}
)

EU to Singaporeโ€‹

# Send from EU to Singapore
response = requests.post(
"https://app.goroute.ai/peppol-api/api/v1/send",
headers={"X-API-Key": "your_api_key"},
json={
"sender": {
"scheme": "9930",
"identifier": "DE123456789"
},
"receiver": {
"scheme": "0195",
"identifier": "198712345K"
},
"document": base64_invoice
}
)

Resourcesโ€‹

Next Stepsโ€‹