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": [] +} +``` + +