diff --git a/docs.json b/docs.json
index 1e9274c4..3f723bd4 100644
--- a/docs.json
+++ b/docs.json
@@ -101,7 +101,10 @@
"guides/countries/pt-at"
]
},
-
+ {
+ "group": "🇸🇬 Singapore",
+ "pages": ["guides/countries/sg-invoicenow"]
+ },
{
"group": "🇪🇸 Spain",
"pages": [
diff --git a/guides/countries/sg-invoicenow.mdx b/guides/countries/sg-invoicenow.mdx
new file mode 100644
index 00000000..5ad819c8
--- /dev/null
+++ b/guides/countries/sg-invoicenow.mdx
@@ -0,0 +1,289 @@
+---
+title: "Singapore - InvoiceNow"
+sidebarTitle: "InvoiceNow"
+description: Send and receive invoices in Singapore through InvoiceNow
+---
+
+import SupplierRegistration from '/snippets/workflows/templates/sg/sg-invoicenow-register.mdx';
+import ReceiveInvoice from '/snippets/workflows/templates/sg/sg-invoicenow-receive.mdx';
+import ReceiveAndReport from '/snippets/workflows/templates/sg/sg-invoicenow-receive-and-report.mdx';
+import SendInvoice from '/snippets/workflows/templates/sg/sg-invoicenow-send.mdx';
+import SendAndReport from '/snippets/workflows/templates/sg/sg-invoicenow-send-and-report.mdx';
+
+## Introduction
+
+InvoiceNow is Singapore’s nationwide e‑invoicing platform. It is the local implementation of the international Peppol e‑invoicing network. Through InvoiceNow you can:
+- Send and receive Peppol invoices in Singapore
+- Report invoices to IRAS
+
+This guide covers:
+
+1. How to register a supplier in InvoiceNow.
+2. How to authorize our local partner (Storecove) to report invoices to IRAS on your behalf.
+3. How to configure workflows for receiving invoices via InvoiceNow.
+4. How to configure workflows for sending invoices via InvoiceNow.
+
+## Prerequisites
+
+In order to register a supplier and issue invoices, you will need:
+
+- Supplier details, including:
+ - Legal Business name
+ - Tax ID (UEN)
+ - Business address
+ - Peppol ID: `SGUEN` + your UEN (example: `SGUEN1234567890`).
+- Corppass account: A [Corppass account](https://www.corppass.gov.sg/portal) is required for InvoiceNow registration.
+
+## Setup
+
+
+
+ 1. Go to **Configuration** → **Apps** in the [Console](https://console.invopop.com).
+ 2. Find **InvoiceNow Singapore** in the app list.
+ 3. Click **Connect** to activate the app.
+
+ After connecting, you'll see InvoiceNow Singapore listed in the Enabled Apps section.
+
+
+
+ Create a new workflow in your workspace for registering suppliers for invoice sending, receiving and reporting to IRAS. You should start with the template below:
+
+
+
+
+ This workflow will issue a registration request for a supplier to complete.
+
+
+
+ Copy and paste into a new [Empty Party workflow](https://console.invopop.com/redirect/workflows/new?template=empty-party) code view.
+
+
+
+
+ Before starting, review the [workflows guide](/guides/features/workflows) to understand the general setup process.
+
+ In [Console](https://console.invopop.com), create a new workflow and choose [Empty Party workflow](https://console.invopop.com/redirect/workflows/new?template=empty-party) as the base. Then name the workflow with a descriptive label such as "InvoiceNow Supplier Registration".
+
+ The new workflow will need to perform the following steps:
+
+ 1. **Set State** — select "Processing".
+ 2. **Register in InvoiceNow** - Register the supplier in InvoiceNow.
+ 3. **Authorize IRAS Reporting** - Authorize Storecove to report invoices to IRAS on your behalf.
+ 4. **Set State** — select "Registered".
+
+ Finally, in the Error Handling area, add the **Set State** action and select `Error`.
+
+ Add any additional steps you may need, and save the new workflow.
+
+
+
+
+
+ If you need to receive invoices via InvoiceNow, create a workflow for processing incoming invoices. Choose the appropriate workflow based on whether you need to report received invoices to IRAS.
+
+
+
+ Use this workflow if you only need to import invoices without reporting them to IRAS.
+
+ Copy and paste into a new [Empty Invoice workflow](https://console.invopop.com/redirect/workflows/new?template=empty-invoice) code view.
+
+
+
+
+ Use this workflow if you need to import invoices and report them to IRAS as purchase invoices.
+
+ Copy and paste into a new [Empty Invoice workflow](https://console.invopop.com/redirect/workflows/new?template=empty-invoice) code view.
+
+
+
+
+ Before starting, review the [workflows guide](/guides/features/workflows) to understand the general setup process.
+
+ In [Console](https://console.invopop.com), create a new workflow and choose [Empty Invoice workflow](https://console.invopop.com/redirect/workflows/new?template=empty-invoice) as the base. Then name the workflow with a descriptive label such as "InvoiceNow Receive Invoices".
+
+ The workflow should include:
+
+ 1. **Import invoices via InvoiceNow** — imports incoming invoices from the InvoiceNow network.
+ 2. **Report purchase invoice** (optional) — if you need to report received invoices to IRAS, add this step after the import step.
+
+ Add any additional steps you may need, and save the new workflow.
+
+
+
+
+ After creating this workflow, you must configure it in the InvoiceNow app settings to automatically process all incoming invoices. Navigate to **Configuration** → **Apps**, find **InvoiceNow Singapore**, click **Configure**, and select this workflow in the app configuration.
+
+
+
+
+ Create a workflow for sending invoices via InvoiceNow. Choose the appropriate workflow based on whether you need to report sent invoices to IRAS.
+
+
+
+ Use this workflow if you only need to send invoices without reporting them to IRAS.
+
+ Copy and paste into a new [Empty Invoice workflow](https://console.invopop.com/redirect/workflows/new?template=empty-invoice) code view.
+
+
+
+
+ Use this workflow if you need to send invoices and report them to IRAS in a single step.
+
+ Copy and paste into a new [Empty Invoice workflow](https://console.invopop.com/redirect/workflows/new?template=empty-invoice) code view.
+
+
+
+
+ Before starting, review the [workflows guide](/guides/features/workflows) to understand the general setup process.
+
+ In [Console](https://console.invopop.com), create a new workflow and choose [Empty Invoice workflow](https://console.invopop.com/redirect/workflows/new?template=empty-invoice) as the base. Then name the workflow with a descriptive label such as "InvoiceNow Send Invoices".
+
+ The workflow should include one of the following:
+
+ **Option 1: Send only**
+ 1. **Send invoice via InvoiceNow** — sends the invoice through the InvoiceNow network.
+
+ **Option 2: Send and report**
+ 1. **Send invoice via InvoiceNow and report to IRAS** — sends the invoice and reports it to IRAS in a single step.
+
+ Add any additional steps you may need (such as PDF generation or email delivery), and save the new workflow.
+
+
+
+
+
+## Running
+
+### Register a Supplier
+
+There are two registration paths depending on your needs:
+
+1. Send/receive invoices only → Register your company in InvoiceNow.
+2. Send/receive + IRAS reporting → Register in InvoiceNow and authorize Storecove for reporting.
+
+
+
+First, create a supplier in Invopop with:
+
+- Legal Business name
+- Tax ID (UEN)
+- Business address
+- Peppol ID (key: `peppol`, scheme: `0195`, code: `SGUEN` + your UEN).
+
+Here is a JSON example of a supplier:
+```json
+{
+ "$schema": "https://gobl.org/draft-0/org/party",
+ "uuid": "0199625b-5e4b-7000-8f52-d34327b98f92",
+ "name": "Singapore Company",
+ "tax_id": {
+ "country": "SG",
+ "code": "199912345A"
+ },
+ "inboxes": [
+ {
+ "key": "peppol",
+ "scheme": "0195",
+ "code": "SGUEN199912345A"
+ }
+ ],
+ "addresses": [
+ {
+ "street": "123 Main St",
+ "locality": "Singapore",
+ "code": "123456",
+ "country": "SG"
+ }
+ ]
+}
+```
+
+Next, run the `Register in InvoiceNow` step.
+- This validates the supplier details and generates a Corppass URL.
+- You have **25 minutes** to complete the Corppass flow.
+- If the time expires, the step ends in `KO`, and you'll need to re-run it.
+
+Once completed successfully (`OK`), the supplier is registered and can send/receive invoices via Peppol in Singapore.
+
+
+
+If you also need to report invoices to IRAS:
+1. Run the `Authorize IRAS reporting` step.
+ - This requires completing the `Register in InvoiceNow` step first.
+ - Without InvoiceNow registration, you cannot report invoices to IRAS.
+2. The process is similar to registration:
+ - A Corppass URL is generated.
+ - You have **25 minutes** to complete authorization.
+ - If the time expires, the step ends in `KO`, and you'll need to re-run it.
+
+Once successful (`OK`), Storecove will be authorized to report invoices to IRAS on your behalf.
+
+
+
+### Receive Invoices
+
+Once you've configured a receiving workflow and connected it to the InvoiceNow app, incoming invoices will be automatically imported and processed.
+
+
+
+ To enable automatic invoice import:
+
+ 1. Navigate to **Configuration** → **Apps** in the [Console](https://console.invopop.com).
+ 2. Find **InvoiceNow Singapore** in the Enabled Apps section.
+ 3. Click **Configure**.
+ 4. Select your receiving workflow (created in the Setup section) from the dropdown.
+ 5. Click **Save**.
+
+ All invoices received via InvoiceNow will now be automatically sent to this workflow for processing.
+
+
+
+ Received invoices will appear in your workspace's **Invoices** section with the status reflecting the workflow's processing:
+
+ - If using the **Import only** workflow, invoices will be imported and stored in your workspace.
+ - If using the **Import and Report** workflow, invoices will be imported and then reported to IRAS as purchase invoices.
+
+ You can track the status of each invoice in the Console or via the API.
+
+
+
+### Send Invoices
+
+To send invoices via InvoiceNow, create GOBL invoice documents and send them to your invoice sending workflow.
+
+
+
+ Create a GOBL invoice with the necessary details:
+
+ - Supplier information (must match a registered supplier)
+ - Customer information including their Peppol ID
+ - Line items with descriptions, quantities, and prices
+ - Applicable tax rates
+
+ Ensure the customer has a Peppol ID configured in their `inboxes` field with:
+ - `key`: `peppol`
+ - `scheme`: `0195` (for Singapore)
+ - `code`: `SGUEN` + customer's UEN
+
+
+
+
+ Send the invoice to your configured sending workflow:
+
+ - If using the **Send only** workflow, the invoice will be transmitted via InvoiceNow.
+ - If using the **Send and report** workflow, the invoice will be sent and simultaneously reported to IRAS.
+
+ The invoice will be delivered to the customer's Peppol access point based on their Peppol ID.
+
+
+
+ Monitor the invoice status in the Console in the Silo Entry Meta:
+
+ - **Sent**: Successfully delivered via InvoiceNow
+ - **Reported**: Successfully reported to IRAS (if using send-and-report workflow)
+ - **Error**: Check the workflow logs for detailed error information
+
+ You can view delivery confirmations and any error messages in the invoice details.
+
+
+
diff --git a/snippets/workflows/templates/sg/sg-invoicenow-receive-and-report.mdx b/snippets/workflows/templates/sg/sg-invoicenow-receive-and-report.mdx
new file mode 100644
index 00000000..2012232e
--- /dev/null
+++ b/snippets/workflows/templates/sg/sg-invoicenow-receive-and-report.mdx
@@ -0,0 +1,23 @@
+```json
+{
+ "name": "InvoiceNow Receive and Report",
+ "description": "",
+ "steps": [
+ {
+ "id": "98ed63d0-9ee1-11f0-9539-cb68a1df1b45",
+ "name": "Import invoices via InvoiceNow",
+ "provider": "invoicenow.import",
+ "next": []
+ },
+ {
+ "id": "d5c655d0-a294-11f0-bc0c-75c861838db7",
+ "name": "Report purchase invoice",
+ "provider": "invoicenow.report-purchase",
+ "next": []
+ }
+ ],
+ "rescue": []
+}
+```
+
+
diff --git a/snippets/workflows/templates/sg/sg-invoicenow-receive.mdx b/snippets/workflows/templates/sg/sg-invoicenow-receive.mdx
new file mode 100644
index 00000000..f9491c9c
--- /dev/null
+++ b/snippets/workflows/templates/sg/sg-invoicenow-receive.mdx
@@ -0,0 +1,17 @@
+```json
+{
+ "name": "Import invoices via InvoiceNow",
+ "description": "",
+ "steps": [
+ {
+ "id": "98ed63d0-9ee1-11f0-9539-cb68a1df1b45",
+ "name": "Import invoices via InvoiceNow",
+ "provider": "invoicenow.import",
+ "next": []
+ }
+ ],
+ "rescue": []
+}
+```
+
+
diff --git a/snippets/workflows/templates/sg/sg-invoicenow-register.mdx b/snippets/workflows/templates/sg/sg-invoicenow-register.mdx
new file mode 100644
index 00000000..3a489d9c
--- /dev/null
+++ b/snippets/workflows/templates/sg/sg-invoicenow-register.mdx
@@ -0,0 +1,61 @@
+---
+title: "InvoiceNow supplier registration"
+description: "Register a supplier in InvoiceNow"
+countryCode: "sg"
+appId: "invoicenow"
+schema: "org/party"
+---
+
+
+```json Example InvoiceNow supplier registration workflow with states
+{
+ "name": "InvoiceNow Registration Workflow",
+ "schema": "org/party",
+ "description": "",
+ "steps": [
+ {
+ "id": "2c5f3bd0-9d3d-11f0-b90d-db9398d2aaf8",
+ "name": "Set Silo Entry State",
+ "provider": "silo.state",
+ "next": [],
+ "summary": "Set state to `processing`{.state .processing}",
+ "config": {
+ "state": "processing"
+ }
+ },
+ {
+ "id": "9931bc00-956e-11f0-8804-b12626466c0b",
+ "name": "Register in InvoiceNow",
+ "provider": "invoicenow.register",
+ "next": []
+ },
+ {
+ "id": "2c316bf0-9564-11f0-8d20-9388ce180b95",
+ "name": "Authorize IRAS Reporting",
+ "provider": "invoicenow.authorize",
+ "next": []
+ },
+ {
+ "id": "3c1e4cf0-9d3d-11f0-b90d-db9398d2aaf8",
+ "name": "Set Silo Entry State",
+ "provider": "silo.state",
+ "next": [],
+ "summary": "Set state to `registered`{.state .registered}",
+ "config": {
+ "state": "registered"
+ }
+ }
+ ],
+ "rescue": [
+ {
+ "id": "7a8bcd20-a32b-11ef-9707-79bbd71238cd",
+ "name": "Set Silo Entry State",
+ "config": {
+ "state": "error"
+ },
+ "summary": "Set state to `error`{.state .error}",
+ "provider": "silo.state"
+ }
+ ]
+}
+```
\ No newline at end of file
diff --git a/snippets/workflows/templates/sg/sg-invoicenow-send-and-report.mdx b/snippets/workflows/templates/sg/sg-invoicenow-send-and-report.mdx
new file mode 100644
index 00000000..098d9594
--- /dev/null
+++ b/snippets/workflows/templates/sg/sg-invoicenow-send-and-report.mdx
@@ -0,0 +1,17 @@
+```json
+{
+ "name": "Send and report invoice SG",
+ "description": "",
+ "steps": [
+ {
+ "id": "e1570e40-a4ff-11f0-b53a-bd80aefb58db",
+ "name": "Send invoice via InvoiceNow and report to IRAS",
+ "provider": "invoicenow.send-and-report",
+ "next": []
+ }
+ ],
+ "rescue": []
+}
+```
+
+
diff --git a/snippets/workflows/templates/sg/sg-invoicenow-send.mdx b/snippets/workflows/templates/sg/sg-invoicenow-send.mdx
new file mode 100644
index 00000000..37e9869a
--- /dev/null
+++ b/snippets/workflows/templates/sg/sg-invoicenow-send.mdx
@@ -0,0 +1,17 @@
+```json
+{
+ "name": "Send invoice via InvoiceNow",
+ "description": "",
+ "steps": [
+ {
+ "id": "3c8f5220-a42b-11f0-95f3-ad0019fe7531",
+ "name": "Send invoice via InvoiceNow",
+ "provider": "invoicenow.send",
+ "next": []
+ }
+ ],
+ "rescue": []
+}
+```
+
+