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​