# Profile Source: https://docs.invopop.com/admin/acc-info Manage your personal profile details, contact information, locale and display preferences. To manage your personal/account information, navigate to **Profile** in the left-hand menu and click on **Info** in the account area. In the **Personal Info** section you can change your personal information and avatar. The **Organizations** section will display which organization(s) you are a member of. # Account security Source: https://docs.invopop.com/admin/acc-security View and revoke your sessions Our security page allows you to view and revoke your sessions. **Devices** will display the devices you have logged in from. The number is the IP address of the device. Underneath the IP you will see the browser name, version and operating system. **App** will usually display "Invopop Console" as the app name, however other products by Invopop which require authentication can be displayed here. **Initiated** will display the date and time of the session. **Disconnect** button allows you to revoke the session. If the same device is used to access Invopop Console again, you will be prompted to re-authenticate. # Add a billing account Source: https://docs.invopop.com/admin/billing-account Create and configure a billing account for subscriptions, invoices, and payment methods. Billing accounts are used to associate workspaces with a specific payment method and tax information. Most companies will need to create a single billing account for all their workspaces, but if you need to use different payment methods or tax information for different workspaces, you can create multiple billing accounts. ## Billing accounts list All accounts start with a free sandbox billing account. This gives access to sandbox functionality and allows you to keep track of the pops usage of your sandbox workspaces. Billing Accounts List In order to have live workspaces, you need to create a live billing account. This will give access to live functionality and allow you to issue real invoices. ## Create a billing account To create a billing account, click on the Create billing account button in the top right corner of the billing page. You will be prompted to name the account. We recommend naming the account after your company or organization + "billing" or "account". Create a billing account form ## Add your invoicing information Go to the Billing details section, and select Add invoicing information. Billing Billingdetails Homepage Introduce your tax information and click on Save. billing-invoicing-form Introducing your tax information will allow Invopop to issue invoices for our services. ## Add a payment method Click on the Add payment method button to add a payment method to your billing account. You will be redirected to a Stripe page to add your payment method. Once you have added your payment method, you will be redirected back to the billing account page. ## Select a subscription plan In the Subscription section, click on the Choose a plan button to select a subscription plan for your billing account. Choose Subscription On the next screen you will be asked to select a payment currency. Billing Subscription Currency Once you click Next , you will need to choose your payment frequency and subscription plan. Select: * A **pop tier**, based on predicted usage (actions + seats) * **Countries** - where you will use Invopop; your fist country is included at no extra cost * **Integrations -** self-service paid connector apps such as Chargebee or Stripe * **Pro features -** including chat and email support, unlimited users, removing Invopop's watermark from PDFs and emails, generating audit logs and access to ISO27001. Billing Subscription Products Once all your products are added, click Save . Once you have completed the subscription process, you will be able to create live workspaces. ## FAQ This option is only available for Enterprise plans. # Modify or cancel your subscription Source: https://docs.invopop.com/admin/billing-change-plan Modify or cancel your subscription to Invopop. **Note:** To connect an app in your live workspace, first add it to your subscription. Free apps are no exception: your first country app costs nothing, but it still has to appear on your plan before you can use it. To modify or cancel your subscription, navigate to **Billing,** go to the **Subscription** section, and click on the three dots on the right.  Billing Modify Subscription Once you click Modify , you will be able to remove or add products to your subscription. Billing Modify Subscription Products ## FAQ Get in touch with us at [support@invopop.com](mailto:support@invopop.com), and we will modify it for you. # Check your pop consumption Source: https://docs.invopop.com/admin/billing-change-plan-2 You can track your pop usage by checking the progress bar in your billing account. Pops usage progress bar in the billing account To see the pop consumption linked to the Seats you are using, click on the live Billing Account. In the **Seats** section you will find the list of apps, the seat count each has, as well as the associated pops. Billing Pops Seats ## FAQ To continue using Invopop you will need to upgrade your plan to the next pop tier. Technically, a **Seat** corresponds to a Tax ID registered to issue invoices in a specific network. Every account needs at least one. In practice, most companies need only one seat or a handful. Some, however, use Invopop to provide e-invoicing to their own customers: each customer registered counts as a seat. Every seat consumes pops from your monthly allowance: 100 pops are deducted the moment you register it, and 100 pops again every 30 days from that registration date for as long as it stays registered. Get in touch with us at [support@invopop.com](mailto:support@invopop.com), and unless we detect abnormal usage, we will extend your sandbox billing account with additional pops. # Disable members Source: https://docs.invopop.com/admin/member-deactivate Disable or remove a member's access to your workspace. To disable a member, click on the Disable button on the member's row. You will be prompted to confirm the action. The member will be removed from your organization and will no longer have access to your workspaces. If you need to re-enable a member, click on the **Deactivated members** tab and click on the Enable button on the member's row. You will be prompted to confirm the action. # Invite members Source: https://docs.invopop.com/admin/member-invite Add new users to your workspace Members of your organization are users who can access your workspaces and workflows. Invite team members to collaborate on invoicing, workflow management, and document processing. There is no limit on the number of members you can invite to your organization. At the moment, we don't support role-based access control. All members have the same permissions, and every member in your organization will have access to all your workspaces. We're planning to implement workspace-level access control in the future. ## Invite a new member To invite a new member to your organization: 1. Navigate to the **Members** section in admin. 2. Click the Invite member button in the top right corner. 3. Fill in the invitation form with the member's details. 4. Click Send invitation. | | | | ---------------------- | ------------------------------------------------------------------------------------------------------------------- | | **Email address** | The email address of the person you want to invite. They will introduce their name when they accept the invitation. | | **Position** | Enter the member's job title or role. This field helps identify team members in the members list. | | **Message (optional)** | Optional message included in the invitation email. | The invited member receives an email with a link to join your organization. When they accept the invitation: * They gain access to all workspaces associated with your organization * They can view and manage workflows, documents, and settings * They appear in your members list with their email address and position All members have full access to all workspaces in your organization. Only invite people you trust with access to your invoicing and document management systems. ## FAQ Yes. When they click the invitation link, they'll be prompted to create an account before joining your organization. Yes. If a member is invited to multiple organizations, they will have access to all workspaces in all organizations. This is useful for consultants who can provide services to multiple clients. All members have the same permissions. They can access all workspaces, create and edit workflows, manage documents, and configure settings. Role-based access control is planned for a future release. Yes, invited members will appear in the members list immediately, and you can disable them if needed. See [Deactivate members](/admin/member-deactivate) for details. # Create & configure workspaces Source: https://docs.invopop.com/admin/workspace-configure How to create a new workspace and adjust its settings, defaults and metadata. Your account is created with a Sandbox workspace that you can use for testing and development. Create additional workspaces to organize your operations by regime, country, or business unit. You create new workspaces in the **Workspaces** section of admin. Click the Create workspace button in the top right corner. ## Create and configure a workspace We recommend creating one workspace per regime or network. There is no limit on the number of workspaces you can create. See [Set up your account for multiple countries](/workspace/multi-country) for guidance on organizing workspaces. #### Workspace name Enter a human-readable name for your workspace. This is often your company name or a descriptive label that identifies the workspace's purpose e.g., `Enormicom ES-Live` or `Enormicom FR-Sandbox`. #### Handle The handle determines the URL of your workspace and is used in API endpoints. It's auto-generated from your workspace name, but you can customize it to your liking. Handles must be unique within Invopop and can only contain lowercase letters, numbers, and hyphens. #### Avatar flag Avatar flags are visual indicators that help you distinguish workspaces belonging to specific regimes or countries. They appear in the workspace selector and don't affect workspace behavior. Use flags to quickly identify workspaces when managing multiple countries or regions. #### Workspace color Choose a color that changes the appearance of buttons and the sidebar in your workspace. Use different colors between sandbox and production environments to easily distinguish which environment you're working in. #### Workspace type Select either **Sandbox** or **Live**: * **Sandbox**: Test and simulate behavior without issuing real invoices. No billing account required. * **Live**: Issue legally compliant invoices through tax authorities. Requires a billing account. Live workspaces issue real, legally binding invoices. Ensure you've tested your workflows in a sandbox workspace before going live. #### Billing account (Live workspaces only) Select the billing account to associate with this workspace. Multi-country organizations often need to pay for invoicing locally, so you can have multiple billing accounts and assign different workspaces to different accounts. If you haven't created a billing account yet, see [Add a billing account](/admin/billing-account) for instructions. ## FAQ No, workspaces cannot be deleted for traceability and compliance purposes. If you no longer need a workspace, you can archive it or simply stop using it. No, workspace type cannot be changed after creation. Create a new live workspace and migrate your workflows, apps, and configurations. See [From sandbox to live](/workspace/sandbox-to-live) for a complete guide. There is no limit on the number of workspaces you can create. Create as many as you need to organize your operations effectively. You can change your handle (and thus the URL of your workspace) after creation. However, proceed with caution as this will break any links to your workspace. No, you can assign multiple workspaces to the same billing account. However, multi-country organizations often use separate billing accounts for different regions to handle local payment requirements. # Authorize enrollment Source: https://docs.invopop.com/api-ref/access/enrollment/authorize POST /access/v1/enrollment/authorize Authenticate using application credentials and a specific owner ID, token, or enrollment. (Only Applications!) # Fetch enrollment Source: https://docs.invopop.com/api-ref/access/enrollment/fetch GET /access/v1/enrollment Fetch the enrollment details for the current authentication token. (Only Applications!) # Update enrollment Source: https://docs.invopop.com/api-ref/access/enrollment/update PATCH /access/v1/enrollment Update the embedded configuration details of an enrollment. (Only Applications!) # Fetch workspace Source: https://docs.invopop.com/api-ref/access/workspace/fetch GET /access/v1/workspace Fetch the workspace details associated with the current authentication token. # Update workspace Source: https://docs.invopop.com/api-ref/access/workspace/update PATCH /access/v1/workspace Update the workspace details associated with the current authentication token. # Set AT credentials Source: https://docs.invopop.com/api-ref/apps/at-pt/credentials POST /apps/at-pt/v1/entry/{silo_entry_id}/credentials Set or update the AT web services credentials for a given supplier. This endpoint lets you set or update the AT web services credentials for a supplier. Credentials are validated against the AT Series web service before being stored to ensure they are correct and active. These credentials are necessary to register series and send documents to the AT via web services. # Generate SAF-T report Source: https://docs.invopop.com/api-ref/apps/at-pt/saft GET /apps/at-pt/v1/entry/{silo_entry_id}/saft Generate and download a SAF-T PT report for the specified period. Generate and download a SAF-T PT report for the specified period. The report can be generated for a full year or a specific month. # Get series details Source: https://docs.invopop.com/api-ref/apps/at-pt/series-get GET /apps/at-pt/v1/entry/{silo_entry_id}/series/{id} Get details of a specific series by ID. Get details of a registered series by its ID, including the validation code provided by the Portuguese Tax Authority. # List series Source: https://docs.invopop.com/api-ref/apps/at-pt/series-list GET /apps/at-pt/v1/entry/{silo_entry_id}/series List all registered series with the AT for the supplier. This endpoint provides a way to list all registered series with the AT for the supplier with cursor-based pagination. # Register series Source: https://docs.invopop.com/api-ref/apps/at-pt/series-register POST /apps/at-pt/v1/entry/{silo_entry_id}/series Register a new series with the AT for the supplier. This endpoint registers a new series for the supplier. The series will be validated and registered with the Portuguese Tax Authority, and a validation code (used to generate ATCUD codes) will be returned. For a detailed explanation of the `type` field (`N`, `F`, `R`) and other Portugal-specific series requirements, see the [Series management](/guides/pt-at-supplier#series-management) section of the AT supplier registration guide. # Generate agreement PDF Source: https://docs.invopop.com/api-ref/apps/gov-es/agreement-fetch GET /apps/gov-es/v1/entry/{silo_entry_id}/{system}/agreement Generate a PDF agreement of a previously prepared org.Party silo entry. After a complete Party has been uploaded to the silo, use this API endpoint to generate a PDF version of the Invopop collaboration agreement document. # Upload agreement PDF Source: https://docs.invopop.com/api-ref/apps/gov-es/agreement-upload POST /apps/gov-es/v1/entry/{silo_entry_id}/{system}/agreement Upload a signed copy of the PDF agreement. Once the previously generated agreement has been signed by the end-user, upload to Invopop so that it will be stored as an attachment to the silo entry. # Confirm Source: https://docs.invopop.com/api-ref/apps/gov-es/confirm POST /apps/gov-es/v1/entry/{silo_entry_id}/{system}/confirm Confirm that the upload process has completed. After uploading the agreement and identity images, call this endpoint to confirm that everything has been prepared correctly and the supplier is ready to start operating. This will trigger an update to a job that is waiting for the upload process to complete. The Invopop team will promptly review the uploaded material and proceed to accept or reject the documentation after this point. In the case of rejection, the supplier will no longer be able to issue invoices, but the process to re-upload agreement material will be available again. # Upload identity image Source: https://docs.invopop.com/api-ref/apps/gov-es/identity-upload POST /apps/gov-es/v1/entry/{silo_entry_id}/{system}/identity Upload an image of an identity document. Upload a photograph of the supplier or representative's identification card or document. Be sure to choose the correct view when uploading. Uploaded images will be stored as attachments to the silo entry. # Verify tax ID Source: https://docs.invopop.com/api-ref/apps/gov-es/lookup POST /apps/gov-es/v1/lookup Verify a Spanish tax ID (NIF/CIF) against the AEAT census. The endpoint always reports whether AEAT identified the tax ID. When `correct` is `true` and the tax ID is identified, the official name registered with AEAT is also returned. Verify a Spanish tax ID (NIF/CIF) against the AEAT census without going through the registration flow. The response always reports whether AEAT identified the tax ID; set `correct` to `true` to also receive the official name registered with AEAT when the tax ID is identified. # Download agreement PDF Source: https://docs.invopop.com/api-ref/apps/gov-fr/agreement-fetch GET /apps/gov-fr/v1/entry/{silo_entry_id}/agreement Download the current agreement PDF for a silo entry. Returns the signed mandate if already signed, otherwise the unsigned template. Returns the current agreement PDF. If the signer has already completed the signing step (`POST /sign` or `POST /agreement`), the signed mandate is returned. Otherwise the unsigned template is returned, pre-filled with the party's details. # Upload pre-signed agreement Source: https://docs.invopop.com/api-ref/apps/gov-fr/agreement-upload POST /apps/gov-fr/v1/entry/{silo_entry_id}/agreement Store a mandate signed outside Invopop on the silo entry. Stores a mandate the customer has signed outside Invopop. Satisfies the `agreement` step on the approval flow. Identity verification is still required. Call `POST /identity` before or after this endpoint, then call `POST /confirm` to finalise. For in-app signing, use `POST /sign` instead. # Confirm submission Source: https://docs.invopop.com/api-ref/apps/gov-fr/confirm POST /apps/gov-fr/v1/entry/{silo_entry_id}/confirm Finalise the onboarding approval and advance the registration workflow. Finalises the approval and pokes the queued `agreement.wait.approval` task so the onboarding workflow continues. Returns the approval flow status. Identity verification (`POST /identity`) is required on both paths. In addition: * **In-app signing**: `POST /sign` must have been called. * **Pre-signed PDF**: `POST /agreement` must have been called. A `submitted` status in the response means the submission is under review; the workflow advances once a decision is made. # Upload identity image Source: https://docs.invopop.com/api-ref/apps/gov-fr/identity-upload POST /apps/gov-fr/v1/entry/{silo_entry_id}/identity Upload one face of the signer's identity document for verification. Stores one face of the signer's identity document. Required on both signing paths. Call before `POST /confirm`. Call once per side: `front` + `back` for an ID card (CNI, titre de séjour), or a single `page` for a passport. Re-uploading the same view overwrites the previous image. # Look up directory entries by electronic address Source: https://docs.invopop.com/api-ref/apps/gov-fr/lookup-identifier GET /apps/gov-fr/v1/directory/identifier/{identifier} Returns all entries from the PPF Annuaire that match the given electronic address identifier (the value used to route invoices to a party in France represented by an inbox in Invopop). Only available to **live** workspaces. Sandbox workspaces receive `403 Forbidden`. Returns all entries from the local mirror of the PPF Annuaire that use the given electronic address identifier (the value used to route invoices to a party in France). An empty `results` array means no entry currently uses this identifier. Only available to live workspaces — sandbox enrollments receive `403 Forbidden`. # Look up directory entries by SIREN Source: https://docs.invopop.com/api-ref/apps/gov-fr/lookup-siren GET /apps/gov-fr/v1/directory/siren/{siren} Returns all entries from the PPF Annuaire that match the given French SIREN. A company may have several entries so the response is always a list. Only available to **live** workspaces. Sandbox workspaces receive `403 Forbidden`. Returns the active directory entries from the PPF Annuaire that match the given SIREN. A SIREN may have multiple registered parties (one per SIRET / suffix / routing code), so the response is always a list. An empty `results` array means the SIREN is not currently registered in the Annuaire. Only available to live workspaces — sandbox enrollments receive `403 Forbidden`. # Fetch an e-reporting period Source: https://docs.invopop.com/api-ref/apps/gov-fr/reports-period GET /apps/gov-fr/v1/reports/{silo_entry_id}/periods/{period_id} Returns the metadata for one report period, scoped to the party identified by the silo entry. Returns the metadata for a single report period, scoped to the party identified by the silo entry. The `status` field tracks the lifecycle: `generated` → `submitted` → `filed` or `rejected`. The generated XML body is not included — use the `/xml` sub-resource to download it. # Download a period's Flux 10 XML Source: https://docs.invopop.com/api-ref/apps/gov-fr/reports-period-xml GET /apps/gov-fr/v1/reports/{silo_entry_id}/periods/{period_id}/xml Streams the raw Flux 10 `Report.xml` body generated for the period. Available for any period status. Callers that want only finalized payloads should check the period's `status` field first. # List e-reporting periods Source: https://docs.invopop.com/api-ref/apps/gov-fr/reports-periods GET /apps/gov-fr/v1/reports/{silo_entry_id}/periods Returns the party's Flux 10 report periods, most recent first (`created_at` descending). Each period is one submission window for a `(kind, role)` tuple; corrective re-submissions of the same window appear as separate periods with an incrementing `sequence`. Filter by report kind with `kind`. Paginate with `offset` and `limit` (default `50`, maximum `200`). When more results remain, the response carries a `next_offset` to pass on the next call; it is omitted on the last page. # Fetch e-reporting summary Source: https://docs.invopop.com/api-ref/apps/gov-fr/reports-summary GET /apps/gov-fr/v1/reports/{silo_entry_id} Returns the current Flux 10 e-reporting status for the party identified by the silo entry, one block per report kind: - `tx` — **transactions**. - `py` — **payments**. Each kind reports two distinct windows. `open_period_*` is the window currently being accumulated against (what the party is filling right now); `next_due_period_*` is the window the platform will generate a report for next, together with its filing `next_due_deadline`. After a report is generated for the open window, `next_due_*` advances while `open_*` stays put until the calendar rolls over. Always returns `200`. When the party exists but reporting was never enabled (or was disabled), `enabled` is `false` and `kinds` is empty — this lets callers tell "party not found" (`404`) apart from "party not reporting". # Sign agreement mandate Source: https://docs.invopop.com/api-ref/apps/gov-fr/sign POST /apps/gov-fr/v1/entry/{silo_entry_id}/sign Stamp the signer's signature onto the mandate and store the result as the signed agreement. Stamps the signer's signature onto the generated mandate PDF and stores the result as the entry's signed agreement. Satisfies the `sign` step on the approval flow. Two modes: * **Drawn**: pass a PNG or JPEG image in `signature` (≤ 4 MB). The image is inked onto the signature box. * **Typed**: omit `signature`. The signer's name is rendered as a typed signature. The silo entry must have signer fields set (given name, surname, and identity number) before calling. Use together with `POST /identity`, then call `POST /confirm` to finalise. # Upload KSeF certificate Source: https://docs.invopop.com/api-ref/apps/gov-pl/certificate-upload POST /apps/gov-pl/v1/entry/{silo_entry_id}/certificate Upload the KSeF certificate, private key, and password for a registered party. This endpoint provides an alternative to the web-based certificate upload wizard for programmatic integration. The certificate, private key, and password must be generated client-side following the standard KSeF certificate generation process: 1. Log into the [KSeF Portal](https://ap.ksef.mf.gov.pl/) (production) or [KSeF Demo Portal](https://ap-demo.ksef.mf.gov.pl/web/) (demo) 2. Generate the certificate with authentication enabled for KSeF 3. Download the certificate file and private key file 4. Save the password used during generation All three components are required for authentication with the KSeF system. The uploaded credentials are securely stored and used to sign and submit invoices on behalf of the registered party. This endpoint should only be used after running the party registration workflow. The entry must be in a state where it is waiting for certificate upload. The certificate and private key must be base64-encoded. Ensure the certificate start date is not in the future, and that the certificate and private key match. # Submit OTP Source: https://docs.invopop.com/api-ref/apps/gov-sa/otp-submit POST /apps/gov-sa/v1/entry/{silo_entry_id}/otp Submit the One Time Password (OTP) generated in the ZATCA Fatoora portal. The request carries every field the wizard collects: the party’s registration details plus the OTP generated in the ZATCA Fatoora portal. The resulting credentials are stored securely and the queued registration task is poked so the workflow can continue. Use this endpoint only after running the party registration workflow. The silo entry must be waiting for OTP submission. The OTP is short-lived, so generate it in the portal immediately before calling this endpoint. # Generate a PDF preview Source: https://docs.invopop.com/api-ref/apps/pdf/preview POST /apps/pdf/v1/preview Generate a PDF preview of the provided GOBL document. The PDF Preview API converts GOBL Envelopes into PDF documents, allowing you to preview and validate your invoices before submitting them to a workflow. To get started, make sure the **PDF Generator** app is enabled in your account. # Look up a Peppol participant Source: https://docs.invopop.com/api-ref/apps/peppol/lookup-participant GET /apps/peppol/v1/lookup Checks whether a company is registered and reachable in the Peppol network. Exactly one of `peppol_id` or `vat` must be provided. When `vat` is used, the service derives the Peppol participant identifier using the country-specific scheme rules (e.g. `9920:` for Spain, `0208:` for Belgium). If no scheme can be determined for the given country the request will fail with `400 Bad Request`. A `200` response with `found: false` means the participant ID was resolved but is not yet registered in the network — this is **not** an error condition. Check whether a company is registered and reachable in the Peppol network. Provide either a `peppol_id` or a `vat` number — not both. A `200` response with `found: false` means the participant ID was resolved but is not yet registered in the network. This is not an error. # Upload proof of ownership PDF Source: https://docs.invopop.com/api-ref/apps/peppol/ownership-upload POST /apps/peppol/v1/entry/{silo_entry_id}/ownership Uploads a proof-of-ownership PDF for a company that is being registered in the Peppol network. The document must be a valid PDF (`application/pdf`). Once uploaded the service validates the document and, if accepted, completes the registration flow for the silo entry. This endpoint is idempotent: uploading a new document for an entry that has already completed registration replaces the previous one and re-triggers completion. This endpoint allows you to upload a proof of ownership PDF document for Peppol registration. Upload it to Invopop so that it will be stored as an attachment to the silo entry. This document serves as verification of company ownership and is required for Peppol participant registration compliance. The uploaded PDF will be reviewed by Invopop as part of the validation process, which can take up to 72 hours. The approval status can be monitored through the silo entry's metadata. # Upload e.firma certificate Source: https://docs.invopop.com/api-ref/apps/sw-sapien/certificate-upload POST /apps/sw-sapien/v1/entry/{silo_entry_id}/certificate Upload the e.firma (FIEL) certificate, private key, and password for a registered party. This endpoint provides an alternative to the web-based registration form for programmatic integration. Upload the e.firma (FIEL) certificate, private key, and password for a party that has been registered with SW Sapien's Efisco service. This endpoint provides a programmatic alternative to the web-based registration form. The e.firma certificate is required to authorize bulk CFDI downloads from SAT on behalf of the party. The certificate files and password are securely forwarded to SW Sapien's Efisco service. # Generate agreement PDF Source: https://docs.invopop.com/api-ref/apps/verifactu/agreement-fetch GET /apps/verifactu/v1/entry/{silo_entry_id}/agreement Generate a PDF agreement of a previously prepared org.Party silo entry. After a complete Party has been uploaded to the silo, use this API endpoint to generate a PDF version of the Invopop collaboration agreement document. # Upload agreement PDF Source: https://docs.invopop.com/api-ref/apps/verifactu/agreement-upload POST /apps/verifactu/v1/entry/{silo_entry_id}/agreement Upload a signed copy of the PDF agreement. Once the previously generated agreement has been signed by the end-user, upload to Invopop so that it will be stored as an attachment to the silo entry. # Confirm Source: https://docs.invopop.com/api-ref/apps/verifactu/confirm POST /apps/verifactu/v1/entry/{silo_entry_id}/confirm Confirm that the upload process has completed. After uploading the agreement and identity images, call this endpoint to confirm that everything has been prepared correctly and the supplier is ready to start operating. This will trigger an update to a job that is waiting for the upload process to complete. The Invopop team will promptly review the uploaded material and proceed to accept or reject the documentation after this point. In the case of rejection, the supplier will no longer be able to issue invoices, but the process to re-upload agreement material will be available again. # Upload identity image Source: https://docs.invopop.com/api-ref/apps/verifactu/identity-upload POST /apps/verifactu/v1/entry/{silo_entry_id}/identity Upload an image of an identity document. Upload a photograph of the supplier or representative's identification card or document. Be sure to choose the correct view when uploading. Uploaded images will be stored as attachments to the silo entry. # Authentication Source: https://docs.invopop.com/api-ref/authentication Generate an access token to start using an Invopop workspace. Invopop API Keys are generated using the [Console](https://console.invopop.com). Enter **Configuration → API Keys** and click on + New API Key on the top right corner. Enter the name and the description and click Save. You'll be presented with a screen showing a new token. For security reasons, we don’t store this token. Copy it now, or you’ll need to create a new API key if it’s lost. Invopop uses JSON Web Tokens. If you're interested in seeing the contents, head over to [JWT.io](https://jwt.io) and paste your token to see what's inside. Tokens must be included in the `Authorization` HTTP header in all requests as a type `Bearer`. Test everything is working correctly using the [ping](/api-ref/utils/ping) endpoint and curl: ```bash theme={"system"} $ curl -H "Authorization: Bearer [token]" https://api.invopop.com/utils/v1/ping {"ping":"pong"} ``` # Technical glossary Source: https://docs.invopop.com/api-ref/glossary A brief glossary of the main terms used in the platform. While we've tried to make as much of the Invopop API as intuitive as possible, this brief glossary should help clarify what we mean when using certain words about the platform. | Term | Description | | ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | API Key | This is the code used to authenticate requests to the Invopop API. These should be kept in a secure and secret location. Read more in our [Authentication guide](/guides/authentication). | | App | Applications (apps) add services and functionality to Invopop workspaces. Once configured, an app can enable actions to be added in workflows. | | Customer | Customers are `org.Party` objects containing details about who should receive the document. | | Document | In a general context this refers to PDFs or JSON documents. This is also the name of the property inside [GOBL](https://docs.gobl.org) Envelopes that uses a [schema.Object](https://docs.gobl.org/draft-0/schema/object) to wrap around the payload. | | Entry Collection | Group of related silo entries | | Envelope | More accurately, a "GOBL Envelope" is a wrapper around a payload that adds a header and set of digital signatures. See the [GOBL Envelope](https://docs.gobl.org/draft-0/envelope) for more details. | | GOBL | Stands for "Go Business Language" and is the library and schema we created in order to simplify the creation of electronic invoices and other structured documents using JSON as the primary representation format. For more details, see the [gobl.org](https://gobl.org) site. | | Intent | These represent the link between a job and a specific connector that needs to be executed. They contain a list of events tracking the execution process. | | Job | A job represents the link between an Envelope and a Workflow. It contains an Intent for each of the integrations that have been executed. | | Object | In the context of a [GOBL](https://docs.gobl.org) document, this refers to a model defined in the GOBL schema that can be used standalone or in the `doc` property of an envelope. | | Organization | Represents your company or team. It groups users and workspaces, manages member permissions, and handles billing and account settings. | | Payload | The main data content of an API request or response. | | Position | Every user has a "position" inside an organization. | | Provider | Not normally referred to by the API, but worth mentioning due to their importance to Invopop. A Provider is the name we've given to the service that is used to execute a task. Some providers are global, most are region specific. | | Regime | Otherwise known as the "tax regime" is typically the country or potentially state where a company is fiscally registered. It determines the rules that will be applied to a [GOBL](https://docs.gobl.org) document, and which providers and thus tasks will be available for the company. | | Sequence | Refers to the service that is responsible for managing sequences, sequential codes that are guaranteed to be ordered and suitable to be included in legal documents. | | Series | Part of the sequence service, a series contains a definition that defines prefixes, indexes, and suffixes used to generate sequential codes. | | Silo | Our name for the [GOBL](https://docs.gobl.org) [Envelope](https://docs.gobl.org/draft-0/envelope) storage service. (We like this name because it's short). It's also responsible for persisting attachments with envelopes, such as PDFs generated by tasks. | | Silo Entry | A document stored in the Invopop Silo service. | | Spool | Temporary file storage service for processing documents. | | Step | A single step inside a workflow that performs an action on the [GOBL](https://docs.gobl.org) document being processed. | | Supplier | A supplier is an `org.Party` instance of a legal entity or person on behalf of whom invoices should be issued. | | Transform | This service is responsible for executing jobs using the defined workflow and its integrations. Sometimes this will be called the "Transform Engine". | | User | Grants a person access to an organization by linking their email address. A user may have positions in multiple organizations. | | UUID | Universally Unique Identifier. Value that is guaranteed to be unique across all devices and systems. Used to reliably identify fields and allows the relation between documents. | | Workflow | A key component of the Transform engine. The Workflow defines a set of integrations that should be executed by a job. | | Workspace | Dedicated space where you organize and isolate your workflows, documents, and API keys. Information in a workspace can't be accessed or shared across other workspaces. Each Organization can have multiple workspaces to separate data by company, country, or use case. | # Idempotency Source: https://docs.invopop.com/api-ref/idempotency Ensuring API requests are safe. Idempotence ensures that repeating an API call has no unintended side effects. For instance, if a request to create an item fails with a network error, retrying the request should not generate duplicate items, it should behave as if the operation were executed only once. At Invopop, we take this very seriously and have designed support for idempotency in all API calls. REST actions like `GET` and `DELETE` are inherently idempotent, fetching or deleting the same item twice will simply result in the same response. Update actions, such as `PATCH` are also usually idempotent. Duplicating calls may be inefficient, but we've made sure that in our API update actions are safe to be repeated. Create actions, like `POST` or `PUT` however require additional guarantees to ensure data will not be duplicated. The Invopop APIs handle these scenarios by requiring that every model and thus every incoming operation includes either an `id` field in UUID string format, or often a `key` property that will be checked to ensure it is unique before processing. Many API endpoints will detect duplicated requests and simply return the same response as expected initially. If however this cannot be guaranteed, the API will return a `409 Conflict` response which the client should be able to handle. # Introduction Source: https://docs.invopop.com/api-ref/introduction How the Invopop API is organized into services. The Invopop API is split into multiple services. Each service is effectively a namespace for a specific problem domain. The current list of key services is: * **Silo** `/silo/v1` · Data store for [GOBL](https://docs.gobl.org) documents and their attachments. The silo is also responsible for validating incoming data with the GOBL libraries, managing versions, and state control. * **Transform** `/transform/v1` · Responsible for storing workflow definitions and executing "jobs". * **Sequences** `/sequence/v1` · Provides reliable and scalable support for generating sequential codes typically added to invoices. * **Access** `/access/v1` · Provides access to workspaces and additional functionality required by Applications for enrollment handling. * **Utils** `/utils/v1` · Used for testing the connection and access credentials. The details for each service are described in the following sections. # Build with LLMs Source: https://docs.invopop.com/api-ref/llms Build with Large Language Models (LLMs) You can use large language models (LLMs) to assist in the building of Invopop integrations. We provide a set of tools and best practices if you use LLMs during development. ## Plain text docs You can access all of our documentation as plain text markdown files by adding `.md` to the end of any url. For example, you can find the plain text version of this page itself at [https://docs.invopop.com/api-ref/llms.md](https://docs.invopop.com/api-ref/llms.md). This helps AI tools and agents consume our content and allows you to copy and paste the entire contents of a doc into an LLM. This format is preferable to scraping or copying from our HTML and JavaScript-rendered pages because: * Plain text contains fewer formatting tokens. * Content that isn't rendered in the default view (for example, it's hidden in a tab) of a given page is rendered in the plain text version. * LLMs can parse and understand markdown hierarchy. We also host an [`/llms.txt` file](https://docs.invopop.com/llms.txt) which instructs AI tools and agents how to retrieve the plain text versions of our pages. The `/llms.txt` file is an [emerging standard](https://llmstxt.org/) for making websites and content more accessible to LLMs. ## Model Context Protocol (MCP) server Here are some ways you can connect to our docs MCP server: 1. Navigate to the [Connectors](https://claude.ai/settings/connectors) page in the Claude settings. 2. Select **Add custom connector**. 3. Add the Invopop Docs MCP server name (such as `invopop-docs`) and URL ([https://docs.invopop.com/mcp](https://docs.invopop.com/mcp)). 4. Add the GOBL Docs MCP server name (such as `gobl-docs`) and URL ([https://docs.gobl.org/mcp](https://docs.gobl.org/mcp)). 5. Select **Add**. 6. When using Claude, select the attachments button (the + icon). 7. Select your MCP server. See the [Model Context Protocol documentation](https://modelcontextprotocol.io/docs/tutorials/use-remote-mcp-server#connecting-to-a-remote-mcp-server) for more details. Run the following commands to add the Invopop and GOBL Docs MCP servers to Claude Code: ```bash theme={null} theme={"system"} claude mcp add --transport http invopop-docs https://docs.invopop.com/mcp claude mcp add --transport http gobl-docs https://docs.gobl.org/mcp ``` See the [Claude Code documentation](https://docs.anthropic.com/en/docs/claude-code/mcp#installing-mcp-servers) for more details. 1. Use Command + Shift + P (Ctrl + Shift + P on Windows) to open the command palette. 2. Search for "Open MCP settings". 3. Select **Add custom MCP**. This will open the `mcp.json` file. 4. In `mcp.json`, configure your server: ```json theme={null} theme={"system"} { "mcpServers": { "invopop-docs": { "url": "https://docs.invopop.com/mcp" }, "gobl-docs": { "url": "https://docs.gobl.org/mcp" } } } ``` See the [Cursor documentation](https://docs.cursor.com/en/context/mcp#installing-mcp-servers) for more details. Run the following commands to add the Invopop and GOBL Docs MCP servers to VS Code: 1. Create a `.vscode/mcp.json` file. 2. In `mcp.json`, configure your server: ```json theme={null} theme={"system"} { "servers": { "invopop-docs": { "type": "http", "url": "https://docs.invopop.com/mcp" }, "gobl-docs": { "type": "http", "url": "https://docs.gobl.org/mcp" } } } ``` See the [VS Code documentation](https://code.visualstudio.com/docs/copilot/chat/mcp-servers) for more details. # Postman collections Source: https://docs.invopop.com/api-ref/postman Reference API collections to explore Invopop's functionality Full article coming soon. [Invopop's Postman Collections](https://www.postman.com/invopop/invopop/overview) # Create a series entry Source: https://docs.invopop.com/api-ref/sequences/entries/create-a-series-entry PUT /sequence/v1/series/{series_id}/entries/{id} Create a new entry in a given series idempotently with the given UUID (any version). ```json Example theme={"system"} { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "created_at": "2023-01-25T08:04:14.245Z", "updated_at": "2023-01-25T08:04:14.245Z", "series_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "code": "string", "meta": { "additionalProp1": "string", "additionalProp2": "string", "additionalProp3": "string" }, "previous_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "sigs": ["string"] } ``` # Fetch a series entry Source: https://docs.invopop.com/api-ref/sequences/entries/fetch-a-series-entry GET /sequence/v1/series/{series_id}/entries/{id} Fetch an existing entry in a series given its UUID. ```json Example theme={"system"} { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "created_at": "2023-01-25T08:04:14.245Z", "updated_at": "2023-01-25T08:04:14.245Z", "series_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "code": "string", "meta": { "additionalProp1": "string", "additionalProp2": "string", "additionalProp3": "string" }, "previous_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "sigs": [ "string" ] } ``` # Fetch all series entries Source: https://docs.invopop.com/api-ref/sequences/entries/fetch-all-series-entries GET /sequence/v1/series/{series_id}/entries Fetch all the entries in a given series. ```json Example theme={"system"} { "series_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "list": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "created_at": "2023-01-25T08:04:14.245Z", "updated_at": "2023-01-25T08:04:14.245Z", "series_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "code": "string", "meta": { "additionalProp1": "string", "additionalProp2": "string", "additionalProp3": "string" }, "previous_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "sigs": [ "string" ] } ], "limit": 0, "cursor": "string" } ``` # Overview Source: https://docs.invopop.com/api-ref/sequences/entries/overview An entry represents a single index or code number inside a series. Essentially, it's a mapping of a UUID to a code number. ## Models An `Entry` contains the following fields: | Property | Type | Description | | ------------- | -------------------- | --------------------------------------------------- | | `id` | uuid | UUID that uniquely identifies the entry. | | `series_id` | uuid | ID of the series this entry belongs to. | | `code` | string | The code generated for this entry. | | `meta` | map\ | Any additional meta data provided during creation. | | `previous_id` | uuid | ID of the last entry created in the series, if any. | | `sigs` | array of string | Any JSON Web Signatures added during processing. | | `created_at ` | date-time | Creation timestamp. | | `updated_at` | date-time | Update timestamp. | An `EntryCollection` is defined as follows: | Property | Type | Description | | -------- | -------------- | ------------------------------------------------------ | | `list` | array of Entry | List of Entry models for this result set. | | `limit` | integer | Maximum number of entries provided in this result set. | | `cursor` | string | The cursor required to get the next page of results. | ## Resources `GET` [https://api.invopop.com/sequence/v1/series/\{series\_id}/entries](https://api.invopop.com/sequence/v1/series/\{series_id}/entries) `PUT` [https://api.invopop.com/sequence/v1/series/\{series\_id}/entries/\{id}](https://api.invopop.com/sequence/v1/series/\{series_id}/entries/\{id}) `GET` [https://api.invopop.com/sequence/v1/series/\{series\_id}/entries/\{id}](https://api.invopop.com/sequence/v1/series/\{series_id}/entries/\{id}) # Introduction Source: https://docs.invopop.com/api-ref/sequences/introduction The Invopop Sequence service makes it easy to reliably generate sequential numbers. Most countries around the world require a sequential ID or code for business documents like invoices to make them easier to follow. This service resolves that problem. Generating sequential numbers is more complex than it might seem at first glance. For simple use-cases, a counter field inside a standard relational database is probably sufficient, the problem however is once your project scales and you need guarantees that requests from distributed systems will continue to generate numbers without skips or duplication. Our Sequence service is designed and built to be highly resilient. Behind the scenes we use a global transaction database ([CockroachDB](https://www.cockroachlabs.com)) to ensure data is stored reliably, along with our own layers of queues and processes that ensure a single process is responsible for handling any given sequence. This means our systems can receive a high volume of requests at the same time, and still reliably return numbers in series. ## Key Concepts The sequence service contains two key objects: * Series: the definition of a code template. * Entry: a single "entry" in the series. These are described in the following sections. ## OpenAPI The Sequence OpenAPI 3.0 definition is available for download in YAML here: # Create a series Source: https://docs.invopop.com/api-ref/sequences/series/create-a-series PUT /sequence/v1/series/{id} Create a new series idempotently with the given UUID (any version). ```json Example theme={"system"} { "id": "835bb1ca-e7c4-41e6-9e88-464de54cc08e", "name": "Testing", "prefix": "TEST1", "padding": 5, "suffix": "-2022", "last_index": 1000, "created_at": "2022-03-03T22:18:50Z", "updated_at": "2022-03-03T22:18:50Z" } ``` # Fetch a series Source: https://docs.invopop.com/api-ref/sequences/series/fetch-a-series GET /sequence/v1/series/{id} Fetch an existing series given its UUID. ```json Example theme={"system"} { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "created_at": "2023-01-25T08:04:14.245Z", "updated_at": "2023-01-25T08:04:14.245Z", "name": "string", "description": "string", "code": "string", "prefix": "string", "padding": 0, "suffix": "string", "last_index": 0, "last_entry_id": "string", "sigs": ["string"] } ``` # Fetch all series Source: https://docs.invopop.com/api-ref/sequences/series/fetch-all-series GET /sequence/v1/series Fetch all the series in the current workspace. ```json Example theme={"system"} { "list": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "created_at": "2023-01-25T08:04:14.245Z", "updated_at": "2023-01-25T08:04:14.245Z", "name": "string", "description": "string", "code": "string", "prefix": "string", "padding": 0, "suffix": "string", "last_index": 0, "last_entry_id": "string", "sigs": ["string"] } ] } ``` # Overview Source: https://docs.invopop.com/api-ref/sequences/series/overview A series is a counter with formatting details used to generate sequential codes. ## Model A "Series" object contains the following fields: | Property | Type | Description | | --------------- | --------------- | ----------------------------------------------------------------------------------------------------- | | id | uuid | Unique identifier (UUID). | | name | string | Human name to help identify the series. | | prefix | string | Text to place before a generated code. | | padding | integer | Width of the code's number, with zero padding. | | suffix | string | Text added after the series' number. | | last\_index | integer | The series' last assigned number, zero, or the defined first index if no entries have been added yet. | | last\_entry\_id | uuid | ID of the entry last inserted for this series. | | sigs | array of string | If the series was created with any signatures, they'll be here. | | created\_at | date-time | Timestamp of the series' creation. | | updated\_at | date-time | Timestamp of the last update. | A series object may look like: ```json theme={"system"} { "id": "835bb1ca-e7c4-41e6-9e88-464de54cc08e", "name": "Testing", "prefix": "TEST1", "padding": 5, "suffix": "-2022", "last_index": 1001, "last_entry_id": "78b53c40-9b40-11ec-9298-665181255c0a", "created_at": "2022-03-03T22:18:50Z", "updated_at": "2022-03-03T22:18:50Z" } ``` The last entry added to that sequence would have generated the code: `TEST101001-2022`. ## Resources PUT [https://api.invopop.com/sequence/v1/series/\{id}](https://api.invopop.com/sequence/v1/series/\{id}) GET [https://api.invopop.com/sequence/v1/series/\{id}](https://api.invopop.com/sequence/v1/series/\{id}) GET [https://api.invopop.com/sequence/v1/series](https://api.invopop.com/sequence/v1/series) # Create an entry without UUID Source: https://docs.invopop.com/api-ref/silo/entries/create-an-entry-post POST /silo/v1/entries Create a new silo entry without an explicit UUID. ## New Documents The fastest way to upload data to Invopop is by creating an entry with the data property containing the GOBL JSON of either a pre-built [Envelope](https://docs.gobl.org/draft-0/envelope) or a partial document like an [Invoice](https://docs.gobl.org/draft-0/bill/invoice) or [Party](https://docs.gobl.org/draft-0/org/party). Use the `key` property to ensure idempotency. If the same key is used in the same workspace in another silo entry, the request will be rejected with `409 Conflict`. Note that idempotency using this method is intended for repeat requests whereby the system has had the opportunity to persist the first, we recommend using the [put](/api-ref/silo/entries/create-an-entry-put) method in concurrent scenarios. ```json Invoice Payload Example theme={"system"} { "key": "invoice-DEMO-001", "data": { "$schema": "https://gobl.org/draft-0/bill/invoice", "series": "DEMO", "code": "001", "currency": "USD", "supplier": { "name": "Provide One Inc.", "tax_id": { "country": "US" }, "addresses": [ { "num": "16", "street": "Jessie Street", "locality": "San Francisco", "region": "CA", "code": "94105", "country": "US" } ], "emails": [ { "addr": "billing@provideone.com" } ] }, "customer": { "name": "Sample Consumer", "emails": [ { "addr": "email@sample.com" } ] }, "lines": [ { "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "discounts": [ { "percent": "10%", "reason": "Special discount" } ], "taxes": [ { "cat": "ST", "percent": "8.5%" } ] } ] } } ``` Any data uploaded to the Invopop Silo will first be normalized, calculated, and then validated to check for any errors. Invopop will attempt to automatically determine the folder in which to store the document based on the schema, but you can override this by including the folder field in the request. If there are any validation issues with the uploaded data, the service will respond with an error message including a `key` and `message`. Additionally, the `fields` property may include a nested structure to help identify the specific property with a validation fault. ## Creating Entries from Previous Documents You can create new entries based on a previous entry by using the previous\_id field. This allows you to provide patch data instead of a full new document by setting the patch type in the content\_type field to one of the following: * application/json-patch+json - for JSON Patch (RFC 6902) * application/merge-patch+json - for JSON Merge Patch (RFC 7396) Additionally, the previous\_id field can be used to create corrective documents by including corrective option data in the correct field. For more details, refer to the GOBL documentation on correction options. # Create an entry with ID Source: https://docs.invopop.com/api-ref/silo/entries/create-an-entry-put PUT /silo/v1/entries/{id} Create a new silo entry with the given UUID. ## New Documents The fastest way to upload data to Invopop is by creating an entry with the data property containing the GOBL JSON of either a pre-built [Envelope](https://docs.gobl.org/draft-0/envelope) or a partial document like an [Invoice](https://docs.gobl.org/draft-0/bill/invoice) or [Party](https://docs.gobl.org/draft-0/org/party). The `key` property can be used to ensure idempotency, preventing the creation of duplicate entries with the same key within the workspace. A `409 Conflict` response will be provided if either the entry ID or key have been used in an existing document. ```json Invoice Body Example theme={"system"} { "data": { "$schema": "https://gobl.org/draft-0/bill/invoice", "series": "DEMO", "code": "001", "currency": "USD", "supplier": { "name": "Provide One Inc.", "tax_id": { "country": "US" }, "addresses": [ { "num": "16", "street": "Jessie Street", "locality": "San Francisco", "region": "CA", "code": "94105", "country": "US" } ], "emails": [ { "addr": "billing@provideone.com" } ] }, "customer": { "name": "Sample Consumer", "emails": [ { "addr": "email@sample.com" } ] }, "lines": [ { "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "discounts": [ { "percent": "10%", "reason": "Special discount" } ], "taxes": [ { "cat": "ST", "percent": "8.5%" } ] } ] } } ``` Any data uploaded to the Invopop Silo will first be normalized, calculated, and then validated to check for any errors. Invopop will attempt to automatically determine the folder in which to store the document based on the schema, but you can override this by including the folder field in the request. If there are any validation issues with the uploaded data, the service will respond with an error message including a `key` and `message`. Additionally, the `fields` property may include a nested structure to help identify the specific property with a validation fault. Use UUID versions 1 or 7 for documents with a specific lifespan, such as invoices or payment receipts. For long-lived data, like parties or items, use versions 3, 4, or 5. The rules for UUID versions are enforced by specific folder configurations. ## Creating Entries from Previous Documents You can create new entries based on a previous entry by using the previous\_id field. This allows you to provide patch data instead of a full new document by setting the patch type in the content\_type field to one of the following: * application/json-patch+json - for JSON Patch (RFC 6902) * application/merge-patch+json - for JSON Merge Patch (RFC 7396) Additionally, the previous\_id field can be used to create corrective documents by including corrective option data in the correct field. For more details, refer to the GOBL documentation on correction options. # Fetch all entries Source: https://docs.invopop.com/api-ref/silo/entries/fetch-all-entries GET /silo/v1/entries Fetch all the silo entries in the current workspace. # Fetch an entry Source: https://docs.invopop.com/api-ref/silo/entries/fetch-an-entry GET /silo/v1/entries/{id} Fetch an existing silo entry given its UUID. # Fetch an entry by key Source: https://docs.invopop.com/api-ref/silo/entries/fetch-an-entry-by-key GET /silo/v1/entries/key/{key} Fetch an existing silo entry by its key. # Fetch an entry version Source: https://docs.invopop.com/api-ref/silo/entries/fetch-entry-version GET /silo/v1/entries/{id}/versions/{version} Retrieve the GOBL envelope data stored for a specific version of a Silo entry. Use the `version` value returned in an entry's `version` or `versions` fields to retrieve that exact historical envelope. The response contains only the requested version identifier and its GOBL envelope data; other entry metadata remains available from the standard [fetch entry](/api-ref/silo/entries/fetch-an-entry) endpoint. # Fetch a file Source: https://docs.invopop.com/api-ref/silo/entries/files-fetch GET /silo/v1/entries/{entry_id}/files/{id} Download silo entry file's data. Content type and disposition will be set according to the source. # Create a file without UUID Source: https://docs.invopop.com/api-ref/silo/entries/files-post POST /silo/v1/entries/{entry_id}/files Add a new file to a silo entry without an explicit UUID. The file data can be provided inline as base64 encoded data, or omitted to create a placeholder. When data is not provided, you must provide sha256, size, and mime fields, and the response will include a `url` field that can be used to stream/upload the file contents directly via a PUT request to that URL. For non-enrolled users, only the `format` and `attachment` categories are allowed. # Create a file with ID Source: https://docs.invopop.com/api-ref/silo/entries/files-put PUT /silo/v1/entries/{entry_id}/files/{id} Add a new file to a silo entry with a specific UUID. The file data can be provided inline as base64 encoded data, or omitted to create a placeholder. When data is not provided, you must provide sha256, size, and mime fields, and the response will include a `url` field that can be used to stream/upload the file contents directly via a PUT request to that URL. For non-enrolled users, only the `format` and `attachment` categories are allowed. # Find related entries Source: https://docs.invopop.com/api-ref/silo/entries/find-related GET /silo/v1/entries/{id}/related Find silo entries whose document mentions the given entry's UUID. # Search entries Source: https://docs.invopop.com/api-ref/silo/entries/search-entries GET /silo/v1/search Perform a free-text search on all documents in the current workspace. # Update an entry Source: https://docs.invopop.com/api-ref/silo/entries/update-an-entry PATCH /silo/v1/entries/{id} Update an existing silo entry given its UUID. # Build GOBL document Source: https://docs.invopop.com/api-ref/silo/gobl/build POST /silo/v1/gobl/build Build GOBL Envelopes or Objects for validation purposes # Correct GOBL envelope Source: https://docs.invopop.com/api-ref/silo/gobl/correct POST /silo/v1/gobl/correct Correct or determine the correction options for a GOBL Envelope (not Object!) Use this endpoint to help determine the options for correcting [GOBL](https://docs.gobl.org) documents and then perform the correction itself. This is useful when you need to issue credit notes or corrective versions of a previously issued invoice and need clarity on the local options. All requests to the endpoint require a **[GOBL Envelope](https://docs.gobl.org/draft-0/envelope)**, and cannot be used with a [GOBL Invoice](https://docs.gobl.org/draft-0/bill/invoice) or other GOBL object. This is because some tax regimes require specific details from the previous document's headers, like a special identification code. Use the `show_options` flag to return a JSON Schema of the options that can be used with the provided document. Once the options are clear, send in a new request with the `options` data to get an example corrected [GOBL Envelope](https://docs.gobl.org/draft-0/envelope). The same options data can be used with the [silo create entry endpoint](/api-ref/silo/entries/create-an-entry-post) and the `correct` property. # Sign GOBL document Source: https://docs.invopop.com/api-ref/silo/gobl/sign POST /silo/v1/gobl/sign Sign GOBL Envelopes or Objects # Delete a file Source: https://docs.invopop.com/api-ref/silo/spool/delete DELETE /silo/v1/spool/{key} Delete a previously uploaded entry from the spool. # Download a file Source: https://docs.invopop.com/api-ref/silo/spool/download GET /silo/v1/spool/{key} Download a previously uploaded entry from the spool. # Upload a file Source: https://docs.invopop.com/api-ref/silo/spool/upload POST /silo/v1/spool Upload temporary file data to the silo spool. Requires 'enrolled' scope. The Silo Spool service can be used by **Applications** as a temporary file store. This can be useful for example when processing documents that need additional processing before being added to a Silo Entry as an attachment. Additionally, the Silo Spool will be used in the Transform Jobs API when uploading files as data URIs. # Create a job without a UUID Source: https://docs.invopop.com/api-ref/transform/jobs/create-a-job-post POST /transform/v1/jobs Create a new job without an explicit ID. Use this endpoint to execute a workflow, allowing the backend to assign the UUID. This request will not be idempotent unless a `key` is provided. Keys are checked for uniqueness within the current workspace and are valid for up to 2 years. Note that the [put](/api-ref/transform/jobs/create-a-job-put) request is recommended for high concurrency scenarios. To execute a job, provide one of the following fields: * `silo_entry_id` - preferred, the UUID of the silo entry to process with the workflow. * `data` - raw GOBL data of the job, which will be persisted to the silo before processing. * `args` - a data object containing application-specific data used in the workflow's initial actions to prepare and upload a silo entry. The `wait` query parameter can cause the server to block the incoming HTTP request and wait for up to the specified number of seconds. Typically, a workflow executes in under a second, but some actions may take longer. We recommend using the `wait` query parameter only in sandbox or testing environments, as workflows can sometimes exceed expected duration due to network failures or other temporary issues. Arguments (`args`) are composed of string key-value pairs tailored to specific applications. Binary data can be included using Data URIs (`data:`), which must specify the content type and include a `name` parameter. For example: `data:text/plain;name=example.txt;base64,ZGF0YQ==`. Any data provided via this method will be automatically uploaded to the Silo Spool service and will remain accessible only through tokens issued for the corresponding workspace. # Create a job with a UUID Source: https://docs.invopop.com/api-ref/transform/jobs/create-a-job-put PUT /transform/v1/jobs/{id} Create a new job with the given ID. Use this endpoint to execute a workflow with a specific time-based UUID, v7 or v1. If the `key` property is provided, it will be checked for uniqueness within the current workspace and is valid for up to 2 years. To execute a job, provide one of the following fields: * `silo_entry_id` - preferred, the UUID of the silo entry to process with the workflow. * `data` - raw GOBL data of the job, which will be persisted to the silo before processing. * `args` - a data object containing application-specific data used in the workflow's initial actions to prepare and upload a silo entry. The `wait` query parameter can cause the server to block the incoming HTTP request and wait for up to the specified number of seconds. Typically, a workflow executes in under a second, but some actions may take longer. We recommend using the `wait` query parameter only in sandbox or testing environments, as workflows can sometimes exceed expected durations due to network failures or other temporary issues. Arguments (`args`) are composed of string key-value pairs tailored to specific applications. Binary data can be included using Data URIs (`data:`), which must specify the content type and include a `name` parameter. For example: `data:text/plain;name=example.txt;base64,ZGF0YQ==`. Any data provided via this method will be automatically uploaded to the Silo Spool service and will remain accessible only through tokens issued for the corresponding workspace. # Fetch a job Source: https://docs.invopop.com/api-ref/transform/jobs/fetch-a-job GET /transform/v1/jobs/{id} Fetch an existing job by ID. # Fetch a job by key Source: https://docs.invopop.com/api-ref/transform/jobs/fetch-a-job-by-key GET /transform/v1/jobs/key/{key} Fetch an existing job by a recent key. # Fetch all jobs Source: https://docs.invopop.com/api-ref/transform/jobs/fetch-all-jobs GET /transform/v1/jobs Fetch all jobs in the current workspace. ```json Response theme={"system"} { "list": [ { "id": "2b467620-4470-11f1-a2d4-d9f6d57a55c9", "created_at": "2026-04-30T08:39:57.933Z", "updated_at": "2026-04-30T08:39:58.102Z", "silo_entry_id": "082ded41-31f7-429a-a740-0d2b7cc5707f", "workflow_id": "46e84a39-72cc-40ba-9b32-ac0feefa4833", "status": "OK", "completed_at": "2026-04-30T08:39:58.102Z" }, { "id": "13cc2d50-4470-11f1-abaa-a9921bf464d3", "created_at": "2026-04-30T08:39:18.549Z", "updated_at": "2026-04-30T08:39:22.938Z", "silo_entry_id": "082ded41-31f7-429a-a740-0d2b7cc5707f", "workflow_id": "92191cd1-89f0-4a40-8c7a-62903b890995", "status": "ERR" } ], "limit": 10, "cursor": "eyJjYXQiOiIyMDI2LTA0LTMwVDEwOjQ5OjAxLjA4MVoifQ", "next_cursor": "eyJjYXQiOiIyMDI2LTA0LTI5VDExOjExOjIxLjMxMFoifQ" } ``` # Create a workflow Source: https://docs.invopop.com/api-ref/transform/workflows/create-a-workflow PUT /transform/v1/workflows/{id} Create a new workflow with the given UUID. # Fetch a workflow Source: https://docs.invopop.com/api-ref/transform/workflows/fetch-a-workflow GET /transform/v1/workflows/{id} Fetch an existing workflow given its UUID. # Fetch all workflows Source: https://docs.invopop.com/api-ref/transform/workflows/fetch-all-workflows GET /transform/v1/workflows Fetch workflows in the current workspace. # Update a workflow Source: https://docs.invopop.com/api-ref/transform/workflows/update-a-workflow PATCH /transform/v1/workflows/{id} Update an existing workflow given its UUID. # Ping Source: https://docs.invopop.com/api-ref/utils/ping GET /utils/v1/ping Simple ping request ### Simple Ping Make a request to the ping endpoint to ensure your access credentials are working correctly. ### Parameters No Parameters ```json theme={"system"} { "ping": "pong" } ``` # UUID Source: https://docs.invopop.com/api-ref/utils/uuid GET /utils/v1/uuid UUID Generator # Versioning Source: https://docs.invopop.com/api-ref/versioning API versioning allows us to grow our product without breaking your integration Our philosophy is to try and avoid creating new versions as much as possible. Any changes to an API's payload, either in creation or in responses, should be as backwards compatible as possible. We do not consider adding new endpoints to be "breaking changes", so would not consider releasing a new version. Complete backward compatibility over the long term is unrealistic. Every serious API must offer a mechanism to deal with breaking changes. Our approach is to version API endpoints by service and in the request URL's path. This implies that if we only need to make changes to a single service, all the other services are isolated. It's easier to log or debug requests and extract statistics from logging data. You'll see in the documentation that each service's end-points include the version in the URL path, a few examples: * `GET https://api.invopop.com/utils/v1/ping` * `PUT https://api.invopop.com/transform/v1/jobs/XXXXXX` * `GET https://api.invopop.com/silo/v1/entries` If at some point in the future for example we decide to refactor our transform job creation service, we'll be able to suggest clients switch from `transform/v1` to `transform/v2` as part of their migration process. # Argentina Source: https://docs.invopop.com/apps/argentina Manage ARCA integrations and submit invoices to Argentina's tax authority.
View guide › View guide ›
| | | | --------- | ---------------------------------- | | Developer | [Invopop](https://invopop.com) | | Category | Government | | Scope | B2B, B2C, B2G | | Country | [Argentina](/compliance/argentina) |
Invopop's **Argentina app** connects to ARCA (Agencia de Recaudación y Control Aduanero), Argentina's national tax and customs authority, enabling automated invoice submission, authorization, and reporting through ARCA's clearance model. **Key features** 1. **Workflow automation:** This app provides automated workflows for registering suppliers and issuing invoices through the ARCA system. 2. **Real-time clearance:** Every invoice is submitted to ARCA for validation and receives a unique CAE (Código de Autorización Electrónico) code, ensuring compliance with Argentine e-invoicing regulations. 3. **Multiple invoice types:** Support for Factura A (B2B), Factura B (B2C), Factura C (Monotributistas), Factura E (Exports), and Factura T (Tourism). 4. **Supplier registration & verification:** Generate registration links where suppliers upload their certificates and sign agreements to enable invoice reporting. 5. **PDF generation:** Invoices are generated with all mandatory fields, CAE codes, and QR codes as required by Argentine invoicing legislation. 6. **WSFE integration:** Direct integration with ARCA's Web Services de Factura Electrónica for automated invoice submission and authorization. 7. **Sequential numbering:** Automatic invoice numbering management to maintain required sequential order by punto de venta (point of sale). Make sure to check out our [ARCA Supplier Onboarding guide](/guides/ar-arca-suppliers) and [ARCA Invoicing guide](/guides/ar-arca-invoices) for instructions on how to set up and use these actions in your workflows. ## FAQ Invoicing questions Factura A (B2B between Responsables Inscriptos), Factura B (consumers and exempt entities), Factura C (Monotributistas to anyone), Factura E (exports) and Factura T (tourism services to non-resident tourists). Type is determined by the issuer's tax regime and the customer's classification — Invopop selects the right one automatically when both are set. Most ARCA-cleared invoices are delivered as PDFs with the CAE printed on them, though the underlying XML is also available on request. Invopop can convert the XML into [GOBL](https://docs.gobl.org) for downstream processing; PDF-only documents need OCR or manual capture. Argentine invoices use a two-part numbering system: **XXXXX-YYYYYYYY** * **Punto de Venta (POS)**: A 5-digit code (e.g., 00001) that identifies the point of sale or electronic invoicing method. * **Sequential Number**: An 8-digit code (e.g., 00000001) that increases by 1 with each invoice. The sequence must be continuous with no skipped or repeated numbers. Each invoice type (A, B, C) and POS combination has its own independent sequence. For example, Factura A from POS 0001 starts at `00001-00000001`, while Factura B from the same POS would also start at `00001-00000001`. Invopop automatically manages sequential numbering for each punto de venta. A Punto de Venta (POS) is a 5-digit code that identifies where invoices are issued from. In electronic invoicing, it represents the electronic invoicing method or channel (e.g., Web Service, ARCA portal). Each POS has its own independent invoice sequence for each invoice type. You must register your punto de venta with ARCA before you can issue invoices through it in production. In the sandbox environment, you can use test punto de venta numbers without registration. No, you can use the same punto de venta for different invoice types (Factura A, B, C, etc.). However, each invoice type will have its own independent sequential numbering within that punto de venta. For example, using POS 00001: * Factura A: 00001-00000001, 00001-00000002, 00001-00000003... * Factura B: 00001-00000001, 00001-00000002, 00001-00000003... WSFE (Web Services de Factura Electrónica) is ARCA's web service infrastructure for automated invoice submission. ARCA provides several web services: * **wsfev1**: For invoices A, B, C, and M without item detail * **wsmtxca**: For invoices A and B with item details * **wsfexv1**: For type E (export) invoices * **wsct**: For type T (tourism) invoices issued to non-resident tourists Invopop integrates with these services to automatically submit your invoices to ARCA and receive CAE authorization codes in real time. If ARCA rejects an invoice, you'll receive an error message explaining the reason for rejection. Common reasons include: * Invalid or unregistered CUIT * Missing required fields * Incorrect tax calculations * Sequential numbering errors * Invalid punto de venta Review the error message, correct the issue in your GOBL document, and resubmit the invoice. The rejected invoice does not count toward your sequential numbering, so you can use the same number after correction. See the [Argentina tax regime in GOBL](https://docs.gobl.org/regimes/ar) for tax IDs, tax categories, and AFIP/ARCA-specific extensions. The [`ar-arca-v1`](https://docs.gobl.org/addons/ar-arca-v1) addon documents required fields for invoice submission to ARCA. Registering supplier questions Yes, to issue invoices through ARCA's web services, you need to upload your ARCA digital certificate to Invopop. This certificate is issued by ARCA and is used to authenticate your requests to their system. The registration process involves: 1. Generating a certificate signing request (CSR) with ARCA 2. Downloading the certificate and private key 3. Uploading them to Invopop through the supplier registration flow See our [ARCA Supplier Onboarding guide](/guides/ar-arca-suppliers) for detailed instructions. To register a supplier for ARCA invoicing, you need: **Company Information:** * Legal name (Razón Social) * CUIT (tax ID) * Fiscal address * Economic activity code * Tax classification (Responsable Inscripto or Monotributista) **Digital Certificates:** * ARCA digital certificate (.crt file) * Private key (.key file) * Key password (if applicable) See our [ARCA Supplier Onboarding guide](/guides/ar-arca-suppliers) for detailed registration instructions. The supplier registration process typically takes a few minutes once the supplier has their digital certificates ready. The steps are: 1. Generate a registration link in Invopop 2. Supplier uploads their certificate and key 3. System validates the credentials with ARCA 4. Registration is complete The longest part is usually obtaining the digital certificate from ARCA, which can take a few days if the supplier hasn't done it before. Yes, a single supplier can have multiple puntos de venta. Each punto de venta operates independently with its own sequential numbering for each invoice type. When registering a supplier, you specify which punto de venta to use. You must register each punto de venta with ARCA in production before using it to issue invoices. Digital certificates issued by ARCA have an expiration date. When a certificate is about to expire, the supplier must generate a new one through ARCA's portal and upload it to Invopop. To update an expired certificate: 1. Obtain a new certificate from ARCA 2. Use the supplier registration workflow to upload the new certificate 3. The new certificate will replace the old one It's recommended to renew certificates before they expire to avoid disruption to your invoicing process. Yes, Invopop supports white-label (B2B2B) operations in Argentina. This means you can issue invoices on behalf of your clients using their CUIT and digital certificates. This is particularly useful for platforms and software providers who want to offer invoicing services to their customers without requiring them to integrate directly with ARCA. Each supplier (your client) needs to complete the registration process with their own certificates, and then you can issue invoices on their behalf through Invopop's workflows. An ARCA digital certificate, consisting of a `.crt` X.509 certificate and the matching `.key` private key. Both files are uploaded together; the certificate must be valid (not expired, not revoked) and authorized for the ARCA web services you intend to use — WSFE for Factura A, B and C, WSFEX for Factura E, and WSCT for Factura T. Generate a registration link via the ARCA Register Supplier workflow, send it to the supplier, and have them upload their ARCA digital certificate and private key. Once validated, the supplier is ready to issue. See the [ARCA Supplier Onboarding guide](/guides/ar-arca-suppliers). The ARCA digital certificate (`.crt`) and private key (`.key`) are stored encrypted. Invopop only uses them to authenticate ARCA web service requests (WSFE and WSCT) on the supplier's behalf and never returns the key in API responses. More answers in our [Argentina FAQ](/faq/argentina) section
The following workflow actions will be available once you install and enable this app: #### Invoice actions
3
Submits the invoice to ARCA for authorization and retrieval of the CAE (Código de Autorización Electrónico).
#### Supplier actions Generates a unique URL in the `meta` property with a `url` key value for the supplier to register in ARCA. Long running action that continues when the supplier successfully uploads their ARCA certificate. Removes invoice issuing entitlements to the supplier.
The following workflow templates help you get started quickly. Use them as is or as a base for your own flows. Adds a registration link to a supplier to upload digital certificates for issuing ARCA-compliant e-invoices. ```json Example ARCA register supplier workflow theme={"system"} { "name": "ARCA register supplier", "description": "Register a supplier with ARCA using their certificate", "schema": "org/party", "steps": [ { "id": "12e637b0-f1fe-11f0-9dd9-c3ebff709d81", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "fc109350-f1fd-11f0-9dd9-c3ebff709d81", "name": "Register supplier with ARCA", "provider": "gov-ar.register" }, { "id": "ff7d3160-f1fd-11f0-9dd9-c3ebff709d81", "name": "Wait for ARCA certificate upload", "provider": "gov-ar.wait.authorization" }, { "id": "0dc4bdb0-f1fe-11f0-9dd9-c3ebff709d81", "name": "Set state", "provider": "silo.state", "summary": "Set state to `registered`{.state .registered}", "config": { "state": "registered" } } ], "rescue": [ { "id": "f1be4e50-f203-11f0-b1d8-c7bdc0d915b1", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` [Add to my workspace →](https://console.invopop.com/redirect/workflows/new?template=ar-supplier-registration) Issue invoices through ARCA with automatic CAE authorization and PDF generation. ```json Example ARCA send invoice workflow theme={"system"} { "name": "ARCA send invoice", "description": "Issue an invoice through ARCA and retrieve the CAE code", "schema": "bill/invoice", "steps": [ { "id": "bce37ad0-f1fd-11f0-9dd9-c3ebff709d81", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "68863090-f1fd-11f0-9dd9-c3ebff709d81", "name": "Send invoice to ARCA", "provider": "gov-ar.send" }, { "id": "6cc19050-f1fd-11f0-9dd9-c3ebff709d81", "name": "Generate PDF", "provider": "pdf", "summary": "Spanish · Letter", "config": { "currency_template": "", "date_format": "%Y-%m-%d", "decimal_mark": "", "label": "", "layout": "Letter", "locale": "es", "logo_height": 40, "negative_template": "", "scripting": false, "thousands_separator": "", "watermark": "" } }, { "id": "c6221e30-f1fd-11f0-9dd9-c3ebff709d81", "name": "Set state", "provider": "silo.state", "summary": "Set state to `sent`{.state .sent}", "config": { "state": "sent" } } ], "rescue": [ { "id": "d751af40-f1fd-11f0-9dd9-c3ebff709d81", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` [Add to my workspace →](https://console.invopop.com/redirect/workflows/new?template=ar-invoice) Paste into the Invopop Console (developer mode) or GOBL Builder. A supplier with an 11-digit CUIT and the fiscal address used when registering with ARCA. ```json Argentina supplier example theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "Proveedor Ejemplo S.A.", "tax_id": { "country": "AR", "code": "30712345671" }, "addresses": [ { "street": "Av. Corrientes 1234", "locality": "Buenos Aires", "region": "Ciudad Autónoma de Buenos Aires", "code": "C1043", "country": "AR" } ], "emails": [ { "addr": "ventas@proveedorejemplo.com.ar" } ], "registration": { "other": "Inicio de actividades: 2016-03-01" } } ``` A business customer identified by CUIT. The customer's tax status determines the invoice type (A, B, or C). ```json Argentina customer example theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "Cliente Comercial S.R.L.", "tax_id": { "country": "AR", "code": "30987654321" }, "addresses": [ { "street": "Av. Santa Fe 2500", "locality": "Buenos Aires", "region": "Ciudad Autónoma de Buenos Aires", "code": "C1123", "country": "AR" } ], "emails": [ { "addr": "compras@clientecomercial.com.ar" } ] } ``` Factura A is issued by registered taxpayers (Responsable Inscripto) to other registered taxpayers or monotributistas. This invoice type includes VAT broken down separately. Notice: * the minimal version in the first tab contains only the essential fields required to create the Factura A, * the [`ar-arca-v4`](https://docs.gobl.org/addons/ar-arca-v4) addon ensures the document will be validated using the ARCA rules built into the [GOBL](https://docs.gobl.org) library, * both supplier and customer must be registered taxpayers with valid CUIT numbers, * there are no totals or calculations in the minimal version; all these will be calculated automatically when running `gobl build`, * the built version in the second tab shows the normalized document with calculated totals, line item sums, IVA breakdowns shown separately, and automatically generated fields, and, * the invoice will be submitted to ARCA for authorization and receive a CAE (Código de Autorización Electrónico). ```json ARCA Invoice (Factura A) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": ["ar-arca-v4"], "uuid": "3aea7b56-59d8-4beb-90bd-f8f280d852a0", "currency": "ARS", "issue_date": "2025-01-15", "series": "1", "supplier": { "name": "Proveedor Ejemplo S.A.", "tax_id": { "country": "AR", "code": "30712345671" }, "addresses": [ { "street": "Av. Corrientes 1234", "locality": "Buenos Aires", "region": "Ciudad Autónoma de Buenos Aires", "code": "C1043", "country": "AR" } ], "emails": [ { "addr": "ventas@proveedorejemplo.com.ar" } ], "registration": { "other": "Inicio de actividades: 2016-03-01" } }, "customer": { "name": "Cliente Comercial S.R.L.", "tax_id": { "country": "AR", "code": "30987654321" }, "addresses": [ { "street": "Av. Santa Fe 2500", "locality": "Buenos Aires", "region": "Ciudad Autónoma de Buenos Aires", "code": "C1123", "country": "AR" } ], "emails": [ { "addr": "compras@clientecomercial.com.ar" } ] }, "lines": [ { "quantity": "10", "item": { "name": "Notebooks Dell Latitude", "price": "450000.00", "key": "goods" }, "taxes": [ { "cat": "VAT", "rate": "general" } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "AR", "$addons": [ "ar-arca-v4" ], "uuid": "3aea7b56-59d8-4beb-90bd-f8f280d852a0", "type": "standard", "series": "1", "issue_date": "2025-01-15", "currency": "ARS", "tax": { "ext": { "ar-arca-concept": "1", "ar-arca-doc-type": "1" } }, "supplier": { "name": "Proveedor Ejemplo S.A.", "tax_id": { "country": "AR", "code": "30712345671" }, "addresses": [ { "street": "Av. Corrientes 1234", "locality": "Buenos Aires", "region": "Ciudad Autónoma de Buenos Aires", "code": "C1043", "country": "AR" } ], "emails": [ { "addr": "ventas@proveedorejemplo.com.ar" } ], "registration": { "other": "Inicio de actividades: 2016-03-01" } }, "customer": { "name": "Cliente Comercial S.R.L.", "tax_id": { "country": "AR", "code": "30987654321" }, "addresses": [ { "street": "Av. Santa Fe 2500", "locality": "Buenos Aires", "region": "Ciudad Autónoma de Buenos Aires", "code": "C1123", "country": "AR" } ], "emails": [ { "addr": "compras@clientecomercial.com.ar" } ], "ext": { "ar-arca-vat-status": "1" } }, "lines": [ { "i": 1, "quantity": "10", "item": { "key": "goods", "name": "Notebooks Dell Latitude", "price": "450000.00" }, "sum": "4500000.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "21.0%", "ext": { "ar-arca-vat-rate": "5" } } ], "total": "4500000.00" } ], "totals": { "sum": "4500000.00", "total": "4500000.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "ar-arca-vat-rate": "5" }, "base": "4500000.00", "percent": "21.0%", "amount": "945000.00" } ], "amount": "945000.00" } ], "sum": "945000.00" }, "tax": "945000.00", "total_with_tax": "5445000.00", "payable": "5445000.00" } } ``` Factura B is issued by registered taxpayers (Responsable Inscripto) to final consumers, exempt entities, non-categorized subjects, and foreign tourists. VAT is included in the total price. Notice: * the customer is typically a final consumer (Consumidor Final) and may not have a CUIT, * the minimal version contains only essential fields; `gobl build` handles all calculations, * when running `gobl build`, the system automatically calculates totals with IVA included in the price (not shown separately as in Factura A), * the built version shows the normalized document with calculated totals where VAT is included in the final amounts, * the [`ar-arca-v4`](https://docs.gobl.org/addons/ar-arca-v4) addon applies Factura B specific rules and validations, and, * the invoice will be submitted to ARCA for authorization and receive a CAE. ```json ARCA Invoice (Factura B) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": ["ar-arca-v4"], "uuid": "4bea8c67-6ad9-5cfc-a1ce-f9f391e963b1", "currency": "ARS", "issue_date": "2025-01-16", "series": "2", "supplier": { "name": "Electrodomésticos del Sur S.A.", "tax_id": { "country": "AR", "code": "30712345671" }, "addresses": [ { "street": "Av. Rivadavia 5000", "locality": "Buenos Aires", "region": "Ciudad Autónoma de Buenos Aires", "code": "C1424", "country": "AR" } ], "emails": [ { "addr": "ventas@electrodomesticos.com.ar" } ], "registration": { "other": "Inicio de actividades: 2016-03-01" } }, "customer": { "name": "Juan Pérez", "identities": [ { "code": "25123456", "ext": { "ar-arca-identity-type": "96" } } ] }, "lines": [ { "quantity": "1", "item": { "name": "Heladera Samsung 400L", "price": "850000.00", "key": "goods" }, "taxes": [ { "cat": "VAT", "rate": "general" } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "AR", "$addons": [ "ar-arca-v4" ], "uuid": "4bea8c67-6ad9-5cfc-a1ce-f9f391e963b1", "type": "standard", "series": "2", "issue_date": "2025-01-16", "currency": "ARS", "tax": { "ext": { "ar-arca-concept": "1", "ar-arca-doc-type": "6" } }, "supplier": { "name": "Electrodomésticos del Sur S.A.", "tax_id": { "country": "AR", "code": "30712345671" }, "addresses": [ { "street": "Av. Rivadavia 5000", "locality": "Buenos Aires", "region": "Ciudad Autónoma de Buenos Aires", "code": "C1424", "country": "AR" } ], "emails": [ { "addr": "ventas@electrodomesticos.com.ar" } ], "registration": { "other": "Inicio de actividades: 2016-03-01" } }, "customer": { "name": "Juan Pérez", "identities": [ { "code": "25123456", "ext": { "ar-arca-identity-type": "96" } } ], "ext": { "ar-arca-vat-status": "5" } }, "lines": [ { "i": 1, "quantity": "1", "item": { "key": "goods", "name": "Heladera Samsung 400L", "price": "850000.00" }, "sum": "850000.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "21.0%", "ext": { "ar-arca-vat-rate": "5" } } ], "total": "850000.00" } ], "totals": { "sum": "850000.00", "total": "850000.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "ar-arca-vat-rate": "5" }, "base": "850000.00", "percent": "21.0%", "amount": "178500.00" } ], "amount": "178500.00" } ], "sum": "178500.00" }, "tax": "178500.00", "total_with_tax": "1028500.00", "payable": "1028500.00" } } ``` Factura C is issued by monotributistas (simplified tax regime for small businesses and freelancers) to any type of customer. This invoice type does not break down VAT separately. Notice: * the supplier is registered under the monotributo regime, which is a simplified tax system for small businesses, * the minimal version contains only essential fields; totals are calculated by `gobl build`, * when running `gobl build`, the system automatically calculates totals without breaking down VAT separately (VAT is included but not itemized), * the built version shows the normalized document with calculated totals where no VAT breakdown is shown, as monotributistas don't separately charge VAT, * the [`ar-arca-v4`](https://docs.gobl.org/addons/ar-arca-v4) addon applies Factura C specific rules and ensures compliance with monotributo requirements, and, * the invoice will be submitted to ARCA for authorization and receive a CAE. ```json ARCA Invoice Monotax (Factura C) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": ["ar-arca-v4"], "$tags": ["monotax"], "uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "currency": "ARS", "issue_date": "2025-01-18", "series": "1", "supplier": { "name": "María García - Diseño Gráfico", "tax_id": { "country": "AR", "code": "20172543597" }, "addresses": [ { "street": "Calle Florida 500", "locality": "Buenos Aires", "region": "Ciudad Autónoma de Buenos Aires", "code": "C1005", "country": "AR" } ], "emails": [ { "addr": "maria.garcia@email.com.ar" } ], "registration": { "other": "Inicio de actividades: 2016-03-01" } }, "customer": { "name": "Startup Tech S.R.L.", "tax_id": { "country": "AR", "code": "30987654321" }, "addresses": [ { "street": "Av. Belgrano 1000", "locality": "Buenos Aires", "region": "Ciudad Autónoma de Buenos Aires", "code": "C1092", "country": "AR" } ], "emails": [ { "addr": "admin@startuptech.com.ar" } ] }, "lines": [ { "quantity": "1", "item": { "name": "Diseño de logotipo e identidad visual", "price": "150000.00", "key": "services" } } ], "charges": [ { "key": "tax", "percent": "10%", "reason": "Tributo Nacional", "ext": { "ar-arca-tax-type": "1" } } ], "ordering": { "period": { "start": "2025-01-01", "end": "2025-01-15" } }, "payment": { "terms": { "due_dates": [ { "date": "2025-01-25", "amount": "150000.00" } ] } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "AR", "$addons": [ "ar-arca-v4" ], "$tags": [ "monotax" ], "uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "type": "standard", "series": "1", "issue_date": "2025-01-18", "currency": "ARS", "tax": { "ext": { "ar-arca-concept": "2", "ar-arca-doc-type": "11" } }, "supplier": { "name": "María García - Diseño Gráfico", "tax_id": { "country": "AR", "code": "20172543597" }, "addresses": [ { "street": "Calle Florida 500", "locality": "Buenos Aires", "region": "Ciudad Autónoma de Buenos Aires", "code": "C1005", "country": "AR" } ], "emails": [ { "addr": "maria.garcia@email.com.ar" } ], "registration": { "other": "Inicio de actividades: 2016-03-01" } }, "customer": { "name": "Startup Tech S.R.L.", "tax_id": { "country": "AR", "code": "30987654321" }, "addresses": [ { "street": "Av. Belgrano 1000", "locality": "Buenos Aires", "region": "Ciudad Autónoma de Buenos Aires", "code": "C1092", "country": "AR" } ], "emails": [ { "addr": "admin@startuptech.com.ar" } ], "ext": { "ar-arca-vat-status": "1" } }, "lines": [ { "i": 1, "quantity": "1", "item": { "key": "services", "name": "Diseño de logotipo e identidad visual", "price": "150000.00" }, "sum": "150000.00", "total": "150000.00" } ], "charges": [ { "i": 1, "key": "tax", "reason": "Tributo Nacional", "percent": "10%", "amount": "15000.00", "ext": { "ar-arca-tax-type": "1" } } ], "ordering": { "period": { "start": "2025-01-01", "end": "2025-01-15" } }, "payment": { "terms": { "due_dates": [ { "date": "2025-01-25", "amount": "150000.00" } ] } }, "totals": { "sum": "150000.00", "charge": "15000.00", "total": "165000.00", "tax": "0.00", "total_with_tax": "165000.00", "payable": "165000.00" } } ``` Factura T is issued by hotels and tourism providers to non-resident tourists. ARCA automatically reimburses the 21% VAT on qualifying accommodation items. Notice: * the minimal version in the first tab contains only the essential fields required to create the Factura T, * the [`ar-arca-v4`](https://docs.gobl.org/addons/ar-arca-v4) addon ensures the document will be validated using the ARCA rules built into the [GOBL](https://docs.gobl.org) library, * the document type (`ar-arca-doc-type`) must be `195` (Invoice), `196` (Debit Note) or `197` (Credit Note), and the tourism extensions `ar-arca-tourism-type` and `ar-arca-tourism-item` are mandatory, * only the standard 21% VAT rate is accepted; any other rate will be rejected by ARCA, * the built version shows the normalized document with calculated totals and the IVA breakdown, and, * the invoice will be submitted to ARCA for authorization and receive a CAE. ```json ARCA Invoice (Factura T) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": ["ar-arca-v4"], "uuid": "5cfa9d78-7be0-6dfd-b2df-0a0402fa074c", "currency": "ARS", "issue_date": "2025-02-01", "series": "1", "tax": { "ext": { "ar-arca-concept": "2", "ar-arca-doc-type": "195", "ar-arca-tourism-type": "1" } }, "supplier": { "name": "Hotel Patagonia S.A.", "tax_id": { "country": "AR", "code": "30712345671" }, "addresses": [ { "street": "Av. San Martín 500", "locality": "Bariloche", "region": "Río Negro", "code": "R8400", "country": "AR" } ], "emails": [ { "addr": "reservas@hotelpatagonia.com.ar" } ], "registration": { "other": "Inicio de actividades: 2016-03-01" } }, "customer": { "name": "John Smith", "identities": [ { "code": "AB123456", "ext": { "ar-arca-identity-type": "94" } } ], "addresses": [ { "street": "123 Main St", "locality": "New York", "region": "NY", "country": "US" } ], "ext": { "ar-arca-vat-status": "5" } }, "lines": [ { "quantity": "1", "item": { "name": "Hotel sin desayuno", "price": "100.00", "key": "services" }, "taxes": [ { "cat": "VAT", "rate": "general", "ext": { "ar-arca-tourism-item": "1", "ar-arca-vat-rate": "5" } } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "AR", "$addons": [ "ar-arca-v4" ], "uuid": "5cfa9d78-7be0-6dfd-b2df-0a0402fa074c", "type": "standard", "series": "1", "issue_date": "2025-02-01", "currency": "ARS", "tax": { "ext": { "ar-arca-concept": "2", "ar-arca-doc-type": "195", "ar-arca-tourism-type": "1" } }, "supplier": { "name": "Hotel Patagonia S.A.", "tax_id": { "country": "AR", "code": "30712345671" }, "addresses": [ { "street": "Av. San Martín 500", "locality": "Bariloche", "region": "Río Negro", "code": "R8400", "country": "AR" } ], "emails": [ { "addr": "reservas@hotelpatagonia.com.ar" } ], "registration": { "other": "Inicio de actividades: 2016-03-01" } }, "customer": { "name": "John Smith", "identities": [ { "code": "AB123456", "ext": { "ar-arca-identity-type": "94" } } ], "addresses": [ { "street": "123 Main St", "locality": "New York", "region": "NY", "country": "US" } ], "ext": { "ar-arca-vat-status": "5" } }, "lines": [ { "i": 1, "quantity": "1", "item": { "key": "services", "name": "Hotel sin desayuno", "price": "100.00" }, "sum": "100.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "21.0%", "ext": { "ar-arca-tourism-item": "1", "ar-arca-vat-rate": "5" } } ], "total": "100.00" } ], "totals": { "sum": "100.00", "total": "100.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "ar-arca-tourism-item": "1", "ar-arca-vat-rate": "5" }, "base": "100.00", "percent": "21.0%", "amount": "21.00" } ], "amount": "21.00" } ], "sum": "21.00" }, "tax": "21.00", "total_with_tax": "121.00", "payable": "121.00" } } ``` Credit notes (notas de crédito) reverse all or part of a previously authorized invoice — for returns, discounts, or billing errors. The credit note class (A, B, or C) follows the class of the invoice it corrects. Notice: * the `type` is set to `credit-note`; combined with the registered-taxpayer parties, the [`ar-arca-v4`](https://docs.gobl.org/addons/ar-arca-v4) addon maps it to document type `3` (Nota de Crédito A), * the `preceding` array references the original invoice by `series`, `code`, and `issue_date`, with a `reason` for the correction, * the preceding entry carries the [`ar-arca-doc-type`](https://docs.gobl.org/addons/ar-arca-v4) extension set to `1`, identifying the original document as a Factura A, * the lines describe only the amounts being credited — here, two returned notebooks from the original ten, and, * like invoices, the credit note is submitted to ARCA for authorization and receives its own CAE. ```json ARCA Credit Note (Nota de Crédito A) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": ["ar-arca-v4"], "uuid": "3aea7b56-59d8-4beb-90bd-f8f280d852a1", "type": "credit-note", "currency": "ARS", "issue_date": "2025-01-22", "series": "1", "preceding": [ { "type": "standard", "series": "1", "code": "00001234", "issue_date": "2025-01-15", "reason": "Devolución de mercadería", "ext": { "ar-arca-doc-type": "1" } } ], "supplier": { "name": "Proveedor Ejemplo S.A.", "tax_id": { "country": "AR", "code": "30712345671" }, "addresses": [ { "street": "Av. Corrientes 1234", "locality": "Buenos Aires", "region": "Ciudad Autónoma de Buenos Aires", "code": "C1043", "country": "AR" } ], "emails": [ { "addr": "ventas@proveedorejemplo.com.ar" } ], "registration": { "other": "Inicio de actividades: 2016-03-01" } }, "customer": { "name": "Cliente Comercial S.R.L.", "tax_id": { "country": "AR", "code": "30987654321" }, "addresses": [ { "street": "Av. Santa Fe 2500", "locality": "Buenos Aires", "region": "Ciudad Autónoma de Buenos Aires", "code": "C1123", "country": "AR" } ], "emails": [ { "addr": "compras@clientecomercial.com.ar" } ] }, "lines": [ { "quantity": "2", "item": { "name": "Notebooks Dell Latitude", "price": "450000.00", "key": "goods" }, "taxes": [ { "cat": "VAT", "rate": "general" } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "AR", "$addons": [ "ar-arca-v4" ], "uuid": "3aea7b56-59d8-4beb-90bd-f8f280d852a1", "type": "credit-note", "series": "1", "issue_date": "2025-01-22", "currency": "ARS", "preceding": [ { "type": "standard", "issue_date": "2025-01-15", "series": "1", "code": "00001234", "reason": "Devolución de mercadería", "ext": { "ar-arca-doc-type": "1" } } ], "tax": { "ext": { "ar-arca-concept": "1", "ar-arca-doc-type": "3" } }, "supplier": { "name": "Proveedor Ejemplo S.A.", "tax_id": { "country": "AR", "code": "30712345671" }, "addresses": [ { "street": "Av. Corrientes 1234", "locality": "Buenos Aires", "region": "Ciudad Autónoma de Buenos Aires", "code": "C1043", "country": "AR" } ], "emails": [ { "addr": "ventas@proveedorejemplo.com.ar" } ], "registration": { "other": "Inicio de actividades: 2016-03-01" } }, "customer": { "name": "Cliente Comercial S.R.L.", "tax_id": { "country": "AR", "code": "30987654321" }, "addresses": [ { "street": "Av. Santa Fe 2500", "locality": "Buenos Aires", "region": "Ciudad Autónoma de Buenos Aires", "code": "C1123", "country": "AR" } ], "emails": [ { "addr": "compras@clientecomercial.com.ar" } ], "ext": { "ar-arca-vat-status": "1" } }, "lines": [ { "i": 1, "quantity": "2", "item": { "key": "goods", "name": "Notebooks Dell Latitude", "price": "450000.00" }, "sum": "900000.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "21.0%", "ext": { "ar-arca-vat-rate": "5" } } ], "total": "900000.00" } ], "totals": { "sum": "900000.00", "total": "900000.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "ar-arca-vat-rate": "5" }, "base": "900000.00", "percent": "21.0%", "amount": "189000.00" } ], "amount": "189000.00" } ], "sum": "189000.00" }, "tax": "189000.00", "total_with_tax": "1089000.00", "payable": "1089000.00" } } ```
*** | | | | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Compliance | [Invoicing compliance in Argentina](/compliance/argentina)
[Compliance timeline](/timelines/argentina) | | Apps | [Argentina](/apps/argentina) | | Guides | [ARCA supplier onboarding](/guides/ar-arca-suppliers)
[ARCA invoices](/guides/ar-arca-invoices) | | FAQ | [Argentina FAQ](/faq/argentina) | | GOBL | [Argentina Tax Regime](https://docs.gobl.org/regimes/ar)
[Argentina ARCA Addon](https://docs.gobl.org/addons/ar-arca-v4) |
Ask and answer questions about the Argentina App → # AT Portugal Source: https://docs.invopop.com/apps/at-portugal Submit certified invoices and periodic SAF-T data to Portugal’s Autoridade Tributária.
Supplier registration guide › Issuing guide ›
| | | | --------- | -------------------------------- | | Developer | [Invopop](https://invopop.com) | | Category | Government | | Scope | B2B, B2C | | Country | [Portugal](/compliance/portugal) |
Invopop is an officially certified invoice provider in Portugal. Our **AT Portugal app** supports invoice, receipt and delivery note compliance with Portugal’s AT e-invoicing regulation. Automate supplier onboarding, SAF-T report generation, invoice generation with ATCUD, and more. This app enables businesses (and their suppliers) to issue invoices and other document types in accordance with Portuguese law. #### Key features * **Workflow automation:** This app provides automated workflows for issuing invoices, onboarding suppliers, and managing fiscal submissions to the Autoridade Tributária e Aduaneira (AT). * **Legally compliant PDF documents:** Invoices, payments and delivery notes are generated with a certified ATCUD and QR codes, as required by the Portuguese tax legislation. * **SAF-T (PT):** The app makes workflow steps available to manage SAF-T (PT) entries for each supplier. * **Realtime and manual reporting options:** Report in real-time via webservice or generate a file to upload through the AT's portal. * **Supplier portal:** Suppliers can generate SAF-T PT reports and create authorized series via the [Supplier Portal](https://at-pt.invopop.com/portal). * **Supplier registration:** Registration completes in a single workflow step, with no manual onboarding for the supplier. * **White-label support:** Invoicing can be performed either under a client’s brand (white-label) or directly by the issuing organization, according to operational needs. #### Supported document types The current integration supports the following document types for reporting to the AT: | Category | Code | Portuguese Name | English Translation | | ----------------------- | ------ | --------------------- | ------------------- | | **Invoices** | **FT** | *Fatura* | Standard Invoice | | | **FS** | *Fatura Simplificada* | Simplified Invoice | | | **FR** | *Fatura-Recibo* | Invoice-Receipt | | | **ND** | *Nota de Débito* | Debit Note | | | **NC** | *Nota de Crédito* | Credit Note | | **Payment receipts** | **RG** | *Outro Recibo* | Other Receipt | | **Transport documents** | **GR** | *Guia de Remessa* | Delivery Note | | | **GT** | *Guia de Transporte* | Waybill | | | **GD** | *Guia de Devolução* | Return Guide | | | **GC** | *Guia de Consignação* | Consignment Guide | Other SAF-T document types beyond those listed above are not currently supported. If you require support for additional document types, please contact us so we can analyze and consider prioritizing their development. Make sure to check out our [Supplier registration guide](/guides/pt-at-supplier) for onboarding suppliers and the [Issuing invoices guide](/guides/pt-at) for issuing documents. ## FAQ Invoicing questions In Portugal, fiscally relevant documents issued through invoicing software must be reported to the Tax Authority (AT). There are two possible reporting models: 1. **SAF-T monthly export** – a single XML file including all documents for the month. This file is generated by the invoicing software and then uploaded manually to the AT portal, as there is no API available for submitting it automatically. 2. **Real-time transmission** – instead of a monthly file, each invoice is sent individually to the AT at the time of issuance, using the authority's API. Whether one model or the other is used usually depends on the issuer's accountant's preference (who typically uploads the SAF-T monthly report should they choose that model). Invopop's [AT Portugal app](/apps/at-portugal) supports both reporting methods, so each supplier can pick the one that best fits their needs. If a supplier uses real-time transmission — the **Send document to AT** step in the workflow — the documents submitted this way are already communicated to the AT, so they don't need to upload a monthly SAF-T file for them. The only documents that still require the monthly SAF-T upload are those not reported in real time, such as RG payment receipts, which the AT's webservice does not accept. Install the AT Portugal app, register the supplier with their NIF, and pick a reporting model (monthly SAF-T or real-time submission). Run invoices through the AT Issue Invoice workflow — Invopop generates the ATCUD, QR, and signature automatically. When issuing in Portugal you may see an error similar to: > `recording envelope: totals: (payable: too high according to Artigo 40.º do CIVA.)` **What it means:** Article 40 of the Portuguese VAT Code (*Código do IVA*) sets limits and rules for **simplified invoices** (*faturas simplificadas*). If the payable amount exceeds what is allowed for a simplified invoice in your situation, the rules effectively require a **full invoice** (*fatura completa*) with proper buyer identification—not an anonymous or minimal customer. **What to do:** * Treat the document as a **full invoice** and supply **real customer tax data** when you have it. * If you **do not** have the buyer's tax information, Portuguese practice allows the generic retail customer: set the customer **name** to `Consumidor final` and the **tax ID** to `999999990`. * For transactions **above €1,000**, the law also expects **name and address** on the document. The AT may not always reject submissions that omit some of that detail, but you should follow the rule for full compliance. Adjust your GOBL customer block (or equivalent) accordingly and re-run the workflow. **What it means:** when a credit note references an invoice issued through Invopop, every credit note line must be matched against the quantity and price still available to credit on the original invoice's lines. Line `#N` could not be matched to any of them. For a credit note line to be applied to an invoice line: 1. Its `item.name` must be **exactly identical** to the invoice line's, and both lines must have the same VAT treatment — the same rate and, where applicable, the same exemption. 2. Among the lines matching by name and VAT, it must satisfy one of: * **Same unit price** as the invoice line, with a quantity up to the remaining quantity — to credit fewer units at the original price. * **Same quantity** as the invoice line, with a unit price up to the remaining price — to credit part of the amount for the full quantity. Include only the lines you are crediting — the credit note does not need to mirror the full invoice — and the order of the lines is irrelevant. Availability is cumulative: every accepted credit note reduces the remaining quantity or price, so the total credited per line can never exceed the original invoice amount. **What to do:** check that line `#N`'s item name and VAT rate or exemption exactly match a line on the referenced invoice (watch for typos or renamed items), and that it keeps either the original unit price or the original quantity as described above. If everything matches, review credit notes previously issued against the same invoice — the remaining quantity or amount may already have been credited. Note that a credit note supports exactly **one** `preceding` reference, and line matching only applies when the referenced invoice was issued through Invopop — references to external series (for example, invoices issued by a previous provider) are accepted without matching. This error means your workflow includes the **Send to the AT** step for a payment receipt. Payment receipts are not supported for real-time reporting — the AT does not accept them via the real-time webservice. **The fix:** remove the **Send to the AT** step from your payment workflow. RG receipts are only reportable through the monthly SAF-T file. The **Record for SAF-T reporting** step alone is all you need for full compliance. Portugal defines two payment receipt types: * **RG — Outros Recibos**: Standard payment receipts, reported through the monthly SAF-T file only. Real-time reporting is not available for this type. * **RC — Recibo no âmbito do regime de IVA de Caixa**: Receipts specific to the VAT Cash accounting regime. RC payments are not currently supported by the AT Portugal app. See the [Portugal tax regime in GOBL](https://docs.gobl.org/regimes/pt) for tax categories, NIF rules, and AT-specific extensions. The [`pt-saft-v1`](https://docs.gobl.org/addons/pt-saft-v1) addon documents fields required by the SAF-T schema. Registering supplier questions Run the AT Register Supplier workflow with the supplier's NIF and chosen reporting model. Invopop registers the issuance series with AT and generates the ATCUD prefix to be embedded in every issued document. For real-time submission, an AT API username/password is required (issued through the AT portal). For SAF-T monthly export, no live credentials are needed — only the supplier's NIF and series registration. For real-time submission, Invopop stores AT API credentials encrypted at rest. For SAF-T export model, no live credentials are needed — the supplier (or their accountant) downloads the SAF-T file and uploads it manually to AT's portal. Reporting questions Real-time model: per invoice. SAF-T model: once per month, by the 5th of the following month. The choice is set at supplier registration and can be changed by re-registering. For invoice-level reporting, choose the model at supplier registration: real-time (Invopop submits per invoice) or monthly SAF-T (Invopop generates the file by the 5th of the following month, accountant uploads). Periodic VAT and IES are filed separately by the accountant. Monthly SAF-T-PT XML uploaded to AT's portal (no API for this), or real-time WebService XML calls per invoice. Both follow the same SAF-T schema; real-time submits one document at a time, SAF-T submits an aggregated file covering the month. More answers in our [Portugal FAQ](/faq/portugal) section
The following workflow actions will be available once you install and enable this app:
1
Record a GOBL document for SAF-T PT reporting.
Send document to the AT in realtime via web service. Register a GOBL party to report taxes to the AT in their name. Cancel a previously recorded GOBL document for SAF-T PT reporting.
These workflows are essential sequences for processing and issuing AT Portugal documents. You can augment them with webhooks, email, storage actions and more. Issuing document workflows: ```json Example AT issue invoice workflow theme={"system"} { "name": "AT issue invoice", "description": "Issue an invoice through AT and generate PDF", "schema": "bill/invoice", "steps": [ { "id": "6f884d90-f2b9-11ef-acb2-cd64e858247e", "name": "Set state", "provider": "silo.state", "config": { "state": "processing" } }, { "id": "76f194b0-f2b9-11ef-acb2-cd64e858247e", "name": "Record document for SAF-T", "provider": "at-pt.record" }, { "id": "59174840-c09a-11f0-b8a2-b531dbe0da3c", "name": "Send document to AT", "provider": "at-pt.send" }, { "id": "93795a50-f2b9-11ef-acb2-cd64e858247e", "name": "Generate PDF", "provider": "pdf", "summary": "Portuguese · A4 · Original", "config": { "date_format": "%Y-%m-%d", "hide_promo": true, "label": "Original", "layout": "A4", "locale": "pt", "logo_height": 40, "watermark": "" } }, { "id": "ce7c50c0-9d55-11f0-b3a4-87562f21f508", "name": "Generate PDF", "provider": "pdf", "summary": "Portuguese · A4 · Duplicado", "config": { "date_format": "%Y-%m-%d", "label": "Duplicado", "layout": "A4", "locale": "pt", "logo_height": 40, "watermark": "", "duplicate": true } }, { "id": "7a708240-f2b9-11ef-acb2-cd64e858247e", "name": "Set state", "provider": "silo.state", "config": { "state": "sent" } } ], "rescue": [ { "id": "805bdbf0-f2b9-11ef-acb2-cd64e858247e", "name": "Set state", "provider": "silo.state", "config": { "state": "error" } } ] } ``` ```json Example AT issue delivery workflow theme={"system"} { "name": "AT issue delivery", "description": "Issue a delivery document through AT and generate PDF", "schema": "bill/delivery", "steps": [ { "id": "6f884d90-f2b9-11ef-acb2-cd64e858247e", "name": "Set state", "provider": "silo.state", "config": { "state": "processing" } }, { "id": "76f194b0-f2b9-11ef-acb2-cd64e858247e", "name": "Record document for SAF-T", "provider": "at-pt.record" }, { "id": "59174840-c09a-11f0-b8a2-b531dbe0da3c", "name": "Send document to AT", "provider": "at-pt.send" }, { "id": "93795a50-f2b9-11ef-acb2-cd64e858247e", "name": "Generate PDF", "provider": "pdf", "summary": "Portuguese · A4 · Original", "config": { "date_format": "%Y-%m-%d", "hide_promo": true, "label": "Original", "layout": "A4", "locale": "pt", "logo_height": 40, "watermark": "" } }, { "id": "ce7c50c0-9d55-11f0-b3a4-87562f21f508", "name": "Generate PDF", "provider": "pdf", "summary": "Portuguese · A4 · Duplicado", "config": { "date_format": "%Y-%m-%d", "label": "Duplicado", "layout": "A4", "locale": "pt", "logo_height": 40, "watermark": "", "duplicate": true } }, { "id": "7a708240-f2b9-11ef-acb2-cd64e858247e", "name": "Set state", "provider": "silo.state", "config": { "state": "sent" } } ], "rescue": [ { "id": "805bdbf0-f2b9-11ef-acb2-cd64e858247e", "name": "Set state", "provider": "silo.state", "config": { "state": "error" } } ] } ``` ```json Example AT issue payment workflow theme={"system"} { "name": "AT issue payment", "description": "Issue a payment through AT and generate PDF", "schema": "bill/payment", "steps": [ { "id": "6f884d90-f2b9-11ef-acb2-cd64e858247e", "name": "Set state", "provider": "silo.state", "config": { "state": "processing" } }, { "id": "76f194b0-f2b9-11ef-acb2-cd64e858247e", "name": "Record document for SAF-T", "provider": "at-pt.record" }, { "id": "93795a50-f2b9-11ef-acb2-cd64e858247e", "name": "Generate PDF", "provider": "pdf", "summary": "Portuguese · A4 · Original", "config": { "date_format": "%Y-%m-%d", "hide_promo": true, "label": "Original", "layout": "A4", "locale": "pt", "logo_height": 40, "watermark": "" } }, { "id": "ce7c50c0-9d55-11f0-b3a4-87562f21f508", "name": "Generate PDF", "provider": "pdf", "summary": "Portuguese · A4 · Duplicado", "config": { "date_format": "%Y-%m-%d", "label": "Duplicado", "layout": "A4", "locale": "pt", "logo_height": 40, "watermark": "", "duplicate": true } }, { "id": "7a708240-f2b9-11ef-acb2-cd64e858247e", "name": "Set state", "provider": "silo.state", "config": { "state": "sent" } } ], "rescue": [ { "id": "805bdbf0-f2b9-11ef-acb2-cd64e858247e", "name": "Set state", "provider": "silo.state", "config": { "state": "error" } } ] } ``` Supplier workflows: ```json Example AT register supplier workflow theme={"system"} { "name": "AT register supplier", "description": "Register a supplier with AT", "schema": "org/party", "steps": [ { "id": "6f9282a0-3870-11ef-af29-4533d56cea03", "name": "Set state", "config": { "state": "processing" }, "summary": "Set state to `processing`{.state .processing}", "provider": "silo.state" }, { "id": "1a9bcde0-a816-11ef-87b2-fd751e6d3b88", "name": "Sign envelope", "provider": "silo.close" }, { "id": "5b6ca7e0-ad93-11ef-a7da-83137f995008", "name": "Register supplier with AT", "provider": "at-pt.register" } ], "rescue": [] } ``` ```json Example AT supplier post-registration workflow theme={"system"} { "name": "AT supplier post-registration", "description": "Mark an AT supplier as registered", "schema": "org/party", "steps": [ { "id": "7e8d8070-3870-11ef-af29-4533d56cea03", "name": "Set state", "config": { "state": "registered" }, "summary": "Set state to `registered`{.state .registered}", "provider": "silo.state" } ], "rescue": [] } ``` Cancelling document workflows: ```json Example AT cancel invoice workflow theme={"system"} { "name": "AT cancel invoice", "description": "Cancel an invoice through AT and generate PDF", "schema": "bill/invoice", "steps": [ { "id": "6f884d90-f2b9-11ef-acb2-cd64e858247e", "name": "Set state", "provider": "silo.state", "config": { "state": "processing" } }, { "id": "cc0002a0-927f-11f0-8cd1-bd9f2c371090", "name": "Cancel SAF-T record", "provider": "at-pt.cancel" }, { "id": "59174840-c09a-11f0-b8a2-b531dbe0da3c", "name": "Send document to AT", "provider": "at-pt.send" }, { "id": "7a708240-f2b9-11ef-acb2-cd64e858247e", "name": "Set state", "provider": "silo.state", "config": { "state": "void" } }, { "id": "93795a50-f2b9-11ef-acb2-cd64e858247e", "name": "Generate PDF", "provider": "pdf", "summary": "Portuguese · A4 · Original", "config": { "date_format": "%Y-%m-%d", "hide_promo": true, "label": "Original", "layout": "A4", "locale": "pt", "logo_height": 40, "watermark": "" } }, { "id": "ce7c50c0-9d55-11f0-b3a4-87562f21f508", "name": "Generate PDF", "provider": "pdf", "summary": "Portuguese · A4 · Duplicado", "config": { "date_format": "%Y-%m-%d", "label": "Duplicado", "layout": "A4", "locale": "pt", "logo_height": 40, "watermark": "", "duplicate": true } } ], "rescue": [ { "id": "805bdbf0-f2b9-11ef-acb2-cd64e858247e", "name": "Set state", "provider": "silo.state", "config": { "state": "error" } } ] } ``` ```json Example AT cancel delivery workflow theme={"system"} { "name": "AT cancel delivery", "description": "Cancel a delivery document through AT and generate PDF", "schema": "bill/delivery", "steps": [ { "id": "6f884d90-f2b9-11ef-acb2-cd64e858247e", "name": "Set state", "provider": "silo.state", "config": { "state": "processing" } }, { "id": "cc0002a0-927f-11f0-8cd1-bd9f2c371090", "name": "Cancel SAF-T record", "provider": "at-pt.cancel" }, { "id": "59174840-c09a-11f0-b8a2-b531dbe0da3c", "name": "Send document to AT", "provider": "at-pt.send" }, { "id": "7a708240-f2b9-11ef-acb2-cd64e858247e", "name": "Set state", "provider": "silo.state", "config": { "state": "void" } }, { "id": "93795a50-f2b9-11ef-acb2-cd64e858247e", "name": "Generate PDF", "provider": "pdf", "summary": "Portuguese · A4 · Original", "config": { "date_format": "%Y-%m-%d", "hide_promo": true, "label": "Original", "layout": "A4", "locale": "pt", "logo_height": 40, "watermark": "" } }, { "id": "ce7c50c0-9d55-11f0-b3a4-87562f21f508", "name": "Generate PDF", "provider": "pdf", "summary": "Portuguese · A4 · Duplicado", "config": { "date_format": "%Y-%m-%d", "label": "Duplicado", "layout": "A4", "locale": "pt", "logo_height": 40, "watermark": "", "duplicate": true } } ], "rescue": [ { "id": "805bdbf0-f2b9-11ef-acb2-cd64e858247e", "name": "Set state", "provider": "silo.state", "config": { "state": "error" } } ] } ``` ```json Example AT cancel payment workflow theme={"system"} { "name": "AT cancel payment", "description": "Cancel a payment through AT and generate PDF", "schema": "bill/payment", "steps": [ { "id": "6f884d90-f2b9-11ef-acb2-cd64e858247e", "name": "Set state", "provider": "silo.state", "config": { "state": "processing" } }, { "id": "cc0002a0-927f-11f0-8cd1-bd9f2c371090", "name": "Cancel SAF-T record", "provider": "at-pt.cancel" }, { "id": "7a708240-f2b9-11ef-acb2-cd64e858247e", "name": "Set state", "provider": "silo.state", "config": { "state": "void" } }, { "id": "93795a50-f2b9-11ef-acb2-cd64e858247e", "name": "Generate PDF", "provider": "pdf", "summary": "Portuguese · A4 · Original", "config": { "date_format": "%Y-%m-%d", "hide_promo": true, "label": "Original", "layout": "A4", "locale": "pt", "logo_height": 40, "watermark": "" } }, { "id": "ce7c50c0-9d55-11f0-b3a4-87562f21f508", "name": "Generate PDF", "provider": "pdf", "summary": "Portuguese · A4 · Duplicado", "config": { "date_format": "%Y-%m-%d", "label": "Duplicado", "layout": "A4", "locale": "pt", "logo_height": 40, "watermark": "", "duplicate": true } } ], "rescue": [ { "id": "805bdbf0-f2b9-11ef-acb2-cd64e858247e", "name": "Set state", "provider": "silo.state", "config": { "state": "error" } } ] } ``` New to workflows? Read more in our [workflows guide](/guides/workflows). In this example, we're issuing a simple invoice from a Portuguese supplier to another Portuguese business. Notice: * the minimal version in the first tab contains only the essential fields required to create the invoice, without totals or calculations, * the [`pt-saft-v1`](https://docs.gobl.org/addons/pt-saft-v1) addon ensures the document will be validated and normalized using the SAF-T PT v1 rules built into the [GOBL](https://docs.gobl.org) library, * the `supplier` and `series` fields are set to example values; you'll need to replace them with the details of supplier and series registered as per the previous sections. The series must be registered in the Supplier Portal and follow Portuguese naming conventions (see [Series management](/guides/pt-at-supplier#series-management) for details), * when running `gobl build`, or uploading the file, the system automatically calculates totals, assigns the [`pt-saft-invoice-type`](https://docs.gobl.org/addons/pt-saft-v1#invoice-type) extension to `FT` (Fatura), sets the [`pt-saft-payment-means`](https://docs.gobl.org/addons/pt-saft-v1#payment-means) extension to `CC` for card payment, and applies the [`pt-saft-tax-rate`](https://docs.gobl.org/addons/pt-saft-v1#tax-rate-code) extension to `NOR` for standard VAT, * the built version in the second tab shows the normalized document with calculated totals, line item sums (including advance payment deductions), tax breakdowns, and automatically generated fields, and, * the `h` item unit causes the [`pt-saft-product-type`](https://docs.gobl.org/addons/pt-saft-v1#product-type) extension to be set to `S` (Serviço), and the [`pt-region`](https://docs.gobl.org/regimes/pt#region-code) extension is automatically set to `PT`. ```json AT B2B Invoice (minimal) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "PT", "$addons": [ "pt-saft-v1" ], "type": "standard", "series": "FT SERIES-A", "issue_date": "2024-12-23", "currency": "EUR", "supplier": { "name": "Innovatech Lda", "tax_id": { "country": "PT", "code": "504614240" }, "addresses": [ { "num": "156", "street": "Avenida da República", "locality": "Lisboa", "code": "1050-045", "country": "PT" } ], "emails": [ { "addr": "maria@example.com" } ], "registration": { "capital": "150000.00", "office": "CRC Lisboa", "other": "sob NIF 770013813" } }, "customer": { "name": "Gusto Unipessoal Lda", "tax_id": { "country": "PT", "code": "514329874" }, "addresses": [ { "street": "Avenida da Liberdade 152 2º Direito", "locality": "Lisboa", "code": "1250-146", "country": "PT" } ], "emails": [ { "addr": "gusto@example.com" } ], "websites": [ { "url": "https://gusto.example.com" } ], "telephones": [ { "num": "+351912345678" } ] }, "lines": [ { "quantity": "20.0", "item": { "name": "Development services", "price": "50.00", "unit": "h" }, "taxes": [ { "cat": "VAT", "rate": "standard" } ] } ], "payment": { "advances": [ { "date": "2024-12-23", "key": "card", "description": "Advance payment", "amount": "12.34" } ] } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "PT", "$addons": [ "pt-saft-v1" ], "type": "standard", "series": "FT SERIES-A", "issue_date": "2024-12-23", "value_date": "2024-12-23", "currency": "EUR", "tax": { "ext": { "pt-saft-invoice-type": "FT", "pt-saft-source": "P" } }, "supplier": { "name": "Innovatech Lda", "tax_id": { "country": "PT", "code": "504614240" }, "addresses": [ { "num": "156", "street": "Avenida da República", "locality": "Lisboa", "code": "1050-045", "country": "PT" } ], "emails": [ { "addr": "maria@example.com" } ], "registration": { "capital": "150000.00", "office": "CRC Lisboa", "other": "sob NIF 770013813" } }, "customer": { "name": "Gusto Unipessoal Lda", "tax_id": { "country": "PT", "code": "514329874" }, "addresses": [ { "street": "Avenida da Liberdade 152 2º Direito", "locality": "Lisboa", "code": "1250-146", "country": "PT" } ], "emails": [ { "addr": "gusto@example.com" } ], "websites": [ { "url": "https://gusto.example.com" } ], "telephones": [ { "num": "+351912345678" } ] }, "lines": [ { "i": 1, "quantity": "20.0", "item": { "name": "Development services", "price": "50.00", "unit": "h", "ext": { "pt-saft-product-type": "S" } }, "sum": "1000.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "23.0%", "ext": { "pt-region": "PT", "pt-saft-tax-rate": "NOR" } } ], "total": "1000.00" } ], "payment": { "advances": [ { "date": "2024-12-23", "key": "card", "description": "Advance payment", "amount": "12.34", "ext": { "pt-saft-payment-means": "CC" } } ] }, "totals": { "sum": "1000.00", "total": "1000.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "pt-region": "PT", "pt-saft-tax-rate": "NOR" }, "base": "1000.00", "percent": "23.0%", "amount": "230.00" } ], "amount": "230.00" } ], "sum": "230.00" }, "tax": "230.00", "total_with_tax": "1230.00", "payable": "1230.00", "advance": "12.34", "due": "1217.66" } } ``` In this example, a self-employed professional (*trabalhador independente*) invoices a Portuguese company for consulting services. On top of the standard VAT, the customer retains personal income tax (*IRS*) at source. Notice: * the minimal version in the first tab contains only the essential fields; the line carries a second tax on top of `VAT`: an `IRS` combo with `percent` set to `25%` and no `rate`, * the document-level `tax.notes` entry with `cat: "IRS"` carries the legal basis for the withholding (here *Art. 101.º CIRS*); the SAF-T export surfaces it as the `WithholdingTaxType` (`IRS`) and `WithholdingTaxDescription` of the `WithholdingTax` block, and, * in the built version the `IRS` tax becomes its own `retained` category in `totals.taxes`, separate from `VAT`, with `retained: "250.00"` (25% of the 1000,00 base). ```json AT Withholding Invoice (minimal) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "PT", "$addons": [ "pt-saft-v1" ], "type": "standard", "series": "FT SERIES-A", "issue_date": "2024-08-03", "currency": "EUR", "tax": { "notes": [ { "cat": "IRS", "text": "Art. 101.º CIRS" } ] }, "supplier": { "name": "João Silva, Trabalhador Independente", "tax_id": { "country": "PT", "code": "545259045" }, "addresses": [ { "street": "Rua das Flores", "locality": "Lisboa", "code": "1000-000", "country": "PT" } ], "emails": [ { "addr": "joao.silva@example.com" } ] }, "customer": { "name": "Empresa Cliente, Lda.", "tax_id": { "country": "PT", "code": "514329874" }, "addresses": [ { "street": "Avenida da Liberdade 152 2º Direito", "locality": "Lisboa", "code": "1250-146", "country": "PT" } ] }, "lines": [ { "quantity": "1", "item": { "name": "Serviços de consultoria", "price": "1000.00", "unit": "h" }, "taxes": [ { "cat": "VAT", "rate": "standard" }, { "cat": "IRS", "percent": "25%" } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "PT", "$addons": [ "pt-saft-v1" ], "type": "standard", "series": "FT SERIES-A", "issue_date": "2024-08-03", "value_date": "2024-08-03", "currency": "EUR", "tax": { "ext": { "pt-saft-invoice-type": "FT", "pt-saft-source": "P" }, "notes": [ { "cat": "IRS", "text": "Art. 101.º CIRS" } ] }, "supplier": { "name": "João Silva, Trabalhador Independente", "tax_id": { "country": "PT", "code": "545259045" }, "addresses": [ { "street": "Rua das Flores", "locality": "Lisboa", "code": "1000-000", "country": "PT" } ], "emails": [ { "addr": "joao.silva@example.com" } ] }, "customer": { "name": "Empresa Cliente, Lda.", "tax_id": { "country": "PT", "code": "514329874" }, "addresses": [ { "street": "Avenida da Liberdade 152 2º Direito", "locality": "Lisboa", "code": "1250-146", "country": "PT" } ] }, "lines": [ { "i": 1, "quantity": "1", "item": { "name": "Serviços de consultoria", "price": "1000.00", "unit": "h", "ext": { "pt-saft-product-type": "S" } }, "sum": "1000.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "23.0%", "ext": { "pt-region": "PT", "pt-saft-tax-rate": "NOR" } }, { "cat": "IRS", "percent": "25%" } ], "total": "1000.00" } ], "totals": { "sum": "1000.00", "total": "1000.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "pt-region": "PT", "pt-saft-tax-rate": "NOR" }, "base": "1000.00", "percent": "23.0%", "amount": "230.00" } ], "amount": "230.00" }, { "code": "IRS", "retained": true, "rates": [ { "base": "1000.00", "percent": "25%", "amount": "250.00" } ], "amount": "250.00" } ], "sum": "230.00", "retained": "250.00" }, "tax": "230.00", "total_with_tax": "1230.00", "retained_tax": "250.00", "payable": "980.00" } } ``` In this example, we're issuing a standard invoice from a Portuguese supplier that has adhered to the **Cash VAT scheme** (*regime de IVA de Caixa*), under which VAT becomes due only when the customer actually pays rather than when the invoice is issued. Notice: * the only difference from the standard AT B2B invoice above is the `cash-vat` tag (`$tags: ["cash-vat"]`), which flags the supplier's membership in the scheme, * the [`pt-saft-v1`](https://docs.gobl.org/addons/pt-saft-v1) addon reacts to that tag by setting the [`pt-saft-cash-vat`](https://docs.gobl.org/addons/pt-saft-v1#cash-vat-scheme-indicator) extension to `1` in the invoice's `tax` section, and, * the document is otherwise a normal `standard` invoice: the [`pt-saft-invoice-type`](https://docs.gobl.org/addons/pt-saft-v1#invoice-type) extension is still set to `FT` (Fatura) and the standard VAT rate still maps to the [`pt-saft-tax-rate`](https://docs.gobl.org/addons/pt-saft-v1#tax-rate-code) extension `NOR`. ```json AT Cash VAT invoice (minimal) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "PT", "$addons": [ "pt-saft-v1" ], "$tags": [ "cash-vat" ], "type": "standard", "series": "FT SERIES-A", "issue_date": "2024-12-23", "currency": "EUR", "supplier": { "name": "Innovatech Lda", "tax_id": { "country": "PT", "code": "504614240" }, "addresses": [ { "num": "156", "street": "Avenida da República", "locality": "Lisboa", "code": "1050-045", "country": "PT" } ], "emails": [ { "addr": "maria@example.com" } ], "registration": { "capital": "150000.00", "office": "CRC Lisboa", "other": "sob NIF 770013813" } }, "customer": { "name": "Gusto Unipessoal Lda", "tax_id": { "country": "PT", "code": "514329874" }, "addresses": [ { "street": "Avenida da Liberdade 152 2º Direito", "locality": "Lisboa", "code": "1250-146", "country": "PT" } ], "emails": [ { "addr": "gusto@example.com" } ] }, "lines": [ { "quantity": "20.0", "item": { "name": "Development services", "price": "50.00", "unit": "h" }, "taxes": [ { "cat": "VAT", "rate": "standard" } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "PT", "$addons": [ "pt-saft-v1" ], "$tags": [ "cash-vat" ], "type": "standard", "series": "FT SERIES-A", "issue_date": "2024-12-23", "value_date": "2024-12-23", "currency": "EUR", "tax": { "ext": { "pt-saft-cash-vat": "1", "pt-saft-invoice-type": "FT", "pt-saft-source": "P" } }, "supplier": { "name": "Innovatech Lda", "tax_id": { "country": "PT", "code": "504614240" }, "addresses": [ { "num": "156", "street": "Avenida da República", "locality": "Lisboa", "code": "1050-045", "country": "PT" } ], "emails": [ { "addr": "maria@example.com" } ], "registration": { "capital": "150000.00", "office": "CRC Lisboa", "other": "sob NIF 770013813" } }, "customer": { "name": "Gusto Unipessoal Lda", "tax_id": { "country": "PT", "code": "514329874" }, "addresses": [ { "street": "Avenida da Liberdade 152 2º Direito", "locality": "Lisboa", "code": "1250-146", "country": "PT" } ], "emails": [ { "addr": "gusto@example.com" } ] }, "lines": [ { "i": 1, "quantity": "20.0", "item": { "name": "Development services", "price": "50.00", "unit": "h", "ext": { "pt-saft-product-type": "S" } }, "sum": "1000.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "23.0%", "ext": { "pt-region": "PT", "pt-saft-tax-rate": "NOR" } } ], "total": "1000.00" } ], "totals": { "sum": "1000.00", "total": "1000.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "pt-region": "PT", "pt-saft-tax-rate": "NOR" }, "base": "1000.00", "percent": "23.0%", "amount": "230.00" } ], "amount": "230.00" } ], "sum": "230.00" }, "tax": "230.00", "total_with_tax": "1230.00", "payable": "1230.00" } } ``` In this example, we're issuing a simplified invoice (*Fatura Simplificada*) — the short-form invoice used for low-value retail sales where the customer doesn't need to be identified. Notice: * the document carries the `simplified` tag (`$tags: ["simplified"]`) and omits the `customer` entirely, * the [`pt-saft-v1`](https://docs.gobl.org/addons/pt-saft-v1) addon reacts to the tag by setting the [`pt-saft-invoice-type`](https://docs.gobl.org/addons/pt-saft-v1#invoice-type) extension to `FS` (Fatura Simplificada), and the `series` follows the matching `FS ` prefix convention, * if the document also records full payment (for example, a 100% advance), the addon derives the type `FR` (Fatura-Recibo) instead, and the series must then use the `FR ` prefix, and, * as with the other examples, totals and tax breakdowns are calculated automatically when running `gobl build` or uploading. ```json AT Simplified Invoice (minimal) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "PT", "$addons": [ "pt-saft-v1" ], "$tags": [ "simplified" ], "type": "standard", "series": "FS SERIES-A", "issue_date": "2024-12-23", "currency": "EUR", "supplier": { "name": "Innovatech Lda", "tax_id": { "country": "PT", "code": "504614240" }, "addresses": [ { "num": "156", "street": "Avenida da República", "locality": "Lisboa", "code": "1050-045", "country": "PT" } ], "emails": [ { "addr": "maria@example.com" } ], "registration": { "capital": "150000.00", "office": "CRC Lisboa", "other": "sob NIF 770013813" } }, "lines": [ { "quantity": "1", "item": { "name": "Suporte técnico presencial", "price": "45.00", "unit": "h" }, "taxes": [ { "cat": "VAT", "rate": "standard" } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "PT", "$addons": [ "pt-saft-v1" ], "$tags": [ "simplified" ], "type": "standard", "series": "FS SERIES-A", "issue_date": "2024-12-23", "value_date": "2024-12-23", "currency": "EUR", "tax": { "ext": { "pt-saft-invoice-type": "FS", "pt-saft-source": "P" } }, "supplier": { "name": "Innovatech Lda", "tax_id": { "country": "PT", "code": "504614240" }, "addresses": [ { "num": "156", "street": "Avenida da República", "locality": "Lisboa", "code": "1050-045", "country": "PT" } ], "emails": [ { "addr": "maria@example.com" } ], "registration": { "capital": "150000.00", "office": "CRC Lisboa", "other": "sob NIF 770013813" } }, "lines": [ { "i": 1, "quantity": "1", "item": { "name": "Suporte técnico presencial", "price": "45.00", "unit": "h", "ext": { "pt-saft-product-type": "S" } }, "sum": "45.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "23.0%", "ext": { "pt-region": "PT", "pt-saft-tax-rate": "NOR" } } ], "total": "45.00" } ], "totals": { "sum": "45.00", "total": "45.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "pt-region": "PT", "pt-saft-tax-rate": "NOR" }, "base": "45.00", "percent": "23.0%", "amount": "10.35" } ], "amount": "10.35" } ], "sum": "10.35" }, "tax": "10.35", "total_with_tax": "55.35", "payable": "55.35" } } ``` In this example, we're issuing a delivery note from a Portuguese supplier to another Portuguese receiver. Notice: * the first tab shows the minimal version containing only the essential fields required to create the delivery document; there are no totals or calculations, * the [`pt-saft-v1`](https://docs.gobl.org/addons/pt-saft-v1) addon ensures the document will be validated and normalized using the SAF-T PT v1 rules built into the [GOBL](https://docs.gobl.org) library, * the `supplier` and `series` fields are set to example values; you'll need to replace them with the details of supplier and series registered as per the previous sections. The series must be registered in the Supplier Portal and follow Portuguese naming conventions (see [Series management](/guides/pt-at-supplier#series-management) for details), * this is a `note` document type with the [`pt-saft-movement-type`](https://docs.gobl.org/addons/pt-saft-v1#movement-type) extension set to `GR` (Guia de Remessa), * when running `gobl build`, or uploading the document, the system automatically calculates totals, applies the standard VAT rate with the [`pt-saft-tax-rate`](https://docs.gobl.org/addons/pt-saft-v1#tax-rate-code) extension set to `NOR`, and normalizes all fields, * the second tab shows the built version of the document with the calculated totals, line item sums, tax breakdowns, and automatically generated fields, and, * the [`pt-region`](https://docs.gobl.org/regimes/pt#region-code) extension is automatically set to `PT`. ```json AT Delivery (minimal) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/delivery", "$regime": "PT", "$addons": [ "pt-saft-v1" ], "type": "note", "series": "GR SERIES-A", "issue_date": "2026-04-01", "currency": "EUR", "despatch_date": "2026-04-02", "receive_date": "2026-04-03", "supplier": { "name": "Innovatech Lda", "tax_id": { "country": "PT", "code": "770013813" }, "addresses": [ { "street": "Rua das Flores 200 3º Esquerdo", "locality": "Porto", "code": "4050-265", "country": "PT" } ], "registration": { "capital": "100000.00", "office": "Porto" } }, "customer": { "name": "Gusto Unipessoal Lda", "tax_id": { "country": "PT", "code": "514329874" }, "addresses": [ { "street": "Avenida da Liberdade 152 2º Direito", "locality": "Lisboa", "code": "1250-146", "country": "PT" } ] }, "despatcher": { "name": "Innovatech Logistics", "addresses": [ { "street": "Rua da Indústria 45", "locality": "Porto", "code": "4050-300", "country": "PT" } ] }, "receiver": { "name": "Gusto Armazém", "addresses": [ { "street": "Zona Industrial, Lote 23", "locality": "Lisboa", "code": "1300-300", "country": "PT" } ] }, "lines": [ { "quantity": "10", "item": { "name": "Product A", "price": "5.00", "unit": "unit", "ext": { "pt-saft-product-type": "P" } }, "taxes": [ { "cat": "VAT", "rate": "standard" } ] } ], "notes": [ { "text": "Delivery note for products" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/delivery", "$regime": "PT", "$addons": [ "pt-saft-v1" ], "type": "note", "series": "GR SERIES-A", "issue_date": "2026-04-01", "currency": "EUR", "despatch_date": "2026-04-02", "receive_date": "2026-04-03", "tax": { "ext": { "pt-saft-movement-type": "GR" } }, "supplier": { "name": "Innovatech Lda", "tax_id": { "country": "PT", "code": "770013813" }, "addresses": [ { "street": "Rua das Flores 200 3º Esquerdo", "locality": "Porto", "code": "4050-265", "country": "PT" } ], "registration": { "capital": "100000.00", "office": "Porto" } }, "customer": { "name": "Gusto Unipessoal Lda", "tax_id": { "country": "PT", "code": "514329874" }, "addresses": [ { "street": "Avenida da Liberdade 152 2º Direito", "locality": "Lisboa", "code": "1250-146", "country": "PT" } ] }, "despatcher": { "name": "Innovatech Logistics", "addresses": [ { "street": "Rua da Indústria 45", "locality": "Porto", "code": "4050-300", "country": "PT" } ] }, "receiver": { "name": "Gusto Armazém", "addresses": [ { "street": "Zona Industrial, Lote 23", "locality": "Lisboa", "code": "1300-300", "country": "PT" } ] }, "lines": [ { "i": 1, "quantity": "10", "item": { "name": "Product A", "price": "5.00", "unit": "unit", "ext": { "pt-saft-product-type": "P" } }, "sum": "50.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "23.0%", "ext": { "pt-region": "PT", "pt-saft-tax-rate": "NOR" } } ], "total": "50.00" } ], "totals": { "sum": "50.00", "total": "50.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "pt-region": "PT", "pt-saft-tax-rate": "NOR" }, "base": "50.00", "percent": "23.0%", "amount": "11.50" } ], "amount": "11.50" } ], "sum": "11.50" }, "tax": "11.50", "total_with_tax": "61.50", "payable": "61.50" }, "notes": [ { "text": "Delivery note for products" } ] } ``` A return guide (*Guia de Devolução*) records goods being returned to the supplier — for example, defective items, unsold stock, or any other scenario where previously delivered goods are sent back. Notice: * the document carries the `return` tag (`$tags: ["return"]`), which the [`pt-saft-v1`](https://docs.gobl.org/addons/pt-saft-v1) addon uses to automatically set the [`pt-saft-movement-type`](https://docs.gobl.org/addons/pt-saft-v1#movement-type) extension to `GD` (Guia de Devolução), * the `series` follows the `GD ` prefix convention and must be registered through the Supplier Portal, and, * the flow of goods is reversed compared to a delivery note: the `customer` is the party returning the goods, and the `supplier` is the one receiving them back. ```json AT Return guide (minimal) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/delivery", "$regime": "PT", "$addons": [ "pt-saft-v1" ], "$tags": ["return"], "type": "note", "series": "GD SERIES-A", "issue_date": "2026-04-03", "currency": "EUR", "despatch_date": "2026-04-03", "receive_date": "2026-04-03", "supplier": { "name": "Innovatech Lda", "tax_id": { "country": "PT", "code": "770013813" }, "addresses": [ { "street": "Rua das Flores 200 3º Esquerdo", "locality": "Porto", "code": "4050-265", "country": "PT" } ], "registration": { "capital": "100000.00", "office": "Porto" } }, "customer": { "name": "Gusto Unipessoal Lda", "tax_id": { "country": "PT", "code": "514329874" }, "addresses": [ { "street": "Avenida da Liberdade 152 2º Direito", "locality": "Lisboa", "code": "1250-146", "country": "PT" } ] }, "despatcher": { "name": "Gusto Armazém", "addresses": [ { "street": "Zona Industrial, Lote 23", "locality": "Lisboa", "code": "1300-300", "country": "PT" } ] }, "receiver": { "name": "Innovatech Logistics", "addresses": [ { "street": "Rua da Indústria 45", "locality": "Porto", "code": "4050-300", "country": "PT" } ] }, "lines": [ { "quantity": "3", "item": { "name": "Product A", "price": "5.00", "unit": "unit", "ext": { "pt-saft-product-type": "P" } }, "taxes": [ { "cat": "VAT", "rate": "standard" } ] } ], "notes": [ { "text": "Goods returned by the customer." } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/delivery", "$regime": "PT", "$addons": [ "pt-saft-v1" ], "$tags": [ "return" ], "type": "note", "series": "GD SERIES-A", "issue_date": "2026-04-03", "currency": "EUR", "despatch_date": "2026-04-03", "receive_date": "2026-04-03", "tax": { "ext": { "pt-saft-movement-type": "GD" } }, "supplier": { "name": "Innovatech Lda", "tax_id": { "country": "PT", "code": "770013813" }, "addresses": [ { "street": "Rua das Flores 200 3º Esquerdo", "locality": "Porto", "code": "4050-265", "country": "PT" } ], "registration": { "capital": "100000.00", "office": "Porto" } }, "customer": { "name": "Gusto Unipessoal Lda", "tax_id": { "country": "PT", "code": "514329874" }, "addresses": [ { "street": "Avenida da Liberdade 152 2º Direito", "locality": "Lisboa", "code": "1250-146", "country": "PT" } ] }, "despatcher": { "name": "Gusto Armazém", "addresses": [ { "street": "Zona Industrial, Lote 23", "locality": "Lisboa", "code": "1300-300", "country": "PT" } ] }, "receiver": { "name": "Innovatech Logistics", "addresses": [ { "street": "Rua da Indústria 45", "locality": "Porto", "code": "4050-300", "country": "PT" } ] }, "lines": [ { "i": 1, "quantity": "3", "item": { "name": "Product A", "price": "5.00", "unit": "unit", "ext": { "pt-saft-product-type": "P" } }, "sum": "15.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "23.0%", "ext": { "pt-region": "PT", "pt-saft-tax-rate": "NOR" } } ], "total": "15.00" } ], "totals": { "sum": "15.00", "total": "15.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "pt-region": "PT", "pt-saft-tax-rate": "NOR" }, "base": "15.00", "percent": "23.0%", "amount": "3.45" } ], "amount": "3.45" } ], "sum": "3.45" }, "tax": "3.45", "total_with_tax": "18.45", "payable": "18.45" }, "notes": [ { "text": "Goods returned by the customer." } ] } ``` For shipments where the specific recipient is not known upfront — for example, multi-stop delivery runs — issuers can emit a global waybill (*Guia de Transporte Global*) to cover the goods in transport. Notice: * the document `type` is set to `waybill`, which the [`pt-saft-v1`](https://docs.gobl.org/addons/pt-saft-v1) addon normalizes to the [`pt-saft-movement-type`](https://docs.gobl.org/addons/pt-saft-v1#movement-type) extension `GT` (Guia de Transporte), * the `series` follows the `GT ` prefix convention required by the AT and must be registered through the Supplier Portal, and, * the `customer` field is omitted: when no customer is provided on a `GT`, the SAF-T submission auto-fills the AT-prescribed generic entry *Consumidor final* with NIF `999999990` and address *Desconhecido*. ```json AT Global waybill (minimal) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/delivery", "$regime": "PT", "$addons": [ "pt-saft-v1" ], "type": "waybill", "series": "GT SERIES-A", "issue_date": "2026-04-01", "currency": "EUR", "despatch_date": "2026-04-02", "supplier": { "name": "Innovatech Lda", "tax_id": { "country": "PT", "code": "770013813" }, "addresses": [ { "street": "Rua das Flores 200 3º Esquerdo", "locality": "Porto", "code": "4050-265", "country": "PT" } ], "registration": { "capital": "100000.00", "office": "Porto" } }, "despatcher": { "name": "Innovatech Logistics", "addresses": [ { "street": "Rua da Indústria 45", "locality": "Porto", "code": "4050-300", "country": "PT" } ] }, "lines": [ { "quantity": "100", "item": { "name": "Product A", "price": "5.00", "unit": "unit", "ext": { "pt-saft-product-type": "P" } }, "taxes": [ { "cat": "VAT", "rate": "standard" } ] } ], "notes": [ { "text": "Global waybill for multi-stop delivery" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/delivery", "$regime": "PT", "$addons": [ "pt-saft-v1" ], "type": "waybill", "series": "GT SERIES-A", "issue_date": "2026-04-01", "currency": "EUR", "despatch_date": "2026-04-02", "tax": { "ext": { "pt-saft-movement-type": "GT" } }, "supplier": { "name": "Innovatech Lda", "tax_id": { "country": "PT", "code": "770013813" }, "addresses": [ { "street": "Rua das Flores 200 3º Esquerdo", "locality": "Porto", "code": "4050-265", "country": "PT" } ], "registration": { "capital": "100000.00", "office": "Porto" } }, "despatcher": { "name": "Innovatech Logistics", "addresses": [ { "street": "Rua da Indústria 45", "locality": "Porto", "code": "4050-300", "country": "PT" } ] }, "lines": [ { "i": 1, "quantity": "100", "item": { "name": "Product A", "price": "5.00", "unit": "unit", "ext": { "pt-saft-product-type": "P" } }, "sum": "500.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "23.0%", "ext": { "pt-region": "PT", "pt-saft-tax-rate": "NOR" } } ], "total": "500.00" } ], "totals": { "sum": "500.00", "total": "500.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "pt-region": "PT", "pt-saft-tax-rate": "NOR" }, "base": "500.00", "percent": "23.0%", "amount": "115.00" } ], "amount": "115.00" } ], "sum": "115.00" }, "tax": "115.00", "total_with_tax": "615.00", "payable": "615.00" }, "notes": [ { "text": "Global waybill for multi-stop delivery" } ] } ``` Once the recipient of part of the goods covered by a global waybill is known, a concrete document — typically a `GR` (Guia de Remessa) — must be issued with the full transaction details, including the `customer` and a cross-reference back to the originating `GT` so the AT can correlate both records. Notice: * the `customer` is now populated with the actual recipient of the goods, and, * the `preceding` array carries one entry with the `series`, `code`, and `issue_date` of the originating `GT`. ```json AT Delivery note from global waybill (minimal) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/delivery", "$regime": "PT", "$addons": [ "pt-saft-v1" ], "type": "note", "series": "GR SERIES-A", "issue_date": "2026-04-02", "currency": "EUR", "despatch_date": "2026-04-02", "receive_date": "2026-04-02", "preceding": [ { "series": "GT SERIES-A", "code": "1", "issue_date": "2026-04-01" } ], "supplier": { "name": "Innovatech Lda", "tax_id": { "country": "PT", "code": "770013813" }, "addresses": [ { "street": "Rua das Flores 200 3º Esquerdo", "locality": "Porto", "code": "4050-265", "country": "PT" } ], "registration": { "capital": "100000.00", "office": "Porto" } }, "customer": { "name": "Gusto Unipessoal Lda", "tax_id": { "country": "PT", "code": "514329874" }, "addresses": [ { "street": "Avenida da Liberdade 152 2º Direito", "locality": "Lisboa", "code": "1250-146", "country": "PT" } ] }, "despatcher": { "name": "Innovatech Logistics", "addresses": [ { "street": "Rua da Indústria 45", "locality": "Porto", "code": "4050-300", "country": "PT" } ] }, "receiver": { "name": "Gusto Armazém", "addresses": [ { "street": "Zona Industrial, Lote 23", "locality": "Lisboa", "code": "1300-300", "country": "PT" } ] }, "lines": [ { "quantity": "10", "item": { "name": "Product A", "price": "5.00", "unit": "unit", "ext": { "pt-saft-product-type": "P" } }, "taxes": [ { "cat": "VAT", "rate": "standard" } ] } ], "notes": [ { "text": "Stop delivery from global waybill GT SERIES-A/1" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/delivery", "$regime": "PT", "$addons": [ "pt-saft-v1" ], "type": "note", "series": "GR SERIES-A", "issue_date": "2026-04-02", "currency": "EUR", "preceding": [ { "issue_date": "2026-04-01", "series": "GT SERIES-A", "code": "1" } ], "despatch_date": "2026-04-02", "receive_date": "2026-04-02", "tax": { "ext": { "pt-saft-movement-type": "GR" } }, "supplier": { "name": "Innovatech Lda", "tax_id": { "country": "PT", "code": "770013813" }, "addresses": [ { "street": "Rua das Flores 200 3º Esquerdo", "locality": "Porto", "code": "4050-265", "country": "PT" } ], "registration": { "capital": "100000.00", "office": "Porto" } }, "customer": { "name": "Gusto Unipessoal Lda", "tax_id": { "country": "PT", "code": "514329874" }, "addresses": [ { "street": "Avenida da Liberdade 152 2º Direito", "locality": "Lisboa", "code": "1250-146", "country": "PT" } ] }, "despatcher": { "name": "Innovatech Logistics", "addresses": [ { "street": "Rua da Indústria 45", "locality": "Porto", "code": "4050-300", "country": "PT" } ] }, "receiver": { "name": "Gusto Armazém", "addresses": [ { "street": "Zona Industrial, Lote 23", "locality": "Lisboa", "code": "1300-300", "country": "PT" } ] }, "lines": [ { "i": 1, "quantity": "10", "item": { "name": "Product A", "price": "5.00", "unit": "unit", "ext": { "pt-saft-product-type": "P" } }, "sum": "50.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "23.0%", "ext": { "pt-region": "PT", "pt-saft-tax-rate": "NOR" } } ], "total": "50.00" } ], "totals": { "sum": "50.00", "total": "50.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "pt-region": "PT", "pt-saft-tax-rate": "NOR" }, "base": "50.00", "percent": "23.0%", "amount": "11.50" } ], "amount": "11.50" } ], "sum": "11.50" }, "tax": "11.50", "total_with_tax": "61.50", "payable": "61.50" }, "notes": [ { "text": "Stop delivery from global waybill GT SERIES-A/1" } ] } ``` A return can also be linked back to a global waybill — for example, when surplus goods that were not delivered to any customer come back to the depot at the end of a delivery run. Notice: * as in the standalone return guide, the `return` tag drives the [`pt-saft-movement-type`](https://docs.gobl.org/addons/pt-saft-v1#movement-type) extension to `GD`, * the `preceding` array references the originating `GT`, and, * the `customer` is omitted, since the goods are returning to the issuer's own depot rather than to a specific party. ```json AT Return from global waybill (minimal) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/delivery", "$regime": "PT", "$addons": [ "pt-saft-v1" ], "$tags": ["return"], "type": "note", "series": "GD SERIES-A", "issue_date": "2026-04-03", "currency": "EUR", "preceding": [ { "issue_date": "2026-04-01", "series": "GT SERIES-A", "code": "1" } ], "despatch_date": "2026-04-03", "supplier": { "name": "Innovatech Lda", "tax_id": { "country": "PT", "code": "770013813" }, "addresses": [ { "street": "Rua das Flores 200 3º Esquerdo", "locality": "Porto", "code": "4050-265", "country": "PT" } ], "registration": { "capital": "100000.00", "office": "Porto" } }, "despatcher": { "name": "Innovatech Logistics", "addresses": [ { "street": "Rua da Indústria 45", "locality": "Porto", "code": "4050-300", "country": "PT" } ] }, "receiver": { "name": "Innovatech Depot", "addresses": [ { "street": "Rua da Indústria 45", "locality": "Porto", "code": "4050-300", "country": "PT" } ] }, "lines": [ { "quantity": "2", "item": { "name": "Product A", "price": "5.00", "unit": "unit", "ext": { "pt-saft-product-type": "P" } }, "taxes": [ { "cat": "VAT", "rate": "standard" } ] } ], "notes": [ { "text": "Surplus from global waybill GT SERIES-A/1 returned to depot." } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/delivery", "$regime": "PT", "$addons": [ "pt-saft-v1" ], "$tags": [ "return" ], "type": "note", "series": "GD SERIES-A", "issue_date": "2026-04-03", "currency": "EUR", "preceding": [ { "issue_date": "2026-04-01", "series": "GT SERIES-A", "code": "1" } ], "despatch_date": "2026-04-03", "tax": { "ext": { "pt-saft-movement-type": "GD" } }, "supplier": { "name": "Innovatech Lda", "tax_id": { "country": "PT", "code": "770013813" }, "addresses": [ { "street": "Rua das Flores 200 3º Esquerdo", "locality": "Porto", "code": "4050-265", "country": "PT" } ], "registration": { "capital": "100000.00", "office": "Porto" } }, "despatcher": { "name": "Innovatech Logistics", "addresses": [ { "street": "Rua da Indústria 45", "locality": "Porto", "code": "4050-300", "country": "PT" } ] }, "receiver": { "name": "Innovatech Depot", "addresses": [ { "street": "Rua da Indústria 45", "locality": "Porto", "code": "4050-300", "country": "PT" } ] }, "lines": [ { "i": 1, "quantity": "2", "item": { "name": "Product A", "price": "5.00", "unit": "unit", "ext": { "pt-saft-product-type": "P" } }, "sum": "10.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "23.0%", "ext": { "pt-region": "PT", "pt-saft-tax-rate": "NOR" } } ], "total": "10.00" } ], "totals": { "sum": "10.00", "total": "10.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "pt-region": "PT", "pt-saft-tax-rate": "NOR" }, "base": "10.00", "percent": "23.0%", "amount": "2.30" } ], "amount": "2.30" } ], "sum": "2.30" }, "tax": "2.30", "total_with_tax": "12.30", "payable": "12.30" }, "notes": [ { "text": "Surplus from global waybill GT SERIES-A/1 returned to depot." } ] } ``` In this example, we're issuing a payment receipt from a Portuguese supplier to another Portuguese business. Notice: * the minimal version in the first tab contains only the essential fields required to create the payment document, * the [`pt-saft-v1`](https://docs.gobl.org/addons/pt-saft-v1) addon ensures the document will be validated and normalized using the SAF-T PT v1 rules built into the [GOBL](https://docs.gobl.org) library, * the `supplier` and `series` fields are set to example values; you'll need to replace them with the details of supplier and series registered as per the previous sections. The series must be registered in the Supplier Portal and follow Portuguese naming conventions (see [Series management](/guides/pt-at-supplier#series-management) for details), * this is a single `receipt` payment that bundles **multiple payment methods**: 30,00 EUR in cash plus 31,50 EUR by card, summing to the document total of 61,50 EUR. Each method gets its own [`pt-saft-payment-means`](https://docs.gobl.org/addons/pt-saft-v1#payment-means) extension auto-assigned (`NU` for cash, `CC` for card), * when running `gobl build`, the system automatically assigns the [`pt-saft-payment-type`](https://docs.gobl.org/addons/pt-saft-v1#payment-type) extension to `RG` and the [`pt-saft-source`](https://docs.gobl.org/addons/pt-saft-v1#document-source) extension to `P`, * the built version in the second tab shows the normalized document with all automatically generated fields and extensions properly set, * the payment lines reference the original invoice being paid, though a single receipt can reference multiple invoices if needed, * this receipt could represent either a full or partial payment of the referenced invoice; it simply records the amounts and taxes being paid, so the total may or may not cover the full invoice amount, and, * there are no calculations in the minimal version; all normalizations will be made automatically when uploading. ```json AT Payment (minimal) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/payment", "$regime": "PT", "$addons": [ "pt-saft-v1" ], "type": "receipt", "series": "RG SERIES-A", "issue_date": "2024-12-23", "currency": "EUR", "supplier": { "name": "Innovatech Lda", "tax_id": { "country": "PT", "code": "770013813" }, "addresses": [ { "street": "Rua das Flores 200 3º Esquerdo", "locality": "Porto", "code": "4050-265", "country": "PT" } ], "registration": { "capital": "100000.00", "office": "Porto" } }, "customer": { "name": "Gusto Unipessoal Lda", "tax_id": { "country": "PT", "code": "514329874" }, "addresses": [ { "street": "Avenida da Liberdade 152 2º Direito", "locality": "Lisboa", "code": "1250-146", "country": "PT" } ], "emails": [ { "addr": "gusto@example.com" } ], "websites": [ { "url": "https://gusto.example.com" } ], "telephones": [ { "num": "+351912345678" } ] }, "lines": [ { "document": { "issue_date": "2024-12-23", "series": "FT SERIES-A", "code": "1", "description": "Invoice 1" }, "amount": "61.50", "tax": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "pt-region": "PT", "pt-saft-tax-rate": "NOR" }, "base": "50.00", "percent": "23.0%", "amount": "11.50" } ], "amount": "11.50" } ], "sum": "11.50" } } ], "methods": [ { "key": "cash", "description": "Cash portion", "amount": "30.00" }, { "key": "card", "description": "Card portion", "amount": "31.50" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/payment", "$regime": "PT", "$addons": [ "pt-saft-v1" ], "type": "receipt", "series": "RG SERIES-A", "issue_date": "2024-12-23", "currency": "EUR", "ext": { "pt-saft-payment-type": "RG", "pt-saft-source": "P" }, "supplier": { "name": "Innovatech Lda", "tax_id": { "country": "PT", "code": "770013813" }, "addresses": [ { "street": "Rua das Flores 200 3º Esquerdo", "locality": "Porto", "code": "4050-265", "country": "PT" } ], "registration": { "capital": "100000.00", "office": "Porto" } }, "customer": { "name": "Gusto Unipessoal Lda", "tax_id": { "country": "PT", "code": "514329874" }, "addresses": [ { "street": "Avenida da Liberdade 152 2º Direito", "locality": "Lisboa", "code": "1250-146", "country": "PT" } ], "emails": [ { "addr": "gusto@example.com" } ], "websites": [ { "url": "https://gusto.example.com" } ], "telephones": [ { "num": "+351912345678" } ] }, "lines": [ { "i": 1, "document": { "issue_date": "2024-12-23", "series": "FT SERIES-A", "code": "1", "description": "Invoice 1" }, "amount": "61.50", "tax": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "pt-region": "PT", "pt-saft-tax-rate": "NOR" }, "base": "50.00", "percent": "23.0%", "amount": "11.50" } ], "amount": "11.50" } ], "sum": "11.50" } } ], "methods": [ { "key": "cash", "description": "Cash portion", "amount": "30.00", "ext": { "pt-saft-payment-means": "NU" } }, { "key": "card", "description": "Card portion", "amount": "31.50", "ext": { "pt-saft-payment-means": "CC" } } ], "total": "61.50" } ``` In this example, we're issuing a payment receipt for a supplier under the **Cash VAT scheme** (*regime de IVA de Caixa*). For these suppliers, the receipt is the document that actually triggers the VAT becoming due, so the AT distinguishes it from an ordinary receipt. Notice: * the document carries the `cash-vat` tag (`$tags: ["cash-vat"]`), exactly as the Cash VAT invoice does, * on a `receipt`, that tag drives the [`pt-saft-payment-type`](https://docs.gobl.org/addons/pt-saft-v1#payment-type) extension to `RC` (*Recibo no âmbito do regime de IVA de Caixa*) instead of the default `RG` (*Outro Recibo*) you'd get on the ordinary AT payment receipt above, * the `series` follows the `RC ` prefix convention and must be registered through the Supplier Portal, * the payment line references the original invoice being settled, carrying its VAT breakdown so the AT can match the now-due tax to the issued invoice, and, * as with any receipt, the [`pt-saft-payment-means`](https://docs.gobl.org/addons/pt-saft-v1#payment-means) extension is auto-assigned per method (`TB` for the bank transfer) and the [`pt-saft-source`](https://docs.gobl.org/addons/pt-saft-v1#document-source) extension is set to `P`. ```json AT Cash VAT receipt (minimal) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/payment", "$regime": "PT", "$addons": [ "pt-saft-v1" ], "$tags": [ "cash-vat" ], "type": "receipt", "series": "RC SERIES-A", "issue_date": "2024-12-23", "currency": "EUR", "supplier": { "name": "Innovatech Lda", "tax_id": { "country": "PT", "code": "770013813" }, "addresses": [ { "street": "Rua das Flores 200 3º Esquerdo", "locality": "Porto", "code": "4050-265", "country": "PT" } ], "registration": { "capital": "100000.00", "office": "Porto" } }, "customer": { "name": "Gusto Unipessoal Lda", "tax_id": { "country": "PT", "code": "514329874" }, "addresses": [ { "street": "Avenida da Liberdade 152 2º Direito", "locality": "Lisboa", "code": "1250-146", "country": "PT" } ] }, "lines": [ { "document": { "issue_date": "2024-12-23", "series": "FT SERIES-A", "code": "1", "description": "Invoice 1" }, "amount": "61.50", "tax": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "pt-region": "PT", "pt-saft-tax-rate": "NOR" }, "base": "50.00", "percent": "23.0%", "amount": "11.50" } ], "amount": "11.50" } ], "sum": "11.50" } } ], "methods": [ { "key": "credit-transfer", "description": "Bank transfer", "amount": "61.50" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/payment", "$regime": "PT", "$addons": [ "pt-saft-v1" ], "$tags": [ "cash-vat" ], "type": "receipt", "series": "RC SERIES-A", "issue_date": "2024-12-23", "currency": "EUR", "ext": { "pt-saft-payment-type": "RC", "pt-saft-source": "P" }, "supplier": { "name": "Innovatech Lda", "tax_id": { "country": "PT", "code": "770013813" }, "addresses": [ { "street": "Rua das Flores 200 3º Esquerdo", "locality": "Porto", "code": "4050-265", "country": "PT" } ], "registration": { "capital": "100000.00", "office": "Porto" } }, "customer": { "name": "Gusto Unipessoal Lda", "tax_id": { "country": "PT", "code": "514329874" }, "addresses": [ { "street": "Avenida da Liberdade 152 2º Direito", "locality": "Lisboa", "code": "1250-146", "country": "PT" } ] }, "lines": [ { "i": 1, "document": { "issue_date": "2024-12-23", "series": "FT SERIES-A", "code": "1", "description": "Invoice 1" }, "amount": "61.50", "tax": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "pt-region": "PT", "pt-saft-tax-rate": "NOR" }, "base": "50.00", "percent": "23.0%", "amount": "11.50" } ], "amount": "11.50" } ], "sum": "11.50" } } ], "methods": [ { "key": "credit-transfer", "description": "Bank transfer", "amount": "61.50", "ext": { "pt-saft-payment-means": "TB" } } ], "total": "61.50" } ``` ```json AT Invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "PT", "$addons": [ "pt-saft-v1" ], "series": "FT SERIES-A", "issue_date": "2024-12-23", "supplier": { "name": "Innovatech Lda", "tax_id": { "country": "PT", "code": "770013813" }, "registration": { "capital": "100000.00", "office": "Porto" } }, "customer": { "name": "Gusto Unipessoal Lda", "tax_id": { "country": "PT", "code": "514329874" }, "addresses": [ { "street": "Avenida da Liberdade 152 2º Direito", "locality": "Lisboa", "code": "1250-146", "country": "PT" } ], "telephones": [ { "num": "+351912345678" } ] }, "lines": [ { "quantity": "1", "item": { "name": "Development services", "price": "50.00", "unit": "item" }, "taxes": [ { "cat": "VAT", "rate": "general" } ] } ], "payment": { "terms": { "key": "advanced" }, "advances": [ { "date": "2024-12-18", "description": "Transferência bancária", "amount": "50.00" } ] } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "PT", "$addons": [ "pt-saft-v1" ], "type": "standard", "series": "FT SERIES-A", "issue_date": "2024-12-23", "value_date": "2024-12-23", "currency": "EUR", "tax": { "ext": { "pt-saft-invoice-type": "FT", "pt-saft-source": "P" } }, "supplier": { "name": "Innovatech Lda", "tax_id": { "country": "PT", "code": "770013813" }, "registration": { "capital": "100000.00", "office": "Porto" } }, "customer": { "name": "Gusto Unipessoal Lda", "tax_id": { "country": "PT", "code": "514329874" }, "addresses": [ { "street": "Avenida da Liberdade 152 2º Direito", "locality": "Lisboa", "code": "1250-146", "country": "PT" } ], "telephones": [ { "num": "+351912345678" } ] }, "lines": [ { "i": 1, "quantity": "1", "item": { "name": "Development services", "price": "50.00", "unit": "item", "ext": { "pt-saft-product-type": "S" } }, "sum": "50.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "23.0%", "ext": { "pt-region": "PT", "pt-saft-tax-rate": "NOR" } } ], "total": "50.00" } ], "payment": { "terms": { "key": "advanced" }, "advances": [ { "date": "2024-12-18", "description": "Transferência bancária", "amount": "50.00" } ] }, "totals": { "sum": "50.00", "total": "50.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "pt-region": "PT", "pt-saft-tax-rate": "NOR" }, "base": "50.00", "percent": "23.0%", "amount": "11.50" } ], "amount": "11.50" } ], "sum": "11.50" }, "tax": "11.50", "total_with_tax": "61.50", "payable": "61.50", "advance": "50.00", "due": "11.50" } } ``` ```json AT Credit Note theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "PT", "$addons": [ "pt-saft-v1" ], "type": "credit-note", "series": "NC SERIES-A", "issue_date": "2024-12-23", "preceding": [ { "type": "standard", "issue_date": "2024-08-03", "series": "FT SERIES-A", "code": "1", "reason": "Reimbursement" } ], "supplier": { "name": "Innovatech Lda", "tax_id": { "country": "PT", "code": "770013813" }, "addresses": [ { "street": "Rua das Flores 200 3º Esquerdo", "locality": "Porto", "code": "4050-265", "country": "PT" } ], "registration": { "capital": "100000.00", "office": "Porto" } }, "customer": { "name": "Gusto Unipessoal Lda", "tax_id": { "country": "PT", "code": "514329874" }, "addresses": [ { "street": "Avenida da Liberdade 152 2º Direito", "locality": "Lisboa", "code": "1250-146", "country": "PT" } ], "emails": [ { "addr": "gusto@example.com" } ], "websites": [ { "url": "https://gusto.example.com" } ], "telephones": [ { "num": "+351912345678" } ] }, "lines": [ { "quantity": "1", "item": { "name": "Development services", "price": "50.00", "unit": "item" }, "taxes": [ { "cat": "VAT", "rate": "general" } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "PT", "$addons": [ "pt-saft-v1" ], "type": "credit-note", "series": "NC SERIES-A", "issue_date": "2024-12-23", "value_date": "2024-12-23", "currency": "EUR", "preceding": [ { "type": "standard", "issue_date": "2024-08-03", "series": "FT SERIES-A", "code": "1", "reason": "Reimbursement" } ], "tax": { "ext": { "pt-saft-invoice-type": "NC", "pt-saft-source": "P" } }, "supplier": { "name": "Innovatech Lda", "tax_id": { "country": "PT", "code": "770013813" }, "addresses": [ { "street": "Rua das Flores 200 3º Esquerdo", "locality": "Porto", "code": "4050-265", "country": "PT" } ], "registration": { "capital": "100000.00", "office": "Porto" } }, "customer": { "name": "Gusto Unipessoal Lda", "tax_id": { "country": "PT", "code": "514329874" }, "addresses": [ { "street": "Avenida da Liberdade 152 2º Direito", "locality": "Lisboa", "code": "1250-146", "country": "PT" } ], "emails": [ { "addr": "gusto@example.com" } ], "websites": [ { "url": "https://gusto.example.com" } ], "telephones": [ { "num": "+351912345678" } ] }, "lines": [ { "i": 1, "quantity": "1", "item": { "name": "Development services", "price": "50.00", "unit": "item", "ext": { "pt-saft-product-type": "S" } }, "sum": "50.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "23.0%", "ext": { "pt-region": "PT", "pt-saft-tax-rate": "NOR" } } ], "total": "50.00" } ], "totals": { "sum": "50.00", "total": "50.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "pt-region": "PT", "pt-saft-tax-rate": "NOR" }, "base": "50.00", "percent": "23.0%", "amount": "11.50" } ], "amount": "11.50" } ], "sum": "11.50" }, "tax": "11.50", "total_with_tax": "61.50", "payable": "61.50" } } ``` ```json AT Order theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/order", "$regime": "PT", "$addons": [ "pt-saft-v1" ], "series": "NE SERIES-A", "issue_date": "2024-12-23", "supplier": { "name": "Innovatech Lda", "tax_id": { "country": "PT", "code": "770013813" }, "addresses": [ { "street": "Rua das Flores 200 3º Esquerdo", "locality": "Porto", "code": "4050-265", "country": "PT" } ], "registration": { "capital": "100000.00", "office": "Porto" } }, "customer": { "name": "Gusto Unipessoal Lda", "tax_id": { "country": "PT", "code": "514329874" }, "addresses": [ { "street": "Avenida da Liberdade 152 2º Direito", "locality": "Lisboa", "code": "1250-146", "country": "PT" } ], "emails": [ { "addr": "gusto@example.com" } ], "websites": [ { "url": "https://gusto.example.com" } ], "telephones": [ { "num": "+351912345678" } ] }, "lines": [ { "quantity": "1", "order": "PO-2024-001", "item": { "name": "Development services", "price": "50.00" }, "discounts": [ { "percent": "15.0%" } ], "taxes": [ { "cat": "VAT", "rate": "general" } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/order", "$regime": "PT", "$addons": [ "pt-saft-v1" ], "type": "purchase", "series": "NE SERIES-A", "issue_date": "2024-12-23", "value_date": "2024-12-23", "currency": "EUR", "tax": { "ext": { "pt-saft-work-type": "NE" } }, "supplier": { "name": "Innovatech Lda", "tax_id": { "country": "PT", "code": "770013813" }, "addresses": [ { "street": "Rua das Flores 200 3º Esquerdo", "locality": "Porto", "code": "4050-265", "country": "PT" } ], "registration": { "capital": "100000.00", "office": "Porto" } }, "customer": { "name": "Gusto Unipessoal Lda", "tax_id": { "country": "PT", "code": "514329874" }, "addresses": [ { "street": "Avenida da Liberdade 152 2º Direito", "locality": "Lisboa", "code": "1250-146", "country": "PT" } ], "emails": [ { "addr": "gusto@example.com" } ], "websites": [ { "url": "https://gusto.example.com" } ], "telephones": [ { "num": "+351912345678" } ] }, "lines": [ { "i": 1, "quantity": "1", "order": "PO-2024-001", "item": { "name": "Development services", "price": "50.00", "unit": "one", "ext": { "pt-saft-product-type": "S" } }, "sum": "50.00", "discounts": [ { "percent": "15.0%", "amount": "7.50" } ], "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "23.0%", "ext": { "pt-region": "PT", "pt-saft-tax-rate": "NOR" } } ], "total": "42.50" } ], "totals": { "sum": "42.50", "total": "42.50", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "pt-region": "PT", "pt-saft-tax-rate": "NOR" }, "base": "42.50", "percent": "23.0%", "amount": "9.78" } ], "amount": "9.78" } ], "sum": "9.78" }, "tax": "9.78", "total_with_tax": "52.28", "payable": "52.28" } } ``` ```json AT Withholding Invoice (minimal) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "PT", "$addons": [ "pt-saft-v1" ], "type": "standard", "series": "FT SERIES-A", "issue_date": "2024-08-03", "currency": "EUR", "tax": { "notes": [ { "cat": "IRS", "text": "Art. 101.º CIRS" } ] }, "supplier": { "name": "João Silva, Trabalhador Independente", "tax_id": { "country": "PT", "code": "545259045" }, "addresses": [ { "street": "Rua das Flores", "locality": "Lisboa", "code": "1000-000", "country": "PT" } ], "emails": [ { "addr": "joao.silva@example.com" } ] }, "customer": { "name": "Empresa Cliente, Lda.", "tax_id": { "country": "PT", "code": "514329874" }, "addresses": [ { "street": "Avenida da Liberdade 152 2º Direito", "locality": "Lisboa", "code": "1250-146", "country": "PT" } ] }, "lines": [ { "quantity": "1", "item": { "name": "Serviços de consultoria", "price": "1000.00", "unit": "h" }, "taxes": [ { "cat": "VAT", "rate": "standard" }, { "cat": "IRS", "percent": "25%" } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "PT", "$addons": [ "pt-saft-v1" ], "type": "standard", "series": "FT SERIES-A", "issue_date": "2024-08-03", "value_date": "2024-08-03", "currency": "EUR", "tax": { "ext": { "pt-saft-invoice-type": "FT", "pt-saft-source": "P" }, "notes": [ { "cat": "IRS", "text": "Art. 101.º CIRS" } ] }, "supplier": { "name": "João Silva, Trabalhador Independente", "tax_id": { "country": "PT", "code": "545259045" }, "addresses": [ { "street": "Rua das Flores", "locality": "Lisboa", "code": "1000-000", "country": "PT" } ], "emails": [ { "addr": "joao.silva@example.com" } ] }, "customer": { "name": "Empresa Cliente, Lda.", "tax_id": { "country": "PT", "code": "514329874" }, "addresses": [ { "street": "Avenida da Liberdade 152 2º Direito", "locality": "Lisboa", "code": "1250-146", "country": "PT" } ] }, "lines": [ { "i": 1, "quantity": "1", "item": { "name": "Serviços de consultoria", "price": "1000.00", "unit": "h", "ext": { "pt-saft-product-type": "S" } }, "sum": "1000.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "23.0%", "ext": { "pt-region": "PT", "pt-saft-tax-rate": "NOR" } }, { "cat": "IRS", "percent": "25%" } ], "total": "1000.00" } ], "totals": { "sum": "1000.00", "total": "1000.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "pt-region": "PT", "pt-saft-tax-rate": "NOR" }, "base": "1000.00", "percent": "23.0%", "amount": "230.00" } ], "amount": "230.00" }, { "code": "IRS", "retained": true, "rates": [ { "base": "1000.00", "percent": "25%", "amount": "250.00" } ], "amount": "250.00" } ], "sum": "230.00", "retained": "250.00" }, "tax": "230.00", "total_with_tax": "1230.00", "retained_tax": "250.00", "payable": "980.00" } } ``` A Portuguese company with its NIF and the commercial registration details required on invoices. ```json Portugal AT supplier example theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "Innovatech Lda", "tax_id": { "country": "PT", "code": "504614240" }, "addresses": [ { "num": "156", "street": "Avenida da República", "locality": "Lisboa", "code": "1050-045", "country": "PT" } ], "emails": [ { "addr": "maria@example.com" } ], "registration": { "capital": "150000.00", "office": "CRC Lisboa", "other": "sob NIF 770013813" } } ``` A Portuguese business customer identified by NIF with a full address. ```json Portugal customer example theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "Cliente Exemplo Lda", "tax_id": { "country": "PT", "code": "502757191" }, "addresses": [ { "num": "23", "street": "Rua Augusta", "locality": "Lisboa", "code": "1100-053", "country": "PT" } ], "emails": [ { "addr": "compras@clienteexemplo.pt" } ] } ``` Copy and paste these documents into the [GOBL builder](https://build.gobl.org) in order to preview and verify them.
*** | | | | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Compliance | [Invoicing compliance in Portugal](/compliance/portugal)
[Compliance timeline](/timelines/portugal) | | Apps | [AT Portugal](/apps/at-portugal) | | Guides | [Supplier registration](/guides/pt-at-supplier)
[Issuing invoices](/guides/pt-at) | | FAQ | [Portugal FAQ](/faq/portugal) | | GOBL | [Portugal Tax Regime](https://docs.gobl.org/regimes/pt)
[Portugal SAF-T addon](https://docs.gobl.org/addons/pt-saft-v1) |
Ask and answer questions about AT Portugal App → # Chargebee Source: https://docs.invopop.com/apps/chargebee Import and process invoices and credit notes from Chargebee
View implementation guide ›
| | | | --------- | ------------------------------ | | Developer | [Invopop](https://invopop.com) | | Category | Integrations |
[Chargebee](https://www.chargebee.com/) is a subscription management and billing platform designed for businesses that rely on recurring revenue. It automates tasks like subscription billing, invoicing, payment processing, and revenue recognition. Invopop's Chargebee app lets you issue locally compliant electronic invoices and credit notes from Chargebee. The app subscribes to new incoming invoices and credit notes from Chargebee. When a new document is received, it'll be converted into GOBL and stored in your Invopop workspace. Once an invoice or credit note is stored, the app will create a job on the configured workflow. Any updates and, importantly, error messages will be posted to Chargebee automatically, in the comment section of the invoice or credit note. We also recommend configuring workflows to send notifications via Slack or email to ensure any issues can be addressed quickly. **Key features** * **Automatic import:** New invoices and credit notes from Chargebee are automatically imported into Invopop and converted to GOBL format. * **Workflow automation:** Process imported invoices through your configured workflows to generate compliant invoices, PDFs, and submit to tax authorities. * **Real-time processing:** Track invoice status directly in Chargebee with automatic status updates posted as comments. * **Multi-format support:** Convert Chargebee invoices to any e-invoice format supported by Invopop, including country-specific formats like ZUGFeRD (Germany), XRechnung (Germany), and more. * **Custom data mapping:** Support for custom fields and metadata to map country-specific tax requirements and extensions. * **Error handling:** Automatic error reporting back to Chargebee with detailed messages in invoice comments. Make sure to check out our [Chargebee Guide](/guides/chargebee) for instructions on how to connect the app, configure workflows, and set up webhooks.
The following workflow actions will be available once you install and enable this app: Import invoice and credit note data from Chargebee into Invopop. Update Chargebee with processing status and error messages. The following workflows are available to make your integration easier. Use them as templates to build upon. This workflow syncs with Chargebee and generates a basic PDF. ```json Example Chargebee PDF invoice workflow theme={"system"} { "name": "Chargebee PDF invoice", "description": "Sync from Chargebee and generate a PDF", "schema": "bill/invoice", "steps": [ { "id": "1b23a850-ff46-11ef-bc8b-49a3f98ea471", "name": "Import document from Chargebee", "provider": "chargebee.import" }, { "id": "c9d569f0-ab1e-11ef-a0aa-f554af0a2b6c", "name": "Set state", "config": { "state": "processing" }, "summary": "Set state to `processing`{.state .processing}", "provider": "silo.state" }, { "id": "c7a347b0-ab1e-11ef-a0aa-f554af0a2b6c", "name": "Sign envelope", "provider": "silo.close" }, { "id": "d1f2e5e0-ab1e-11ef-a0aa-f554af0a2b6c", "name": "Generate PDF", "config": { "logo_height": 40, "locale": "en", "date_format": "%Y-%m-%d" }, "summary": "English · A4", "provider": "pdf" }, { "id": "6277f270-abd0-11ef-a013-91c68ca9f44b", "name": "Set state", "config": { "state": "sent" }, "summary": "Set state to `sent`{.state .sent}", "provider": "silo.state" }, { "id": "02487016-0959-475c-9bc4-aa237313fefa", "name": "Update Chargebee", "provider": "chargebee" } ], "rescue": [ { "id": "5504a610-abd0-11ef-a013-91c68ca9f44b", "name": "Set state", "config": { "state": "error" }, "summary": "Set state to `error`{.state .error}", "provider": "silo.state" }, { "id": "d8166690-ab1e-11ef-a0aa-f554af0a2b6c", "name": "Update Chargebee", "provider": "chargebee" } ] } ``` [Add to my workspace →](https://console.invopop.com/redirect/workflows/new?template=chargebee-cb-invoice) This workflow syncs with Chargebee and generates a ZUGFeRD XML and PDF for Germany. For a full walkthrough including required apps, email delivery setup, and custom fields, see the [Chargebee Germany guide](/guides/cb-germany). ```json Example Chargebee ZUGFeRD workflow theme={"system"} { "name": "Chargebee ZUGFeRD invoice", "description": "Sync from Chargebee and issue a ZUGFeRD invoice", "schema": "bill/invoice", "steps": [ { "id": "ff581030-1943-11f0-b031-c71066181289", "name": "Import document from Chargebee", "provider": "chargebee.import" }, { "id": "bd7eb640-abd0-11ef-a013-91c68ca9f44b", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "b913e860-1d43-11f1-a00f-9bd9990c5dfa", "name": "Download PDF from Chargebee", "provider": "chargebee.pdf.download" }, { "id": "18910b60-6624-11f0-9087-c716f49f1585", "name": "Modify silo entry", "provider": "silo.modify", "summary": "Add `de-zugferd-v2` addon", "config": { "addons": [ "de-zugferd-v2" ], "sign": false } }, { "id": "c37c3860-abd0-11ef-a013-91c68ca9f44b", "name": "Sign envelope", "provider": "silo.close" }, { "id": "3548d720-6623-11f0-b3db-e7255a5da07c", "name": "Generate CII document", "provider": "cii.generate", "summary": "ZUGFeRD v2", "config": { "attach_invoice_pdf": false, "doc_type": "zugferd-v2", "validate_cii": true } }, { "id": "8e665990-81a3-11f0-82cb-9160968ac068", "name": "Embed FacturX/ZUGFeRD", "provider": "cii.pdf.embed" }, { "id": "c6192a60-abd0-11ef-a013-91c68ca9f44b", "name": "Set state", "provider": "silo.state", "summary": "Set state to `sent`{.state .sent}", "config": { "state": "sent" } }, { "id": "553f8c03-c0ff-4de5-9a66-33685b8f9c65", "name": "Update Chargebee", "provider": "chargebee" } ], "rescue": [ { "id": "c94982c0-abd0-11ef-a013-91c68ca9f44b", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } }, { "id": "c35d34c0-b7af-11ef-86a5-99a247862412", "name": "Update Chargebee", "provider": "chargebee" } ] } ``` [Add to my workspace →](https://console.invopop.com/redirect/workflows/new?template=chargebee-cb-zugferd)
*** Ask and answer questions about Chargebee App → # Chorus Pro France Source: https://docs.invopop.com/apps/choruspro-france Submit B2G invoices to the French Chorus Pro system.
Supplier registration guide › Issuing guide ›
| | | | --------- | ------------------------------ | | Developer | [Invopop](https://invopop.com) | | Category | Government | | Scope | B2G | | Country | [France](/compliance/france) |
Chorus Pro is a mandatory service provided by the French government for invoicing French public institutions. The platform allows businesses to upload invoices in multiple e-invoicing formats and track them throughout the French public administration process. All invoices to French public sector entities must be submitted through Chorus Pro. The platform supports various e-invoicing formats including [Cross Industry Invoice (CII)](https://unece.org/trade/uncefact/e-invoice), and implements the [European Norm 16931 (EN16931)](https://ec.europa.eu/digital-building-blocks/sites/display/DIGITAL/European+Standard+and+Specifications) European standard for electronic invoicing with additional French-specific requirements. **Key features** * **Workflow automation:** Provides automated workflows for supplier registration and invoice submission to French public institutions through Chorus Pro. * **CII format generation:** Using the UN/CEFACT CII format with Chorus Pro V1 extensions ensures compliance with French B2G invoicing requirements. * **EN16931 compliance:** Implements the European Norm 16931 standard with French-specific extensions including SIRET number validation and service codes for government departments. * **Supplier registration:** Automated supplier registration workflow that generates unique registration links for suppliers to complete Chorus Pro authentication. * **Invoice submission:** Direct submission of invoices to the Chorus Pro platform with CII XML generation and validation. * **Invoice tracking:** Track invoice status using invoice identifiers (series plus code) in the Chorus Pro portal. * **Invoice modification:** Supports modification and resubmission of invoices until they are accepted by the receiving French public institution. Check out the [Supplier registration guide](/guides/fr-chorus-pro-supplier) for onboarding suppliers, or the [Issuing invoices guide](/guides/fr-chorus-pro) for submitting invoices to French public institutions. ## FAQ Invoicing questions Two channels depending on the recipient: B2G uses Chorus Pro (CII format); B2B from September 2026 uses the Plateforme Agréée model (UBL, CII, or Factur-X via Peppol). Invopop is an approved PA — install the France PA app for B2B and the Chorus Pro app for B2G. In Factur-X PDFs, the XML file is embedded within the PDF itself. To extract and view it, use the `Attachments` section in Adobe Acrobat Reader, or a tool like the [SysTools PDF Extractor](https://www.systoolsgroup.com/pdf/extractor/). Chorus Pro primarily supports CII format based on EN16931. Invopop currently focuses on CII with plans to add additional formats in the future. French businesses need a SIRET number. Foreign businesses can use their local tax identifier, but should verify acceptance with the receiving French institution. Yes, you can modify and resubmit invoices until the receiving institution accepts them. Once accepted, invoices become locked and cannot be modified. Use your GOBL invoice series and code combined as the invoice identifier in the Chorus Pro portal to locate your submitted invoices. Chorus Pro has specific file size and format requirements. Invopop handles these automatically when generating CII XML files from your GOBL invoices. The recipient's SIRET (or equivalent identifier) plus a Chorus Pro service code where applicable. Invopop generates EN 16931 CII XML by default — UBL is also accepted by Chorus Pro. In countries where Peppol is the standard but not mandatory, you may still need to issue an e-invoice when the recipient isn't on the network. Both parties can agree on an alternative transfer method, but the invoice must still be EN16931 compliant. Recommended approach: * Set up a separate workflow that generates the XML without the send-Peppol-document step * Or reuse your existing workflow without the customer Peppol ID — the send step is automatically skipped * Fetch the generated XML and deliver it through the agreed channel, typically email B2C invoices typically lack the structured customer information required for Peppol delivery, and most consumers don't have inboxes. Use a conditional workflow: 1. Add an **If/Else** step that checks for a customer inbox using `count(customer.inboxes, true) > 0`. 2. On the `false` branch, generate a PDF and email it to the customer, then stop the flow. This routes B2B invoices through Peppol while keeping a smooth path for consumers. If a job fails with `KO` and `receiver not found in the peppol network`, treat it like an invalid email address — the recipient simply isn't reachable on Peppol. Add the **Lookup Participant ID** step (ideally in a separate validation workflow run against customer data) so you catch missing IDs before generating the invoice. No. The regime is automatically derived from the supplier's settings, which is the recommended approach for Peppol — leave it unset on the document. See the [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) addon for the field and validation rules Peppol BIS Billing 3.0 builds on, and the [Peppol app reference](/apps/peppol) for supported document types and Participant ID schemes. Registering supplier questions For B2B PA flows: register the supplier via the France PA Register Party workflow (publishes the SIREN to the Annuaire and Peppol). For Chorus Pro: register the supplier with their SIRET on Chorus Pro's portal and link credentials in the Chorus Pro app. France PA does not require supplier-side certificates — Peppol uses Invopop's AP cert. Chorus Pro uses an OAuth token bound to the supplier's account; the token is encrypted at rest in Invopop. Ensure the supplier has a valid Chorus Pro account and provided correct credentials. Contact support if registration workflow issues persist. OAuth 2.0 client credentials issued by Chorus Pro after registration. Invopop stores the token encrypted; suppliers can revoke access at any time through Chorus Pro's portal. Upload the company as a party (Console → Parties → Suppliers → + New Supplier, or via the Create an Entry API) with name, tax\_id, address, and email. Then run it through the party registration workflow — the contact will receive a registration wizard link to provide proof of ownership. Once approved, the party is registered on the Peppol network (SMP+SML+Peppol visibility by default with the `ubl-invoice` doc group) and ready to receive invoices. A supplier with that Participant ID already exists in your workspace. Either reuse the existing party or, if it really is a new entity, check whether it should be registered under an alternative scheme (for example Belgium's `9925` VAT scheme rather than the default `0208`). Register them through different silo entries, even though they represent the same legal party. The supplier must upload proof of ownership for each inbox. Unique identifiers for entities on the Peppol network, made up of two parts: * **Scheme** — identifies the type of identifier (e.g. `9920` for Spanish VAT, `0208` for Belgian KBO/BCE) * **Code** — the actual identification number Participant IDs are usually based on VAT numbers or local business identifiers, and Invopop can derive them automatically from a Tax ID. Some countries support multiple schemes — Belgium, for example, defaults to `0208` but some entities are only registered under `9925` (VAT). If you hit a "receiver not found" error, the recipient may be registered under an alternative scheme. Peppol Party visibility determines what you can send and receive: * `smp` — SMP only, for testing * `smp+sml` — SMP and SML, useful when you only want to send * `smp+sml+peppol` — SMP, SML, and the Peppol Directory, recommended for both sending and receiving (and for being discoverable in the Directory) In general, use the highest visibility available. Receiving questions Register the recipient with Invopop as their Plateforme Agréée. Inbound documents (UBL, CII, Factur-X) are converted to GOBL and stored in the Expenses folder. Chorus Pro inbound flow is separate and routes via the Chorus Pro app. UBL via [`gobl.peppol`](https://github.com/invopop/gobl.peppol); CII and Factur-X via [`gobl.cii`](https://github.com/invopop/gobl.cii). The original structured XML (or PDF/A-3 with embedded XML) is preserved as a silo entry attachment. Register the recipient as a Peppol participant with Invopop as their Access Point. Incoming documents are routed through your configured Import workflow, which converts the UBL or CII payload to GOBL and stores the entry in the Expenses folder. Yes. Either format can be removed based on your needs. The default template includes both for comprehensiveness, but if you're certain you'll only receive invoices in one syntax, dropping the other simplifies the workflow and reduces the apps you need to activate. The Import workflow's UBL and CII parser steps map the inbound XML into a GOBL invoice. From there you can route it to webhooks, Google Drive, accounting integrations, or any other destination — the GOBL representation is the single source of truth for downstream processing. Reporting questions For TVA, file via DGFiP's portal — Invopop does not generate CA3 yet. For e-reporting (Flow 10): submit via your Plateforme Agréée — Invopop's e-reporting workflow batches transactions per period and submits to the PPF. TVA: DGFiP's EDI-TVA XML schema. E-reporting Flow 10: a structured JSON/XML payload defined by the PPF specification (currently in beta). Invopop emits Flow 10 via the upcoming `fr-ctc-flow10-v1` GOBL addon. More answers in our [France FAQ](/faq/france) section
3
Creates a flux with the generated file and sends it to Chorus Pro.
Register a supplier in Invopop to enable e-invoicing in Chorus Pro. A supplier must then provide a Technical Account. This step will wait until the user completes the form.
```json Example Chorus Pro issue invoice workflow theme={"system"} { "name": "Chorus Pro issue invoice", "description": "Issue a B2G invoice through Chorus Pro using CII", "schema": "bill/invoice", "steps": [ { "id": "241c1b60-4cec-11f0-bcdc-61b84b5eeae8", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "0dba81f0-4ba1-11f0-a0a5-bbd7c9d8117a", "name": "Sign envelope", "provider": "silo.close" }, { "id": "3d048690-4ba1-11f0-a0a5-bbd7c9d8117a", "name": "Generate CII document", "provider": "cii.generate", "summary": "Chorus Pro v1", "config": { "doc_type": "choruspro-v1" } }, { "id": "2cd30490-4ba1-11f0-a0a5-bbd7c9d8117a", "name": "Send invoice to Chorus Pro", "provider": "chorus-pro.send" }, { "id": "282dac00-4cec-11f0-bcdc-61b84b5eeae8", "name": "Set state", "provider": "silo.state", "summary": "Set state to `sent`{.state .sent}", "config": { "state": "sent" } } ], "rescue": [ { "id": "2b9c6cf0-4cec-11f0-bcdc-61b84b5eeae8", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` ```json Example Chorus Pro register supplier workflow theme={"system"} { "name": "Chorus Pro register supplier", "description": "Register a supplier with Chorus Pro", "schema": "org/party", "steps": [ { "id": "9ed27c40-4ced-11f0-bcdc-61b84b5eeae8", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "b8d3dc10-4ba3-11f0-a0a5-bbd7c9d8117a", "name": "Register supplier with Chorus Pro", "provider": "chorus-pro.register" }, { "id": "a3d43940-4ced-11f0-bcdc-61b84b5eeae8", "name": "Set state", "provider": "silo.state", "summary": "Set state to `registered`{.state .registered}", "config": { "state": "registered" } } ], "rescue": [ { "id": "a6c4f090-4ced-11f0-bcdc-61b84b5eeae8", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` In this example, we're issuing a Chorus Pro invoice for business-to-government transactions in France. Chorus Pro is the mandatory platform for submitting invoices to French public sector entities. Notice: * the minimal version in the first tab contains only the essential fields required to create the B2G invoice, * the [`fr-choruspro-v1`](https://docs.gobl.org/addons/fr-choruspro-v1) addon ensures the document will be validated using the Chorus Pro rules built into the [GOBL](https://docs.gobl.org) library, * the customer must be a French public sector entity with a valid SIRET number, * specific Chorus Pro extensions and identifiers are required for public procurement (such as service codes and commitment numbers), * there are no totals or calculations in the minimal version; all these will be calculated automatically when running `gobl build`, * the built version in the second tab shows the normalized document with calculated totals, line item sums, TVA breakdowns, and automatically generated fields, * the invoice will be formatted according to Chorus Pro requirements and submitted through the platform, and, * all invoices to French public entities must be submitted through Chorus Pro. ```json Chorus Pro B2G Invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "FR", "$addons": [ "eu-en16931-v2017", "fr-choruspro-v1" ], "uuid": "019783e7-33b1-7000-a1a5-6139e214b447", "type": "standard", "series": "SAMPLE", "code": "2345", "issue_date": "2025-06-18", "currency": "EUR", "supplier": { "name": "Provide One Inc.", "tax_id": { "country": "FR", "code": "43498927917" }, "identities": [ { "type": "SIRET", "code": "49892791768734" } ], "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Sample Consumer", "tax_id": { "country": "FR", "code": "39356000000" }, "identities": [ { "type": "SIRET", "code": "35600000012345" } ], "addresses": [ { "num": "1", "street": "Rue Sundacsakn", "locality": "Saint-Germain-En-Laye", "code": "75050", "country": "FR" } ], "emails": [ { "addr": "email@sample.com" } ] }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "discounts": [ { "reason": "Special discount", "percent": "10%", "amount": "180.00" } ], "taxes": [ { "cat": "VAT", "rate": "standard" } ], "total": "1620.00" } ], "payment": { "advances": [ { "description": "Paid in full", "percent": "100%", "amount": "1944.00" } ], "instructions": { "key": "card" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "FR", "$addons": [ "eu-en16931-v2017", "fr-choruspro-v1" ], "uuid": "019783e7-33b1-7000-a1a5-6139e214b447", "type": "standard", "series": "SAMPLE", "code": "2345", "issue_date": "2025-06-18", "currency": "EUR", "tax": { "ext": { "fr-choruspro-framework": "A1", "untdid-document-type": "380" } }, "supplier": { "name": "Provide One Inc.", "tax_id": { "country": "FR", "code": "43498927917" }, "identities": [ { "type": "SIRET", "code": "49892791768734", "ext": { "iso-scheme-id": "0009" } } ], "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ], "ext": { "fr-choruspro-scheme": "1" } }, "customer": { "name": "Sample Consumer", "tax_id": { "country": "FR", "code": "39356000000" }, "identities": [ { "type": "SIRET", "code": "35600000012345", "ext": { "iso-scheme-id": "0009" } } ], "addresses": [ { "num": "1", "street": "Rue Sundacsakn", "locality": "Saint-Germain-En-Laye", "code": "75050", "country": "FR" } ], "emails": [ { "addr": "email@sample.com" } ], "ext": { "fr-choruspro-scheme": "1" } }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "discounts": [ { "reason": "Special discount", "percent": "10%", "amount": "180.00" } ], "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "20%", "ext": { "untdid-tax-category": "S" } } ], "total": "1620.00" } ], "payment": { "advances": [ { "description": "Paid in full", "percent": "100%", "amount": "1944.00" } ], "instructions": { "key": "card", "ext": { "untdid-payment-means": "48" } } }, "totals": { "sum": "1620.00", "total": "1620.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "untdid-tax-category": "S" }, "base": "1620.00", "percent": "20%", "amount": "324.00" } ], "amount": "324.00" } ], "sum": "324.00" }, "tax": "324.00", "total_with_tax": "1944.00", "payable": "1944.00", "advance": "1944.00", "due": "0.00" } } ``` A non-French supplier invoicing a French public sector entity through Chorus Pro. Chorus Pro accepts foreign suppliers — the customer's SIRET is what anchors the document to the right administration. Notice: * the supplier carries a DE tax ID and address, while the customer keeps its `SIRET` identity, * the `fr-choruspro-v1` add-on still applies — Chorus Pro routing rules are driven by the receiver, not the issuer, * VAT is reported as standard French VAT because the place of supply is France; cross-border reverse-charge cases would set the line tax accordingly. ```json Chorus Pro Cross-Border Invoice (DE → FR) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "FR", "$addons": [ "fr-choruspro-v1" ], "type": "standard", "series": "SAMPLE", "code": "001", "issue_date": "2022-02-01", "currency": "EUR", "supplier": { "name": "Provide One Inc.", "tax_id": { "country": "DE", "code": "111111125" }, "addresses": [ { "num": "42", "street": "Berliner Strasse", "locality": "Berlin", "code": "10117", "country": "DE" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Sample Public Entity", "tax_id": { "country": "FR", "code": "732829320" }, "identities": [ { "type": "SIRET", "code": "73282932012345" } ], "addresses": [ { "num": "1", "street": "Rue Sundacsakn", "locality": "Saint-Germain-En-Laye", "code": "75050", "country": "FR" } ], "emails": [ { "addr": "email@sample.com" } ] }, "lines": [ { "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "discounts": [ { "percent": "10%", "reason": "Special discount" } ], "taxes": [ { "cat": "VAT", "rate": "standard" } ] } ], "payment": { "terms": { "detail": "Please pay within 10 days" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "FR", "$addons": [ "eu-en16931-v2017", "fr-choruspro-v1" ], "type": "standard", "series": "SAMPLE", "code": "001", "issue_date": "2022-02-01", "currency": "EUR", "tax": { "ext": { "fr-choruspro-framework": "A1", "untdid-document-type": "380" } }, "supplier": { "name": "Provide One Inc.", "tax_id": { "country": "DE", "code": "111111125" }, "addresses": [ { "num": "42", "street": "Berliner Strasse", "locality": "Berlin", "code": "10117", "country": "DE" } ], "emails": [ { "addr": "billing@example.com" } ], "ext": { "fr-choruspro-scheme": "2" } }, "customer": { "name": "Sample Public Entity", "tax_id": { "country": "FR", "code": "44732829320" }, "identities": [ { "type": "SIRET", "code": "73282932012345", "ext": { "iso-scheme-id": "0009" } } ], "addresses": [ { "num": "1", "street": "Rue Sundacsakn", "locality": "Saint-Germain-En-Laye", "code": "75050", "country": "FR" } ], "emails": [ { "addr": "email@sample.com" } ], "ext": { "fr-choruspro-scheme": "1" } }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "discounts": [ { "reason": "Special discount", "percent": "10%", "amount": "180.00" } ], "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "20%", "ext": { "untdid-tax-category": "S" } } ], "total": "1620.00" } ], "payment": { "terms": { "notes": "Please pay within 10 days" } }, "totals": { "sum": "1620.00", "total": "1620.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "untdid-tax-category": "S" }, "base": "1620.00", "percent": "20%", "amount": "324.00" } ], "amount": "324.00" } ], "sum": "324.00" }, "tax": "324.00", "total_with_tax": "1944.00", "payable": "1944.00" } } ``` A credit note (avoir) reversing part of a previously submitted Chorus Pro invoice. Notice: * the `type` is set to `credit-note`, so the document is rendered with the UNTDID document type `381`, * the `preceding` array references the original invoice by `series`, `code`, and `issue_date`, with a `reason` for the correction — Chorus Pro links the avoir to the original submission through this reference, * both parties keep their `SIRET` identities, exactly as on the original invoice, and, * the lines describe only the amounts being credited; totals are calculated automatically when running `gobl build`. ```json Chorus Pro Credit Note theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "FR", "$addons": [ "eu-en16931-v2017", "fr-choruspro-v1" ], "uuid": "019783e7-33b1-7000-a1a5-6139e214b448", "type": "credit-note", "series": "SAMPLE-CN", "code": "2346", "issue_date": "2025-06-25", "currency": "EUR", "preceding": [ { "type": "standard", "series": "SAMPLE", "code": "2345", "issue_date": "2025-06-18", "reason": "Partial refund for undelivered services" } ], "supplier": { "name": "Provide One Inc.", "tax_id": { "country": "FR", "code": "43498927917" }, "identities": [ { "type": "SIRET", "code": "49892791768734" } ], "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Sample Consumer", "tax_id": { "country": "FR", "code": "39356000000" }, "identities": [ { "type": "SIRET", "code": "35600000012345" } ], "addresses": [ { "num": "1", "street": "Rue Sundacsakn", "locality": "Saint-Germain-En-Laye", "code": "75050", "country": "FR" } ], "emails": [ { "addr": "email@sample.com" } ] }, "lines": [ { "quantity": "5", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "taxes": [ { "cat": "VAT", "rate": "standard" } ] } ], "payment": { "instructions": { "key": "card" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "FR", "$addons": [ "eu-en16931-v2017", "fr-choruspro-v1" ], "uuid": "019783e7-33b1-7000-a1a5-6139e214b448", "type": "credit-note", "series": "SAMPLE-CN", "code": "2346", "issue_date": "2025-06-25", "currency": "EUR", "preceding": [ { "type": "standard", "issue_date": "2025-06-18", "series": "SAMPLE", "code": "2345", "reason": "Partial refund for undelivered services" } ], "tax": { "ext": { "fr-choruspro-framework": "A1", "untdid-document-type": "381" } }, "supplier": { "name": "Provide One Inc.", "tax_id": { "country": "FR", "code": "43498927917" }, "identities": [ { "type": "SIRET", "code": "49892791768734", "ext": { "iso-scheme-id": "0009" } } ], "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ], "ext": { "fr-choruspro-scheme": "1" } }, "customer": { "name": "Sample Consumer", "tax_id": { "country": "FR", "code": "39356000000" }, "identities": [ { "type": "SIRET", "code": "35600000012345", "ext": { "iso-scheme-id": "0009" } } ], "addresses": [ { "num": "1", "street": "Rue Sundacsakn", "locality": "Saint-Germain-En-Laye", "code": "75050", "country": "FR" } ], "emails": [ { "addr": "email@sample.com" } ], "ext": { "fr-choruspro-scheme": "1" } }, "lines": [ { "i": 1, "quantity": "5", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "450.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "20%", "ext": { "untdid-tax-category": "S" } } ], "total": "450.00" } ], "payment": { "instructions": { "key": "card", "ext": { "untdid-payment-means": "48" } } }, "totals": { "sum": "450.00", "total": "450.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "untdid-tax-category": "S" }, "base": "450.00", "percent": "20%", "amount": "90.00" } ], "amount": "90.00" } ], "sum": "90.00" }, "tax": "90.00", "total_with_tax": "540.00", "payable": "540.00" } } ``` Copy and paste these documents into the [GOBL builder](https://build.gobl.org) in order to preview and verify them.
*** | | | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Compliance | [Invoicing compliance in France](/compliance/france)
[Compliance timeline](/timelines/france) | | Apps | [France](/apps/france)
[Peppol](/apps/peppol)
[Chorus Pro France](/apps/choruspro-france) | | Guides | Chorus Pro — [Supplier registration](/guides/fr-chorus-pro-supplier) · [Issuing invoices](/guides/fr-chorus-pro)
[PA Guide](/guides/fr-pa) — [Registration](/guides/fr-pa-registration) · [Invoicing](/guides/fr-pa-invoicing) · [Status](/guides/fr-pa-status) · [Reporting](/guides/fr-pa-reporting) | | FAQ | [France FAQ](/faq/france) | | GOBL | [France Tax Regime](https://docs.gobl.org/regimes/fr)
[Chorus Pro Addon](https://docs.gobl.org/addons/fr-choruspro-v1)
[French Factur-X Addon](https://docs.gobl.org/addons/fr-facturx-v1) | | GitHub | [gobl.xinvoice](https://github.com/invopop/gobl.xinvoice) |
Ask and answer questions about Chorus Pro France → # Connect Source: https://docs.invopop.com/apps/connect Create incoming and outgoing connections via multiple channels.
View implementation guide ›
| | | | --------- | ------------------------------ | | Developer | [Invopop](https://invopop.com) | | Category | Automation |
The Connect app links your workspace to external document exchange channels, so other systems can deliver documents to Invopop without polling or custom integration code. Connect currently supports incoming HTTP connections, with further channels and directions on the way. Each **endpoint** pairs a public URL of the form `https://connect.invopop.app/{workspace-id}/{slug}` with a workflow of your choice. Any file posted to the endpoint — a GOBL invoice from your billing tool, an XML document from a partner, or any other payload — is validated, stored, and handed to that workflow, which receives a link to the stored file. Every delivery is recorded in a document log inside the app, where you can check its status, inspect the request, preview the payload, and download the original file. #### Key features * **Workflow automation:** Every document delivered to an endpoint automatically starts the workflow you choose for it. * **Public endpoints:** Create one URL per document flow, with a slug you control, unique within your workspace. * **Sender authentication:** Protect each endpoint with a bearer token, basic credentials, or an HMAC-SHA256 signature. * **Content validation:** Restrict the content types an endpoint accepts; malformed or oversized payloads are rejected before they reach your workflows. * **Binary support:** Receive PDFs and other binary files as base64-encoded bodies, with an optional filename for download. * **Document log:** Review every delivery with its status, request headers, payload preview, and original file download. Check out the [Connect guide](/guides/connect) to create your first endpoint and deliver a document to it.
Connect works in the opposite direction to most apps: rather than adding steps to your workflows, it starts them. The app adds no actions to the workflow step picker. Each endpoint is bound to one of your workflows. When a document arrives, Connect validates and stores it, then creates a job for that workflow with a `url` argument pointing at the stored file. The sender receives the IDs of both the stored document and the workflow job in the response, so external systems can track processing end to end. The workflow itself is built like any other — see the [Connect guide](/guides/connect) for a walkthrough of creating an endpoint and sending the first document.
*** Ask and answer questions about the Connect app → # Cron Source: https://docs.invopop.com/apps/cron Schedule periodic workflow execution for automated data imports and recurring processes.
Periodic workflow execution
| | | | --------- | ------------------------------ | | Developer | [Invopop](https://invopop.com) | | Category | Automation | | Scope | All |
The **Cron app** provides periodic workflow execution capabilities for Invopop. Subscribe any silo entry to a workflow with a specified interval, and Cron handles the scheduling and execution automatically. This replaces the need for apps to build their own polling and scheduling infrastructure. The primary use case is automating inbound data flows, such as periodically importing invoices from external systems. For example, the [SW Sapien app](/apps/sw-sapien) uses Cron to schedule daily CFDI bulk imports from Mexico's SAT. #### Key features * **Subscription-based scheduling:** Subscribe silo entries to workflows with configurable intervals (hourly, daily, and more). * **Automatic execution windows:** Each scheduled job receives `from` and `upto` parameters defining the exact time range to process, so workflows always know which period they cover. * **Centralized infrastructure:** Uses the Invopop workflow engine for error handling, retry logic, and monitoring instead of requiring each app to build its own scheduling. * **Manual triggers:** Unsubscribe and resubscribe to reset execution, or create one-off jobs directly for special cases. * **Execution tracking:** Maintains a history of executions per subscription to ensure proper interval management.
The following workflow actions will be available once you install and enable this app: Register a silo entry for periodic workflow execution. Configure the target workflow and the execution interval (for example, daily or hourly). The subscription takes effect immediately and the first job is created at the next scheduled interval. Remove a previously created subscription. The workflow will no longer execute periodically for the specified silo entry. The Cron app actions are designed to be included as steps within your own workflows. Below is an example of a party workflow that subscribes a party to a periodic import process. Subscribe a party to daily CFDI bulk imports. This workflow is intended to be executed once per party after initial registration. Replace the `workflow_id` with the ID of your import workflow. ```json Example SW Sapien subscribe to CFDI import workflow theme={"system"} { "name": "SW Sapien subscribe to CFDI import", "description": "Subscribe a party to periodic CFDI bulk imports", "schema": "org/party", "steps": [ { "id": "2ab3c280-164e-11f1-a769-19319c292fdf", "name": "Subscribe to periodic execution", "provider": "cron.subscribe", "summary": "Hourly → SW Sapien bulk import CFDIs", "config": { "interval": "hourly", "workflow_id": "f907561b-81c2-4bd5-9199-95638ed60669" } }, { "id": "3a99bc90-164e-11f1-a769-19319c292fdf", "name": "Set state", "provider": "silo.state", "summary": "Set state to `registered`{.state .registered}", "config": { "state": "registered" } } ], "rescue": [ { "id": "d0e1f2a0-3c4d-11f0-d003-6c7d8e9f0a1b", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` The example above uses a Mexico CFDI import workflow, but the Cron app is not country-specific. Use it with any workflow that benefits from periodic execution.
*** Ask and answer questions about the Cron App → # DIAN Colombia Source: https://docs.invopop.com/apps/dian-colombia Submit invoices to the Colombian DIAN system.
Supplier registration guide › Issuing guide ›
| | | | --------- | -------------------------------- | | Developer | [Invopop](https://invopop.com) | | Category | Government | | Scope | B2B, B2C | | Country | [Colombia](/compliance/colombia) |
The [DIAN](https://www.dian.gov.co/) in Colombia stands for *Dirección de Impuestos y Aduanas Nacionales* (National Directorate of Taxes and Customs). It is the government agency responsible for managing and overseeing tax collection, customs operations, and facilitating international trade. Electronic invoicing in Colombia is mandatory and operates on a real-time clearance model whereby every invoice must receive a unique identifier called a CUFE (*Código Único de Factura Electrónica*) issued by the DIAN. Invopop has partnered with [Plemsi](https://plemsi.com) to issue invoices in Colombia (DIAN). You can either use Invopop's Plemsi billing account or create your own and provide your own credentials. **Key features** * **Workflow automation:** This app provides automated workflows for issuing invoices and credit notes through the DIAN system. * **Real-time clearance:** Every invoice receives a unique CUFE code from the DIAN in real-time, ensuring compliance with Colombian e-invoicing regulations. * **Legally compliant PDF invoices:** Invoices are generated with all mandatory fields and CUFE codes, as required by Colombian invoicing legislation. * **Plemsi integration:** Direct integration with Plemsi, an authorized technology provider for DIAN electronic invoicing. * **UBL 2.1 generation:** Compliant XML generation is supported for the DIAN schema. * **QR code:** Generates the DIAN QR code according to the DIAN specifications. Make sure to check out our [Supplier registration guide](/guides/co-dian-supplier) for onboarding suppliers, and the [Issuing invoices guide](/guides/co-dian) for issuing invoices and setting up your workflows. ## FAQ Invoicing questions The DIAN requires a [Municipal Code](https://www.dian.gov.co/atencionciudadano/formulariosinstructivos/Formularios/2007/Codigos_municipios_2007.pdf) rather than a postal code to specify the municipality of the supplier. Make sure you are setting a municipal code (5 digits) and not a postal code (6 digits) in the supplier's [`co-dian-municipality`](https://docs.gobl.org/addons/co-dian-v2) extension. Through [Plemsi](https://plemsi.com), an authorized technology provider for DIAN electronic invoicing. The [DIAN Colombia workflow](/guides/co-dian) signs the GOBL envelope, sends the invoice to the DIAN via Plemsi, receives the CUFE, and generates a compliant PDF with the DIAN QR code. Set `$schema` to `https://gobl.org/draft-0/bill/invoice`, the supplier's `tax_id.country` to `CO`, and include the supplier's and customer's DIAN municipality codes via the [`co-dian-municipality`](https://docs.gobl.org/addons/co-dian-v2) extension in each party's `ext`. See the [GOBL Colombia tax regime](https://github.com/invopop/gobl/blob/main/regimes/co/README.md) for the full field reference and examples. VAT (IVA, 19% standard or 5% reduced), consumption taxes (IC, INC), the industry and commerce tax (ICA), and the retained taxes ReteIVA, ReteICA, and Retefuente. A single invoice may need to combine up to three value added and retained taxes — all are supported by the [GOBL Colombia tax regime](https://docs.gobl.org/regimes/co#tax-categories). Yes. The same DIAN Colombia workflow handles invoices and credit notes when configured with a dynamic sequential code, so each document type draws from its own authorized numbering range. Plemsi's sandbox has a single enabled supplier (tax code `9015852843`) and one series per document type: `SETT` for invoices and `NCTT` for credit notes. The series are shared across users, so we assign you a specific number range to avoid collisions. Contact us via Slack or [support@invopop.com](mailto:support@invopop.com) to enable the sandbox in your workspace. Registering supplier questions The supplier must be registered with the DIAN with an active RUT (Registro Único Tributario), authorize Plemsi as their technology provider in the DIAN, and hold a valid billing numbering range authorization. The [supplier registration guide](/guides/co-dian-supplier) walks through each step. The supplier's legal representative authorizes Plemsi in the DIAN, requests a billing numbering range authorization (the DIAN issues a form 1876), and associates that resolution with Plemsi. Then contact us via Slack or [support@invopop.com](mailto:support@invopop.com) with the supplier's company details so we can create and configure the Plemsi account. See the [supplier registration guide](/guides/co-dian-supplier) for the full checklist. Yes. DIAN numbering range authorizations have both a number limit and an expiration date. When one runs out, the supplier's legal representative must file a renewal ("Solicitud de Habilitación de Numeración de Facturación") with the DIAN and associate the new resolution with Plemsi. No. You can use Invopop's Plemsi billing account, or create your own and provide your credentials. In either case, contact us to configure the account — Plemsi account setup for Invopop suppliers is done by our team. No. The Plemsi sandbox has a single pre-registered supplier with tax code `9015852843`, which all test invoices must use. Supplier registration only applies to the live environment. More answers in our [Colombia FAQ](/faq/colombia) section
The following workflow actions will be available once you install and enable this app:
5
Process invoices using Plemsi in Colombia.
The following workflows are available to make your integration easier. Use them as templates to build upon. This workflow automates FEV Colombian invoice processing and tax compliance. ```json Example DIAN issue invoice workflow theme={"system"} { "name": "DIAN issue invoice", "description": "Issue an invoice through DIAN and generate PDF", "schema": "bill/invoice", "steps": [ { "id": "ece780f0-322c-11f0-bbb5-9da15d555d80", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "7d803770-322c-11f0-bbb5-9da15d555d80", "name": "Add sequential code", "provider": "sequence.enumerate", "summary": "Dynamic · DIAN · 1", "config": { "name": "Colombia", "padding": 1, "prefix": "", "start": 1 } }, { "id": "fc75e4f0-8721-11ef-a962-73e3f2037a52", "name": "Sign envelope", "provider": "silo.close" }, { "id": "bde49770-322c-11f0-bbb5-9da15d555d80", "name": "Send invoice to DIAN", "provider": "plemsi" }, { "id": "cdf59920-322c-11f0-bbb5-9da15d555d80", "name": "Generate PDF", "provider": "pdf", "summary": "Spanish · Letter", "config": { "date_format": "%Y-%m-%d", "layout": "Letter", "locale": "es", "logo_height": 40 } }, { "id": "9cebc6a0-322d-11f0-bbb5-9da15d555d80", "name": "Set state", "provider": "silo.state", "summary": "Set state to `sent`{.state .sent}", "config": { "state": "sent" } } ], "rescue": [ { "id": "e57671a0-322c-11f0-bbb5-9da15d555d80", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` [Add to my workspace →](https://console.invopop.com/redirect/workflows/new?template=co-dian-invoice) A NIT (`tin` type) with the `co-dian-municipality` extension identifying where the supplier is registered. ```json Colombia supplier example theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "EXAMPLE SUPPLIER S.A.S.", "tax_id": { "country": "CO", "type": "tin", "code": "9014514812" }, "addresses": [ { "street": "CRA 15 88 64 OF 502", "locality": "Bogotá, D.C.", "region": "Bogotá", "country": "CO" } ], "emails": [ { "addr": "facturacion@examplesupplier.co" } ], "ext": { "co-dian-municipality": "11001" } } ``` A business customer with NIT, municipality extension, and the contact details DIAN expects on the invoice. ```json Colombia customer example theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "EXAMPLE CUSTOMER S.A.S.", "tax_id": { "country": "CO", "type": "tin", "code": "9014514805" }, "addresses": [ { "street": "CRA 8 113 31 OF 703", "locality": "Bogotá, D.C.", "region": "Bogotá", "country": "CO" } ], "emails": [ { "addr": "benito.ortiz@example.com" } ], "telephones": [ { "num": "3114131811" } ], "ext": { "co-dian-municipality": "11001" } } ``` In this example, we're issuing a B2B invoice from a Colombian supplier to another Colombian business customer. Notice: * the `$schema` is set to [`https://gobl.org/draft-0/bill/invoice`](https://docs.gobl.org/draft-0/bill/invoice), * the supplier's `tax_id` country is set to `CO`, and the DIAN municipality code is set with the `co-dian-municipality` extension on the party, * the customer details include full address, email, and telephone information, * the invoice includes VAT at the standard Colombian rate of 19%, * payment terms are specified with a due date and payment amount, and, * there are no calculations in some fields; these will be made automatically when uploading. ```json DIAN Colombia B2B Invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "type": "standard", "series": "SETT", "code": "1234", "issue_date": "2021-01-01", "currency": "COP", "supplier": { "name": "EXAMPLE SUPPLIER S.A.S.", "tax_id": { "country": "CO", "type": "tin", "code": "9014514812" }, "ext": { "co-dian-municipality": "11001" } }, "customer": { "name": "EXAMPLE CUSTOMER S.A.S.", "tax_id": { "country": "CO", "type": "tin", "code": "9014514805" }, "ext": { "co-dian-municipality": "11001" }, "addresses": [ { "street": "CRA 8 113 31 OF 703", "locality": "Bogotá, D.C.", "region": "Bogotá", "country": "CO" } ], "emails": [ { "addr": "benito.ortiz@example.com" } ], "telephones": [ { "num": "3114131811" } ] }, "lines": [ { "quantity": "1", "item": { "name": "Servicios Mes de Julio 2022", "price": "200000.00" }, "taxes": [ { "cat": "VAT", "percent": "19%" } ] } ], "payment": { "terms": { "due_dates": [ { "date": "2021-01-01", "percent": "100%" } ] } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "CO", "type": "standard", "series": "SETT", "code": "1234", "issue_date": "2021-01-01", "currency": "COP", "supplier": { "name": "EXAMPLE SUPPLIER S.A.S.", "tax_id": { "country": "CO", "code": "9014514812", "type": "tin" }, "ext": { "co-dian-municipality": "11001" } }, "customer": { "name": "EXAMPLE CUSTOMER S.A.S.", "tax_id": { "country": "CO", "code": "9014514805", "type": "tin" }, "addresses": [ { "street": "CRA 8 113 31 OF 703", "locality": "Bogotá, D.C.", "region": "Bogotá", "country": "CO" } ], "emails": [ { "addr": "benito.ortiz@example.com" } ], "telephones": [ { "num": "3114131811" } ], "ext": { "co-dian-municipality": "11001" } }, "lines": [ { "i": 1, "quantity": "1", "item": { "name": "Servicios Mes de Julio 2022", "price": "200000.00" }, "sum": "200000.00", "taxes": [ { "cat": "VAT", "key": "standard", "percent": "19%" } ], "total": "200000.00" } ], "payment": { "terms": { "due_dates": [ { "date": "2021-01-01", "amount": "238000.00", "percent": "100%" } ] } }, "totals": { "sum": "200000.00", "total": "200000.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "base": "200000.00", "percent": "19%", "amount": "38000.00" } ], "amount": "38000.00" } ], "sum": "38000.00" }, "tax": "38000.00", "total_with_tax": "238000.00", "payable": "238000.00" } } ``` In this example, we're issuing a B2C simplified invoice from a Colombian supplier to a consumer. Notice: * we've set the `simplified` tag in the `tax.tags` field; this indicates the invoice is for a final consumer, * the customer information is omitted, as it's not required for B2C transactions, * the invoice includes a prepayment advance of 100%, meaning the invoice has been fully paid, * the totals section shows the `advance` and `due` amounts, with the latter being zero since the invoice is fully paid, and, * there are no calculations in some fields; these will be made automatically when uploading. ```json DIAN Colombia B2C Invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "type": "standard", "series": "SETT", "code": "1234", "issue_date": "2021-01-01", "currency": "COP", "tax": { "tags": [ "simplified" ] }, "supplier": { "name": "EXAMPLE SUPPLIER S.A.S.", "tax_id": { "country": "CO", "type": "tin", "code": "9014514812" }, "ext": { "co-dian-municipality": "11001" } }, "lines": [ { "quantity": "1", "item": { "name": "Useful service", "price": "200000.00" }, "taxes": [ { "cat": "VAT", "percent": "19%" } ] } ], "payment": { "advances": [ { "description": "Prepaid", "percent": "100%" } ] } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "CO", "$tags": [ "simplified" ], "type": "standard", "series": "SETT", "code": "1234", "issue_date": "2021-01-01", "currency": "COP", "tax": {}, "supplier": { "name": "EXAMPLE SUPPLIER S.A.S.", "tax_id": { "country": "CO", "code": "9014514812", "type": "tin" }, "ext": { "co-dian-municipality": "11001" } }, "lines": [ { "i": 1, "quantity": "1", "item": { "name": "Useful service", "price": "200000.00" }, "sum": "200000.00", "taxes": [ { "cat": "VAT", "key": "standard", "percent": "19%" } ], "total": "200000.00" } ], "payment": { "advances": [ { "description": "Prepaid", "percent": "100%", "amount": "238000.00" } ] }, "totals": { "sum": "200000.00", "total": "200000.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "base": "200000.00", "percent": "19%", "amount": "38000.00" } ], "amount": "38000.00" } ], "sum": "38000.00" }, "tax": "38000.00", "total_with_tax": "238000.00", "payable": "238000.00", "advance": "238000.00", "due": "0.00" } } ``` In this example, we're issuing a credit note (nota de crédito) that corrects a previously issued invoice. Notice: * the `type` is set to `credit-note`, * the `series` is set to the credit note series (`NCTT` in the sandbox environment, which is separate from the `SETT` invoice series), * the `preceding` array references the original invoice being corrected by its `series`, `code`, and `issue_date`, along with a `reason` for the correction, * the lines describe the amounts being credited — a credit note can cover the full original invoice or just part of it, and, * there are no calculations in some fields; these will be made automatically when uploading. ```json DIAN Colombia Credit Note theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "type": "credit-note", "series": "NCTT", "code": "5678", "issue_date": "2021-01-15", "currency": "COP", "preceding": [ { "type": "standard", "series": "SETT", "code": "1234", "issue_date": "2021-01-01", "reason": "Servicios no prestados" } ], "supplier": { "name": "EXAMPLE SUPPLIER S.A.S.", "tax_id": { "country": "CO", "type": "tin", "code": "9014514812" }, "ext": { "co-dian-municipality": "11001" } }, "customer": { "name": "EXAMPLE CUSTOMER S.A.S.", "tax_id": { "country": "CO", "type": "tin", "code": "9014514805" }, "ext": { "co-dian-municipality": "11001" }, "addresses": [ { "street": "CRA 8 113 31 OF 703", "locality": "Bogotá, D.C.", "region": "Bogotá", "country": "CO" } ], "emails": [ { "addr": "benito.ortiz@example.com" } ], "telephones": [ { "num": "3114131811" } ] }, "lines": [ { "quantity": "1", "item": { "name": "Servicios Mes de Julio 2022", "price": "200000.00" }, "taxes": [ { "cat": "VAT", "percent": "19%" } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "CO", "type": "credit-note", "series": "NCTT", "code": "5678", "issue_date": "2021-01-15", "currency": "COP", "preceding": [ { "type": "standard", "issue_date": "2021-01-01", "series": "SETT", "code": "1234", "reason": "Servicios no prestados" } ], "supplier": { "name": "EXAMPLE SUPPLIER S.A.S.", "tax_id": { "country": "CO", "code": "9014514812", "type": "tin" }, "ext": { "co-dian-municipality": "11001" } }, "customer": { "name": "EXAMPLE CUSTOMER S.A.S.", "tax_id": { "country": "CO", "code": "9014514805", "type": "tin" }, "addresses": [ { "street": "CRA 8 113 31 OF 703", "locality": "Bogotá, D.C.", "region": "Bogotá", "country": "CO" } ], "emails": [ { "addr": "benito.ortiz@example.com" } ], "telephones": [ { "num": "3114131811" } ], "ext": { "co-dian-municipality": "11001" } }, "lines": [ { "i": 1, "quantity": "1", "item": { "name": "Servicios Mes de Julio 2022", "price": "200000.00" }, "sum": "200000.00", "taxes": [ { "cat": "VAT", "key": "standard", "percent": "19%" } ], "total": "200000.00" } ], "totals": { "sum": "200000.00", "total": "200000.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "base": "200000.00", "percent": "19%", "amount": "38000.00" } ], "amount": "38000.00" } ], "sum": "38000.00" }, "tax": "38000.00", "total_with_tax": "238000.00", "payable": "238000.00" } } ```
*** | | | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Compliance | [Invoicing compliance in Colombia](/compliance/colombia)
[Compliance timeline](/timelines/colombia) | | Apps | [DIAN Colombia](/apps/dian-colombia) | | Guides | [Supplier registration](/guides/co-dian-supplier)
[Issuing invoices](/guides/co-dian) | | FAQ | [Colombia FAQ](/faq/colombia) | | GOBL | [Colombia Tax Regime](https://docs.gobl.org/regimes/co)
[Colombia DIAN Addon](https://docs.gobl.org/addons/co-dian-v2) |
Ask and answer questions about DIAN Colombia App → # Documentos fiscais eletrônicos Brazil Source: https://docs.invopop.com/apps/documentos-fiscais-electronicos-brazil Send NF-e, NFC-e & NFS-e documents to the tax authorities in Brazil via PlugNotas.
Supplier registration guide › Issuing guide ›
| | | | --------- | ------------------------------ | | Developer | [Invopop](https://invopop.com) | | Category | Government | | Scope | B2B, B2C | | Country | [Brazil](/compliance/brazil) |
Brazil has a variety of electronic tax documents that must be issued in different cases for various tax purposes. These include service invoices (NFS-e), product invoices (NF-e), and consumer invoices (NFC-e). Each document type is subject to variations from state to state and municipality to municipality, with each jurisdiction applying its own rules, formats, and APIs for issuing fiscal documents. Invopop's **Documentos Fiscais Eletrônicos** app provides a unified way to issue fiscal documents across all Brazilian states and over 2000 municipalities using GOBL. You can find [the full list of supported municipalities here](https://tecnospeed.com.br/plugdfe/nfse/#homologacao). Invopop has partnered with [PlugNotas](https://tecnospeed.com.br/plugdfe/) to issue electronic fiscal documents in Brazil. The integration handles the complexity of different state and municipal requirements, allowing you to issue documents through a single unified interface. **Key features** * **Workflow automation:** This app provides automated workflows for issuing NFS-e, NF-e, and NFC-e documents through the Brazilian tax authorities. * **Multi-jurisdiction support:** Unified interface for issuing documents across all Brazilian states and over 2000 municipalities, each with their own rules and formats. * **Supplier registration:** Secure supplier onboarding process with certificate-based authentication for issuing documents on behalf of suppliers. * **Legally compliant documents:** Documents are generated with all mandatory fields and tax calculations as required by Brazilian fiscal legislation. * **PlugNotas integration:** Direct integration with PlugNotas, an authorized technology provider for Brazilian electronic fiscal documents. * **NFS-e, NF-e, and NFC-e support:** Issue invoices for service, B2B product, and consumer transactions. Make sure to check out our [Supplier registration guide](/guides/br-dfe-supplier) for onboarding suppliers, and the [Issuing invoices guide](/guides/br-dfe) for issuing documents and setting up your workflows. ## FAQ Invoicing questions Invopop supports NF-e, NFS-e and NFC-e documents. Transport documents (MDF-e and CT-e) are not currently supported. For further details on how GOBL prepares data for conversion, see: * The [Brazil Regime GOBL Reference](https://docs.gobl.org/regimes/br). * The [NFS-e Addon GOBL Reference](https://docs.gobl.org/addons/br-nfse-v1). * The [NF-e Addon GOBL Reference](https://docs.gobl.org/addons/br-nfe-v4). Yes. A foreign customer that does not have a Brazilian CNPJ or CPF can be identified by providing a country-qualified `identity` (e.g. a passport number) on the customer party. The `identity.country` must be an ISO country code other than `BR`. When a foreign customer is used: * the `tax_id` block can be omitted, * the customer address `country` is required and must not be `BR` (it is auto-filled from the identity country if missing), * the `state` field and the `br-ibge-municipality` extension are not required, as they only apply to Brazilian parties. Example customer block for a foreign buyer: ```json theme={"system"} "customer": { "name": "Acme International Inc.", "identities": [ { "key": "passport", "country": "US", "code": "US-FOREIGN-123" } ], "addresses": [ { "num": "500", "street": "Market Street", "locality": "San Francisco", "code": "94105", "country": "US" } ] } ``` Build a GOBL invoice with the `br-nfe-v4` addon, send it through the Issue NF-e workflow. Invopop signs with the supplier's A1 cert, transmits to the issuer's state SEFAZ, receives the protocolo de autorização, and exposes the authorized XML and DANFE PDF. After a successful issuance, SEFAZ returns two identifiers that Invopop stores as envelope stamps on the silo entry under `data.head.stamps`: * `sefaz-key` — the 44-digit NF-e access key (*chave de acesso*) that uniquely identifies the document. * `sefaz-auth` — the authorization protocol number (*número do protocolo*) confirming SEFAZ acceptance. Use them to reconcile your records, build the DANFE QR code, or query SEFAZ directly. ```json theme={"system"} "stamps": [ { "provider": "sefaz-key", "value": "35240114200166000187550010000000071123456789" }, { "provider": "sefaz-auth", "value": "135240000123456" } ] ``` NF-e (`br-nfe-v4`) covers electronic invoices for the circulation of **goods** in Brazil. It maps to two fiscal models: * **Model 55 — NF-e**: B2B or business-to-government transactions * **Model 65 — NFC-e**: B2C consumer transactions (simplified) #### Notation * ✅ **Required** — validation will fail if missing * ⬜ **Optional** — can be omitted * 🔧 **Auto-normalized** — set automatically if not provided ### Invoice Header | Field | Required | Notes | | ------------ | ---------------------------- | ----------------------------------------------- | | `$schema` | auto | `https://gobl.org/draft-0/bill/invoice` | | `$addons` | ✅ | `["br-nfe-v4"]` | | `$tags` | ⬜ | Use `["simplified"]` for NFC-e (model 65) | | `uuid` | ⬜ | Auto-generated if absent | | `type` | ⬜ | Defaults to `standard` | | `series` | ✅ | Pattern: `^(?:0\|[1-9]{1}[0-9]{0,2})$` | | `code` | ⬜ | Required to sign the document. | | `issue_date` | ✅ | ISO date, e.g. `"2024-11-15"` | | `currency` | ✅ | Must be `"BRL"` | | `tax` | ✅ | See Tax Extensions | | `notes` | ✅ | At least one note with `key: "reason"` required | | `lines` | ✅ | At least one line item | | `charges` | ⬜ | Document-level charges | | `discounts` | ⬜ | Document-level discounts | | `supplier` | ✅ | See Supplier | | `customer` | ✅ model 55
⬜ model 65 | See Customer | | `payment` | ✅ if not fully paid | See Payment | | `ordering` | ⬜ | | | `delivery` | ⬜ | | ### Tax Extensions | Extension | Required | Values | | --------------------------------- | -------- | ------------------------------------------------------------------- | | `tax.ext.br-nfe-model` | ✅ | `"55"` (NF-e, B2B) or `"65"` (NFC-e, B2C) | | `tax.ext.br-nfe-presence` | ✅ | See table below. Restricted by model. | | `tax.ext.br-nfe-regime` | ⬜ | `"1"`=Simples Nacional, `"2"`=Simples Nacional Excess, `"3"`=Normal | | `tax.ext.br-nfe-fiscal-incentive` | ⬜ | `"1"`=Has incentive, `"2"`=No incentive | **`br-nfe-presence` allowed values:** | Code | Description | NF-e (55) | NFC-e (65) | | ---- | ------------- | --------- | ---------- | | `0` | N/A | ✅ | ❌ | | `1` | In-person | ✅ | ✅ | | `2` | Internet | ✅ | ❌ | | `3` | Tele-service | ✅ | ❌ | | `4` | Home delivery | ❌ | ✅ | | `5` | Off-site | ✅ | ❌ | | `9` | Others | ✅ | ❌ | ```json theme={"system"} "tax": { "ext": { "br-nfe-model": "55", "br-nfe-presence": "1" } } ``` ### Notes At least one note with `key: "reason"` is **required**. It maps to the NF-e `natOp` field (nature of the operation). ### Supplier | Field | Required | Notes | | -------------------------------------- | -------- | --------------------------------------------------------------- | | `name` | ✅ | | | `tax_id.country` | ✅ | `"BR"` | | `tax_id.code` | ✅ | CNPJ (14 digits) or CPF (11 digits), Mod11 validated | | `identities[].key: "br-nfe-state-reg"` | ✅ | State Registration (Inscrição Estadual) | | `addresses` | ✅ | At least one | | `addresses[].country` | ✅ 🔧 | ISO country code. Auto-filled from `tax_id.country` if missing. | | `ext.br-ibge-municipality` | ✅ | 7-digit IBGE municipality code | ### Customer (Model 55 — required, Model 65 — optional) Brazilian customers must provide a Brazilian `tax_id`. Foreign customers can issue an NF-e by providing a country-qualified `identity` (e.g. a passport number) instead of a `tax_id`. | Field | Required | Notes | | ------------------------------------ | ------------------------------------------ | ------------------------------------------------------------------------------------------------------ | | `tax_id.country` | ✅ for BR customers | `"BR"` | | `tax_id.code` | ✅ when `tax_id` is present | CNPJ or CPF | | `identities[]` with non-BR `country` | ✅ for foreign customers without a `tax_id` | E.g. `{ "key": "passport", "country": "US", "code": "US-FOREIGN-123" }` | | `addresses` | ✅ | | | `addresses[].country` | ✅ 🔧 | ISO country code. Auto-filled from the `tax_id` country or the first identity that declares a country. | | `addresses[].state` | ✅ for BR customers | Must be a valid Brazilian state acronym (e.g. `SP`). Not required for foreign customers. | | `ext.br-ibge-municipality` | ✅ for BR customers | 7-digit IBGE code. Not required for foreign customers. | ### Line items Required tax categories per line: `ICMS`, `PIS`, `COFINS`. `IPI` is optional. | Extension | Required | Notes | | ---------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `line.ext.br-nfe-cfop` | ✅ model 55
⬜ model 65 | CFOP (Código Fiscal de Operações e Prestações) code identifying the fiscal nature of the operation, e.g. `"5102"` for in-state resale. Required on every line of an NF-e (model 55). | Optional item identities: `item.identities[].key: "ncm" | "gtin" | "gtin+taxable"`. ### Payment Required when the invoice is not fully paid. Must include `payment.instructions.key`. Payment-means mapping is auto-set unless `key: "other"`.
Build a GOBL invoice with the `br-nfse-v1` addon and send it through the Issue NFS-e workflow. Until the federal NFS-e (DPS) takes over in 2026, Invopop routes per-municipality — the workflow handles the underlying API differences transparently. Billing platforms like Chargebee and Stripe are not aware of ISS particularities and tend to wrongly treat ISS as a typical tax included in the price. This causes `invalid-prices-include` errors during import because that pricing model is not compatible with how ISS works for NFS-e. The correct setup is: 1. **Do not configure ISS as a tax** in your billing platform (Chargebee, Stripe, etc.). 2. Prices in your billing platform should already be the **final public prices** with ISS embedded. 3. Add a **Modify Silo Entry** step to your import workflow that injects the ISS tax with the desired percentage into the GOBL invoice. This workflow approach ensures ISS is properly added to the GOBL invoice as an informative tax category before submission to the Brazilian tax authority, while avoiding the pricing conflicts that occur when billing platforms try to handle ISS as a standard tax. NFS-e (`br-nfse-v1`) covers electronic service invoices (*Notas Fiscais de Serviços Eletrônicas*) in Brazil. Service invoices are regulated at the **municipal** level, so several fields carry municipality-specific codes. The addon implements the ABRASF national standard (v2.04). ### Invoice Header | Field | Required | Notes | | ------------ | -------- | ----------------------------- | | `$addons` | ✅ | `["br-nfse-v1"]` | | `series` | ✅ | Any non-empty string | | `code` | ⬜ | Required to sign the document | | `issue_date` | ✅ | ISO date | | `currency` | ✅ | Must be `"BRL"` | | `lines` | ✅ | At least one line item | | `charges` | ❌ | Not supported by NFS-e | | `discounts` | ❌ | Not supported by NFS-e | | `supplier` | ✅ | See Supplier | ### Supplier | Field | Required | Notes | | ------------------------------------------- | -------- | --------------------------------------------- | | `name` | ✅ | | | `tax_id.country` | ✅ | `"BR"` | | `tax_id.code` | ✅ | CNPJ or CPF | | `identities[].key: "br-nfse-municipal-reg"` | ✅ | Municipal Registration | | `addresses` | ✅ | | | `ext.br-ibge-municipality` | ✅ | 7-digit IBGE municipality code | | `ext.br-nfse-simples` | ✅ | `"1"` opt-in, `"2"` opt-out | | `ext.br-nfse-fiscal-incentive` | ✅ | `"1"` has incentive, `"2"` does not (default) | | `ext.br-nfse-special-regime` | ⬜ | Special regime values | ### Customer Optional. When provided, `ext.br-ibge-municipality` is required if addresses are present. ### Line items Required item extension: `item.ext.br-nfse-service` (municipality service code). Optional item extensions: `item.ext.br-nfse-cnae`, plus the all-or-none trio `item.ext.br-nfse-{operation,tax-status,tax-class}`. Required tax category per line: `ISS`. ISS extension `taxes[ISS].ext.br-nfse-iss-liability` defaults to `"1"` (Liable).
Registering supplier questions Upload the supplier's A1 digital certificate (PFX or P12) plus password through the registration workflow. Invopop validates it against the relevant SEFAZ or municipal endpoint and activates the supplier for issuing. A1 certificates (X.509 + private key, exported as PKCS#12) and their passwords are stored encrypted. Invopop uses them to sign documents and authenticate to the relevant SEFAZ or municipal endpoint on the supplier's behalf. Upload the A1 certificate plus its password through the Register Supplier workflow, providing the supplier's CNPJ and Inscrição Estadual. Invopop validates the certificate against SEFAZ and activates the supplier for the corresponding UF. An ICP-Brasil A1 certificate issued to the supplier's CNPJ (or CPF for individuals). Format: PKCS#12 (.pfx/.p12) containing the X.509 cert and matching private key. Validity is typically 1 year. Upload the supplier's A1 certificate plus the Inscrição Municipal for the relevant city. The federal DPS (2026) consolidates registration; until then, separate enrollment per municipality may be required for high-volume issuance. Most municipalities accept the same ICP-Brasil A1 certificate used for NF-e. A few require A3 (smartcard/USB token) — Invopop currently supports A1 only. More answers in our [Brazil FAQ](/faq/brazil) section
The following workflow actions will be available once you install and enable this app:
5
Send NFS-e in Brazil via PlugNotas.
5
Send NF-e in Brazil via PlugNotas.
5
Send NFC-e in Brazil via PlugNotas
Register suppliers to issue electronic fiscal documents on their behalf. Remove a supplier's registration so it can no longer issue electronic fiscal documents from this workspace. Cancel a previously sent NFS-e invoice via PlugNotas. The cancellation reason and code can be set on the workflow step configuration or overridden per job using the `nfe-br-cancel-reason` and `nfe-br-cancel-code` arguments. Cancel a previously sent NF-e invoice via PlugNotas. The cancellation reason can be set on the workflow step or overridden per job using the `nfe-br-cancel-reason` argument. Cancel a previously sent NFC-e invoice via PlugNotas. The cancellation reason can be set on the workflow step or overridden per job using the `nfe-br-cancel-reason` argument.
The following workflows are available to make your integration easier. Use them as templates to build upon. Issuing document workflows: This workflow automates NFS-e service invoice processing and tax compliance in Brazil. ```json Example issue NFS-e invoice workflow theme={"system"} { "name": "Issue NFS-e invoice", "description": "Issue an NFS-e service invoice via PlugNotas", "schema": "bill/invoice", "steps": [ { "id": "d1c7bde0-b651-11f0-b6c3-efa5610a4723", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "dbcb8600-b651-11f0-b6c3-efa5610a4723", "name": "Add sequential code", "provider": "sequence.enumerate", "summary": "Dynamic · NFS-e · 1", "config": { "name": "NFS-e", "padding": 1, "start": 1 } }, { "id": "e8eba950-b651-11f0-b6c3-efa5610a4723", "name": "Sign envelope", "provider": "silo.close" }, { "id": "ec64f190-b651-11f0-b6c3-efa5610a4723", "name": "Send NFS-e to Prefeitura", "provider": "nfe-br.send" }, { "id": "eecc7bb0-b651-11f0-b6c3-efa5610a4723", "name": "Set state", "provider": "silo.state", "summary": "Set state to `sent`{.state .sent}", "config": { "state": "sent" } } ], "rescue": [ { "id": "f9195ac0-b651-11f0-b6c3-efa5610a4723", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` [Add to my workspace →](https://console.invopop.com/redirect/workflows/new?template=br-dfe-service-invoice) This workflow automates NF-e product invoice processing and tax compliance in Brazil. ```json Example issue NF-e invoice workflow theme={"system"} { "name": "Issue NF-e invoice", "description": "Issue an NF-e product invoice via PlugNotas", "schema": "bill/invoice", "steps": [ { "id": "ddfb8e79-8260-4ecd-bf59-115e837cd135", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "169c4b15-83ae-4242-b0c9-4e4915d15361", "name": "Add sequential code", "provider": "sequence.enumerate", "summary": "Dynamic · NF-e · 1", "config": { "name": "NF-e", "padding": 1, "start": 1 } }, { "id": "283dae9e-ea44-46c0-8f63-5af48ec5f388", "name": "Sign envelope", "provider": "silo.close" }, { "id": "12bd4677-dc3c-4043-85ca-54f8d034803d", "name": "Send NF-e to SEFAZ", "provider": "nfe-br.send.nfe" }, { "id": "999ad559-1040-4e69-98c9-93e62c8833d4", "name": "Set state", "provider": "silo.state", "summary": "Set state to `sent`{.state .sent}", "config": { "state": "sent" } } ], "rescue": [ { "id": "5c38f3d4-1338-4990-a248-0822c5081124", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` [Add to my workspace →](https://console.invopop.com/redirect/workflows/new?template=br-dfe-product-invoice) This workflow automates NFC-e consumer invoice processing and tax compliance in Brazil. ```json Example issue NFC-e invoice workflow theme={"system"} { "name": "Issue NFC-e invoice", "description": "Issue an NFC-e consumer invoice via PlugNotas", "schema": "bill/invoice", "steps": [ { "id": "93769100-b652-11f0-a7d9-bfad358c6464", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "971c6780-b652-11f0-a7d9-bfad358c6464", "name": "Add sequential code", "provider": "sequence.enumerate", "summary": "Dynamic · NFC-e · 1", "config": { "name": "NFC-e", "padding": 1, "start": 1 } }, { "id": "9f965b50-b652-11f0-a7d9-bfad358c6464", "name": "Sign envelope", "provider": "silo.close" }, { "id": "8693f670-b653-11f0-a7d9-bfad358c6464", "name": "Send NFC-e to SEFAZ", "provider": "nfe-br.send.nfce" }, { "id": "a9dc0e70-b652-11f0-a7d9-bfad358c6464", "name": "Set state", "provider": "silo.state", "summary": "Set state to `sent`{.state .sent}", "config": { "state": "sent" } } ], "rescue": [ { "id": "b0f7f8e0-b652-11f0-a7d9-bfad358c6464", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` [Add to my workspace →](https://console.invopop.com/redirect/workflows/new?template=br-dfe-consumer-invoice) Cancelling document workflows: This workflow cancels a previously sent NFS-e invoice in Brazil. ```json Example Cancel NFS-e invoice workflow theme={"system"} { "name": "Cancel NFS-e invoice", "description": "Cancel an NFS-e service invoice via PlugNotas", "schema": "bill/invoice", "steps": [ { "id": "5e63dc30-535e-11f1-aba1-0fa2408cece2", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "71238320-535e-11f1-aba1-0fa2408cece2", "name": "Cancel NFS-e with Prefeitura", "provider": "nfe-br.cancel.nfse" }, { "id": "65aa8020-535e-11f1-aba1-0fa2408cece2", "name": "Set state", "provider": "silo.state", "summary": "Set state to `void`{.state .void}", "config": { "state": "void" } } ], "rescue": [ { "id": "6b3199c0-535e-11f1-aba1-0fa2408cece2", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` [Add to my workspace →](https://console.invopop.com/redirect/workflows/new?template=br-dfe-cancel-nfse) This workflow cancels a previously sent NF-e invoice in Brazil. ```json Example Cancel NF-e invoice workflow theme={"system"} { "name": "Cancel NF-e invoice", "description": "Cancel an NF-e product invoice via PlugNotas", "schema": "bill/invoice", "steps": [ { "id": "7b40e24a-0c51-4462-b3e9-d2d20d424a0d", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "834e52d6-d50a-4340-9ca6-f07557aa94d5", "name": "Cancel NF-e with SEFAZ", "provider": "nfe-br.cancel.nfe" }, { "id": "ddfb8e79-8260-4ecd-bf60-115e837cd135", "name": "Set state", "provider": "silo.state", "summary": "Set state to `void`{.state .void}", "config": { "state": "void" } } ], "rescue": [ { "id": "169c4b15-83ae-4243-b0c9-4e4915d15361", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` [Add to my workspace →](https://console.invopop.com/redirect/workflows/new?template=br-dfe-cancel-nfe) This workflow cancels a previously sent NFC-e invoice in Brazil. ```json Example Cancel NFC-e invoice workflow theme={"system"} { "name": "Cancel NFC-e invoice", "description": "Cancel an NFC-e consumer invoice via PlugNotas", "schema": "bill/invoice", "steps": [ { "id": "5e63dc30-535e-11f1-aba1-0fa2408cece2", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "71238320-535e-11f1-aba1-0fa2408cece2", "name": "Cancel NFC-e with SEFAZ", "provider": "nfe-br.cancel.nfce" }, { "id": "65aa8020-535e-11f1-aba1-0fa2408cece2", "name": "Set state", "provider": "silo.state", "summary": "Set state to `void`{.state .void}", "config": { "state": "void" } } ], "rescue": [ { "id": "6b3199c0-535e-11f1-aba1-0fa2408cece2", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` [Add to my workspace →](https://console.invopop.com/redirect/workflows/new?template=br-dfe-cancel-nfce) Supplier workflows: This workflow marks a supplier as registered after successful onboarding. ```json Example Brazil supplier post-registration workflow theme={"system"} { "name": "Brazil supplier post-registration", "description": "Mark a supplier as registered", "schema": "org/party", "steps": [ { "id": "ec727530-b648-11f0-8ddf-b9fd6fa99d97", "name": "Set state", "provider": "silo.state", "summary": "Set state to `registered`{.state .registered}", "config": { "state": "registered" } } ], "rescue": [ { "id": "9a7b3d50-1358-11ef-af96-a18cfb3774fa", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` [Add to my workspace →](https://console.invopop.com/redirect/workflows/new?template=br-dfe-postregistration) This workflow registers a supplier so it can issue electronic fiscal documents from this workspace. ```json Example NFC/NFS-e register supplier workflow theme={"system"} { "name": "NFC/NFS-e register supplier", "description": "Register a supplier to issue NFC/NFS-e in Brazil", "schema": "org/party", "steps": [ { "id": "68e5abd0-b64b-11f0-8ddf-b9fd6fa99d97", "name": "Sign envelope", "provider": "silo.close" }, { "id": "6f0a6500-b64b-11f0-8ddf-b9fd6fa99d97", "name": "Register supplier in Brazil", "provider": "nfe-br.register" }, { "id": "71918510-b64b-11f0-8ddf-b9fd6fa99d97", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } } ], "rescue": [ { "id": "7d127750-b64b-11f0-8ddf-b9fd6fa99d97", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` [Add to my workspace →](https://console.invopop.com/redirect/workflows/new?template=br-dfe-register-supplier) This workflow removes a supplier's registration so it can no longer issue electronic fiscal documents from this workspace. ```json Example NFC/NFS-e unregister supplier workflow theme={"system"} { "name": "NFC/NFS-e unregister supplier", "description": "Unregister a supplier from issuing NFC/NFS-e in Brazil", "schema": "org/party", "steps": [ { "id": "1b9bfd47-701c-4834-b219-dc58da8cf51b", "name": "Unregister supplier in Brazil", "provider": "nfe-br.unregister" }, { "id": "710ca93c-7f2e-4999-9209-ae358d5dbad0", "name": "Set state", "provider": "silo.state", "summary": "Set state to `void`{.state .void}", "config": { "state": "void" } } ], "rescue": [ { "id": "2c1f292c-7bd5-4588-971f-8adeb12ade7a", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` [Add to my workspace →](https://console.invopop.com/redirect/workflows/new?template=br-dfe-unregister-supplier) Invoice documents: In this example, we're issuing a simple service invoice (NFS-e) from a Brazilian supplier to another Brazilian business customer. Notice: * we've added the [`br-nfse-v1`](https://docs.gobl.org/addons/br-nfse-v1) addon; this ensures the document will be validated using the NFS-e rules built into the [GOBL](https://docs.gobl.org) library, * extensions (`ext`) and identities have been used in multiple locations for fields whose values cannot be determined any other way, * ISS percentage is provided explicitly as it varies depending on the municipality and type of service, * there are no totals or calculations; all these will be made automatically when uploading, and, * make sure to process it with the "DF-e issue service invoice (NFS-e)" workflow created during setup. ```json B2B Service Invoice (NFS-e) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "br-nfse-v1" ], "series": "XXBR", "supplier": { "name": "TechNova Soluções Digitais Ltda.", "tax_id": { "country": "BR", "code": "05229829000184" }, "identities": [ { "key": "br-nfse-municipal-reg", "code": "45678901234567" } ], "addresses": [ { "num": "101", "street": "Avenida Paulista", "locality": "Bela Vista", "region": "São Paulo", "state": "SP", "code": "01311-000", "country": "BR" } ], "emails": [ { "addr": "contact@technova.test" } ], "ext": { "br-ibge-municipality": "3550308", "br-nfse-simples": "1" } }, "customer": { "name": "Construforte Engenharia Ltda.", "tax_id": { "country": "BR", "code": "46602178000103" }, "addresses": [ { "num": "75", "street": "Avenida Sete de Setembro", "street_extra": "Bloco C", "locality": "Centro", "region": "Salvador", "state": "BA", "code": "40060-000", "country": "BR" } ] }, "lines": [ { "quantity": "15", "item": { "name": "Consultancy Services", "price": "100.00", "ext": { "br-nfse-cnae": "62.01-5-01", "br-nfse-service": "10.5" } }, "taxes": [ { "cat": "ISS", "percent": "15%" } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "BR", "$addons": [ "br-nfse-v1" ], "type": "standard", "series": "XXBR", "issue_date": "2026-07-08", "currency": "BRL", "supplier": { "name": "TechNova Soluções Digitais Ltda.", "tax_id": { "country": "BR", "code": "05229829000184" }, "identities": [ { "key": "br-nfse-municipal-reg", "code": "45678901234567" } ], "addresses": [ { "num": "101", "street": "Avenida Paulista", "locality": "Bela Vista", "region": "São Paulo", "state": "SP", "code": "01311-000", "country": "BR" } ], "emails": [ { "addr": "contact@technova.test" } ], "ext": { "br-ibge-municipality": "3550308", "br-nfse-fiscal-incentive": "2", "br-nfse-simples": "1" } }, "customer": { "name": "Construforte Engenharia Ltda.", "tax_id": { "country": "BR", "code": "46602178000103" }, "addresses": [ { "num": "75", "street": "Avenida Sete de Setembro", "street_extra": "Bloco C", "locality": "Centro", "region": "Salvador", "state": "BA", "code": "40060-000", "country": "BR" } ] }, "lines": [ { "i": 1, "quantity": "15", "item": { "name": "Consultancy Services", "price": "100.00", "ext": { "br-nfse-cnae": "62.01-5-01", "br-nfse-service": "10.5" } }, "sum": "1500.00", "taxes": [ { "cat": "ISS", "percent": "15%", "ext": { "br-nfse-iss-liability": "1" } } ], "total": "1500.00" } ], "totals": { "sum": "1500.00", "total": "1500.00", "taxes": { "categories": [ { "code": "ISS", "informative": true, "rates": [ { "ext": { "br-nfse-iss-liability": "1" }, "base": "1500.00", "percent": "15%", "amount": "225.00" } ], "amount": "225.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "1500.00", "payable": "1500.00" } } ``` In this example, we're issuing a simple service invoice (NFS-e) with the currently supported RTC (Tax Reform) fields. Notice the differences from the previous example: * we've set the [`br-nfse-operation`](https://docs.gobl.org/addons/br-nfse-v1#operation-indicator) extension, the [`br-nfse-tax-status`](https://docs.gobl.org/addons/br-nfse-v1#tax-status-code-cst) extension and the [`br-nfse-tax-class`](https://docs.gobl.org/addons/br-nfse-v1#tax-classification-code) extension at item level which will be used to determine the IBS and CBS taxes as part of the tax reform. ```json B2B Service Invoice (NFS-e) RTC theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "br-nfse-v1" ], "series": "XXBR", "supplier": { "name": "TechNova Soluções Digitais Ltda.", "tax_id": { "country": "BR", "code": "05229829000184" }, "identities": [ { "key": "br-nfse-municipal-reg", "code": "45678901234567" } ], "addresses": [ { "num": "101", "street": "Avenida Paulista", "locality": "Bela Vista", "region": "São Paulo", "state": "SP", "code": "01311-000", "country": "BR" } ], "emails": [ { "addr": "contact@technova.test" } ], "ext": { "br-ibge-municipality": "3550308", "br-nfse-simples": "1" } }, "customer": { "name": "Construforte Engenharia Ltda.", "tax_id": { "country": "BR", "code": "46602178000103" }, "addresses": [ { "num": "75", "street": "Avenida Sete de Setembro", "street_extra": "Bloco C", "locality": "Centro", "region": "Salvador", "state": "BA", "code": "40060-000", "country": "BR" } ] }, "lines": [ { "quantity": "15", "item": { "name": "Consultancy Services", "price": "100.00", "ext": { "br-nfse-cnae": "62.01-5-01", "br-nfse-operation": "030101", "br-nfse-service": "10.5", "br-nfse-tax-class": "000001", "br-nfse-tax-status": "000" } }, "taxes": [ { "cat": "ISS", "percent": "15%" } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "BR", "$addons": [ "br-nfse-v1" ], "type": "standard", "series": "XXBR", "issue_date": "2026-07-08", "currency": "BRL", "supplier": { "name": "TechNova Soluções Digitais Ltda.", "tax_id": { "country": "BR", "code": "05229829000184" }, "identities": [ { "key": "br-nfse-municipal-reg", "code": "45678901234567" } ], "addresses": [ { "num": "101", "street": "Avenida Paulista", "locality": "Bela Vista", "region": "São Paulo", "state": "SP", "code": "01311-000", "country": "BR" } ], "emails": [ { "addr": "contact@technova.test" } ], "ext": { "br-ibge-municipality": "3550308", "br-nfse-fiscal-incentive": "2", "br-nfse-simples": "1" } }, "customer": { "name": "Construforte Engenharia Ltda.", "tax_id": { "country": "BR", "code": "46602178000103" }, "addresses": [ { "num": "75", "street": "Avenida Sete de Setembro", "street_extra": "Bloco C", "locality": "Centro", "region": "Salvador", "state": "BA", "code": "40060-000", "country": "BR" } ] }, "lines": [ { "i": 1, "quantity": "15", "item": { "name": "Consultancy Services", "price": "100.00", "ext": { "br-nfse-cnae": "62.01-5-01", "br-nfse-operation": "030101", "br-nfse-service": "10.5", "br-nfse-tax-class": "000001", "br-nfse-tax-status": "000" } }, "sum": "1500.00", "taxes": [ { "cat": "ISS", "percent": "15%", "ext": { "br-nfse-iss-liability": "1" } } ], "total": "1500.00" } ], "totals": { "sum": "1500.00", "total": "1500.00", "taxes": { "categories": [ { "code": "ISS", "informative": true, "rates": [ { "ext": { "br-nfse-iss-liability": "1" }, "base": "1500.00", "percent": "15%", "amount": "225.00" } ], "amount": "225.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "1500.00", "payable": "1500.00" } } ``` In this example, we're issuing an extended product invoice (NF-e) from a Brazilian supplier to another Brazilian business customer. Notice: * we've added the [`br-nfe-v4`](https://docs.gobl.org/addons/br-nfe-v4) addon without the `simplified` tag; this sets the [`br-nfe-model`](https://docs.gobl.org/addons/br-nfe-v4#model) extension to `55` (NF-e), * the customer is required for NF-e and must include a full address; Brazilian customers must declare the [`br-ibge-municipality`](https://docs.gobl.org/addons/br-nfe-v4#municipality-code) extension and a valid state, while foreign customers can be identified by a country-qualified `identity` (e.g. a passport) instead of a `tax_id`, * supplier and customer addresses must include a `country`; it is auto-filled from the party's tax ID (or first identity that declares a country) when omitted, * each line must include a [`br-nfe-cfop`](https://docs.gobl.org/addons/br-nfe-v4#cfop-fiscal-operations-and-services-code) extension to classify the fiscal operation, * item identities carry the NCM product classification code (`cProd` in the NF-e XML) and the GTIN barcode (`cEAN`), * `item.ref` maps to the supplier's internal product code, and `item.unit` is converted to a UNECE unit code, * line `discounts` reduce the taxable base (`vDesc`); line `charges` with key `delivery` map to freight (`vFrete`) and key `insurance` to insurance value (`vSeg`), * `line.order` provides the line reference within the purchase order (`nItemPed`), * a line `notes` entry with key `goods` maps to per-item additional information (`infAdProd`), * `ordering.code` sets the purchase order number (`nPed` in `compra`) and `ordering.contracts[0].code` sets the contract number (`nCont`), * `delivery.receiver` sets a separate delivery address (`entrega`) when goods ship to a different location than the buyer's fiscal address, * the payment instructions key is set to `credit-transfer`, which causes the [`br-nfe-payment-means`](https://docs.gobl.org/addons/br-nfe-v4#payment-method) extension to be set automatically to `18` (transferência bancária), * a `general` note maps to complementary information (`infCpl`) in the NF-e XML, * tax percentages are provided explicitly as they vary depending on the state and type of goods, * there are no totals or calculations; all these will be made automatically when uploading, and, * make sure to process it with the "DF-e issue product invoice (NF-e)" workflow created during setup. ```json B2B Product Invoice (NF-e) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "br-nfe-v4" ], "series": "1", "issue_date": "2026-05-22", "tax": { "ext": { "br-nfe-model": "55", "br-nfe-presence": "2" } }, "supplier": { "name": "TechNova Soluções Digitais Ltda.", "tax_id": { "country": "BR", "code": "05229829000184" }, "identities": [ { "key": "br-nfe-state-reg", "code": "12345678901234" } ], "addresses": [ { "num": "101", "street": "Avenida Paulista", "locality": "Bela Vista", "region": "São Paulo", "state": "SP", "code": "01311-000", "country": "BR" } ], "emails": [ { "addr": "contact@technova.test" } ], "ext": { "br-ibge-municipality": "3550308" } }, "customer": { "name": "Construforte Engenharia Ltda.", "tax_id": { "country": "BR", "code": "46602178000103" }, "addresses": [ { "num": "75", "street": "Avenida Sete de Setembro", "street_extra": "Bloco C", "locality": "Centro", "region": "Salvador", "state": "BA", "code": "40060-000", "country": "BR" } ], "ext": { "br-ibge-municipality": "2927408" } }, "ordering": { "code": "PED-2026-0547", "contracts": [ { "code": "CON-2026-015" } ] }, "delivery": { "receiver": { "name": "Construforte Engenharia Ltda.", "tax_id": { "country": "BR", "code": "46602178000103" }, "addresses": [ { "num": "1200", "street": "Avenida ACM", "locality": "Caminho das Árvores", "region": "Salvador", "state": "BA", "code": "41820-014", "country": "BR" } ], "ext": { "br-ibge-municipality": "2927408" } } }, "lines": [ { "quantity": "10", "order": "1", "item": { "ref": "USB-C-2M", "name": "Cabo USB-C 2 metros", "unit": "piece", "price": "28.90", "identities": [ { "key": "ncm", "code": "85444290" }, { "key": "gtin", "code": "7891234567890" } ] }, "discounts": [ { "percent": "5%", "reason": "Desconto comercial" } ], "charges": [ { "key": "delivery", "amount": "15.00" }, { "key": "insurance", "amount": "5.00" } ], "notes": [ { "key": "goods", "text": "Cabo homologado para carregamento rápido." } ], "taxes": [ { "cat": "ICMS", "percent": "12.0%" }, { "cat": "PIS", "percent": "1.65%" }, { "cat": "COFINS", "percent": "7.60%" } ], "ext": { "br-nfe-cfop": "6102" } } ], "payment": { "instructions": { "key": "credit-transfer" } }, "notes": [ { "key": "reason", "text": "Venda de Mercadorias" }, { "key": "general", "text": "Pedido nº 2026/0547." } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "BR", "$addons": [ "br-nfe-v4" ], "type": "standard", "series": "1", "issue_date": "2026-05-22", "currency": "BRL", "tax": { "ext": { "br-nfe-model": "55", "br-nfe-operation-type": "1", "br-nfe-presence": "2", "br-nfe-purpose": "1" } }, "supplier": { "name": "TechNova Soluções Digitais Ltda.", "tax_id": { "country": "BR", "code": "05229829000184" }, "identities": [ { "key": "br-nfe-state-reg", "code": "12345678901234" } ], "addresses": [ { "num": "101", "street": "Avenida Paulista", "locality": "Bela Vista", "region": "São Paulo", "state": "SP", "code": "01311-000", "country": "BR" } ], "emails": [ { "addr": "contact@technova.test" } ], "ext": { "br-ibge-municipality": "3550308", "br-nfe-regime": "3" } }, "customer": { "name": "Construforte Engenharia Ltda.", "tax_id": { "country": "BR", "code": "46602178000103" }, "addresses": [ { "num": "75", "street": "Avenida Sete de Setembro", "street_extra": "Bloco C", "locality": "Centro", "region": "Salvador", "state": "BA", "code": "40060-000", "country": "BR" } ], "ext": { "br-ibge-municipality": "2927408" } }, "lines": [ { "i": 1, "quantity": "10", "order": "1", "item": { "ref": "USB-C-2M", "name": "Cabo USB-C 2 metros", "identities": [ { "key": "ncm", "code": "85444290" }, { "key": "gtin", "code": "7891234567890" } ], "price": "28.90", "unit": "piece" }, "sum": "289.00", "discounts": [ { "reason": "Desconto comercial", "percent": "5%", "amount": "14.45" } ], "charges": [ { "key": "delivery", "amount": "15.00" }, { "key": "insurance", "amount": "5.00" } ], "taxes": [ { "cat": "ICMS", "percent": "12.0%", "ext": { "br-nfe-icms-cst": "00", "br-nfe-icms-origin": "0" } }, { "cat": "PIS", "percent": "1.65%", "ext": { "br-nfe-pis-cst": "01" } }, { "cat": "COFINS", "percent": "7.60%", "ext": { "br-nfe-cofins-cst": "01" } } ], "total": "294.55", "notes": [ { "key": "goods", "text": "Cabo homologado para carregamento rápido." } ], "ext": { "br-nfe-cfop": "6102" } } ], "ordering": { "code": "PED-2026-0547", "contracts": [ { "code": "CON-2026-015" } ] }, "payment": { "instructions": { "key": "credit-transfer", "ext": { "br-nfe-payment-means": "18" } } }, "delivery": { "receiver": { "name": "Construforte Engenharia Ltda.", "tax_id": { "country": "BR", "code": "46602178000103" }, "addresses": [ { "num": "1200", "street": "Avenida ACM", "locality": "Caminho das Árvores", "region": "Salvador", "state": "BA", "code": "41820-014", "country": "BR" } ], "ext": { "br-ibge-municipality": "2927408" } } }, "totals": { "sum": "294.55", "total": "294.55", "taxes": { "categories": [ { "code": "ICMS", "informative": true, "rates": [ { "ext": { "br-nfe-icms-cst": "00", "br-nfe-icms-origin": "0" }, "base": "294.55", "percent": "12.0%", "amount": "35.35" } ], "amount": "35.35" }, { "code": "PIS", "informative": true, "rates": [ { "ext": { "br-nfe-pis-cst": "01" }, "base": "294.55", "percent": "1.65%", "amount": "4.86" } ], "amount": "4.86" }, { "code": "COFINS", "informative": true, "rates": [ { "ext": { "br-nfe-cofins-cst": "01" }, "base": "294.55", "percent": "7.60%", "amount": "22.39" } ], "amount": "22.39" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "294.55", "payable": "294.55" }, "notes": [ { "key": "reason", "text": "Venda de Mercadorias" }, { "key": "general", "text": "Pedido nº 2026/0547." } ] } ``` In this example, we're issuing a product invoice (NF-e) from a supplier enrolled in the *Simples Nacional* tax regime. Notice the differences from the previous example: * the supplier declares its regime with the [`br-nfe-regime`](https://docs.gobl.org/addons/br-nfe-v4#tax-regime-code) extension set to `1` (*Simples Nacional*); `4` (*MEI*) behaves the same, while `2` (*Simples Nacional, Excess*) uses CST codes like the normal regime (`3`, the default), * each ICMS line carries the [`br-nfe-icms-csosn`](https://docs.gobl.org/addons/br-nfe-v4#icms-simples-nacional-status-code-csosn) extension (here `101`, taxed with credit permission) instead of the `br-nfe-icms-cst` code that normal-regime issuers use, * with CSOSN `101` the ICMS `percent` is not a charged tax: it represents the *Simples Nacional* credit rate (`pCredSN` in the NF-e XML) and the resulting amount becomes the credit value the buyer may take (`vCredICMSSN`), * CSOSN `101` transfers a tax credit and is only accepted when the customer is an ICMS taxpayer, so the customer includes a `br-nfe-state-reg` identity with its state registration number, * PIS and COFINS are still required on every line but are not levied per item under *Simples Nacional*, so they use the [`br-nfe-pis-cst`](https://docs.gobl.org/addons/br-nfe-v4#pis-tax-status-code-cst) and [`br-nfe-cofins-cst`](https://docs.gobl.org/addons/br-nfe-v4#cofins-tax-status-code-cst) extensions set to `49` (other operations) at a `0%` rate, * there are no totals or calculations; all these will be made automatically when uploading, and, * make sure to process it with the "DF-e issue product invoice (NF-e)" workflow created during setup. ```json B2B Product Invoice — Simples Nacional (NF-e) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "br-nfe-v4" ], "series": "1", "tax": { "ext": { "br-nfe-presence": "1" } }, "supplier": { "name": "Marcenaria Arte & Design ME", "tax_id": { "country": "BR", "code": "21586733000120" }, "identities": [ { "key": "br-nfe-state-reg", "code": "0623458900" } ], "addresses": [ { "num": "85", "street": "Rua dos Artesãos", "locality": "Savassi", "region": "Minas Gerais", "state": "MG", "code": "30140-071", "country": "BR" } ], "emails": [ { "addr": "contato@artedesign.com.br" } ], "ext": { "br-ibge-municipality": "3106200", "br-nfe-regime": "1" } }, "customer": { "name": "Comércio de Móveis Paulista Ltda.", "tax_id": { "country": "BR", "code": "33944792000101" }, "identities": [ { "key": "br-nfe-state-reg", "code": "112233445566" } ], "addresses": [ { "num": "742", "street": "Avenida Paulista", "locality": "Bela Vista", "region": "São Paulo", "state": "SP", "code": "01310-100", "country": "BR" } ], "ext": { "br-ibge-municipality": "3550308" } }, "lines": [ { "quantity": "5", "item": { "name": "Mesa de Jantar em Madeira Maciça", "price": "900.00", "identities": [ { "key": "ncm", "code": "94036000" } ] }, "taxes": [ { "cat": "ICMS", "percent": "2.56%", "ext": { "br-nfe-icms-csosn": "101" } }, { "cat": "PIS", "percent": "0%", "ext": { "br-nfe-pis-cst": "49" } }, { "cat": "COFINS", "percent": "0%", "ext": { "br-nfe-cofins-cst": "49" } } ], "ext": { "br-nfe-cfop": "6102" } } ], "payment": { "instructions": { "key": "credit-transfer" } }, "notes": [ { "key": "reason", "text": "Venda de mercadoria" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "BR", "$addons": [ "br-nfe-v4" ], "type": "standard", "series": "1", "issue_date": "2026-07-28", "currency": "BRL", "tax": { "ext": { "br-nfe-model": "55", "br-nfe-operation-type": "1", "br-nfe-presence": "1", "br-nfe-purpose": "1" } }, "supplier": { "name": "Marcenaria Arte \u0026 Design ME", "tax_id": { "country": "BR", "code": "21586733000120" }, "identities": [ { "key": "br-nfe-state-reg", "code": "0623458900" } ], "addresses": [ { "num": "85", "street": "Rua dos Artesãos", "locality": "Savassi", "region": "Minas Gerais", "state": "MG", "code": "30140-071", "country": "BR" } ], "emails": [ { "addr": "contato@artedesign.com.br" } ], "ext": { "br-ibge-municipality": "3106200", "br-nfe-regime": "1" } }, "customer": { "name": "Comércio de Móveis Paulista Ltda.", "tax_id": { "country": "BR", "code": "33944792000101" }, "identities": [ { "key": "br-nfe-state-reg", "code": "112233445566" } ], "addresses": [ { "num": "742", "street": "Avenida Paulista", "locality": "Bela Vista", "region": "São Paulo", "state": "SP", "code": "01310-100", "country": "BR" } ], "ext": { "br-ibge-municipality": "3550308" } }, "lines": [ { "i": 1, "quantity": "5", "item": { "name": "Mesa de Jantar em Madeira Maciça", "identities": [ { "key": "ncm", "code": "94036000" } ], "price": "900.00" }, "sum": "4500.00", "taxes": [ { "cat": "ICMS", "percent": "2.56%", "ext": { "br-nfe-icms-csosn": "101", "br-nfe-icms-origin": "0" } }, { "cat": "PIS", "percent": "0%", "ext": { "br-nfe-pis-cst": "49" } }, { "cat": "COFINS", "percent": "0%", "ext": { "br-nfe-cofins-cst": "49" } } ], "total": "4500.00", "ext": { "br-nfe-cfop": "6102" } } ], "payment": { "instructions": { "key": "credit-transfer", "ext": { "br-nfe-payment-means": "18" } } }, "totals": { "sum": "4500.00", "total": "4500.00", "taxes": { "categories": [ { "code": "ICMS", "informative": true, "rates": [ { "ext": { "br-nfe-icms-csosn": "101", "br-nfe-icms-origin": "0" }, "base": "4500.00", "percent": "2.56%", "amount": "115.20" } ], "amount": "115.20" }, { "code": "PIS", "informative": true, "rates": [ { "ext": { "br-nfe-pis-cst": "49" }, "base": "4500.00", "percent": "0%", "amount": "0.00" } ], "amount": "0.00" }, { "code": "COFINS", "informative": true, "rates": [ { "ext": { "br-nfe-cofins-cst": "49" }, "base": "4500.00", "percent": "0%", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "4500.00", "payable": "4500.00" }, "notes": [ { "key": "reason", "text": "Venda de mercadoria" } ] } ``` In this example, we're issuing a NF-e that fully returns the goods of a previously issued B2B product invoice — a *devolução total* under the pre-reform (pre-RTC) rules. Notice the differences from a standard product invoice: * the document `type` is `credit-note`; it keeps the [`br-nfe-v4`](https://docs.gobl.org/addons/br-nfe-v4) addon and is still issued as an NF-e, so [`br-nfe-model`](https://docs.gobl.org/addons/br-nfe-v4#fiscal-document-model-code) is derived as `55`, * a `preceding` entry references the original NF-e and carries its SEFAZ access key (*chave de acesso*) as a stamp — you can copy it from the `sefaz-key` entry in the `stamps` array of the original invoice's envelope `head`, where it was added once the tax authority authorized the document, * because this is a full return, the [`br-nfe-purpose`](https://docs.gobl.org/addons/br-nfe-v4#purpose-code) extension is set to `4` (*Goods Return*) and the [`br-nfe-operation-type`](https://docs.gobl.org/addons/br-nfe-v4#operation-type-code) extension to `0` (*Inbound / Entrada*), since the returned goods re-enter the supplier; standard invoices set these automatically to `1` (normal) and `1` (outbound), but corrective documents must set both explicitly, * no [`br-nfe-credit-note-type`](https://docs.gobl.org/addons/br-nfe-v4#credit-note-type-code) extension is used: that field only applies to post-reform IBS/CBS credit notes (those set `br-nfe-purpose` to `5`), * the line [`br-nfe-cfop`](https://docs.gobl.org/addons/br-nfe-v4#cfop-fiscal-operations-and-services-code) is a return code — `2202` (*Devolução de venda de mercadoria adquirida ou recebida de terceiros*) — mirroring the original `6102` sale but recorded as an inbound inter-state operation (CFOP starting with `2`), * the payment sets the [`br-nfe-payment-means`](https://docs.gobl.org/addons/br-nfe-v4#payment-method) extension to `90` (*No payment*), as a return does not involve a new payment, * there are no totals or calculations; all these will be made automatically when uploading, and, * make sure to process it with the "DF-e issue product invoice (NF-e)" workflow created during setup. ```json Credit Note — Full Return (NF-e) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "br-nfe-v4" ], "type": "credit-note", "series": "1", "issue_date": "2024-11-20", "tax": { "ext": { "br-nfe-presence": "1", "br-nfe-purpose": "4", "br-nfe-operation-type": "0" } }, "preceding": [ { "type": "standard", "series": "1", "code": "1", "issue_date": "2024-11-15", "stamps": [ { "prv": "sefaz-key", "val": "35241105229829000184550010000000011000000019" } ] } ], "supplier": { "name": "TechNova Soluções Digitais Ltda.", "tax_id": { "country": "BR", "code": "05229829000184" }, "identities": [ { "key": "br-nfe-state-reg", "code": "12345678901234" } ], "addresses": [ { "num": "101", "street": "Avenida Paulista", "locality": "Bela Vista", "region": "São Paulo", "state": "SP", "code": "01311-000", "country": "BR" } ], "emails": [ { "addr": "contact@technova.test" } ], "ext": { "br-ibge-municipality": "3550308" } }, "customer": { "name": "Construforte Engenharia Ltda.", "tax_id": { "country": "BR", "code": "46602178000103" }, "addresses": [ { "num": "75", "street": "Avenida Sete de Setembro", "street_extra": "Bloco C", "locality": "Centro", "region": "Salvador", "state": "BA", "code": "40060-000", "country": "BR" } ], "ext": { "br-ibge-municipality": "2927408" } }, "lines": [ { "quantity": "10", "item": { "name": "Cabo USB-C 2 metros", "price": "28.90", "identities": [ { "key": "ncm", "code": "85444290" } ] }, "taxes": [ { "cat": "ICMS", "percent": "12.0%" }, { "cat": "PIS", "percent": "1.65%" }, { "cat": "COFINS", "percent": "7.60%" } ], "ext": { "br-nfe-cfop": "2202" } } ], "payment": { "instructions": { "key": "other", "ext": { "br-nfe-payment-means": "90" } } }, "notes": [ { "key": "reason", "text": "Devolução total de mercadoria" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "BR", "$addons": [ "br-nfe-v4" ], "type": "credit-note", "series": "1", "issue_date": "2024-11-20", "currency": "BRL", "preceding": [ { "type": "standard", "issue_date": "2024-11-15", "series": "1", "code": "1", "stamps": [ { "prv": "sefaz-key", "val": "35241105229829000184550010000000011000000019" } ] } ], "tax": { "ext": { "br-nfe-model": "55", "br-nfe-operation-type": "0", "br-nfe-presence": "1", "br-nfe-purpose": "4" } }, "supplier": { "name": "TechNova Soluções Digitais Ltda.", "tax_id": { "country": "BR", "code": "05229829000184" }, "identities": [ { "key": "br-nfe-state-reg", "code": "12345678901234" } ], "addresses": [ { "num": "101", "street": "Avenida Paulista", "locality": "Bela Vista", "region": "São Paulo", "state": "SP", "code": "01311-000", "country": "BR" } ], "emails": [ { "addr": "contact@technova.test" } ], "ext": { "br-ibge-municipality": "3550308", "br-nfe-regime": "3" } }, "customer": { "name": "Construforte Engenharia Ltda.", "tax_id": { "country": "BR", "code": "46602178000103" }, "addresses": [ { "num": "75", "street": "Avenida Sete de Setembro", "street_extra": "Bloco C", "locality": "Centro", "region": "Salvador", "state": "BA", "code": "40060-000", "country": "BR" } ], "ext": { "br-ibge-municipality": "2927408" } }, "lines": [ { "i": 1, "quantity": "10", "item": { "name": "Cabo USB-C 2 metros", "identities": [ { "key": "ncm", "code": "85444290" } ], "price": "28.90" }, "sum": "289.00", "taxes": [ { "cat": "ICMS", "percent": "12.0%", "ext": { "br-nfe-icms-cst": "00", "br-nfe-icms-origin": "0" } }, { "cat": "PIS", "percent": "1.65%", "ext": { "br-nfe-pis-cst": "01" } }, { "cat": "COFINS", "percent": "7.60%", "ext": { "br-nfe-cofins-cst": "01" } } ], "total": "289.00", "ext": { "br-nfe-cfop": "2202" } } ], "payment": { "instructions": { "key": "other", "ext": { "br-nfe-payment-means": "90" } } }, "totals": { "sum": "289.00", "total": "289.00", "taxes": { "categories": [ { "code": "ICMS", "informative": true, "rates": [ { "ext": { "br-nfe-icms-cst": "00", "br-nfe-icms-origin": "0" }, "base": "289.00", "percent": "12.0%", "amount": "34.68" } ], "amount": "34.68" }, { "code": "PIS", "informative": true, "rates": [ { "ext": { "br-nfe-pis-cst": "01" }, "base": "289.00", "percent": "1.65%", "amount": "4.77" } ], "amount": "4.77" }, { "code": "COFINS", "informative": true, "rates": [ { "ext": { "br-nfe-cofins-cst": "01" }, "base": "289.00", "percent": "7.60%", "amount": "21.96" } ], "amount": "21.96" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "289.00", "payable": "289.00" }, "notes": [ { "key": "reason", "text": "Devolução total de mercadoria" } ] } ``` In this example, we're issuing a simple consumer invoice (NFC-e) from a Brazilian supplier. Notice: * we've added the [`br-nfe-v4`](https://docs.gobl.org/addons/br-nfe-v4) addon with the `simplified` tag; this sets the [`br-nfe-model`](https://docs.gobl.org/addons/br-nfe-v4#model) extension to `65` (NFC-e), * the customer is optional and in this example we've omitted it, * extensions (`ext`) and identities have been used in multiple locations for fields whose values cannot be determined any other way, * each line must include a [`br-nfe-cfop`](https://docs.gobl.org/addons/br-nfe-v4#cfop-fiscal-operations-and-services-code) extension to classify the fiscal operation, just as on an NF-e, * the payment instructions key is set to `card`, which causes the [`br-nfe-payment-means`](https://docs.gobl.org/addons/br-nfe-v4#payment-method) extension to be set automatically to `03` (cartão de crédito), * tax percentages are provided explicitly as they vary depending on the state and type of goods, * there are no totals or calculations; all these will be made automatically when uploading, and, * make sure to process it with the "DF-e issue consumer invoice (NFC-e)" workflow created during setup. ```json B2C Consumer Invoice (NFC-e) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "br-nfe-v4" ], "$tags": [ "simplified" ], "series": "123", "tax": { "ext": { "br-nfe-presence": "1" } }, "supplier": { "name": "TechNova Soluções Digitais Ltda.", "tax_id": { "country": "BR", "code": "05229829000184" }, "identities": [ { "key": "br-nfe-state-reg", "code": "12345678901234" } ], "addresses": [ { "num": "101", "street": "Avenida Paulista", "locality": "Bela Vista", "region": "São Paulo", "state": "SP", "code": "01311-000", "country": "BR" } ], "emails": [ { "addr": "contact@technova.test" } ], "ext": { "br-ibge-municipality": "3550308", "br-nfse-simples": "1" } }, "lines": [ { "quantity": "2", "item": { "name": "Cabo USB-C 2 metros", "price": "28.90" }, "taxes": [ { "cat": "ICMS", "percent": "18.0%" }, { "cat": "PIS", "percent": "1.65%" }, { "cat": "COFINS", "percent": "7.60%" } ], "ext": { "br-nfe-cfop": "5102" } } ], "payment": { "instructions": { "key": "card" } }, "notes": [ { "key": "reason", "text": "Venda de mercadoria" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "BR", "$addons": [ "br-nfe-v4" ], "$tags": [ "simplified" ], "type": "standard", "series": "123", "issue_date": "2026-07-28", "currency": "BRL", "tax": { "ext": { "br-nfe-model": "65", "br-nfe-operation-type": "1", "br-nfe-presence": "1", "br-nfe-purpose": "1" } }, "supplier": { "name": "TechNova Soluções Digitais Ltda.", "tax_id": { "country": "BR", "code": "05229829000184" }, "identities": [ { "key": "br-nfe-state-reg", "code": "12345678901234" } ], "addresses": [ { "num": "101", "street": "Avenida Paulista", "locality": "Bela Vista", "region": "São Paulo", "state": "SP", "code": "01311-000", "country": "BR" } ], "emails": [ { "addr": "contact@technova.test" } ], "ext": { "br-ibge-municipality": "3550308", "br-nfe-regime": "3", "br-nfse-simples": "1" } }, "lines": [ { "i": 1, "quantity": "2", "item": { "name": "Cabo USB-C 2 metros", "price": "28.90" }, "sum": "57.80", "taxes": [ { "cat": "ICMS", "percent": "18.0%", "ext": { "br-nfe-icms-cst": "00", "br-nfe-icms-origin": "0" } }, { "cat": "PIS", "percent": "1.65%", "ext": { "br-nfe-pis-cst": "01" } }, { "cat": "COFINS", "percent": "7.60%", "ext": { "br-nfe-cofins-cst": "01" } } ], "total": "57.80", "ext": { "br-nfe-cfop": "5102" } } ], "payment": { "instructions": { "key": "card", "ext": { "br-nfe-payment-means": "03" } } }, "totals": { "sum": "57.80", "total": "57.80", "taxes": { "categories": [ { "code": "ICMS", "informative": true, "rates": [ { "ext": { "br-nfe-icms-cst": "00", "br-nfe-icms-origin": "0" }, "base": "57.80", "percent": "18.0%", "amount": "10.40" } ], "amount": "10.40" }, { "code": "PIS", "informative": true, "rates": [ { "ext": { "br-nfe-pis-cst": "01" }, "base": "57.80", "percent": "1.65%", "amount": "0.95" } ], "amount": "0.95" }, { "code": "COFINS", "informative": true, "rates": [ { "ext": { "br-nfe-cofins-cst": "01" }, "base": "57.80", "percent": "7.60%", "amount": "4.39" } ], "amount": "4.39" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "57.80", "payable": "57.80" }, "notes": [ { "key": "reason", "text": "Venda de mercadoria" } ] } ``` In this example, we're issuing a consumer invoice (NFC-e) from a supplier enrolled in the *Simples Nacional* tax regime. Notice the differences from the previous example: * the supplier declares its regime with the [`br-nfe-regime`](https://docs.gobl.org/addons/br-nfe-v4#tax-regime-code) extension set to `1` (*Simples Nacional*), * ICMS carries the [`br-nfe-icms-csosn`](https://docs.gobl.org/addons/br-nfe-v4#icms-simples-nacional-status-code-csosn) extension set to `102` (taxed without credit permission) with a `0%` percent, * PIS and COFINS use the [`br-nfe-pis-cst`](https://docs.gobl.org/addons/br-nfe-v4#pis-tax-status-code-cst) and [`br-nfe-cofins-cst`](https://docs.gobl.org/addons/br-nfe-v4#cofins-tax-status-code-cst) extensions set to `49` (other operations) at a `0%` rate, * the line carries a [`br-nfe-cfop`](https://docs.gobl.org/addons/br-nfe-v4#cfop-fiscal-operations-and-services-code) extension set to `5102`, * all of these fields must be set explicitly (i.e., you have them in the minimal example), since the automatic defaults are the normal-regime ones: an ICMS line that omits the CSOSN fails validation, while an omitted PIS or COFINS CST silently falls back to `01`, * there are no totals or calculations; all these will be made automatically when uploading, and, * make sure to process it with the "DF-e issue consumer invoice (NFC-e)" workflow created during setup. ```json B2C Consumer Invoice — Simples Nacional (NFC-e) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "br-nfe-v4" ], "$tags": [ "simplified" ], "series": "123", "tax": { "ext": { "br-nfe-presence": "1" } }, "supplier": { "name": "Drogaria Vida Saudável Ltda.", "tax_id": { "country": "BR", "code": "55263640000186" }, "identities": [ { "key": "br-nfe-state-reg", "code": "35503304557308" } ], "addresses": [ { "num": "200", "street": "Rua Primeiro de Março", "street_extra": "Torre A", "locality": "Centro", "region": "Rio de Janeiro", "state": "RJ", "code": "20010-000", "country": "BR" } ], "emails": [ { "addr": "saudemais@example.com" } ], "ext": { "br-ibge-municipality": "3304557", "br-nfe-regime": "1" } }, "lines": [ { "quantity": "2", "item": { "name": "Caixa de Máscaras Cirúrgicas", "price": "10.00" }, "taxes": [ { "cat": "ICMS", "percent": "0%", "ext": { "br-nfe-icms-csosn": "102", "br-nfe-icms-origin": "0" } }, { "cat": "PIS", "percent": "0%", "ext": { "br-nfe-pis-cst": "49" } }, { "cat": "COFINS", "percent": "0%", "ext": { "br-nfe-cofins-cst": "49" } } ], "ext": { "br-nfe-cfop": "5102" } } ], "payment": { "instructions": { "key": "card" } }, "notes": [ { "key": "reason", "text": "Venda de mercadoria" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "BR", "$addons": [ "br-nfe-v4" ], "$tags": [ "simplified" ], "type": "standard", "series": "123", "issue_date": "2026-07-28", "currency": "BRL", "tax": { "ext": { "br-nfe-model": "65", "br-nfe-operation-type": "1", "br-nfe-presence": "1", "br-nfe-purpose": "1" } }, "supplier": { "name": "Drogaria Vida Saudável Ltda.", "tax_id": { "country": "BR", "code": "55263640000186" }, "identities": [ { "key": "br-nfe-state-reg", "code": "35503304557308" } ], "addresses": [ { "num": "200", "street": "Rua Primeiro de Março", "street_extra": "Torre A", "locality": "Centro", "region": "Rio de Janeiro", "state": "RJ", "code": "20010-000", "country": "BR" } ], "emails": [ { "addr": "saudemais@example.com" } ], "ext": { "br-ibge-municipality": "3304557", "br-nfe-regime": "1" } }, "lines": [ { "i": 1, "quantity": "2", "item": { "name": "Caixa de Máscaras Cirúrgicas", "price": "10.00" }, "sum": "20.00", "taxes": [ { "cat": "ICMS", "percent": "0%", "ext": { "br-nfe-icms-csosn": "102", "br-nfe-icms-origin": "0" } }, { "cat": "PIS", "percent": "0%", "ext": { "br-nfe-pis-cst": "49" } }, { "cat": "COFINS", "percent": "0%", "ext": { "br-nfe-cofins-cst": "49" } } ], "total": "20.00", "ext": { "br-nfe-cfop": "5102" } } ], "payment": { "instructions": { "key": "card", "ext": { "br-nfe-payment-means": "03" } } }, "totals": { "sum": "20.00", "total": "20.00", "taxes": { "categories": [ { "code": "ICMS", "informative": true, "rates": [ { "ext": { "br-nfe-icms-csosn": "102", "br-nfe-icms-origin": "0" }, "base": "20.00", "percent": "0%", "amount": "0.00" } ], "amount": "0.00" }, { "code": "PIS", "informative": true, "rates": [ { "ext": { "br-nfe-pis-cst": "49" }, "base": "20.00", "percent": "0%", "amount": "0.00" } ], "amount": "0.00" }, { "code": "COFINS", "informative": true, "rates": [ { "ext": { "br-nfe-cofins-cst": "49" }, "base": "20.00", "percent": "0%", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "20.00", "payable": "20.00" }, "notes": [ { "key": "reason", "text": "Venda de mercadoria" } ] } ``` Party documents: A CNPJ with the municipal and state registrations, IBGE municipality code, and Simples Nacional flag used by the DF-e flows. ```json Brazil supplier example for sandbox expandable theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "TechNova Soluções Digitais Ltda.", "tax_id": { "country": "BR", "code": "05229829000184" }, "identities": [ { "key": "br-nfse-municipal-reg", "code": "45678901234567" }, { "key": "br-nfe-state-reg", "code": "66093885154234" } ], "addresses": [ { "num": "101", "street": "Avenida Paulista", "locality": "Bela Vista", "region": "São Paulo", "state": "SP", "code": "01311-000", "country": "BR" } ], "emails": [ { "addr": "contact@technova.test" } ], "ext": { "br-ibge-municipality": "3550308", "br-nfse-simples": "1", "br-nfse-fiscal-incentive": "2", "br-nfse-special-regime": "6", "br-nfe-regime": "1", "br-nfe-fiscal-incentive": "2", "br-nfe-special-regime": "6" } } ``` A business customer with CNPJ, full address including state, and IBGE municipality code. ```json Brazil customer example theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "Comércio Aurora Ltda.", "tax_id": { "country": "BR", "code": "12345678000195" }, "addresses": [ { "num": "250", "street": "Rua das Laranjeiras", "locality": "Laranjeiras", "region": "Rio de Janeiro", "state": "RJ", "code": "22240-006", "country": "BR" } ], "emails": [ { "addr": "financeiro@comercioaurora.test" } ], "ext": { "br-ibge-municipality": "3304557" } } ```
*** | | | | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Compliance | [Invoicing compliance in Brazil](/compliance/brazil)
[Compliance timeline](/timelines/brazil) | | Apps | [Documentos Fiscais Eletrônicos Brazil](/apps/documentos-fiscais-electronicos-brazil) | | Guides | [Supplier registration](/guides/br-dfe-supplier)
[Issuing invoices](/guides/br-dfe) | | FAQ | [Brazil FAQ](/faq/brazil) | | GOBL | [Brazil Tax Regime](https://docs.gobl.org/regimes/br)
[Brazil NF-e Addon](https://docs.gobl.org/addons/br-nfe-v4)
[Brazil NFS-e Addon](https://docs.gobl.org/addons/br-nfse-v1) |
Ask and answer questions about Documentos Fiscais Eletrônicos Brazil App → # Email Source: https://docs.invopop.com/apps/email Send emails from your workflows, with or without attachments.
View implementation guide ›
| | | | --------- | ------------------------------ | | Developer | [Invopop](https://invopop.com) | | Category | Notify |
The Email app allows you to send emails directly from your workflows, making it easy to deliver invoices, notifications, and other messages to customers, suppliers, or any other recipients. You can send emails with file attachments (such as PDF invoices or XML files) or without attachments for simple notifications. You can send emails from `Company name ` by simply connecting the Email app. If you wish to send emails from your own domain such as `Company Name `, you can configure the app to use: * [Resend](https://resend.com) with a verified domain * [SendGrid](https://sendgrid.com) with an authenticated domain * An SMTP server authorized to send emails from your domain (Gmail, iCloud, Amazon SES, Microsoft 365) **Key features** * **Workflow automation:** Send emails automatically as part of your invoice processing workflows, ensuring timely delivery to customers. * **File attachments:** Automatically attach invoice PDFs, XML files, or other documents generated by your workflows. * **Template variables:** Use dynamic template variables in email subjects and bodies to personalize messages for each recipient. * **Custom variables:** Inject custom variables using job args for dynamic content like payment links or conditional text. * **Multiple recipients:** Send to multiple recipients, including automatic customer email detection, BCC support, and custom reply-to addresses. * **File compression:** Option to combine multiple attachments into a single ZIP file for easier delivery. * **Provider flexibility:** Choose from Invopop's email service, Resend, SendGrid, or your own SMTP server. Make sure to check out our [Email Guide](/guides/email) for instructions on how to configure senders, set up email providers, and customize your email templates.
The following workflow actions will be available once you install and enable this app:
1
Send billing documents via email.
1
Send a notification email.
The Email app fits into your existing workflows. Typically, you'll add the `Send email` step after you have issued an invoice via the corresponding tax authority and generated a PDF (if required). This ensures the necessary files are attached and that the invoice complies with local regulatory requirements. For simple notifications without attachments, you can use the `Notify via Email` action at any point in your workflow. See the [Email Guide](/guides/email) for detailed workflow setup instructions and configuration options.
*** Ask and answer questions about Email App → # Facturae Spain Source: https://docs.invopop.com/apps/facturae-spain Convert GOBL into the Spanish Facturae format
View implementation guide ›
| | | | --------- | ------------------------------ | | Developer | [Invopop](https://invopop.com) | | Category | Government | | Scope | B2G | | Country | [Spain](/compliance/spain) |
Invopop's **Facturae app** is designed to support fully compliant conversion from GOBL to Facturae 3.2.2 XML format. The generated XML invoice must be sent through the [FACe](https://face.gob.es/es) platform (or FACeB2B for B2B invoices). Each public body registers its [DIR3 codes](https://administracionelectronica.gob.es/ctt/verPestanaDescargas.htm?idIniciativa=dir3) identifying the accounting office, processing unit, and recipient office. **Facturae** is Spain’s official electronic invoicing format, defined and maintained by the Ministerio de Asuntos Económicos y Transformación Digital. It is an XML-based standard designed to ensure legally valid, structured e-invoices for business-to-government (B2G). **Key features** 1. **Generate Facturae invoices:** according to the Facturae 3.2.2 XML format. 2. **Adds required XAdES signature:** Facturae invoices must be digitally signed using an XAdES XML signature ## FAQ Invoicing questions You should send the credit note with the same sign as the original invoice. In Spain, unlike other countries, credit notes must be submitted to Hacienda with inverse values. Invopop handles this conversion automatically before transforming the credit note into a "factura rectificativa" (corrective invoice). This means you only need to send the credit note following international standards (with same sign as the invoice). Invopop will automatically adapt it when submitting to Hacienda. For reference, see the [GOBL Invoice](https://docs.gobl.org/draft-0/bill/invoice) documentation with `type` set to `credit-note`. See the [Spain tax regime in GOBL](https://docs.gobl.org/regimes/es) for tax categories, NIF rules, and Spanish-specific extensions. Subsystem-specific addons live alongside: [`es-verifactu-v1`](https://docs.gobl.org/addons/es-verifactu-v1), [`es-tbai-v1`](https://docs.gobl.org/addons/es-tbai-v1), [`es-facturae-v3`](https://docs.gobl.org/addons/es-facturae-v3). Invopop is working on direct FACe connection as part of the 2027 Crea y Crece mandate You submit the XML directly to the [FACe portal](https://face.gob.es/), Invopop does not submit it for you. FACe is the centralised entry point for all Spanish public administrations, and submission is the supplier's responsibility. You'll need: * A valid digital certificate (FNMT or DNIe). * The XML file Invopop generated (download it from the workflow output). * The three DIR3 administrative centres correctly embedded in the invoice — `Oficina Contable` (01), `Órgano Gestor` (02), `Unidad Tramitadora` (03). If these are wrong, FACe will reject the invoice. The receiving public body publishes their codes in the [DIR3 directory](https://directorio3.gob.es/). Submission options: * **FACe web portal**: manual upload, fine for low volumes. * **A registered FACe-compatible third party** (gestoría, ERP plugin, etc.). The generated XML will be added to your silo entry as an attachment under the "files" tab with the file name `facturae.xml`. Upload this file to [FACe's online validator](https://face.gob.es/es/facturas/validar-visualizar-facturas) to verify its validity. No — the Facturae app only converts GOBL to Facturae XML. Submit B2G invoices via [FACe](https://face.gob.es/es); tax reporting to the AEAT happens separately (e.g. through SII or VERI\*FACTU). Registering supplier questions We reject agreements when: * The uploaded document is not signed (they upload the unsigned template). * Users upload a handwritten signature without an ID. * The electronic signature is made with an FNMT certificate. * The agreement is missing a date or location. * The name is entered as an email address. The job will state the reason for rejection. A KO will be triggered and the supplier will be labelled with the `Error` state. We currently recommend sending a reminder to the supplier through a webhook. The registration link will not expire and the entity will still be able to upload their registration documents which will be validated. Should you choose to run this workflow again using this supplier, the supplier will be accepted or rejected immediately because the required documentation has already been provided and validated. If the uploaded agreement documents were rejected, a KO will be triggered and the supplier will be labelled with the `Error` state. We currently recommend sending a notification to the supplier through a webhook within the **Error Handling** section. Afterwards, if you wish to re-register the supplier with new documents, you must: 1. Unregister the supplier using the **Unregister Supplier workflow**. 2. Re-run the Register supplier workflow. This will restart the entire registration process. When uploading documents, the previously submitted agreement will appear selected by default. Simply choose a new file and click `Continue` to override the old one. See the image below for reference: Overriding the previously submitted agreement In order to complete the representation agreement you will need to provide the following information: **Company** 1. Name 2. NIF 3. Address **Legal representative** 1. Full name 2. Government ID type and number 3. Address ```json Spain supplier example theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "people": [ { "name": { "given": "Juan", "surname": "Pérez González" }, "identities": [ { "key": "national", "code": "123456789A" } ], "addresses": [ { "num": "10", "street": "Calle Ejemplo", "locality": "Madrid", "region": "Madrid", "code": "28020", "country": "ES" } ] } ], "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] } ``` If the entity is a self-employed individual (*autónomo*), only the information requested in the **Legal representative** section is required. ```json Spain autónomo supplier example theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "Juan Pérez González", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "autonomo@example.com" } ] } ``` The supplier can add their electronic signature to the PDF document ([instructions](https://helpx.adobe.com/acrobat/using/signing-pdfs.html)), or sign with a handwritten signature (we recommend using [Adobe's online service](https://www.adobe.com/acrobat/online/sign-pdf.html)). Individual documents are limited to a maximum size of 10MB. Uploads exceeding this size will result in an error. Facturae itself has no central registration — the supplier just needs to enrol on FACe (or the relevant regional portal) using their digital certificate. Invopop signs the XML; submission to FACe is currently manual via the supplier's account. Facturae requires an XAdES signature on the XML using a qualified certificate (FNMT *persona jurídica*, Cl\@ve, ACCV, etc.). Invopop signs with its own certificate by default; bring-your-own is supported on request. More Spain FAQs available in our [Spain FAQ](/faq/spain) section
The following workflow action will be available once you enable this app:
1
Convert GOBL invoices into Spanish Facturae XML files.
```json Facturae B2G Invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-facturae-v3" ], "code": "TEST01001F", "issue_date": "2021-12-08", "supplier": { "name": "Hypeprop Sl", "alias": "Hypeprop", "tax_id": { "country": "ES", "code": "B23103039" }, "people": [ { "name": { "given": "Paloma", "surname": "Araujo" } } ], "addresses": [ { "num": "74", "street": "Campo Real", "locality": "Torrejón De La Calzada", "region": "Madrid", "code": "28023", "country": "ES" } ], "emails": [ { "addr": "rxazy27xfc@iname.com" } ], "telephones": [ { "label": "office", "num": "+34910730028" } ] }, "customer": { "name": "Moniward Sl", "tax_id": { "country": "ES", "code": "B77436020" }, "addresses": [ { "num": "35", "street": "Plaza Horno", "locality": "Nombela", "region": "Toledo", "code": "45083", "country": "ES" } ], "emails": [ { "addr": "bfn25xf3p@lycos.co.uk" } ] }, "lines": [ { "quantity": "20", "item": { "name": "Operations and development - day rate", "price": "200.00" }, "taxes": [ { "cat": "VAT", "rate": "general" } ] }, { "quantity": "2", "item": { "name": "Additional Overtime", "price": "101.00" }, "taxes": [ { "cat": "VAT", "rate": "general" } ] } ], "payment": { "terms": { "key": "due-date", "due_dates": [ { "date": "2021-12-30", "percent": "100%" } ], "notes": "Some kind of payment term note" }, "instructions": { "key": "credit-transfer", "credit_transfer": [ { "iban": "ES25 0188 2570 7185 4470 4761", "name": "Bankrandom" } ] } }, "notes": [ { "key": "general", "text": "Thank you for your custom!" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-facturae-v3" ], "type": "standard", "code": "TEST01001F", "issue_date": "2021-12-08", "currency": "EUR", "tax": { "ext": { "es-facturae-doc-type": "FC", "es-facturae-invoice-class": "OO" } }, "supplier": { "name": "Hypeprop Sl", "alias": "Hypeprop", "tax_id": { "country": "ES", "code": "B23103039" }, "people": [ { "name": { "given": "Paloma", "surname": "Araujo" } } ], "addresses": [ { "num": "74", "street": "Campo Real", "locality": "Torrejón De La Calzada", "region": "Madrid", "code": "28023", "country": "ES" } ], "emails": [ { "addr": "rxazy27xfc@iname.com" } ], "telephones": [ { "label": "office", "num": "+34910730028" } ] }, "customer": { "name": "Moniward Sl", "tax_id": { "country": "ES", "code": "B77436020" }, "addresses": [ { "num": "35", "street": "Plaza Horno", "locality": "Nombela", "region": "Toledo", "code": "45083", "country": "ES" } ], "emails": [ { "addr": "bfn25xf3p@lycos.co.uk" } ] }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Operations and development - day rate", "price": "200.00" }, "sum": "4000.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "21.0%" } ], "total": "4000.00" }, { "i": 2, "quantity": "2", "item": { "name": "Additional Overtime", "price": "101.00" }, "sum": "202.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "21.0%" } ], "total": "202.00" } ], "payment": { "terms": { "key": "due-date", "due_dates": [ { "date": "2021-12-30", "amount": "5084.42", "percent": "100%" } ], "notes": "Some kind of payment term note" }, "instructions": { "key": "credit-transfer", "credit_transfer": [ { "iban": "ES25 0188 2570 7185 4470 4761", "name": "Bankrandom" } ] } }, "totals": { "sum": "4202.00", "total": "4202.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "base": "4202.00", "percent": "21.0%", "amount": "882.42" } ], "amount": "882.42" } ], "sum": "882.42" }, "tax": "882.42", "total_with_tax": "5084.42", "payable": "5084.42" }, "notes": [ { "key": "general", "text": "Thank you for your custom!" } ] } ``` ```json Facturae Credit Note theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-facturae-v3" ], "type": "credit-note", "code": "TEST01001R", "issue_date": "2021-12-08", "preceding": [ { "type": "standard", "issue_date": "2021-12-08", "code": "TEST01001F", "ext": { "es-facturae-correction": "01" } } ], "supplier": { "name": "Hypeprop Sl", "alias": "Hypeprop", "tax_id": { "country": "ES", "code": "B23103039" }, "people": [ { "name": { "given": "Paloma", "surname": "Araujo" } } ], "addresses": [ { "num": "74", "street": "Campo Real", "locality": "Torrejón De La Calzada", "region": "Madrid", "code": "28023", "country": "ES" } ], "emails": [ { "addr": "rxazy27xfc@iname.com" } ], "telephones": [ { "label": "office", "num": "+34910730028" } ] }, "customer": { "name": "Moniward Sl", "tax_id": { "country": "ES", "code": "B77436020" }, "addresses": [ { "num": "35", "street": "Plaza Horno", "locality": "Nombela", "region": "Toledo", "code": "45083", "country": "ES" } ], "emails": [ { "addr": "bfn25xf3p@lycos.co.uk" } ] }, "lines": [ { "quantity": "20", "item": { "name": "Operations and development - day rate", "price": "200.00" }, "taxes": [ { "cat": "VAT", "rate": "general" } ] }, { "quantity": "2", "item": { "name": "Additional Overtime", "price": "101.00" }, "taxes": [ { "cat": "VAT", "rate": "general" } ] } ], "notes": [ { "key": "general", "text": "Thank you for your custom!" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-facturae-v3" ], "type": "credit-note", "code": "TEST01001R", "issue_date": "2021-12-08", "currency": "EUR", "preceding": [ { "type": "standard", "issue_date": "2021-12-08", "code": "TEST01001F", "ext": { "es-facturae-correction": "01" } } ], "tax": { "ext": { "es-facturae-doc-type": "FC", "es-facturae-invoice-class": "OR" } }, "supplier": { "name": "Hypeprop Sl", "alias": "Hypeprop", "tax_id": { "country": "ES", "code": "B23103039" }, "people": [ { "name": { "given": "Paloma", "surname": "Araujo" } } ], "addresses": [ { "num": "74", "street": "Campo Real", "locality": "Torrejón De La Calzada", "region": "Madrid", "code": "28023", "country": "ES" } ], "emails": [ { "addr": "rxazy27xfc@iname.com" } ], "telephones": [ { "label": "office", "num": "+34910730028" } ] }, "customer": { "name": "Moniward Sl", "tax_id": { "country": "ES", "code": "B77436020" }, "addresses": [ { "num": "35", "street": "Plaza Horno", "locality": "Nombela", "region": "Toledo", "code": "45083", "country": "ES" } ], "emails": [ { "addr": "bfn25xf3p@lycos.co.uk" } ] }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Operations and development - day rate", "price": "200.00" }, "sum": "4000.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "21.0%" } ], "total": "4000.00" }, { "i": 2, "quantity": "2", "item": { "name": "Additional Overtime", "price": "101.00" }, "sum": "202.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "21.0%" } ], "total": "202.00" } ], "totals": { "sum": "4202.00", "total": "4202.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "base": "4202.00", "percent": "21.0%", "amount": "882.42" } ], "amount": "882.42" } ], "sum": "882.42" }, "tax": "882.42", "total_with_tax": "5084.42", "payable": "5084.42" }, "notes": [ { "key": "general", "text": "Thank you for your custom!" } ] } ``` Copy and paste these documents into the [GOBL builder](https://build.gobl.org) in order to preview and verify them.
*** | | | | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Compliance | [Invoicing compliance in Spain](/compliance/spain)
[Compliance timeline](/timelines/spain) | | Apps | [Spain](/apps/spain)
[VERI\*FACTU Spain](/apps/verifactu-spain)
[TicketBAI (Spain app)](/apps/spain) | | Guides | [Facturae guide](/guides/es-facturae)
[VERI\*FACTU invoicing guide](/guides/es-verifactu)
[VERI\*FACTU supplier onboarding](/guides/es-verifactu-supplier)
[SII invoicing guide](/guides/es-sii)
[SII supplier onboarding](/guides/es-sii-supplier)
[TicketBAI guide](/guides/es-ticketbai) | | FAQ | [Spain FAQ](/faq/spain) | | GOBL | [Spain Tax Regime](https://docs.gobl.org/regimes/es)
[VERI\*FACTU Addon](https://docs.gobl.org/addons/es-verifactu-v1)
[Facturae Addon](https://docs.gobl.org/addons/es-facturae-v3)
[SII Addon](https://docs.gobl.org/addons/es-sii-v1) | | GitHub | [gobl.facturae](https://github.com/invopop/gobl.facturae)
[gobl.verifactu](https://github.com/invopop/gobl.verifactu)
[gobl.ticketbai](https://github.com/invopop/gobl.ticketbai) |
Ask and answer questions about Facturae Spain App → # Finland Source: https://docs.invopop.com/apps/finland Send and receive Finnish e-invoices across the domestic operator network and Peppol.
Supplier registration guide › Issuing guide › Receiving guide ›
| | | | --------- | ------------------------------ | | Developer | [Invopop](https://invopop.com) | | Category | Government | | Scope | B2B, B2G | | Country | [Finland](/compliance/finland) |
Finland has no government clearance system for invoices. Instead, e-invoices travel over two networks that run side by side: the domestic operator network, an unbranded mesh of accredited operators where around 370,000 companies receive their invoices as *Finvoice* or *TEAPPSXML*, and Peppol, with roughly 13,000 Finnish end users (about 0.24% of annual volume). Neither network alone covers Finnish receivers. Invopop has partnered with [Apix Messaging](https://www.apix.fi), an accredited Finnish operator, to cover both networks through one app: you send one GOBL invoice carrying the receiver's e-invoice address, and it is delivered as a compliant e-invoice in the format the receiver's network expects. Because the routing is resolved per receiver, you never pick a network. Use this app for every Finnish receiver, including the ones reachable on Peppol. Before anything is sent, the app checks how the receiver would be reached and refuses the invoice unless the answer is a networked e-invoice, naming the channel that would have been used instead. E-invoicing is mandatory for invoices to Finnish public bodies under Act 241/2019, and voluntary between businesses, though businesses above a EUR 10,000 turnover threshold have a statutory right to request e-invoices from their suppliers. #### Key features * **Workflow automation:** Register parties, issue invoices, and import received ones as steps in your workflows. * **Both networks through one app:** Domestic-network and Peppol receivers are reached through the same action, with routing resolved per receiver. * **Per-party provisioning:** Each registered party gets its own operator account and its own e-invoice address. * **Finvoice-safe validation:** The [`fi-finvoice-v3` addon](https://docs.gobl.org/addons/fi-finvoice-v3) requires the payment data Finvoice makes mandatory, so invoices that would fail conversion are rejected before they are sent. * **Reachability pre-check:** Receivers that would get paper, email, or a consumer bank channel are refused up front, never silently delivered another way. * **Invoice reception:** Each registered party's inbox is polled on a schedule and received invoices are imported automatically. Check out the guides below to get started: * [Supplier registration](/guides/fi-finvoice-supplier) · [Issuing invoices](/guides/fi-finvoice) · [Receiving invoices](/guides/fi-finvoice-receiving) ## FAQ Invoicing questions Yes. Most Finnish businesses receive e-invoices through the domestic operator network rather than Peppol, and the [Finland app](/apps/finland) reaches both: you send one GOBL invoice with the receiver's e-invoice address, and it is delivered in the format the receiver's network expects. There is no need to check which network the receiver is on. Because in Finland an e-invoice doubles as a payment order. Finvoice was created by the banks (it's published by Finance Finland, the banking association) and grew out of the bank network, where the receiver approves the invoice for payment directly in their bank. That's why every Finvoice invoice, credit notes included, must carry the payment order: an IBAN, a payment reference, and a dated due date. Most Finnish receivers get their invoices as Finvoice, and one missing this data would fail on its way to the receiver, where we can't see it, so the [`fi-finvoice-v3` addon](https://docs.gobl.org/addons/fi-finvoice-v3) rejects it up front instead. Three checks run before anything leaves the platform: the supplier must have an electronic address (`supplier-address-missing`), the invoice must carry a payment bank account (`payment-account-missing`), and the receiver must be reachable as a true e-invoice (`receiver-not-einvoice`). The last one matters most: receivers only reachable on paper, by email, or through the consumer bank channels (e-lasku, suoramaksu, Netposti) are rejected up front, with the channel the operator would have used named in the error, rather than quietly delivered another way. If the connection to the operator fails after the request may have already been written, we can't tell whether the invoice was accepted, and resubmitting could deliver it twice. The job reports the attempt with its timestamp under the `send-unconfirmed` code instead of retrying. Check with support before sending the invoice again. Business-to-government is the segment where e-invoicing is mandatory in Finland, and the state applies its own reference conventions: order numbers must start with `V1`, agreement numbers with `VSK1`, and posting references with `TK1`, with at most one of each per invoice. Set the order number in `ordering.purchases` and the agreement number in `ordering.contracts` on the GOBL invoice. Invopop doesn't validate or normalise these prefixes, so format them exactly as the contracting authority provided them, or the state will reject the invoice. The operator's synchronous accept is the final programmatic signal: there is no delivery status API to poll afterwards. If a receiving operator later rejects the invoice, that rejection arrives by email in production. No news after acceptance is good news. Registering supplier questions Upload the supplier as a GOBL party with `tax_id.country = FI` and the Business ID (y-tunnus), then run the [Finland app](/apps/finland)'s registration workflow. Registration provisions the party its own operator account and allocates its e-invoice address — a party must be registered before it can send or receive anything. See the [supplier registration guide](/guides/fi-finvoice-supplier). Scheme `0216`, wrapping the party's OVT code — `0037` followed by the Business ID without its hyphen. Under Finland's Peppol Authority Specific Requirements, the OVT code is the mandatory participant identifier for Finnish organisations on Peppol. The `0037` at the start of the code itself is a country prefix, not the scheme. An OVT code: `0037` followed by the party's Business ID (y-tunnus) without its hyphen, sometimes with a five-character suffix for routing inside large organisations (for example `003726174164`). On Peppol, the same code is wrapped in scheme `0216` (`0216:003726174164`). You can look any counterparty up in the national registry at [verkkolaskuosoite.fi](https://verkkolaskuosoite.fi): since 2024 it mirrors the Peppol address list too, so one lookup covers both networks. The OVT code, as an inbox with scheme `0216`. Other forms circulate on the Finnish network (IBAN-style addresses from the older bank channel, operator-prefixed ones such as `TE0037…`), but the OVT code is the canonical form, and it's what the routing pre-check and the generated e-invoice use. Registration provisions the party its own account with the operator, and it only completes once every service is in force and the party's e-invoice address has been allocated on the operator's side. Until then the registration job stays queued rather than reporting success on an account that can't yet receive. Yes. Each party gets its own operator account, its own e-invoice address, and its own reception polling schedule. Register each one separately by running the registration workflow on its party record. Receiving questions Reception is polled, not pushed: each registered party's inbox at the operator is swept on a schedule, every five minutes by default. Add the time the sender's own operator takes to deliver, and an invoice normally appears within minutes, but not instantly. If you're testing, allow up to a quarter of an hour before suspecting a problem. Each received document becomes one entry in your workspace carrying the GOBL invoice, the original XML as received from the network, and a PDF rendering, whatever format the sender issued. Two things: the Finland app must be configured with a sync workflow and an import workflow, and the party must be registered. Registration checks the workflow configuration first, so set the workflows up before running it. Once registered, polling starts automatically; received invoices simply appear as new entries processed by your import workflow. More answers in our [Finland FAQ](/faq/finland) section
| Capability | Status | Notes | | ---------------------------- | ----------------------------- | ------------------------------------------------------------------------------------------------- | | Party registration | Available | Provisions a per-party operator account | | Invoice delivery | Available | Both networks, routing resolved per receiver | | Invoice reception | Available | Polled per registered party, five-minute default | | Delivery status tracking | Not available | The synchronous accept is the final programmatic signal; later rejections arrive by email | | Party deregistration | In development | Contact [support](mailto:support@invopop.com) to offboard a party | | Invopop PDF for receivers | In development | Domestic-network receivers get the operator's PDF rendering | | Delivered document retrieval | Not available | The Finvoice the operator delivers cannot be fetched back | | B2G reference validation | Not available | Format state references (`V1`, `VSK1`) yourself; posting references (`TK1`) cannot be carried yet | The following workflow actions will be available once you install and enable this app:
2
Deliver a signed GOBL invoice to the receiver's network as a compliant e-invoice. Checks the receiver is reachable as a true e-invoice before anything is sent.
100
Provision the party its own operator account, activate its services, and allocate its e-invoice address. A party must be registered before it can send or receive.
Sweep a registered party's inbox at the operator and queue one import job for each new document. Runs automatically on the reception polling schedule.
3
Download one received document and convert it into a GOBL invoice, attaching the original XML and the PDF.
Invoice workflows ```json Example Finvoice send invoice workflow theme={"system"} { "name": "Finvoice send invoice", "description": "Issue an invoice to a Finnish receiver", "schema": "bill/invoice", "steps": [ { "id": "bc138fa6-9172-11f1-b7bf-92000767c8b7", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "bc177c32-9172-11f1-9d66-92000767c8b7", "name": "Add sequential code", "provider": "sequence.enumerate", "summary": "Dynamic · Finvoice · 000001", "config": { "name": "Finvoice", "padding": 6, "start": 1 } }, { "id": "bc177d5b-9172-11f1-b7a4-92000767c8b7", "name": "Sign envelope", "provider": "silo.close" }, { "id": "bc177de4-9172-11f1-83e5-92000767c8b7", "name": "Send invoice", "provider": "gov-fi.send" }, { "id": "bc177e3d-9172-11f1-8812-92000767c8b7", "name": "Set state", "provider": "silo.state", "summary": "Set state to `sent`{.state .sent}", "config": { "state": "sent" } } ], "rescue": [ { "id": "bc177e9e-9172-11f1-8438-92000767c8b7", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` Party workflows ```json Example Finvoice register party workflow theme={"system"} { "name": "Finvoice register party", "description": "Register a Finnish party so it can send and receive e-invoices", "schema": "org/party", "steps": [ { "id": "bc177ef2-9172-11f1-8c54-92000767c8b7", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "bc177f3b-9172-11f1-8204-92000767c8b7", "name": "Register party in Finland", "provider": "gov-fi.register" }, { "id": "bc177f7d-9172-11f1-bb70-92000767c8b7", "name": "Set state", "provider": "silo.state", "summary": "Set state to `registered`{.state .registered}", "config": { "state": "registered" } } ], "rescue": [ { "id": "bc177fc4-9172-11f1-a165-92000767c8b7", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` Reception workflows ```json Example Finvoice sync received invoices workflow theme={"system"} { "name": "Finvoice sync received invoices", "description": "Sweep a registered party's inbox at the operator and dispatch import jobs", "schema": "org/party", "steps": [ { "id": "bc178004-9172-11f1-b2b4-92000767c8b7", "name": "Sync received invoices", "provider": "gov-fi.sync" } ], "rescue": [] } ``` ```json Example Finvoice import invoice workflow theme={"system"} { "name": "Finvoice import invoice", "description": "Import a received invoice", "schema": "bill/invoice", "steps": [ { "id": "bc178046-9172-11f1-ac3d-92000767c8b7", "name": "Import received invoice", "provider": "gov-fi.import" }, { "id": "bc178096-9172-11f1-90ae-92000767c8b7", "name": "Set folder", "provider": "silo.folder", "summary": "Set folder to `Invoices · Expenses`{.font-medium}", "config": { "folder": "expenses" } }, { "id": "bc1780dc-9172-11f1-b338-92000767c8b7", "name": "Set state", "provider": "silo.state", "summary": "Set state to `registered`{.state .registered}", "config": { "state": "registered" } } ], "rescue": [ { "id": "bc17811a-9172-11f1-ae07-92000767c8b7", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` A Finnish company with its Business ID (y-tunnus) as the tax ID and its e-invoice address as an inbox: the OVT code (`0037` plus the Business ID without its hyphen) under scheme `0216`. ```json Finland supplier example expandable theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "Aurora Ohjelmistot Oy", "tax_id": { "country": "FI", "code": "26174164" }, "inboxes": [ { "key": "peppol", "scheme": "0216", "code": "003726174164" } ], "addresses": [ { "num": "12", "street": "Mannerheimintie", "locality": "Helsinki", "code": "00100", "country": "FI" } ], "emails": [ { "addr": "laskutus@auroraohjelmistot.fi" } ] } ``` The receiving side of a Finnish invoice, with the same identity shape as the supplier: y-tunnus tax ID and an OVT e-invoice address under scheme `0216`. Look receivers up at [verkkolaskuosoite.fi](https://verkkolaskuosoite.fi). ```json Finland customer example expandable theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "Pohjola Rakennus Oy", "tax_id": { "country": "FI", "code": "11223349" }, "inboxes": [ { "key": "peppol", "scheme": "0216", "code": "003711223349" } ], "addresses": [ { "num": "8", "street": "Hämeenkatu", "locality": "Tampere", "code": "33100", "country": "FI" } ], "emails": [ { "addr": "ostolaskut@pohjolarakennus.fi" } ] } ``` In this example, we're issuing a B2B invoice from a Finnish supplier to another Finnish business. Notice: * the `$addons` field is set to `fi-finvoice-v3`, which enforces the payment data Finvoice requires on every Finnish invoice, * both parties carry their e-invoice address as an inbox with scheme `0216` and an OVT code (`0037` followed by the Business ID without its hyphen), * the `payment` block carries an IBAN, a payment reference (an ISO 11649 `RF` reference here), and a dated due date; all three are required, * the invoice includes VAT at the standard Finnish rate of 25.5%, and, * there are no calculations in some fields; these will be made automatically when uploading. ```json Finland B2B invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": ["fi-finvoice-v3"], "type": "standard", "series": "SAMPLE", "code": "0042", "issue_date": "2026-08-01", "currency": "EUR", "supplier": { "name": "Aurora Ohjelmistot Oy", "tax_id": { "country": "FI", "code": "26174164" }, "inboxes": [ { "key": "peppol", "scheme": "0216", "code": "003726174164" } ], "addresses": [ { "num": "12", "street": "Mannerheimintie", "locality": "Helsinki", "code": "00100", "country": "FI" } ] }, "customer": { "name": "Pohjola Rakennus Oy", "tax_id": { "country": "FI", "code": "11223349" }, "inboxes": [ { "key": "peppol", "scheme": "0216", "code": "003711223349" } ], "addresses": [ { "num": "8", "street": "Hämeenkatu", "locality": "Tampere", "code": "33100", "country": "FI" } ] }, "lines": [ { "quantity": "10", "item": { "name": "Software development services", "price": "85.00" }, "taxes": [ { "cat": "VAT", "percent": "25.5%" } ] } ], "payment": { "instructions": { "key": "credit-transfer", "ref": "RF1310023", "credit_transfer": [ { "iban": "FI2112345600000785", "bic": "NDEAFIHH" } ] }, "terms": { "due_dates": [ { "date": "2026-08-15", "percent": "100%" } ] } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "FI", "$addons": [ "eu-en16931-v2017", "fi-finvoice-v3" ], "type": "standard", "series": "SAMPLE", "code": "0042", "issue_date": "2026-08-01", "currency": "EUR", "tax": { "ext": { "untdid-document-type": "380" } }, "supplier": { "name": "Aurora Ohjelmistot Oy", "tax_id": { "country": "FI", "code": "26174164" }, "endpoints": [ { "uri": "iso6523-actorid-upis::0216:003726174164" } ], "inboxes": [ { "key": "peppol", "scheme": "0216", "code": "003726174164" } ], "addresses": [ { "num": "12", "street": "Mannerheimintie", "locality": "Helsinki", "code": "00100", "country": "FI" } ] }, "customer": { "name": "Pohjola Rakennus Oy", "tax_id": { "country": "FI", "code": "11223349" }, "endpoints": [ { "uri": "iso6523-actorid-upis::0216:003711223349" } ], "inboxes": [ { "key": "peppol", "scheme": "0216", "code": "003711223349" } ], "addresses": [ { "num": "8", "street": "Hämeenkatu", "locality": "Tampere", "code": "33100", "country": "FI" } ] }, "lines": [ { "i": 1, "quantity": "10", "item": { "name": "Software development services", "price": "85.00", "unit": "one" }, "sum": "850.00", "taxes": [ { "cat": "VAT", "key": "standard", "percent": "25.5%", "ext": { "untdid-tax-category": "S" } } ], "total": "850.00" } ], "payment": { "terms": { "due_dates": [ { "date": "2026-08-15", "amount": "1066.75", "percent": "100%" } ] }, "instructions": { "key": "credit-transfer", "ref": "RF1310023", "credit_transfer": [ { "iban": "FI2112345600000785", "bic": "NDEAFIHH" } ], "ext": { "untdid-payment-means": "30" } } }, "totals": { "sum": "850.00", "total": "850.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "untdid-tax-category": "S" }, "base": "850.00", "percent": "25.5%", "amount": "216.75" } ], "amount": "216.75" } ], "sum": "216.75" }, "tax": "216.75", "total_with_tax": "1066.75", "payable": "1066.75" } } ``` In this example, we're invoicing a Finnish public body, the segment where e-invoicing is mandatory. Notice: * the `ordering.purchases` code starts with `V1` and the `ordering.contracts` code starts with `VSK1`, following the Finnish state's reference conventions; the state rejects invoices that don't follow them, * there is at most one order number and one agreement number, as the state requires, * the payment reference here is a Finnish *viitenumero* (banking reference number), the domestic alternative to the `RF` form, and, * everything else works exactly like the B2B invoice, payment block included. ```json Finland B2G invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": ["fi-finvoice-v3"], "type": "standard", "series": "SAMPLE", "code": "0043", "issue_date": "2026-08-01", "currency": "EUR", "supplier": { "name": "Aurora Ohjelmistot Oy", "tax_id": { "country": "FI", "code": "26174164" }, "inboxes": [ { "key": "peppol", "scheme": "0216", "code": "003726174164" } ], "addresses": [ { "num": "12", "street": "Mannerheimintie", "locality": "Helsinki", "code": "00100", "country": "FI" } ] }, "customer": { "name": "Suomen Valtion Virasto", "tax_id": { "country": "FI", "code": "54321096" }, "inboxes": [ { "key": "peppol", "scheme": "0216", "code": "003754321096" } ], "addresses": [ { "num": "1", "street": "Snellmaninkatu", "locality": "Helsinki", "code": "00170", "country": "FI" } ] }, "ordering": { "purchases": [ { "code": "V12026001" } ], "contracts": [ { "code": "VSK12026001" } ] }, "lines": [ { "quantity": "1", "item": { "name": "Consulting services, July 2026", "price": "4500.00" }, "taxes": [ { "cat": "VAT", "percent": "25.5%" } ] } ], "payment": { "instructions": { "key": "credit-transfer", "ref": "100230", "credit_transfer": [ { "iban": "FI2112345600000785", "bic": "NDEAFIHH" } ] }, "terms": { "due_dates": [ { "date": "2026-08-31", "percent": "100%" } ] } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "FI", "$addons": [ "eu-en16931-v2017", "fi-finvoice-v3" ], "type": "standard", "series": "SAMPLE", "code": "0043", "issue_date": "2026-08-01", "currency": "EUR", "tax": { "ext": { "untdid-document-type": "380" } }, "supplier": { "name": "Aurora Ohjelmistot Oy", "tax_id": { "country": "FI", "code": "26174164" }, "endpoints": [ { "uri": "iso6523-actorid-upis::0216:003726174164" } ], "inboxes": [ { "key": "peppol", "scheme": "0216", "code": "003726174164" } ], "addresses": [ { "num": "12", "street": "Mannerheimintie", "locality": "Helsinki", "code": "00100", "country": "FI" } ] }, "customer": { "name": "Suomen Valtion Virasto", "tax_id": { "country": "FI", "code": "54321096" }, "endpoints": [ { "uri": "iso6523-actorid-upis::0216:003754321096" } ], "inboxes": [ { "key": "peppol", "scheme": "0216", "code": "003754321096" } ], "addresses": [ { "num": "1", "street": "Snellmaninkatu", "locality": "Helsinki", "code": "00170", "country": "FI" } ] }, "lines": [ { "i": 1, "quantity": "1", "item": { "name": "Consulting services, July 2026", "price": "4500.00", "unit": "one" }, "sum": "4500.00", "taxes": [ { "cat": "VAT", "key": "standard", "percent": "25.5%", "ext": { "untdid-tax-category": "S" } } ], "total": "4500.00" } ], "ordering": { "contracts": [ { "code": "VSK12026001" } ], "purchases": [ { "code": "V12026001" } ] }, "payment": { "terms": { "due_dates": [ { "date": "2026-08-31", "amount": "5647.50", "percent": "100%" } ] }, "instructions": { "key": "credit-transfer", "ref": "100230", "credit_transfer": [ { "iban": "FI2112345600000785", "bic": "NDEAFIHH" } ], "ext": { "untdid-payment-means": "30" } } }, "totals": { "sum": "4500.00", "total": "4500.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "untdid-tax-category": "S" }, "base": "4500.00", "percent": "25.5%", "amount": "1147.50" } ], "amount": "1147.50" } ], "sum": "1147.50" }, "tax": "1147.50", "total_with_tax": "5647.50", "payable": "5647.50" } } ``` In this example, we're issuing a credit note that corrects a previously issued invoice. Notice: * the `type` is set to `credit-note`, * the `preceding` array references the original invoice by its `series`, `code`, and `issue_date`, along with a `reason`, * the `payment` block is still present and complete; Finvoice requires the payment data on credit notes too, unlike most other European formats, and, * there are no calculations in some fields; these will be made automatically when uploading. ```json Finland credit note theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": ["fi-finvoice-v3"], "type": "credit-note", "series": "SAMPLE-CN", "code": "0007", "issue_date": "2026-08-05", "currency": "EUR", "preceding": [ { "series": "SAMPLE", "code": "0042", "issue_date": "2026-08-01", "reason": "Partial refund for undelivered services" } ], "supplier": { "name": "Aurora Ohjelmistot Oy", "tax_id": { "country": "FI", "code": "26174164" }, "inboxes": [ { "key": "peppol", "scheme": "0216", "code": "003726174164" } ], "addresses": [ { "num": "12", "street": "Mannerheimintie", "locality": "Helsinki", "code": "00100", "country": "FI" } ] }, "customer": { "name": "Pohjola Rakennus Oy", "tax_id": { "country": "FI", "code": "11223349" }, "inboxes": [ { "key": "peppol", "scheme": "0216", "code": "003711223349" } ], "addresses": [ { "num": "8", "street": "Hämeenkatu", "locality": "Tampere", "code": "33100", "country": "FI" } ] }, "lines": [ { "quantity": "2", "item": { "name": "Software development services", "price": "85.00" }, "taxes": [ { "cat": "VAT", "percent": "25.5%" } ] } ], "payment": { "instructions": { "key": "credit-transfer", "ref": "RF1310023", "credit_transfer": [ { "iban": "FI2112345600000785", "bic": "NDEAFIHH" } ] }, "terms": { "due_dates": [ { "date": "2026-08-19", "percent": "100%" } ] } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "FI", "$addons": [ "eu-en16931-v2017", "fi-finvoice-v3" ], "type": "credit-note", "series": "SAMPLE-CN", "code": "0007", "issue_date": "2026-08-05", "currency": "EUR", "preceding": [ { "issue_date": "2026-08-01", "series": "SAMPLE", "code": "0042", "reason": "Partial refund for undelivered services" } ], "tax": { "ext": { "untdid-document-type": "381" } }, "supplier": { "name": "Aurora Ohjelmistot Oy", "tax_id": { "country": "FI", "code": "26174164" }, "endpoints": [ { "uri": "iso6523-actorid-upis::0216:003726174164" } ], "inboxes": [ { "key": "peppol", "scheme": "0216", "code": "003726174164" } ], "addresses": [ { "num": "12", "street": "Mannerheimintie", "locality": "Helsinki", "code": "00100", "country": "FI" } ] }, "customer": { "name": "Pohjola Rakennus Oy", "tax_id": { "country": "FI", "code": "11223349" }, "endpoints": [ { "uri": "iso6523-actorid-upis::0216:003711223349" } ], "inboxes": [ { "key": "peppol", "scheme": "0216", "code": "003711223349" } ], "addresses": [ { "num": "8", "street": "Hämeenkatu", "locality": "Tampere", "code": "33100", "country": "FI" } ] }, "lines": [ { "i": 1, "quantity": "2", "item": { "name": "Software development services", "price": "85.00", "unit": "one" }, "sum": "170.00", "taxes": [ { "cat": "VAT", "key": "standard", "percent": "25.5%", "ext": { "untdid-tax-category": "S" } } ], "total": "170.00" } ], "payment": { "terms": { "due_dates": [ { "date": "2026-08-19", "amount": "213.35", "percent": "100%" } ] }, "instructions": { "key": "credit-transfer", "ref": "RF1310023", "credit_transfer": [ { "iban": "FI2112345600000785", "bic": "NDEAFIHH" } ], "ext": { "untdid-payment-means": "30" } } }, "totals": { "sum": "170.00", "total": "170.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "untdid-tax-category": "S" }, "base": "170.00", "percent": "25.5%", "amount": "43.35" } ], "amount": "43.35" } ], "sum": "43.35" }, "tax": "43.35", "total_with_tax": "213.35", "payable": "213.35" } } ``` Copy and paste these documents into the [GOBL builder](https://build.gobl.org) in order to preview and verify them.
*** | | | | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Compliance | [Invoicing compliance in Finland](/compliance/finland)
[Compliance timeline](/timelines/finland) | | Apps | [Finland](/apps/finland)
[Peppol](/apps/peppol) | | Guides | [Supplier registration](/guides/fi-finvoice-supplier)
[Issuing invoices](/guides/fi-finvoice)
[Receiving invoices](/guides/fi-finvoice-receiving)
[Peppol guide](/guides/peppol) | | FAQ | [Finland FAQ](/faq/finland) | | GOBL | [Finland Tax Regime](https://docs.gobl.org/regimes/fi)
[EU EN 16931 Addon](https://docs.gobl.org/addons/eu-en16931-v2017) | | GitHub | [gobl.fi.finvoice](https://github.com/invopop/gobl.fi.finvoice)
[gobl.ubl](https://github.com/invopop/gobl.ubl) |
Ask and answer questions about the Finland app → # France Source: https://docs.invopop.com/apps/france Manage all French e-invoicing flows — Plateforme Agréée (B2B, B2C)

View guide ›
| | | | --------- | ------------------------------ | | Developer | [Invopop](https://invopop.com) | | Category | Government | | Scope | B2B, B2C (e-reporting) | | Country | [France](/compliance/france) |
Invopop's **France app** centralises every French e-invoicing flow — domestic B2B via the **Plateforme Agréée (PA)** model. Invopop is an [officially approved Plateforme Agréée](https://www.impots.gouv.fr/je-consulte-la-liste-des-plateformes-agreees) under the DGFiP mandate. **Key features** * Domestic B2B invoicing and B2C/cross-border via e-reporting. * French format support: UBL (Peppol France CIUS), CII, Factur-X. * Annuaire (French Directory) supplier registration. Check out the guides below to get started: * [PA overview](/guides/fr-pa) · [Registration](/guides/fr-pa-registration) · [Invoicing](/guides/fr-pa-invoicing) · [Status](/guides/fr-pa-status) · [Reporting](/guides/fr-pa-reporting) ## FAQ Invoicing questions Two channels depending on the recipient: B2G uses Chorus Pro (CII format); B2B from September 2026 uses the Plateforme Agréée model (UBL, CII, or Factur-X via Peppol). Invopop is an approved PA — install the France PA app for B2B and the Chorus Pro app for B2G. In Factur-X PDFs, the XML file is embedded within the PDF itself. To extract and view it, use the `Attachments` section in Adobe Acrobat Reader, or a tool like the [SysTools PDF Extractor](https://www.systoolsgroup.com/pdf/extractor/). Invopop is an [officially approved Plateforme Agréée](https://www.impots.gouv.fr/je-consulte-la-liste-des-plateformes-agreees) under the DGFiP mandate. Registration, invoicing, and lifecycle status are available today; e-reporting (Flow 10) is in active development. See the [PA hub readiness matrix](/guides/fr-pa) for the current state. The base [FR tax regime](https://docs.gobl.org/regimes/fr) plus the EN 16931 profile. For Peppol delivery, `peppol-bis-v3`. The forthcoming `fr-ctc-flow10-v1` addon covers e-reporting payloads — separate from the e-invoicing flow. No. Most Peppol countries treat self-billing as a document type of its own, but France models it as a **standard invoice** with the `untdid-document-type` extension set to `389`. In GOBL you never set the code yourself: add the `self-billed` tag and the [`fr-ctc-flow2-v1`](https://docs.gobl.org/addons/fr-ctc-flow2-v1#standard-self-billed) add-on applies it automatically. See [Self-billing](/guides/fr-pa-invoicing#self-billing) for the full flow. Each invoice or lifecycle status sent through France PA costs **5 pops**: 1 pop for the conversion to UBL/CII, 2 pops to send it over Peppol, 1 pop to forward it to the PPF, and 1 pop for the silo entry. See [Pops & pricing](/get-started/pricing) for how pops work. In countries where Peppol is the standard but not mandatory, you may still need to issue an e-invoice when the recipient isn't on the network. Both parties can agree on an alternative transfer method, but the invoice must still be EN16931 compliant. Recommended approach: * Set up a separate workflow that generates the XML without the send-Peppol-document step * Or reuse your existing workflow without the customer Peppol ID — the send step is automatically skipped * Fetch the generated XML and deliver it through the agreed channel, typically email B2C invoices typically lack the structured customer information required for Peppol delivery, and most consumers don't have inboxes. Use a conditional workflow: 1. Add an **If/Else** step that checks for a customer inbox using `count(customer.inboxes, true) > 0`. 2. On the `false` branch, generate a PDF and email it to the customer, then stop the flow. This routes B2B invoices through Peppol while keeping a smooth path for consumers. If a job fails with `KO` and `receiver not found in the peppol network`, treat it like an invalid email address — the recipient simply isn't reachable on Peppol. Add the **Lookup Participant ID** step (ideally in a separate validation workflow run against customer data) so you catch missing IDs before generating the invoice. No. The regime is automatically derived from the supplier's settings, which is the recommended approach for Peppol — leave it unset on the document. See the [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) addon for the field and validation rules Peppol BIS Billing 3.0 builds on, and the [Peppol app reference](/apps/peppol) for supported document types and Participant ID schemes. Registering supplier questions For B2B PA flows: register the supplier via the France PA Register Party workflow (publishes the SIREN to the Annuaire and Peppol). For Chorus Pro: register the supplier with their SIRET on Chorus Pro's portal and link credentials in the Chorus Pro app. France PA does not require supplier-side certificates — Peppol uses Invopop's AP cert. Chorus Pro uses an OAuth token bound to the supplier's account; the token is encrypted at rest in Invopop. Run the France PA Register Party workflow with the supplier's SIREN. Invopop publishes them to the Annuaire and the Peppol SMP — they are then routable for both invoicing and e-reporting through Invopop. Yes. Copy the PPF register supplier template and remove the **Register party for reporting** step. The party gets its Annuaire line and Peppol inbox and can receive invoices, but no reporting cadence starts. When its obligations begin, run the removed step against the party to complete the registration. See [Registering without e-reporting](/guides/fr-pa-registration#registering-without-e-reporting). None at the supplier level. The Plateforme Agréée holds an OpenPeppol-issued mTLS certificate (Invopop's), and the PA-to-PPF channel uses additional DGFiP credentials managed by Invopop. It depends on the flows the merchant uses: * **E-invoicing (B2B)** — **150 pops** per merchant: 50 pops for the French directory (Annuaire) registration plus 100 pops for Peppol. * **E-reporting only (B2C or international B2B)** — **50 pops** per merchant to register the party for reporting. Each registered merchant counts as a seat: the same seat pops are deducted on registration and again every 30 days for as long as the merchant stays registered — see [Pops & pricing](/get-started/pricing) for how seats are billed. Upload the company as a party (Console → Parties → Suppliers → + New Supplier, or via the Create an Entry API) with name, tax\_id, address, and email. Then run it through the party registration workflow — the contact will receive a registration wizard link to provide proof of ownership. Once approved, the party is registered on the Peppol network (SMP+SML+Peppol visibility by default with the `ubl-invoice` doc group) and ready to receive invoices. A supplier with that Participant ID already exists in your workspace. Either reuse the existing party or, if it really is a new entity, check whether it should be registered under an alternative scheme (for example Belgium's `9925` VAT scheme rather than the default `0208`). Register them through different silo entries, even though they represent the same legal party. The supplier must upload proof of ownership for each inbox. Unique identifiers for entities on the Peppol network, made up of two parts: * **Scheme** — identifies the type of identifier (e.g. `9920` for Spanish VAT, `0208` for Belgian KBO/BCE) * **Code** — the actual identification number Participant IDs are usually based on VAT numbers or local business identifiers, and Invopop can derive them automatically from a Tax ID. Some countries support multiple schemes — Belgium, for example, defaults to `0208` but some entities are only registered under `9925` (VAT). If you hit a "receiver not found" error, the recipient may be registered under an alternative scheme. Peppol Party visibility determines what you can send and receive: * `smp` — SMP only, for testing * `smp+sml` — SMP and SML, useful when you only want to send * `smp+sml+peppol` — SMP, SML, and the Peppol Directory, recommended for both sending and receiving (and for being discoverable in the Directory) In general, use the highest visibility available. Receiving questions Register the recipient with Invopop as their Plateforme Agréée. Inbound documents (UBL, CII, Factur-X) are converted to GOBL and stored in the Expenses folder. Chorus Pro inbound flow is separate and routes via the Chorus Pro app. UBL via [`gobl.peppol`](https://github.com/invopop/gobl.peppol); CII and Factur-X via [`gobl.cii`](https://github.com/invopop/gobl.cii). The original structured XML (or PDF/A-3 with embedded XML) is preserved as a silo entry attachment. Register the recipient via Invopop as their PA. Inbound UBL/CII/Factur-X documents are routed to the configured Import workflow and become GOBL silo entries. Lifecycle status updates (CDAR) feed back to the issuer through the same channel. UBL, CII, or Factur-X (PDF with embedded CII XML), all conforming to EN 16931 and the French CTC profile. Invopop preserves the original and exposes the GOBL conversion. Yes. A single company can be reachable at several destinations by registering different routing identifiers (electronic addresses) in the Annuaire — one per PDP or inbox. Invoices addressed to a given identifier are delivered to the platform registered against it, so you can route some invoices to Invopop and others to a different PDP (for example a travel-and-expense tool) for the same SIREN. The Annuaire supports several address formats that map to increasingly granular destinations within the same company: * `SIREN` — the company as a whole. * `SIREN_SIRET` — a specific establishment. * `SIREN_SIRET_ROUTINGCODE` — a site, department, or workflow within an establishment. * `SIREN_SUFFIX` — a custom routing suffix. Give each PDP or inbox a distinct identifier and share the matching address with each issuer, so their invoices reach the intended destination. You can [look up an electronic address](/guides/fr-lookup) in the Annuaire to confirm where it currently routes. Register the recipient as a Peppol participant with Invopop as their Access Point. Incoming documents are routed through your configured Import workflow, which converts the UBL or CII payload to GOBL and stores the entry in the Expenses folder. Yes. Either format can be removed based on your needs. The default template includes both for comprehensiveness, but if you're certain you'll only receive invoices in one syntax, dropping the other simplifies the workflow and reduces the apps you need to activate. The Import workflow's UBL and CII parser steps map the inbound XML into a GOBL invoice. From there you can route it to webhooks, Google Drive, accounting integrations, or any other destination — the GOBL representation is the single source of truth for downstream processing. Reporting questions For TVA, file via DGFiP's portal — Invopop does not generate CA3 yet. For e-reporting (Flow 10): submit via your Plateforme Agréée — Invopop's e-reporting workflow batches transactions per period and submits to the PPF. TVA: DGFiP's EDI-TVA XML schema. E-reporting Flow 10: a structured JSON/XML payload defined by the PPF specification (currently in beta). Invopop emits Flow 10 via the upcoming `fr-ctc-flow10-v1` GOBL addon. Flow 10 e-reporting: 3× per month (every 10 days) for B2C and cross-border transactions. Lifecycle status (CDAR): per event, near real-time. Specific deadlines depend on the supplier's tax filing cadence (monthly/quarterly). Flow 10 uses a JSON envelope wrapping aggregated transaction data, defined in the PPF technical specification. Lifecycle CDAR payloads are XML messages exchanged over Peppol with structured status codes. Recording a transaction for e-reporting (B2C or international B2B) costs **2 pops** per invoice: 1 pop to record it and 1 pop for the silo entry. On top of that, each report submission costs **10 pops**. See [Pops & pricing](/get-started/pricing) for how pops work. More answers in our [France FAQ](/faq/france) section
### Plateforme Agréée scope The PA implementation is being actively developed. Action names, GOBL add-ons, and workflows can change before the 1 September 2026 mandate, especially items marked `Beta` or `In development`. | Capability | Status | Notes | | ---------------------------------- | ----------------------------- | ------------------------------------------------------------------------------------------------------------------------- | | Annuaire registration | Available | Self-serve KYC in development | | Send invoices (UBL, CII, Factur-X) | Available | API may change before Sept 2026 | | Receive invoices | Available | API may change before Sept 2026 | | Lifecycle status (CDAR) | Beta | Moving to a first-class GOBL document | | E-reporting (Flow 10) | In development | [`fr-ctc-flow10-v1`](https://docs.gobl.org/addons/fr-ctc-flow10-v1) add-on released; the flow itself is not available yet | The following workflow actions will be available once you install and enable this app. Plateforme Agréée — registration Register a party in the French Annuaire so they can issue and receive regulated e-invoices. Register the party on the Peppol network for transport. Enable the party for periodic e-reporting to the PPF. Remove a party's Annuaire registration. Disable a party's e-reporting registration. Plateforme Agréée — invoicing
1
Record the invoice in the directory ahead of transmission and PPF reporting.
1
Generate a Peppol France CIUS UBL invoice or credit note from a GOBL document.
Generate a UN/CEFACT CII XML document from a GOBL invoice.
1
Send the generated document over the Peppol network to the buyer's PA.
Forward the simplified F1 invoice to the PPF as the fifth corner. Import an inbound Peppol document into the workflow. Parse an inbound UBL document into a GOBL invoice. Parse an inbound UN/CEFACT CII document into a GOBL invoice. Extract the embedded CII XML from a Factur-X PDF/A-3 and parse it into GOBL. Plateforme Agréée — status Build a Cross Domain Acknowledgement and Response document for lifecycle status updates. Persist a lifecycle status update in the directory. Forward a lifecycle status to the PPF for regulated flows.
Plateforme Agréée — invoicing ```json PPF send document workflow theme={"system"} { "name": "PPF send document", "description": "Send an invoice, status or payment via Peppol and record it with PPF", "steps": [ { "id": "72bc5070-1a17-11f1-a82f-e740c226ef51", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "f5aaed10-13c9-11f1-98a6-7dfa4cb26122", "name": "Sign envelope", "provider": "silo.close" }, { "id": "bf2c86b0-8127-11f1-9e29-9d2d7ab31d21", "name": "Document is an invoice?", "provider": "silo.if", "next": [ { "status": "NA", "code": "true", "steps": [ { "id": "1b5850d0-13bf-11f1-bc3b-b99ec414b63d", "name": "Generate UBL document", "provider": "ubl.generate", "summary": "Peppol France CIUS v1", "config": { "attach_invoice_pdf": false, "doc_type": "peppol-fr-cius", "private": false, "validate_ubl": false } } ] }, { "status": "NA", "code": "false", "steps": [ { "id": "e30aa7b0-8127-11f1-9e29-9d2d7ab31d21", "name": "Generate CDAR Status", "provider": "cii.generate", "summary": "France CTC Flow 6 CDAR (lifecycle status/payment)", "config": { "attach_invoice_pdf": false, "doc_type": "fr-ctc-cdar-flow6", "validate_cii": false } } ] } ], "config": { "expr": "doc['$schema'] endsWith 'bill/invoice'", "scope": "env" } }, { "id": "f1e30fa0-13c9-11f1-98a6-7dfa4cb26122", "name": "Record document for e-invoicing", "provider": "gov-fr.directory.record" }, { "id": "ab598990-16f0-11f1-86ba-d13d91b4f398", "name": "Send Peppol document", "provider": "peppol.send" }, { "id": "79bd38d0-1a17-11f1-a82f-e740c226ef51", "name": "Set state", "provider": "silo.state", "summary": "Set state to `sent`{.state .sent}", "config": { "state": "sent" } }, { "id": "e1f6ce90-16eb-11f1-86ba-d13d91b4f398", "name": "Forward document to PPF", "provider": "gov-fr.directory.forward" }, { "id": "80a9d5e0-1a17-11f1-a82f-e740c226ef51", "name": "Set state", "provider": "silo.state", "summary": "Set state to `completed`{.state .completed}", "config": { "state": "completed" } } ], "rescue": [ { "id": "892a8070-1a17-11f1-a82f-e740c226ef51", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` ```json PPF receive document workflow theme={"system"} { "name": "PPF receive document", "description": "Receive an invoice, status or payment via Peppol and register it with PPF", "steps": [ { "id": "db61c3c0-0fb5-11f0-b078-9fc456829eca", "name": "Import Peppol document", "provider": "peppol.import", "next": [ { "status": "NA", "code": "UBL", "steps": [ { "id": "62e94570-8fdb-11f0-a8fb-61ec9e5a76ba", "name": "Import UBL document", "provider": "ubl.import" } ] }, { "status": "NA", "code": "CII", "steps": [ { "id": "6480ae50-8fdb-11f0-a8fb-61ec9e5a76ba", "name": "Import CII document", "provider": "cii.import" } ] }, { "status": "NA", "code": "PDF", "steps": [ { "id": "26ba4f80-1e2a-11f1-8bfb-2beaa1df60f0", "name": "Import Factur-X PDF", "provider": "cii.pdf.import" } ] } ], "notes": "Receives the Peppol document and returns the format in a code (UBL/CII/PDF)" }, { "id": "9c15ac60-7b8c-11f1-bf7f-e1e339678581", "name": "Document is invoice?", "provider": "silo.if", "next": [ { "code": "true", "steps": [ { "id": "a48f03f0-7b8c-11f1-bf7f-e1e339678581", "name": "Sign Envelope", "provider": "silo.close", "next": [], "notes": "If it's an invoice, sign, generate a PDF and place it in the Expenses folder" }, { "id": "a80b8080-7b8c-11f1-bf7f-e1e339678581", "name": "Generate PDF", "provider": "pdf", "next": [], "summary": "French - A4", "config": { "logo_height": 40, "locale": "fr", "date_format": "%Y-%m-%d", "time_format": "%H:%M", "layout": "A4", "scripting": false, "label": "", "watermark": "", "currency_template": "", "negative_template": "", "thousands_separator": "", "decimal_mark": "", "duplicate": false } }, { "id": "ab7e1200-7b8c-11f1-bf7f-e1e339678581", "name": "Set Folder", "provider": "silo.folder", "next": [], "summary": "Set folder to `Invoices · Expenses`{.font-medium}", "config": { "folder": "expenses" } } ] } ], "summary": "", "config": { "expr": "$schema endsWith \"bill/invoice\"", "scope": "doc" }, "notes": "Checks for bill/invoice document" }, { "id": "2f4ad890-1e2a-11f1-8bfb-2beaa1df60f0", "name": "Record document for e-invoicing", "provider": "gov-fr.directory.record" }, { "id": "dd14a3e0-0fb5-11f0-b078-9fc456829eca", "name": "Set state", "provider": "silo.state", "summary": "Set state to `received`{.state .received}", "config": { "state": "received" } } ], "rescue": [ { "id": "e109d2e0-0fb5-11f0-b078-9fc456829eca", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` ```json Example Factur-X workflow theme={"system"} { "name": "Factur-X issue invoice", "description": "Generate a Factur-X invoice (PDF with embedded CII)", "schema": "bill/invoice", "steps": [ { "id": "bd7eb640-abd0-11ef-a013-91c68ca9f44b", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "58fb4ce0-6626-11f0-b9ab-1bbe1fa4398c", "name": "Sign envelope", "provider": "silo.close" }, { "id": "3548d720-6623-11f0-b3db-e7255a5da07c", "name": "Generate CII document", "provider": "cii.generate", "summary": "Factur-X v1", "config": { "doc_type": "facturx-v1" } }, { "id": "56bda1e0-8ef7-11f0-aa0e-dd7c69b95f3c", "name": "Generate PDF", "provider": "pdf", "summary": "French · A4", "config": { "logo_height": 40, "locale": "fr", "date_format": "%Y-%m-%d", "layout": "A4", "scripting": false } }, { "id": "c6192a60-abd0-11ef-a013-91c68ca9f44b", "name": "Set state", "provider": "silo.state", "summary": "Set state to `sent`{.state .sent}", "config": { "state": "sent" } } ], "rescue": [ { "id": "c94982c0-abd0-11ef-a013-91c68ca9f44b", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` Plateforme Agréée — party ```json PPF register supplier workflow theme={"system"} { "name": "PPF register supplier", "description": "Register a supplier with the French Directory and Peppol", "schema": "org/party", "steps": [ { "id": "0adf46e0-8fdb-11f0-a8fb-61ec9e5a76ba", "name": "Sign PPF agreement", "provider": "gov-fr.agreement.sign", "notes": "Generates the PA mandate to authorize Invopop to act on behalf of the supplier" }, { "id": "0e44b900-8fdb-11f0-a8fb-61ec9e5a76ba", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "12aaf950-8fdb-11f0-a8fb-61ec9e5a76ba", "name": "Wait for PPF agreement upload", "provider": "gov-fr.agreement.wait.approval", "notes": "Pauses until the signed agreement is uploaded and accepted" }, { "id": "b194f710-5451-11f1-baf5-4f2c2882107f", "name": "Set state", "provider": "silo.state", "summary": "Set state to `completed`{.state .completed}", "config": { "state": "completed" } }, { "id": "d10a4680-1e29-11f1-8bfb-2beaa1df60f0", "name": "Register party in Directory", "provider": "gov-fr.directory.register", "notes": "Submits the SIREN to the French Annuaire for invoice routing" }, { "id": "7a5a4db0-0fae-11f0-b37b-0be1c251a274", "name": "Register party on Peppol", "provider": "peppol.register", "summary": "Enabled · groups: france", "config": { "directory": true, "disable": false, "doc_groups": [ "france" ], "visibility": "smp+sml+peppol" }, "notes": "Publishes the party, enabling Peppol routing for sending and receiving" }, { "id": "b523ae4a-7b39-4410-abaa-b03a4e33f7bd", "name": "Register party for reporting", "provider": "gov-fr.reporting.register", "notes": "Registers the SIREN for reporting" }, { "id": "7c2fa9f0-0fae-11f0-b37b-0be1c251a274", "name": "Set state", "provider": "silo.state", "summary": "Set state to `registered`{.state .registered}", "config": { "state": "registered" } } ], "rescue": [ { "id": "a34e83f0-25dc-11f0-b641-350e77c28eed", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` ```json PPF unregister supplier workflow theme={"system"} { "name": "PPF unregister supplier", "description": "Unregister a supplier from Peppol and the French Directory", "schema": "org/party", "steps": [ { "id": "453beac0-70a7-11f1-aca9-697108ec55ef", "name": "Unregister supplier from Peppol", "provider": "peppol.unregister" }, { "id": "13c84e60-5452-11f1-baf5-4f2c2882107f", "name": "Disable party in Directory", "provider": "gov-fr.directory.disable" }, { "id": "c91ae086-f830-425b-b67c-72af00efc22c", "name": "Disable party for reporting", "provider": "gov-fr.reporting.disable" }, { "id": "1b8a6b80-5452-11f1-baf5-4f2c2882107f", "name": "Set state", "provider": "silo.state", "summary": "Set state to `void`{.state .void}", "config": { "state": "void" } } ], "rescue": [ { "id": "23e0d3a0-5452-11f1-baf5-4f2c2882107f", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` Parties A French party ready for the PA flows: a SIREN identity with `iso-scheme-id` `0002`, a `0225` Peppol inbox matching the SIREN, and a French address. ```json France supplier example expandable theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "Marseille Commerce SAS", "tax_id": { "country": "FR", "code": "83526018155" }, "identities": [ { "type": "SIREN", "code": "526018155", "ext": { "iso-scheme-id": "0002" } } ], "people": [ { "name": { "given": "Claire", "surname": "Moreau" }, "role": "Directrice", "identities": [{ "label": "Passport/document number", "code": "123456" }] } ], "inboxes": [ { "key": "peppol", "scheme": "0225", "code": "526018155" } ], "addresses": [ { "num": "25", "street": "Avenue des Champs-Élysées", "locality": "Paris", "code": "75008", "country": "FR" } ], "emails": [ { "addr": "facturation@marseillecommerce.fr" } ], "telephones": [ { "num": "+33100200300" } ] } ``` The receiving side of a domestic PA invoice — same requirements as the supplier: SIREN identity (`0002`), matching `0225` Peppol inbox, and a French address. ```json France customer example theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "Grande Distribution SA", "tax_id": { "country": "FR", "code": "44732829320" }, "identities": [ { "type": "SIREN", "code": "732829320", "ext": { "iso-scheme-id": "0002" } } ], "inboxes": [ { "key": "peppol", "scheme": "0225", "code": "732829320" } ], "addresses": [ { "num": "40", "street": "Boulevard du Commerce", "locality": "Paris", "code": "75012", "country": "FR" } ], "emails": [ { "addr": "comptabilite@grandedistribution.fr" } ], "telephones": [ { "num": "+33100200400" } ] } ``` Plateforme Agréée (Flow 2) example invoices A regulated B2B invoice between two French parties, both registered in the Annuaire. The [`fr-ctc-flow2-v1`](https://docs.gobl.org/addons/fr-ctc-flow2-v1) add-on drives validation for the PA e-invoicing flow. Notice: * both parties carry a `SIREN` identity with `iso-scheme-id` `0002` and a `peppol` inbox under scheme `0225` so the workflow can route via Peppol, * `fr-ctc-billing-mode` `S1` marks the standard submission (*dépôt*) of a services invoice; `untdid-document-type` `380` confirms the commercial invoice type, * the `payment`, `payment-method`, and `payment-term` notes carry the French legal-mention text (penalty clauses, late-payment terms, early-payment discount), each tagged with the appropriate UNTDID 4451 subject code, * `ordering.code` records the customer's purchase order reference. ```json PA B2B Invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "FR", "$addons": [ "fr-ctc-flow2-v1" ], "type": "standard", "series": "FAC", "code": "2024-00001", "issue_date": "2024-06-13", "currency": "EUR", "tax": { "ext": { "fr-ctc-billing-mode": "S1", "untdid-document-type": "380" } }, "supplier": { "name": "Fournisseur Example SARL", "tax_id": { "country": "FR", "code": "732829320" }, "identities": [ { "type": "SIREN", "code": "732829320", "ext": { "iso-scheme-id": "0002" } } ], "inboxes": [ { "key": "peppol", "scheme": "0225", "code": "732829320" } ], "addresses": [ { "num": "123", "street": "Rue de la Paix", "locality": "Paris", "code": "75001", "country": "FR" } ], "emails": [ { "addr": "facturation@fournisseur.fr" } ], "telephones": [ { "num": "+33100200300" } ] }, "customer": { "name": "Client Example SAS", "tax_id": { "country": "FR", "code": "356000000" }, "identities": [ { "type": "SIREN", "code": "356000000", "ext": { "iso-scheme-id": "0002" } } ], "inboxes": [ { "key": "peppol", "scheme": "0225", "code": "356000000" } ], "addresses": [ { "num": "456", "street": "Avenue des Champs-Elysees", "locality": "Paris", "code": "75008", "country": "FR" } ], "emails": [ { "addr": "comptabilite@client.fr" } ], "telephones": [ { "num": "+33100200400" } ] }, "lines": [ { "quantity": "10", "item": { "name": "Services de conseil", "price": "100.00", "unit": "h" }, "discounts": [ { "percent": "10%", "reason": "Remise fidelite" } ], "taxes": [ { "cat": "VAT", "rate": "standard" } ] } ], "ordering": { "code": "PO-2024-001" }, "notes": [ { "key": "payment", "text": "Une penalite fixe de 40 EUR sera appliquee en cas de retard de paiement.", "ext": { "untdid-text-subject": "PMT" } }, { "key": "payment-method", "text": "Des penalites de retard s'appliquent conformement a nos conditions generales de vente.", "ext": { "untdid-text-subject": "PMD" } }, { "key": "payment-term", "text": "Aucun escompte n'est offert pour paiement anticipe.", "ext": { "untdid-text-subject": "AAB" } } ], "payment": { "instructions": { "key": "credit-transfer", "credit_transfer": [ { "iban": "FR7630006000011234567890189", "name": "Fournisseur Example SARL" } ] }, "terms": { "detail": "Paiement a 30 jours" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "FR", "$addons": [ "eu-en16931-v2017", "fr-ctc-flow2-v1" ], "type": "standard", "series": "FAC", "code": "2024-00001", "issue_date": "2024-06-13", "currency": "EUR", "tax": { "rounding": "currency", "ext": { "fr-ctc-billing-mode": "S1", "untdid-document-type": "380" } }, "supplier": { "name": "Fournisseur Example SARL", "tax_id": { "country": "FR", "code": "44732829320" }, "identities": [ { "scope": "legal", "type": "SIREN", "code": "732829320", "ext": { "iso-scheme-id": "0002" } } ], "endpoints": [ { "uri": "iso6523-actorid-upis::0225:732829320" } ], "inboxes": [ { "key": "peppol", "scheme": "0225", "code": "732829320" } ], "addresses": [ { "num": "123", "street": "Rue de la Paix", "locality": "Paris", "code": "75001", "country": "FR" } ], "emails": [ { "addr": "facturation@fournisseur.fr" } ], "telephones": [ { "num": "+33100200300" } ] }, "customer": { "name": "Client Example SAS", "tax_id": { "country": "FR", "code": "39356000000" }, "identities": [ { "scope": "legal", "type": "SIREN", "code": "356000000", "ext": { "iso-scheme-id": "0002" } } ], "endpoints": [ { "uri": "iso6523-actorid-upis::0225:356000000" } ], "inboxes": [ { "key": "peppol", "scheme": "0225", "code": "356000000" } ], "addresses": [ { "num": "456", "street": "Avenue des Champs-Elysees", "locality": "Paris", "code": "75008", "country": "FR" } ], "emails": [ { "addr": "comptabilite@client.fr" } ], "telephones": [ { "num": "+33100200400" } ] }, "lines": [ { "i": 1, "quantity": "10", "item": { "name": "Services de conseil", "price": "100.00", "unit": "h" }, "sum": "1000.00", "discounts": [ { "reason": "Remise fidelite", "percent": "10%", "amount": "100.00" } ], "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "20%", "ext": { "untdid-tax-category": "S" } } ], "total": "900.00" } ], "ordering": { "code": "PO-2024-001" }, "payment": { "terms": { "notes": "Paiement a 30 jours" }, "instructions": { "key": "credit-transfer", "credit_transfer": [ { "iban": "FR7630006000011234567890189", "name": "Fournisseur Example SARL" } ], "ext": { "untdid-payment-means": "30" } } }, "totals": { "sum": "900.00", "total": "900.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "untdid-tax-category": "S" }, "base": "900.00", "percent": "20%", "amount": "180.00" } ], "amount": "180.00" } ], "sum": "180.00" }, "tax": "180.00", "total_with_tax": "1080.00", "payable": "1080.00" }, "notes": [ { "key": "payment", "text": "Une penalite fixe de 40 EUR sera appliquee en cas de retard de paiement.", "ext": { "untdid-text-subject": "PMT" } }, { "key": "payment-method", "text": "Des penalites de retard s'appliquent conformement a nos conditions generales de vente.", "ext": { "untdid-text-subject": "PMD" } }, { "key": "payment-term", "text": "Aucun escompte n'est offert pour paiement anticipe.", "ext": { "untdid-text-subject": "AAB" } } ] } ``` A domestic B2B invoice for construction works supplied by a subcontractor to a taxable main contractor. Because both parties are French, this stays in the PA e-invoicing flow ([`fr-ctc-flow2-v1`](https://docs.gobl.org/addons/fr-ctc-flow2-v1)) even though it carries no VAT — it is not e-reporting. Notice: * the VAT combo uses the `reverse-charge` key, which sets `untdid-tax-category` `AE` and produces a `0.00` VAT total, with no tax rate or amount on the line, * the `reverse-charge` note text is set explicitly to cite **article 283-2 nonies** (subcontracting); left to the regime default it would cite the generic article 283-1, * `fr-ctc-billing-mode` is `S1` — a plain services submission: the reverse charge is carried entirely by the VAT key and note. `S5` (subcontractor invoice) applies only to subcontracting with payment delegation (*paiement direct*), which is not the case here, * the reverse charge only applies where the customer is a taxable person — invoicing a non-taxable property owner would carry standard VAT instead. ```json PA B2B Reverse Charge Invoice (Subcontracting) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "FR", "$addons": [ "fr-ctc-flow2-v1" ], "$tags": [ "reverse-charge" ], "type": "standard", "series": "ST", "code": "2026-00001", "issue_date": "2026-09-15", "currency": "EUR", "tax": { "ext": { "fr-ctc-billing-mode": "S1", "untdid-document-type": "380" }, "notes": [ { "cat": "VAT", "key": "reverse-charge", "text": "Autoliquidation – TVA due par le preneur, article 283-2 nonies du CGI." } ] }, "supplier": { "name": "Plomberie Dupont SARL", "tax_id": { "country": "FR", "code": "303265045" }, "identities": [ { "type": "SIREN", "code": "303265045", "ext": { "iso-scheme-id": "0002" } } ], "inboxes": [ { "key": "peppol", "scheme": "0225", "code": "303265045" } ], "addresses": [ { "num": "12", "street": "Rue des Artisans", "locality": "Lyon", "code": "69003", "country": "FR" } ] }, "customer": { "name": "Bâtiment Martin SA", "tax_id": { "country": "FR", "code": "732829320" }, "identities": [ { "type": "SIREN", "code": "732829320", "ext": { "iso-scheme-id": "0002" } } ], "inboxes": [ { "key": "peppol", "scheme": "0225", "code": "732829320" } ], "addresses": [ { "num": "5", "street": "Avenue de la Construction", "locality": "Villeurbanne", "code": "69100", "country": "FR" } ] }, "payment": { "terms": { "key": "due-date", "due_dates": [ { "date": "2026-10-15", "amount": "10000.00" } ] }, "instructions": { "key": "credit-transfer", "credit_transfer": [ { "iban": "FR7630006000011234567890189" } ] } }, "lines": [ { "quantity": "1", "item": { "name": "Travaux de plomberie en sous-traitance", "price": "10000.00" }, "taxes": [ { "cat": "VAT", "key": "reverse-charge" } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "FR", "$addons": [ "eu-en16931-v2017", "fr-ctc-flow2-v1" ], "$tags": [ "reverse-charge" ], "type": "standard", "series": "ST", "code": "2026-00001", "issue_date": "2026-09-15", "currency": "EUR", "tax": { "rounding": "currency", "ext": { "fr-ctc-billing-mode": "S1", "untdid-document-type": "380" }, "notes": [ { "cat": "VAT", "key": "reverse-charge", "text": "Autoliquidation – TVA due par le preneur, article 283-2 nonies du CGI.", "ext": { "untdid-tax-category": "AE" } } ] }, "supplier": { "name": "Plomberie Dupont SARL", "tax_id": { "country": "FR", "code": "40303265045" }, "identities": [ { "scope": "legal", "type": "SIREN", "code": "303265045", "ext": { "iso-scheme-id": "0002" } } ], "endpoints": [ { "uri": "iso6523-actorid-upis::0225:303265045" } ], "inboxes": [ { "key": "peppol", "scheme": "0225", "code": "303265045" } ], "addresses": [ { "num": "12", "street": "Rue des Artisans", "locality": "Lyon", "code": "69003", "country": "FR" } ] }, "customer": { "name": "Bâtiment Martin SA", "tax_id": { "country": "FR", "code": "44732829320" }, "identities": [ { "scope": "legal", "type": "SIREN", "code": "732829320", "ext": { "iso-scheme-id": "0002" } } ], "endpoints": [ { "uri": "iso6523-actorid-upis::0225:732829320" } ], "inboxes": [ { "key": "peppol", "scheme": "0225", "code": "732829320" } ], "addresses": [ { "num": "5", "street": "Avenue de la Construction", "locality": "Villeurbanne", "code": "69100", "country": "FR" } ] }, "lines": [ { "i": 1, "quantity": "1", "item": { "name": "Travaux de plomberie en sous-traitance", "price": "10000.00", "unit": "one" }, "sum": "10000.00", "taxes": [ { "cat": "VAT", "key": "reverse-charge", "ext": { "untdid-tax-category": "AE" } } ], "total": "10000.00" } ], "payment": { "terms": { "key": "due-date", "due_dates": [ { "date": "2026-10-15", "amount": "10000.00" } ] }, "instructions": { "key": "credit-transfer", "credit_transfer": [ { "iban": "FR7630006000011234567890189" } ], "ext": { "untdid-payment-means": "30" } } }, "totals": { "sum": "10000.00", "total": "10000.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "reverse-charge", "ext": { "untdid-tax-category": "AE" }, "base": "10000.00", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "10000.00", "payable": "10000.00" }, "notes": [ { "key": "payment", "text": "Conditions de paiement selon les conditions générales de vente.", "ext": { "untdid-text-subject": "PMT" } }, { "key": "payment-method", "text": "Pénalités et indemnités de retard applicables conformément aux conditions générales de vente.", "ext": { "untdid-text-subject": "PMD" } }, { "key": "payment-term", "text": "Aucun escompte n'est accordé pour paiement anticipé.", "ext": { "untdid-text-subject": "AAB" } } ] } ``` A credit note that partially cancels a previously issued PA invoice. The `preceding` array references the original invoice by series, code, and issue date. Notice: * `type` is `credit-note` and `untdid-document-type` is `381` (commercial credit note), * the `preceding` block makes the link to the original invoice explicit — required for PA matching at the PPF. ```json PA B2B Credit Note theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "FR", "$addons": [ "fr-ctc-flow2-v1" ], "type": "credit-note", "series": "AV", "code": "2024-001", "issue_date": "2024-06-20", "currency": "EUR", "tax": { "ext": { "fr-ctc-billing-mode": "S1", "untdid-document-type": "381" } }, "preceding": [ { "type": "standard", "series": "FAC", "code": "2024-001", "issue_date": "2024-06-13" } ], "supplier": { "name": "Fournisseur Example SARL", "tax_id": { "country": "FR", "code": "732829320" }, "identities": [ { "type": "SIREN", "code": "732829320", "ext": { "iso-scheme-id": "0002" } } ], "inboxes": [ { "key": "peppol", "scheme": "0225", "code": "732829320" } ], "addresses": [ { "num": "123", "street": "Rue de la Paix", "locality": "Paris", "code": "75001", "country": "FR" } ], "emails": [ { "addr": "facturation@fournisseur.fr" } ] }, "customer": { "name": "Client Example SAS", "tax_id": { "country": "FR", "code": "356000000" }, "identities": [ { "type": "SIREN", "code": "356000000", "ext": { "iso-scheme-id": "0002" } } ], "inboxes": [ { "key": "peppol", "scheme": "0225", "code": "356000000" } ], "addresses": [ { "num": "456", "street": "Avenue des Champs-Elysees", "locality": "Paris", "code": "75008", "country": "FR" } ], "emails": [ { "addr": "comptabilite@client.fr" } ] }, "lines": [ { "quantity": "2", "item": { "name": "Services de conseil - Annulation partielle", "price": "100.00", "unit": "h" }, "taxes": [ { "cat": "VAT", "rate": "standard" } ] } ], "notes": [ { "key": "payment", "text": "Une penalite fixe de 40 EUR sera appliquee en cas de retard de paiement.", "ext": { "untdid-text-subject": "PMT" } }, { "key": "payment-method", "text": "Des penalites de retard s'appliquent conformement a nos conditions generales de vente.", "ext": { "untdid-text-subject": "PMD" } }, { "key": "payment-term", "text": "Aucun escompte n'est offert pour paiement anticipe.", "ext": { "untdid-text-subject": "AAB" } } ], "payment": { "instructions": { "key": "credit-transfer", "credit_transfer": [ { "iban": "FR7630006000011234567890189", "name": "Fournisseur Example SARL" } ] } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "FR", "$addons": [ "eu-en16931-v2017", "fr-ctc-flow2-v1" ], "type": "credit-note", "series": "AV", "code": "2024-001", "issue_date": "2024-06-20", "currency": "EUR", "preceding": [ { "type": "standard", "issue_date": "2024-06-13", "series": "FAC", "code": "2024-001" } ], "tax": { "rounding": "currency", "ext": { "fr-ctc-billing-mode": "S1", "untdid-document-type": "381" } }, "supplier": { "name": "Fournisseur Example SARL", "tax_id": { "country": "FR", "code": "44732829320" }, "identities": [ { "scope": "legal", "type": "SIREN", "code": "732829320", "ext": { "iso-scheme-id": "0002" } } ], "endpoints": [ { "uri": "iso6523-actorid-upis::0225:732829320" } ], "inboxes": [ { "key": "peppol", "scheme": "0225", "code": "732829320" } ], "addresses": [ { "num": "123", "street": "Rue de la Paix", "locality": "Paris", "code": "75001", "country": "FR" } ], "emails": [ { "addr": "facturation@fournisseur.fr" } ] }, "customer": { "name": "Client Example SAS", "tax_id": { "country": "FR", "code": "39356000000" }, "identities": [ { "scope": "legal", "type": "SIREN", "code": "356000000", "ext": { "iso-scheme-id": "0002" } } ], "endpoints": [ { "uri": "iso6523-actorid-upis::0225:356000000" } ], "inboxes": [ { "key": "peppol", "scheme": "0225", "code": "356000000" } ], "addresses": [ { "num": "456", "street": "Avenue des Champs-Elysees", "locality": "Paris", "code": "75008", "country": "FR" } ], "emails": [ { "addr": "comptabilite@client.fr" } ] }, "lines": [ { "i": 1, "quantity": "2", "item": { "name": "Services de conseil - Annulation partielle", "price": "100.00", "unit": "h" }, "sum": "200.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "20%", "ext": { "untdid-tax-category": "S" } } ], "total": "200.00" } ], "payment": { "instructions": { "key": "credit-transfer", "credit_transfer": [ { "iban": "FR7630006000011234567890189", "name": "Fournisseur Example SARL" } ], "ext": { "untdid-payment-means": "30" } } }, "totals": { "sum": "200.00", "total": "200.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "untdid-tax-category": "S" }, "base": "200.00", "percent": "20%", "amount": "40.00" } ], "amount": "40.00" } ], "sum": "40.00" }, "tax": "40.00", "total_with_tax": "240.00", "payable": "240.00" }, "notes": [ { "key": "payment", "text": "Une penalite fixe de 40 EUR sera appliquee en cas de retard de paiement.", "ext": { "untdid-text-subject": "PMT" } }, { "key": "payment-method", "text": "Des penalites de retard s'appliquent conformement a nos conditions generales de vente.", "ext": { "untdid-text-subject": "PMD" } }, { "key": "payment-term", "text": "Aucun escompte n'est offert pour paiement anticipe.", "ext": { "untdid-text-subject": "AAB" } } ] } ``` An advance (down-payment) invoice — used when a payment is collected before the final goods or services are delivered. Notice: * the `prepayment` tag sets `untdid-document-type` to `386` (advance payment invoice), * no billing mode is set explicitly: the add-on defaults `fr-ctc-billing-mode` to `M1` (submission of a mixed invoice — here a service plus a good); the advance nature is carried by the document type, not the billing mode, * the final invoice issued at delivery normally references this advance to net it off the total. ```json PA B2B Advance Payment Invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "FR", "$addons": [ "fr-ctc-flow2-v1" ], "$tags": [ "prepayment" ], "type": "standard", "series": "FAC", "code": "2024-AV-001", "issue_date": "2024-06-01", "currency": "EUR", "supplier": { "name": "Fournisseur Example SARL", "tax_id": { "country": "FR", "code": "732829320" }, "identities": [ { "type": "SIREN", "code": "732829320", "ext": { "iso-scheme-id": "0002" } } ], "inboxes": [ { "key": "peppol", "scheme": "0225", "code": "732829320" } ], "addresses": [ { "num": "123", "street": "Rue de la Paix", "locality": "Paris", "code": "75001", "country": "FR" } ], "emails": [ { "addr": "facturation@fournisseur.fr" } ] }, "customer": { "name": "Client Example SAS", "tax_id": { "country": "FR", "code": "356000000" }, "identities": [ { "type": "SIREN", "code": "356000000", "ext": { "iso-scheme-id": "0002" } } ], "inboxes": [ { "key": "peppol", "scheme": "0225", "code": "356000000" } ], "addresses": [ { "num": "456", "street": "Avenue des Champs-Elysees", "locality": "Paris", "code": "75008", "country": "FR" } ], "emails": [ { "addr": "comptabilite@client.fr" } ] }, "lines": [ { "quantity": "1", "item": { "name": "Acompte - Projet de developpement", "price": "5000.00" }, "taxes": [ { "cat": "VAT", "rate": "standard" } ] }, { "quantity": "1", "item": { "name": "Acompte - Serveur de developpement (materiel)", "price": "2000.00" }, "taxes": [ { "cat": "VAT", "rate": "standard" } ] } ], "notes": [ { "key": "payment", "text": "Une penalite fixe de 40 EUR sera appliquee en cas de retard de paiement.", "ext": { "untdid-text-subject": "PMT" } }, { "key": "payment-method", "text": "Des penalites de retard s'appliquent conformement a nos conditions generales de vente.", "ext": { "untdid-text-subject": "PMD" } }, { "key": "payment-term", "text": "Aucun escompte n'est offert pour paiement anticipe.", "ext": { "untdid-text-subject": "AAB" } } ], "payment": { "instructions": { "key": "credit-transfer", "credit_transfer": [ { "iban": "FR7630006000011234567890189", "name": "Fournisseur Example SARL" } ] }, "terms": { "detail": "Paiement immediat" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "FR", "$addons": [ "eu-en16931-v2017", "fr-ctc-flow2-v1" ], "$tags": [ "prepayment" ], "type": "standard", "series": "FAC", "code": "2024-AV-001", "issue_date": "2024-06-01", "currency": "EUR", "tax": { "rounding": "currency", "ext": { "fr-ctc-billing-mode": "M1", "untdid-document-type": "386" } }, "supplier": { "name": "Fournisseur Example SARL", "tax_id": { "country": "FR", "code": "44732829320" }, "identities": [ { "scope": "legal", "type": "SIREN", "code": "732829320", "ext": { "iso-scheme-id": "0002" } } ], "endpoints": [ { "uri": "iso6523-actorid-upis::0225:732829320" } ], "inboxes": [ { "key": "peppol", "scheme": "0225", "code": "732829320" } ], "addresses": [ { "num": "123", "street": "Rue de la Paix", "locality": "Paris", "code": "75001", "country": "FR" } ], "emails": [ { "addr": "facturation@fournisseur.fr" } ] }, "customer": { "name": "Client Example SAS", "tax_id": { "country": "FR", "code": "39356000000" }, "identities": [ { "scope": "legal", "type": "SIREN", "code": "356000000", "ext": { "iso-scheme-id": "0002" } } ], "endpoints": [ { "uri": "iso6523-actorid-upis::0225:356000000" } ], "inboxes": [ { "key": "peppol", "scheme": "0225", "code": "356000000" } ], "addresses": [ { "num": "456", "street": "Avenue des Champs-Elysees", "locality": "Paris", "code": "75008", "country": "FR" } ], "emails": [ { "addr": "comptabilite@client.fr" } ] }, "lines": [ { "i": 1, "quantity": "1", "item": { "name": "Acompte - Projet de developpement", "price": "5000.00", "unit": "one" }, "sum": "5000.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "20%", "ext": { "untdid-tax-category": "S" } } ], "total": "5000.00" }, { "i": 2, "quantity": "1", "item": { "name": "Acompte - Serveur de developpement (materiel)", "price": "2000.00", "unit": "one" }, "sum": "2000.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "20%", "ext": { "untdid-tax-category": "S" } } ], "total": "2000.00" } ], "payment": { "terms": { "notes": "Paiement immediat" }, "instructions": { "key": "credit-transfer", "credit_transfer": [ { "iban": "FR7630006000011234567890189", "name": "Fournisseur Example SARL" } ], "ext": { "untdid-payment-means": "30" } } }, "totals": { "sum": "7000.00", "total": "7000.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "untdid-tax-category": "S" }, "base": "7000.00", "percent": "20%", "amount": "1400.00" } ], "amount": "1400.00" } ], "sum": "1400.00" }, "tax": "1400.00", "total_with_tax": "8400.00", "payable": "8400.00" }, "notes": [ { "key": "payment", "text": "Une penalite fixe de 40 EUR sera appliquee en cas de retard de paiement.", "ext": { "untdid-text-subject": "PMT" } }, { "key": "payment-method", "text": "Des penalites de retard s'appliquent conformement a nos conditions generales de vente.", "ext": { "untdid-text-subject": "PMD" } }, { "key": "payment-term", "text": "Aucun escompte n'est offert pour paiement anticipe.", "ext": { "untdid-text-subject": "AAB" } } ] } ``` The final invoice that closes out the advance example above: the full contract is invoiced, and the down payment already billed (`FAC 2024-AV-001`) is netted off the total. Notice: * `fr-ctc-billing-mode` is pinned to `M4` (mixed, final invoice after down payment); left unset it would default back to `M1`, * flow 2 forbids advance-payment document types (386, 500, 503) on final invoices, so `untdid-document-type` stays `380` (BR-FR-CO-08), * `payment.advances` records the 8,400.00 already paid, referencing the advance invoice — `totals.due` comes out to the remaining 12,000.00, * the due-date payment terms cover only the outstanding balance. ```json PA B2B Final Invoice (After Advance) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "FR", "$addons": [ "fr-ctc-flow2-v1" ], "type": "standard", "series": "FAC", "code": "2024-00107", "issue_date": "2024-07-15", "currency": "EUR", "supplier": { "name": "Fournisseur Example SARL", "tax_id": { "country": "FR", "code": "732829320" }, "identities": [ { "type": "SIREN", "code": "732829320", "ext": { "iso-scheme-id": "0002" } } ], "inboxes": [ { "key": "peppol", "scheme": "0225", "code": "732829320" } ], "addresses": [ { "num": "123", "street": "Rue de la Paix", "locality": "Paris", "code": "75001", "country": "FR" } ], "emails": [ { "addr": "facturation@fournisseur.fr" } ] }, "customer": { "name": "Client Example SAS", "tax_id": { "country": "FR", "code": "356000000" }, "identities": [ { "type": "SIREN", "code": "356000000", "ext": { "iso-scheme-id": "0002" } } ], "inboxes": [ { "key": "peppol", "scheme": "0225", "code": "356000000" } ], "addresses": [ { "num": "456", "street": "Avenue des Champs-Elysees", "locality": "Paris", "code": "75008", "country": "FR" } ], "emails": [ { "addr": "comptabilite@client.fr" } ] }, "lines": [ { "quantity": "1", "item": { "name": "Projet de developpement - prestation complete", "price": "15000.00" }, "taxes": [ { "cat": "VAT", "rate": "standard" } ] }, { "quantity": "1", "item": { "name": "Serveur de developpement (materiel)", "price": "2000.00" }, "taxes": [ { "cat": "VAT", "rate": "standard" } ] } ], "notes": [ { "key": "payment", "text": "Une penalite fixe de 40 EUR sera appliquee en cas de retard de paiement.", "ext": { "untdid-text-subject": "PMT" } }, { "key": "payment-method", "text": "Des penalites de retard s'appliquent conformement a nos conditions generales de vente.", "ext": { "untdid-text-subject": "PMD" } }, { "key": "payment-term", "text": "Aucun escompte n'est offert pour paiement anticipe.", "ext": { "untdid-text-subject": "AAB" } } ], "payment": { "instructions": { "key": "credit-transfer", "credit_transfer": [ { "iban": "FR7630006000011234567890189", "name": "Fournisseur Example SARL" } ] }, "terms": { "key": "due-date", "due_dates": [ { "date": "2024-08-15", "amount": "12000.00" } ] }, "advances": [ { "description": "Acompte verse - facture FAC 2024-AV-001", "amount": "8400.00" } ] }, "tax": { "ext": { "fr-ctc-billing-mode": "M4" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "FR", "$addons": [ "eu-en16931-v2017", "fr-ctc-flow2-v1" ], "type": "standard", "series": "FAC", "code": "2024-00107", "issue_date": "2024-07-15", "currency": "EUR", "tax": { "rounding": "currency", "ext": { "fr-ctc-billing-mode": "M4", "untdid-document-type": "380" } }, "supplier": { "name": "Fournisseur Example SARL", "tax_id": { "country": "FR", "code": "44732829320" }, "identities": [ { "scope": "legal", "type": "SIREN", "code": "732829320", "ext": { "iso-scheme-id": "0002" } } ], "endpoints": [ { "uri": "iso6523-actorid-upis::0225:732829320" } ], "inboxes": [ { "key": "peppol", "scheme": "0225", "code": "732829320" } ], "addresses": [ { "num": "123", "street": "Rue de la Paix", "locality": "Paris", "code": "75001", "country": "FR" } ], "emails": [ { "addr": "facturation@fournisseur.fr" } ] }, "customer": { "name": "Client Example SAS", "tax_id": { "country": "FR", "code": "39356000000" }, "identities": [ { "scope": "legal", "type": "SIREN", "code": "356000000", "ext": { "iso-scheme-id": "0002" } } ], "endpoints": [ { "uri": "iso6523-actorid-upis::0225:356000000" } ], "inboxes": [ { "key": "peppol", "scheme": "0225", "code": "356000000" } ], "addresses": [ { "num": "456", "street": "Avenue des Champs-Elysees", "locality": "Paris", "code": "75008", "country": "FR" } ], "emails": [ { "addr": "comptabilite@client.fr" } ] }, "lines": [ { "i": 1, "quantity": "1", "item": { "name": "Projet de developpement - prestation complete", "price": "15000.00", "unit": "one" }, "sum": "15000.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "20%", "ext": { "untdid-tax-category": "S" } } ], "total": "15000.00" }, { "i": 2, "quantity": "1", "item": { "name": "Serveur de developpement (materiel)", "price": "2000.00", "unit": "one" }, "sum": "2000.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "20%", "ext": { "untdid-tax-category": "S" } } ], "total": "2000.00" } ], "payment": { "terms": { "key": "due-date", "due_dates": [ { "date": "2024-08-15", "amount": "12000.00" } ] }, "advances": [ { "description": "Acompte verse - facture FAC 2024-AV-001", "amount": "8400.00" } ], "instructions": { "key": "credit-transfer", "credit_transfer": [ { "iban": "FR7630006000011234567890189", "name": "Fournisseur Example SARL" } ], "ext": { "untdid-payment-means": "30" } } }, "totals": { "sum": "17000.00", "total": "17000.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "untdid-tax-category": "S" }, "base": "17000.00", "percent": "20%", "amount": "3400.00" } ], "amount": "3400.00" } ], "sum": "3400.00" }, "tax": "3400.00", "total_with_tax": "20400.00", "payable": "20400.00", "advance": "8400.00", "due": "12000.00" }, "notes": [ { "key": "payment", "text": "Une penalite fixe de 40 EUR sera appliquee en cas de retard de paiement.", "ext": { "untdid-text-subject": "PMT" } }, { "key": "payment-method", "text": "Des penalites de retard s'appliquent conformement a nos conditions generales de vente.", "ext": { "untdid-text-subject": "PMD" } }, { "key": "payment-term", "text": "Aucun escompte n'est offert pour paiement anticipe.", "ext": { "untdid-text-subject": "AAB" } } ] } ``` A restaurant cashes in a B2C sale — VAT is collected on the spot and reported through [e-reporting](/guides/fr-pa-reporting) — and the guest's company then asks for a proper invoice. That B2B invoice still travels the flux 2 e-invoicing flow, but must be marked so the VAT is not declared twice. Notice: * `fr-ctc-billing-mode` is pinned to `S7` (services, VAT already collected): the VAT was already reported with the B2C sale, so this invoice must not re-declare it. Left unset, the add-on would default to an already-paid mode and the VAT would be counted twice, * `B7` is the goods counterpart — e.g. retail goods sold over the counter and invoiced to a business afterwards, * the 100% advance records the on-site card payment, leaving `totals.due` at `0.00`, * restaurant meals carry the intermediate 10% VAT rate. ```json PA B2B Invoice After B2C Sale (VAT Collected) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "FR", "$addons": [ "fr-ctc-flow2-v1" ], "type": "standard", "series": "FAC", "code": "2026-00318", "issue_date": "2026-09-18", "currency": "EUR", "tax": { "ext": { "fr-ctc-billing-mode": "S7" } }, "supplier": { "name": "Le Bistrot du Marché SARL", "tax_id": { "country": "FR", "code": "303265045" }, "identities": [ { "type": "SIREN", "code": "303265045", "ext": { "iso-scheme-id": "0002" } } ], "inboxes": [ { "key": "peppol", "scheme": "0225", "code": "303265045" } ], "addresses": [ { "num": "18", "street": "Rue du Marché", "locality": "Lyon", "code": "69002", "country": "FR" } ] }, "customer": { "name": "Conseil & Associés SAS", "tax_id": { "country": "FR", "code": "356000000" }, "identities": [ { "type": "SIREN", "code": "356000000", "ext": { "iso-scheme-id": "0002" } } ], "inboxes": [ { "key": "peppol", "scheme": "0225", "code": "356000000" } ], "addresses": [ { "num": "9", "street": "Place Bellecour", "locality": "Lyon", "code": "69002", "country": "FR" } ] }, "lines": [ { "quantity": "4", "item": { "name": "Repas d'affaires - menu du jour", "price": "42.00" }, "taxes": [ { "cat": "VAT", "rate": "intermediate" } ] } ], "payment": { "advances": [ { "description": "Réglé sur place par carte bancaire", "percent": "100%" } ] } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "FR", "$addons": [ "eu-en16931-v2017", "fr-ctc-flow2-v1" ], "type": "standard", "series": "FAC", "code": "2026-00318", "issue_date": "2026-09-18", "currency": "EUR", "tax": { "rounding": "currency", "ext": { "fr-ctc-billing-mode": "S7", "untdid-document-type": "380" } }, "supplier": { "name": "Le Bistrot du Marché SARL", "tax_id": { "country": "FR", "code": "40303265045" }, "identities": [ { "scope": "legal", "type": "SIREN", "code": "303265045", "ext": { "iso-scheme-id": "0002" } } ], "endpoints": [ { "uri": "iso6523-actorid-upis::0225:303265045" } ], "inboxes": [ { "key": "peppol", "scheme": "0225", "code": "303265045" } ], "addresses": [ { "num": "18", "street": "Rue du Marché", "locality": "Lyon", "code": "69002", "country": "FR" } ] }, "customer": { "name": "Conseil \u0026 Associés SAS", "tax_id": { "country": "FR", "code": "39356000000" }, "identities": [ { "scope": "legal", "type": "SIREN", "code": "356000000", "ext": { "iso-scheme-id": "0002" } } ], "endpoints": [ { "uri": "iso6523-actorid-upis::0225:356000000" } ], "inboxes": [ { "key": "peppol", "scheme": "0225", "code": "356000000" } ], "addresses": [ { "num": "9", "street": "Place Bellecour", "locality": "Lyon", "code": "69002", "country": "FR" } ] }, "lines": [ { "i": 1, "quantity": "4", "item": { "name": "Repas d'affaires - menu du jour", "price": "42.00", "unit": "one" }, "sum": "168.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "intermediate", "percent": "10%", "ext": { "untdid-tax-category": "S" } } ], "total": "168.00" } ], "payment": { "advances": [ { "description": "Réglé sur place par carte bancaire", "percent": "100%", "amount": "184.80" } ] }, "totals": { "sum": "168.00", "total": "168.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "untdid-tax-category": "S" }, "base": "168.00", "percent": "10%", "amount": "16.80" } ], "amount": "16.80" } ], "sum": "16.80" }, "tax": "16.80", "total_with_tax": "184.80", "payable": "184.80", "advance": "184.80", "due": "0.00" }, "notes": [ { "key": "payment", "text": "Conditions de paiement selon les conditions générales de vente.", "ext": { "untdid-text-subject": "PMT" } }, { "key": "payment-method", "text": "Pénalités et indemnités de retard applicables conformément aux conditions générales de vente.", "ext": { "untdid-text-subject": "PMD" } }, { "key": "payment-term", "text": "Aucun escompte n'est accordé pour paiement anticipé.", "ext": { "untdid-text-subject": "AAB" } } ] } ``` A domestic B2B invoice issued by the customer on behalf of the supplier under a self-billing (autofacturation) agreement. Self-billed invoices between two French parties still travel through the PA e-invoicing flow ([`fr-ctc-flow2-v1`](https://docs.gobl.org/addons/fr-ctc-flow2-v1)). Notice: * the `self-billed` tag sets `untdid-document-type` to `389` (self-billed invoice) — supplier and customer keep their real commercial roles, the tag records that the customer produced the document, * the PA validation flips the routing check on self-billed types: it is the **customer**, as issuer, that must carry the `0225` inbox matching its SIREN, * the `legal` note carries the mandatory *Autofacturation* mention, auto-tagged with `untdid-text-subject` `ABL`; the standard French payment mentions (PMT, PMD, AAB) are filled with regime defaults at build time, * the reduced 5.5% VAT rate applies to the foodstuffs being supplied. ```json PA B2B Self-Billed Invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "FR", "$addons": [ "fr-ctc-flow2-v1" ], "$tags": [ "self-billed" ], "type": "standard", "series": "AF", "code": "2026-00042", "issue_date": "2026-09-30", "currency": "EUR", "tax": { "ext": { "fr-ctc-billing-mode": "B1" } }, "supplier": { "name": "Ferme de la Vallée SARL", "tax_id": { "country": "FR", "code": "303265045" }, "identities": [ { "type": "SIREN", "code": "303265045", "ext": { "iso-scheme-id": "0002" } } ], "inboxes": [ { "key": "peppol", "scheme": "0225", "code": "303265045" } ], "addresses": [ { "num": "3", "street": "Chemin des Vergers", "locality": "Avignon", "code": "84000", "country": "FR" } ] }, "customer": { "name": "Grande Distribution SA", "tax_id": { "country": "FR", "code": "732829320" }, "identities": [ { "type": "SIREN", "code": "732829320", "ext": { "iso-scheme-id": "0002" } } ], "inboxes": [ { "key": "peppol", "scheme": "0225", "code": "732829320" } ], "addresses": [ { "num": "40", "street": "Boulevard du Commerce", "locality": "Paris", "code": "75012", "country": "FR" } ] }, "lines": [ { "quantity": "500", "item": { "name": "Légumes de saison - livraison septembre", "price": "2.40", "unit": "kg" }, "taxes": [ { "cat": "VAT", "rate": "reduced" } ] } ], "notes": [ { "key": "legal", "text": "Autofacturation - facture établie par le client au nom et pour le compte du fournisseur." } ], "payment": { "terms": { "key": "due-date", "due_dates": [ { "date": "2026-10-30", "amount": "1266.00" } ] }, "instructions": { "key": "credit-transfer", "credit_transfer": [ { "iban": "FR7630006000011234567890189" } ] } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "FR", "$addons": [ "eu-en16931-v2017", "fr-ctc-flow2-v1" ], "$tags": [ "self-billed" ], "type": "standard", "series": "AF", "code": "2026-00042", "issue_date": "2026-09-30", "currency": "EUR", "tax": { "rounding": "currency", "ext": { "fr-ctc-billing-mode": "B1", "untdid-document-type": "389" } }, "supplier": { "name": "Ferme de la Vallée SARL", "tax_id": { "country": "FR", "code": "40303265045" }, "identities": [ { "scope": "legal", "type": "SIREN", "code": "303265045", "ext": { "iso-scheme-id": "0002" } } ], "endpoints": [ { "uri": "iso6523-actorid-upis::0225:303265045" } ], "inboxes": [ { "key": "peppol", "scheme": "0225", "code": "303265045" } ], "addresses": [ { "num": "3", "street": "Chemin des Vergers", "locality": "Avignon", "code": "84000", "country": "FR" } ] }, "customer": { "name": "Grande Distribution SA", "tax_id": { "country": "FR", "code": "44732829320" }, "identities": [ { "scope": "legal", "type": "SIREN", "code": "732829320", "ext": { "iso-scheme-id": "0002" } } ], "endpoints": [ { "uri": "iso6523-actorid-upis::0225:732829320" } ], "inboxes": [ { "key": "peppol", "scheme": "0225", "code": "732829320" } ], "addresses": [ { "num": "40", "street": "Boulevard du Commerce", "locality": "Paris", "code": "75012", "country": "FR" } ] }, "lines": [ { "i": 1, "quantity": "500", "item": { "name": "Légumes de saison - livraison septembre", "price": "2.40", "unit": "kg" }, "sum": "1200.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "reduced", "percent": "5.5%", "ext": { "untdid-tax-category": "S" } } ], "total": "1200.00" } ], "payment": { "terms": { "key": "due-date", "due_dates": [ { "date": "2026-10-30", "amount": "1266.00" } ] }, "instructions": { "key": "credit-transfer", "credit_transfer": [ { "iban": "FR7630006000011234567890189" } ], "ext": { "untdid-payment-means": "30" } } }, "totals": { "sum": "1200.00", "total": "1200.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "untdid-tax-category": "S" }, "base": "1200.00", "percent": "5.5%", "amount": "66.00" } ], "amount": "66.00" } ], "sum": "66.00" }, "tax": "66.00", "total_with_tax": "1266.00", "payable": "1266.00" }, "notes": [ { "key": "legal", "text": "Autofacturation - facture établie par le client au nom et pour le compte du fournisseur.", "ext": { "untdid-text-subject": "ABL" } }, { "key": "payment", "text": "Conditions de paiement selon les conditions générales de vente.", "ext": { "untdid-text-subject": "PMT" } }, { "key": "payment-method", "text": "Pénalités et indemnités de retard applicables conformément aux conditions générales de vente.", "ext": { "untdid-text-subject": "PMD" } }, { "key": "payment-term", "text": "Aucun escompte n'est accordé pour paiement anticipé.", "ext": { "untdid-text-subject": "AAB" } } ] } ``` A domestic B2B invoice destined for Factur-X output — a human-readable PDF with the UN/CEFACT CII XML embedded (the French implementation of the same specification as ZUGFeRD). It combines the [`fr-facturx-v1`](https://docs.gobl.org/addons/fr-facturx-v1) add-on for the Factur-X format with [`fr-ctc-flow2-v1`](https://docs.gobl.org/addons/fr-ctc-flow2-v1), so the same document is also valid for the PA e-invoicing flow. Notice: * the two add-ons compose: `fr-facturx-v1` drives the Factur-X output while `fr-ctc-flow2-v1` applies the PA validation; the `eu-en16931-v2017` profile they share is added automatically as a dependency, * each party declares only a `SIRET` identity — at build time the regime derives the legal `SIREN` identity (`iso-scheme-id` `0002`) from it, next to the `0225` Peppol inboxes required for PA routing, * `fr-ctc-billing-mode` is `S2` (services, already paid) because the 100% advance settles the invoice at issue; that mode requires payment terms whose due dates cover the total, leaving `totals.due` at `0.00`, * the French payment mentions (PMT, PMD, AAB) are filled with regime defaults at build time. ```json Factur-X B2B invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "FR", "$addons": [ "fr-ctc-flow2-v1", "fr-facturx-v1" ], "type": "standard", "series": "SAMPLE", "code": "2345", "issue_date": "2025-06-18", "currency": "EUR", "tax": { "ext": { "fr-ctc-billing-mode": "S2" } }, "supplier": { "name": "Provide One SARL", "tax_id": { "country": "FR", "code": "43498927917" }, "identities": [ { "type": "SIRET", "code": "49892791768734" } ], "inboxes": [ { "key": "peppol", "scheme": "0225", "code": "498927917" } ], "addresses": [ { "num": "42", "street": "Avenue des Ternes", "locality": "Paris", "code": "75017", "country": "FR" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Sample Consumer SAS", "tax_id": { "country": "FR", "code": "39356000000" }, "identities": [ { "type": "SIRET", "code": "35600000012345" } ], "inboxes": [ { "key": "peppol", "scheme": "0225", "code": "356000000" } ], "addresses": [ { "num": "1", "street": "Rue Sundacsakn", "locality": "Saint-Germain-En-Laye", "code": "75050", "country": "FR" } ], "emails": [ { "addr": "email@sample.com" } ] }, "lines": [ { "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "discounts": [ { "reason": "Special discount", "percent": "10%" } ], "taxes": [ { "cat": "VAT", "rate": "standard" } ] } ], "payment": { "advances": [ { "description": "Paid in full", "percent": "100%" } ], "terms": { "key": "due-date", "due_dates": [ { "date": "2025-06-18", "amount": "1944.00" } ] }, "instructions": { "key": "card", "card": {} } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "FR", "$addons": [ "eu-en16931-v2017", "fr-ctc-flow2-v1", "fr-facturx-v1" ], "type": "standard", "series": "SAMPLE", "code": "2345", "issue_date": "2025-06-18", "currency": "EUR", "tax": { "rounding": "currency", "ext": { "fr-ctc-billing-mode": "S2", "untdid-document-type": "380" } }, "supplier": { "name": "Provide One SARL", "tax_id": { "country": "FR", "code": "43498927917" }, "identities": [ { "type": "SIRET", "code": "49892791768734", "ext": { "iso-scheme-id": "0009" } }, { "scope": "legal", "type": "SIREN", "code": "498927917", "ext": { "iso-scheme-id": "0002" } } ], "endpoints": [ { "uri": "iso6523-actorid-upis::0225:498927917" } ], "inboxes": [ { "key": "peppol", "scheme": "0225", "code": "498927917" } ], "addresses": [ { "num": "42", "street": "Avenue des Ternes", "locality": "Paris", "code": "75017", "country": "FR" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Sample Consumer SAS", "tax_id": { "country": "FR", "code": "39356000000" }, "identities": [ { "type": "SIRET", "code": "35600000012345", "ext": { "iso-scheme-id": "0009" } }, { "scope": "legal", "type": "SIREN", "code": "356000000", "ext": { "iso-scheme-id": "0002" } } ], "endpoints": [ { "uri": "iso6523-actorid-upis::0225:356000000" } ], "inboxes": [ { "key": "peppol", "scheme": "0225", "code": "356000000" } ], "addresses": [ { "num": "1", "street": "Rue Sundacsakn", "locality": "Saint-Germain-En-Laye", "code": "75050", "country": "FR" } ], "emails": [ { "addr": "email@sample.com" } ] }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "discounts": [ { "reason": "Special discount", "percent": "10%", "amount": "180.00" } ], "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "20%", "ext": { "untdid-tax-category": "S" } } ], "total": "1620.00" } ], "payment": { "terms": { "key": "due-date", "due_dates": [ { "date": "2025-06-18", "amount": "1944.00" } ] }, "advances": [ { "description": "Paid in full", "percent": "100%", "amount": "1944.00" } ], "instructions": { "key": "card", "card": {}, "ext": { "untdid-payment-means": "48" } } }, "totals": { "sum": "1620.00", "total": "1620.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "untdid-tax-category": "S" }, "base": "1620.00", "percent": "20%", "amount": "324.00" } ], "amount": "324.00" } ], "sum": "324.00" }, "tax": "324.00", "total_with_tax": "1944.00", "payable": "1944.00", "advance": "1944.00", "due": "0.00" }, "notes": [ { "key": "payment", "text": "Conditions de paiement selon les conditions générales de vente.", "ext": { "untdid-text-subject": "PMT" } }, { "key": "payment-method", "text": "Pénalités et indemnités de retard applicables conformément aux conditions générales de vente.", "ext": { "untdid-text-subject": "PMD" } }, { "key": "payment-term", "text": "Aucun escompte n'est accordé pour paiement anticipé.", "ext": { "untdid-text-subject": "AAB" } } ] } ``` E-reporting (Flow 10) example documents A French supplier invoicing a customer in another EU member state. Cross-border B2B is **not** transmitted via the PA e-invoicing flow — it falls under [e-reporting](/guides/fr-pa-reporting) instead — but the same GOBL document is used as the source of truth for both. Notice: * the customer carries a DE tax ID and a generic email inbox rather than a Peppol address, * the VAT combo uses the `intra-community` key, which sets `untdid-tax-category` `K` automatically; the `cef-vatex` `VATEX-EU-IC` exemption reason marks the intra-community supply, * the [`fr-ctc-flow10-v1`](https://docs.gobl.org/addons/fr-ctc-flow10-v1) add-on validates the document for the periodic e-report to the PPF. ```json PA Cross-Border B2B Invoice (FR → DE) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "FR", "$addons": [ "fr-ctc-flow10-v1" ], "type": "standard", "series": "FAC", "code": "2024-INT-001", "issue_date": "2024-06-15", "currency": "EUR", "tax": { "ext": { "fr-ctc-billing-mode": "S1", "untdid-document-type": "380" } }, "supplier": { "name": "Fournisseur France SARL", "tax_id": { "country": "FR", "code": "732829320" }, "identities": [ { "type": "SIREN", "code": "732829320", "ext": { "iso-scheme-id": "0002" } } ], "inboxes": [ { "key": "peppol", "scheme": "0225", "code": "732829320" } ], "addresses": [ { "num": "123", "street": "Rue de la Paix", "locality": "Paris", "code": "75001", "country": "FR" } ], "emails": [ { "addr": "facturation@fournisseur.fr" } ] }, "customer": { "name": "Kunde Deutschland GmbH", "tax_id": { "country": "DE", "code": "111111125" }, "inboxes": [ { "email": "buchhaltung@kunde.de" } ], "addresses": [ { "num": "10", "street": "Berliner Strasse", "locality": "Berlin", "code": "10117", "country": "DE" } ], "emails": [ { "addr": "buchhaltung@kunde.de" } ] }, "lines": [ { "quantity": "5", "item": { "name": "Consulting services", "price": "200.00", "unit": "h" }, "taxes": [ { "cat": "VAT", "key": "intra-community", "ext": { "cef-vatex": "VATEX-EU-IC" } } ] } ], "notes": [ { "key": "payment", "text": "A fixed penalty of 40 EUR will apply to any late payment.", "ext": { "untdid-text-subject": "PMT" } }, { "key": "payment-method", "text": "Late payment penalties apply as per our general terms of sale.", "ext": { "untdid-text-subject": "PMD" } }, { "key": "payment-term", "text": "No discount offered for early payment.", "ext": { "untdid-text-subject": "AAB" } } ], "payment": { "instructions": { "key": "credit-transfer", "credit_transfer": [ { "iban": "FR7630006000011234567890189", "name": "Fournisseur France SARL" } ] }, "terms": { "detail": "Payment within 30 days" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "FR", "$addons": [ "fr-ctc-flow10-v1" ], "type": "standard", "series": "FAC", "code": "2024-INT-001", "issue_date": "2024-06-15", "currency": "EUR", "tax": { "ext": { "fr-ctc-billing-mode": "S1", "untdid-document-type": "380" } }, "supplier": { "name": "Fournisseur France SARL", "tax_id": { "country": "FR", "code": "44732829320" }, "identities": [ { "scope": "legal", "type": "SIREN", "code": "732829320", "ext": { "iso-scheme-id": "0002" } } ], "inboxes": [ { "key": "peppol", "scheme": "0225", "code": "732829320" } ], "addresses": [ { "num": "123", "street": "Rue de la Paix", "locality": "Paris", "code": "75001", "country": "FR" } ], "emails": [ { "addr": "facturation@fournisseur.fr" } ] }, "customer": { "name": "Kunde Deutschland GmbH", "tax_id": { "country": "DE", "code": "111111125" }, "identities": [ { "scope": "legal", "code": "DE111111125", "ext": { "iso-scheme-id": "0223" } } ], "inboxes": [ { "email": "buchhaltung@kunde.de" } ], "addresses": [ { "num": "10", "street": "Berliner Strasse", "locality": "Berlin", "code": "10117", "country": "DE" } ], "emails": [ { "addr": "buchhaltung@kunde.de" } ] }, "lines": [ { "i": 1, "quantity": "5", "item": { "name": "Consulting services", "price": "200.00", "unit": "h" }, "sum": "1000.00", "taxes": [ { "cat": "VAT", "key": "intra-community", "ext": { "cef-vatex": "VATEX-EU-IC", "untdid-tax-category": "K" } } ], "total": "1000.00" } ], "payment": { "terms": { "notes": "Payment within 30 days" }, "instructions": { "key": "credit-transfer", "credit_transfer": [ { "iban": "FR7630006000011234567890189", "name": "Fournisseur France SARL" } ] } }, "totals": { "sum": "1000.00", "total": "1000.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "intra-community", "ext": { "cef-vatex": "VATEX-EU-IC", "untdid-tax-category": "K" }, "base": "1000.00", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "1000.00", "payable": "1000.00" }, "notes": [ { "key": "payment", "text": "A fixed penalty of 40 EUR will apply to any late payment.", "ext": { "untdid-text-subject": "PMT" } }, { "key": "payment-method", "text": "Late payment penalties apply as per our general terms of sale.", "ext": { "untdid-text-subject": "PMD" } }, { "key": "payment-term", "text": "No discount offered for early payment.", "ext": { "untdid-text-subject": "AAB" } } ] } ``` A cross-border sale by a French supplier where the German customer issues the invoice under a self-billing agreement. Like all cross-border B2B, it is not transmitted through the PA e-invoicing flow — the French supplier reports the sale via [e-reporting](/guides/fr-pa-reporting) (Flux 10.1), validated by the [`fr-ctc-flow10-v1`](https://docs.gobl.org/addons/fr-ctc-flow10-v1) add-on. Notice: * the `self-billed` tag records that the customer issued the document; the e-reporting obligation stays with the French supplier, who includes the sale in its periodic Flux 10 submission, * Flow 10 has no dedicated self-billed document code — `untdid-document-type` stays `380`, unlike e-invoicing where the tag maps to `389`, * the intra-community VAT combo (`untdid-tax-category` `K`, `cef-vatex` `VATEX-EU-IC`) zero-rates the supply, as in the other cross-border example. ```json PA Cross-Border Self-Billed Invoice (FR → DE) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "FR", "$addons": [ "fr-ctc-flow10-v1" ], "$tags": [ "self-billed" ], "type": "standard", "series": "AF", "code": "2026-INT-007", "issue_date": "2026-09-30", "currency": "EUR", "tax": { "ext": { "fr-ctc-billing-mode": "B1" } }, "supplier": { "name": "Domaine de la Vallée SARL", "tax_id": { "country": "FR", "code": "303265045" }, "identities": [ { "type": "SIREN", "code": "303265045", "ext": { "iso-scheme-id": "0002" } } ], "addresses": [ { "num": "3", "street": "Chemin des Vergers", "locality": "Avignon", "code": "84000", "country": "FR" } ] }, "customer": { "name": "Weinhandel München GmbH", "tax_id": { "country": "DE", "code": "111111125" }, "inboxes": [ { "email": "buchhaltung@weinhandel.de" } ], "addresses": [ { "num": "10", "street": "Weinstrasse", "locality": "München", "code": "80331", "country": "DE" } ] }, "lines": [ { "quantity": "120", "item": { "name": "Côtes du Rhône 2024 (carton de 6)", "price": "45.00", "unit": "item" }, "taxes": [ { "cat": "VAT", "key": "intra-community", "ext": { "cef-vatex": "VATEX-EU-IC" } } ] } ], "notes": [ { "key": "legal", "text": "Autofacturation - facture établie par le client au nom et pour le compte du fournisseur." } ], "payment": { "instructions": { "key": "credit-transfer", "credit_transfer": [ { "iban": "FR7630006000011234567890189" } ] }, "terms": { "detail": "Paiement à 30 jours" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "FR", "$addons": [ "fr-ctc-flow10-v1" ], "$tags": [ "self-billed" ], "type": "standard", "series": "AF", "code": "2026-INT-007", "issue_date": "2026-09-30", "currency": "EUR", "tax": { "ext": { "fr-ctc-billing-mode": "B1", "untdid-document-type": "380" } }, "supplier": { "name": "Domaine de la Vallée SARL", "tax_id": { "country": "FR", "code": "40303265045" }, "identities": [ { "scope": "legal", "type": "SIREN", "code": "303265045", "ext": { "iso-scheme-id": "0002" } } ], "addresses": [ { "num": "3", "street": "Chemin des Vergers", "locality": "Avignon", "code": "84000", "country": "FR" } ] }, "customer": { "name": "Weinhandel München GmbH", "tax_id": { "country": "DE", "code": "111111125" }, "identities": [ { "scope": "legal", "code": "DE111111125", "ext": { "iso-scheme-id": "0223" } } ], "inboxes": [ { "email": "buchhaltung@weinhandel.de" } ], "addresses": [ { "num": "10", "street": "Weinstrasse", "locality": "München", "code": "80331", "country": "DE" } ] }, "lines": [ { "i": 1, "quantity": "120", "item": { "name": "Côtes du Rhône 2024 (carton de 6)", "price": "45.00", "unit": "item" }, "sum": "5400.00", "taxes": [ { "cat": "VAT", "key": "intra-community", "ext": { "cef-vatex": "VATEX-EU-IC", "untdid-tax-category": "K" } } ], "total": "5400.00" } ], "payment": { "terms": { "notes": "Paiement à 30 jours" }, "instructions": { "key": "credit-transfer", "credit_transfer": [ { "iban": "FR7630006000011234567890189" } ] } }, "totals": { "sum": "5400.00", "total": "5400.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "intra-community", "ext": { "cef-vatex": "VATEX-EU-IC", "untdid-tax-category": "K" }, "base": "5400.00", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "5400.00", "payable": "5400.00" }, "notes": [ { "key": "legal", "text": "Autofacturation - facture établie par le client au nom et pour le compte du fournisseur." } ] } ``` A cashed-in receipt from a domestic B2C transaction. Domestic B2C payments aggregate by `(date, currency)` and are rate-agnostic at the bucket level, so the tax breakdown lives directly on each line rather than on a referenced invoice. Notice: * `type` is `receipt` and `method.key` `credit-transfer` records how the money was received, * no `customer` is set — domestic B2C payments don't need counterparty identification, * `lines[i].document` is omitted on purpose: a line without a `document` reference is what classifies the payment as domestic B2C; a line with one would route it to international B2B instead, * `lines[i].tax.categories[...].rates[...]` carries the VAT base, percent and amount directly on each line, since domestic B2C buckets aggregate by `(date, currency)` and don't reference an underlying invoice. ```json FR B2C Payment (minimal) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/payment", "$regime": "FR", "type": "receipt", "method": { "key": "credit-transfer" }, "series": "B", "code": "PAY-B2C-001", "issue_date": "2026-04-15", "value_date": "2026-04-15", "currency": "EUR", "supplier": { "name": "Bistrot Lyon SAS", "tax_id": { "country": "FR", "code": "50522465228" }, "addresses": [ { "country": "FR" } ] }, "lines": [ { "i": 1, "amount": "600.00", "tax": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "base": "500.00", "percent": "20%", "amount": "100.00" } ], "amount": "100.00" } ], "sum": "100.00" } } ], "total": "600.00" } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/payment", "$regime": "FR", "type": "receipt", "series": "B", "code": "PAY-B2C-001", "issue_date": "2026-04-15", "value_date": "2026-04-15", "currency": "EUR", "supplier": { "name": "Bistrot Lyon SAS", "tax_id": { "country": "FR", "code": "50522465228" }, "addresses": [ { "country": "FR" } ] }, "lines": [ { "i": 1, "amount": "600.00", "tax": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "base": "500.00", "percent": "20%", "amount": "100.00" } ], "amount": "100.00" } ], "sum": "100.00" } } ], "methods": [ { "key": "credit-transfer", "amount": "600.00" } ], "total": "600.00" } ``` A cross-border B2B payment settling a previously issued invoice — here, Bistrot Lyon SAS cashing in from German customer Müller GmbH. International B2B payments report per-payment detail and require the counterparty identification plus a link to the underlying invoice. Notice: * `customer` is populated with the foreign counterparty (DE tax ID), * `lines[i].document` references the invoice being settled by `code` and `issue_date` — this is both how `gov-fr.reporting.record` classifies the payment as international B2B and how GOBL allocates the cashed amount across the original invoice's tax rates, * if the referenced invoice had mixed VAT rates and this payment only partially settles it, GOBL splits the cash proportionally across rates at calculation time — you don't write that math. ```json FR Intl B2B Payment (minimal) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/payment", "$regime": "FR", "type": "receipt", "method": { "key": "credit-transfer" }, "series": "B", "code": "PAY-DE-001", "issue_date": "2026-04-20", "value_date": "2026-04-20", "currency": "EUR", "supplier": { "name": "Bistrot Lyon SAS", "tax_id": { "country": "FR", "code": "50522465228" }, "addresses": [ { "country": "FR" } ] }, "customer": { "name": "Müller GmbH", "tax_id": { "country": "DE", "code": "136695976" }, "addresses": [ { "country": "DE" } ] }, "lines": [ { "i": 1, "document": { "type": "standard", "series": "B", "code": "INTL-DE-APR-001", "issue_date": "2026-04-20" }, "amount": "2400.00", "tax": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "base": "2000.00", "percent": "20%", "amount": "400.00" } ], "amount": "400.00" } ], "sum": "400.00" } } ], "total": "2400.00" } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/payment", "$regime": "FR", "type": "receipt", "series": "B", "code": "PAY-DE-001", "issue_date": "2026-04-20", "value_date": "2026-04-20", "currency": "EUR", "supplier": { "name": "Bistrot Lyon SAS", "tax_id": { "country": "FR", "code": "50522465228" }, "addresses": [ { "country": "FR" } ] }, "customer": { "name": "Müller GmbH", "tax_id": { "country": "DE", "code": "136695976" }, "addresses": [ { "country": "DE" } ] }, "lines": [ { "i": 1, "document": { "type": "standard", "issue_date": "2026-04-20", "series": "B", "code": "INTL-DE-APR-001" }, "amount": "2400.00", "tax": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "base": "2000.00", "percent": "20%", "amount": "400.00" } ], "amount": "400.00" } ], "sum": "400.00" } } ], "methods": [ { "key": "credit-transfer", "amount": "2400.00" } ], "total": "2400.00" } ``` Copy and paste these documents into the [GOBL builder](https://build.gobl.org) in order to preview and verify them.
*** | | | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Compliance | [Invoicing compliance in France](/compliance/france)
[Compliance timeline](/timelines/france) | | Apps | [France](/apps/france)
[Peppol](/apps/peppol)
[Chorus Pro France](/apps/choruspro-france) | | Guides | Chorus Pro — [Supplier registration](/guides/fr-chorus-pro-supplier) · [Issuing invoices](/guides/fr-chorus-pro)
[PA Guide](/guides/fr-pa) — [Registration](/guides/fr-pa-registration) · [Invoicing](/guides/fr-pa-invoicing) · [Status](/guides/fr-pa-status) · [Reporting](/guides/fr-pa-reporting) | | FAQ | [France FAQ](/faq/france) | | GOBL | [France Tax Regime](https://docs.gobl.org/regimes/fr)
[Chorus Pro Addon](https://docs.gobl.org/addons/fr-choruspro-v1)
[French Factur-X Addon](https://docs.gobl.org/addons/fr-facturx-v1) | | GitHub | [gobl.xinvoice](https://github.com/invopop/gobl.xinvoice) |
Ask and answer questions about the France app → # Google Drive Source: https://docs.invopop.com/apps/google-drive Automatically upload invoices and documents to Google Drive
View quick guide ›
| | | | --------- | ------------------------------ | | Developer | [Invopop](https://invopop.com) | | Category | Storage |
The Google Drive app allows you to automatically upload your invoices and documents to a Google Drive folder of your choice. This integration makes it easy to maintain organized backups of your billing documents in the cloud. #### Key features * **Automatic uploads:** Automatically upload invoice PDFs and other attachments to Google Drive as part of your workflows. * **Folder selection:** Choose exactly which Google Drive folder to store your documents using the built-in folder picker. * **Workflow integration:** Add the Google Drive step to any workflow to automatically store generated documents. * **Secure authentication:** Connect your Google account securely through OAuth authentication. #### Quick guide To enable this app: 1. Navigate to the **Apps** section in the Invopop Console. 2. Enable the **Google Drive** app. 3. Click **Configure** to link your Google account to your workspace. 4. Authorize Invopop to access your Google Drive. Add to a workflow: 1. Create or edit a workflow in the Console. 2. Add the **Send to Google Drive** step near the end of your workflow. This allows files to be generated or received before syncing with Google Drive. 3. Use the folder picker to select the destination folder in your Google Drive. 4. Save and publish your workflow. When jobs are processed through the workflow, any attachments (such as PDF invoices or XML files) will be automatically uploaded to your selected Google Drive folder.
The following workflow actions will be available once you install and enable this app: Upload documents and attachments to a specified Google Drive folder.
*** Ask and answer questions about Google Drive App → # ILYDA Greece Source: https://docs.invopop.com/apps/ilyda-greece Submit invoices to the Greek IAPR via the myDATA platform.
Supplier registration guide › Issuing guide ›
| | | | --------- | ------------------------------ | | Developer | [Invopop](https://invopop.com) | | Category | Government | | Scope | B2B, B2C | | Country | [Greece](/compliance/greece) |
The [IAPR](https://www.aade.gr/en) in Greece stands for *Independent Authority for Public Revenue* (Ανεξάρτητη Αρχή Δημοσίων Εσόδων). It is the government agency responsible for managing tax collection and overseeing the myDATA platform, Greece's standardized electronic invoicing and bookkeeping system. The myDATA (My Digital Accounting and Tax Application) platform enables businesses to report invoices and accounting data in real time, ensuring compliance with Greek tax regulations. The system validates invoice data and assigns a unique identifier (MARK) to each transaction, automatically generating electronic accounting books. Invopop has partnered with [ILYDA](https://ilyda.gr) to issue invoices in Greece. Each supplier must be registered with ILYDA to issue invoices on their behalf. This involves authorizing ILYDA as an electronic invoicing provider in Taxisnet, declaring ILYDA as invoice issuer in myDATA, and signing a service provision agreement with ILYDA. **Key features** * **Workflow automation:** This app provides automated workflows for issuing invoices and credit notes through the IAPR system via myDATA. * **Real-time reporting:** Every invoice is reported to myDATA in real time, ensuring compliance with Greek e-invoicing regulations. * **MARK assignment:** Invoices receive a unique MARK (Μοναδικός Αριθμός Καταχώρησης) identifier from the IAPR system. * **ILYDA integration:** Direct integration with ILYDA, an authorized technology provider for IAPR electronic invoicing. * **EN 16931 compliance:** Compliant XML generation is supported for the Greek EN 16931 CIUS schema. * **QR code:** Generates the myDATA QR code according to the IAPR specifications. * **White-label:** the process allows issuance on behalf of clients (white-label) or directly as an organization, according to user needs. Check out our [Supplier registration guide](/guides/gr-iapr-supplier) for onboarding suppliers, and the [Issuing invoices guide](/guides/gr-iapr) for instructions on how to issue invoices and set up your workflows. ## FAQ Invoicing questions Build a GOBL invoice with the `gr-mydata-v1` addon, run the IAPR Issue Invoice workflow. Invopop signs and transmits via ILYDA, retrieves the MARK identifier, and stores it on the silo entry. Install the ILYDA Greece app, register the supplier (one provider at a time per VAT — see our FAQ), and run invoices through the IAPR workflow. PDFs are generated alongside the myDATA submission. The Greek tax authority (IAPR) requires the invoice type to be specified as part of the invoice. In [GOBL](https://docs.gobl.org), this type can be set using the `gr-mydata-invoice-type` extension in the tax section and setting the [GOBL invoice type](https://docs.gobl.org/draft-0/bill/invoice) to other. Alternatively, GOBL will set the extension for you based on the type and the tax tags you set in your [GOBL invoice](https://docs.gobl.org/draft-0/bill/invoice). You can read more in the [GOBL Greece Tax Regime readme](https://github.com/invopop/gobl/blob/main/regimes/gr/README.md). If you produce a PDF version of the invoice, the invoice type label will be displayed instead of "Invoice". For further details on how GOBL prepares data for conversion, see the [Greek Tax Regime](https://github.com/invopop/gobl/blob/main/regimes/gr/README.md). If you issue a credit note shortly after the invoice it refers to, the MyDATA system may reject it because the original invoice hasn't completed synchronization. You'll typically see an error like: ``` Fatal error 301: Invoice with ΜΑΡΚ xxxx not found for VAT number xxxx ``` This happens because there can be a delay between when an invoice is accepted by MyDATA and when it becomes fully available for reference by other documents like credit notes. This delay can range from a few minutes to several hours, depending on MyDATA system load. **Solution**: If you receive this error, retry issuing the credit note after waiting some time. You may need to wait anywhere from a few minutes to several hours for the original invoice to be fully synchronized in the MyDATA system before the credit note can successfully reference it. See the [Greece tax regime in GOBL](https://docs.gobl.org/regimes/gr) for tax categories and AFM rules. The myDATA mapping lives in [`gr-mydata-v1`](https://docs.gobl.org/addons/gr-mydata-v1) including all invoice type codes. Registering supplier questions Contact Invopop to begin the onboarding flow with ILYDA. Production registration is multi-step: the supplier authorizes ILYDA in Taxisnet, declares ILYDA as their issuer in myDATA, and signs ILYDA's service agreement, then onboards with Invopop. Sandbox uses a shared pre-registered test AFM (`177472438`) — no manual steps required. No supplier-side certificates. ILYDA submits to myDATA on the supplier's behalf using its provider credentials, authorized by the supplier through Taxisnet. The supplier holds only their Taxisnet username/password. Suppliers don't upload credentials to Invopop — ILYDA holds the IAPR submission credentials on the supplier's behalf based on the Taxisnet authorization. Only the AFM and registration metadata are stored in Invopop. More answers in our [Greece FAQ](/faq/greece) section
The following workflow actions will be available once you install and enable this app:
5
Send GOBL invoices to the Greek IAPR via ILYDA eInvoicing.
The following workflows are available to make your integration easier. Use them as templates to build upon. This workflow automates Greek invoice processing and tax compliance through myDATA. ```json Example myDATA invoice workflow theme={"system"} { "name": "myDATA issue invoice", "description": "Issue an invoice to myDATA via ILYDA", "schema": "bill/invoice", "steps": [ { "id": "883baa10-abd5-11ef-8b96-dd5de8906f90", "name": "Set state", "config": { "state": "processing" }, "summary": "Set state to `processing`{.state .processing}", "provider": "silo.state" }, { "id": "e9fad100-abd4-11ef-8b96-dd5de8906f90", "name": "Add sequential code", "config": { "name": "IAPR Invoices", "start": 1, "padding": 3 }, "summary": "Dynamic · IAPR · 1", "provider": "sequence.enumerate" }, { "id": "fc75e4f0-8721-11ef-a962-73e3f2037a52", "name": "Sign envelope", "provider": "silo.close" }, { "id": "649aca50-9064-11ef-8f9e-39835766d0bc", "name": "Send invoice to myDATA", "provider": "ilyda.send" }, { "id": "6f77ad10-a32b-11ef-9707-79bbd71238cd", "name": "Set state", "config": { "state": "sent" }, "summary": "Set state to `sent`{.state .sent}", "provider": "silo.state" } ], "rescue": [ { "id": "e8c9c0a0-a32a-11ef-9707-79bbd71238cd", "name": "Set state", "config": { "state": "error" }, "summary": "Set state to `error`{.state .error}", "provider": "silo.state" } ] } ``` [Add to my workspace →](https://console.invopop.com/redirect/workflows/new?template=gr-iapr-invoice) A Greek TIN under the `EL` tax country code. The code shown here is the pre-enabled sandbox test supplier. ```json Greece supplier example theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "Αθηναϊκό Ξενοδοχείο Α.Ε.", "tax_id": { "country": "EL", "code": "177472438" }, "addresses": [ { "num": "28", "street": "Λεωφόρος Συγγρού", "locality": "Αθήνα", "code": "11743", "country": "GR" } ], "emails": [ { "addr": "reservations@athenianhotel.gr" } ] } ``` A business customer with an `EL` TIN and a Greek address. ```json Greece customer example theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "Τεχνολογικές Λύσεις Ελλάς Α.Ε.", "tax_id": { "country": "EL", "code": "841442160" }, "addresses": [ { "num": "15", "street": "Οδός Πανεπιστημίου", "locality": "Αθήνα", "code": "10671", "country": "GR" } ], "emails": [ { "addr": "accounting@techsolutions.gr" } ] } ``` In this example, we're issuing a simple services invoice from a Greek supplier to another Greek business customer. Notice: * we've added the [`gr-mydata-v1`](https://docs.gobl.org/addons/gr-mydata-v1) addon; this ensures the document will be validated and normalized using the myDATA v1 rules built into the [GOBL](https://docs.gobl.org) library, * we've set the `services` tag; this makes the addon set the [`gr-mydata-invoice-type`](https://docs.gobl.org/addons/gr-mydata-v1#invoice-type) extension automatically to `2.1` (service invoice), * similarly, the `credit-transfer` payment method will cause the addon to set the [`gr-mydata-payment-means`](https://docs.gobl.org/addons/gr-mydata-v1#payment-means) extension to `1` (credit transfer), * we added a charge for a special fee (tourist accommodation fee), using the [`gr-mydata-fee`](https://docs.gobl.org/addons/gr-mydata-v1#fee-category) extension, * the specific income category and type are set using the [`gr-mydata-income-cat`](https://docs.gobl.org/addons/gr-mydata-v1#income-classification-category) extension and the [`gr-mydata-income-type`](https://docs.gobl.org/addons/gr-mydata-v1#income-classification-type) extension respectively, * only [VAT rates](https://docs.gobl.org/regimes/el#vat-rates) (`standard`) have been specified; percentages and values for the [`gr-mydata-vat-rate`](https://docs.gobl.org/addons/gr-mydata-v1#vat-rate) extension will be set automatically, and, * there are no totals or calculations; all these will be made automatically when uploading. ```json B2B Services Invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "gr-mydata-v1" ], "$tags": [ "services", "simplified" ], "series": "XXGR", "supplier": { "name": "Αθηναϊκό Ξενοδοχείο Α.Ε.", "tax_id": { "country": "EL", "code": "177472438" }, "addresses": [ { "num": "28", "street": "Λεωφόρος Συγγρού", "locality": "Αθήνα", "code": "11743", "country": "GR" } ], "emails": [ { "addr": "reservations@athenianhotel.gr" } ] }, "customer": { "name": "Τεχνολογικές Λύσεις Ελλάς Α.Ε.", "tax_id": { "country": "EL", "code": "841442160" }, "addresses": [ { "num": "15", "street": "Οδός Πανεπιστημίου", "locality": "Αθήνα", "code": "10671", "country": "GR" } ], "emails": [ { "addr": "accounting@techsolutions.gr" } ] }, "lines": [ { "quantity": "3", "item": { "name": "Διαμονή Deluxe Δίκλινο Δωμάτιο", "price": "180.00", "unit": "day", "ext": { "gr-mydata-income-cat": "category1_3", "gr-mydata-income-type": "E3_561_001" } }, "discounts": [ { "reason": "Εταιρική Έκπτωση", "percent": "10%" } ], "taxes": [ { "cat": "VAT", "rate": "general" } ] } ], "charges": [ { "reason": "Τέλος διαμονής παρεπιδημούντων", "amount": "21.00", "ext": { "gr-mydata-fee": "18" } } ], "payment": { "instructions": { "key": "credit-transfer" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "EL", "$addons": [ "gr-mydata-v1" ], "$tags": [ "services", "simplified" ], "type": "standard", "series": "XXGR", "issue_date": "2026-07-08", "currency": "EUR", "tax": { "ext": { "gr-mydata-invoice-type": "11.2" } }, "supplier": { "name": "Αθηναϊκό Ξενοδοχείο Α.Ε.", "tax_id": { "country": "EL", "code": "177472438" }, "addresses": [ { "num": "28", "street": "Λεωφόρος Συγγρού", "locality": "Αθήνα", "code": "11743", "country": "GR" } ], "emails": [ { "addr": "reservations@athenianhotel.gr" } ] }, "customer": { "name": "Τεχνολογικές Λύσεις Ελλάς Α.Ε.", "tax_id": { "country": "EL", "code": "841442160" }, "addresses": [ { "num": "15", "street": "Οδός Πανεπιστημίου", "locality": "Αθήνα", "code": "10671", "country": "GR" } ], "emails": [ { "addr": "accounting@techsolutions.gr" } ] }, "lines": [ { "i": 1, "quantity": "3", "item": { "name": "Διαμονή Deluxe Δίκλινο Δωμάτιο", "price": "180.00", "unit": "day", "ext": { "gr-mydata-income-cat": "category1_3", "gr-mydata-income-type": "E3_561_001" } }, "sum": "540.00", "discounts": [ { "reason": "Εταιρική Έκπτωση", "percent": "10%", "amount": "54.00" } ], "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "24%", "ext": { "gr-mydata-vat-rate": "1" } } ], "total": "486.00" } ], "charges": [ { "i": 1, "reason": "Τέλος διαμονής παρεπιδημούντων", "amount": "21.00", "ext": { "gr-mydata-fee": "18", "gr-mydata-tax-type": "2" } } ], "payment": { "instructions": { "key": "credit-transfer", "ext": { "gr-mydata-payment-means": "1" } } }, "totals": { "sum": "486.00", "charge": "21.00", "total": "507.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "gr-mydata-vat-rate": "1" }, "base": "486.00", "percent": "24%", "amount": "116.64" } ], "amount": "116.64" } ], "sum": "116.64" }, "tax": "116.64", "total_with_tax": "623.64", "payable": "623.64" } } ``` In this example, we're issuing a simple goods invoice from a Greek supplier to a Greek final consumer. Notice: * we've set the `goods` and the `simplified` tags; this makes the addon set the [`gr-mydata-invoice-type`](https://docs.gobl.org/addons/gr-mydata-v1#invoice-type) extension automatically to `11.1` (retail sales receipt), * similarly, the `cash` payment method will cause the addon to set the [`gr-mydata-payment-means`](https://docs.gobl.org/addons/gr-mydata-v1#payment-means) extension to `3` (cash), * the specific income category and type are set using the [`gr-mydata-income-cat`](https://docs.gobl.org/addons/gr-mydata-v1#income-classification-category) extension and the [`gr-mydata-income-type`](https://docs.gobl.org/addons/gr-mydata-v1#income-classification-type) extension respectively, * only [VAT rates](https://docs.gobl.org/regimes/el#vat-rates) (`standard`) or keys (`exempt`) have been specified; percentages and values for the [`gr-mydata-vat-rate`](https://docs.gobl.org/addons/gr-mydata-v1#vat-rate) extension will be set automatically * the exemption cause is set using the [`gr-mydata-exemption`](https://docs.gobl.org/addons/gr-mydata-v1#vat-exemption-cause) extension, and, * there are no totals or calculations; all these will be made automatically when uploading. ```json B2C Goods Invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "gr-mydata-v1" ], "$tags": [ "goods", "simplified" ], "series": "XXGR", "supplier": { "name": "Ελληνικά Τρόφιμα Α.Ε.", "tax_id": { "country": "EL", "code": "177472438" }, "addresses": [ { "num": "12", "street": "Λεωφόρος Βουλιαγμένης", "locality": "Αθήνα", "code": "11636", "country": "GR" } ], "emails": [ { "addr": "hellenicfoods@example.com" } ] }, "lines": [ { "quantity": "50", "item": { "name": "Ελαιόλαδο Extra Virgin 1L", "price": "12.50", "unit": "unit", "ext": { "gr-mydata-income-cat": "category1_1", "gr-mydata-income-type": "E3_561_001" } }, "discounts": [ { "reason": "Έκπτωση Όγκου", "percent": "10%" } ], "taxes": [ { "cat": "VAT", "rate": "reduced" } ] }, { "quantity": "1", "item": { "name": "Βιβλία Μαγειρικής", "price": "15.00", "ext": { "gr-mydata-income-cat": "category1_1", "gr-mydata-income-type": "E3_561_001" } }, "taxes": [ { "cat": "VAT", "key": "exempt", "ext": { "gr-mydata-exemption": "7" } } ] } ], "payment": { "instructions": { "key": "cash" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "EL", "$addons": [ "gr-mydata-v1" ], "$tags": [ "goods", "simplified" ], "type": "standard", "series": "XXGR", "issue_date": "2026-07-08", "currency": "EUR", "tax": { "ext": { "gr-mydata-invoice-type": "11.1" } }, "supplier": { "name": "Ελληνικά Τρόφιμα Α.Ε.", "tax_id": { "country": "EL", "code": "177472438" }, "addresses": [ { "num": "12", "street": "Λεωφόρος Βουλιαγμένης", "locality": "Αθήνα", "code": "11636", "country": "GR" } ], "emails": [ { "addr": "hellenicfoods@example.com" } ] }, "lines": [ { "i": 1, "quantity": "50", "item": { "name": "Ελαιόλαδο Extra Virgin 1L", "price": "12.50", "unit": "unit", "ext": { "gr-mydata-income-cat": "category1_1", "gr-mydata-income-type": "E3_561_001" } }, "sum": "625.00", "discounts": [ { "reason": "Έκπτωση Όγκου", "percent": "10%", "amount": "62.50" } ], "taxes": [ { "cat": "VAT", "key": "standard", "rate": "reduced", "percent": "13%", "ext": { "gr-mydata-vat-rate": "2" } } ], "total": "562.50" }, { "i": 2, "quantity": "1", "item": { "name": "Βιβλία Μαγειρικής", "price": "15.00", "ext": { "gr-mydata-income-cat": "category1_1", "gr-mydata-income-type": "E3_561_001" } }, "sum": "15.00", "taxes": [ { "cat": "VAT", "key": "exempt", "ext": { "gr-mydata-exemption": "7", "gr-mydata-vat-rate": "7" } } ], "total": "15.00" } ], "payment": { "instructions": { "key": "cash", "ext": { "gr-mydata-payment-means": "3" } } }, "totals": { "sum": "577.50", "total": "577.50", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "gr-mydata-vat-rate": "2" }, "base": "562.50", "percent": "13%", "amount": "73.13" }, { "key": "exempt", "ext": { "gr-mydata-exemption": "7", "gr-mydata-vat-rate": "7" }, "base": "15.00", "amount": "0.00" } ], "amount": "73.13" } ], "sum": "73.13" }, "tax": "73.13", "total_with_tax": "650.63", "payable": "650.63" } } ``` In this example, we're issuing a retail sales receipt for a hotel stay (accommodation taxed at the reduced VAT rate) together with the climate crisis resilience fee on the same document. Notice: * we've set the `services` and `simplified` tags; the addon sets [`gr-mydata-invoice-type`](https://docs.gobl.org/addons/gr-mydata-v1#invoice-type) to `11.2` (services receipt), appropriate for B2C, * the accommodation line uses the [reduced VAT rate](https://docs.gobl.org/regimes/el#vat-rates) (`13%`); the [`gr-mydata-vat-rate`](https://docs.gobl.org/addons/gr-mydata-v1#vat-rate) extension is filled in on build, * the climate crisis resilience fee is added as a [`charge`](https://docs.gobl.org/draft-0/bill/invoice) with [`gr-mydata-other-tax`](https://docs.gobl.org/addons/gr-mydata-v1#gr-mydata-other-tax) set to `22` (hotels 4 stars, 7.00€ per room/night) and [`gr-mydata-tax-type`](https://docs.gobl.org/addons/gr-mydata-v1#gr-mydata-tax-type) `3` (other tax), as in the built version, * the `card` payment method maps to [`gr-mydata-payment-means`](https://docs.gobl.org/addons/gr-mydata-v1#payment-means) `7` (card payment), and, * there are no totals in the minimal example; amounts are calculated when the document is built or uploaded. ```json B2C Accommodation + Climate Fee theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "EL", "$addons": [ "gr-mydata-v1" ], "$tags": [ "services", "simplified" ], "series": "Plato", "code": "216", "supplier": { "name": "Cyberdyne Συστήματα Α.Ε.", "tax_id": { "country": "EL", "code": "177472438" }, "addresses": [ { "num": "28", "street": "Λεωφόρος Συγγρού", "locality": "Αθήνα", "code": "11743", "country": "GR" } ], "emails": [ { "addr": "reservations@athenianhotel.gr" } ] }, "lines": [ { "quantity": "2", "item": { "name": "Hotel room (2 nights)", "price": "120.00" }, "taxes": [ { "cat": "VAT", "rate": "reduced" } ] } ], "charges": [ { "reason": "Climate Crisis Resilience Fee (2 nights x 7.00€)", "amount": "14.00", "ext": { "gr-mydata-other-tax": "22" } } ], "payment": { "instructions": { "key": "card" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "EL", "$addons": [ "gr-mydata-v1" ], "$tags": [ "services", "simplified" ], "type": "standard", "series": "Plato", "code": "216", "issue_date": "2026-07-08", "currency": "EUR", "tax": { "ext": { "gr-mydata-invoice-type": "11.2" } }, "supplier": { "name": "Cyberdyne Συστήματα Α.Ε.", "tax_id": { "country": "EL", "code": "177472438" }, "addresses": [ { "num": "28", "street": "Λεωφόρος Συγγρού", "locality": "Αθήνα", "code": "11743", "country": "GR" } ], "emails": [ { "addr": "reservations@athenianhotel.gr" } ] }, "lines": [ { "i": 1, "quantity": "2", "item": { "name": "Hotel room (2 nights)", "price": "120.00" }, "sum": "240.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "reduced", "percent": "13%", "ext": { "gr-mydata-vat-rate": "2" } } ], "total": "240.00" } ], "charges": [ { "i": 1, "reason": "Climate Crisis Resilience Fee (2 nights x 7.00€)", "amount": "14.00", "ext": { "gr-mydata-other-tax": "22", "gr-mydata-tax-type": "3" } } ], "payment": { "instructions": { "key": "card", "ext": { "gr-mydata-payment-means": "7" } } }, "totals": { "sum": "240.00", "charge": "14.00", "total": "254.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "gr-mydata-vat-rate": "2" }, "base": "240.00", "percent": "13%", "amount": "31.20" } ], "amount": "31.20" } ], "sum": "31.20" }, "tax": "31.20", "total_with_tax": "285.20", "payable": "285.20" } } ``` In this example, we're issuing a standalone climate fee invoice (no lines) from a Greek supplier to another Greek business customer. This is an example of how special records and other document types can be used in Greece. Notice: * we've set the `other` type and the `8.2` invoice type (climate crisis fee collection) explicitly using the [`gr-mydata-invoice-type`](https://docs.gobl.org/addons/gr-mydata-v1#invoice-type) extension, * the climate fee is set as a charge using the [`gr-mydata-other-tax`](https://docs.gobl.org/addons/gr-mydata-v1#other-tax) extension set to `8` (climate crisis fee), * there are no lines as this special record type doesn't allow them, * the `credit-transfer` payment method will cause the addon to set the [`gr-mydata-payment-means`](https://docs.gobl.org/addons/gr-mydata-v1#payment-means) extension to `1` (credit transfer), and, * there are no totals or calculations; all these will be made automatically when uploading. ```json B2B Climate Fee Invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "gr-mydata-v1" ], "type": "other", "series": "XXGR", "tax": { "ext": { "gr-mydata-invoice-type": "8.2" } }, "supplier": { "name": "Αθηναϊκό Ξενοδοχείο Α.Ε.", "tax_id": { "country": "EL", "code": "177472438" }, "addresses": [ { "num": "28", "street": "Λεωφόρος Συγγρού", "locality": "Αθήνα", "code": "11743", "country": "GR" } ], "emails": [ { "addr": "reservations@athenianhotel.gr" } ] }, "customer": { "name": "Τεχνολογικές Λύσεις Ελλάς Α.Ε.", "tax_id": { "country": "EL", "code": "841442160" }, "addresses": [ { "num": "15", "street": "Οδός Πανεπιστημίου", "locality": "Αθήνα", "code": "10671", "country": "GR" } ], "emails": [ { "addr": "accounting@techsolutions.gr" } ] }, "charges": [ { "reason": "Τέλος ανθεκτικότητας στην κλιματική κρίση", "amount": "3.00", "ext": { "gr-mydata-other-tax": "8" } } ], "payment": { "instructions": { "key": "credit-transfer" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "EL", "$addons": [ "gr-mydata-v1" ], "type": "other", "series": "XXGR", "issue_date": "2026-07-08", "currency": "EUR", "tax": { "ext": { "gr-mydata-invoice-type": "8.2" } }, "supplier": { "name": "Αθηναϊκό Ξενοδοχείο Α.Ε.", "tax_id": { "country": "EL", "code": "177472438" }, "addresses": [ { "num": "28", "street": "Λεωφόρος Συγγρού", "locality": "Αθήνα", "code": "11743", "country": "GR" } ], "emails": [ { "addr": "reservations@athenianhotel.gr" } ] }, "customer": { "name": "Τεχνολογικές Λύσεις Ελλάς Α.Ε.", "tax_id": { "country": "EL", "code": "841442160" }, "addresses": [ { "num": "15", "street": "Οδός Πανεπιστημίου", "locality": "Αθήνα", "code": "10671", "country": "GR" } ], "emails": [ { "addr": "accounting@techsolutions.gr" } ] }, "charges": [ { "i": 1, "reason": "Τέλος ανθεκτικότητας στην κλιματική κρίση", "amount": "3.00", "ext": { "gr-mydata-other-tax": "8", "gr-mydata-tax-type": "3" } } ], "payment": { "instructions": { "key": "credit-transfer", "ext": { "gr-mydata-payment-means": "1" } } }, "totals": { "sum": "0.00", "charge": "3.00", "total": "3.00", "tax": "0.00", "total_with_tax": "3.00", "payable": "3.00" } } ``` In this example, we're issuing a credit note that corrects a previously reported invoice. Notice: * the `type` is set to `credit-note`, which the [`gr-mydata-v1`](https://docs.gobl.org/addons/gr-mydata-v1) addon maps to myDATA invoice type `5.1` (associated credit invoice), * the `preceding` array references the original invoice by `series`, `code`, and `issue_date`, and **must** include the `iapr-mark` stamp — the MARK (unique registration number) the IAPR assigned to the original invoice when it was reported, * the line items carry the same [`gr-mydata-income-cat`](https://docs.gobl.org/addons/gr-mydata-v1#income-classification-category) and [`gr-mydata-income-type`](https://docs.gobl.org/addons/gr-mydata-v1#income-classification-type) extensions as the original, describing the amounts being credited, and, * there are no totals or calculations; all these will be made automatically when uploading. ```json Credit Note theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "gr-mydata-v1" ], "$tags": [ "services" ], "type": "credit-note", "series": "XXGR-CN", "preceding": [ { "type": "standard", "series": "XXGR", "code": "0042", "issue_date": "2025-05-12", "stamps": [ { "prv": "iapr-mark", "val": "400001924190872" } ] } ], "supplier": { "name": "Αθηναϊκό Ξενοδοχείο Α.Ε.", "tax_id": { "country": "EL", "code": "177472438" }, "addresses": [ { "num": "28", "street": "Λεωφόρος Συγγρού", "locality": "Αθήνα", "code": "11743", "country": "GR" } ], "emails": [ { "addr": "reservations@athenianhotel.gr" } ] }, "customer": { "name": "Τεχνολογικές Λύσεις Ελλάς Α.Ε.", "tax_id": { "country": "EL", "code": "841442160" }, "addresses": [ { "num": "15", "street": "Οδός Πανεπιστημίου", "locality": "Αθήνα", "code": "10671", "country": "GR" } ], "emails": [ { "addr": "accounting@techsolutions.gr" } ] }, "lines": [ { "quantity": "1", "item": { "name": "Διαμονή Deluxe Δίκλινο Δωμάτιο", "price": "180.00", "unit": "day", "ext": { "gr-mydata-income-cat": "category1_3", "gr-mydata-income-type": "E3_561_001" } }, "taxes": [ { "cat": "VAT", "rate": "general" } ] } ], "payment": { "instructions": { "key": "credit-transfer" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "EL", "$addons": [ "gr-mydata-v1" ], "$tags": [ "services" ], "type": "credit-note", "series": "XXGR-CN", "issue_date": "2026-07-21", "currency": "EUR", "preceding": [ { "type": "standard", "issue_date": "2025-05-12", "series": "XXGR", "code": "0042", "stamps": [ { "prv": "iapr-mark", "val": "400001924190872" } ] } ], "tax": { "ext": { "gr-mydata-invoice-type": "5.1" } }, "supplier": { "name": "Αθηναϊκό Ξενοδοχείο Α.Ε.", "tax_id": { "country": "EL", "code": "177472438" }, "addresses": [ { "num": "28", "street": "Λεωφόρος Συγγρού", "locality": "Αθήνα", "code": "11743", "country": "GR" } ], "emails": [ { "addr": "reservations@athenianhotel.gr" } ] }, "customer": { "name": "Τεχνολογικές Λύσεις Ελλάς Α.Ε.", "tax_id": { "country": "EL", "code": "841442160" }, "addresses": [ { "num": "15", "street": "Οδός Πανεπιστημίου", "locality": "Αθήνα", "code": "10671", "country": "GR" } ], "emails": [ { "addr": "accounting@techsolutions.gr" } ] }, "lines": [ { "i": 1, "quantity": "1", "item": { "name": "Διαμονή Deluxe Δίκλινο Δωμάτιο", "price": "180.00", "unit": "day", "ext": { "gr-mydata-income-cat": "category1_3", "gr-mydata-income-type": "E3_561_001" } }, "sum": "180.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "24%", "ext": { "gr-mydata-vat-rate": "1" } } ], "total": "180.00" } ], "payment": { "instructions": { "key": "credit-transfer", "ext": { "gr-mydata-payment-means": "1" } } }, "totals": { "sum": "180.00", "total": "180.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "gr-mydata-vat-rate": "1" }, "base": "180.00", "percent": "24%", "amount": "43.20" } ], "amount": "43.20" } ], "sum": "43.20" }, "tax": "43.20", "total_with_tax": "223.20", "payable": "223.20" } } ```
*** | | | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Compliance | [Invoicing compliance in Greece](/compliance/greece)
[Compliance timeline](/timelines/greece) | | Apps | [ILYDA Greece](/apps/ilyda-greece) | | Guides | [Supplier registration](/guides/gr-iapr-supplier)
[Issuing invoices](/guides/gr-iapr) | | FAQ | [Greece FAQ](/faq/greece) | | GOBL | [Greece Tax Regime](https://docs.gobl.org/regimes/gr)
[Greece myDATA addon](https://docs.gobl.org/addons/gr-mydata-v1) |
Ask and answer questions about ILYDA Greece App → # Discover Invopop apps Source: https://docs.invopop.com/apps/index Explore Invopop apps that extend platform functionality with government integrations, third-party services, and workflow automation tools. Invopop apps extend the platform's core functionality by connecting to government systems, third-party services, and automation tools. Use apps in your workflows to submit invoices to tax authorities, send notifications, generate PDFs, and sync with your existing business tools. **Network** Submit invoices and documents to the Peppol network. **Government** Manage ARCA integrations and submit invoices to Argentina's tax authority. Submit certified invoices and periodic SAF-T data to Portugal's Autoridade Tributária. Submit B2G invoices to the French Chorus Pro system. Submit invoices to the Colombian DIAN system. Send and receive Finnish e-invoices across the domestic operator network and Peppol. Manage all French e-invoicing flows — Plateforme Agréée (B2B, B2C). Submit invoices to the Greek IAPR via the myDATA platform. Register suppliers and issue FA(3) invoices through Poland's KSeF 2.0 system. Send NF-e, NFC-e & NFS-e documents to the tax authorities in Brazil via PlugNotas. Issue and import CFDI invoices, onboard suppliers, and manage compliant submissions to Mexico's tax authority (SAT). Clear and report e-invoices with ZATCA's FATOORA platform. Issue and receive invoices through Italy's SDI system. Issue documento commerciale in Italy. Manage all Spanish tax-agency integrations. Convert and send invoices to the Spanish tax authorities using the VERI\*FACTU system. **Notify** Send emails from your workflows, with or without attachments. Send notifications from your workflow via Slack. **Format** Generate legally compliant PDFs from your GOBL sources. Convert GOBL to the OASIS UBL format. Convert GOBL to the UN/CEFACT CII format. Convert GOBL into the Spanish Facturae format. **Document** Convert a simplified invoice or receipt into a full invoice. **Storage** Automatically upload invoices and documents to Google Drive. **Automation** Create incoming and outgoing connections via multiple channels. Schedule periodic workflow execution for automated data imports and recurring processes. **Integrations** Import and process invoices and credit notes from Chargebee. Import and process invoices and credit notes from Stripe. Generate legally compliant invoices from NetSuite. Bulk download and import CFDIs from Mexico's SAT using SW Sapien's Efisco service. # NetSuite Source: https://docs.invopop.com/apps/netsuite Generate legally compliant invoices from NetSuite Invopop has partnered with Novutech to provide an integration with NetSuite. Please get in touch with us at [support@invopop.com](mailto:support@invopop.com) to request an Invopop - NetSuite integration. # OASIS UBL Source: https://docs.invopop.com/apps/oasis-ubl Convert GOBL to the OASIS UBL format.
| | | | --------- | ------------------------------ | | Developer | [Invopop](https://invopop.com) | | Category | Format |
**OASIS UBL (Universal Business Language)** is a royalty-free [OASIS](https://www.OASIS-open.org/committees/tc_home.php?wg_abbrev=ubl) standard defining XML business documents such as purchase orders, invoices, and waybills. This app converts GOBL documents to and from UBL XML. ## Key features Output different UBL syntaxes: * Peppol BIS v3 UBL invoice and credit note * XRechnung UBL invoice V2.0 * EN 16931 UBL invoice and credit note **File access:** by default Invopop will generate public URLs with a secure hash that can be shared with customers. If this is not desired, you can configure the action to make the file private, so it is only accessible via the API.
1
Generate a new UBL document from the GOBL source.
1
Convert an incoming UBL XML into a GOBL document.
Sample invoices demonstrating various OASIS UBL implementations across different countries and use cases. Standard XRechnung invoice for business-to-business transactions using the UBL format. ```json XRechnung B2B Invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "DE", "$addons": [ "eu-en16931-v2017", "de-xrechnung-v3" ], "type": "standard", "series": "SAMPLE", "code": "001", "issue_date": "2022-02-01", "currency": "EUR", "supplier": { "name": "Rheinland Technologies GmbH", "tax_id": { "country": "DE", "code": "879558966" }, "inboxes": [ { "key": "peppol", "scheme": "9930", "code": "DE879558966" } ], "addresses": [ { "num": "27", "street": "Friedrichstraße", "locality": "Berlin", "region": "BE", "code": "10117", "country": "DE" } ], "people": [ { "name": { "given": "John", "surname": "Doe" } } ], "telephones": [ { "num": "+49100200300" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Bavaria Solutions GmbH", "tax_id": { "country": "DE", "code": "993930191" }, "inboxes": [ { "key": "peppol", "scheme": "9930", "code": "DE993930191" } ], "addresses": [ { "num": "15", "street": "Marienplatz", "locality": "München", "region": "BY", "code": "80331", "country": "DE" } ], "emails": [ { "addr": "test@example.com" } ] }, "lines": [ { "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "discounts": [ { "reason": "Special discount", "percent": "10%", "amount": "180.00" } ], "taxes": [ { "cat": "VAT", "rate": "general" } ], "total": "1620.00" } ], "ordering": { "code": "N" }, "payment": { "terms": { "notes": "Will be paid by 2026-06-02" }, "instructions": { "key": "credit-transfer+sepa", "credit_transfer": [ { "iban": "DE89370400440532013000", "name": "Random Bank Co." } ] } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "DE", "$addons": [ "eu-en16931-v2017", "de-xrechnung-v3" ], "type": "standard", "series": "SAMPLE", "code": "001", "issue_date": "2022-02-01", "currency": "EUR", "tax": { "ext": { "untdid-document-type": "380" } }, "supplier": { "name": "Rheinland Technologies GmbH", "tax_id": { "country": "DE", "code": "879558966" }, "people": [ { "name": { "given": "John", "surname": "Doe" } } ], "endpoints": [ { "uri": "iso6523-actorid-upis::9930:DE879558966" } ], "inboxes": [ { "key": "peppol", "scheme": "9930", "code": "DE879558966" } ], "addresses": [ { "num": "27", "street": "Friedrichstraße", "locality": "Berlin", "region": "BE", "code": "10117", "country": "DE" } ], "emails": [ { "addr": "billing@example.com" } ], "telephones": [ { "num": "+49100200300" } ] }, "customer": { "name": "Bavaria Solutions GmbH", "tax_id": { "country": "DE", "code": "993930191" }, "endpoints": [ { "uri": "iso6523-actorid-upis::9930:DE993930191" } ], "inboxes": [ { "key": "peppol", "scheme": "9930", "code": "DE993930191" } ], "addresses": [ { "num": "15", "street": "Marienplatz", "locality": "München", "region": "BY", "code": "80331", "country": "DE" } ], "emails": [ { "addr": "test@example.com" } ] }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "discounts": [ { "reason": "Special discount", "percent": "10%", "amount": "180.00" } ], "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "19%", "ext": { "untdid-tax-category": "S" } } ], "total": "1620.00" } ], "ordering": { "code": "N" }, "payment": { "terms": { "notes": "Will be paid by 2026-06-02" }, "instructions": { "key": "credit-transfer+sepa", "credit_transfer": [ { "iban": "DE89370400440532013000", "name": "Random Bank Co." } ], "ext": { "untdid-payment-means": "58" } } }, "totals": { "sum": "1620.00", "total": "1620.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "untdid-tax-category": "S" }, "base": "1620.00", "percent": "19%", "amount": "307.80" } ], "amount": "307.80" } ], "sum": "307.80" }, "tax": "307.80", "total_with_tax": "1927.80", "payable": "1927.80" } } ``` XRechnung invoice for business-to-government transactions, compliant with German public procurement requirements. ```json XRechnung B2G Invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "DE", "$addons": [ "eu-en16931-v2017", "de-xrechnung-v3" ], "type": "standard", "series": "SAMPLE", "code": "001", "issue_date": "2022-02-01", "currency": "EUR", "supplier": { "name": "Rheinland Technologies GmbH", "tax_id": { "country": "DE", "code": "879558966" }, "inboxes": [ { "key": "peppol", "scheme": "9930", "code": "DE879558966" } ], "addresses": [ { "num": "27", "street": "Friedrichstraße", "locality": "Berlin", "region": "BE", "code": "10117", "country": "DE" } ], "people": [ { "name": { "given": "John", "surname": "Doe" } } ], "telephones": [ { "num": "+49100200300" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Deutsche Bahn", "tax_id": { "country": "DE", "code": "811569869" }, "inboxes": [ { "key": "peppol", "scheme": "9930", "code": "DE811569869" } ], "addresses": [ { "num": "15", "street": "Marienplatz", "locality": "München", "region": "BY", "code": "80331", "country": "DE" } ], "emails": [ { "addr": "test@example.com" } ] }, "lines": [ { "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "discounts": [ { "reason": "Special discount", "percent": "10%", "amount": "180.00" } ], "taxes": [ { "cat": "VAT", "rate": "general" } ], "total": "1620.00" } ], "ordering": { "code": "992-90009-96" }, "payment": { "terms": { "notes": "Will be paid by 2026-06-02" }, "instructions": { "key": "credit-transfer+sepa", "credit_transfer": [ { "iban": "DE89370400440532013000", "name": "Random Bank Co." } ] } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "DE", "$addons": [ "eu-en16931-v2017", "de-xrechnung-v3" ], "type": "standard", "series": "SAMPLE", "code": "001", "issue_date": "2022-02-01", "currency": "EUR", "tax": { "ext": { "untdid-document-type": "380" } }, "supplier": { "name": "Rheinland Technologies GmbH", "tax_id": { "country": "DE", "code": "879558966" }, "people": [ { "name": { "given": "John", "surname": "Doe" } } ], "endpoints": [ { "uri": "iso6523-actorid-upis::9930:DE879558966" } ], "inboxes": [ { "key": "peppol", "scheme": "9930", "code": "DE879558966" } ], "addresses": [ { "num": "27", "street": "Friedrichstraße", "locality": "Berlin", "region": "BE", "code": "10117", "country": "DE" } ], "emails": [ { "addr": "billing@example.com" } ], "telephones": [ { "num": "+49100200300" } ] }, "customer": { "name": "Deutsche Bahn", "tax_id": { "country": "DE", "code": "811569869" }, "endpoints": [ { "uri": "iso6523-actorid-upis::9930:DE811569869" } ], "inboxes": [ { "key": "peppol", "scheme": "9930", "code": "DE811569869" } ], "addresses": [ { "num": "15", "street": "Marienplatz", "locality": "München", "region": "BY", "code": "80331", "country": "DE" } ], "emails": [ { "addr": "test@example.com" } ] }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "discounts": [ { "reason": "Special discount", "percent": "10%", "amount": "180.00" } ], "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "19%", "ext": { "untdid-tax-category": "S" } } ], "total": "1620.00" } ], "ordering": { "code": "992-90009-96" }, "payment": { "terms": { "notes": "Will be paid by 2026-06-02" }, "instructions": { "key": "credit-transfer+sepa", "credit_transfer": [ { "iban": "DE89370400440532013000", "name": "Random Bank Co." } ], "ext": { "untdid-payment-means": "58" } } }, "totals": { "sum": "1620.00", "total": "1620.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "untdid-tax-category": "S" }, "base": "1620.00", "percent": "19%", "amount": "307.80" } ], "amount": "307.80" } ], "sum": "307.80" }, "tax": "307.80", "total_with_tax": "1927.80", "payable": "1927.80" } } ``` Standard Peppol BIS Billing 3.0 invoice demonstrating the pan-European e-invoicing framework. ```json Germany standard B2B invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "DE", "$addons": [ "eu-en16931-v2017" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "supplier": { "name": "Rheinland Technologies GmbH", "tax_id": { "country": "DE", "code": "879558966" }, "inboxes": [ { "key": "peppol", "scheme": "9930", "code": "DE879558966" } ], "addresses": [ { "num": "27", "street": "Friedrichstraße", "locality": "Berlin", "region": "BE", "code": "10117", "country": "DE" } ], "emails": [ { "addr": "rechnungen@rheinlandtech.de" } ] }, "customer": { "name": "Bavaria Solutions GmbH", "tax_id": { "country": "DE", "code": "993930191" }, "inboxes": [ { "key": "peppol", "scheme": "9930", "code": "DE993930191" } ], "addresses": [ { "num": "15", "street": "Marienplatz", "locality": "München", "region": "BY", "code": "80331", "country": "DE" } ], "emails": [ { "addr": "test@example.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox services", "price": "145.00", "unit": "one" }, "sum": "1740.00", "taxes": [ { "cat": "VAT", "rate": "general" } ], "total": "1740.00" } ], "payment": { "terms": { "detail": "Will be paid by 2026-06-02" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "DE", "$addons": [ "eu-en16931-v2017" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "tax": { "ext": { "untdid-document-type": "380" } }, "supplier": { "name": "Rheinland Technologies GmbH", "tax_id": { "country": "DE", "code": "879558966" }, "endpoints": [ { "uri": "iso6523-actorid-upis::9930:DE879558966" } ], "inboxes": [ { "key": "peppol", "scheme": "9930", "code": "DE879558966" } ], "addresses": [ { "num": "27", "street": "Friedrichstraße", "locality": "Berlin", "region": "BE", "code": "10117", "country": "DE" } ], "emails": [ { "addr": "rechnungen@rheinlandtech.de" } ] }, "customer": { "name": "Bavaria Solutions GmbH", "tax_id": { "country": "DE", "code": "993930191" }, "endpoints": [ { "uri": "iso6523-actorid-upis::9930:DE993930191" } ], "inboxes": [ { "key": "peppol", "scheme": "9930", "code": "DE993930191" } ], "addresses": [ { "num": "15", "street": "Marienplatz", "locality": "München", "region": "BY", "code": "80331", "country": "DE" } ], "emails": [ { "addr": "test@example.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox services", "price": "145.00", "unit": "one" }, "sum": "1740.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "19%", "ext": { "untdid-tax-category": "S" } } ], "total": "1740.00" } ], "payment": { "terms": { "notes": "Will be paid by 2026-06-02" } }, "totals": { "sum": "1740.00", "total": "1740.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "untdid-tax-category": "S" }, "base": "1740.00", "percent": "19%", "amount": "330.60" } ], "amount": "330.60" } ], "sum": "330.60" }, "tax": "330.60", "total_with_tax": "2070.60", "payable": "2070.60" } } ```
# PDF Generator Source: https://docs.invopop.com/apps/pdf-generator Generate legally compliant PDFs from your GOBL sources
View implementation guide ›
| | | | --------- | ------------------------------ | | Developer | [Invopop](https://invopop.com) | | Category | Format |
The PDF Generator app converts GOBL (Go Business Language) documents into professional PDF invoices and documents. This app is designed for tax regimes that don't require electronic reporting or invoicing, useful for generating simple PDF invoices that can be sent directly to customers. Once configured, the PDF Generator works with any GOBL invoice produced for any country in the world, providing a flexible solution for businesses operating globally or in jurisdictions without mandatory e-invoicing requirements. **Key features** * **Global compatibility:** Works with GOBL documents from any country, making it suitable for international businesses. * **Customizable templates:** Configure logos, languages, date formats, and layout options to match your brand and regional preferences. * **Multiple layouts:** Support for different page layouts including A4 and other standard formats. * **Localization:** Generate PDFs in multiple languages with proper date and number formatting. * **Professional output:** Produces legally compliant PDF invoices with all necessary fields and proper formatting. * **Workflow integration:** Runs inside Invopop workflows alongside other processing steps. Make sure to check out our [PDF Invoice Guide](/guides/pdf-invoice) for instructions on how to generate PDF invoices and set up your workflows.
The following workflow actions will be available once you install and enable this app:
1
Generate PDF from GOBL with customizable options for logo, language, date format, and layout.
The following workflows are available to make your integration easier. Use them as templates to build upon. This workflow automates PDF invoice generation with sequential numbering and document signing. ```json Example PDF invoice workflow theme={"system"} { "name": "PDF invoice", "description": "Add a sequential code and generate a PDF", "schema": "bill/invoice", "steps": [ { "id": "6b16c200-a75f-11ef-ba08-91f336761c6c", "name": "Add sequential code", "provider": "sequence.enumerate", "summary": "Dynamic · Invoice · 000001", "config": { "padding": 6, "start": 1, "name": "Invoice" } }, { "id": "fc75e4f0-8721-11ef-a962-73e3f2037a52", "name": "Sign envelope", "provider": "silo.close" }, { "id": "c61adaa0-7b55-11ef-bffc-d9a10ebf9f89", "name": "Generate PDF", "config": { "logo_height": 40, "locale": "en", "date_format": "%Y-%m-%d" }, "summary": "English", "provider": "pdf" } ], "rescue": [ { "id": "9a7b3d50-1358-11ef-af96-a18cfb3774fa", "name": "Set state", "config": { "state": "error" }, "provider": "silo.state", "summary": "Set state to `error`{.state .error}" } ] } ``` [Add to my workspace →](https://console.invopop.com/redirect/workflows/new?template=pdf-invoice)
*** Ask and answer questions about PDF Generator App → # Peppol Source: https://docs.invopop.com/apps/peppol Submit invoices and documents to the Peppol network.
View implementation guide ›
| | | | --------- | ------------------------------ | | Developer | [Invopop](https://invopop.com) | | Category | Network | | Scope | B2B, B2G |
[Peppol (Pan-European Public Procurement On-Line)](https://peppol.org/) is a global network for electronic document exchange, widely adopted for e-invoicing across multiple countries. It provides a standardized protocol for companies to exchange business documents like invoices, credit notes, and purchase orders. The Peppol network is particularly popular in: * Nordic countries (Norway, Finland) * Asia-Pacific region (Japan, Singapore, Malaysia, Australia, New Zealand) * Several EU countries for business-to-government invoicing (Germany, Italy, Croatia) Invopop allows you to send and receive documents through the Peppol network using a single integration while continuing to work with our [GOBL](https://docs.gobl.org/introduction) format. The Peppol app is designed to only send and receive documents, while format-specific apps such as OASIS UBL or UN/CEFACT CII handle the generation and import of the appropriate files. **Key features** * **Workflow automation:** This app provides automated workflows for sending and receiving invoices through the Peppol network. * **Bidirectional communication:** Send invoices to Peppol participants and receive invoices from the network automatically. * **Party registration:** Register companies (Peppol participants) with proof of ownership validation for regulatory compliance. * **Multiple format support:** Supports both UBL (Peppol BIS Billing 3.0) and UN/CEFACT CII formats for maximum compatibility. * **GOBL integration:** Converts between GOBL format and Peppol-compliant formats, allowing you to work with a single data model. * **Participant ID management:** Automatically derives Peppol participant IDs from VAT numbers or local business identifiers. * **Visibility control:** Configure visibility levels (SMP, SML, Peppol Directory) to control your presence in the network. Make sure to check out our [Peppol Guide](/guides/peppol) for instructions on how to send and receive invoices and set up your workflows. ## FAQ If your job fails with a `KO` error status showing `receiver not found in the peppol network`, treat this the same as an invalid email address. As countries roll out their Peppol networks, you'll encounter a mix of registered and unregistered companies, so it's important to catch these issues early. Use the Peppol **Lookup Peppol participant** step to validate the Peppol ID before sending anything to the network. We recommend creating a separate workflow for this validation and running it against the customer's information. This will catch the error before creating the invoice.
The following workflow actions will be available once you install and enable this app:
2
Send a document over the Peppol Network.
3
Receive and import invoices from the Peppol network, supporting both UBL and CII formats.
Register a company as a Peppol participant with the network. Generate a registration link for proof of ownership submission. Wait for company identity and ownership validation.
The following workflows are available to make your integration easier. Use them as templates to build upon. This workflow converts a GOBL document into the Peppol format and sends it to the network. ```json Example Peppol send invoice workflow theme={"system"} { "name": "Peppol send invoice", "description": "Send a Peppol BIS invoice through the Peppol network", "schema": "bill/invoice", "steps": [ { "id": "33e23480-10ab-11f0-a09e-7b63571a4ae2", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "2354afd0-10ab-11f0-a09e-7b63571a4ae2", "name": "Add sequential code", "provider": "sequence.enumerate", "summary": "Dynamic · Peppol · PPL000001", "config": { "name": "PPL", "padding": 6, "prefix": "PPL", "start": 1 } }, { "id": "fb06b190-10aa-11f0-a09e-7b63571a4ae2", "name": "Sign envelope", "provider": "silo.close" }, { "id": "fc5aa8d0-10aa-11f0-a09e-7b63571a4ae2", "name": "Generate UBL document", "provider": "ubl.generate", "summary": "Peppol BIS Billing v3", "config": { "doc_type": "bis-invoice-v3", "private": false, "validate_ubl": true } }, { "id": "075442a0-10ab-11f0-a09e-7b63571a4ae2", "name": "Send Peppol document", "provider": "peppol.send" }, { "id": "3037a310-10ab-11f0-a09e-7b63571a4ae2", "name": "Set state", "provider": "silo.state", "summary": "Set state to `sent`{.state .sent}", "config": { "state": "sent" } } ], "rescue": [ { "id": "39513240-10ab-11f0-a09e-7b63571a4ae2", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` [Add to my workspace →](https://console.invopop.com/redirect/workflows/new?template=peppol-send) This workflow receives incoming documents from the Peppol network and converts them to the GOBL format. ```json Example Peppol receive invoice workflow theme={"system"} { "name": "Peppol receive invoice", "description": "Receive an invoice through Peppol", "schema": "bill/invoice", "steps": [ { "id": "db61c3c0-0fb5-11f0-b078-9fc456829eca", "name": "Import Peppol document", "provider": "peppol.import", "next": [ { "status": "OK", "code": "UBL", "steps": [ { "id": "62e94570-8fdb-11f0-a8fb-61ec9e5a76ba", "name": "Import UBL document", "provider": "ubl.import" } ], "stop": false }, { "status": "OK", "code": "CII", "steps": [ { "id": "6480ae50-8fdb-11f0-a8fb-61ec9e5a76ba", "name": "Import CII document", "provider": "cii.import" } ], "stop": false } ] }, { "id": "fdfc81a0-6e23-11f0-913b-5732f966b346", "name": "Set folder", "provider": "silo.folder", "summary": "Set folder to `Invoices · Expenses`{.font-medium}", "config": { "folder": "expenses" } }, { "id": "dd14a3e0-0fb5-11f0-b078-9fc456829eca", "name": "Set state", "provider": "silo.state", "summary": "Set state to `registered`{.state .registered}", "config": { "state": "registered" } } ], "rescue": [ { "id": "e109d2e0-0fb5-11f0-b078-9fc456829eca", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` [Add to my workspace →](https://console.invopop.com/redirect/workflows/new?template=peppol-receive) This workflow onboards companies (Peppol participants) to Invopop before they can issue or receive invoices. ```json Example Peppol register party workflow theme={"system"} { "name": "Peppol register party", "description": "Register a party with Peppol to issue and receive invoices", "schema": "org/party", "steps": [ { "id": "0adf46e0-8fdb-11f0-a8fb-61ec9e5a76ba", "name": "Register party for Peppol approval", "provider": "peppol.register.approval" }, { "id": "0e44b900-8fdb-11f0-a8fb-61ec9e5a76ba", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "12aaf950-8fdb-11f0-a8fb-61ec9e5a76ba", "name": "Wait for Peppol approval", "provider": "peppol.wait.approval" }, { "id": "7a5a4db0-0fae-11f0-b37b-0be1c251a274", "name": "Register party on Peppol", "provider": "peppol.register", "summary": "Enabled · groups: ubl-invoice", "config": { "disable": false, "doc_groups": [ "ubl-invoice" ], "visibility": "smp+sml+peppol" } }, { "id": "7c2fa9f0-0fae-11f0-b37b-0be1c251a274", "name": "Set state", "provider": "silo.state", "summary": "Set state to `registered`{.state .registered}", "config": { "state": "registered" } } ], "rescue": [ { "id": "a34e83f0-25dc-11f0-b641-350e77c28eed", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` [Add to my workspace →](https://console.invopop.com/redirect/workflows/new?template=peppol-register) This workflow revokes participant permissions to issue and receive documents. ```json Example Peppol unregister party workflow expandable theme={"system"} { "name": "Peppol unregister party", "description": "Unregister a party from Peppol", "schema": "org/party", "steps": [ { "id": "453beac0-70a7-11f1-aca9-697108ec55ef", "name": "Unregister supplier from Peppol", "provider": "peppol.unregister" }, { "id": "7e79f610-adc5-11f0-abd8-03a58bc40d2a", "name": "Set state", "provider": "silo.state", "summary": "Set state to `void`{.state .void}", "config": { "state": "void" } } ], "rescue": [ { "id": "9141b350-adc5-11f0-abd8-03a58bc40d2a", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` [Add to my workspace →](https://console.invopop.com/redirect/workflows/new?template=peppol-unregister) Parties: A party ready to send over Peppol: a `peppol` inbox identifies the participant, here a Spanish company under scheme `9920` (ES VAT number). ```json Peppol supplier example expandable theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "inboxes": [ { "key": "peppol", "scheme": "9920", "code": "B85905495" } ], "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002" } ], "emails": [ { "addr": "billing+test@example.com" } ] } ``` The receiving participant — a Belgian company addressed by its enterprise number under scheme `0208`. ```json Peppol customer example expandable theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "Benelux Distribution NV", "tax_id": { "country": "BE", "code": "0403019261" }, "inboxes": [ { "key": "peppol", "scheme": "0208", "code": "0403019261" } ], "addresses": [ { "num": "12", "street": "Meir", "locality": "Antwerpen", "region": "Antwerpen", "code": "2000", "country": "BE" } ], "emails": [ { "addr": "invoices@beneluxdistribution.be" } ] } ``` Invoices: A standard B2B invoice sent over the Peppol network. The [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) addon applies the European norm rules; the `peppol` inboxes on both parties identify the sending and receiving participants. Notice: * both parties carry a `peppol` inbox with the participant `scheme` and `code` used for routing, * the line tax states the VAT `percent` explicitly along with the [`untdid-tax-category`](https://docs.gobl.org/catalogues/untdid) extension, and, * totals are calculated automatically when the document is built. ```json Peppol B2B Invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "eu-en16931-v2017" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "tax": { "rounding": "currency" }, "supplier": { "name": "Cyberdyne Systems Spain S.L.", "tax_id": { "country": "ES", "code": "B98602642" }, "addresses": [ { "street": "Paseo de la Castellana 120", "locality": "Madrid", "region": "Madrid", "code": "28020", "country": "ES" } ], "inboxes": [ { "key": "peppol", "scheme": "9920", "code": "ESB98602642" } ], "emails": [ { "addr": "billing@cyberdynesys.com" } ] }, "customer": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "street": "Calle Pradillo 42", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "inboxes": [ { "key": "peppol", "scheme": "9920", "code": "ESB85905495" } ], "emails": [ { "addr": "billing+test@invopop.com" } ] }, "lines": [ { "quantity": "12", "item": { "name": "Sambox services", "price": "145.00", "unit": "one" }, "taxes": [ { "cat": "VAT", "percent": "21.0%", "ext": { "untdid-tax-category": "S" } } ] } ], "payment": { "terms": { "detail": "Will be paid by 2026-06-02" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "eu-en16931-v2017" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "tax": { "rounding": "currency", "ext": { "untdid-document-type": "380" } }, "supplier": { "name": "Cyberdyne Systems Spain S.L.", "tax_id": { "country": "ES", "code": "B98602642" }, "endpoints": [ { "uri": "iso6523-actorid-upis::9920:ESB98602642" } ], "inboxes": [ { "key": "peppol", "scheme": "9920", "code": "ESB98602642" } ], "addresses": [ { "street": "Paseo de la Castellana 120", "locality": "Madrid", "region": "Madrid", "code": "28020", "country": "ES" } ], "emails": [ { "addr": "billing@cyberdynesys.com" } ] }, "customer": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "endpoints": [ { "uri": "iso6523-actorid-upis::9920:ESB85905495" } ], "inboxes": [ { "key": "peppol", "scheme": "9920", "code": "ESB85905495" } ], "addresses": [ { "street": "Calle Pradillo 42", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing+test@invopop.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox services", "price": "145.00", "unit": "one" }, "sum": "1740.00", "taxes": [ { "cat": "VAT", "key": "standard", "percent": "21.0%", "ext": { "untdid-tax-category": "S" } } ], "total": "1740.00" } ], "payment": { "terms": { "notes": "Will be paid by 2026-06-02" } }, "totals": { "sum": "1740.00", "total": "1740.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "untdid-tax-category": "S" }, "base": "1740.00", "percent": "21.0%", "amount": "365.40" } ], "amount": "365.40" } ], "sum": "365.40" }, "tax": "365.40", "total_with_tax": "2105.40", "payable": "2105.40" } } ``` A Belgian B2B invoice with VAT-inclusive prices and two different VAT rates. Notice: * `tax.prices_include` is set to `VAT`, so line prices are treated as tax-inclusive and the base amounts are derived automatically, * the supplier's inbox uses the combined `scheme:code` form (`0208:0735585741`), while the customer states `scheme` and `code` separately — both are equivalent, and, * the two lines apply the `general` (21%) and `reduced` (6%) Belgian VAT rates. ```json Peppol B2B Invoice Belgium theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "BE", "$addons": ["eu-en16931-v2017"], "type": "standard", "series": "S2025", "code": "001", "issue_date": "2025-05-20", "currency": "EUR", "tax": { "prices_include": "VAT" }, "supplier": { "name": "Provide One BV", "tax_id": { "country": "BE", "code": "0735585741" }, "inboxes": [ { "key": "peppol", "code": "0208:0735585741" } ], "addresses": [ { "num": "12", "street": "Rue de la Loi", "locality": "Bruxelles", "region": "Bruxelles", "code": "1040", "country": "BE" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Sample Consumer", "tax_id": { "country": "BE", "code": "0699912507" }, "inboxes": [ { "key": "peppol", "scheme": "0208", "code": "0699912507" } ], "addresses": [{ "country": "BE" }] }, "payment": { "terms": { "due_dates": [ { "date": "2025-05-30", "percent": "100%" } ] } }, "lines": [ { "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "discounts": [ { "reason": "Special discount", "percent": "10%" } ], "taxes": [ { "cat": "VAT", "rate": "general" } ] }, { "quantity": "1", "item": { "name": "Promotional cookies", "price": "10.00" }, "taxes": [ { "cat": "VAT", "rate": "reduced" } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "BE", "$addons": [ "eu-en16931-v2017" ], "type": "standard", "series": "S2025", "code": "001", "issue_date": "2025-05-20", "currency": "EUR", "tax": { "prices_include": "VAT", "ext": { "untdid-document-type": "380" } }, "supplier": { "name": "Provide One BV", "tax_id": { "country": "BE", "code": "0735585741" }, "endpoints": [ { "uri": "iso6523-actorid-upis::0208:0735585741" } ], "inboxes": [ { "key": "peppol", "scheme": "0208", "code": "0735585741" } ], "addresses": [ { "num": "12", "street": "Rue de la Loi", "locality": "Bruxelles", "region": "Bruxelles", "code": "1040", "country": "BE" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Sample Consumer", "tax_id": { "country": "BE", "code": "0699912507" }, "endpoints": [ { "uri": "iso6523-actorid-upis::0208:0699912507" } ], "inboxes": [ { "key": "peppol", "scheme": "0208", "code": "0699912507" } ], "addresses": [ { "country": "BE" } ] }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "discounts": [ { "reason": "Special discount", "percent": "10%", "amount": "180.00" } ], "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "21.0%", "ext": { "untdid-tax-category": "S" } } ], "total": "1620.00" }, { "i": 2, "quantity": "1", "item": { "name": "Promotional cookies", "price": "10.00", "unit": "one" }, "sum": "10.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "reduced", "percent": "6.0%", "ext": { "untdid-tax-category": "S" } } ], "total": "10.00" } ], "payment": { "terms": { "due_dates": [ { "date": "2025-05-30", "amount": "1630.00", "percent": "100%" } ] } }, "totals": { "sum": "1630.00", "tax_included": "281.72", "total": "1348.28", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "untdid-tax-category": "S" }, "base": "1338.84", "percent": "21.0%", "amount": "281.16" }, { "key": "standard", "ext": { "untdid-tax-category": "S" }, "base": "9.43", "percent": "6.0%", "amount": "0.57" } ], "amount": "281.72" } ], "sum": "281.72" }, "tax": "281.72", "total_with_tax": "1630.00", "payable": "1630.00" } } ``` A credit note reversing part of a previously sent invoice. Notice: * the `type` is set to `credit-note`, which the [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) addon maps to UNTDID document type `381`, * the `preceding` array references the original invoice by `series`, `code`, and `issue_date`, with a `reason` for the correction, and, * the lines state the credited amounts as positive values — the document type is what reverses them. ```json Peppol B2B Credit Note theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "eu-en16931-v2017" ], "type": "credit-note", "series": "CN", "code": "PP000104", "issue_date": "2025-04-10", "currency": "EUR", "tax": { "rounding": "currency" }, "preceding": [ { "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "reason": "Services not delivered" } ], "supplier": { "name": "Cyberdyne Systems Spain S.L.", "tax_id": { "country": "ES", "code": "B98602642" }, "addresses": [ { "street": "Paseo de la Castellana 120", "locality": "Madrid", "region": "Madrid", "code": "28020", "country": "ES" } ], "inboxes": [ { "key": "peppol", "scheme": "9920", "code": "ESB98602642" } ], "emails": [ { "addr": "billing@cyberdynesys.com" } ] }, "customer": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "street": "Calle Pradillo 42", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "inboxes": [ { "key": "peppol", "scheme": "9920", "code": "ESB85905495" } ], "emails": [ { "addr": "billing+test@invopop.com" } ] }, "lines": [ { "quantity": "2", "item": { "name": "Sambox services", "price": "145.00", "unit": "one" }, "taxes": [ { "cat": "VAT", "percent": "21.0%", "ext": { "untdid-tax-category": "S" } } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "eu-en16931-v2017" ], "type": "credit-note", "series": "CN", "code": "PP000104", "issue_date": "2025-04-10", "currency": "EUR", "preceding": [ { "type": "standard", "issue_date": "2025-04-03", "series": "INV", "code": "PP000003", "reason": "Services not delivered" } ], "tax": { "rounding": "currency", "ext": { "untdid-document-type": "381" } }, "supplier": { "name": "Cyberdyne Systems Spain S.L.", "tax_id": { "country": "ES", "code": "B98602642" }, "endpoints": [ { "uri": "iso6523-actorid-upis::9920:ESB98602642" } ], "inboxes": [ { "key": "peppol", "scheme": "9920", "code": "ESB98602642" } ], "addresses": [ { "street": "Paseo de la Castellana 120", "locality": "Madrid", "region": "Madrid", "code": "28020", "country": "ES" } ], "emails": [ { "addr": "billing@cyberdynesys.com" } ] }, "customer": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "endpoints": [ { "uri": "iso6523-actorid-upis::9920:ESB85905495" } ], "inboxes": [ { "key": "peppol", "scheme": "9920", "code": "ESB85905495" } ], "addresses": [ { "street": "Calle Pradillo 42", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing+test@invopop.com" } ] }, "lines": [ { "i": 1, "quantity": "2", "item": { "name": "Sambox services", "price": "145.00", "unit": "one" }, "sum": "290.00", "taxes": [ { "cat": "VAT", "key": "standard", "percent": "21.0%", "ext": { "untdid-tax-category": "S" } } ], "total": "290.00" } ], "totals": { "sum": "290.00", "total": "290.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "untdid-tax-category": "S" }, "base": "290.00", "percent": "21.0%", "amount": "60.90" } ], "amount": "60.90" } ], "sum": "60.90" }, "tax": "60.90", "total_with_tax": "350.90", "payable": "350.90" } } ``` Belgium: ```json Belgium supplier example theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "Benelux Industries SA/NV", "tax_id": { "country": "BE", "code": "0316597904" }, "addresses": [ { "num": "42", "street": "Rue de la Loi", "locality": "Brussels", "region": "Brussels-Capital", "code": "1040", "country": "BE" } ], "emails": [ { "addr": "billing+test@example.com" } ] } ``` ```json Belgium customer example theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "Client Belgique SRL", "tax_id": { "country": "BE", "code": "0417543527" }, "addresses": [ { "num": "88", "street": "Avenue Louise", "locality": "Brussels", "region": "Brussels-Capital", "code": "1050", "country": "BE" } ], "emails": [ { "addr": "achats@clientbelgique.be" } ] } ``` Regular invoices are used for B2B transactions. Regular invoices must be issued when: * The customer is a registered business (has a tax identification number). * The customer needs a complete invoice with all tax details for accounting or tax purposes. To create a regular invoice, include the [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) addon and ensure the `customer` field contains valid tax identification details. The addon will automatically set the document type to `380` when the silo entry is built (which happens automatically when saving a silo entry through the API or console). ```json Belgium standard B2B invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "BE", "$addons": [ "eu-en16931-v2017" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "supplier": { "name": "Benelux Industries SA/NV", "tax_id": { "country": "BE", "code": "0316597904" }, "inboxes": [ { "key": "peppol", "scheme": "0208", "code": "0316597904" } ], "addresses": [ { "num": "42", "street": "Rue de la Loi", "locality": "Brussels", "region": "Brussels-Capital", "code": "1040", "country": "BE" } ], "emails": [ { "addr": "test@example.com" } ] }, "customer": { "name": "Benelux Industries SA/NV", "tax_id": { "country": "BE", "code": "0859536301" }, "inboxes": [ { "key": "peppol", "scheme": "0208", "code": "0859536301" } ], "addresses": [ { "num": "127", "street": "Avenue Louise", "locality": "Ixelles", "region": "Brussels-Capital", "code": "1050", "country": "BE" } ], "emails": [ { "addr": "test@example.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox services", "price": "145.00", "unit": "one" }, "sum": "1740.00", "taxes": [ { "cat": "VAT", "rate": "general" } ], "total": "1740.00" } ], "payment": { "terms": { "detail": "Will be paid by 2026-06-02" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "BE", "$addons": [ "eu-en16931-v2017" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "tax": { "ext": { "untdid-document-type": "380" } }, "supplier": { "name": "Benelux Industries SA/NV", "tax_id": { "country": "BE", "code": "0316597904" }, "endpoints": [ { "uri": "iso6523-actorid-upis::0208:0316597904" } ], "inboxes": [ { "key": "peppol", "scheme": "0208", "code": "0316597904" } ], "addresses": [ { "num": "42", "street": "Rue de la Loi", "locality": "Brussels", "region": "Brussels-Capital", "code": "1040", "country": "BE" } ], "emails": [ { "addr": "test@example.com" } ] }, "customer": { "name": "Benelux Industries SA/NV", "tax_id": { "country": "BE", "code": "0859536301" }, "endpoints": [ { "uri": "iso6523-actorid-upis::0208:0859536301" } ], "inboxes": [ { "key": "peppol", "scheme": "0208", "code": "0859536301" } ], "addresses": [ { "num": "127", "street": "Avenue Louise", "locality": "Ixelles", "region": "Brussels-Capital", "code": "1050", "country": "BE" } ], "emails": [ { "addr": "test@example.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox services", "price": "145.00", "unit": "one" }, "sum": "1740.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "21.0%", "ext": { "untdid-tax-category": "S" } } ], "total": "1740.00" } ], "payment": { "terms": { "notes": "Will be paid by 2026-06-02" } }, "totals": { "sum": "1740.00", "total": "1740.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "untdid-tax-category": "S" }, "base": "1740.00", "percent": "21.0%", "amount": "365.40" } ], "amount": "365.40" } ], "sum": "365.40" }, "tax": "365.40", "total_with_tax": "2105.40", "payable": "2105.40" } } ``` Goods and services that are subject to VAT but taxed at a 0% rate. Zero rated goods in Belgium are: * Daily and weekly newspapers, as well as periodical publications that meet a specific criteria. * Recyclable materials such as waste and scrap intended for recycling. * Educational materials under specific conditions. To create an invoice with zero rated goods, use the tax key `zero` in your invoice lines. The [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) addon will automatically set the UNTDID 5305 tax category to `Z` (zero rated goods) when the silo entry is built. With zero-rated supplies, businesses can still reclaim input VAT on their purchases, whereas with exempt supplies they cannot. ```json Belgium zero rate invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "BE", "$addons": [ "eu-en16931-v2017" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "supplier": { "name": "Benelux Industries SA/NV", "tax_id": { "country": "BE", "code": "0316597904" }, "inboxes": [ { "key": "peppol", "scheme": "0208", "code": "0316597904" } ], "addresses": [ { "num": "42", "street": "Rue de la Loi", "locality": "Brussels", "region": "Brussels-Capital", "code": "1040", "country": "BE" } ], "emails": [ { "addr": "test@example.com" } ] }, "customer": { "name": "Benelux Industries SA/NV", "tax_id": { "country": "BE", "code": "0859536301" }, "inboxes": [ { "key": "peppol", "scheme": "0208", "code": "0859536301" } ], "addresses": [ { "num": "127", "street": "Avenue Louise", "locality": "Ixelles", "region": "Brussels-Capital", "code": "1050", "country": "BE" } ], "emails": [ { "addr": "test@example.com" } ] }, "lines": [ { "i": 1, "quantity": "1", "item": { "name": "Het Laatste Nieuws", "price": "2.00", "unit": "one" }, "taxes": [ { "cat": "VAT", "key": "zero" } ], "total": "2.00" } ], "payment": { "terms": { "detail": "Will be paid by 2026-06-02" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "BE", "$addons": [ "eu-en16931-v2017" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "tax": { "ext": { "untdid-document-type": "380" } }, "supplier": { "name": "Benelux Industries SA/NV", "tax_id": { "country": "BE", "code": "0316597904" }, "endpoints": [ { "uri": "iso6523-actorid-upis::0208:0316597904" } ], "inboxes": [ { "key": "peppol", "scheme": "0208", "code": "0316597904" } ], "addresses": [ { "num": "42", "street": "Rue de la Loi", "locality": "Brussels", "region": "Brussels-Capital", "code": "1040", "country": "BE" } ], "emails": [ { "addr": "test@example.com" } ] }, "customer": { "name": "Benelux Industries SA/NV", "tax_id": { "country": "BE", "code": "0859536301" }, "endpoints": [ { "uri": "iso6523-actorid-upis::0208:0859536301" } ], "inboxes": [ { "key": "peppol", "scheme": "0208", "code": "0859536301" } ], "addresses": [ { "num": "127", "street": "Avenue Louise", "locality": "Ixelles", "region": "Brussels-Capital", "code": "1050", "country": "BE" } ], "emails": [ { "addr": "test@example.com" } ] }, "lines": [ { "i": 1, "quantity": "1", "item": { "name": "Het Laatste Nieuws", "price": "2.00", "unit": "one" }, "sum": "2.00", "taxes": [ { "cat": "VAT", "key": "zero", "percent": "0%", "ext": { "untdid-tax-category": "Z" } } ], "total": "2.00" } ], "payment": { "terms": { "notes": "Will be paid by 2026-06-02" } }, "totals": { "sum": "2.00", "total": "2.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "zero", "ext": { "untdid-tax-category": "Z" }, "base": "2.00", "percent": "0%", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "2.00", "payable": "2.00" } } ``` Exempt invoices are used for B2B transactions that are exempt from VAT, which also covers exemptions in internal operations. To create an exempt invoice, use the tax key `exempt` in your invoice lines. The [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) addon will automatically set the UNTDID 5305 tax category to `E` when the silo entry is built. You must also state the reason for the exemption through the [CEF VATEX](https://docs.gobl.org/catalogues/cef#cef-vatex) - VAT exemption reason codes. Exempt operations are not subject to VAT but must still be reported. The `supplier` must be previously registered with the tax authority and the `customer` tax id must be valid. ```json Belgium Peppol Exempt Invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "BE", "$addons": [ "eu-en16931-v2017" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "supplier": { "name": "Benelux Industries SA/NV", "tax_id": { "country": "BE", "code": "0316597904" }, "inboxes": [ { "key": "peppol", "scheme": "0208", "code": "0316597904" } ], "addresses": [ { "num": "42", "street": "Rue de la Loi", "locality": "Brussels", "region": "Brussels-Capital", "code": "1040", "country": "BE" } ], "emails": [ { "addr": "test@example.com" } ] }, "customer": { "name": "Singapore Company LTD", "tax_id": { "country": "SG", "code": "199904785Z" }, "inboxes": [ { "key": "peppol", "scheme": "0195", "code": "SGUEN199904785Z" } ], "addresses": [ { "street": "18 Marina Gardens Drive", "locality": "Singapore", "region": "Central Region", "code": "018953", "country": "SG" } ], "emails": [ { "addr": "billing+test@invopop.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox product", "price": "145.00", "unit": "one" }, "sum": "145.00", "taxes": [ { "cat": "VAT", "key": "exempt", "ext": { "cef-vatex": "VATEX-EU-132-1I" } } ], "total": "145.00" } ], "payment": { "terms": { "detail": "Will be paid by 2026-06-02" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "BE", "$addons": [ "eu-en16931-v2017" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "tax": { "ext": { "untdid-document-type": "380" } }, "supplier": { "name": "Benelux Industries SA/NV", "tax_id": { "country": "BE", "code": "0316597904" }, "endpoints": [ { "uri": "iso6523-actorid-upis::0208:0316597904" } ], "inboxes": [ { "key": "peppol", "scheme": "0208", "code": "0316597904" } ], "addresses": [ { "num": "42", "street": "Rue de la Loi", "locality": "Brussels", "region": "Brussels-Capital", "code": "1040", "country": "BE" } ], "emails": [ { "addr": "test@example.com" } ] }, "customer": { "name": "Singapore Company LTD", "tax_id": { "country": "SG", "code": "199904785Z" }, "endpoints": [ { "uri": "iso6523-actorid-upis::0195:SGUEN199904785Z" } ], "inboxes": [ { "key": "peppol", "scheme": "0195", "code": "SGUEN199904785Z" } ], "addresses": [ { "street": "18 Marina Gardens Drive", "locality": "Singapore", "region": "Central Region", "code": "018953", "country": "SG" } ], "emails": [ { "addr": "billing+test@invopop.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox product", "price": "145.00", "unit": "one" }, "sum": "1740.00", "taxes": [ { "cat": "VAT", "key": "exempt", "ext": { "cef-vatex": "VATEX-EU-132-1I", "untdid-tax-category": "E" } } ], "total": "1740.00" } ], "payment": { "terms": { "notes": "Will be paid by 2026-06-02" } }, "totals": { "sum": "1740.00", "total": "1740.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "exempt", "ext": { "cef-vatex": "VATEX-EU-132-1I", "untdid-tax-category": "E" }, "base": "1740.00", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "1740.00", "payable": "1740.00" } } ``` Reverse charge invoices are used for B2B services provided to customers in other EU member states. Reverse charge must be applied when: * The customer is a registered business in another EU member state (has a valid EU VAT ID). * The service is provided to a business customer (B2B), not a consumer. * The service is subject to VAT but the customer accounts for the VAT in their own country. To create a reverse charge invoice, use the tax key `reverse-charge` in your invoice lines. The [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) addon will automatically set the UNTDID 5305 tax category to `AE` (reverse charge) when the silo entry is built. With reverse charge, no VAT is charged by the supplier. The customer accounts for VAT in their own country. Both `supplier` and `customer` VAT ID must be valid and registered in the EU VIES system. ```json Belgium reverse charge invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "BE", "$addons": [ "eu-en16931-v2017" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "supplier": { "name": "Benelux Industries SA/NV", "tax_id": { "country": "BE", "code": "0316597904" }, "inboxes": [ { "key": "peppol", "scheme": "0208", "code": "0316597904" } ], "addresses": [ { "num": "42", "street": "Rue de la Loi", "locality": "Brussels", "region": "Brussels-Capital", "code": "1040", "country": "BE" } ], "emails": [ { "addr": "test@example.com" } ] }, "customer": { "name": "Invopop SL", "tax_id": { "country": "ES", "code": "B85905495" }, "inboxes": [ { "key": "peppol", "scheme": "9920", "code": "ESB85905495" } ], "addresses": [ { "street": "Calle Pradillo 42", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing+test@invopop.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox services", "price": "145.00", "unit": "one" }, "sum": "1740.00", "taxes": [ { "cat": "VAT", "key": "reverse-charge", "ext": { "cef-vatex": "VATEX-EU-AE" } } ], "total": "1740.00" } ], "payment": { "terms": { "detail": "Will be paid by 2026-06-02" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "BE", "$addons": [ "eu-en16931-v2017" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "tax": { "ext": { "untdid-document-type": "380" } }, "supplier": { "name": "Benelux Industries SA/NV", "tax_id": { "country": "BE", "code": "0316597904" }, "endpoints": [ { "uri": "iso6523-actorid-upis::0208:0316597904" } ], "inboxes": [ { "key": "peppol", "scheme": "0208", "code": "0316597904" } ], "addresses": [ { "num": "42", "street": "Rue de la Loi", "locality": "Brussels", "region": "Brussels-Capital", "code": "1040", "country": "BE" } ], "emails": [ { "addr": "test@example.com" } ] }, "customer": { "name": "Invopop SL", "tax_id": { "country": "ES", "code": "B85905495" }, "endpoints": [ { "uri": "iso6523-actorid-upis::9920:ESB85905495" } ], "inboxes": [ { "key": "peppol", "scheme": "9920", "code": "ESB85905495" } ], "addresses": [ { "street": "Calle Pradillo 42", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing+test@invopop.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox services", "price": "145.00", "unit": "one" }, "sum": "1740.00", "taxes": [ { "cat": "VAT", "key": "reverse-charge", "ext": { "cef-vatex": "VATEX-EU-AE", "untdid-tax-category": "AE" } } ], "total": "1740.00" } ], "payment": { "terms": { "notes": "Will be paid by 2026-06-02" } }, "totals": { "sum": "1740.00", "total": "1740.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "reverse-charge", "ext": { "cef-vatex": "VATEX-EU-AE", "untdid-tax-category": "AE" }, "base": "1740.00", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "1740.00", "payable": "1740.00" } } ``` Intra-community supply invoices are used for B2B goods delivered to customers in other EU member states. Intra-community supplies must be applied when: * The customer is a registered business in another EU member state (has a valid EU VAT ID). * Goods are physically delivered to another EU member state. * The supply is exempt from VAT in the origin country and subject to VAT in the destination country. To create an intra-community supply Peppol invoice, use the tax key `intra-community` in your invoice lines. The [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) addon will automatically set the UNTDID 5305 tax category to `K` (VAT exempt for EEA intra-community supply of goods and services) when the silo entry is built. With intra-community supplies in the EU, the customer accounts for VAT in their destination country. The `supplier` must be previously registered with the tax authority and the `customer` VAT ID must be valid and registered in the EU VIES system. ```json Belgium intra-community invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "eu-en16931-v2017" ], "$regime": "BE", "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "supplier": { "name": "Benelux Industries SA/NV", "tax_id": { "country": "BE", "code": "0316597904" }, "inboxes": [ { "key": "peppol", "scheme": "0208", "code": "0316597904" } ], "addresses": [ { "num": "42", "street": "Rue de la Loi", "locality": "Brussels", "region": "Brussels-Capital", "code": "1040", "country": "BE" } ], "emails": [ { "addr": "test@example.com" } ] }, "customer": { "name": "Invopop SL", "tax_id": { "country": "ES", "code": "B85905495" }, "inboxes": [ { "key": "peppol", "scheme": "9920", "code": "ESB85905495" } ], "addresses": [ { "street": "Calle Pradillo 42", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing+test@invopop.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox product", "price": "145.00", "unit": "one" }, "sum": "1740.00", "taxes": [ { "cat": "VAT", "key": "intra-community", "ext": { "cef-vatex": "VATEX-EU-IC" } } ], "total": "1740.00" } ], "payment": { "terms": { "detail": "Will be paid by 2026-06-02" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "BE", "$addons": [ "eu-en16931-v2017" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "tax": { "ext": { "untdid-document-type": "380" } }, "supplier": { "name": "Benelux Industries SA/NV", "tax_id": { "country": "BE", "code": "0316597904" }, "endpoints": [ { "uri": "iso6523-actorid-upis::0208:0316597904" } ], "inboxes": [ { "key": "peppol", "scheme": "0208", "code": "0316597904" } ], "addresses": [ { "num": "42", "street": "Rue de la Loi", "locality": "Brussels", "region": "Brussels-Capital", "code": "1040", "country": "BE" } ], "emails": [ { "addr": "test@example.com" } ] }, "customer": { "name": "Invopop SL", "tax_id": { "country": "ES", "code": "B85905495" }, "endpoints": [ { "uri": "iso6523-actorid-upis::9920:ESB85905495" } ], "inboxes": [ { "key": "peppol", "scheme": "9920", "code": "ESB85905495" } ], "addresses": [ { "street": "Calle Pradillo 42", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing+test@invopop.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox product", "price": "145.00", "unit": "one" }, "sum": "1740.00", "taxes": [ { "cat": "VAT", "key": "intra-community", "ext": { "cef-vatex": "VATEX-EU-IC", "untdid-tax-category": "K" } } ], "total": "1740.00" } ], "payment": { "terms": { "notes": "Will be paid by 2026-06-02" } }, "totals": { "sum": "1740.00", "total": "1740.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "intra-community", "ext": { "cef-vatex": "VATEX-EU-IC", "untdid-tax-category": "K" }, "base": "1740.00", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "1740.00", "payable": "1740.00" } } ``` Outside scope invoices are used for B2B services provided to customers outside the EU. To create an outside scope Peppol invoice, use the tax key `outside-scope` in your invoice lines. The [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) addon will automatically set the UNTDID 5305 tax category to `O` (Services outside scope of tax) when the silo entry is built. Services provided to non-EU customers are generally outside the scope of EU VAT. ```json Belgium outside scope theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "BE", "$addons": [ "eu-en16931-v2017" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "supplier": { "name": "Benelux Industries SA/NV", "tax_id": { "country": "BE", "code": "0316597904" }, "inboxes": [ { "key": "peppol", "scheme": "0208", "code": "0316597904" } ], "addresses": [ { "num": "42", "street": "Rue de la Loi", "locality": "Brussels", "region": "Brussels-Capital", "code": "1040", "country": "BE" } ], "emails": [ { "addr": "test@example.com" } ] }, "customer": { "name": "Singapore Company LTD", "tax_id": { "country": "SG", "code": "199904785Z" }, "inboxes": [ { "key": "peppol", "scheme": "0195", "code": "SGUEN199904785Z" } ], "addresses": [ { "street": "18 Marina Gardens Drive", "locality": "Singapore", "region": "Central Region", "code": "018953", "country": "SG" } ], "emails": [ { "addr": "billing+test@invopop.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox service", "price": "145.00", "unit": "h" }, "sum": "145.00", "taxes": [ { "cat": "VAT", "key": "outside-scope", "ext": { "cef-vatex": "VATEX-EU-O" } } ], "total": "145.00" } ], "payment": { "terms": { "detail": "Will be paid by 2026-06-02" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "BE", "$addons": [ "eu-en16931-v2017" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "tax": { "ext": { "untdid-document-type": "380" } }, "supplier": { "name": "Benelux Industries SA/NV", "tax_id": { "country": "BE", "code": "0316597904" }, "endpoints": [ { "uri": "iso6523-actorid-upis::0208:0316597904" } ], "inboxes": [ { "key": "peppol", "scheme": "0208", "code": "0316597904" } ], "addresses": [ { "num": "42", "street": "Rue de la Loi", "locality": "Brussels", "region": "Brussels-Capital", "code": "1040", "country": "BE" } ], "emails": [ { "addr": "test@example.com" } ] }, "customer": { "name": "Singapore Company LTD", "tax_id": { "country": "SG", "code": "199904785Z" }, "endpoints": [ { "uri": "iso6523-actorid-upis::0195:SGUEN199904785Z" } ], "inboxes": [ { "key": "peppol", "scheme": "0195", "code": "SGUEN199904785Z" } ], "addresses": [ { "street": "18 Marina Gardens Drive", "locality": "Singapore", "region": "Central Region", "code": "018953", "country": "SG" } ], "emails": [ { "addr": "billing+test@invopop.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox service", "price": "145.00", "unit": "h" }, "sum": "1740.00", "taxes": [ { "cat": "VAT", "key": "outside-scope", "ext": { "cef-vatex": "VATEX-EU-O", "untdid-tax-category": "O" } } ], "total": "1740.00" } ], "payment": { "terms": { "notes": "Will be paid by 2026-06-02" } }, "totals": { "sum": "1740.00", "total": "1740.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "outside-scope", "ext": { "cef-vatex": "VATEX-EU-O", "untdid-tax-category": "O" }, "base": "1740.00", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "1740.00", "payable": "1740.00" } } ``` Export invoices are used for B2B goods delivered to customers outside the EU. To create an export Peppol invoice, use the tax key `export` in your invoice lines. The [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) addon will automatically set the UNTDID 5305 tax category to `G` (Free export item, tax not charged) when the silo entry is built. Exported goods are exempt from VAT. The `supplier` must be previously registered with the tax authority. Customer tax identification is optional but recommended for record-keeping purposes. ```json Belgium export invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "BE", "$addons": [ "eu-en16931-v2017" ], "uuid": "019bb71c-7205-7000-9aef-878145b9fce6", "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "supplier": { "name": "Benelux Industries SA/NV", "tax_id": { "country": "BE", "code": "0316597904" }, "inboxes": [ { "key": "peppol", "scheme": "0208", "code": "0316597904" } ], "addresses": [ { "num": "42", "street": "Rue de la Loi", "locality": "Brussels", "region": "Brussels-Capital", "code": "1040", "country": "BE" } ], "emails": [ { "addr": "test@example.com" } ] }, "customer": { "name": "Singapore Company LTD", "tax_id": { "country": "SG", "code": "199904785Z" }, "inboxes": [ { "key": "peppol", "scheme": "0195", "code": "SGUEN199904785Z" } ], "addresses": [ { "street": "18 Marina Gardens Drive", "locality": "Singapore", "region": "Central Region", "code": "018953", "country": "SG" } ], "emails": [ { "addr": "billing+test@invopop.com" } ] }, "lines": [ { "quantity": "12", "item": { "name": "Sambox product", "price": "145.00", "unit": "one" }, "sum": "1740.00", "taxes": [ { "cat": "VAT", "key": "export", "ext": { "cef-vatex": "VATEX-EU-G" } } ], "total": "1740.00" } ], "payment": { "terms": { "notes": "Will be paid by 2026-06-02" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "BE", "$addons": [ "eu-en16931-v2017" ], "uuid": "019bb71c-7205-7000-9aef-878145b9fce6", "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "tax": { "ext": { "untdid-document-type": "380" } }, "supplier": { "name": "Benelux Industries SA/NV", "tax_id": { "country": "BE", "code": "0316597904" }, "endpoints": [ { "uri": "iso6523-actorid-upis::0208:0316597904" } ], "inboxes": [ { "key": "peppol", "scheme": "0208", "code": "0316597904" } ], "addresses": [ { "num": "42", "street": "Rue de la Loi", "locality": "Brussels", "region": "Brussels-Capital", "code": "1040", "country": "BE" } ], "emails": [ { "addr": "test@example.com" } ] }, "customer": { "name": "Singapore Company LTD", "tax_id": { "country": "SG", "code": "199904785Z" }, "endpoints": [ { "uri": "iso6523-actorid-upis::0195:SGUEN199904785Z" } ], "inboxes": [ { "key": "peppol", "scheme": "0195", "code": "SGUEN199904785Z" } ], "addresses": [ { "street": "18 Marina Gardens Drive", "locality": "Singapore", "region": "Central Region", "code": "018953", "country": "SG" } ], "emails": [ { "addr": "billing+test@invopop.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox product", "price": "145.00", "unit": "one" }, "sum": "1740.00", "taxes": [ { "cat": "VAT", "key": "export", "ext": { "cef-vatex": "VATEX-EU-G", "untdid-tax-category": "G" } } ], "total": "1740.00" } ], "payment": { "terms": { "notes": "Will be paid by 2026-06-02" } }, "totals": { "sum": "1740.00", "total": "1740.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "export", "ext": { "cef-vatex": "VATEX-EU-G", "untdid-tax-category": "G" }, "base": "1740.00", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "1740.00", "payable": "1740.00" } } ``` Credit notes reverse all or part of a previously issued invoice — for returns, cancellations, or billing corrections. To create a credit note, set the `type` to `credit-note` and reference the original invoice in the `preceding` array by `series`, `code`, and `issue_date`, optionally with a `reason`. The [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) addon will automatically set the UNTDID document type to `381` (credit note) when the silo entry is built. The lines describe the amounts being credited as positive values — the credit note document type is what reverses them. A credit note can cover the full original invoice or just part of it. ```json Belgium credit note theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "BE", "$addons": [ "eu-en16931-v2017" ], "type": "credit-note", "series": "CN", "code": "PP000104", "issue_date": "2025-04-10", "currency": "EUR", "preceding": [ { "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "reason": "Services not delivered" } ], "supplier": { "name": "Benelux Industries SA/NV", "tax_id": { "country": "BE", "code": "0316597904" }, "inboxes": [ { "key": "peppol", "scheme": "0208", "code": "0316597904" } ], "addresses": [ { "num": "42", "street": "Rue de la Loi", "locality": "Brussels", "region": "Brussels-Capital", "code": "1040", "country": "BE" } ], "emails": [ { "addr": "test@example.com" } ] }, "customer": { "name": "Benelux Industries SA/NV", "tax_id": { "country": "BE", "code": "0859536301" }, "inboxes": [ { "key": "peppol", "scheme": "0208", "code": "0859536301" } ], "addresses": [ { "num": "127", "street": "Avenue Louise", "locality": "Ixelles", "region": "Brussels-Capital", "code": "1050", "country": "BE" } ], "emails": [ { "addr": "test@example.com" } ] }, "lines": [ { "quantity": "2", "item": { "name": "Sambox services", "price": "145.00", "unit": "one" }, "taxes": [ { "cat": "VAT", "rate": "general" } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "BE", "$addons": [ "eu-en16931-v2017" ], "type": "credit-note", "series": "CN", "code": "PP000104", "issue_date": "2025-04-10", "currency": "EUR", "preceding": [ { "type": "standard", "issue_date": "2025-04-03", "series": "INV", "code": "PP000003", "reason": "Services not delivered" } ], "tax": { "ext": { "untdid-document-type": "381" } }, "supplier": { "name": "Benelux Industries SA/NV", "tax_id": { "country": "BE", "code": "0316597904" }, "endpoints": [ { "uri": "iso6523-actorid-upis::0208:0316597904" } ], "inboxes": [ { "key": "peppol", "scheme": "0208", "code": "0316597904" } ], "addresses": [ { "num": "42", "street": "Rue de la Loi", "locality": "Brussels", "region": "Brussels-Capital", "code": "1040", "country": "BE" } ], "emails": [ { "addr": "test@example.com" } ] }, "customer": { "name": "Benelux Industries SA/NV", "tax_id": { "country": "BE", "code": "0859536301" }, "endpoints": [ { "uri": "iso6523-actorid-upis::0208:0859536301" } ], "inboxes": [ { "key": "peppol", "scheme": "0208", "code": "0859536301" } ], "addresses": [ { "num": "127", "street": "Avenue Louise", "locality": "Ixelles", "region": "Brussels-Capital", "code": "1050", "country": "BE" } ], "emails": [ { "addr": "test@example.com" } ] }, "lines": [ { "i": 1, "quantity": "2", "item": { "name": "Sambox services", "price": "145.00", "unit": "one" }, "sum": "290.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "21.0%", "ext": { "untdid-tax-category": "S" } } ], "total": "290.00" } ], "totals": { "sum": "290.00", "total": "290.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "untdid-tax-category": "S" }, "base": "290.00", "percent": "21.0%", "amount": "60.90" } ], "amount": "60.90" } ], "sum": "60.90" }, "tax": "60.90", "total_with_tax": "350.90", "payable": "350.90" } } ``` Germany: ```json Germany supplier example theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "Rheinland Technologies GmbH", "tax_id": { "country": "DE", "code": "879558966" }, "addresses": [ { "num": "27", "street": "Friedrichstraße", "locality": "Berlin", "region": "BE", "code": "10117", "country": "DE" } ], "emails": [ { "addr": "rechnungen@rheinlandtech.de" } ] } ``` A B2B customer addressed by its VAT number under scheme `9930`. ```json Germany customer example theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "Muster Handel GmbH", "tax_id": { "country": "DE", "code": "111111125" }, "inboxes": [ { "key": "peppol", "scheme": "9930", "code": "DE111111125" } ], "addresses": [ { "num": "10", "street": "Berliner Strasse", "locality": "Berlin", "region": "BE", "code": "10117", "country": "DE" } ], "emails": [ { "addr": "buchhaltung@musterhandel.de" } ] } ``` A B2G customer addressed by its Leitweg-ID under scheme `0204` — required for invoicing German public administrations. ```json Germany government customer example theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "Bundesverwaltungsamt", "inboxes": [ { "key": "peppol", "scheme": "0204", "code": "991-33333TEST-33" } ], "addresses": [ { "num": "50", "street": "Barbarastraße", "locality": "Köln", "region": "NW", "code": "50735", "country": "DE" } ], "people": [ { "name": { "given": "Erika", "surname": "Mustermann" } } ], "emails": [ { "addr": "rechnungseingang@bva.bund.de" } ] } ``` Regular invoices are used for B2B transactions. Regular invoices must be issued when: * The customer is a registered business (has a tax identification number). * The customer requires a full invoice. * The customer needs a complete invoice with all tax details for accounting or tax purposes. To create a regular invoice, include the [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) addon and ensure the `customer` field contains valid tax identification details. The addon will automatically set the document type to `380` when the silo entry is built (which happens automatically when saving a silo entry through the API or console). The `supplier` must be previously registered with the tax authority and the `customer` VAT ID must be valid. ```json Germany standard B2B invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "DE", "$addons": [ "eu-en16931-v2017" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "supplier": { "name": "Rheinland Technologies GmbH", "tax_id": { "country": "DE", "code": "879558966" }, "inboxes": [ { "key": "peppol", "scheme": "9930", "code": "DE879558966" } ], "addresses": [ { "num": "27", "street": "Friedrichstraße", "locality": "Berlin", "region": "BE", "code": "10117", "country": "DE" } ], "emails": [ { "addr": "rechnungen@rheinlandtech.de" } ] }, "customer": { "name": "Bavaria Solutions GmbH", "tax_id": { "country": "DE", "code": "993930191" }, "inboxes": [ { "key": "peppol", "scheme": "9930", "code": "DE993930191" } ], "addresses": [ { "num": "15", "street": "Marienplatz", "locality": "München", "region": "BY", "code": "80331", "country": "DE" } ], "emails": [ { "addr": "test@example.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox services", "price": "145.00", "unit": "one" }, "sum": "1740.00", "taxes": [ { "cat": "VAT", "rate": "general" } ], "total": "1740.00" } ], "payment": { "terms": { "detail": "Will be paid by 2026-06-02" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "DE", "$addons": [ "eu-en16931-v2017" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "tax": { "ext": { "untdid-document-type": "380" } }, "supplier": { "name": "Rheinland Technologies GmbH", "tax_id": { "country": "DE", "code": "879558966" }, "endpoints": [ { "uri": "iso6523-actorid-upis::9930:DE879558966" } ], "inboxes": [ { "key": "peppol", "scheme": "9930", "code": "DE879558966" } ], "addresses": [ { "num": "27", "street": "Friedrichstraße", "locality": "Berlin", "region": "BE", "code": "10117", "country": "DE" } ], "emails": [ { "addr": "rechnungen@rheinlandtech.de" } ] }, "customer": { "name": "Bavaria Solutions GmbH", "tax_id": { "country": "DE", "code": "993930191" }, "endpoints": [ { "uri": "iso6523-actorid-upis::9930:DE993930191" } ], "inboxes": [ { "key": "peppol", "scheme": "9930", "code": "DE993930191" } ], "addresses": [ { "num": "15", "street": "Marienplatz", "locality": "München", "region": "BY", "code": "80331", "country": "DE" } ], "emails": [ { "addr": "test@example.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox services", "price": "145.00", "unit": "one" }, "sum": "1740.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "19%", "ext": { "untdid-tax-category": "S" } } ], "total": "1740.00" } ], "payment": { "terms": { "notes": "Will be paid by 2026-06-02" } }, "totals": { "sum": "1740.00", "total": "1740.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "untdid-tax-category": "S" }, "base": "1740.00", "percent": "19%", "amount": "330.60" } ], "amount": "330.60" } ], "sum": "330.60" }, "tax": "330.60", "total_with_tax": "2070.60", "payable": "2070.60" } } ``` Exempt invoices are used for B2B transactions that are exempt from VAT, which also covers exemptions in internal operations. To create an exempt invoice, use the tax key `exempt` in your invoice lines. The [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) addon will automatically set the UNTDID 5305 tax category to `E` when the silo entry is built. You must also state the reason for the exemption through the [CEF VATEX](https://docs.gobl.org/catalogues/cef#cef-vatex) - VAT exemption reason codes. Exempt operations are not subject to VAT but must still be reported. The `supplier` must be previously registered with the tax authority and the `customer` tax id must be valid. ```json Germany Peppol Exempt Invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "eu-en16931-v2017" ], "$regime": "DE", "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "supplier": { "name": "Deutsche Sprachschule", "tax_id": { "country": "DE", "code": "993930191" }, "inboxes": [ { "key": "peppol", "scheme": "9930", "code": "DE993930191" } ], "addresses": [ { "num": "15", "street": "Marienplatz", "locality": "München", "region": "BY", "code": "80331", "country": "DE" } ], "emails": [ { "addr": "test@example.com" } ] }, "customer": { "name": "Rheinland Technologies GmbH", "tax_id": { "country": "DE", "code": "879558966" }, "inboxes": [ { "key": "peppol", "scheme": "9930", "code": "DE879558966" } ], "addresses": [ { "num": "27", "street": "Friedrichstraße", "locality": "Berlin", "region": "BE", "code": "10117", "country": "DE" } ], "emails": [ { "addr": "rechnungen@rheinlandtech.de" } ] }, "lines": [ { "i": 1, "quantity": "1", "item": { "name": "Deutschkurs - Monat", "price": "120.00", "unit": "one" }, "taxes": [ { "cat": "VAT", "key": "exempt", "ext": { "cef-vatex": "VATEX-EU-132-1I" } } ], "total": "120.00" } ], "payment": { "terms": { "detail": "Will be paid by 2026-06-02" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "DE", "$addons": [ "eu-en16931-v2017" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "tax": { "ext": { "untdid-document-type": "380" } }, "supplier": { "name": "Deutsche Sprachschule", "tax_id": { "country": "DE", "code": "993930191" }, "endpoints": [ { "uri": "iso6523-actorid-upis::9930:DE993930191" } ], "inboxes": [ { "key": "peppol", "scheme": "9930", "code": "DE993930191" } ], "addresses": [ { "num": "15", "street": "Marienplatz", "locality": "München", "region": "BY", "code": "80331", "country": "DE" } ], "emails": [ { "addr": "test@example.com" } ] }, "customer": { "name": "Rheinland Technologies GmbH", "tax_id": { "country": "DE", "code": "879558966" }, "endpoints": [ { "uri": "iso6523-actorid-upis::9930:DE879558966" } ], "inboxes": [ { "key": "peppol", "scheme": "9930", "code": "DE879558966" } ], "addresses": [ { "num": "27", "street": "Friedrichstraße", "locality": "Berlin", "region": "BE", "code": "10117", "country": "DE" } ], "emails": [ { "addr": "rechnungen@rheinlandtech.de" } ] }, "lines": [ { "i": 1, "quantity": "1", "item": { "name": "Deutschkurs - Monat", "price": "120.00", "unit": "one" }, "sum": "120.00", "taxes": [ { "cat": "VAT", "key": "exempt", "ext": { "cef-vatex": "VATEX-EU-132-1I", "untdid-tax-category": "E" } } ], "total": "120.00" } ], "payment": { "terms": { "notes": "Will be paid by 2026-06-02" } }, "totals": { "sum": "120.00", "total": "120.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "exempt", "ext": { "cef-vatex": "VATEX-EU-132-1I", "untdid-tax-category": "E" }, "base": "120.00", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "120.00", "payable": "120.00" } } ``` Reverse charge invoices are used for B2B services provided to customers in other EU member states. Reverse charge must be applied when: * The customer is a registered business in another EU member state (has a valid EU VAT ID). * The service is provided to a business customer (B2B), not a consumer. * The service is subject to VAT but the customer accounts for the VAT in their own country. To create a reverse charge invoice, use the tax key `reverse-charge` in your invoice lines. The [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) addon will automatically set the UNTDID 5305 tax category to `AE` (reverse charge) when the silo entry is built. With reverse charge, no VAT is charged by the supplier. The customer accounts for VAT in their own country. Both `supplier` and `customer` VAT ID must be valid and registered in the EU VIES system. ```json Germany reverse charge invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "DE", "$addons": [ "eu-en16931-v2017" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "supplier": { "name": "Rheinland Technologies GmbH", "tax_id": { "country": "DE", "code": "879558966" }, "inboxes": [ { "key": "peppol", "scheme": "9930", "code": "DE879558966" } ], "addresses": [ { "num": "27", "street": "Friedrichstraße", "locality": "Berlin", "region": "BE", "code": "10117", "country": "DE" } ], "emails": [ { "addr": "rechnungen@rheinlandtech.de" } ] }, "customer": { "name": "Invopop SL", "tax_id": { "country": "ES", "code": "B85905495" }, "inboxes": [ { "key": "peppol", "scheme": "9920", "code": "ESB85905495" } ], "addresses": [ { "street": "Calle Pradillo 42", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing+test@invopop.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox services", "price": "145.00", "unit": "one" }, "sum": "1740.00", "taxes": [ { "cat": "VAT", "key": "reverse-charge", "ext": { "cef-vatex": "VATEX-EU-AE" } } ], "total": "1740.00" } ], "payment": { "terms": { "detail": "Will be paid by 2026-06-02" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "DE", "$addons": [ "eu-en16931-v2017" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "tax": { "ext": { "untdid-document-type": "380" } }, "supplier": { "name": "Rheinland Technologies GmbH", "tax_id": { "country": "DE", "code": "879558966" }, "endpoints": [ { "uri": "iso6523-actorid-upis::9930:DE879558966" } ], "inboxes": [ { "key": "peppol", "scheme": "9930", "code": "DE879558966" } ], "addresses": [ { "num": "27", "street": "Friedrichstraße", "locality": "Berlin", "region": "BE", "code": "10117", "country": "DE" } ], "emails": [ { "addr": "rechnungen@rheinlandtech.de" } ] }, "customer": { "name": "Invopop SL", "tax_id": { "country": "ES", "code": "B85905495" }, "endpoints": [ { "uri": "iso6523-actorid-upis::9920:ESB85905495" } ], "inboxes": [ { "key": "peppol", "scheme": "9920", "code": "ESB85905495" } ], "addresses": [ { "street": "Calle Pradillo 42", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing+test@invopop.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox services", "price": "145.00", "unit": "one" }, "sum": "1740.00", "taxes": [ { "cat": "VAT", "key": "reverse-charge", "ext": { "cef-vatex": "VATEX-EU-AE", "untdid-tax-category": "AE" } } ], "total": "1740.00" } ], "payment": { "terms": { "notes": "Will be paid by 2026-06-02" } }, "totals": { "sum": "1740.00", "total": "1740.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "reverse-charge", "ext": { "cef-vatex": "VATEX-EU-AE", "untdid-tax-category": "AE" }, "base": "1740.00", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "1740.00", "payable": "1740.00" } } ``` Intra-community supply invoices are used for B2B goods delivered to customers in other EU member states. Intra-community supplies must be applied when: * The customer is a registered business in another EU member state (has a valid EU VAT ID). * Goods are physically delivered to another EU member state. * The supply is exempt from VAT in the origin country and subject to VAT in the destination country. To create an intra-community supply Peppol invoice, use the tax key `intra-community` in your invoice lines. The [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) addon will automatically set the UNTDID 5305 tax category to `K` (VAT exempt for EEA intra-community supply of goods and services) when the silo entry is built. With intra-community supplies in the EU, the customer accounts for VAT in their destination country. The `supplier` must be previously registered with the tax authority and the `customer` VAT ID must be valid and registered in the EU VIES system. ```json Germany intra-community invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "DE", "$addons": [ "eu-en16931-v2017" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "supplier": { "name": "Rheinland Technologies GmbH", "tax_id": { "country": "DE", "code": "879558966" }, "inboxes": [ { "key": "peppol", "scheme": "9930", "code": "DE879558966" } ], "addresses": [ { "num": "27", "street": "Friedrichstraße", "locality": "Berlin", "region": "BE", "code": "10117", "country": "DE" } ], "emails": [ { "addr": "rechnungen@rheinlandtech.de" } ] }, "customer": { "name": "Invopop SL", "tax_id": { "country": "ES", "code": "B85905495" }, "inboxes": [ { "key": "peppol", "scheme": "9920", "code": "ESB85905495" } ], "addresses": [ { "street": "Calle Pradillo 42", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing+test@invopop.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox product", "price": "145.00", "unit": "one" }, "sum": "1740.00", "taxes": [ { "cat": "VAT", "key": "intra-community", "ext": { "cef-vatex": "VATEX-EU-IC" } } ], "total": "1740.00" } ], "payment": { "terms": { "detail": "Will be paid by 2026-06-02" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "DE", "$addons": [ "eu-en16931-v2017" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "tax": { "ext": { "untdid-document-type": "380" } }, "supplier": { "name": "Rheinland Technologies GmbH", "tax_id": { "country": "DE", "code": "879558966" }, "endpoints": [ { "uri": "iso6523-actorid-upis::9930:DE879558966" } ], "inboxes": [ { "key": "peppol", "scheme": "9930", "code": "DE879558966" } ], "addresses": [ { "num": "27", "street": "Friedrichstraße", "locality": "Berlin", "region": "BE", "code": "10117", "country": "DE" } ], "emails": [ { "addr": "rechnungen@rheinlandtech.de" } ] }, "customer": { "name": "Invopop SL", "tax_id": { "country": "ES", "code": "B85905495" }, "endpoints": [ { "uri": "iso6523-actorid-upis::9920:ESB85905495" } ], "inboxes": [ { "key": "peppol", "scheme": "9920", "code": "ESB85905495" } ], "addresses": [ { "street": "Calle Pradillo 42", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing+test@invopop.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox product", "price": "145.00", "unit": "one" }, "sum": "1740.00", "taxes": [ { "cat": "VAT", "key": "intra-community", "ext": { "cef-vatex": "VATEX-EU-IC", "untdid-tax-category": "K" } } ], "total": "1740.00" } ], "payment": { "terms": { "notes": "Will be paid by 2026-06-02" } }, "totals": { "sum": "1740.00", "total": "1740.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "intra-community", "ext": { "cef-vatex": "VATEX-EU-IC", "untdid-tax-category": "K" }, "base": "1740.00", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "1740.00", "payable": "1740.00" } } ``` Outside scope invoices are used for B2B services provided to customers outside the EU. To create an outside scope Peppol invoice, use the tax key `outside-scope` in your invoice lines. The [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) addon will automatically set the UNTDID 5305 tax category to `O` (Services outside scope of tax) when the silo entry is built. Services provided to non-EU customers are generally outside the scope of EU VAT. ```json Germany outside scope theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "DE", "$addons": [ "eu-en16931-v2017" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "supplier": { "name": "Rheinland Technologies GmbH", "tax_id": { "country": "DE", "code": "879558966" }, "inboxes": [ { "key": "peppol", "scheme": "9930", "code": "DE879558966" } ], "addresses": [ { "num": "27", "street": "Friedrichstraße", "locality": "Berlin", "region": "BE", "code": "10117", "country": "DE" } ], "emails": [ { "addr": "rechnungen@rheinlandtech.de" } ] }, "customer": { "name": "Singapore Company LTD", "tax_id": { "country": "SG", "code": "199904785Z" }, "inboxes": [ { "key": "peppol", "scheme": "0195", "code": "SGUEN199904785Z" } ], "addresses": [ { "street": "18 Marina Gardens Drive", "locality": "Singapore", "region": "Central Region", "code": "018953", "country": "SG" } ], "emails": [ { "addr": "billing+test@invopop.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox service", "price": "145.00", "unit": "h" }, "sum": "145.00", "taxes": [ { "cat": "VAT", "key": "outside-scope", "ext": { "cef-vatex": "VATEX-EU-O" } } ], "total": "145.00" } ], "payment": { "terms": { "detail": "Will be paid by 2026-06-02" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "DE", "$addons": [ "eu-en16931-v2017" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "tax": { "ext": { "untdid-document-type": "380" } }, "supplier": { "name": "Rheinland Technologies GmbH", "tax_id": { "country": "DE", "code": "879558966" }, "endpoints": [ { "uri": "iso6523-actorid-upis::9930:DE879558966" } ], "inboxes": [ { "key": "peppol", "scheme": "9930", "code": "DE879558966" } ], "addresses": [ { "num": "27", "street": "Friedrichstraße", "locality": "Berlin", "region": "BE", "code": "10117", "country": "DE" } ], "emails": [ { "addr": "rechnungen@rheinlandtech.de" } ] }, "customer": { "name": "Singapore Company LTD", "tax_id": { "country": "SG", "code": "199904785Z" }, "endpoints": [ { "uri": "iso6523-actorid-upis::0195:SGUEN199904785Z" } ], "inboxes": [ { "key": "peppol", "scheme": "0195", "code": "SGUEN199904785Z" } ], "addresses": [ { "street": "18 Marina Gardens Drive", "locality": "Singapore", "region": "Central Region", "code": "018953", "country": "SG" } ], "emails": [ { "addr": "billing+test@invopop.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox service", "price": "145.00", "unit": "h" }, "sum": "1740.00", "taxes": [ { "cat": "VAT", "key": "outside-scope", "ext": { "cef-vatex": "VATEX-EU-O", "untdid-tax-category": "O" } } ], "total": "1740.00" } ], "payment": { "terms": { "notes": "Will be paid by 2026-06-02" } }, "totals": { "sum": "1740.00", "total": "1740.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "outside-scope", "ext": { "cef-vatex": "VATEX-EU-O", "untdid-tax-category": "O" }, "base": "1740.00", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "1740.00", "payable": "1740.00" } } ``` Export invoices are used for B2B goods delivered to customers outside the EU. To create an export Peppol invoice, use the tax key `export` in your invoice lines. The [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) addon will automatically set the UNTDID 5305 tax category to `G` (Free export item, tax not charged) when the silo entry is built. Exported goods are exempt from VAT. The `supplier` must be previously registered with the tax authority. Customer tax identification is optional but recommended for record-keeping purposes. ```json Germany export invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "DE", "$addons": [ "eu-en16931-v2017" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "supplier": { "name": "Rheinland Technologies GmbH", "tax_id": { "country": "DE", "code": "879558966" }, "inboxes": [ { "key": "peppol", "scheme": "9930", "code": "DE879558966" } ], "addresses": [ { "num": "27", "street": "Friedrichstraße", "locality": "Berlin", "region": "BE", "code": "10117", "country": "DE" } ], "emails": [ { "addr": "rechnungen@rheinlandtech.de" } ] }, "customer": { "name": "Singapore Company LTD", "tax_id": { "country": "SG", "code": "199904785Z" }, "inboxes": [ { "key": "peppol", "scheme": "0195", "code": "SGUEN199904785Z" } ], "addresses": [ { "street": "18 Marina Gardens Drive", "locality": "Singapore", "region": "Central Region", "code": "018953", "country": "SG" } ], "emails": [ { "addr": "billing+test@invopop.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox product", "price": "145.00", "unit": "one" }, "sum": "145.00", "taxes": [ { "cat": "VAT", "key": "export", "ext": { "cef-vatex": "VATEX-EU-G" } } ], "total": "145.00" } ], "payment": { "terms": { "detail": "Will be paid by 2026-06-02" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "DE", "$addons": [ "eu-en16931-v2017" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "tax": { "ext": { "untdid-document-type": "380" } }, "supplier": { "name": "Rheinland Technologies GmbH", "tax_id": { "country": "DE", "code": "879558966" }, "endpoints": [ { "uri": "iso6523-actorid-upis::9930:DE879558966" } ], "inboxes": [ { "key": "peppol", "scheme": "9930", "code": "DE879558966" } ], "addresses": [ { "num": "27", "street": "Friedrichstraße", "locality": "Berlin", "region": "BE", "code": "10117", "country": "DE" } ], "emails": [ { "addr": "rechnungen@rheinlandtech.de" } ] }, "customer": { "name": "Singapore Company LTD", "tax_id": { "country": "SG", "code": "199904785Z" }, "endpoints": [ { "uri": "iso6523-actorid-upis::0195:SGUEN199904785Z" } ], "inboxes": [ { "key": "peppol", "scheme": "0195", "code": "SGUEN199904785Z" } ], "addresses": [ { "street": "18 Marina Gardens Drive", "locality": "Singapore", "region": "Central Region", "code": "018953", "country": "SG" } ], "emails": [ { "addr": "billing+test@invopop.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox product", "price": "145.00", "unit": "one" }, "sum": "1740.00", "taxes": [ { "cat": "VAT", "key": "export", "ext": { "cef-vatex": "VATEX-EU-G", "untdid-tax-category": "G" } } ], "total": "1740.00" } ], "payment": { "terms": { "notes": "Will be paid by 2026-06-02" } }, "totals": { "sum": "1740.00", "total": "1740.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "export", "ext": { "cef-vatex": "VATEX-EU-G", "untdid-tax-category": "G" }, "base": "1740.00", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "1740.00", "payable": "1740.00" } } ``` Credit notes reverse all or part of a previously issued invoice — for returns, cancellations, or billing corrections. To create a credit note, set the `type` to `credit-note` and reference the original invoice in the `preceding` array by `series`, `code`, and `issue_date`, optionally with a `reason`. The [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) addon will automatically set the UNTDID document type to `381` (credit note) when the silo entry is built. The lines describe the amounts being credited as positive values — the credit note document type is what reverses them. A credit note can cover the full original invoice or just part of it. ```json Germany credit note theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "DE", "$addons": [ "eu-en16931-v2017" ], "type": "credit-note", "series": "CN", "code": "PP000104", "issue_date": "2025-04-10", "currency": "EUR", "preceding": [ { "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "reason": "Services not delivered" } ], "supplier": { "name": "Rheinland Technologies GmbH", "tax_id": { "country": "DE", "code": "879558966" }, "inboxes": [ { "key": "peppol", "scheme": "9930", "code": "DE879558966" } ], "addresses": [ { "num": "27", "street": "Friedrichstraße", "locality": "Berlin", "region": "BE", "code": "10117", "country": "DE" } ], "emails": [ { "addr": "rechnungen@rheinlandtech.de" } ] }, "customer": { "name": "Bavaria Solutions GmbH", "tax_id": { "country": "DE", "code": "993930191" }, "inboxes": [ { "key": "peppol", "scheme": "9930", "code": "DE993930191" } ], "addresses": [ { "num": "15", "street": "Marienplatz", "locality": "München", "region": "BY", "code": "80331", "country": "DE" } ], "emails": [ { "addr": "test@example.com" } ] }, "lines": [ { "quantity": "2", "item": { "name": "Sambox services", "price": "145.00", "unit": "one" }, "taxes": [ { "cat": "VAT", "rate": "general" } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "DE", "$addons": [ "eu-en16931-v2017" ], "type": "credit-note", "series": "CN", "code": "PP000104", "issue_date": "2025-04-10", "currency": "EUR", "preceding": [ { "type": "standard", "issue_date": "2025-04-03", "series": "INV", "code": "PP000003", "reason": "Services not delivered" } ], "tax": { "ext": { "untdid-document-type": "381" } }, "supplier": { "name": "Rheinland Technologies GmbH", "tax_id": { "country": "DE", "code": "879558966" }, "endpoints": [ { "uri": "iso6523-actorid-upis::9930:DE879558966" } ], "inboxes": [ { "key": "peppol", "scheme": "9930", "code": "DE879558966" } ], "addresses": [ { "num": "27", "street": "Friedrichstraße", "locality": "Berlin", "region": "BE", "code": "10117", "country": "DE" } ], "emails": [ { "addr": "rechnungen@rheinlandtech.de" } ] }, "customer": { "name": "Bavaria Solutions GmbH", "tax_id": { "country": "DE", "code": "993930191" }, "endpoints": [ { "uri": "iso6523-actorid-upis::9930:DE993930191" } ], "inboxes": [ { "key": "peppol", "scheme": "9930", "code": "DE993930191" } ], "addresses": [ { "num": "15", "street": "Marienplatz", "locality": "München", "region": "BY", "code": "80331", "country": "DE" } ], "emails": [ { "addr": "test@example.com" } ] }, "lines": [ { "i": 1, "quantity": "2", "item": { "name": "Sambox services", "price": "145.00", "unit": "one" }, "sum": "290.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "19%", "ext": { "untdid-tax-category": "S" } } ], "total": "290.00" } ], "totals": { "sum": "290.00", "total": "290.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "untdid-tax-category": "S" }, "base": "290.00", "percent": "19%", "amount": "55.10" } ], "amount": "55.10" } ], "sum": "55.10" }, "tax": "55.10", "total_with_tax": "345.10", "payable": "345.10" } } ``` Italy: Regular invoices are used for B2B transactions. Regular invoices must be issued when the customer is a registered business (has a tax identification number). To create a regular invoice, include the [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) and [`it-sdi-v1`](https://docs.gobl.org/addons/it-sdi-v1) addons. The addons will automatically set the document type to `380` when the silo entry is built (which happens automatically when saving a silo entry through the API or console). The `supplier` must be previously registered with the tax authority and the `customer` VAT ID must be valid. ```json Italy standard B2B invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "IT", "$addons": [ "eu-en16931-v2017", "it-sdi-v1" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "supplier": { "name": "Tecnologie Adriatico S.r.l.", "tax_id": { "country": "IT", "code": "00159560366" }, "inboxes": [ { "key": "peppol", "scheme": "0205", "code": "IT00159560366" } ], "addresses": [ { "num": "15", "street": "Via Giuseppe Verdi", "locality": "Milano", "region": "MI", "code": "20121", "country": "IT" } ], "emails": [ { "addr": "fatturazione@tecnologieadriatico.it" } ] }, "customer": { "name": "Roma Solutions S.r.l.", "tax_id": { "country": "IT", "code": "05140920017" }, "inboxes": [ { "key": "peppol", "scheme": "0205", "code": "IT05140920017" } ], "addresses": [ { "num": "10", "street": "Via del Corso", "locality": "Roma", "region": "RM", "code": "00186", "country": "IT" } ], "emails": [ { "addr": "test@example.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox services", "price": "145.00", "unit": "one" }, "sum": "1740.00", "taxes": [ { "cat": "VAT", "rate": "general" } ], "total": "1740.00" } ], "payment": { "terms": { "detail": "Will be paid by 2026-06-02" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "IT", "$addons": [ "eu-en16931-v2017", "it-sdi-v1" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "tax": { "ext": { "it-sdi-document-type": "TD01", "it-sdi-format": "FPR12", "untdid-document-type": "380" } }, "supplier": { "name": "Tecnologie Adriatico S.r.l.", "tax_id": { "country": "IT", "code": "00159560366" }, "endpoints": [ { "uri": "iso6523-actorid-upis::0205:IT00159560366" } ], "inboxes": [ { "key": "peppol", "scheme": "0205", "code": "IT00159560366" } ], "addresses": [ { "num": "15", "street": "Via Giuseppe Verdi", "locality": "Milano", "region": "MI", "code": "20121", "country": "IT" } ], "emails": [ { "addr": "fatturazione@tecnologieadriatico.it" } ], "ext": { "it-sdi-fiscal-regime": "RF01" } }, "customer": { "name": "Roma Solutions S.r.l.", "tax_id": { "country": "IT", "code": "05140920017" }, "endpoints": [ { "uri": "iso6523-actorid-upis::0205:IT05140920017" } ], "inboxes": [ { "key": "peppol", "scheme": "0205", "code": "IT05140920017" } ], "addresses": [ { "num": "10", "street": "Via del Corso", "locality": "Roma", "region": "RM", "code": "00186", "country": "IT" } ], "emails": [ { "addr": "test@example.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox services", "price": "145.00", "unit": "one" }, "sum": "1740.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "22.0%", "ext": { "untdid-tax-category": "S" } } ], "total": "1740.00" } ], "payment": { "terms": { "notes": "Will be paid by 2026-06-02" } }, "totals": { "sum": "1740.00", "total": "1740.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "untdid-tax-category": "S" }, "base": "1740.00", "percent": "22.0%", "amount": "382.80" } ], "amount": "382.80" } ], "sum": "382.80" }, "tax": "382.80", "total_with_tax": "2122.80", "payable": "2122.80" } } ``` Goods and services that are subject to VAT but taxed at a 0% rate. Zero rated goods in Italy are: * Daily and weekly newspapers, as well as periodical publications that meet a specific criteria. * Recyclable materials such as waste and scrap intended for recycling. * Educational materials under specific conditions. To create a zero-rated invoice, use the tax key `zero` in your invoice lines. Include the [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) and [`it-sdi-v1`](https://docs.gobl.org/addons/it-sdi-v1) addons to automatically set the UNTDID 5305 tax category to `Z` (zero rated goods) when the silo entry is built. With zero-rated supplies, businesses can still reclaim input VAT on their purchases, whereas with exempt supplies they cannot. ```json Italy zero rate invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "IT", "$addons": [ "eu-en16931-v2017", "it-sdi-v1" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "supplier": { "name": "Tecnologie Adriatico S.r.l.", "tax_id": { "country": "IT", "code": "00159560366" }, "inboxes": [ { "key": "peppol", "scheme": "0205", "code": "IT00159560366" } ], "addresses": [ { "num": "15", "street": "Via Giuseppe Verdi", "locality": "Milano", "region": "MI", "code": "20121", "country": "IT" } ], "emails": [ { "addr": "fatturazione@tecnologieadriatico.it" } ] }, "customer": { "name": "Roma Solutions S.r.l.", "tax_id": { "country": "IT", "code": "05140920017" }, "inboxes": [ { "key": "peppol", "scheme": "0205", "code": "IT05140920017" } ], "addresses": [ { "num": "10", "street": "Via del Corso", "locality": "Roma", "region": "RM", "code": "00186", "country": "IT" } ], "emails": [ { "addr": "test@example.com" } ] }, "lines": [ { "i": 1, "quantity": "1", "item": { "name": "La Repubblica", "price": "2.00", "unit": "one" }, "taxes": [ { "cat": "VAT", "key": "zero" } ], "total": "2.00" } ], "payment": { "terms": { "detail": "Will be paid by 2026-06-02" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "IT", "$addons": [ "eu-en16931-v2017", "it-sdi-v1" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "tax": { "ext": { "it-sdi-document-type": "TD01", "it-sdi-format": "FPR12", "untdid-document-type": "380" } }, "supplier": { "name": "Tecnologie Adriatico S.r.l.", "tax_id": { "country": "IT", "code": "00159560366" }, "endpoints": [ { "uri": "iso6523-actorid-upis::0205:IT00159560366" } ], "inboxes": [ { "key": "peppol", "scheme": "0205", "code": "IT00159560366" } ], "addresses": [ { "num": "15", "street": "Via Giuseppe Verdi", "locality": "Milano", "region": "MI", "code": "20121", "country": "IT" } ], "emails": [ { "addr": "fatturazione@tecnologieadriatico.it" } ], "ext": { "it-sdi-fiscal-regime": "RF01" } }, "customer": { "name": "Roma Solutions S.r.l.", "tax_id": { "country": "IT", "code": "05140920017" }, "endpoints": [ { "uri": "iso6523-actorid-upis::0205:IT05140920017" } ], "inboxes": [ { "key": "peppol", "scheme": "0205", "code": "IT05140920017" } ], "addresses": [ { "num": "10", "street": "Via del Corso", "locality": "Roma", "region": "RM", "code": "00186", "country": "IT" } ], "emails": [ { "addr": "test@example.com" } ] }, "lines": [ { "i": 1, "quantity": "1", "item": { "name": "La Repubblica", "price": "2.00", "unit": "one" }, "sum": "2.00", "taxes": [ { "cat": "VAT", "key": "zero", "percent": "0%", "ext": { "it-sdi-exempt": "N1", "untdid-tax-category": "Z" } } ], "total": "2.00" } ], "payment": { "terms": { "notes": "Will be paid by 2026-06-02" } }, "totals": { "sum": "2.00", "total": "2.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "zero", "ext": { "it-sdi-exempt": "N1", "untdid-tax-category": "Z" }, "base": "2.00", "percent": "0%", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "2.00", "payable": "2.00" } } ``` Exempt invoices are used for B2B transactions that are exempt from VAT, which also covers exemptions in internal operations. To create an exempt invoice, use the tax key `exempt` in your invoice lines. Include the [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) and [`it-sdi-v1`](https://docs.gobl.org/addons/it-sdi-v1) addons to automatically set the UNTDID 5305 tax category to `E` when the silo entry is built. You must also state the reason for the exemption through the [CEF VATEX](https://docs.gobl.org/catalogues/cef#cef-vatex) - VAT exemption reason codes. Exempt operations are not subject to VAT but must still be reported. The `supplier` must be previously registered with the tax authority and the `customer` tax id must be valid. ```json Italy Peppol Exempt Invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "eu-en16931-v2017", "it-sdi-v1" ], "$regime": "IT", "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "supplier": { "name": "Scuola di Lingua Italiana", "tax_id": { "country": "IT", "code": "00159560366" }, "inboxes": [ { "key": "peppol", "scheme": "0205", "code": "IT00159560366" } ], "addresses": [ { "num": "10", "street": "Via del Corso", "locality": "Roma", "region": "Milano-Capital", "code": "00186", "country": "IT" } ], "emails": [ { "addr": "fatturazione@tecnologieadriatico.it" } ] }, "customer": { "name": "Tecnologie Adriatico S.r.l.", "tax_id": { "country": "IT", "code": "00159560366" }, "inboxes": [ { "key": "peppol", "scheme": "0205", "code": "IT00159560366" } ], "addresses": [ { "num": "15", "street": "Via Giuseppe Verdi", "locality": "Milano", "region": "Milano-Capital", "code": "20121", "country": "IT" } ], "emails": [ { "addr": "fatturazione@tecnologieadriatico.it" } ] }, "lines": [ { "i": 1, "quantity": "1", "item": { "name": "Corso di Italiano - Mese", "price": "120.00", "unit": "one" }, "taxes": [ { "cat": "VAT", "key": "exempt", "ext": { "cef-vatex": "VATEX-EU-132-1I" } } ], "total": "120.00" } ], "payment": { "terms": { "detail": "Will be paid by 2026-06-02" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "IT", "$addons": [ "eu-en16931-v2017", "it-sdi-v1" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "tax": { "ext": { "it-sdi-document-type": "TD01", "it-sdi-format": "FPR12", "untdid-document-type": "380" } }, "supplier": { "name": "Scuola di Lingua Italiana", "tax_id": { "country": "IT", "code": "00159560366" }, "endpoints": [ { "uri": "iso6523-actorid-upis::0205:IT00159560366" } ], "inboxes": [ { "key": "peppol", "scheme": "0205", "code": "IT00159560366" } ], "addresses": [ { "num": "10", "street": "Via del Corso", "locality": "Roma", "region": "Milano-Capital", "code": "00186", "country": "IT" } ], "emails": [ { "addr": "fatturazione@tecnologieadriatico.it" } ], "ext": { "it-sdi-fiscal-regime": "RF01" } }, "customer": { "name": "Tecnologie Adriatico S.r.l.", "tax_id": { "country": "IT", "code": "00159560366" }, "endpoints": [ { "uri": "iso6523-actorid-upis::0205:IT00159560366" } ], "inboxes": [ { "key": "peppol", "scheme": "0205", "code": "IT00159560366" } ], "addresses": [ { "num": "15", "street": "Via Giuseppe Verdi", "locality": "Milano", "region": "Milano-Capital", "code": "20121", "country": "IT" } ], "emails": [ { "addr": "fatturazione@tecnologieadriatico.it" } ] }, "lines": [ { "i": 1, "quantity": "1", "item": { "name": "Corso di Italiano - Mese", "price": "120.00", "unit": "one" }, "sum": "120.00", "taxes": [ { "cat": "VAT", "key": "exempt", "ext": { "cef-vatex": "VATEX-EU-132-1I", "it-sdi-exempt": "N4", "untdid-tax-category": "E" } } ], "total": "120.00" } ], "payment": { "terms": { "notes": "Will be paid by 2026-06-02" } }, "totals": { "sum": "120.00", "total": "120.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "exempt", "ext": { "cef-vatex": "VATEX-EU-132-1I", "it-sdi-exempt": "N4", "untdid-tax-category": "E" }, "base": "120.00", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "120.00", "payable": "120.00" } } ``` Reverse charge invoices are used for B2B services provided to customers in other EU member states. Reverse charge must be applied when: * The customer is a registered business in another EU member state (has a valid EU VAT ID). * The service is provided to a business customer (B2B), not a consumer. * The service is subject to VAT but the customer accounts for the VAT in their own country. To create a reverse charge invoice, use the tax key `reverse-charge` in your invoice lines. Include the [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) and [`it-sdi-v1`](https://docs.gobl.org/addons/it-sdi-v1) addons to automatically set the UNTDID 5305 tax category to `AE` (reverse charge) when the silo entry is built. With reverse charge, no VAT is charged by the supplier. The customer accounts for VAT in their own country. Both `supplier` and `customer` VAT ID must be valid and registered in the EU VIES system. ```json Italy reverse charge invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "IT", "$addons": [ "eu-en16931-v2017", "it-sdi-v1" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "supplier": { "name": "Tecnologie Adriatico S.r.l.", "tax_id": { "country": "IT", "code": "00159560366" }, "inboxes": [ { "key": "peppol", "scheme": "0205", "code": "IT00159560366" } ], "addresses": [ { "num": "15", "street": "Via Giuseppe Verdi", "locality": "Milano", "region": "Milano-Capital", "code": "20121", "country": "IT" } ], "emails": [ { "addr": "fatturazione@tecnologieadriatico.it" } ] }, "customer": { "name": "Invopop SL", "tax_id": { "country": "ES", "code": "B85905495" }, "inboxes": [ { "key": "peppol", "scheme": "9920", "code": "ESB85905495" } ], "addresses": [ { "street": "Calle Pradillo 42", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing+test@invopop.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox services", "price": "145.00", "unit": "one" }, "sum": "1740.00", "taxes": [ { "cat": "VAT", "key": "reverse-charge", "ext": { "cef-vatex": "VATEX-EU-AE" } } ], "total": "1740.00" } ], "payment": { "terms": { "detail": "Will be paid by 2026-06-02" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "IT", "$addons": [ "eu-en16931-v2017", "it-sdi-v1" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "tax": { "ext": { "it-sdi-document-type": "TD01", "it-sdi-format": "FPR12", "untdid-document-type": "380" } }, "supplier": { "name": "Tecnologie Adriatico S.r.l.", "tax_id": { "country": "IT", "code": "00159560366" }, "endpoints": [ { "uri": "iso6523-actorid-upis::0205:IT00159560366" } ], "inboxes": [ { "key": "peppol", "scheme": "0205", "code": "IT00159560366" } ], "addresses": [ { "num": "15", "street": "Via Giuseppe Verdi", "locality": "Milano", "region": "Milano-Capital", "code": "20121", "country": "IT" } ], "emails": [ { "addr": "fatturazione@tecnologieadriatico.it" } ], "ext": { "it-sdi-fiscal-regime": "RF01" } }, "customer": { "name": "Invopop SL", "tax_id": { "country": "ES", "code": "B85905495" }, "endpoints": [ { "uri": "iso6523-actorid-upis::9920:ESB85905495" } ], "inboxes": [ { "key": "peppol", "scheme": "9920", "code": "ESB85905495" } ], "addresses": [ { "street": "Calle Pradillo 42", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing+test@invopop.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox services", "price": "145.00", "unit": "one" }, "sum": "1740.00", "taxes": [ { "cat": "VAT", "key": "reverse-charge", "ext": { "cef-vatex": "VATEX-EU-AE", "it-sdi-exempt": "N6.9", "untdid-tax-category": "AE" } } ], "total": "1740.00" } ], "payment": { "terms": { "notes": "Will be paid by 2026-06-02" } }, "totals": { "sum": "1740.00", "total": "1740.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "reverse-charge", "ext": { "cef-vatex": "VATEX-EU-AE", "it-sdi-exempt": "N6.9", "untdid-tax-category": "AE" }, "base": "1740.00", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "1740.00", "payable": "1740.00" } } ``` Intra-community supply invoices are used for B2B goods delivered to customers in other EU member states. Intra-community supplies must be applied when: * The customer is a registered business in another EU member state (has a valid EU VAT ID). * Goods are physically delivered to another EU member state. * The supply is exempt from VAT in the origin country and subject to VAT in the destination country. To create an intra-community supply Peppol invoice, use the tax key `intra-community` in your invoice lines. Include the [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) and [`it-sdi-v1`](https://docs.gobl.org/addons/it-sdi-v1) addons to automatically set the UNTDID 5305 tax category to `K` (VAT exempt for EEA intra-community supply of goods and services) when the silo entry is built. With intra-community supplies in the EU, the customer accounts for VAT in their destination country. The `supplier` must be previously registered with the tax authority and the `customer` VAT ID must be valid and registered in the EU VIES system. ```json Italy intra-community invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "IT", "$addons": [ "eu-en16931-v2017", "it-sdi-v1" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "supplier": { "name": "Tecnologie Adriatico S.r.l.", "tax_id": { "country": "IT", "code": "00159560366" }, "inboxes": [ { "key": "peppol", "scheme": "0205", "code": "IT00159560366" } ], "addresses": [ { "num": "15", "street": "Via Giuseppe Verdi", "locality": "Milano", "region": "Milano-Capital", "code": "20121", "country": "IT" } ], "emails": [ { "addr": "fatturazione@tecnologieadriatico.it" } ] }, "customer": { "name": "Invopop SL", "tax_id": { "country": "ES", "code": "B85905495" }, "inboxes": [ { "key": "peppol", "scheme": "9920", "code": "ESB85905495" } ], "addresses": [ { "street": "Calle Pradillo 42", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing+test@invopop.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox product", "price": "145.00", "unit": "one" }, "sum": "1740.00", "taxes": [ { "cat": "VAT", "key": "intra-community", "ext": { "cef-vatex": "VATEX-EU-IC" } } ], "total": "1740.00" } ], "payment": { "terms": { "detail": "Will be paid by 2026-06-02" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "IT", "$addons": [ "eu-en16931-v2017", "it-sdi-v1" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "tax": { "ext": { "it-sdi-document-type": "TD01", "it-sdi-format": "FPR12", "untdid-document-type": "380" } }, "supplier": { "name": "Tecnologie Adriatico S.r.l.", "tax_id": { "country": "IT", "code": "00159560366" }, "endpoints": [ { "uri": "iso6523-actorid-upis::0205:IT00159560366" } ], "inboxes": [ { "key": "peppol", "scheme": "0205", "code": "IT00159560366" } ], "addresses": [ { "num": "15", "street": "Via Giuseppe Verdi", "locality": "Milano", "region": "Milano-Capital", "code": "20121", "country": "IT" } ], "emails": [ { "addr": "fatturazione@tecnologieadriatico.it" } ], "ext": { "it-sdi-fiscal-regime": "RF01" } }, "customer": { "name": "Invopop SL", "tax_id": { "country": "ES", "code": "B85905495" }, "endpoints": [ { "uri": "iso6523-actorid-upis::9920:ESB85905495" } ], "inboxes": [ { "key": "peppol", "scheme": "9920", "code": "ESB85905495" } ], "addresses": [ { "street": "Calle Pradillo 42", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing+test@invopop.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox product", "price": "145.00", "unit": "one" }, "sum": "1740.00", "taxes": [ { "cat": "VAT", "key": "intra-community", "ext": { "cef-vatex": "VATEX-EU-IC", "it-sdi-exempt": "N3.2", "untdid-tax-category": "K" } } ], "total": "1740.00" } ], "payment": { "terms": { "notes": "Will be paid by 2026-06-02" } }, "totals": { "sum": "1740.00", "total": "1740.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "intra-community", "ext": { "cef-vatex": "VATEX-EU-IC", "it-sdi-exempt": "N3.2", "untdid-tax-category": "K" }, "base": "1740.00", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "1740.00", "payable": "1740.00" } } ``` Outside scope invoices are used for B2B services provided to customers outside the EU. To create an outside scope Peppol invoice, use the tax key `outside-scope` in your invoice lines. Include the [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) and [`it-sdi-v1`](https://docs.gobl.org/addons/it-sdi-v1) addons to automatically set the UNTDID 5305 tax category to `O` (Services outside scope of tax) when the silo entry is built. Services provided to non-EU customers are generally outside the scope of EU VAT. ```json Italy outside scope theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "IT", "$addons": [ "eu-en16931-v2017", "it-sdi-v1" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "supplier": { "name": "Tecnologie Adriatico S.r.l.", "tax_id": { "country": "IT", "code": "00159560366" }, "inboxes": [ { "key": "peppol", "scheme": "0205", "code": "IT00159560366" } ], "addresses": [ { "num": "15", "street": "Via Giuseppe Verdi", "locality": "Milano", "region": "Milano-Capital", "code": "20121", "country": "IT" } ], "emails": [ { "addr": "fatturazione@tecnologieadriatico.it" } ] }, "customer": { "name": "Singapore Company LTD", "tax_id": { "country": "SG", "code": "199904785Z" }, "inboxes": [ { "key": "peppol", "scheme": "0195", "code": "SGUEN199904785Z" } ], "addresses": [ { "street": "18 Marina Gardens Drive", "locality": "Singapore", "region": "Central Region", "code": "018953", "country": "SG" } ], "emails": [ { "addr": "billing+test@invopop.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox service", "price": "145.00", "unit": "h" }, "sum": "145.00", "taxes": [ { "cat": "VAT", "key": "outside-scope", "ext": { "cef-vatex": "VATEX-EU-O" } } ], "total": "145.00" } ], "payment": { "terms": { "detail": "Will be paid by 2026-06-02" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "IT", "$addons": [ "eu-en16931-v2017", "it-sdi-v1" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "tax": { "ext": { "it-sdi-document-type": "TD01", "it-sdi-format": "FPR12", "untdid-document-type": "380" } }, "supplier": { "name": "Tecnologie Adriatico S.r.l.", "tax_id": { "country": "IT", "code": "00159560366" }, "endpoints": [ { "uri": "iso6523-actorid-upis::0205:IT00159560366" } ], "inboxes": [ { "key": "peppol", "scheme": "0205", "code": "IT00159560366" } ], "addresses": [ { "num": "15", "street": "Via Giuseppe Verdi", "locality": "Milano", "region": "Milano-Capital", "code": "20121", "country": "IT" } ], "emails": [ { "addr": "fatturazione@tecnologieadriatico.it" } ], "ext": { "it-sdi-fiscal-regime": "RF01" } }, "customer": { "name": "Singapore Company LTD", "tax_id": { "country": "SG", "code": "199904785Z" }, "endpoints": [ { "uri": "iso6523-actorid-upis::0195:SGUEN199904785Z" } ], "inboxes": [ { "key": "peppol", "scheme": "0195", "code": "SGUEN199904785Z" } ], "addresses": [ { "street": "18 Marina Gardens Drive", "locality": "Singapore", "region": "Central Region", "code": "018953", "country": "SG" } ], "emails": [ { "addr": "billing+test@invopop.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox service", "price": "145.00", "unit": "h" }, "sum": "1740.00", "taxes": [ { "cat": "VAT", "key": "outside-scope", "ext": { "cef-vatex": "VATEX-EU-O", "it-sdi-exempt": "N2.1", "untdid-tax-category": "O" } } ], "total": "1740.00" } ], "payment": { "terms": { "notes": "Will be paid by 2026-06-02" } }, "totals": { "sum": "1740.00", "total": "1740.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "outside-scope", "ext": { "cef-vatex": "VATEX-EU-O", "it-sdi-exempt": "N2.1", "untdid-tax-category": "O" }, "base": "1740.00", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "1740.00", "payable": "1740.00" } } ``` Export invoices are used for B2B goods delivered to customers outside the EU. To create an export Peppol invoice, use the tax key `export` in your invoice lines. Include the [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) and [`it-sdi-v1`](https://docs.gobl.org/addons/it-sdi-v1) addons to automatically set the UNTDID 5305 tax category to `G` (Free export item, tax not charged) when the silo entry is built. Exported goods are exempt from VAT. The `supplier` must be previously registered with the tax authority. Customer tax identification is optional but recommended for record-keeping purposes. ```json Italy export invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "IT", "$addons": [ "eu-en16931-v2017", "it-sdi-v1" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "supplier": { "name": "Tecnologie Adriatico S.r.l.", "tax_id": { "country": "IT", "code": "00159560366" }, "inboxes": [ { "key": "peppol", "scheme": "0205", "code": "IT00159560366" } ], "addresses": [ { "num": "15", "street": "Via Giuseppe Verdi", "locality": "Milano", "region": "Milano-Capital", "code": "20121", "country": "IT" } ], "emails": [ { "addr": "fatturazione@tecnologieadriatico.it" } ] }, "customer": { "name": "Singapore Company LTD", "tax_id": { "country": "SG", "code": "199904785Z" }, "inboxes": [ { "key": "peppol", "scheme": "0195", "code": "SGUEN199904785Z" } ], "addresses": [ { "street": "18 Marina Gardens Drive", "locality": "Singapore", "region": "Central Region", "code": "018953", "country": "SG" } ], "emails": [ { "addr": "billing+test@invopop.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox product", "price": "145.00", "unit": "one" }, "sum": "145.00", "taxes": [ { "cat": "VAT", "key": "export", "ext": { "cef-vatex": "VATEX-EU-G" } } ], "total": "145.00" } ], "payment": { "terms": { "detail": "Will be paid by 2026-06-02" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "IT", "$addons": [ "eu-en16931-v2017", "it-sdi-v1" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "tax": { "ext": { "it-sdi-document-type": "TD01", "it-sdi-format": "FPR12", "untdid-document-type": "380" } }, "supplier": { "name": "Tecnologie Adriatico S.r.l.", "tax_id": { "country": "IT", "code": "00159560366" }, "endpoints": [ { "uri": "iso6523-actorid-upis::0205:IT00159560366" } ], "inboxes": [ { "key": "peppol", "scheme": "0205", "code": "IT00159560366" } ], "addresses": [ { "num": "15", "street": "Via Giuseppe Verdi", "locality": "Milano", "region": "Milano-Capital", "code": "20121", "country": "IT" } ], "emails": [ { "addr": "fatturazione@tecnologieadriatico.it" } ], "ext": { "it-sdi-fiscal-regime": "RF01" } }, "customer": { "name": "Singapore Company LTD", "tax_id": { "country": "SG", "code": "199904785Z" }, "endpoints": [ { "uri": "iso6523-actorid-upis::0195:SGUEN199904785Z" } ], "inboxes": [ { "key": "peppol", "scheme": "0195", "code": "SGUEN199904785Z" } ], "addresses": [ { "street": "18 Marina Gardens Drive", "locality": "Singapore", "region": "Central Region", "code": "018953", "country": "SG" } ], "emails": [ { "addr": "billing+test@invopop.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox product", "price": "145.00", "unit": "one" }, "sum": "1740.00", "taxes": [ { "cat": "VAT", "key": "export", "ext": { "cef-vatex": "VATEX-EU-G", "it-sdi-exempt": "N3.1", "untdid-tax-category": "G" } } ], "total": "1740.00" } ], "payment": { "terms": { "notes": "Will be paid by 2026-06-02" } }, "totals": { "sum": "1740.00", "total": "1740.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "export", "ext": { "cef-vatex": "VATEX-EU-G", "it-sdi-exempt": "N3.1", "untdid-tax-category": "G" }, "base": "1740.00", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "1740.00", "payable": "1740.00" } } ``` Spain: Regular invoices are used for B2B transactions. Regular invoices must be issued when: * The customer is a registered business (has a tax identification number). * The transaction amount is €400 VAT included or above, or the customer requires a full invoice. * The customer needs a complete invoice with all tax details for accounting or tax purposes. To create a regular invoice, include the [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) and [`es-verifactu-v1`](https://docs.gobl.org/addons/es-verifactu-v1) addons and ensure the `customer` field contains valid tax identification details. The addons will automatically set the document type to `380` when the silo entry is built (which happens automatically when saving a silo entry through the API or console). The `supplier` must be [previously registered](https://docs.invopop.com/guides/es-verifactu-supplier#create-a-supplier-entry) with the tax authority and the `customer` VAT ID must be valid. ```json Spain standard B2B invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "eu-en16931-v2017", "es-verifactu-v1" ], "$regime": "ES", "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "inboxes": [ { "key": "peppol", "scheme": "9920", "code": "ESB85905495" } ], "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Barcelona Commerce S.L.", "tax_id": { "country": "ES", "code": "B48994131" }, "inboxes": [ { "key": "peppol", "scheme": "9920", "code": "ESB48994131" } ], "addresses": [ { "num": "20", "street": "Passeig de Gràcia", "locality": "Barcelona", "region": "Cataluña", "code": "08008", "country": "ES" } ], "emails": [ { "addr": "test@example.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox services", "price": "145.00", "unit": "one" }, "sum": "1740.00", "taxes": [ { "cat": "VAT", "rate": "general" } ], "total": "1740.00" } ], "payment": { "terms": { "detail": "Will be paid by 2026-06-02" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "eu-en16931-v2017", "es-verifactu-v1" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "tax": { "ext": { "es-verifactu-doc-type": "F1", "untdid-document-type": "380" } }, "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "endpoints": [ { "uri": "iso6523-actorid-upis::9920:ESB85905495" } ], "inboxes": [ { "key": "peppol", "scheme": "9920", "code": "ESB85905495" } ], "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Barcelona Commerce S.L.", "tax_id": { "country": "ES", "code": "B48994131" }, "endpoints": [ { "uri": "iso6523-actorid-upis::9920:ESB48994131" } ], "inboxes": [ { "key": "peppol", "scheme": "9920", "code": "ESB48994131" } ], "addresses": [ { "num": "20", "street": "Passeig de Gràcia", "locality": "Barcelona", "region": "Cataluña", "code": "08008", "country": "ES" } ], "emails": [ { "addr": "test@example.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox services", "price": "145.00", "unit": "one" }, "sum": "1740.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "21.0%", "ext": { "es-verifactu-op-class": "S1", "es-verifactu-regime": "01", "untdid-tax-category": "S" } } ], "total": "1740.00" } ], "payment": { "terms": { "notes": "Will be paid by 2026-06-02" } }, "totals": { "sum": "1740.00", "total": "1740.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "es-verifactu-op-class": "S1", "es-verifactu-regime": "01", "untdid-tax-category": "S" }, "base": "1740.00", "percent": "21.0%", "amount": "365.40" } ], "amount": "365.40" } ], "sum": "365.40" }, "tax": "365.40", "total_with_tax": "2105.40", "payable": "2105.40" } } ``` Zero-rated invoices are used for goods and services that are subject to VAT but taxed at a 0% rate. To create a zero-rated invoice, use the tax key `zero` in your invoice lines. The [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) and [`es-verifactu-v1`](https://docs.gobl.org/addons/es-verifactu-v1) addons will automatically set the UNTDID 5305 tax category to `Z` (zero rated goods) when the silo entry is built. With zero-rated supplies, businesses can still reclaim input VAT on their purchases, whereas with exempt supplies they cannot. ```json Spain zero rate invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "eu-en16931-v2017", "es-verifactu-v1" ], "$regime": "ES", "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "inboxes": [ { "key": "peppol", "scheme": "9920", "code": "ESB85905495" } ], "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Barcelona Commerce S.L.", "tax_id": { "country": "ES", "code": "B03176864" }, "inboxes": [ { "key": "peppol", "scheme": "9920", "code": "ESB03176864" } ], "addresses": [ { "num": "20", "street": "Passeig de Gràcia", "locality": "Barcelona", "region": "Cataluña", "code": "08008", "country": "ES" } ], "emails": [ { "addr": "test@example.com" } ] }, "lines": [ { "i": 1, "quantity": "1", "item": { "name": "El País", "price": "2.00", "unit": "one" }, "taxes": [ { "cat": "VAT", "key": "zero" } ], "total": "2.00" } ], "payment": { "terms": { "detail": "Will be paid by 2026-06-02" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "eu-en16931-v2017", "es-verifactu-v1" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "tax": { "ext": { "es-verifactu-doc-type": "F1", "untdid-document-type": "380" } }, "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "endpoints": [ { "uri": "iso6523-actorid-upis::9920:ESB85905495" } ], "inboxes": [ { "key": "peppol", "scheme": "9920", "code": "ESB85905495" } ], "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Barcelona Commerce S.L.", "tax_id": { "country": "ES", "code": "B03176864" }, "endpoints": [ { "uri": "iso6523-actorid-upis::9920:ESB03176864" } ], "inboxes": [ { "key": "peppol", "scheme": "9920", "code": "ESB03176864" } ], "addresses": [ { "num": "20", "street": "Passeig de Gràcia", "locality": "Barcelona", "region": "Cataluña", "code": "08008", "country": "ES" } ], "emails": [ { "addr": "test@example.com" } ] }, "lines": [ { "i": 1, "quantity": "1", "item": { "name": "El País", "price": "2.00", "unit": "one" }, "sum": "2.00", "taxes": [ { "cat": "VAT", "key": "zero", "percent": "0%", "ext": { "es-verifactu-op-class": "S1", "es-verifactu-regime": "01", "untdid-tax-category": "Z" } } ], "total": "2.00" } ], "payment": { "terms": { "notes": "Will be paid by 2026-06-02" } }, "totals": { "sum": "2.00", "total": "2.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "zero", "ext": { "es-verifactu-op-class": "S1", "es-verifactu-regime": "01", "untdid-tax-category": "Z" }, "base": "2.00", "percent": "0%", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "2.00", "payable": "2.00" } } ``` Exempt invoices are used for B2B transactions that are exempt from VAT, which also covers exemptions in internal operations. To create an exempt invoice, use the tax key `exempt` in your invoice lines. The [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) and [`es-verifactu-v1`](https://docs.gobl.org/addons/es-verifactu-v1) addons will automatically set the UNTDID 5305 tax category to `E` when the silo entry is built. You must also state the reason for the exemption through the [CEF VATEX](https://docs.gobl.org/catalogues/cef#cef-vatex) - VAT exemption reason codes. Exempt operations are not subject to VAT but must still be reported. The `supplier` must be previously registered with the tax authority and the `customer` tax id must be valid. ```json Spain Peppol Exempt Invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "eu-en16931-v2017", "es-verifactu-v1" ], "$regime": "ES", "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "supplier": { "name": "Escuela de Lengua Española", "tax_id": { "country": "ES", "code": "B71353213" }, "inboxes": [ { "key": "peppol", "scheme": "9920", "code": "ESB71353213" } ], "addresses": [ { "num": "20", "street": "Passeig de Gràcia", "locality": "Barcelona", "region": "Madrid-Capital", "code": "08008", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "inboxes": [ { "key": "peppol", "scheme": "9920", "code": "ESB85905495" } ], "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid-Capital", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "lines": [ { "i": 1, "quantity": "1", "item": { "name": "Curso de Español - Mes", "price": "120.00", "unit": "one" }, "taxes": [ { "cat": "VAT", "key": "exempt", "ext": { "cef-vatex": "VATEX-EU-132-1I" } } ], "total": "120.00" } ], "payment": { "terms": { "detail": "Will be paid by 2026-06-02" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "eu-en16931-v2017", "es-verifactu-v1" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "tax": { "ext": { "es-verifactu-doc-type": "F1", "untdid-document-type": "380" } }, "supplier": { "name": "Escuela de Lengua Española", "tax_id": { "country": "ES", "code": "B71353213" }, "endpoints": [ { "uri": "iso6523-actorid-upis::9920:ESB71353213" } ], "inboxes": [ { "key": "peppol", "scheme": "9920", "code": "ESB71353213" } ], "addresses": [ { "num": "20", "street": "Passeig de Gràcia", "locality": "Barcelona", "region": "Madrid-Capital", "code": "08008", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "endpoints": [ { "uri": "iso6523-actorid-upis::9920:ESB85905495" } ], "inboxes": [ { "key": "peppol", "scheme": "9920", "code": "ESB85905495" } ], "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid-Capital", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "lines": [ { "i": 1, "quantity": "1", "item": { "name": "Curso de Español - Mes", "price": "120.00", "unit": "one" }, "sum": "120.00", "taxes": [ { "cat": "VAT", "key": "exempt", "ext": { "cef-vatex": "VATEX-EU-132-1I", "es-verifactu-exempt": "E1", "es-verifactu-regime": "01", "untdid-tax-category": "E" } } ], "total": "120.00" } ], "payment": { "terms": { "notes": "Will be paid by 2026-06-02" } }, "totals": { "sum": "120.00", "total": "120.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "exempt", "ext": { "cef-vatex": "VATEX-EU-132-1I", "es-verifactu-exempt": "E1", "es-verifactu-regime": "01", "untdid-tax-category": "E" }, "base": "120.00", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "120.00", "payable": "120.00" } } ``` Reverse charge invoices are used for B2B services provided to customers in other EU member states. Reverse charge must be applied when: * The customer is a registered business in another EU member state (has a valid EU VAT ID). * The service is provided to a business customer (B2B), not a consumer. * The service is subject to VAT but the customer accounts for the VAT in their own country. To create a reverse charge invoice, use the tax key `reverse-charge` in your invoice lines. The [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) and [`es-verifactu-v1`](https://docs.gobl.org/addons/es-verifactu-v1) addons will automatically set the UNTDID 5305 tax category to `AE` (reverse charge) when the silo entry is built. With reverse charge, no VAT is charged by the supplier. The customer accounts for VAT in their own country. Both `supplier` and `customer` VAT ID must be valid and registered in the EU VIES system. ```json Spain reverse charge invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "eu-en16931-v2017", "es-verifactu-v1" ], "$regime": "ES", "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "inboxes": [ { "key": "peppol", "scheme": "9920", "code": "ESB85905495" } ], "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid-Capital", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Benelux Industries SA/NV", "tax_id": { "country": "BE", "code": "0316597904" }, "inboxes": [ { "key": "peppol", "scheme": "0208", "code": "0316597904" } ], "addresses": [ { "num": "42", "street": "Rue de la Loi", "locality": "Brussels", "region": "Brussels-Capital", "code": "1040", "country": "BE" } ], "emails": [ { "addr": "test@example.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox services", "price": "145.00", "unit": "one" }, "sum": "1740.00", "taxes": [ { "cat": "VAT", "key": "reverse-charge", "ext": { "cef-vatex": "VATEX-EU-AE" } } ], "total": "1740.00" } ], "payment": { "terms": { "detail": "Will be paid by 2026-06-02" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "eu-en16931-v2017", "es-verifactu-v1" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "tax": { "ext": { "es-verifactu-doc-type": "F1", "untdid-document-type": "380" } }, "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "endpoints": [ { "uri": "iso6523-actorid-upis::9920:ESB85905495" } ], "inboxes": [ { "key": "peppol", "scheme": "9920", "code": "ESB85905495" } ], "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid-Capital", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Benelux Industries SA/NV", "tax_id": { "country": "BE", "code": "0316597904" }, "endpoints": [ { "uri": "iso6523-actorid-upis::0208:0316597904" } ], "inboxes": [ { "key": "peppol", "scheme": "0208", "code": "0316597904" } ], "addresses": [ { "num": "42", "street": "Rue de la Loi", "locality": "Brussels", "region": "Brussels-Capital", "code": "1040", "country": "BE" } ], "emails": [ { "addr": "test@example.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox services", "price": "145.00", "unit": "one" }, "sum": "1740.00", "taxes": [ { "cat": "VAT", "key": "reverse-charge", "ext": { "cef-vatex": "VATEX-EU-AE", "es-verifactu-op-class": "S2", "es-verifactu-regime": "01", "untdid-tax-category": "AE" } } ], "total": "1740.00" } ], "payment": { "terms": { "notes": "Will be paid by 2026-06-02" } }, "totals": { "sum": "1740.00", "total": "1740.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "reverse-charge", "ext": { "cef-vatex": "VATEX-EU-AE", "es-verifactu-op-class": "S2", "es-verifactu-regime": "01", "untdid-tax-category": "AE" }, "base": "1740.00", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "1740.00", "payable": "1740.00" } } ``` Intra-community supply invoices are used for B2B goods delivered to customers in other EU member states. Intra-community supplies must be applied when: * The customer is a registered business in another EU member state (has a valid EU VAT ID). * Goods are physically delivered to another EU member state. * The supply is exempt from VAT in the origin country and subject to VAT in the destination country. To create an intra-community supply Peppol invoice, use the tax key `intra-community` in your invoice lines. The [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) and [`es-verifactu-v1`](https://docs.gobl.org/addons/es-verifactu-v1) addons will automatically set the UNTDID 5305 tax category to `K` (VAT exempt for EEA intra-community supply of goods and services) when the silo entry is built. With intra-community supplies in the EU, the customer accounts for VAT in their destination country. The `supplier` must be [previously registered](https://docs.invopop.com/guides/es-verifactu-supplier#create-a-supplier-entry) with the tax authority and the `customer` VAT ID must be valid and registered in the EU VIES system. ```json Spain intra-community invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "eu-en16931-v2017", "es-verifactu-v1" ], "$regime": "ES", "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "inboxes": [ { "key": "peppol", "scheme": "9920", "code": "ESB85905495" } ], "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid-Capital", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Benelux Industries SA/NV", "tax_id": { "country": "BE", "code": "0316597904" }, "inboxes": [ { "key": "peppol", "scheme": "0208", "code": "0316597904" } ], "addresses": [ { "num": "42", "street": "Rue de la Loi", "locality": "Brussels", "region": "Brussels-Capital", "code": "1040", "country": "BE" } ], "emails": [ { "addr": "test@example.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox product", "price": "145.00", "unit": "one" }, "sum": "1740.00", "taxes": [ { "cat": "VAT", "key": "intra-community", "ext": { "cef-vatex": "VATEX-EU-IC" } } ], "total": "1740.00" } ], "payment": { "terms": { "detail": "Will be paid by 2026-06-02" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "eu-en16931-v2017", "es-verifactu-v1" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "tax": { "ext": { "es-verifactu-doc-type": "F1", "untdid-document-type": "380" } }, "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "endpoints": [ { "uri": "iso6523-actorid-upis::9920:ESB85905495" } ], "inboxes": [ { "key": "peppol", "scheme": "9920", "code": "ESB85905495" } ], "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid-Capital", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Benelux Industries SA/NV", "tax_id": { "country": "BE", "code": "0316597904" }, "endpoints": [ { "uri": "iso6523-actorid-upis::0208:0316597904" } ], "inboxes": [ { "key": "peppol", "scheme": "0208", "code": "0316597904" } ], "addresses": [ { "num": "42", "street": "Rue de la Loi", "locality": "Brussels", "region": "Brussels-Capital", "code": "1040", "country": "BE" } ], "emails": [ { "addr": "test@example.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox product", "price": "145.00", "unit": "one" }, "sum": "1740.00", "taxes": [ { "cat": "VAT", "key": "intra-community", "ext": { "cef-vatex": "VATEX-EU-IC", "es-verifactu-exempt": "E5", "es-verifactu-regime": "01", "untdid-tax-category": "K" } } ], "total": "1740.00" } ], "payment": { "terms": { "notes": "Will be paid by 2026-06-02" } }, "totals": { "sum": "1740.00", "total": "1740.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "intra-community", "ext": { "cef-vatex": "VATEX-EU-IC", "es-verifactu-exempt": "E5", "es-verifactu-regime": "01", "untdid-tax-category": "K" }, "base": "1740.00", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "1740.00", "payable": "1740.00" } } ``` Outside scope invoices are used for B2B services provided to customers outside the EU. To create an outside scope Peppol invoice, use the tax key `outside-scope` in your invoice lines. The [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) and [`es-verifactu-v1`](https://docs.gobl.org/addons/es-verifactu-v1) addons will automatically set the UNTDID 5305 tax category to `O` (Services outside scope of tax) when the silo entry is built. Services provided to non-EU customers are generally outside the scope of EU VAT. ```json Spain outside scope theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "eu-en16931-v2017" ], "$regime": "ES", "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "inboxes": [ { "key": "peppol", "scheme": "9920", "code": "ESB85905495" } ], "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid-Capital", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Singapore Company LTD", "tax_id": { "country": "SG", "code": "199904785Z" }, "inboxes": [ { "key": "peppol", "scheme": "0195", "code": "SGUEN199904785Z" } ], "addresses": [ { "street": "18 Marina Gardens Drive", "locality": "Singapore", "region": "Central Region", "code": "018953", "country": "SG" } ], "emails": [ { "addr": "billing+test@invopop.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox service", "price": "145.00", "unit": "h" }, "sum": "145.00", "taxes": [ { "cat": "VAT", "key": "outside-scope", "ext": { "cef-vatex": "VATEX-EU-O" } } ], "total": "145.00" } ], "payment": { "terms": { "detail": "Will be paid by 2026-06-02" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "eu-en16931-v2017" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "tax": { "ext": { "untdid-document-type": "380" } }, "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "endpoints": [ { "uri": "iso6523-actorid-upis::9920:ESB85905495" } ], "inboxes": [ { "key": "peppol", "scheme": "9920", "code": "ESB85905495" } ], "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid-Capital", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Singapore Company LTD", "tax_id": { "country": "SG", "code": "199904785Z" }, "endpoints": [ { "uri": "iso6523-actorid-upis::0195:SGUEN199904785Z" } ], "inboxes": [ { "key": "peppol", "scheme": "0195", "code": "SGUEN199904785Z" } ], "addresses": [ { "street": "18 Marina Gardens Drive", "locality": "Singapore", "region": "Central Region", "code": "018953", "country": "SG" } ], "emails": [ { "addr": "billing+test@invopop.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox service", "price": "145.00", "unit": "h" }, "sum": "1740.00", "taxes": [ { "cat": "VAT", "key": "outside-scope", "ext": { "cef-vatex": "VATEX-EU-O", "untdid-tax-category": "O" } } ], "total": "1740.00" } ], "payment": { "terms": { "notes": "Will be paid by 2026-06-02" } }, "totals": { "sum": "1740.00", "total": "1740.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "outside-scope", "ext": { "cef-vatex": "VATEX-EU-O", "untdid-tax-category": "O" }, "base": "1740.00", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "1740.00", "payable": "1740.00" } } ``` Export invoices are used for B2B goods delivered to customers outside the EU. To create an export Peppol invoice, use the tax key `export` in your invoice lines. The [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) and [`es-verifactu-v1`](https://docs.gobl.org/addons/es-verifactu-v1) addons will automatically set the UNTDID 5305 tax category to `G` (Free export item, tax not charged) when the silo entry is built. Exported goods are exempt from VAT. The `supplier` must be previously registered with the tax authority. Customer tax identification is optional but recommended for record-keeping purposes. ```json Spain export invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "eu-en16931-v2017" ], "$regime": "ES", "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B71353213" }, "inboxes": [ { "key": "peppol", "scheme": "9920", "code": "ESB71353213" } ], "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid-Capital", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Singapore Company LTD", "tax_id": { "country": "SG", "code": "199904785Z" }, "inboxes": [ { "key": "peppol", "scheme": "0195", "code": "SGUEN199904785Z" } ], "addresses": [ { "street": "18 Marina Gardens Drive", "locality": "Singapore", "region": "Central Region", "code": "018953", "country": "SG" } ], "emails": [ { "addr": "billing+test@invopop.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox product", "price": "145.00", "unit": "one" }, "sum": "145.00", "taxes": [ { "cat": "VAT", "key": "export", "ext": { "cef-vatex": "VATEX-EU-G" } } ], "total": "145.00" } ], "payment": { "terms": { "detail": "Will be paid by 2026-06-02" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "eu-en16931-v2017" ], "type": "standard", "series": "INV", "code": "PP000003", "issue_date": "2025-04-03", "currency": "EUR", "tax": { "ext": { "untdid-document-type": "380" } }, "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B71353213" }, "endpoints": [ { "uri": "iso6523-actorid-upis::9920:ESB71353213" } ], "inboxes": [ { "key": "peppol", "scheme": "9920", "code": "ESB71353213" } ], "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid-Capital", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Singapore Company LTD", "tax_id": { "country": "SG", "code": "199904785Z" }, "endpoints": [ { "uri": "iso6523-actorid-upis::0195:SGUEN199904785Z" } ], "inboxes": [ { "key": "peppol", "scheme": "0195", "code": "SGUEN199904785Z" } ], "addresses": [ { "street": "18 Marina Gardens Drive", "locality": "Singapore", "region": "Central Region", "code": "018953", "country": "SG" } ], "emails": [ { "addr": "billing+test@invopop.com" } ] }, "lines": [ { "i": 1, "quantity": "12", "item": { "name": "Sambox product", "price": "145.00", "unit": "one" }, "sum": "1740.00", "taxes": [ { "cat": "VAT", "key": "export", "ext": { "cef-vatex": "VATEX-EU-G", "untdid-tax-category": "G" } } ], "total": "1740.00" } ], "payment": { "terms": { "notes": "Will be paid by 2026-06-02" } }, "totals": { "sum": "1740.00", "total": "1740.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "export", "ext": { "cef-vatex": "VATEX-EU-G", "untdid-tax-category": "G" }, "base": "1740.00", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "1740.00", "payable": "1740.00" } } ```
*** Ask and answer questions about Peppol App → # Poland Source: https://docs.invopop.com/apps/poland Register suppliers and issue FA(3) invoices through Poland's KSeF 2.0 system.
Supplier registration guide › Issuing guide ›
| | | | --------- | ------------------------------ | | Developer | [Invopop](https://invopop.com) | | Category | Government | | Scope | B2B | | Country | [Poland](/compliance/poland) |
[KSeF](https://www.gov.pl/web/finanse) (Krajowy System e-Faktur) 2.0 is Poland's mandatory national e-invoicing system operated by the [Ministry of Finance](https://www.gov.pl/web/finanse). The system uses the FA(3) XML schema format for structured invoice data and provides real-time clearance for all B2B invoices. Electronic invoicing in Poland operates on a clearance model whereby every invoice must be validated against the FA(3) schema and business rules in real-time. Validated invoices receive a unique KSeF ID and official timestamp. The platform provides secure archiving for issued and received e-invoices. Invoices are encoded in FA(3), a strict XML format published and maintained by Polish tax authorities. The schema enforces standardized fields for both domestic and cross-border transactions, including buyer/seller data, VAT details, and item lines. **Key features** * **Party registration:** Register suppliers in the KSeF system with their Polish Tax ID (NIP). * **API certificate upload:** Upload KSeF certificates, private keys, and passwords programmatically via API for automated integration. * **Workflow automation:** Automated workflows for registering parties, issuing invoices, and importing received invoices through the KSeF 2.0 system. * **Real-time validation:** Every invoice is validated in real-time against the FA(3) schema and business rules, ensuring compliance with Polish e-invoicing regulations. * **Invoice import & sync:** Automatically poll KSeF for received invoices and import them into Invopop in GOBL format. * **Legally compliant PDF invoices:** Invoices are generated with all mandatory fields and FA(3) QR codes linked to the KSeF portal. * **FA(3) XML generation:** Compliant XML generation is supported for the KSeF FA(3) schema. * **QR code:** Generates the FA(3) QR code according to KSeF specifications. * **KSeF 2.0 integration:** Direct integration with KSeF 2.0, Poland's official national platform for electronic invoicing. **KSeF 2.0 Environment Support** Invopop supports KSeF 2.0 in sandbox (test and demo modes) and production environments. In sandbox, you can choose between test mode (with automatically generated certificates) or demo mode (simulating the real production flow). In production, all suppliers are registered directly with the KSeF production system. Check out our [Supplier registration guide](/guides/pl-ksef-supplier) for registering parties with KSeF, and the [Issuing invoices guide](/guides/pl-ksef) for issuing and importing invoices and setting up your workflows. ## FAQ Invoicing questions International (cross-border) invoices are handled just like domestic invoices in KSeF: * The invoice is created in GOBL with the foreign recipient's details * It's converted to FA(3) XML format and submitted to KSeF * KSeF validates and clears the invoice, assigning a unique KSeF ID * The invoice is registered in the KSeF system However, since foreign recipients cannot access KSeF, you must deliver the invoice through other channels (email, EDI, etc.). Include the KSeF QR code in the delivery for verification purposes. **Test mode** (sandbox only): Uses self-signed certificates generated automatically by Invopop. Perfect for quick testing without accessing the KSeF portal. Invoices are not sent to real KSeF servers. **Demo mode** (sandbox only): Connects to the official [KSeF Demo Portal](https://ap-demo.ksef.mf.gov.pl/web/). Requires manual certificate generation, simulating the full production flow in a safe test environment. **Production mode** (live workspace): Connects to the live [KSeF Portal](https://ap.ksef.mf.gov.pl/). Requires valid company credentials and certificates. All invoices are submitted to the official KSeF system. Use test mode for initial integration testing, then switch to demo mode when you're ready to simulate the real certificate flow before going live. Official KSeF applications: * [KSeF Taxpayer Application](https://ksef.podatki.gov.pl/aplikacja-podatnika-ksef-i-inne-narzedzia/bezplatne-narzedzie-wersja-produkcyjna/) – the main portal with all functionalities * [KSeF Mobile Application](https://ksef.podatki.gov.pl/aplikacja-podatnika-ksef-i-inne-narzedzia/aplikacja-mobilna-ksef/) – a mobile app for on-the-go access * [e-mikrofirma](https://login.mf.gov.pl/Account/Select?ReturnUrl=%2Fconnect%2Fauthorize%2Fcallback%3Fclient_id%3D09e2877e-702a-4e27-8818-9472ca964c0a%26redirect_uri%3Dhttps%253A%252F%252Furzadskarbowy.gov.pl%26response_type%3Dcode%26scope%3Dprofile%2520openid%2520DataHub.UserAccess%2520eFormsClientApi.UserAccess%2520ChatApi.UserAccess%2520offline_access%26state%3D8f196c7682654d0da49b42bfc9045e51%26code_challenge%3DSIwxyxXJpAzUgzrMW96UIH9vNc6P0-dkdc7l482AWQA%26code_challenge_method%3DS256) – a simplified portal aimed at micro-entrepreneurs For testing: * [KSeF Demo Portal](https://ap-demo.ksef.mf.gov.pl/web/) – demo environment for testing Install the KSeF Poland app, register your supplier (Test, Demo, or Production environment), and run invoices through the Send Invoice workflow. Each environment requires its own NIP and certificate setup. This error means the uploaded KSeF certificate does not have the required permissions to issue invoices. This typically happens when the certificate was uploaded by someone who is not the company administrator and only has limited permissions granted by the main company account. The KSeF certificate uploaded to Invopop must belong to either: * The **company account** directly logged into KSeF, or * An entity that has both **InvoiceRead** and **InvoiceWrite** permissions (managed within KSeF) To resolve this, you have two options: 1. **Grant permissions in KSeF**: The company admin (or whoever has direct access to the KSeF company account) grants `InvoiceRead` and `InvoiceWrite` permissions to the user who uploaded the certificate to Invopop. This can be done from the [KSeF application portal](https://ap.ksef.mf.gov.pl/) and requires no further action in Invopop (no need to unregister/register). 2. **Re-register with a new certificate**: Unregister the supplier in Invopop and register it again using a certificate generated from the main KSeF company account (or another account with the required permissions). See the [Poland tax regime in GOBL](https://docs.gobl.org/regimes/pl) for tax categories and NIP rules. The [`pl-favat-v3`](https://docs.gobl.org/addons/pl-favat-v3) addon documents the FA(3) schema fields required for KSeF. Polish invoicing law requires a unit of measure for every line, and KSeF maps it to the `P_8A` field on each `FaWiersz`. Invopop supports two ways to populate it: 1. **Canonical unit code on `Item.Unit`** — preferred when the unit exists in the GOBL unit catalogue or as a UN/ECE Recommendation 20 code. For example, `Item.Unit: "H87"` (piece) or `Item.Unit: "KGM"` (kilogram). The gobl.ksef converter emits the UN/ECE code directly into `P_8A`. 2. **Free-form label on `Item.Meta["unit-label"]`** — use this for Polish abbreviations that do not match a canonical code, such as `"szt."` (sztuka — piece), `"usł."` (usługa — service), `"kpl."` (komplet — set) or `"opak."` (opakowanie — package). The value is passed through to `P_8A` unchanged, so the supplier's exact wording is preserved on the KSeF XML. Example line item using a free-form label: ```json theme={"system"} { "item": { "name": "Konsultacja prawna", "price": "200.00", "meta": { "unit-label": "usł." } }, "quantity": "1" } ``` When an inbound KSeF invoice contains a `P_8A` value that is not a recognised GOBL or UN/ECE code, gobl.ksef preserves the original string under `Item.Meta["unit-label"]` so round-trips do not lose the supplier's wording. `Item.Unit` is only populated when the value validates as a canonical code. Registering supplier questions Common reasons for registration failures: * **Certificate and private key mismatch**: Ensure you uploaded both files from the same certificate generation * **Incorrect password**: Verify the password matches what you set during certificate generation * **Future start date**: Certificate start date must be today or in the past * **Wrong portal environment**: Demo certificates won't work with production, and vice versa * **File encoding issues**: For API uploads, ensure files are properly base64-encoded * **Expired certificate**: Check that the certificate is still valid * **Invalid NIP**: Verify the Polish Tax ID is correct and has access to KSeF Check the workflow error logs in the Invopop Console for detailed error messages that can help diagnose the specific issue. **For sandbox testing**: * **Test mode**: Generate fake NIPs at [http://generatory.it/](http://generatory.it/). These work immediately with self-signed certificates. * **Demo mode**: You need a real NIP with access to the KSeF Demo Portal. Choose an environment (Test, Demo, or Production). Generate a KSeF certificate from the relevant portal (or use a self-signed cert in Test mode), upload it to Invopop with the matching password, and register the supplier through the KSeF Register Supplier workflow. A KSeF certificate exported as PKCS#12 (.p12) with password, generated through the KSeF Application Portal (or auto-generated by Invopop in Test mode). The certificate must have InvoiceRead + InvoiceWrite permissions. The KSeF certificate (PKCS#12 .p12 with password) is stored encrypted at rest. Invopop uses it to authenticate session creation with KSeF on the supplier's behalf; the password is never returned in API responses. Receiving questions Invopop automatically imports received invoices through a polling service: 1. **Configure polling interval** during party registration (hourly, daily, weekly, or monthly) 2. **Set up the sync workflow** to query KSeF for new invoices 3. **Configure the import workflow** to convert FA(3) XML to GOBL format 4. **Link the workflows** in the Poland app configuration The system automatically checks KSeF at your chosen interval and imports any new invoices to your configured folder. **For manual import**, use the API to trigger import jobs with specific KSeF numbers or date ranges. See the [Import Received Invoices](/guides/pl-ksef#import-received-invoices) section in the guide. Yes. You can manually trigger a sync workflow to import invoices from a specific date range using the [Create a Job endpoint](/api-ref/transform/jobs/create-a-job-post). Pass the `from` and `upto` date parameters to sync all invoices received within that period: ```json theme={"system"} { "workflow_id": "YOUR_SYNC_WORKFLOW_ID", "entry_id": "YOUR_PARTY_ENTRY_ID", "args": { "from": "2026-01-01T00:00:00Z", "upto": "2026-01-31T23:59:59Z" } } ``` This is useful for backfilling invoices after a polling outage or importing historical data before enabling automatic polling. Check these indicators: 1. **Polling configuration**: Verify the polling interval is set in your party registration workflow configuration 2. **App configuration**: Confirm the Poland app has your sync workflow configured 3. **Recent imports**: Check the "Invoices · Expenses" folder for newly imported invoices 4. **Job logs**: Review job logs in the Console for sync and import workflow executions 5. **Error notifications**: Set up email or Slack notifications in your workflow error handling to alert you of failures Test the import by manually triggering the sync workflow with a date range that includes known received invoices. FA(3) XML conforming to the Ministry of Finance schema. Each invoice carries a unique KSeF reference (numer KSeF) plus the issuer's signature and a QR code linking to the public verification page. Inbound FA(3) XMLs are parsed via [`gobl.ksef`](https://github.com/invopop/gobl.ksef). Tax rates, line items, and parties map onto GOBL fields; the original signed XML is preserved as a silo entry attachment. More answers in our [Poland FAQ](/faq/poland) section
The following workflow actions will be available once you install and enable this app:
1
Register a party (supplier) with the KSeF system using their Polish Tax ID (NIP).
1
Generate FA(3) XML from GOBL invoices for the KSeF system.
2
Submit FA(3) XML invoices to the KSeF clearance system and receive KSeF ID upon approval.
1
Import a received invoice from KSeF and convert it to GOBL format.
1
Query KSeF for received invoices in a time range and create import jobs for each invoice.
The following workflows are available to make your integration easier. Use them as templates to build upon. This workflow registers a supplier in the KSeF system. ```json Example KSeF register supplier (send) workflow theme={"system"} { "name": "KSeF register supplier (send)", "description": "Register a supplier with KSeF for sending e-invoices", "schema": "org/party", "steps": [ { "id": "f6ca2240-fb6b-11f0-b2f4-37a8eb8f9eb9", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "f7315970-fb74-11f0-8137-27e02839a7ca", "name": "Register supplier with KSeF", "provider": "gov-pl.register" }, { "id": "3166cb10-fdba-11f0-a562-870ebfef62f3", "name": "Wait for KSeF certificate upload", "provider": "gov-pl.wait.upload" }, { "id": "f0b45d30-fb6b-11f0-b2f4-37a8eb8f9eb9", "name": "Set state", "provider": "silo.state", "summary": "Set state to `registered`{.state .registered}", "config": { "state": "registered" } } ], "rescue": [ { "id": "ebf99440-fb6b-11f0-b2f4-37a8eb8f9eb9", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` [Add to my workspace →](https://console.invopop.com/redirect/workflows/new?template=pl-register) This workflow automates FA(3) Polish invoice processing and tax compliance. ```json Example KSeF issue invoice workflow theme={"system"} { "name": "KSeF issue invoice", "description": "Issue an invoice through KSeF", "schema": "bill/invoice", "steps": [ { "id": "20bbac70-fb6e-11f0-8a4e-79beeb9e3cf2", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "9b5f5330-fb70-11f0-bcdd-bdb71eaf1fb4", "name": "Add sequential code", "provider": "sequence.enumerate", "summary": "Dynamic · KSeF · 000001", "config": { "name": "KSeF", "padding": 6, "start": 1 } }, { "id": "2f41c860-fb6e-11f0-8a4e-79beeb9e3cf2", "name": "Sign envelope", "provider": "silo.close" }, { "id": "2b064190-fb6e-11f0-8a4e-79beeb9e3cf2", "name": "Generate FA_VAT v3 XML", "provider": "gov-pl.generate" }, { "id": "36ec8550-fb6e-11f0-8a4e-79beeb9e3cf2", "name": "Send invoice to KSeF", "provider": "gov-pl.send" }, { "id": "3a3e2150-fb6e-11f0-8a4e-79beeb9e3cf2", "name": "Set state", "provider": "silo.state", "summary": "Set state to `sent`{.state .sent}", "config": { "state": "sent" } } ], "rescue": [ { "id": "3eca1210-fb6e-11f0-8a4e-79beeb9e3cf2", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` [Add to my workspace →](https://console.invopop.com/redirect/workflows/new?template=pl-send) This workflow imports a received invoice from KSeF and converts it to GOBL format. ```json Example KSeF import invoice workflow theme={"system"} { "name": "KSeF import invoice", "description": "Import an invoice received through KSeF", "schema": "bill/invoice", "steps": [ { "id": "ba8faad0-01d7-11f1-8b4e-fdb288ce1d84", "name": "Import invoice from KSeF", "provider": "gov-pl.import" }, { "id": "5efe18e0-01e7-11f1-8a2b-3f4babb9af4d", "name": "Set folder", "provider": "silo.folder", "summary": "Set folder to `Invoices · Expenses`{.font-medium}", "config": { "folder": "expenses" } }, { "id": "653ff700-01e7-11f1-8a2b-3f4babb9af4d", "name": "Set state", "provider": "silo.state", "summary": "Set state to `registered`{.state .registered}", "config": { "state": "registered" } } ], "rescue": [ { "id": "7d993da0-0275-11f1-94f6-05637523f70d", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` [Add to my workspace →](https://console.invopop.com/redirect/workflows/new?template=pl-import) This workflow syncs all received invoices for a party within a specific time range and creates import jobs for each invoice found. ```json Example KSeF sync received invoices workflow theme={"system"} { "name": "KSeF sync received invoices", "description": "Sync received invoices from KSeF and dispatch import jobs", "schema": "org/party", "steps": [ { "id": "5bddfd40-0220-11f1-bd80-c7df39ccdf0b", "name": "Sync received invoices from KSeF", "provider": "gov-pl.sync" } ], "rescue": [] } ``` [Add to my workspace →](https://console.invopop.com/redirect/workflows/new?template=pl-sync) The following examples show partial [GOBL](https://docs.gobl.org) documents you can copy and paste directly into the [Invopop Console](https://console.invopop.com) or store via the API as silo entries. A supplier with a 10-digit NIP, used both for party registration and as the invoice issuer. ```json Poland supplier example theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "Testowa Firma Sp. z o.o.", "tax_id": { "country": "PL", "code": "9876543210" }, "addresses": [ { "street": "ul. Główna 1", "locality": "Warszawa", "code": "00-001", "country": "PL" } ], "emails": [ { "addr": "kontakt@testowa.pl" } ] } ``` A business customer identified by NIP. ```json Poland customer example theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "Klient Testowy Sp. z o.o.", "tax_id": { "country": "PL", "code": "1111111111" }, "addresses": [ { "street": "ul. Testowa 10", "locality": "Kraków", "code": "30-001", "country": "PL" } ] } ``` In this example, we're issuing a standard B2B invoice from a Polish supplier to another Polish business customer. Notice: * the minimal version in the first tab contains only the essential fields required to create the invoice, * the [`pl-ksef-v1`](https://docs.gobl.org/addons/pl-ksef-v1) addon ensures the document will be validated using the KSeF rules built into the [GOBL](https://docs.gobl.org) library, * there are no totals or calculations in the minimal version; all these will be calculated automatically when running `gobl build`, * the built version in the second tab shows the normalized document with calculated totals, line item sums, tax breakdowns, and automatically generated fields like `i` (line index), `sum`, and `total`, and, * make sure to process it with the "KSeF issue invoice" workflow created during setup. ```json B2B Standard Invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "PL", "$addons": [ "pl-favat-v3" ], "series": "INVOICE", "code": "001", "issue_date": "2026-01-20", "supplier": { "name": "Testowa Firma Sp. z o.o.", "tax_id": { "country": "PL", "code": "9876543210" }, "addresses": [ { "street": "ul. Główna 1", "locality": "Warszawa", "code": "00-001", "country": "PL" } ], "emails": [ { "addr": "kontakt@testowa.pl" } ] }, "customer": { "name": "Klient Testowy Sp. z o.o.", "tax_id": { "country": "PL", "code": "1111111111" }, "addresses": [ { "street": "ul. Testowa 10", "locality": "Kraków", "code": "30-001", "country": "PL" } ] }, "lines": [ { "quantity": "10", "item": { "name": "Software Development Services", "price": "100.00", "unit": "h" }, "taxes": [ { "cat": "VAT", "rate": "general", "key": "standard" } ] }, { "quantity": "5", "item": { "name": "Consulting Services", "price": "150.00", "unit": "h" }, "taxes": [ { "cat": "VAT", "rate": "reduced", "key": "standard" } ] } ], "payment": { "instructions": { "key": "credit-transfer", "detail": "Transfer payment to our bank account", "credit_transfer": [ { "iban": "PL61109010140000071219812874", "name": "Testowa Firma Sp. z o.o." } ] } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "PL", "$addons": [ "pl-favat-v3" ], "type": "standard", "series": "INVOICE", "code": "001", "issue_date": "2026-01-20", "currency": "PLN", "tax": { "ext": { "pl-favat-invoice-type": "VAT" } }, "supplier": { "name": "Testowa Firma Sp. z o.o.", "tax_id": { "country": "PL", "code": "9876543210" }, "addresses": [ { "street": "ul. Główna 1", "locality": "Warszawa", "code": "00-001", "country": "PL" } ], "emails": [ { "addr": "kontakt@testowa.pl" } ] }, "customer": { "name": "Klient Testowy Sp. z o.o.", "tax_id": { "country": "PL", "code": "1111111111" }, "addresses": [ { "street": "ul. Testowa 10", "locality": "Kraków", "code": "30-001", "country": "PL" } ] }, "lines": [ { "i": 1, "quantity": "10", "item": { "name": "Software Development Services", "price": "100.00", "unit": "h" }, "sum": "1000.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "23.0%", "ext": { "pl-favat-tax-category": "1" } } ], "total": "1000.00" }, { "i": 2, "quantity": "5", "item": { "name": "Consulting Services", "price": "150.00", "unit": "h" }, "sum": "750.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "reduced", "percent": "8.0%", "ext": { "pl-favat-tax-category": "2" } } ], "total": "750.00" } ], "payment": { "instructions": { "key": "credit-transfer", "detail": "Transfer payment to our bank account", "credit_transfer": [ { "iban": "PL61109010140000071219812874", "name": "Testowa Firma Sp. z o.o." } ], "ext": { "pl-favat-payment-means": "6" } } }, "totals": { "sum": "1750.00", "total": "1750.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "pl-favat-tax-category": "1" }, "base": "1000.00", "percent": "23.0%", "amount": "230.00" }, { "key": "standard", "ext": { "pl-favat-tax-category": "2" }, "base": "750.00", "percent": "8.0%", "amount": "60.00" } ], "amount": "290.00" } ], "sum": "290.00" }, "tax": "290.00", "total_with_tax": "2040.00", "payable": "2040.00" } } ``` In this example, we're issuing a reverse charge invoice from a Polish supplier to a customer in another EU member state. Notice: * the customer has a valid EU VAT ID, indicating the transaction is subject to reverse charge mechanism, * the minimal version contains only essential fields; totals and tax calculations are omitted, * when running `gobl build`, the system automatically calculates totals, applies reverse charge rules, and normalizes the document, * the built version shows all calculated fields including the reverse charge indicator, tax breakdowns, and final totals, and, * the invoice is validated using the KSeF rules to ensure compliance with Polish e-invoicing requirements. ```json B2B Reverse Charge Invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "PL", "$addons": [ "pl-favat-v3" ], "$tags": [ "reverse-charge" ], "series": "RC", "code": "001", "issue_date": "2026-01-20", "supplier": { "name": "Testowa Firma Sp. z o.o.", "tax_id": { "country": "PL", "code": "9876543210" }, "addresses": [ { "street": "ul. Główna 1", "locality": "Warszawa", "code": "00-001", "country": "PL" } ] }, "customer": { "name": "EU Business GmbH", "tax_id": { "country": "DE", "code": "111111125" }, "addresses": [ { "street": "Hauptstraße 100", "locality": "Berlin", "code": "10115", "country": "DE" } ] }, "lines": [ { "quantity": "1", "item": { "name": "IT Services - EU Reverse Charge", "price": "5000.00" }, "taxes": [ { "cat": "VAT", "key": "reverse-charge" } ] } ], "notes": [ { "key": "legal", "text": "Reverse charge mechanism applies - VAT to be accounted for by the customer." } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "PL", "$addons": [ "pl-favat-v3" ], "$tags": [ "reverse-charge" ], "type": "standard", "series": "RC", "code": "001", "issue_date": "2026-01-20", "currency": "PLN", "tax": { "ext": { "pl-favat-invoice-type": "VAT", "pl-favat-reverse-charge": "1" } }, "supplier": { "name": "Testowa Firma Sp. z o.o.", "tax_id": { "country": "PL", "code": "9876543210" }, "addresses": [ { "street": "ul. Główna 1", "locality": "Warszawa", "code": "00-001", "country": "PL" } ] }, "customer": { "name": "EU Business GmbH", "tax_id": { "country": "DE", "code": "111111125" }, "addresses": [ { "street": "Hauptstraße 100", "locality": "Berlin", "code": "10115", "country": "DE" } ] }, "lines": [ { "i": 1, "quantity": "1", "item": { "name": "IT Services - EU Reverse Charge", "price": "5000.00" }, "sum": "5000.00", "taxes": [ { "cat": "VAT", "key": "reverse-charge", "ext": { "pl-favat-tax-category": "9" } } ], "total": "5000.00" } ], "totals": { "sum": "5000.00", "total": "5000.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "reverse-charge", "ext": { "pl-favat-tax-category": "9" }, "base": "5000.00", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "5000.00", "payable": "5000.00" }, "notes": [ { "key": "legal", "text": "Reverse charge mechanism applies - VAT to be accounted for by the customer." } ] } ``` In this example, we're issuing a credit note to correct or refund a previous invoice. Notice: * the `type` field is set to `credit-note` to indicate this is a corrective document, * the `preceding` field references the original invoice being corrected, * the minimal version contains only the essential fields; calculations are handled by GOBL, * when running `gobl build`, the system automatically calculates negative totals, tax refunds, and validates the credit note structure, * the built version shows all calculated fields including negative amounts for the refund, and, * the document is validated using the KSeF rules to ensure compliance with Polish credit note requirements. ```json B2B Credit Note theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "PL", "$addons": [ "pl-favat-v3" ], "type": "credit-note", "series": "KOR", "code": "001", "issue_date": "2026-01-20", "preceding": [ { "type": "standard", "issue_date": "2026-01-20", "series": "INVOICE", "code": "001", "reason": "Price correction", "stamps": [ { "prv": "favat-ksef-number", "val": "1234567890-20260120-ABCD1234-EF" } ], "ext": { "pl-favat-effective-date": "1" } } ], "supplier": { "name": "Testowa Firma Sp. z o.o.", "tax_id": { "country": "PL", "code": "9876543210" }, "addresses": [ { "street": "ul. Główna 1", "locality": "Warszawa", "code": "00-001", "country": "PL" } ] }, "customer": { "name": "Klient Testowy Sp. z o.o.", "tax_id": { "country": "PL", "code": "9876543210" }, "addresses": [ { "street": "ul. Testowa 10", "locality": "Kraków", "code": "30-001", "country": "PL" } ] }, "lines": [ { "quantity": "10", "item": { "name": "Software Development Services", "price": "10.00", "unit": "h" }, "taxes": [ { "cat": "VAT", "rate": "general", "ext": { "pl-favat-tax-category": "1" } } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "PL", "$addons": [ "pl-favat-v3" ], "type": "credit-note", "series": "KOR", "code": "001", "issue_date": "2026-01-20", "currency": "PLN", "preceding": [ { "type": "standard", "issue_date": "2026-01-20", "series": "INVOICE", "code": "001", "reason": "Price correction", "stamps": [ { "prv": "favat-ksef-number", "val": "1234567890-20260120-ABCD1234-EF" } ], "ext": { "pl-favat-effective-date": "1" } } ], "tax": { "ext": { "pl-favat-invoice-type": "KOR" } }, "supplier": { "name": "Testowa Firma Sp. z o.o.", "tax_id": { "country": "PL", "code": "9876543210" }, "addresses": [ { "street": "ul. Główna 1", "locality": "Warszawa", "code": "00-001", "country": "PL" } ] }, "customer": { "name": "Klient Testowy Sp. z o.o.", "tax_id": { "country": "PL", "code": "9876543210" }, "addresses": [ { "street": "ul. Testowa 10", "locality": "Kraków", "code": "30-001", "country": "PL" } ] }, "lines": [ { "i": 1, "quantity": "10", "item": { "name": "Software Development Services", "price": "10.00", "unit": "h" }, "sum": "100.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "23.0%", "ext": { "pl-favat-tax-category": "1" } } ], "total": "100.00" } ], "totals": { "sum": "100.00", "total": "100.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "pl-favat-tax-category": "1" }, "base": "100.00", "percent": "23.0%", "amount": "23.00" } ], "amount": "23.00" } ], "sum": "23.00" }, "tax": "23.00", "total_with_tax": "123.00", "payable": "123.00" } } ``` In this example, we're issuing a prepayment invoice to document an advance payment received before completing the delivery of goods or services. Notice: * the `$tags` field includes `partial`, which tells the FA\_VAT addon to classify this as a `ZAL` (Faktura Zaliczkowa) document type, * the `payment.advances` array records the advance payment details, including the mandatory `date` field and a `percent` of the total, * GOBL automatically calculates the advance amount from the percentage and deducts it from the payable total to produce the `due` amount, * the built version shows `"pl-favat-invoice-type": "ZAL"` automatically set in the tax extensions, and, * after sending this invoice through KSeF, reference the assigned KSeF number in the subsequent settlement invoice. ```json B2B Prepayment Invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "PL", "$addons": [ "pl-favat-v3" ], "$tags": ["partial"], "series": "ZAL", "code": "001", "issue_date": "2026-01-20", "supplier": { "name": "Testowa Firma Sp. z o.o.", "tax_id": { "country": "PL", "code": "9876543210" }, "addresses": [ { "street": "ul. Główna 1", "locality": "Warszawa", "code": "00-001", "country": "PL" } ] }, "customer": { "name": "Klient Testowy Sp. z o.o.", "tax_id": { "country": "PL", "code": "1111111111" }, "addresses": [ { "street": "ul. Testowa 10", "locality": "Kraków", "code": "30-001", "country": "PL" } ] }, "lines": [ { "quantity": "10", "item": { "name": "Software Development Services", "price": "100.00", "unit": "h" }, "taxes": [ { "cat": "VAT", "rate": "general", "key": "standard" } ] } ], "payment": { "advances": [ { "key": "credit-transfer", "description": "Advance payment for software development project", "date": "2026-01-20", "percent": "50%" } ], "instructions": { "key": "credit-transfer", "credit_transfer": [ { "iban": "PL61109010140000071219812874", "name": "Testowa Firma Sp. z o.o." } ] } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "PL", "$addons": [ "pl-favat-v3" ], "$tags": [ "partial" ], "type": "standard", "series": "ZAL", "code": "001", "issue_date": "2026-01-20", "currency": "PLN", "tax": { "ext": { "pl-favat-invoice-type": "ZAL" } }, "supplier": { "name": "Testowa Firma Sp. z o.o.", "tax_id": { "country": "PL", "code": "9876543210" }, "addresses": [ { "street": "ul. Główna 1", "locality": "Warszawa", "code": "00-001", "country": "PL" } ] }, "customer": { "name": "Klient Testowy Sp. z o.o.", "tax_id": { "country": "PL", "code": "1111111111" }, "addresses": [ { "street": "ul. Testowa 10", "locality": "Kraków", "code": "30-001", "country": "PL" } ] }, "lines": [ { "i": 1, "quantity": "10", "item": { "name": "Software Development Services", "price": "100.00", "unit": "h" }, "sum": "1000.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "23.0%", "ext": { "pl-favat-tax-category": "1" } } ], "total": "1000.00" } ], "payment": { "advances": [ { "date": "2026-01-20", "key": "credit-transfer", "description": "Advance payment for software development project", "percent": "50%", "amount": "615.00", "ext": { "pl-favat-payment-means": "6" } } ], "instructions": { "key": "credit-transfer", "credit_transfer": [ { "iban": "PL61109010140000071219812874", "name": "Testowa Firma Sp. z o.o." } ], "ext": { "pl-favat-payment-means": "6" } } }, "totals": { "sum": "1000.00", "total": "1000.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "pl-favat-tax-category": "1" }, "base": "1000.00", "percent": "23.0%", "amount": "230.00" } ], "amount": "230.00" } ], "sum": "230.00" }, "tax": "230.00", "total_with_tax": "1230.00", "payable": "1230.00", "advance": "615.00", "due": "615.00" } } ``` In this example, we're issuing a settlement invoice to finalize a transaction after one or more advance payments have been made. Notice: * the `$tags` field includes `settlement`, which tells the FA\_VAT addon to classify this as a `ROZ` (Faktura Rozliczeniowa) document type, * the `preceding` field references the original prepayment invoice, including its KSeF number stamp, * the `payment.advances` array records the previously paid advance amount, which GOBL deducts from the total to calculate the remaining `due`, * the line items represent the full value of the delivered goods or services, and, * the built version shows `"pl-favat-invoice-type": "ROZ"` automatically set in the tax extensions. ```json B2B Settlement Invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "PL", "$addons": [ "pl-favat-v3" ], "$tags": ["settlement"], "series": "ROZ", "code": "001", "issue_date": "2026-02-15", "preceding": [ { "type": "standard", "issue_date": "2026-01-20", "series": "ZAL", "code": "001", "stamps": [ { "prv": "favat-ksef-number", "val": "9876543210-20260120-ABCD1234-EF" } ] } ], "supplier": { "name": "Testowa Firma Sp. z o.o.", "tax_id": { "country": "PL", "code": "9876543210" }, "addresses": [ { "street": "ul. Główna 1", "locality": "Warszawa", "code": "00-001", "country": "PL" } ] }, "customer": { "name": "Klient Testowy Sp. z o.o.", "tax_id": { "country": "PL", "code": "1111111111" }, "addresses": [ { "street": "ul. Testowa 10", "locality": "Kraków", "code": "30-001", "country": "PL" } ] }, "lines": [ { "quantity": "10", "item": { "name": "Software Development Services", "price": "100.00", "unit": "h" }, "taxes": [ { "cat": "VAT", "rate": "general", "key": "standard" } ] } ], "payment": { "advances": [ { "description": "Advance payment per ZAL/001", "date": "2026-01-20", "amount": "615.00" } ], "instructions": { "key": "credit-transfer", "credit_transfer": [ { "iban": "PL61109010140000071219812874", "name": "Testowa Firma Sp. z o.o." } ] } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "PL", "$addons": [ "pl-favat-v3" ], "$tags": [ "settlement" ], "type": "standard", "series": "ROZ", "code": "001", "issue_date": "2026-02-15", "currency": "PLN", "preceding": [ { "type": "standard", "issue_date": "2026-01-20", "series": "ZAL", "code": "001", "stamps": [ { "prv": "favat-ksef-number", "val": "9876543210-20260120-ABCD1234-EF" } ] } ], "tax": { "ext": { "pl-favat-invoice-type": "ROZ" } }, "supplier": { "name": "Testowa Firma Sp. z o.o.", "tax_id": { "country": "PL", "code": "9876543210" }, "addresses": [ { "street": "ul. Główna 1", "locality": "Warszawa", "code": "00-001", "country": "PL" } ] }, "customer": { "name": "Klient Testowy Sp. z o.o.", "tax_id": { "country": "PL", "code": "1111111111" }, "addresses": [ { "street": "ul. Testowa 10", "locality": "Kraków", "code": "30-001", "country": "PL" } ] }, "lines": [ { "i": 1, "quantity": "10", "item": { "name": "Software Development Services", "price": "100.00", "unit": "h" }, "sum": "1000.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "23.0%", "ext": { "pl-favat-tax-category": "1" } } ], "total": "1000.00" } ], "payment": { "advances": [ { "date": "2026-01-20", "description": "Advance payment per ZAL/001", "amount": "615.00" } ], "instructions": { "key": "credit-transfer", "credit_transfer": [ { "iban": "PL61109010140000071219812874", "name": "Testowa Firma Sp. z o.o." } ], "ext": { "pl-favat-payment-means": "6" } } }, "totals": { "sum": "1000.00", "total": "1000.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "pl-favat-tax-category": "1" }, "base": "1000.00", "percent": "23.0%", "amount": "230.00" } ], "amount": "230.00" } ], "sum": "230.00" }, "tax": "230.00", "total_with_tax": "1230.00", "payable": "1230.00", "advance": "615.00", "due": "615.00" } } ``` B2C invoices are excluded from the mandatory e-invoicing requirement. The tax authority already receives B2C sales data through online fiscal cash registers that transmit receipts to the Central Repository of Cash Registers (CRK). However, businesses may voluntarily issue B2C invoices through KSeF. ```json KSeF B2C Invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "PL", "$addons": [ "pl-favat-v3" ], "$tags": [ "simplified" ], "uuid": "019c2849-dd61-7001-8c88-3c6d1aa83f8a", "type": "standard", "series": "SIMPLE", "code": "236", "issue_date": "2026-02-04", "currency": "PLN", "tax": { "ext": { "pl-favat-invoice-type": "UPR" } }, "supplier": { "name": "Testowa Firma Sp. z o.o.", "tax_id": { "country": "PL", "code": "9551893317" }, "addresses": [ { "street": "ul. Główna 1", "locality": "Warszawa", "code": "00-001", "country": "PL" } ], "emails": [ { "addr": "kontakt@testowa.pl" } ] }, "lines": [ { "i": 1, "quantity": "10", "item": { "name": "Software Development Services", "price": "100.00", "unit": "h" }, "sum": "1000.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "23.0%", "ext": { "pl-favat-tax-category": "1" } } ], "total": "1000.00" }, { "i": 2, "quantity": "5", "item": { "name": "Consulting Services", "price": "150.00", "unit": "h" }, "sum": "750.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "reduced", "percent": "8.0%", "ext": { "pl-favat-tax-category": "2" } } ], "total": "750.00" } ], "payment": { "instructions": { "key": "credit-transfer", "detail": "Transfer payment to our bank account", "credit_transfer": [ { "iban": "PL61109010140000071219812874", "name": "Testowa Firma Sp. z o.o." } ], "ext": { "pl-favat-payment-means": "6" } } }, "totals": { "sum": "1750.00", "total": "1750.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "pl-favat-tax-category": "1" }, "base": "1000.00", "percent": "23.0%", "amount": "230.00" }, { "key": "standard", "ext": { "pl-favat-tax-category": "2" }, "base": "750.00", "percent": "8.0%", "amount": "60.00" } ], "amount": "290.00" } ], "sum": "290.00" }, "tax": "290.00", "total_with_tax": "2040.00", "payable": "2040.00" } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "PL", "$addons": [ "pl-favat-v3" ], "$tags": [ "simplified" ], "uuid": "019c2849-dd61-7001-8c88-3c6d1aa83f8a", "type": "standard", "series": "SIMPLE", "code": "236", "issue_date": "2026-02-04", "currency": "PLN", "tax": { "ext": { "pl-favat-invoice-type": "UPR" } }, "supplier": { "name": "Testowa Firma Sp. z o.o.", "tax_id": { "country": "PL", "code": "9551893317" }, "addresses": [ { "street": "ul. Główna 1", "locality": "Warszawa", "code": "00-001", "country": "PL" } ], "emails": [ { "addr": "kontakt@testowa.pl" } ] }, "lines": [ { "i": 1, "quantity": "10", "item": { "name": "Software Development Services", "price": "100.00", "unit": "h" }, "sum": "1000.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "23.0%", "ext": { "pl-favat-tax-category": "1" } } ], "total": "1000.00" }, { "i": 2, "quantity": "5", "item": { "name": "Consulting Services", "price": "150.00", "unit": "h" }, "sum": "750.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "reduced", "percent": "8.0%", "ext": { "pl-favat-tax-category": "2" } } ], "total": "750.00" } ], "payment": { "instructions": { "key": "credit-transfer", "detail": "Transfer payment to our bank account", "credit_transfer": [ { "iban": "PL61109010140000071219812874", "name": "Testowa Firma Sp. z o.o." } ], "ext": { "pl-favat-payment-means": "6" } } }, "totals": { "sum": "1750.00", "total": "1750.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "pl-favat-tax-category": "1" }, "base": "1000.00", "percent": "23.0%", "amount": "230.00" }, { "key": "standard", "ext": { "pl-favat-tax-category": "2" }, "base": "750.00", "percent": "8.0%", "amount": "60.00" } ], "amount": "290.00" } ], "sum": "290.00" }, "tax": "290.00", "total_with_tax": "2040.00", "payable": "2040.00" } } ``` A self-billed invoice (samofakturowanie) is issued by the customer on behalf of the supplier, under a prior agreement between the two parties. ```json KSeF self-billed invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "PL", "$tags": [ "self-billed" ], "code": "SAMPLE-001", "issue_date": "2025-08-01", "supplier": { "name": "Provide One S.L.", "tax_id": { "country": "PL", "code": "9876543210" }, "addresses": [ { "num": "42", "street": "ul. Przykładowa", "locality": "Warszawa", "region": "mazowieckie", "code": "00-015", "country": "PL" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Your Company S.A.", "tax_id": { "country": "PL", "code": "1234567788" }, "addresses": [ { "num": "43", "street": "ul. Przykładowa", "locality": "Warszawa", "region": "mazowieckie", "code": "00-015", "country": "PL" } ] }, "lines": [ { "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "taxes": [ { "cat": "VAT", "rate": "general" } ] }, { "quantity": "1", "item": { "name": "Financial service", "price": "10.00", "unit": "service" }, "taxes": [ { "cat": "VAT", "rate": "reduced" } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "PL", "$tags": [ "self-billed" ], "type": "standard", "code": "SAMPLE-001", "issue_date": "2025-08-01", "currency": "PLN", "supplier": { "name": "Provide One S.L.", "tax_id": { "country": "PL", "code": "9876543210" }, "addresses": [ { "num": "42", "street": "ul. Przykładowa", "locality": "Warszawa", "region": "mazowieckie", "code": "00-015", "country": "PL" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Your Company S.A.", "tax_id": { "country": "PL", "code": "1234567788" }, "addresses": [ { "num": "43", "street": "ul. Przykładowa", "locality": "Warszawa", "region": "mazowieckie", "code": "00-015", "country": "PL" } ] }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "23.0%" } ], "total": "1800.00" }, { "i": 2, "quantity": "1", "item": { "name": "Financial service", "price": "10.00", "unit": "service" }, "sum": "10.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "reduced", "percent": "8.0%" } ], "total": "10.00" } ], "totals": { "sum": "1810.00", "total": "1810.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "base": "1800.00", "percent": "23.0%", "amount": "414.00" }, { "key": "standard", "base": "10.00", "percent": "8.0%", "amount": "0.80" } ], "amount": "414.80" } ], "sum": "414.80" }, "tax": "414.80", "total_with_tax": "2224.80", "payable": "2224.80" } } ``` For more examples and detailed documentation, visit the [Supplier registration](/guides/pl-ksef-supplier) and [Issuing invoices](/guides/pl-ksef) guides.
*** | | | | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Compliance | [Invoicing compliance in Poland](/compliance/poland)
[Compliance timeline](/timelines/poland) | | Apps | [Poland](/apps/poland) | | Guides | [Supplier registration](/guides/pl-ksef-supplier)
[Issuing invoices](/guides/pl-ksef) | | FAQ | [Poland FAQ](/faq/poland) | | GOBL | [Poland Tax Regime](https://docs.gobl.org/regimes/pl)
[Polish KSeF FA(3) Addon](https://docs.gobl.org/addons/pl-favat-v3) |
Ask and answer questions about Poland App → # Portal Source: https://docs.invopop.com/apps/portal Convert a simplified invoice or receipt into a full invoice
| | | | --------- | ------------------------------ | | Developer | [Invopop](https://invopop.com) | | Category | Utility |
**Portal** creates a link to a web page for your customers to fill in a form to supplement a simplified invoice or receipt with the information required to issue a full invoice. This is useful for businesses that want to issue invoices for customers that don't have a full set of information available, such as customers that are not yet registered in your system. A common workflow setup is registering minimal customer information (e.g. email) and then allowing the customer to fill in the rest of the information on the web page. ## Key features * Allow your customers to convert their simplified (B2C) invoice or receipt into a full (B2B) invoice by filling in a form with their fiscal information. * Configure the name and logo that will be displayed on the web page.
1
Adds a link to the B2C invoice to a portal that will help customers replace the sale with a new B2B invoice that includes their fiscal information.
# SAT Mexico Source: https://docs.invopop.com/apps/sat-mexico Issue and import CFDI invoices, onboard suppliers, and manage compliant submissions to Mexico's tax authority (SAT).
Supplier registration guide › Issuing guide › Receiving guide ›
| | | | --------- | ------------------------------ | | Developer | [Invopop](https://invopop.com) | | Category | Government | | Scope | B2B, B2C, B2G | | Country | [Mexico](/compliance/mexico) |
Invopop's **SAT Mexico app** enables full compliance with Mexico's CFDI e-invoicing framework. Use ready-made workflows to register suppliers, authorize the local PAC, and issue CFDI v4 invoices directly from Invopop. The app also provides CFDI import capabilities, converting CFDI XML documents to [GOBL](https://docs.gobl.org) format for use in accounts payable and other processing workflows. #### Key features * **Workflow automation:** The app makes workflow steps available for post-registration, supplier registration, issuing invoices, issuing payment receipts (*comprobantes de pago*), and importing CFDIs. * **CFDI import:** Convert CFDI XML documents to GOBL format. Combine with the [SW Sapien app](/apps/sw-sapien) to bulk download CFDIs from SAT. * **PDF generation:** Optional PDF creation with configurable layout, locale, and formatting. * **PAC authorization:** One-time e.firma (FIEL) sign-off to allow the PAC to stamp and submit CFDIs on your behalf. * **CFDI v4 compliance:** Validations and transformations powered by the GOBL library and the `mx-cfdi-v4` addon. * **Supplier onboarding:** Collect RFC and fiscal regime code; upload CSD (certificate & key) and activate via a secure registration link. * **White-label support:** Invoicing can be performed either under a client's brand (white-label) or directly by the issuing organization, according to operational needs. Check out our [Supplier registration guide](/guides/mx-sat-supplier) for onboarding suppliers, the [Issuing documents guide](/guides/mx-sat-issuing) for issuing invoices and payment receipts, or the [Receiving invoices guide](/guides/mx-sat-receiving) for importing CFDIs. ## FAQ Invoicing questions Individual CFDIs are not required for sales under MXN \$100, but those sales must still be included in the global CFDI. Often issuing all invoices will simplify your operation. Yes. We obtain the supplier's CSD (digital seal) and credentials to issue invoices in that company's name. Read more in our [white label use case](/guides/white-label). Yes. The `mx-cfdi-v4` addon supports both PUE and PPD on the original invoice, and Invopop also issues the subsequent payment receipts (REPs / Pago / comprobante de pago) that must be emitted as payments are collected. Model each receipt as a GOBL [`bill.Payment`](https://docs.gobl.org/draft-0/bill/payment) referencing the PPD invoices being settled and run it through the SAT issue payment workflow. See the [payment receipt example](/guides/mx-sat-issuing) in the issuing guide. Yes, if the original was issued as PUE and payment is not received by the last day of the issuance month, rule 2.7.1.32 RMF requires cancelling the original and re-issuing as PPD with `FormaPago = 99`, then issuing REPs as payments come in. This is calendar-driven, not payment-event-driven, and it surprises most non-Mexican implementations. The conservative approach is to issue PPD whenever there is any uncertainty about same-month payment. REPs must be issued by the fifth calendar day of the month following payment receipt (rule 2.7.1.35 RMF). Missing the deadline does not invalidate the underlying invoice, but it prevents the customer from deducting the expense in the correct period and exposes the issuer to fines. This is a recurring source of friction and the reason customers will sometimes refuse to accept cancellations from a supplier with poor REP discipline. Install the SAT Mexico app (uses SW Sapien as PAC) plus the SW Sapien app for credentials. Onboard each issuing supplier with their CSD certificate and `mx-cfdi-issue-place`. Run invoices through the Issue CFDI workflow. The library that transforms GOBL into CFDI documents is publicly available as an open-source project and can be found at [github.com/invopop/gobl.cfdi](https://github.com/invopop/gobl.cfdi). For further details on how GOBL prepares data for conversion, see the [Mexico Tax Regime](https://github.com/invopop/gobl/blob/main/regimes/mx/README.md). The most common cause is a mismatch between the receiver's postal code in the CFDI and the postal code SAT has on file for that RFC. Resolution: ask the customer for their CIF (Constancia de Situación Fiscal) and use the postal code printed there, exactly. Secondary causes: * The postal code is real but not yet in `c_CodigoPostal`. Use the closest catalog code from the place of issuance. * The receiver is `XAXX010101000` or `XEXX010101000` and `DomicilioFiscalReceptor` differs from `LugarExpedicion`. They must be equal for generic RFCs. * The branch issuing the document is configured with the matriz's postal code instead of its own. In Mexico, a reduced VAT rate of 8% applies to transactions in border zones (northern and southern border regions). To successfully issue invoices with this rate, **both** of the following conditions must be met: 1. The supplier's RFC must be enabled by the SAT to invoice with the reduced rate in border zones. 2. Both the `mx-cfdi-issue-place` field and the customer's postal code (when included) must correspond to border zones. If either condition is not met, the SAT will reject the invoice with an error. CFDI40999 is a generic "unclassified error" returned by the SAT when no other, more specific error code applies. This error can have multiple causes. A common scenario is invoicing in border zones with the reduced 8% VAT rate. If you receive this error in that context, verify: 1. **RFC registration**: The supplier's RFC must be registered in the taxpayers registry for the appropriate border region tax incentive. Without this registration, the SAT will reject all invoices with the reduced rate. See [SAT's registration requirements and procedures](https://www.sat.gob.mx/minisitio/EstimulosFiscalesFronteraNorteSur/) for more information. 2. **Issue place postal code**: The [`mx-cfdi-issue-place`](https://docs.gobl.org/addons/mx-cfdi-v4#place-of-issue) field must contain a postal code from a municipality within a border zone. 3. **Tax rate**: Ensure you're applying the correct percentage (typically 8%) for the border zone. If the error persists after verifying these points, or you're getting this error for other reasons, please reach out to our support team. This error appears when you try to issue an invoice for a supplier (identified by its RFC) that has not been registered in your workspace. Before you can issue on a supplier's behalf, its CSD certificate must be uploaded and validated through the registration flow. To fix it, make sure the supplier is correctly registered by following the [Register a supplier](/guides/mx-sat-supplier#register-a-supplier) steps in the supplier registration guide. In **Sandbox** you may also hit this error for suppliers that were registered in the past. This is due to a change in how supplier registration is now enforced before sending invoices. To resolve it, open the supplier's Silo Entry in the Console and run the registration process again from the start, completing every step. The UsoCFDI must be allowed for the receiver's `RegimenFiscal`. The catalog defines the valid combinations; not every code works for every régimen. For example, D01–D10 (personal deductions) are only valid for individuals, never for legal entities. RESICO contributors (régimen 626) have a restricted set. When in doubt, default to `S01` (Sin efectos fiscales) — it is always valid but produces a non-deductible invoice for the receiver. Always ask the customer which UsoCFDI they need before issuing. By default, Invopop uses Mexico City's time zone (UTC-6) when automatically setting the [`issue_date`](https://docs.gobl.org/draft-0/bill/invoice#issue-date) and [`issue_time`](https://docs.gobl.org/draft-0/bill/invoice#issue-time) fields. However, the SAT validates these fields based on the time zone of the postal code specified in [`mx-cfdi-issue-place`](https://docs.gobl.org/addons/mx-cfdi-v4#place-of-issue). If the issuing location is in a different time zone, the SAT may reject the invoice with an error indicating the timestamp is in the future, as it only allows up to 5 minutes ahead of the local time. To avoid this, explicitly set `issue_date` and `issue_time` in your GOBL invoice using the local time zone of the issuing location when operating outside Mexico City's time zone. For non-MXN invoices, `TipoCambio` must be present and use the FIX rate published by Banxico in the DOF the day prior to the operation (Article 20 CFF, Article 56 Ley Aduanera). Common errors: * Using the day-of rate instead of the prior day's. * Quoting the inverse (USD per MXN instead of MXN per USD). * Setting `TipoCambio` on an MXN invoice (it must be 1 or absent). * Rounding inconsistently between line totals and document totals — Anexo 20 has specific rounding rules. See the [Mexico tax regime in GOBL](https://docs.gobl.org/regimes/mx) for tax categories, RFC structure, and CFDI extensions. The [`mx-cfdi-v4`](https://docs.gobl.org/addons/mx-cfdi-v4) addon documents required fields including UsoCFDI, RegimenFiscal, and place-of-issue. Registering supplier questions Invopop uses [SW Sapien](https://sw.com.mx), an Authorised Certification Provider (PAC), to sign and stamp CFDI documents for the Mexican tax authority. Without a valid CSD, the issuer cannot stamp any CFDI through any PAC. SAT can administratively revoke a CSD when it suspects fraudulent activity, repeated non-compliance, or tax debts. Operations halt until the supplier resolves the underlying cause and obtains a new CSD. CSDs also expire every four years. Suppliers should monitor CSD validity proactively; Invopop relies on the CSD uploaded during supplier registration and does not manage its lifecycle. Generate a registration link via the SAT Mexico Register Supplier workflow. The supplier uploads their CSD certificate (`.cer` + `.key` + password) and authorizes the PAC. Once validated, the supplier is ready to issue CFDIs. A CSD (Certificado de Sello Digital) issued by SAT specifically for invoicing — distinct from the FIEL (e.firma) used for portal login. The CSD comprises a `.cer` (X.509) and `.key` (encrypted private key) with a password set at generation. Validity: 4 years. The CSD certificate (`.cer`), private key (`.key`), and key password are stored encrypted at rest. Invopop uses them only to seal CFDIs before transmission to the PAC; the password and key are never returned in API responses. More answers in our [Mexico FAQ](/faq/mexico) section
The following workflow actions will be available once you install and enable this app: Send GOBL invoices to the Mexican SAT using the CFDI format.
5
Convert a CFDI XML document to GOBL format. Accepts a URL pointing to the CFDI file (typically a Spool URL provided by the [SW Sapien app](/apps/sw-sapien)). Start the process of registering a GOBL party with the Mexican SAT by generating a link for them to use to upload their certificate.
The following templates help you get started quickly. Use them as is or as a base for your own flows. Mark suppliers as `registered` after successful onboarding. ```json Example SAT supplier post-registration workflow theme={"system"} { "name": "SAT supplier post-registration", "description": "Mark a SAT supplier as registered", "schema": "org/party", "steps": [ { "id": "7e8d8070-3870-11ef-af29-4533d56cea03", "name": "Set state", "config": { "state": "registered" }, "summary": "Set state to `registered`{.state .registered}", "provider": "silo.state" } ], "rescue": [] } ``` Adds a registration link to a supplier to upload digital certificates to issue CFDI-compliant e-invoices. ```json Example SAT register supplier workflow theme={"system"} { "name": "SAT register supplier", "description": "Register a supplier with SAT", "schema": "org/party", "steps": [ { "id": "1a9bcde0-a816-11ef-87b2-fd751e6d3b88", "name": "Sign envelope", "provider": "silo.close" }, { "id": "2061c540-a816-11ef-87b2-fd751e6d3b88", "name": "Register supplier with SAT", "provider": "sat-mx.register" }, { "id": "6f9282a0-3870-11ef-af29-4533d56cea03", "name": "Set state", "config": { "state": "processing" }, "summary": "Set state to `processing`{.state .processing}", "provider": "silo.state" } ], "rescue": [ { "id": "9a7b3d50-1358-11ef-af96-a18cfb3774fa", "name": "Set state", "config": { "state": "error" }, "provider": "silo.state", "summary": "Set state to `error`{.state .error}" } ] } ``` Removes a supplier's registration so it can no longer issue CFDI-compliant e-invoices from this workspace. ```json Example SAT unregister supplier workflow theme={"system"} { "name": "SAT unregister supplier", "description": "Unregister a supplier from SAT", "schema": "org/party", "steps": [ { "id": "23affb5e-c15f-4b7b-9517-eaaf4ebd37c1", "name": "Unregister supplier from SAT", "provider": "sat-mx.unregister" }, { "id": "45280ede-ab86-4e76-b55e-7ee744460748", "name": "Set state", "provider": "silo.state", "summary": "Set state to `void`{.state .void}", "config": { "state": "void" } } ], "rescue": [ { "id": "47816a6b-fa58-4b89-ae73-a8eee8e43b0a", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` Issue a CFDI through SAT with optional PDF generation. ```json Example SAT issue invoice workflow theme={"system"} { "name": "SAT issue invoice", "description": "Issue an invoice through SAT and generate PDF", "schema": "bill/invoice", "steps": [ { "id": "3cbf8d50-a819-11ef-87b2-fd751e6d3b88", "name": "Add sequential code", "provider": "sequence.enumerate", "summary": "Dynamic · SAT Invoices · 000001", "config": { "name": "SAT Invoices", "padding": 6, "start": 1 } }, { "id": "fc75e4f0-8721-11ef-a962-73e3f2037a52", "name": "Sign envelope", "provider": "silo.close" }, { "id": "1f60a0b0-ea9f-11ee-8846-3d414f6173e4", "name": "Send document to SAT", "config": { "generate_pdf": false, "prepaid": false }, "provider": "sat-mx" }, { "id": "7a645420-1358-11ef-af96-a18cfb3774fa", "name": "Generate PDF", "provider": "pdf", "summary": "English · Letter", "config": { "layout": "Letter", "logo_height": 40, "locale": "en", "date_format": "%Y-%m-%d" } }, { "id": "85bf20c0-1358-11ef-af96-a18cfb3774fa", "name": "Set state", "config": { "state": "sent" }, "provider": "silo.state", "summary": "Set state to `sent`{.state .sent}" } ], "rescue": [ { "id": "9a7b3d50-1358-11ef-af96-a18cfb3774fa", "name": "Set state", "config": { "state": "error" }, "provider": "silo.state", "summary": "Set state to `error`{.state .error}" } ] } ``` Convert a CFDI XML document to GOBL format with PDF generation. Used as the conversion step in the [bulk import flow](/guides/mx-sat-receiving). ```json Example SAT import CFDI workflow theme={"system"} { "name": "SAT import CFDI", "description": "Import a CFDI received through SAT", "schema": "bill/invoice", "steps": [ { "id": "6346e330-14cc-11f1-85d2-9d77c04210bc", "name": "Import CFDI from SAT", "provider": "sat-mx.import" }, { "id": "74f01110-14cc-11f1-85d2-9d77c04210bc", "name": "Set state", "provider": "silo.state", "summary": "Set state to `received`{.state .received}", "config": { "state": "received" } } ], "rescue": [ { "id": "e5f6a7b0-1a2b-11f0-b001-4a5b6c7d8e9f", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` Paste into the Invopop Console (developer mode) or GOBL Builder. An RFC with the `mx-cfdi-fiscal-regime` extension and the registered postal code (Lugar de Expedición). ```json Mexico supplier example theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "ESCUELA KEMPER URGATE", "tax_id": { "country": "MX", "code": "EKU9003173C9" }, "addresses": [ { "code": "26015", "country": "MX" } ], "ext": { "mx-cfdi-fiscal-regime": "601" } } ``` Mexican customers require the `mx-cfdi-fiscal-regime` and `mx-cfdi-use` extensions plus the registered 5-digit postal code (Domicilio Fiscal). ```json Mexico customer example theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "UNIVERSIDAD ROBOTICA ESPANOLA", "tax_id": { "country": "MX", "code": "URE180429TM6" }, "addresses": [ { "code": "86991", "country": "MX" } ], "ext": { "mx-cfdi-fiscal-regime": "601", "mx-cfdi-use": "G03" } } ``` This main type of invoice is a standard B2B invoice from a Mexican supplier to another Mexican customer. Notice: * we've added the [`mx-cfdi-v4`](https://docs.gobl.org/addons/mx-cfdi-v4) addon, this ensures the document will be validated using the CFDI v4 rules built into the [GOBL](https://docs.gobl.org) library, * extensions (`ext`) fields have been used in multiple locations for fields whose values cannot be determined any other way, * VAT will be applied at the standard rate, the percentage will be set automatically, and, * there are no totals nor calculations, all of these will be made automatically when uploading. ```json SAT B2B Invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "MX", "$addons": [ "mx-cfdi-v4" ], "series": "XXMX", "tax": { "ext": { "mx-cfdi-issue-place": "44100" } }, "supplier": { "uuid": "018fbeda-bc61-7000-b66d-398ce3e21c43", "name": "ESCUELA KEMPER URGATE", "tax_id": { "country": "MX", "code": "EKU9003173C9" }, "addresses": [ { "street": "Julia Navarrete No. 1430", "locality": "Guadalajara", "region": "Jalisco", "code": "44100", "country": "MX" } ], "emails": [ { "addr": "esckemperugarte@example.com" } ], "ext": { "mx-cfdi-fiscal-regime": "601" } }, "customer": { "name": "UNIVERSIDAD ROBOTICA ESPAÑOLA", "tax_id": { "country": "MX", "code": "URE180429TM6" }, "addresses": [ { "locality": "Ciudad de Mexico", "region": "Ciudad de Mexico", "code": "86991", "country": "MX" } ], "ext": { "mx-cfdi-fiscal-regime": "601", "mx-cfdi-post-code": "86991", "mx-cfdi-use": "G01" } }, "lines": [ { "quantity": "1", "item": { "name": "Standard Plan", "price": "1000.00", "ext": { "mx-cfdi-prod-serv": "81112002" } }, "taxes": [ { "cat": "VAT", "rate": "standard" } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "MX", "$addons": [ "mx-cfdi-v4" ], "type": "standard", "series": "XXMX", "issue_date": "2026-07-08", "issue_time": "08:51:26", "currency": "MXN", "tax": { "ext": { "mx-cfdi-doc-type": "I", "mx-cfdi-issue-place": "44100", "mx-cfdi-payment-method": "PPD" } }, "supplier": { "uuid": "018fbeda-bc61-7000-b66d-398ce3e21c43", "name": "ESCUELA KEMPER URGATE", "tax_id": { "country": "MX", "code": "EKU9003173C9" }, "addresses": [ { "street": "Julia Navarrete No. 1430", "locality": "Guadalajara", "region": "Jalisco", "code": "44100", "country": "MX" } ], "emails": [ { "addr": "esckemperugarte@example.com" } ], "ext": { "mx-cfdi-fiscal-regime": "601" } }, "customer": { "name": "UNIVERSIDAD ROBOTICA ESPAÑOLA", "tax_id": { "country": "MX", "code": "URE180429TM6" }, "addresses": [ { "locality": "Ciudad de Mexico", "region": "Ciudad de Mexico", "code": "86991", "country": "MX" } ], "ext": { "mx-cfdi-fiscal-regime": "601", "mx-cfdi-use": "G01" } }, "lines": [ { "i": 1, "quantity": "1", "item": { "name": "Standard Plan", "price": "1000.00", "ext": { "mx-cfdi-prod-serv": "81112002" } }, "sum": "1000.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "16.0%" } ], "total": "1000.00" } ], "totals": { "sum": "1000.00", "total": "1000.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "base": "1000.00", "percent": "16.0%", "amount": "160.00" } ], "amount": "160.00" } ], "sum": "160.00" }, "tax": "160.00", "total_with_tax": "1160.00", "payable": "1160.00" } } ``` This invoice is used when the **issuer (supplier)** bills the customer **on behalf of another taxpayer** who is the real seller — for example **consignment** sales. The **third party** is identified on each line in the `seller` object (RFC, fiscal regime, address), while `supplier` remains the party issuing the CFDI. Notice: * the line `seller` carries the third party's tax identity and regime so SAT can relate the CFDI to **cuenta de terceros** rules, * the [`mx-cfdi-v4`](https://docs.gobl.org/addons/mx-cfdi-v4) addon validates extensions on supplier, customer, and line seller, * the minimal `tax.ext` only needs the place of issue; `gobl build` adds document type and payment method (`PPD` in the built example) like other B2B invoices, * there are no totals in the minimal version; upload or `gobl build` will compute IVA and totals, and, * the built example shows a consignment-style line (`Venta en consignación`) with full tax breakdown. ```json SAT third-party invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "MX", "$addons": [ "mx-cfdi-v4" ], "series": "LMC", "code": "002", "issue_time": "01:42:18", "tax": { "ext": { "mx-cfdi-issue-place": "26015" } }, "supplier": { "name": "ESCUELA KEMPER URGATE", "tax_id": { "country": "MX", "code": "EKU9003173C9" }, "ext": { "mx-cfdi-fiscal-regime": "601" } }, "customer": { "name": "UNIVERSIDAD ROBOTICA ESPAÑOLA", "tax_id": { "country": "MX", "code": "URE180429TM6" }, "addresses": [ { "code": "86991" } ], "ext": { "mx-cfdi-fiscal-regime": "601", "mx-cfdi-use": "G01" } }, "lines": [ { "quantity": "2", "item": { "name": "Venta en consignación", "price": "100.00", "ext": { "mx-cfdi-prod-serv": "50211502" } }, "taxes": [ { "cat": "VAT", "percent": "16.0%" } ], "seller": { "name": "XENON INDUSTRIAL ARTICLES", "tax_id": { "country": "MX", "code": "XIA190128J61" }, "addresses": [ { "code": "76343" } ], "ext": { "mx-cfdi-fiscal-regime": "601" } } } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "MX", "$addons": [ "mx-cfdi-v4" ], "type": "standard", "series": "LMC", "code": "002", "issue_date": "2026-07-08", "issue_time": "01:42:18", "currency": "MXN", "tax": { "ext": { "mx-cfdi-doc-type": "I", "mx-cfdi-issue-place": "26015", "mx-cfdi-payment-method": "PPD" } }, "supplier": { "name": "ESCUELA KEMPER URGATE", "tax_id": { "country": "MX", "code": "EKU9003173C9" }, "ext": { "mx-cfdi-fiscal-regime": "601" } }, "customer": { "name": "UNIVERSIDAD ROBOTICA ESPAÑOLA", "tax_id": { "country": "MX", "code": "URE180429TM6" }, "addresses": [ { "code": "86991" } ], "ext": { "mx-cfdi-fiscal-regime": "601", "mx-cfdi-use": "G01" } }, "lines": [ { "i": 1, "quantity": "2", "item": { "name": "Venta en consignación", "price": "100.00", "ext": { "mx-cfdi-prod-serv": "50211502" } }, "sum": "200.00", "taxes": [ { "cat": "VAT", "key": "standard", "percent": "16.0%" } ], "total": "200.00", "seller": { "name": "XENON INDUSTRIAL ARTICLES", "tax_id": { "country": "MX", "code": "XIA190128J61" }, "addresses": [ { "code": "76343" } ], "ext": { "mx-cfdi-fiscal-regime": "601" } } } ], "totals": { "sum": "200.00", "total": "200.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "base": "200.00", "percent": "16.0%", "amount": "32.00" } ], "amount": "32.00" } ], "sum": "32.00" }, "tax": "32.00", "total_with_tax": "232.00", "payable": "232.00" } } ``` This is a standard B2C invoice from a Mexican supplier to a Mexican physical person with tax details, but no specific tax declaration requirements. This would be for a larger sale when the "Simplified" and "Global invoice" do not apply. In addition to the observations for regular B2B invoices, note in the customer: * the presence of an RFC in the same format as for companies, and, * the [`mx-cfdi-fiscal-regime`](https://docs.gobl.org/addons/mx-cfdi-v4#fiscal-regime-code) and [`mx-cfdi-use`](https://docs.gobl.org/addons/mx-cfdi-v4#cfdi-use-code) extensions have been set to `616` and `S01` respectively reflecting that the customer is not subject to tax. It is important in Mexico to ensure the correct Fiscal Regime and CFDI Use codes are set correctly as the SAT will check these details and reject documents with unexpected combinations. ```json SAT B2C Invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "MX", "$addons": [ "mx-cfdi-v4" ], "series": "XXMX", "tax": { "ext": { "mx-cfdi-issue-place": "44100" } }, "supplier": { "uuid": "018fbeda-bc61-7000-b66d-398ce3e21c43", "name": "ESCUELA KEMPER URGATE", "tax_id": { "country": "MX", "code": "EKU9003173C9" }, "addresses": [ { "street": "Julia Navarrete No. 1430", "locality": "Guadalajara", "region": "Jalisco", "code": "44100", "country": "MX" } ], "emails": [ { "addr": "esckemperugarte@example.com" } ], "ext": { "mx-cfdi-fiscal-regime": "601" } }, "customer": { "name": "LUIS IAN ÑUZCO", "tax_id": { "country": "MX", "code": "IAÑL750210963" }, "addresses": [ { "locality": "Ciudad de Mexico", "region": "Ciudad de Mexico", "code": "85256", "country": "MX" } ], "ext": { "mx-cfdi-fiscal-regime": "616", "mx-cfdi-use": "S01" } }, "lines": [ { "quantity": "1", "item": { "name": "Standard Plan", "price": "500.00", "ext": { "mx-cfdi-prod-serv": "81112002" } }, "taxes": [ { "cat": "VAT", "rate": "standard" } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "MX", "$addons": [ "mx-cfdi-v4" ], "type": "standard", "series": "XXMX", "issue_date": "2026-07-08", "issue_time": "08:51:26", "currency": "MXN", "tax": { "ext": { "mx-cfdi-doc-type": "I", "mx-cfdi-issue-place": "44100", "mx-cfdi-payment-method": "PPD" } }, "supplier": { "uuid": "018fbeda-bc61-7000-b66d-398ce3e21c43", "name": "ESCUELA KEMPER URGATE", "tax_id": { "country": "MX", "code": "EKU9003173C9" }, "addresses": [ { "street": "Julia Navarrete No. 1430", "locality": "Guadalajara", "region": "Jalisco", "code": "44100", "country": "MX" } ], "emails": [ { "addr": "esckemperugarte@example.com" } ], "ext": { "mx-cfdi-fiscal-regime": "601" } }, "customer": { "name": "LUIS IAN ÑUZCO", "tax_id": { "country": "MX", "code": "IAÑL750210963" }, "addresses": [ { "locality": "Ciudad de Mexico", "region": "Ciudad de Mexico", "code": "85256", "country": "MX" } ], "ext": { "mx-cfdi-fiscal-regime": "616", "mx-cfdi-use": "S01" } }, "lines": [ { "i": 1, "quantity": "1", "item": { "name": "Standard Plan", "price": "500.00", "ext": { "mx-cfdi-prod-serv": "81112002" } }, "sum": "500.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "16.0%" } ], "total": "500.00" } ], "totals": { "sum": "500.00", "total": "500.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "base": "500.00", "percent": "16.0%", "amount": "80.00" } ], "amount": "80.00" } ], "sum": "80.00" }, "tax": "80.00", "total_with_tax": "580.00", "payable": "580.00" } } ``` In Mexico, a General Public Invoice (Factura al Público en General) is a type of tax document issued to record sales made to customers who do not request an invoice with a specific Federal Taxpayer Registry (RFC) number. Instead, a generic RFC is used to identify the recipient: * XAXX010101000 for domestic transactions * XEXX010101000 for foreign transactions This type of invoice is mandatory for businesses that sell to the general public and do not issue individual invoices for each transaction. To create this type of invoice in Invopop: * the `customer` field is not required, * the `$tags` field is used to identify this as a simplified invoice. ```json SAT Mexico simplified invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "MX", "$addons": [ "mx-cfdi-v4" ], "$tags": [ "simplified" ], "series": "TEST", "code": "00001", "tax": { "ext": { "mx-cfdi-issue-place": "44100" } }, "supplier": { "name": "ESCUELA KEMPER URGATE", "tax_id": { "country": "MX", "code": "EKU9003173C9" }, "ext": { "mx-cfdi-fiscal-regime": "601" } }, "lines": [ { "quantity": "1", "item": { "name": "Cobro por tarjetas", "price": "10.00", "ext": { "mx-cfdi-prod-serv": "84141602" } }, "discounts": [ { "percent": "10.0%", "amount": "1.00" } ], "taxes": [ { "cat": "VAT", "rate": "standard" } ] }, { "quantity": "1", "item": { "name": "Porcentaje sobre GMV", "price": "10.00", "unit": "service", "ext": { "mx-cfdi-prod-serv": "80141628" } }, "taxes": [ { "cat": "VAT", "rate": "standard" } ] } ], "payment": { "terms": { "notes": "Condiciones de pago" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "MX", "$addons": [ "mx-cfdi-v4" ], "$tags": [ "simplified" ], "type": "standard", "series": "TEST", "code": "00001", "issue_date": "2026-07-08", "issue_time": "08:51:26", "currency": "MXN", "tax": { "ext": { "mx-cfdi-doc-type": "I", "mx-cfdi-issue-place": "44100", "mx-cfdi-payment-method": "PPD" } }, "supplier": { "name": "ESCUELA KEMPER URGATE", "tax_id": { "country": "MX", "code": "EKU9003173C9" }, "ext": { "mx-cfdi-fiscal-regime": "601" } }, "lines": [ { "i": 1, "quantity": "1", "item": { "name": "Cobro por tarjetas", "price": "10.00", "ext": { "mx-cfdi-prod-serv": "84141602" } }, "sum": "10.00", "discounts": [ { "percent": "10.0%", "amount": "1.00" } ], "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "16.0%" } ], "total": "9.00" }, { "i": 2, "quantity": "1", "item": { "name": "Porcentaje sobre GMV", "price": "10.00", "unit": "service", "ext": { "mx-cfdi-prod-serv": "80141628" } }, "sum": "10.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "16.0%" } ], "total": "10.00" } ], "payment": { "terms": { "notes": "Condiciones de pago" } }, "totals": { "sum": "19.00", "total": "19.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "base": "19.00", "percent": "16.0%", "amount": "3.04" } ], "amount": "3.04" } ], "sum": "3.04" }, "tax": "3.04", "total_with_tax": "22.04", "payable": "22.04" } } ``` The Global Invoice is used to group a set of invoices into a single CFDI document. Notice: * the `$tags` field has been used to identify this as a global invoice, * each `line` has a `ref` which is used to identify the invoice that it belongs to, * the [`tax.ext.mx-cfdi-global-month`](https://docs.gobl.org/addons/mx-cfdi-v4#cfdi-global-month), [`mx-cfdi-global-period`](https://docs.gobl.org/addons/mx-cfdi-v4#cfdi-global-period), and [`mx-cfdi-global-year`](https://docs.gobl.org/addons/mx-cfdi-v4#cfdi-global-year) fields have been used to identify the global invoice period. ```json SAT Mexico global invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "mx-cfdi-v4" ], "$tags": [ "global" ], "series": "GLOBAL", "code": "0001", "tax": { "ext": { "mx-cfdi-global-month": "03", "mx-cfdi-global-period": "04", "mx-cfdi-global-year": "2025", "mx-cfdi-issue-place": "44100" } }, "supplier": { "name": "ESCUELA KEMPER URGATE", "tax_id": { "country": "MX", "code": "EKU9003173C9" }, "ext": { "mx-cfdi-fiscal-regime": "601" } }, "lines": [ { "quantity": "1", "item": { "ref": "SALE1", "name": "Sale 1", "price": "10.00" }, "discounts": [ { "percent": "10.0%" } ], "taxes": [ { "cat": "VAT", "rate": "standard" } ] }, { "quantity": "1", "item": { "ref": "SALE2", "name": "Sale 2", "price": "20.00" }, "taxes": [ { "cat": "VAT", "rate": "standard" } ] } ], "payment": { "advances": [ { "key": "cash", "description": "Prepaid", "percent": "100%" } ] } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "MX", "$addons": [ "mx-cfdi-v4" ], "$tags": [ "global" ], "type": "standard", "series": "GLOBAL", "code": "0001", "issue_date": "2026-07-08", "issue_time": "08:51:26", "currency": "MXN", "tax": { "ext": { "mx-cfdi-doc-type": "I", "mx-cfdi-global-month": "03", "mx-cfdi-global-period": "04", "mx-cfdi-global-year": "2025", "mx-cfdi-issue-place": "44100", "mx-cfdi-payment-method": "PUE" } }, "supplier": { "name": "ESCUELA KEMPER URGATE", "tax_id": { "country": "MX", "code": "EKU9003173C9" }, "ext": { "mx-cfdi-fiscal-regime": "601" } }, "lines": [ { "i": 1, "quantity": "1", "item": { "ref": "SALE1", "name": "Sale 1", "price": "10.00" }, "sum": "10.00", "discounts": [ { "percent": "10.0%", "amount": "1.00" } ], "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "16.0%" } ], "total": "9.00" }, { "i": 2, "quantity": "1", "item": { "ref": "SALE2", "name": "Sale 2", "price": "20.00" }, "sum": "20.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "16.0%" } ], "total": "20.00" } ], "payment": { "advances": [ { "key": "cash", "description": "Prepaid", "percent": "100%", "amount": "33.64", "ext": { "mx-cfdi-payment-means": "01" } } ] }, "totals": { "sum": "29.00", "total": "29.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "base": "29.00", "percent": "16.0%", "amount": "4.64" } ], "amount": "4.64" } ], "sum": "4.64" }, "tax": "4.64", "total_with_tax": "33.64", "payable": "33.64", "advance": "33.64", "due": "0.00" } } ``` The credit note (*nota de crédito*) is used to correct, cancel, or refund a previously issued invoice. Notice: * the `type` field has been set to `credit-note`, * the `preceding` field has been used to identify the invoice that is being corrected. ```json SAT Mexico credit note theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "mx-cfdi-v4" ], "type": "credit-note", "series": "CN", "code": "0003", "preceding": [ { "series": "TEST", "code": "0001", "issue_date": "2023-07-10", "stamps": [ { "prv": "sat-uuid", "val": "1fac4464-1111-0000-1111-cd37179db12e" } ] } ], "supplier": { "name": "ESCUELA KEMPER URGATE", "tax_id": { "country": "MX", "code": "EKU9003173C9" }, "addresses": [ { "street": "Julia Navarrete No. 1430", "locality": "Guadalajara", "region": "Jalisco", "code": "44100", "country": "MX" } ], "ext": { "mx-cfdi-fiscal-regime": "615" } }, "customer": { "name": "UNIVERSIDAD ROBOTICA ESPAÑOLA", "tax_id": { "country": "MX", "code": "URE180429TM6" }, "addresses": [ { "locality": "Ciudad de Mexico", "region": "Ciudad de Mexico", "code": "86991", "country": "MX" } ], "ext": { "mx-cfdi-fiscal-regime": "624", "mx-cfdi-use": "G01" } }, "lines": [ { "quantity": "2", "item": { "name": "Cigarros", "ext": { "mx-cfdi-prod-serv": "50211502" }, "price": "100.1010", "unit": "piece" }, "taxes": [ { "cat": "VAT", "rate": "standard" } ] } ], "payment": { "terms": { "notes": "Pago a 30 días." } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "MX", "$addons": [ "mx-cfdi-v4" ], "type": "credit-note", "series": "CN", "code": "0003", "issue_date": "2026-07-08", "issue_time": "08:53:24", "currency": "MXN", "preceding": [ { "issue_date": "2023-07-10", "series": "TEST", "code": "0001", "stamps": [ { "prv": "sat-uuid", "val": "1fac4464-1111-0000-1111-cd37179db12e" } ] } ], "tax": { "ext": { "mx-cfdi-doc-type": "E", "mx-cfdi-issue-place": "44100", "mx-cfdi-payment-method": "PPD", "mx-cfdi-rel-type": "01" } }, "supplier": { "name": "ESCUELA KEMPER URGATE", "tax_id": { "country": "MX", "code": "EKU9003173C9" }, "addresses": [ { "street": "Julia Navarrete No. 1430", "locality": "Guadalajara", "region": "Jalisco", "code": "44100", "country": "MX" } ], "ext": { "mx-cfdi-fiscal-regime": "615" } }, "customer": { "name": "UNIVERSIDAD ROBOTICA ESPAÑOLA", "tax_id": { "country": "MX", "code": "URE180429TM6" }, "addresses": [ { "locality": "Ciudad de Mexico", "region": "Ciudad de Mexico", "code": "86991", "country": "MX" } ], "ext": { "mx-cfdi-fiscal-regime": "624", "mx-cfdi-use": "G01" } }, "lines": [ { "i": 1, "quantity": "2", "item": { "name": "Cigarros", "price": "100.1010", "unit": "piece", "ext": { "mx-cfdi-prod-serv": "50211502" } }, "sum": "200.2020", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "16.0%" } ], "total": "200.2020" } ], "payment": { "terms": { "notes": "Pago a 30 días." } }, "totals": { "sum": "200.20", "total": "200.20", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "base": "200.20", "percent": "16.0%", "amount": "32.03" } ], "amount": "32.03" } ], "sum": "32.03" }, "tax": "32.03", "total_with_tax": "232.23", "payable": "232.23" } } ``` This is a payment receipt (*comprobante de pago*, or REP) issued when collecting a payment against one or more invoices that were issued with the PPD (*Pago en Parcialidades o Diferido*) payment method. It is modelled as a GOBL [`bill.Payment`](https://docs.gobl.org/draft-0/bill/payment) document rather than an invoice, and must be processed through the SAT issue payment workflow. Notice: * the `$schema` is set to `bill/payment` and the `type` to `receipt`, * each `lines[].document` references an invoice being settled by this payment, identified by its `series`, `code`, and the SAT UUID (`sat-uuid`) stamp of the original CFDI, * the amounts on each line follow a strict convention: * **`payable`** is always the **total** amount payable on the referenced invoice across **all** installments, * **`advances`** is the **total** already paid in **previous** installments (omit it, or set `0`, on the first installment), * **`amount`** is the portion of the invoice settled by **this** payment, * **`installment`** is the ordinal of this payment against the invoice, * **`due`** is calculated **automatically** from the other fields; you don't need to set it yourself, * the third line (invoice `LMC` `0023`) illustrates a later installment that doesn't fully settle the invoice: `payable` `1000.00`, `advances` `500.00` already paid, `amount` `250.00` paid now, leaving a positive `due` of `250.00` for a future receipt, * lines carry the tax breakdown of the invoice being paid, including retained taxes, * the single `methods` entry describes how the payment was received; `gobl build` maps the `credit-transfer` key to the [`mx-cfdi-payment-means`](https://docs.gobl.org/addons/mx-cfdi-v4#payment-means) extension `03`, * other extensions that are set automatically on running `gobl build`: the document [`mx-cfdi-doc-type`](https://docs.gobl.org/addons/mx-cfdi-v4#document-type) is set to `P` and the customer's [`mx-cfdi-use`](https://docs.gobl.org/addons/mx-cfdi-v4#cfdi-use-code) to `CP01`, * this particular example also carries a `preceding` block, which implies that this receipt **substitutes** one previously issued — `gobl build` fills in the [`mx-cfdi-rel-type`](https://docs.gobl.org/addons/mx-cfdi-v4#relation-type) extension `04` (*Sustitución de los CFDI previos*) (omit the `preceding` block when the receipt is not a replacement), and, * there are no totals in the minimal version; running `gobl build` calculates the line taxes, the payment total, and all balances. ```json SAT Payment (Comprobante de Pago) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/payment", "$regime": "MX", "$addons": [ "mx-cfdi-v4" ], "type": "receipt", "series": "P", "code": "0040", "currency": "MXN", "ext": { "mx-cfdi-issue-place": "44100" }, "preceding": [ { "issue_date": "2023-05-31", "series": "P", "code": "0039", "stamps": [ { "prv": "sat-uuid", "val": "3e2d1c0b-9a8f-4e7d-8c6b-5a4f3e2d1c0b" } ] } ], "supplier": { "name": "ESCUELA KEMPER URGATE", "tax_id": { "country": "MX", "code": "EKU9003173C9" }, "addresses": [ { "street": "Julia Navarrete No. 1430", "locality": "Guadalajara", "region": "Jalisco", "code": "44100", "country": "MX" } ], "emails": [ { "addr": "esckemperugarte@example.com" } ], "ext": { "mx-cfdi-fiscal-regime": "601" } }, "customer": { "name": "UNIVERSIDAD ROBOTICA ESPAÑOLA", "tax_id": { "country": "MX", "code": "URE180429TM6" }, "addresses": [ { "locality": "Ciudad de Mexico", "region": "Ciudad de Mexico", "code": "86991", "country": "MX" } ], "ext": { "mx-cfdi-fiscal-regime": "601" } }, "lines": [ { "document": { "issue_date": "2023-05-10", "series": "LMC", "code": "0021", "stamps": [ { "prv": "sat-uuid", "val": "0f4d2a6e-8b1c-4d3e-9f5a-7c6b5a4d3e2f" } ] }, "installment": 1, "payable": "9533.33", "amount": "9533.33", "tax": { "categories": [ { "code": "VAT", "rates": [ { "base": "10000.00", "percent": "16.0%" } ] }, { "code": "RVAT", "retained": true, "rates": [ { "base": "10000.00", "percent": "10.6667%" } ] }, { "code": "ISR", "retained": true, "rates": [ { "base": "10000.00", "percent": "10%" } ] } ] } }, { "document": { "issue_date": "2023-05-20", "series": "LMC", "code": "0022", "stamps": [ { "prv": "sat-uuid", "val": "5b9c8d7e-6f5a-4b3c-8d2e-1f0a9b8c7d6e" } ] }, "installment": 1, "payable": "1660.00", "amount": "1660.00", "tax": { "categories": [ { "code": "VAT", "rates": [ { "base": "1000.00", "percent": "16.0%" }, { "base": "500.00" } ] } ] } }, { "document": { "issue_date": "2023-03-15", "series": "LMC", "code": "0023", "stamps": [ { "prv": "sat-uuid", "val": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d" } ] }, "installment": 3, "payable": "1000.00", "advances": "500.00", "amount": "250.00" } ], "methods": [ { "date": "2023-05-30", "key": "credit-transfer", "ref": "MX0123456789", "amount": "11443.33" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/payment", "$regime": "MX", "$addons": [ "mx-cfdi-v4" ], "type": "receipt", "series": "P", "code": "0040", "issue_date": "2026-07-23", "issue_time": "04:13:11", "currency": "MXN", "ext": { "mx-cfdi-doc-type": "P", "mx-cfdi-issue-place": "44100" }, "preceding": [ { "issue_date": "2023-05-31", "series": "P", "code": "0039", "stamps": [ { "prv": "sat-uuid", "val": "3e2d1c0b-9a8f-4e7d-8c6b-5a4f3e2d1c0b" } ], "ext": { "mx-cfdi-rel-type": "04" } } ], "supplier": { "name": "ESCUELA KEMPER URGATE", "tax_id": { "country": "MX", "code": "EKU9003173C9" }, "addresses": [ { "street": "Julia Navarrete No. 1430", "locality": "Guadalajara", "region": "Jalisco", "code": "44100", "country": "MX" } ], "emails": [ { "addr": "esckemperugarte@example.com" } ], "ext": { "mx-cfdi-fiscal-regime": "601" } }, "customer": { "name": "UNIVERSIDAD ROBOTICA ESPAÑOLA", "tax_id": { "country": "MX", "code": "URE180429TM6" }, "addresses": [ { "locality": "Ciudad de Mexico", "region": "Ciudad de Mexico", "code": "86991", "country": "MX" } ], "ext": { "mx-cfdi-fiscal-regime": "601", "mx-cfdi-use": "CP01" } }, "lines": [ { "i": 1, "document": { "issue_date": "2023-05-10", "series": "LMC", "code": "0021", "stamps": [ { "prv": "sat-uuid", "val": "0f4d2a6e-8b1c-4d3e-9f5a-7c6b5a4d3e2f" } ] }, "installment": 1, "payable": "9533.33", "amount": "9533.33", "due": "0.00", "tax": { "categories": [ { "code": "VAT", "rates": [ { "base": "10000.00", "percent": "16.0%", "amount": "1600.00" } ], "amount": "1600.00" }, { "code": "RVAT", "retained": true, "rates": [ { "base": "10000.00", "percent": "10.6667%", "amount": "1066.67" } ], "amount": "1066.67" }, { "code": "ISR", "retained": true, "rates": [ { "base": "10000.00", "percent": "10%", "amount": "1000.00" } ], "amount": "1000.00" } ], "sum": "1600.00", "retained": "2066.67" } }, { "i": 2, "document": { "issue_date": "2023-05-20", "series": "LMC", "code": "0022", "stamps": [ { "prv": "sat-uuid", "val": "5b9c8d7e-6f5a-4b3c-8d2e-1f0a9b8c7d6e" } ] }, "installment": 1, "payable": "1660.00", "amount": "1660.00", "due": "0.00", "tax": { "categories": [ { "code": "VAT", "rates": [ { "base": "1000.00", "percent": "16.0%", "amount": "160.00" }, { "base": "500.00", "amount": "0.00" } ], "amount": "160.00" } ], "sum": "160.00" } }, { "i": 3, "document": { "issue_date": "2023-03-15", "series": "LMC", "code": "0023", "stamps": [ { "prv": "sat-uuid", "val": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d" } ] }, "installment": 3, "payable": "1000.00", "advances": "500.00", "amount": "250.00", "due": "250.00" } ], "methods": [ { "date": "2023-05-30", "key": "credit-transfer", "ref": "MX0123456789", "amount": "11443.33", "ext": { "mx-cfdi-payment-means": "03" } } ], "total": "11443.33" } ``` Copy and paste these documents into the [GOBL builder](https://build.gobl.org) in order to preview and verify them.
*** | | | | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Compliance | [Invoicing compliance in Mexico](/compliance/mexico)
[Compliance timeline](/timelines/mexico) | | Apps | [SAT Mexico](/apps/sat-mexico)
[SW Sapien](/apps/sw-sapien)
[Cron](/apps/cron) | | Guides | [Supplier registration](/guides/mx-sat-supplier)
[Issuing documents](/guides/mx-sat-issuing)
[Receiving invoices](/guides/mx-sat-receiving) | | FAQ | [Mexico FAQ](/faq/mexico) | | GOBL | [Mexico Tax Regime](https://docs.gobl.org/regimes/mx)
[Mexican SAT CFDI Addon](https://docs.gobl.org/addons/mx-cfdi-v4) | | GitHub | [gobl.cfdi](https://github.com/invopop/gobl.cfdi) |
Ask and answer questions about SAT Mexico App → # Saudi Arabia Source: https://docs.invopop.com/apps/saudi-arabia Clear and report e-invoices with ZATCA's FATOORA platform

View guide › View guide ›
| | | | --------- | ---------------------------------------- | | Developer | [Invopop](https://invopop.com) | | Category | Government | | Scope | B2B, B2G, B2C | | Country | [Saudi Arabia](/compliance/saudi-arabia) | | System | FATOORA (ZATCA) |
Invopop's **Saudi Arabia app** connects your workspace to **ZATCA**'s **FATOORA** platform as an approved e-invoicing solution (EGS). It onboards parties, clears standard invoices and reports simplified ones. **Key features** * **Clearance** of standard tax invoices (B2B, B2G). * **Reporting** of simplified tax invoices (B2C). * ZATCA onboarding: OTP, compliance checks, and production CSID provisioning. * UBL 2.1 with KSA extensions, ICV/PIH chaining, and the Phase 2 QR code. Check out the guides below to get started: * [Clearance & Reporting](/guides/sa-zatca-clearance-reporting) · [Registration](/guides/sa-zatca-registration) ## FAQ Invoicing questions From the GOBL invoice type. **Simplified** invoices (B2C) are **reported** to ZATCA; all **standard** invoices (B2B and B2G) are **cleared**. **Before you share it with the buyer.** Standard invoices follow the clearance model: Invopop submits the invoice to ZATCA in real time, ZATCA validates it and applies its cryptographic stamp, and the **cleared** document is returned. Only that cleared version is legally valid and shareable — so the invoice must go through Invopop before you send it on to the buyer. **Within 24 hours of issuing it.** Simplified invoices follow the reporting model, so you can give the invoice to the customer straight away at the point of sale — it does **not** need ZATCA validation first, and you can share it before it ever reaches Invopop. You then have up to **24 hours from issuance** to submit it to Invopop, which forwards it to ZATCA immediately when the workflow runs. No. Invopop calculates the Invoice Counter Value (ICV) and Previous Invoice Hash (PIH) internally on every submission. You only see them reflected in the generated invoice XML. ZATCA requires every document a party issues to form a single, unbroken cryptographic chain. Invopop maintains one chain **per party and environment** (sandbox simulation/developer vs. production are separate sequences), so each registered CSID has its own continuous counter. Two values link it together: * **ICV** starts at `1` for the first document and increments by exactly `1` for every document that follows. * **PIH** of the first document is the hash of the value `0` — the base case defined in ZATCA's data dictionary. Every document after that sets its PIH to the hash of the **immediately preceding document**. Each new document takes the hash of the immediately preceding document and increments ICV by 1, **irrespective of type and status**: * **Document type does not split the chain.** Standard invoices, simplified invoices, credit notes, and debit notes all share one sequence. * **Rejected documents still occupy their slot.** A document that ZATCA rejects keeps its ICV and hash; the next document chains off it, not off the last *accepted* one. For example, if invoice 2 is rejected, invoice 3 still uses `hash(invoice 2)` as its PIH and `ICV = 3`: | Document | ICV | PIH points to | ZATCA result | | ------------- | --- | ----------------------- | ------------ | | Invoice 1 | 1 | hash of `0` (base case) | Accepted | | Invoice 2 | 2 | hash(Invoice 1) | Rejected | | Invoice 3 | 3 | hash(Invoice 2) | Accepted | | Credit note 4 | 4 | hash(Invoice 3) | Accepted | In the **Files** section of the silo entry. After a successful submission the final XML is attached as `invoice.xml` — for standard invoices this is the ZATCA-cleared, stamped document. The QR code is also stamped onto the document. Registering supplier questions A workspace with the **Saudi Arabia** app enabled, and an `org/party` (the supplier) carrying: * a Saudi **VAT registration number**, * an **identity** of type `CRN`, `MOM`, `MLS`, `700`, `SAG`, or `OTH`, and * a complete **national address** (building number, postal code, district, street, additional street, and country). During the hosted onboarding wizard the supplier also provides the legal name, invoice type (`1000` standard / `0100` simplified / `1100` both), branch name, registered address, and business category — plus the FATOORA OTP. **1 hour** from when it is generated in the FATOORA portal. If it expires, generate a new one and re-enter it in the wizard. In **Developer** mode the OTP is not validated (any placeholder works) and you can only send invoices from ZATCA's fixed test VAT `399999999900003`. In **Simulation** mode the OTP must be real and you can send from any registered party. No. Simulation requires a real FATOORA account and taxpayer to generate a valid OTP. Use **Developer** mode if you want to test the flow without a real account. More answers in our [Saudi Arabia FAQ](/faq/saudi-arabia) section
The following workflow actions will be available once you install and enable this app. Registration Validate the party, stake the VAT claim, and publish the ZATCA onboarding link the supplier follows. Removes the party and its stored credentials from Invopop's internal systems. Wait for the supplier to complete onboarding, run the compliance checks, and issue the production CSID. Clearance & Reporting
1
Convert the GOBL invoice to UBL 2.1, chain it (ICV/PIH), and clear standard or report simplified invoices to ZATCA.
Registration ```json Example ZATCA register supplier workflow theme={"system"} { "name": "ZATCA register supplier", "description": "", "schema": "org/party", "steps": [ { "id": "f60b2e30-6fce-11f1-b09d-79f60b032746", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "fd448bb0-6fce-11f1-b09d-79f60b032746", "name": "Register supplier with ZATCA", "provider": "gov-sa.party.register", "config": { "mode": "simulation" } }, { "id": "0064b770-6fcf-11f1-b09d-79f60b032746", "name": "Wait for OTP submission", "provider": "gov-sa.wait.authorization" }, { "id": "0236df60-6fcf-11f1-b09d-79f60b032746", "name": "Set state", "provider": "silo.state", "summary": "Set state to `registered`{.state .registered}", "config": { "state": "registered" } } ], "rescue": [ { "id": "04aa0240-6fcf-11f1-b09d-79f60b032746", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` Clearance & Reporting ```json Example ZATCA send invoice workflow theme={"system"} { "name": "ZATCA send invoice", "description": "Clears standard invoices and reports simplified invoices to ZATCA", "schema": "bill/invoice", "steps": [ { "id": "cf001030-6fce-11f1-b09d-79f60b032746", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "d0badf90-6fce-11f1-b09d-79f60b032746", "name": "Send invoice to ZATCA", "provider": "gov-sa.invoice.send" }, { "id": "d5f9cca0-6fce-11f1-b09d-79f60b032746", "name": "Set state", "provider": "silo.state", "summary": "Set state to `sent`{.state .sent}", "config": { "state": "sent" } } ], "rescue": [ { "id": "d9c3a5e0-6fce-11f1-b09d-79f60b032746", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` All documents are GOBL [`bill.Invoice`](https://docs.gobl.org/draft/bill/invoice) envelopes with the [ZATCA add-on](https://docs.gobl.org/addons/sa-zatca-v1), rendered to UBL 2.1 with ZATCA's KSA extensions. The model (clearance or reporting) is derived from the document itself. | Document | Type | Model | | ---------------------- | -------- | -------------------------------- | | Standard tax invoice | B2B, B2G | Clearance | | Simplified tax invoice | B2C | Reporting | | Credit note | Any | Same as the document it corrects | | Debit note | Any | Same as the document it corrects | Party onboarding runs on an [`org.Party`](https://docs.gobl.org/draft/org/party) document via the registration workflow. ## Example documents A supplier with the 15-digit VAT registration number (starts and ends with `3`) and the CRN commercial registration identity ZATCA requires. ```json Saudi Arabia supplier example theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "Acme Corp Saudi", "tax_id": { "country": "SA", "code": "312345678912343" }, "identities": [ { "type": "CRN", "code": "1234567890" } ], "addresses": [ { "street": "King Fahd Road", "street_extra": "Al Olaya", "num": "1234", "locality": "Riyadh", "region": "Riyadh", "code": "12345", "country": "SA" } ] } ``` A business customer identified by a TIN identity and a full Saudi national address. ```json Saudi Arabia customer example theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "Sample Consumer LLC", "identities": [ { "type": "TIN", "code": "123456789012345" } ], "addresses": [ { "street": "Olaya Street", "street_extra": "Al Malaz", "num": "5678", "locality": "Riyadh", "region": "Riyadh", "code": "54321", "country": "SA" } ] } ``` Every example pairs the minimal hand-authored GOBL input with the built version produced by `gobl build`. All carry the [`sa-zatca-v1`](https://docs.gobl.org/addons/sa-zatca-v1) add-on. Standard invoices are cleared; simplified invoices are reported. ### Standard tax invoices (clearance) A standard tax invoice between two VAT-registered parties, billed at the 15% standard rate. This is the baseline document cleared with ZATCA before it is shared with the buyer. ```json Standard invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "sa-zatca-v1" ], "uuid": "3aea7b56-59d8-4beb-90bd-f8f280d852a0", "issue_date": "2022-02-01", "issue_time": "12:00:00", "code": "SAMPLE-001", "type": "standard", "regime": "SA", "supplier": { "tax_id": { "country": "SA", "code": "312345678912343" }, "name": "Acme Corp Saudi", "identities": [ { "type": "CRN", "code": "1234567890" } ], "addresses": [ { "street": "King Fahd Road", "street_extra": "Al Olaya", "num": "1234", "locality": "Riyadh", "region": "Riyadh", "code": "12345", "country": "SA" } ] }, "customer": { "identities": [ { "type": "TIN", "code": "123456789012345" } ], "name": "Sample Consumer LLC", "addresses": [ { "street": "Olaya Street", "street_extra": "Al Malaz", "num": "5678", "locality": "Riyadh", "region": "Riyadh", "code": "54321", "country": "SA" } ] }, "delivery": { "date": "2022-02-01", "period": { "start": "2022-02-01", "end": "2022-02-28" } }, "payment": { "instructions": { "key": "credit-transfer" }, "terms": { "notes": "Payment due within 30 days" } }, "lines": [ { "quantity": 20, "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "taxes": [ { "cat": "VAT", "rate": "standard" } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "SA", "$addons": [ "eu-en16931-v2017", "sa-zatca-v1" ], "uuid": "3aea7b56-59d8-4beb-90bd-f8f280d852a0", "type": "standard", "code": "SAMPLE-001", "issue_date": "2022-02-01", "issue_time": "12:00:00", "currency": "SAR", "tax": { "rounding": "currency", "ext": { "sa-zatca-invoice-type": "0100000", "untdid-document-type": "388" } }, "supplier": { "name": "Acme Corp Saudi", "tax_id": { "country": "SA", "code": "312345678912343" }, "identities": [ { "type": "CRN", "code": "1234567890" } ], "addresses": [ { "num": "1234", "street": "King Fahd Road", "street_extra": "Al Olaya", "locality": "Riyadh", "region": "Riyadh", "code": "12345", "country": "SA" } ] }, "customer": { "name": "Sample Consumer LLC", "identities": [ { "type": "TIN", "code": "123456789012345" } ], "addresses": [ { "num": "5678", "street": "Olaya Street", "street_extra": "Al Malaz", "locality": "Riyadh", "region": "Riyadh", "code": "54321", "country": "SA" } ] }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "15.0%", "ext": { "untdid-tax-category": "S" } } ], "total": "1800.00" } ], "payment": { "terms": { "notes": "Payment due within 30 days" }, "instructions": { "key": "credit-transfer", "ext": { "untdid-payment-means": "30" } } }, "delivery": { "date": "2022-02-01", "period": { "start": "2022-02-01", "end": "2022-02-28" } }, "totals": { "sum": "1800.00", "total": "1800.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "untdid-tax-category": "S" }, "base": "1800.00", "percent": "15.0%", "amount": "270.00" } ], "amount": "270.00" } ], "sum": "270.00" }, "tax": "270.00", "total_with_tax": "2070.00", "payable": "2070.00" } } ``` A credit note that reduces a previously cleared standard invoice. The `preceding` block links it to the original document. ```json Standard credit note theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "sa-zatca-v1" ], "uuid": "a1b2c3d4-1111-4aaa-bbbb-000000000001", "type": "credit-note", "issue_date": "2022-03-01", "issue_time": "10:00:00", "series": "CN", "code": "CN-001", "regime": "SA", "preceding": [ { "series": "", "code": "SAMPLE-001", "issue_date": "2022-02-01", "reason": "Return of development services" } ], "supplier": { "tax_id": { "country": "SA", "code": "312345678912343" }, "name": "Acme Corp Saudi", "identities": [ { "type": "CRN", "code": "1234567890" } ], "addresses": [ { "street": "King Fahd Road", "street_extra": "Al Olaya", "num": "1234", "locality": "Riyadh", "region": "Riyadh", "code": "12345", "country": "SA" } ] }, "customer": { "identities": [ { "type": "TIN", "code": "123456789012345" } ], "name": "Sample Consumer LLC", "addresses": [ { "street": "Olaya Street", "street_extra": "Al Malaz", "num": "5678", "locality": "Riyadh", "region": "Riyadh", "code": "54321", "country": "SA" } ] }, "delivery": { "date": "2022-03-01", "period": { "start": "2022-02-01", "end": "2022-02-28" } }, "payment": { "instructions": { "key": "credit-transfer" }, "terms": { "notes": "Refund within 14 days" } }, "lines": [ { "quantity": 5, "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "taxes": [ { "cat": "VAT", "rate": "standard" } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "SA", "$addons": [ "eu-en16931-v2017", "sa-zatca-v1" ], "uuid": "a1b2c3d4-1111-4aaa-bbbb-000000000001", "type": "credit-note", "series": "CN", "code": "CN-001", "issue_date": "2022-03-01", "issue_time": "10:00:00", "currency": "SAR", "preceding": [ { "issue_date": "2022-02-01", "code": "SAMPLE-001", "reason": "Return of development services" } ], "tax": { "rounding": "currency", "ext": { "sa-zatca-invoice-type": "0100000", "untdid-document-type": "381" } }, "supplier": { "name": "Acme Corp Saudi", "tax_id": { "country": "SA", "code": "312345678912343" }, "identities": [ { "type": "CRN", "code": "1234567890" } ], "addresses": [ { "num": "1234", "street": "King Fahd Road", "street_extra": "Al Olaya", "locality": "Riyadh", "region": "Riyadh", "code": "12345", "country": "SA" } ] }, "customer": { "name": "Sample Consumer LLC", "identities": [ { "type": "TIN", "code": "123456789012345" } ], "addresses": [ { "num": "5678", "street": "Olaya Street", "street_extra": "Al Malaz", "locality": "Riyadh", "region": "Riyadh", "code": "54321", "country": "SA" } ] }, "lines": [ { "i": 1, "quantity": "5", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "450.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "15.0%", "ext": { "untdid-tax-category": "S" } } ], "total": "450.00" } ], "payment": { "terms": { "notes": "Refund within 14 days" }, "instructions": { "key": "credit-transfer", "ext": { "untdid-payment-means": "30" } } }, "delivery": { "date": "2022-03-01", "period": { "start": "2022-02-01", "end": "2022-02-28" } }, "totals": { "sum": "450.00", "total": "450.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "untdid-tax-category": "S" }, "base": "450.00", "percent": "15.0%", "amount": "67.50" } ], "amount": "67.50" } ], "sum": "67.50" }, "tax": "67.50", "total_with_tax": "517.50", "payable": "517.50" } } ``` A debit note that increases the value of a previously cleared standard invoice, referencing the original in `preceding`. ```json Standard debit note theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "sa-zatca-v1" ], "uuid": "a1b2c3d4-2222-4aaa-bbbb-000000000002", "type": "debit-note", "issue_date": "2022-03-01", "issue_time": "10:00:00", "series": "DN", "code": "DN-001", "regime": "SA", "preceding": [ { "series": "", "code": "SAMPLE-001", "issue_date": "2022-02-01", "reason": "Price adjustment for development services" } ], "supplier": { "tax_id": { "country": "SA", "code": "312345678912343" }, "name": "Acme Corp Saudi", "identities": [ { "type": "CRN", "code": "1234567890" } ], "addresses": [ { "street": "King Fahd Road", "street_extra": "Al Olaya", "num": "1234", "locality": "Riyadh", "region": "Riyadh", "code": "12345", "country": "SA" } ] }, "customer": { "identities": [ { "type": "TIN", "code": "123456789012345" } ], "name": "Sample Consumer LLC", "addresses": [ { "street": "Olaya Street", "street_extra": "Al Malaz", "num": "5678", "locality": "Riyadh", "region": "Riyadh", "code": "54321", "country": "SA" } ] }, "delivery": { "date": "2022-03-01", "period": { "start": "2022-02-01", "end": "2022-02-28" } }, "payment": { "instructions": { "key": "credit-transfer" }, "terms": { "notes": "Payment due within 30 days" } }, "lines": [ { "quantity": 5, "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "taxes": [ { "cat": "VAT", "rate": "standard" } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "SA", "$addons": [ "eu-en16931-v2017", "sa-zatca-v1" ], "uuid": "a1b2c3d4-2222-4aaa-bbbb-000000000002", "type": "debit-note", "series": "DN", "code": "DN-001", "issue_date": "2022-03-01", "issue_time": "10:00:00", "currency": "SAR", "preceding": [ { "issue_date": "2022-02-01", "code": "SAMPLE-001", "reason": "Price adjustment for development services" } ], "tax": { "rounding": "currency", "ext": { "sa-zatca-invoice-type": "0100000", "untdid-document-type": "383" } }, "supplier": { "name": "Acme Corp Saudi", "tax_id": { "country": "SA", "code": "312345678912343" }, "identities": [ { "type": "CRN", "code": "1234567890" } ], "addresses": [ { "num": "1234", "street": "King Fahd Road", "street_extra": "Al Olaya", "locality": "Riyadh", "region": "Riyadh", "code": "12345", "country": "SA" } ] }, "customer": { "name": "Sample Consumer LLC", "identities": [ { "type": "TIN", "code": "123456789012345" } ], "addresses": [ { "num": "5678", "street": "Olaya Street", "street_extra": "Al Malaz", "locality": "Riyadh", "region": "Riyadh", "code": "54321", "country": "SA" } ] }, "lines": [ { "i": 1, "quantity": "5", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "450.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "15.0%", "ext": { "untdid-tax-category": "S" } } ], "total": "450.00" } ], "payment": { "terms": { "notes": "Payment due within 30 days" }, "instructions": { "key": "credit-transfer", "ext": { "untdid-payment-means": "30" } } }, "delivery": { "date": "2022-03-01", "period": { "start": "2022-02-01", "end": "2022-02-28" } }, "totals": { "sum": "450.00", "total": "450.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "untdid-tax-category": "S" }, "base": "450.00", "percent": "15.0%", "amount": "67.50" } ], "amount": "67.50" } ], "sum": "67.50" }, "tax": "67.50", "total_with_tax": "517.50", "payable": "517.50" } } ``` An export to a customer outside the GCC, taxed at the zero rate. Exports carry an exemption reason and are reported with the export tag. ```json Standard export invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "sa-zatca-v1" ], "uuid": "3aea7b56-59d8-4beb-90bd-f8f280d852d0", "issue_date": "2022-02-01", "issue_time": "12:00:00", "code": "SAMPLE-EX-001", "type": "standard", "regime": "SA", "$tags": [ "export" ], "supplier": { "tax_id": { "country": "SA", "code": "312345678912343" }, "name": "Acme Corp Saudi", "identities": [ { "type": "CRN", "code": "1234567890" } ], "addresses": [ { "street": "King Fahd Road", "street_extra": "Al Olaya", "num": "1234", "locality": "Riyadh", "region": "Riyadh", "code": "12345", "country": "SA" } ] }, "customer": { "name": "Global Importers Ltd", "identities": [ { "type": "PAS", "code": "X1234567" } ], "addresses": [ { "street": "Sheikh Zayed Road", "num": "100", "locality": "Dubai", "code": "00000", "country": "AE" } ] }, "delivery": { "date": "2022-02-01", "period": { "start": "2022-02-01", "end": "2022-02-28" } }, "payment": { "instructions": { "key": "credit-transfer" }, "terms": { "notes": "Payment due within 30 days" } }, "lines": [ { "quantity": 20, "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "taxes": [ { "cat": "VAT", "rate": "zero", "ext": { "untdid-tax-category": "Z", "cef-vatex": "VATEX-SA-32" } } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "SA", "$addons": [ "eu-en16931-v2017", "sa-zatca-v1" ], "$tags": [ "export" ], "uuid": "3aea7b56-59d8-4beb-90bd-f8f280d852d0", "type": "standard", "code": "SAMPLE-EX-001", "issue_date": "2022-02-01", "issue_time": "12:00:00", "currency": "SAR", "tax": { "rounding": "currency", "ext": { "sa-zatca-invoice-type": "0100100", "untdid-document-type": "388" }, "notes": [ { "cat": "VAT", "key": "zero", "text": "Export of goods", "ext": { "untdid-tax-category": "Z" } } ] }, "supplier": { "name": "Acme Corp Saudi", "tax_id": { "country": "SA", "code": "312345678912343" }, "identities": [ { "type": "CRN", "code": "1234567890" } ], "addresses": [ { "num": "1234", "street": "King Fahd Road", "street_extra": "Al Olaya", "locality": "Riyadh", "region": "Riyadh", "code": "12345", "country": "SA" } ] }, "customer": { "name": "Global Importers Ltd", "identities": [ { "type": "PAS", "code": "X1234567" } ], "addresses": [ { "num": "100", "street": "Sheikh Zayed Road", "locality": "Dubai", "code": "00000", "country": "AE" } ] }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "taxes": [ { "cat": "VAT", "key": "zero", "percent": "0%", "ext": { "cef-vatex": "VATEX-SA-32", "untdid-tax-category": "Z" } } ], "total": "1800.00" } ], "payment": { "terms": { "notes": "Payment due within 30 days" }, "instructions": { "key": "credit-transfer", "ext": { "untdid-payment-means": "30" } } }, "delivery": { "date": "2022-02-01", "period": { "start": "2022-02-01", "end": "2022-02-28" } }, "totals": { "sum": "1800.00", "total": "1800.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "zero", "ext": { "cef-vatex": "VATEX-SA-32", "untdid-tax-category": "Z" }, "base": "1800.00", "percent": "0%", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "1800.00", "payable": "1800.00" } } ``` A nominal (deemed) supply — goods or services provided without a monetary charge but still subject to VAT. ```json Standard nominal invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "sa-zatca-v1" ], "uuid": "3aea7b56-59d8-4beb-90bd-f8f280d852c0", "issue_date": "2022-02-01", "issue_time": "12:00:00", "code": "SAMPLE-NM-001", "type": "standard", "regime": "SA", "$tags": [ "nominal" ], "supplier": { "tax_id": { "country": "SA", "code": "312345678912343" }, "name": "Acme Corp Saudi", "identities": [ { "type": "CRN", "code": "1234567890" } ], "addresses": [ { "street": "King Fahd Road", "street_extra": "Al Olaya", "num": "1234", "locality": "Riyadh", "region": "Riyadh", "code": "12345", "country": "SA" } ] }, "customer": { "identities": [ { "type": "TIN", "code": "123456789012345" } ], "name": "Sample Consumer LLC", "addresses": [ { "street": "Olaya Street", "street_extra": "Al Malaz", "num": "5678", "locality": "Riyadh", "region": "Riyadh", "code": "54321", "country": "SA" } ] }, "delivery": { "date": "2022-02-01", "period": { "start": "2022-02-01", "end": "2022-02-28" } }, "payment": { "instructions": { "key": "credit-transfer" }, "terms": { "notes": "Payment due within 30 days" } }, "lines": [ { "quantity": 20, "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "taxes": [ { "cat": "VAT", "rate": "standard" } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "SA", "$addons": [ "eu-en16931-v2017", "sa-zatca-v1" ], "$tags": [ "nominal" ], "uuid": "3aea7b56-59d8-4beb-90bd-f8f280d852c0", "type": "standard", "code": "SAMPLE-NM-001", "issue_date": "2022-02-01", "issue_time": "12:00:00", "currency": "SAR", "tax": { "rounding": "currency", "ext": { "sa-zatca-invoice-type": "0101000", "untdid-document-type": "388" } }, "supplier": { "name": "Acme Corp Saudi", "tax_id": { "country": "SA", "code": "312345678912343" }, "identities": [ { "type": "CRN", "code": "1234567890" } ], "addresses": [ { "num": "1234", "street": "King Fahd Road", "street_extra": "Al Olaya", "locality": "Riyadh", "region": "Riyadh", "code": "12345", "country": "SA" } ] }, "customer": { "name": "Sample Consumer LLC", "identities": [ { "type": "TIN", "code": "123456789012345" } ], "addresses": [ { "num": "5678", "street": "Olaya Street", "street_extra": "Al Malaz", "locality": "Riyadh", "region": "Riyadh", "code": "54321", "country": "SA" } ] }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "15.0%", "ext": { "untdid-tax-category": "S" } } ], "total": "1800.00" } ], "payment": { "terms": { "notes": "Payment due within 30 days" }, "instructions": { "key": "credit-transfer", "ext": { "untdid-payment-means": "30" } } }, "delivery": { "date": "2022-02-01", "period": { "start": "2022-02-01", "end": "2022-02-28" } }, "totals": { "sum": "1800.00", "total": "1800.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "untdid-tax-category": "S" }, "base": "1800.00", "percent": "15.0%", "amount": "270.00" } ], "amount": "270.00" } ], "sum": "270.00" }, "tax": "270.00", "total_with_tax": "2070.00", "payable": "2070.00" } } ``` A self-billed invoice, where the customer issues the document on the supplier's behalf under a self-billing agreement. ```json Standard self-billed invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "sa-zatca-v1" ], "uuid": "3aea7b56-59d8-4beb-90bd-f8f280d853a1", "issue_date": "2024-06-15", "issue_time": "12:00:00", "code": "SAMPLE-SB-001", "type": "standard", "regime": "SA", "$tags": [ "self-billed" ], "supplier": { "tax_id": { "country": "SA", "code": "312345678912343" }, "name": "Acme Corp Saudi", "identities": [ { "type": "CRN", "code": "1234567890" } ], "addresses": [ { "street": "King Fahd Road", "street_extra": "Al Olaya", "num": "1234", "locality": "Riyadh", "region": "Riyadh", "code": "12345", "country": "SA" } ] }, "customer": { "tax_id": { "country": "SA", "code": "399999999900003" }, "identities": [ { "type": "CRN", "code": "123456789012345" } ], "name": "Sample Consumer LLC", "addresses": [ { "street": "Olaya Street", "street_extra": "Al Malaz", "num": "5678", "locality": "Riyadh", "region": "Riyadh", "code": "54321", "country": "SA" } ] }, "delivery": { "date": "2024-06-15", "period": { "start": "2024-06-01", "end": "2024-06-30" } }, "payment": { "instructions": { "key": "credit-transfer" }, "terms": { "notes": "Payment due within 30 days" } }, "lines": [ { "quantity": 20, "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "taxes": [ { "cat": "VAT", "rate": "standard" } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "SA", "$addons": [ "eu-en16931-v2017", "sa-zatca-v1" ], "$tags": [ "self-billed" ], "uuid": "3aea7b56-59d8-4beb-90bd-f8f280d853a1", "type": "standard", "code": "SAMPLE-SB-001", "issue_date": "2024-06-15", "issue_time": "12:00:00", "currency": "SAR", "tax": { "rounding": "currency", "ext": { "sa-zatca-invoice-type": "0100001", "untdid-document-type": "388" } }, "supplier": { "name": "Acme Corp Saudi", "tax_id": { "country": "SA", "code": "312345678912343" }, "identities": [ { "type": "CRN", "code": "1234567890" } ], "addresses": [ { "num": "1234", "street": "King Fahd Road", "street_extra": "Al Olaya", "locality": "Riyadh", "region": "Riyadh", "code": "12345", "country": "SA" } ] }, "customer": { "name": "Sample Consumer LLC", "tax_id": { "country": "SA", "code": "399999999900003" }, "identities": [ { "type": "CRN", "code": "123456789012345" } ], "addresses": [ { "num": "5678", "street": "Olaya Street", "street_extra": "Al Malaz", "locality": "Riyadh", "region": "Riyadh", "code": "54321", "country": "SA" } ] }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "15.0%", "ext": { "untdid-tax-category": "S" } } ], "total": "1800.00" } ], "payment": { "terms": { "notes": "Payment due within 30 days" }, "instructions": { "key": "credit-transfer", "ext": { "untdid-payment-means": "30" } } }, "delivery": { "date": "2024-06-15", "period": { "start": "2024-06-01", "end": "2024-06-30" } }, "totals": { "sum": "1800.00", "total": "1800.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "untdid-tax-category": "S" }, "base": "1800.00", "percent": "15.0%", "amount": "270.00" } ], "amount": "270.00" } ], "sum": "270.00" }, "tax": "270.00", "total_with_tax": "2070.00", "payable": "2070.00" } } ``` An invoice issued by an authorised third party on behalf of the supplier. ```json Standard third-party invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "sa-zatca-v1" ], "uuid": "3aea7b56-59d8-4beb-90bd-f8f280d852b0", "issue_date": "2022-02-01", "issue_time": "12:00:00", "code": "SAMPLE-TP-001", "type": "standard", "regime": "SA", "$tags": [ "third-party" ], "supplier": { "tax_id": { "country": "SA", "code": "312345678912343" }, "name": "Acme Corp Saudi", "identities": [ { "type": "CRN", "code": "1234567890" } ], "addresses": [ { "street": "King Fahd Road", "street_extra": "Al Olaya", "num": "1234", "locality": "Riyadh", "region": "Riyadh", "code": "12345", "country": "SA" } ] }, "customer": { "identities": [ { "type": "TIN", "code": "123456789012345" } ], "name": "Sample Consumer LLC", "addresses": [ { "street": "Olaya Street", "street_extra": "Al Malaz", "num": "5678", "locality": "Riyadh", "region": "Riyadh", "code": "54321", "country": "SA" } ] }, "delivery": { "date": "2022-02-01", "period": { "start": "2022-02-01", "end": "2022-02-28" } }, "payment": { "instructions": { "key": "credit-transfer" }, "terms": { "notes": "Payment due within 30 days" } }, "lines": [ { "quantity": 20, "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "taxes": [ { "cat": "VAT", "rate": "standard" } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "SA", "$addons": [ "eu-en16931-v2017", "sa-zatca-v1" ], "$tags": [ "third-party" ], "uuid": "3aea7b56-59d8-4beb-90bd-f8f280d852b0", "type": "standard", "code": "SAMPLE-TP-001", "issue_date": "2022-02-01", "issue_time": "12:00:00", "currency": "SAR", "tax": { "rounding": "currency", "ext": { "sa-zatca-invoice-type": "0110000", "untdid-document-type": "388" } }, "supplier": { "name": "Acme Corp Saudi", "tax_id": { "country": "SA", "code": "312345678912343" }, "identities": [ { "type": "CRN", "code": "1234567890" } ], "addresses": [ { "num": "1234", "street": "King Fahd Road", "street_extra": "Al Olaya", "locality": "Riyadh", "region": "Riyadh", "code": "12345", "country": "SA" } ] }, "customer": { "name": "Sample Consumer LLC", "identities": [ { "type": "TIN", "code": "123456789012345" } ], "addresses": [ { "num": "5678", "street": "Olaya Street", "street_extra": "Al Malaz", "locality": "Riyadh", "region": "Riyadh", "code": "54321", "country": "SA" } ] }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "15.0%", "ext": { "untdid-tax-category": "S" } } ], "total": "1800.00" } ], "payment": { "terms": { "notes": "Payment due within 30 days" }, "instructions": { "key": "credit-transfer", "ext": { "untdid-payment-means": "30" } } }, "delivery": { "date": "2022-02-01", "period": { "start": "2022-02-01", "end": "2022-02-28" } }, "totals": { "sum": "1800.00", "total": "1800.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "untdid-tax-category": "S" }, "base": "1800.00", "percent": "15.0%", "amount": "270.00" } ], "amount": "270.00" } ], "sum": "270.00" }, "tax": "270.00", "total_with_tax": "2070.00", "payable": "2070.00" } } ``` An invoice issued in USD. The VAT amount must also be expressed in SAR, converted at the SAMA rate on the supply date. ```json Standard invoice (USD) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "sa-zatca-v1" ], "uuid": "3aea7b56-59d8-4beb-90bd-f8f280d852a0", "currency": "USD", "issue_date": "2022-02-01", "issue_time": "12:00:00", "code": "SAMPLE-001", "regime": "SA", "exchange_rates": [ { "from": "USD", "to": "SAR", "amount": 3.75 } ], "supplier": { "tax_id": { "country": "SA", "code": "312345678912343" }, "name": "Acme Corp Saudi", "identities": [ { "type": "CRN", "code": "1234567890" } ], "addresses": [ { "street": "King Fahd Road", "street_extra": "Al Olaya", "num": "1234", "locality": "Riyadh", "region": "Riyadh", "code": "12345", "country": "SA" } ] }, "customer": { "identities": [ { "type": "TIN", "code": "123456789012345" } ], "name": "Sample Consumer LLC", "addresses": [ { "street": "Olaya Street", "street_extra": "Al Malaz", "num": "5678", "locality": "Riyadh", "region": "Riyadh", "code": "54321", "country": "SA" } ] }, "delivery": { "date": "2022-02-01", "period": { "start": "2022-02-01", "end": "2022-02-28" } }, "payment": { "instructions": { "key": "credit-transfer" }, "terms": { "notes": "Payment due within 30 days" } }, "lines": [ { "quantity": 20, "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "taxes": [ { "cat": "VAT", "rate": "standard" } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "SA", "$addons": [ "eu-en16931-v2017", "sa-zatca-v1" ], "uuid": "3aea7b56-59d8-4beb-90bd-f8f280d852a0", "type": "standard", "code": "SAMPLE-001", "issue_date": "2022-02-01", "issue_time": "12:00:00", "currency": "USD", "exchange_rates": [ { "from": "USD", "to": "SAR", "amount": "3.75" } ], "tax": { "rounding": "currency", "ext": { "sa-zatca-invoice-type": "0100000", "untdid-document-type": "388" } }, "supplier": { "name": "Acme Corp Saudi", "tax_id": { "country": "SA", "code": "312345678912343" }, "identities": [ { "type": "CRN", "code": "1234567890" } ], "addresses": [ { "num": "1234", "street": "King Fahd Road", "street_extra": "Al Olaya", "locality": "Riyadh", "region": "Riyadh", "code": "12345", "country": "SA" } ] }, "customer": { "name": "Sample Consumer LLC", "identities": [ { "type": "TIN", "code": "123456789012345" } ], "addresses": [ { "num": "5678", "street": "Olaya Street", "street_extra": "Al Malaz", "locality": "Riyadh", "region": "Riyadh", "code": "54321", "country": "SA" } ] }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "15.0%", "ext": { "untdid-tax-category": "S" } } ], "total": "1800.00" } ], "payment": { "terms": { "notes": "Payment due within 30 days" }, "instructions": { "key": "credit-transfer", "ext": { "untdid-payment-means": "30" } } }, "delivery": { "date": "2022-02-01", "period": { "start": "2022-02-01", "end": "2022-02-28" } }, "totals": { "sum": "1800.00", "total": "1800.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "untdid-tax-category": "S" }, "base": "1800.00", "percent": "15.0%", "amount": "270.00" } ], "amount": "270.00" } ], "sum": "270.00" }, "tax": "270.00", "total_with_tax": "2070.00", "payable": "2070.00" } } ``` A summary credit note that corrects one or more preceding invoices in a single document, tagged `summary`. ```json Summary credit note theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "sa-zatca-v1" ], "uuid": "8a51fd30-2a27-11ee-be56-0242ac120003", "issue_date": "2024-02-05", "issue_time": "09:30:00", "series": "CN", "code": "SAMPLE-CN-001", "regime": "SA", "type": "credit-note", "$tags": [ "summary" ], "preceding": [ { "series": "INV", "code": "SAMPLE-001", "issue_date": "2024-01-31", "reason": "Partial return of services after monthly close — discount applied per agreement BR-2024-AC-12", "type": "standard" } ], "notes": [ { "key": "general", "text": "Monthly summary credit note covering January 2024 adjustments." }, { "key": "reason", "text": "Customer returned 5 hours of consultancy and the office equipment delivered on 28 Jan." } ], "supplier": { "name": "Acme Corp Saudi LLC", "alias": "Acme SA", "tax_id": { "country": "SA", "code": "312345678912343" }, "identities": [ { "type": "SAG", "code": "1010101010" } ], "people": [ { "name": { "given": "Yara", "surname": "Al-Harbi", "prefix": "Eng." }, "role": "Billing Manager" } ], "emails": [ { "addr": "billing@acme.sa" } ], "telephones": [ { "num": "+966112345678", "label": "office" } ], "addresses": [ { "street": "King Fahd Road", "street_extra": "Al Olaya", "num": "1234", "locality": "Riyadh", "region": "Riyadh", "code": "12345", "country": "SA" } ] }, "customer": { "name": "Sample Consumer LLC", "identities": [ { "type": "CRN", "code": "2020202020" } ], "emails": [ { "addr": "ap@sample-consumer.sa" } ], "addresses": [ { "street": "Olaya Street", "street_extra": "Al Malaz", "num": "5678", "locality": "Riyadh", "region": "Riyadh", "code": "54321", "country": "SA" } ] }, "delivery": { "date": "2024-01-31", "period": { "start": "2024-01-01", "end": "2024-01-31" } }, "payment": { "instructions": { "key": "credit-transfer", "detail": "Refund via SEPA-equivalent local transfer", "credit_transfer": [ { "iban": "SA4420000001234567891234", "bic": "RJHISARIXXX", "name": "Sample Consumer LLC — Refund Account" } ] }, "terms": { "notes": "Refund to be processed within 14 days of receipt." } }, "lines": [ { "i": 1, "quantity": 5, "item": { "name": "Development services", "ref": "SVC-DEV-01", "price": "120.00", "unit": "h" }, "sum": "600.00", "discounts": [ { "percent": "10%", "reason": "Loyalty discount adjustment" } ], "taxes": [ { "cat": "VAT", "rate": "standard" } ], "total": "540.00" }, { "i": 2, "quantity": 1, "item": { "name": "Office desk return", "ref": "ITM-DESK-01", "price": "850.00", "unit": "one" }, "sum": "850.00", "taxes": [ { "cat": "VAT", "rate": "standard" } ], "total": "850.00" }, { "i": 3, "quantity": 2, "item": { "name": "Domestic flights for cancelled visit", "ref": "TRV-FLT-01", "price": "300.00", "unit": "one" }, "sum": "600.00", "taxes": [ { "cat": "VAT", "rate": "zero", "ext": { "untdid-tax-category": "Z", "cef-vatex": "VATEX-SA-32" } } ], "total": "600.00" } ], "charges": [ { "reason": "Restocking and handling fee", "amount": "50.00", "taxes": [ { "cat": "VAT", "rate": "standard" } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "SA", "$addons": [ "eu-en16931-v2017", "sa-zatca-v1" ], "$tags": [ "summary" ], "uuid": "8a51fd30-2a27-11ee-be56-0242ac120003", "type": "credit-note", "series": "CN", "code": "SAMPLE-CN-001", "issue_date": "2024-02-05", "issue_time": "09:30:00", "currency": "SAR", "preceding": [ { "type": "standard", "issue_date": "2024-01-31", "series": "INV", "code": "SAMPLE-001", "reason": "Partial return of services after monthly close — discount applied per agreement BR-2024-AC-12" } ], "tax": { "rounding": "currency", "ext": { "sa-zatca-invoice-type": "0100010", "untdid-document-type": "381" }, "notes": [ { "cat": "VAT", "key": "zero", "text": "Export of goods", "ext": { "untdid-tax-category": "Z" } } ] }, "supplier": { "name": "Acme Corp Saudi LLC", "alias": "Acme SA", "tax_id": { "country": "SA", "code": "312345678912343" }, "identities": [ { "type": "SAG", "code": "1010101010" } ], "people": [ { "name": { "prefix": "Eng.", "given": "Yara", "surname": "Al-Harbi" }, "role": "Billing Manager" } ], "addresses": [ { "num": "1234", "street": "King Fahd Road", "street_extra": "Al Olaya", "locality": "Riyadh", "region": "Riyadh", "code": "12345", "country": "SA" } ], "emails": [ { "addr": "billing@acme.sa" } ], "telephones": [ { "label": "office", "num": "+966112345678" } ] }, "customer": { "name": "Sample Consumer LLC", "identities": [ { "type": "CRN", "code": "2020202020" } ], "addresses": [ { "num": "5678", "street": "Olaya Street", "street_extra": "Al Malaz", "locality": "Riyadh", "region": "Riyadh", "code": "54321", "country": "SA" } ], "emails": [ { "addr": "ap@sample-consumer.sa" } ] }, "lines": [ { "i": 1, "quantity": "5", "item": { "ref": "SVC-DEV-01", "name": "Development services", "price": "120.00", "unit": "h" }, "sum": "600.00", "discounts": [ { "reason": "Loyalty discount adjustment", "percent": "10%", "amount": "60.00" } ], "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "15.0%", "ext": { "untdid-tax-category": "S" } } ], "total": "540.00" }, { "i": 2, "quantity": "1", "item": { "ref": "ITM-DESK-01", "name": "Office desk return", "price": "850.00", "unit": "one" }, "sum": "850.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "15.0%", "ext": { "untdid-tax-category": "S" } } ], "total": "850.00" }, { "i": 3, "quantity": "2", "item": { "ref": "TRV-FLT-01", "name": "Domestic flights for cancelled visit", "price": "300.00", "unit": "one" }, "sum": "600.00", "taxes": [ { "cat": "VAT", "key": "zero", "percent": "0%", "ext": { "cef-vatex": "VATEX-SA-32", "untdid-tax-category": "Z" } } ], "total": "600.00" } ], "charges": [ { "i": 1, "reason": "Restocking and handling fee", "amount": "50.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "15.0%", "ext": { "untdid-tax-category": "S" } } ] } ], "payment": { "terms": { "notes": "Refund to be processed within 14 days of receipt." }, "instructions": { "key": "credit-transfer", "detail": "Refund via SEPA-equivalent local transfer", "credit_transfer": [ { "iban": "SA4420000001234567891234", "bic": "RJHISARIXXX", "name": "Sample Consumer LLC — Refund Account" } ], "ext": { "untdid-payment-means": "30" } } }, "delivery": { "date": "2024-01-31", "period": { "start": "2024-01-01", "end": "2024-01-31" } }, "totals": { "sum": "1990.00", "charge": "50.00", "total": "2040.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "untdid-tax-category": "S" }, "base": "1440.00", "percent": "15.0%", "amount": "216.00" }, { "key": "zero", "ext": { "cef-vatex": "VATEX-SA-32", "untdid-tax-category": "Z" }, "base": "600.00", "percent": "0%", "amount": "0.00" } ], "amount": "216.00" } ], "sum": "216.00" }, "tax": "216.00", "total_with_tax": "2256.00", "payable": "2256.00" }, "notes": [ { "key": "general", "text": "Monthly summary credit note covering January 2024 adjustments.", "ext": { "untdid-text-subject": "AAI" } }, { "key": "reason", "text": "Customer returned 5 hours of consultancy and the office equipment delivered on 28 Jan.", "ext": { "untdid-text-subject": "ACD" } } ] } ``` ### Simplified tax invoices (reporting) A simplified tax invoice for a consumer sale. It is signed and stamped locally with the Production CSID, delivered immediately, and reported to ZATCA within 24 hours. ```json Simplified invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "sa-zatca-v1" ], "uuid": "3aea7b56-59d8-4beb-90bd-f8f280d852a0", "issue_date": "2022-02-01", "issue_time": "12:00:00", "code": "SAMPLE-001", "regime": "SA", "type": "standard", "$tags": [ "simplified" ], "supplier": { "tax_id": { "country": "SA", "code": "312345678912343" }, "identities": [ { "type": "MLS", "code": "1234567890" } ], "name": "Acme Corp Saudi", "addresses": [ { "street": "King Fahd Road", "street_extra": "Al Olaya", "num": "1234", "locality": "Riyadh", "region": "Riyadh", "code": "12345", "country": "SA" } ] }, "customer": { "name": "Sample Consumer LLC", "addresses": [ { "street": "Olaya Street", "street_extra": "Al Malaz", "num": "5678", "locality": "Riyadh", "region": "Riyadh", "code": "54321", "country": "SA" } ] }, "delivery": { "date": "2022-02-01", "period": { "start": "2022-02-01", "end": "2022-02-28" } }, "payment": { "instructions": { "key": "credit-transfer" }, "terms": { "notes": "Payment due within 30 days" } }, "lines": [ { "quantity": 20, "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "taxes": [ { "cat": "VAT", "rate": "standard" } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "SA", "$addons": [ "eu-en16931-v2017", "sa-zatca-v1" ], "$tags": [ "simplified" ], "uuid": "3aea7b56-59d8-4beb-90bd-f8f280d852a0", "type": "standard", "code": "SAMPLE-001", "issue_date": "2022-02-01", "issue_time": "12:00:00", "currency": "SAR", "tax": { "rounding": "currency", "ext": { "sa-zatca-invoice-type": "0200000", "untdid-document-type": "388" } }, "supplier": { "name": "Acme Corp Saudi", "tax_id": { "country": "SA", "code": "312345678912343" }, "identities": [ { "type": "MLS", "code": "1234567890" } ], "addresses": [ { "num": "1234", "street": "King Fahd Road", "street_extra": "Al Olaya", "locality": "Riyadh", "region": "Riyadh", "code": "12345", "country": "SA" } ] }, "customer": { "name": "Sample Consumer LLC", "addresses": [ { "num": "5678", "street": "Olaya Street", "street_extra": "Al Malaz", "locality": "Riyadh", "region": "Riyadh", "code": "54321", "country": "SA" } ] }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "15.0%", "ext": { "untdid-tax-category": "S" } } ], "total": "1800.00" } ], "payment": { "terms": { "notes": "Payment due within 30 days" }, "instructions": { "key": "credit-transfer", "ext": { "untdid-payment-means": "30" } } }, "delivery": { "date": "2022-02-01", "period": { "start": "2022-02-01", "end": "2022-02-28" } }, "totals": { "sum": "1800.00", "total": "1800.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "untdid-tax-category": "S" }, "base": "1800.00", "percent": "15.0%", "amount": "270.00" } ], "amount": "270.00" } ], "sum": "270.00" }, "tax": "270.00", "total_with_tax": "2070.00", "payable": "2070.00" } } ``` A credit note reducing a previously reported simplified invoice. ```json Simplified credit note theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "sa-zatca-v1" ], "uuid": "a1b2c3d4-3333-4aaa-bbbb-000000000003", "type": "credit-note", "issue_date": "2022-03-01", "issue_time": "10:00:00", "series": "CN", "code": "CN-001", "regime": "SA", "$tags": [ "simplified" ], "preceding": [ { "series": "", "code": "SAMPLE-001", "issue_date": "2022-02-01", "reason": "Return of development services" } ], "supplier": { "tax_id": { "country": "SA", "code": "312345678912343" }, "identities": [ { "type": "MLS", "code": "1234567890" } ], "name": "Acme Corp Saudi", "addresses": [ { "street": "King Fahd Road", "street_extra": "Al Olaya", "num": "1234", "locality": "Riyadh", "region": "Riyadh", "code": "12345", "country": "SA" } ] }, "customer": { "name": "Sample Consumer LLC", "addresses": [ { "street": "Olaya Street", "street_extra": "Al Malaz", "num": "5678", "locality": "Riyadh", "region": "Riyadh", "code": "54321", "country": "SA" } ] }, "delivery": { "date": "2022-03-01", "period": { "start": "2022-02-01", "end": "2022-02-28" } }, "payment": { "instructions": { "key": "credit-transfer" }, "terms": { "notes": "Refund within 14 days" } }, "lines": [ { "quantity": 5, "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "taxes": [ { "cat": "VAT", "rate": "standard" } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "SA", "$addons": [ "eu-en16931-v2017", "sa-zatca-v1" ], "$tags": [ "simplified" ], "uuid": "a1b2c3d4-3333-4aaa-bbbb-000000000003", "type": "credit-note", "series": "CN", "code": "CN-001", "issue_date": "2022-03-01", "issue_time": "10:00:00", "currency": "SAR", "preceding": [ { "issue_date": "2022-02-01", "code": "SAMPLE-001", "reason": "Return of development services" } ], "tax": { "rounding": "currency", "ext": { "sa-zatca-invoice-type": "0200000", "untdid-document-type": "381" } }, "supplier": { "name": "Acme Corp Saudi", "tax_id": { "country": "SA", "code": "312345678912343" }, "identities": [ { "type": "MLS", "code": "1234567890" } ], "addresses": [ { "num": "1234", "street": "King Fahd Road", "street_extra": "Al Olaya", "locality": "Riyadh", "region": "Riyadh", "code": "12345", "country": "SA" } ] }, "customer": { "name": "Sample Consumer LLC", "addresses": [ { "num": "5678", "street": "Olaya Street", "street_extra": "Al Malaz", "locality": "Riyadh", "region": "Riyadh", "code": "54321", "country": "SA" } ] }, "lines": [ { "i": 1, "quantity": "5", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "450.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "15.0%", "ext": { "untdid-tax-category": "S" } } ], "total": "450.00" } ], "payment": { "terms": { "notes": "Refund within 14 days" }, "instructions": { "key": "credit-transfer", "ext": { "untdid-payment-means": "30" } } }, "delivery": { "date": "2022-03-01", "period": { "start": "2022-02-01", "end": "2022-02-28" } }, "totals": { "sum": "450.00", "total": "450.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "untdid-tax-category": "S" }, "base": "450.00", "percent": "15.0%", "amount": "67.50" } ], "amount": "67.50" } ], "sum": "67.50" }, "tax": "67.50", "total_with_tax": "517.50", "payable": "517.50" } } ``` A debit note increasing the value of a previously reported simplified invoice. ```json Simplified debit note theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "sa-zatca-v1" ], "uuid": "a1b2c3d4-4444-4aaa-bbbb-000000000004", "type": "debit-note", "issue_date": "2022-03-01", "issue_time": "10:00:00", "series": "DN", "code": "DN-001", "regime": "SA", "$tags": [ "simplified" ], "preceding": [ { "series": "", "code": "SAMPLE-001", "issue_date": "2022-02-01", "reason": "Price adjustment for development services" } ], "supplier": { "tax_id": { "country": "SA", "code": "312345678912343" }, "identities": [ { "type": "MLS", "code": "1234567890" } ], "name": "Acme Corp Saudi", "addresses": [ { "street": "King Fahd Road", "street_extra": "Al Olaya", "num": "1234", "locality": "Riyadh", "region": "Riyadh", "code": "12345", "country": "SA" } ] }, "customer": { "name": "Sample Consumer LLC", "addresses": [ { "street": "Olaya Street", "street_extra": "Al Malaz", "num": "5678", "locality": "Riyadh", "region": "Riyadh", "code": "54321", "country": "SA" } ] }, "delivery": { "date": "2022-03-01", "period": { "start": "2022-02-01", "end": "2022-02-28" } }, "payment": { "instructions": { "key": "credit-transfer" }, "terms": { "notes": "Payment due within 30 days" } }, "lines": [ { "quantity": 5, "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "taxes": [ { "cat": "VAT", "rate": "standard" } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "SA", "$addons": [ "eu-en16931-v2017", "sa-zatca-v1" ], "$tags": [ "simplified" ], "uuid": "a1b2c3d4-4444-4aaa-bbbb-000000000004", "type": "debit-note", "series": "DN", "code": "DN-001", "issue_date": "2022-03-01", "issue_time": "10:00:00", "currency": "SAR", "preceding": [ { "issue_date": "2022-02-01", "code": "SAMPLE-001", "reason": "Price adjustment for development services" } ], "tax": { "rounding": "currency", "ext": { "sa-zatca-invoice-type": "0200000", "untdid-document-type": "383" } }, "supplier": { "name": "Acme Corp Saudi", "tax_id": { "country": "SA", "code": "312345678912343" }, "identities": [ { "type": "MLS", "code": "1234567890" } ], "addresses": [ { "num": "1234", "street": "King Fahd Road", "street_extra": "Al Olaya", "locality": "Riyadh", "region": "Riyadh", "code": "12345", "country": "SA" } ] }, "customer": { "name": "Sample Consumer LLC", "addresses": [ { "num": "5678", "street": "Olaya Street", "street_extra": "Al Malaz", "locality": "Riyadh", "region": "Riyadh", "code": "54321", "country": "SA" } ] }, "lines": [ { "i": 1, "quantity": "5", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "450.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "15.0%", "ext": { "untdid-tax-category": "S" } } ], "total": "450.00" } ], "payment": { "terms": { "notes": "Payment due within 30 days" }, "instructions": { "key": "credit-transfer", "ext": { "untdid-payment-means": "30" } } }, "delivery": { "date": "2022-03-01", "period": { "start": "2022-02-01", "end": "2022-02-28" } }, "totals": { "sum": "450.00", "total": "450.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "untdid-tax-category": "S" }, "base": "450.00", "percent": "15.0%", "amount": "67.50" } ], "amount": "67.50" } ], "sum": "67.50" }, "tax": "67.50", "total_with_tax": "517.50", "payable": "517.50" } } ``` A simplified invoice on zero-rated supplies, carrying explanatory tax notes for the applied rate. ```json Simplified zero-rated invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "sa-zatca-v1" ], "uuid": "8d487816-70b8-4ade-a618-9d620b73814a", "issue_date": "2022-09-07", "issue_time": "12:21:28", "code": "123456", "regime": "SA", "type": "standard", "$tags": [ "simplified" ], "tax": { "rounding": "currency", "notes": [ { "cat": "VAT", "key": "zero", "text": "Medicines", "ext": { "untdid-tax-category": "Z" } } ] }, "supplier": { "tax_id": { "country": "SA", "code": "399999999900003" }, "name": "شركة توريد التكنولوجيا بأقصى سرعة المحدودة | Maximum Speed Tech Supply LTD", "identities": [ { "type": "CRN", "code": "1010010000" } ], "addresses": [ { "street": "الامير سلطان | Prince Sultan", "street_extra": "المربع | Al-Murabba", "num": "2322", "locality": "الرياض | Riyadh", "code": "23333", "country": "SA" } ] }, "lines": [ { "i": 1, "quantity": "1", "item": { "name": "Medicine | الدواء", "price": "50.00", "unit": "PCE" }, "taxes": [ { "cat": "VAT", "rate": "zero", "ext": { "cef-vatex": "VATEX-SA-35" } } ] }, { "i": 2, "quantity": "1", "item": { "name": "Shampoo | شامبو", "price": "21.74", "unit": "PCE" }, "taxes": [ { "cat": "VAT", "rate": "standard" } ] } ], "payment": { "instructions": { "key": "credit-transfer" }, "terms": { "notes": "Payment due within 30 days" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "SA", "$addons": [ "eu-en16931-v2017", "sa-zatca-v1" ], "$tags": [ "simplified" ], "uuid": "8d487816-70b8-4ade-a618-9d620b73814a", "type": "standard", "code": "123456", "issue_date": "2022-09-07", "issue_time": "12:21:28", "currency": "SAR", "tax": { "rounding": "currency", "ext": { "sa-zatca-invoice-type": "0200000", "untdid-document-type": "388" }, "notes": [ { "cat": "VAT", "key": "zero", "text": "Medicines", "ext": { "untdid-tax-category": "Z" } } ] }, "supplier": { "name": "شركة توريد التكنولوجيا بأقصى سرعة المحدودة | Maximum Speed Tech Supply LTD", "tax_id": { "country": "SA", "code": "399999999900003" }, "identities": [ { "type": "CRN", "code": "1010010000" } ], "addresses": [ { "num": "2322", "street": "الامير سلطان | Prince Sultan", "street_extra": "المربع | Al-Murabba", "locality": "الرياض | Riyadh", "code": "23333", "country": "SA" } ] }, "lines": [ { "i": 1, "quantity": "1", "item": { "name": "Medicine | الدواء", "price": "50.00", "unit": "PCE" }, "sum": "50.00", "taxes": [ { "cat": "VAT", "key": "zero", "percent": "0%", "ext": { "cef-vatex": "VATEX-SA-35", "untdid-tax-category": "Z" } } ], "total": "50.00" }, { "i": 2, "quantity": "1", "item": { "name": "Shampoo | شامبو", "price": "21.74", "unit": "PCE" }, "sum": "21.74", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "15.0%", "ext": { "untdid-tax-category": "S" } } ], "total": "21.74" } ], "payment": { "terms": { "notes": "Payment due within 30 days" }, "instructions": { "key": "credit-transfer", "ext": { "untdid-payment-means": "30" } } }, "totals": { "sum": "71.74", "total": "71.74", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "zero", "ext": { "cef-vatex": "VATEX-SA-35", "untdid-tax-category": "Z" }, "base": "50.00", "percent": "0%", "amount": "0.00" }, { "key": "standard", "ext": { "untdid-tax-category": "S" }, "base": "21.74", "percent": "15.0%", "amount": "3.26" } ], "amount": "3.26" } ], "sum": "3.26" }, "tax": "3.26", "total_with_tax": "75.00", "payable": "75.00" } } ``` Copy and paste any of these into the [GOBL builder](https://build.gobl.org) to preview and verify it.
*** | | | | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Compliance | [Invoicing compliance in Saudi Arabia](/compliance/saudi-arabia)
[Compliance timeline](/timelines/saudi-arabia) | | Apps | [Saudi Arabia](/apps/saudi-arabia) | | Guides | [Registration](/guides/sa-zatca-registration)
[Clearance & reporting](/guides/sa-zatca-clearance-reporting) | | FAQ | [Saudi Arabia FAQ](/faq/saudi-arabia) | | GOBL | [Saudi Arabia Tax Regime](https://docs.gobl.org/regimes/sa)
[ZATCA Addon](https://docs.gobl.org/addons/sa-zatca-v1) | | GitHub | [gobl.sa.zatca](https://github.com/invopop/gobl.sa.zatca) |
Ask and answer questions about the Saudi Arabia app → # SDI Italy Source: https://docs.invopop.com/apps/sdi-italy Issue and receive invoices through Italy's SDI system.
View implementation guide › View implementation guide ›
| | | | --------- | ------------------------------ | | Developer | [Invopop](https://invopop.com) | | Category | Government | | Scope | B2B | | Country | [Italy](/compliance/italy) |
The [SDI](https://www.agenziaentrate.gov.it) (*Sistema di Interscambio*) is Italy's central hub for transmitting, validating, and delivering all electronic invoices throughout the country. It is managed by the Italian tax authority (*Agenzia delle Entrate*). Electronic invoicing is mandatory for all businesses in Italy. The SDI system operates using a standardized XML format called FatturaPA, which ensures all invoices contain the required information and comply with the strict validation rules established by the Italian tax authority. Invopop simplifies SDI integration by allowing you to work with GOBL format instead of XML, providing synchronous validation before submission, and offering a simple API integration with automatic handling of SDI notifications and status updates. Invopop has partnered with [A-Cube](https://www.acubeapi.com) to provide SDI integration services. **Key features** * **Workflow automation:** This app provides automated workflows for sending and receiving invoices through the SDI system. * **FatturaPA XML generation:** Automatically converts GOBL documents into compliant FatturaPA XML format. * **Real-time status updates:** Automatically handles SDI notifications and status updates, including delivery confirmations and acceptance/rejection notifications. * **Bidirectional support:** Send invoices to SDI and receive invoices from suppliers through the same app. * **Customer registration:** Register companies to receive invoices through SDI with a simple workflow step. * **GOBL FatturaPA integration:** Uses the open-source [GOBL FatturaPA](https://github.com/invopop/gobl.fatturapa) library for conversions. Make sure to check out our [SDI Italy Sending Guide](/guides/it-sdi-sending) and [SDI Italy Receiving Guide](/guides/it-sdi-receiving) for instructions on how to issue and receive invoices. ## FAQ Invoicing questions Install the SDI Italy app for B2B/B2G/B2C structured invoicing, or the Smart Receipts app for B2C-only AdE CF receipts. Run invoices through the Generate FatturaPA + Send to SDI workflow. See the [Italy tax regime in GOBL](https://docs.gobl.org/regimes/it) for tax categories, codice fiscale rules, and SDI-specific extensions. The [`it-sdi-v1`](https://docs.gobl.org/addons/it-sdi-v1) addon documents required FatturaPA fields. The SDI system can take up to 24 hours to process invoices, especially during peak periods. While waiting, the "Send to SDI" step will remain in the `QUEUED` state. The system will automatically check for updates, and the status will change once SDI has processed the invoice. Once the SDI process is complete, the workflow will show one of several status codes: * `delivered` - The invoice was successfully delivered to a B2B recipient * `accepted-pa` - The invoice was accepted by a Public Administration * `not-delivered` - The invoice couldn't be delivered, but was processed correctly by SDI Check the workflow history to see the exact status. No, sending and receiving invoices require different workflows: * For sending invoices, a workflow with the Generate FatturaPA and Send to SDI steps is needed * For receiving invoices, two workflows are required: 1. A Customer Registration workflow (run once for each company that needs to receive invoices) 2. An Import Invoices workflow (configured to run automatically) For more information on receiving invoices, see our [Italy - SDI: Receiving Invoices](/guides/it-sdi-receiving) guide. Invopop handles both Italian tax identification numbers in the supplier and customer sections of invoices: * **Partita IVA** (VAT number): Automatically extracted from the `tax_id/code` field. * **Codice Fiscale** (fiscal code): Must be specified as an identity with the key `it-fiscal-code`. Here's an example showing both identifiers in a supplier object: ```json Supplier with Partita IVA and Codice Fiscale theme={"system"} { "supplier": { "name": "MªF. Services", "tax_id": { "country": "IT", "code": "12345678903" }, "identities": [ { "key": "it-fiscal-code", "code": "MRTMTT91D08F205J" } ] } } ``` Registering supplier questions Provide the supplier's Partita IVA and Codice Fiscale (where different) in their party configuration. No certificate upload is needed — Invopop signs and submits to SDI as the supplier's intermediary. No supplier certificates are required. Invopop signs FatturaPA submissions with its own Agenzia delle Entrate-recognized intermediary credentials. Only the Partita IVA and routing metadata are stored. Just configure the supplier's Partita IVA in their party. SDI does not require explicit supplier registration to issue — Invopop signs and submits as intermediary the moment the workflow runs. None — Invopop submits via its intermediary credentials (a server-to-server channel with Agenzia delle Entrate). Suppliers don't manage any certificates for SDI. Receiving questions Register the recipient with SDI using Invopop's Recipient Code (`JKKZDGR`) and run the Customer Registration workflow. Invopop automatically receives matching invoices and routes them through the configured Import workflow. Inbound FatturaPA XMLs are parsed via [`gobl.fatturapa`](https://github.com/invopop/gobl.fatturapa). The original signed XML is preserved as a silo entry attachment alongside the GOBL representation. If an invoice received through SDI contains errors: 1. The import process will still attempt to convert it to [GOBL](https://docs.gobl.org) format 2. Any validation errors will be logged, and the rescue steps in your workflow will be triggered 3. You can review the errors and decide how to handle the invoice If the invoice has significant structural issues that prevent conversion, you may need to contact the sender to request a corrected invoice. Invoices are typically received within minutes after being sent by suppliers through SDI. The automatic import process in Invopop processes them as soon as they are received by our system. Yes, multiple companies can be registered to receive invoices through a single Invopop workspace. For each company, you must: 1. Register the Recipient Code `JKKZDGR` with the Italian tax authority for that specific company 2. Have its tax ID registered using the Customer Registration workflow in Invopop 3. Use the same Import Invoices workflow configured in the app settings This two-step registration process (with the tax authority and with Invopop) must be completed for each company you want to register. This is particularly useful for white-labeling scenarios where a user manages multiple entities. Yes, but only one party at a time can hold a given tax ID. Run the [unregister workflow](/guides/it-sdi-receiving#unregistering-a-company) on the party that currently holds it, then register the new one. Registering a tax ID that another party already holds fails with `supplier already registered in a different workspace or with a different entry`. Sandbox and live are counted separately, so the same tax ID can be registered in both at the same time. The two-step registration process serves different purposes: 1. **Registering with the Italian tax authority** - Tells SDI to route invoices addressed to your company to Invopop's system using the *Codice Destinatario* `JKKZDGR`. 2. **Registering with Invopop** (Customer Registration workflow) - Tells Invopop's system which invoices to accept and process for your workspace. Both steps are necessary: the first routes the invoices to Invopop, and the second ensures Invopop knows which workspace should receive those invoices. Signed FatturaPA XML (versions 1.2.x), conforming to the Agenzia delle Entrate schema. The signature is XAdES; SDI's own *Notifica di Esito Committente* envelopes the document during transmission. More answers in our [Italy FAQ](/faq/italy) section
The following workflow actions will be available once you install and enable this app:
3
Issue GOBL invoices in the Italian SDI using the FatturaPA format.
Register a GOBL party (customer) to receive invoices from the Italian SDI. Stop a registered party from receiving invoices from the Italian SDI, freeing its tax ID to be registered again.
3
Import invoices from the Italian SDI using the FatturaPA format.
The following workflows are available to make your integration easier. Use them as templates to build upon. This workflow automates FatturaPA invoice generation and submission to SDI. ```json Example SDI issue invoice workflow theme={"system"} { "name": "SDI issue invoice", "description": "Issue an invoice through SDI", "schema": "bill/invoice", "steps": [ { "id": "1a692ae0-cd12-11ef-998c-e97f18c9212e", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "1855b430-cd12-11ef-998c-e97f18c9212e", "name": "Sign envelope", "provider": "silo.close" }, { "id": "2042f860-cd12-11ef-998c-e97f18c9212e", "name": "Send invoice to SDI", "provider": "sdi-it.send", "summary": "Sandbox · Accepted by PA (Notifica esito)", "config": { "environment": "sandbox", "response": "NE" } }, { "id": "c1067e58-7b8b-11f1-8b0e-92000767c8b7", "name": "Archive document for legal preservation", "provider": "sdi-it.archive.store", "summary": "Preserve invoice and store its receipt", "config": { "environment": "sandbox" } }, { "id": "236965b0-cd12-11ef-998c-e97f18c9212e", "name": "Generate PDF", "provider": "pdf", "summary": "Italian · A4", "config": { "date_format": "%Y-%m-%d", "locale": "it", "logo_height": 40 } }, { "id": "2b6db450-cd12-11ef-998c-e97f18c9212e", "name": "Set state", "provider": "silo.state", "summary": "Set state to `sent`{.state .sent}", "config": { "state": "sent" } } ], "rescue": [ { "id": "2d5d7660-cd12-11ef-998c-e97f18c9212e", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` [Add to my workspace →](https://console.invopop.com/redirect/workflows/new?template=it-sdi-send) This workflow registers a company to receive invoices through SDI. ```json Example SDI register customer workflow theme={"system"} { "name": "SDI register customer", "description": "Register a customer with SDI to receive invoices", "schema": "org/party", "steps": [ { "id": "2a34f560-fd13-11ef-998c-e97f18c9212e", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "3b5c7890-fd13-11ef-998c-e97f18c9212e", "name": "Register party with SDI", "provider": "sdi-it.register", "summary": "Register company as receiver", "config": { "environment": "production" } }, { "id": "c1096edb-7b8b-11f1-a196-92000767c8b7", "name": "Register party for e-archiving", "provider": "sdi-it.archive.register", "summary": "Register company for legal preservation", "config": { "environment": "production" } }, { "id": "4c6d8910-fd13-11ef-998c-e97f18c9212e", "name": "Set state", "provider": "silo.state", "summary": "Set state to `registered`{.state .registered}", "config": { "state": "registered" } } ], "rescue": [ { "id": "5d7e9a20-fd13-11ef-998c-e97f18c9212e", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` [Add to my workspace →](https://console.invopop.com/redirect/workflows/new?template=it-sdi-register-customer) This workflow stops a company from receiving invoices through SDI. ```json Example SDI unregister customer workflow theme={"system"} { "name": "SDI unregister customer", "description": "Unregister a customer from SDI to stop receiving invoices", "schema": "org/party", "steps": [ { "id": "b56b1f70-90e1-11f1-9fc8-92000767c8b7", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "b56e7f7c-90e1-11f1-8a81-92000767c8b7", "name": "Unregister party from SDI", "provider": "sdi-it.unregister", "summary": "Stop receiving invoices for this company" }, { "id": "b56e8088-90e1-11f1-b95f-92000767c8b7", "name": "Set state", "provider": "silo.state", "summary": "Set state to `void`{.state .void}", "config": { "state": "void" } } ], "rescue": [ { "id": "cf5af04f-90e1-11f1-8a24-92000767c8b7", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` [Add to my workspace →](https://console.invopop.com/redirect/workflows/new?template=it-sdi-unregister-customer) This workflow imports and processes invoices received through SDI. ```json Example SDI import invoice workflow theme={"system"} { "name": "SDI import invoice", "description": "Import an invoice received through SDI", "schema": "bill/invoice", "steps": [ { "id": "6e8f0b30-fd13-11ef-998c-e97f18c9212e", "name": "Import invoice from SDI", "provider": "sdi-it.import", "summary": "Convert received FatturaPA to GOBL", "config": { "environment": "production" } }, { "id": "b3e17a92-7c5d-11f1-9c40-92000767c8b7", "name": "Archive document for legal preservation", "provider": "sdi-it.archive.store", "summary": "Preserve invoice and store its receipt", "config": { "environment": "production", "flow": "received" } }, { "id": "7f9a1c40-fd13-11ef-998c-e97f18c9212e", "name": "Generate PDF", "provider": "pdf", "summary": "Italian · A4", "config": { "date_format": "%Y-%m-%d", "locale": "it", "logo_height": 40 } }, { "id": "8a0b2d50-fd13-11ef-998c-e97f18c9212e", "name": "Set state", "provider": "silo.state", "summary": "Set state to `sent`{.state .sent}", "config": { "state": "sent" } } ], "rescue": [ { "id": "9b1c3e60-fd13-11ef-998c-e97f18c9212e", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` [Add to my workspace →](https://console.invopop.com/redirect/workflows/new?template=it-sdi-import-invoices) Parties An Italian company with its partita IVA and the mandatory `it-sdi-fiscal-regime` extension (here `RF01`, ordinary regime). ```json Italy supplier example theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "Tecnologie Adriatico S.r.l.", "tax_id": { "country": "IT", "code": "00159560366" }, "addresses": [ { "num": "15", "street": "Via Giuseppe Verdi", "locality": "Milano", "region": "MI", "code": "20121", "country": "IT" } ], "emails": [ { "addr": "fatturazione@tecnologieadriatico.it" } ], "ext": { "it-sdi-fiscal-regime": "RF01" } } ``` An Italian business customer with partita IVA and the `it-sdi-code` inbox (Codice Destinatario) used by SDI to route the invoice. ```json Italy customer example theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "Cliente Esempio SpA", "tax_id": { "country": "IT", "code": "09876543217" }, "inboxes": [ { "key": "it-sdi-code", "code": "M5UXCR5" } ], "addresses": [ { "num": "8", "street": "Via Roma", "locality": "Torino", "region": "TO", "code": "10121", "country": "IT" } ], "emails": [ { "addr": "acquisti@clienteesempio.it" } ] } ``` In this example, we're issuing a standard B2B invoice from an Italian supplier to another Italian business customer. Notice: * both supplier and customer have their Partita IVA (VAT number) and Codice Fiscale properly specified, * the minimal version contains only essential fields; `gobl build` handles all calculations, * when running `gobl build`, the system automatically calculates totals, applies IVA rates, and normalizes the document according to SDI requirements, * the built version shows all calculated fields including tax breakdowns, line totals, payment terms, and final amounts, * the [`it-sdi-v1`](https://docs.gobl.org/addons/it-sdi-v1) addon validates the document structure for B2B transactions, and, * the invoice will be transmitted through the SDI system and delivered to the customer's designated channel. ```json SDI B2B Invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "IT", "$addons": [ "it-sdi-v1" ], "series": "SAMPLE", "code": "002", "issue_date": "2023-05-21", "currency": "EUR", "tax": { "prices_include": "VAT" }, "supplier": { "name": "Hotel California", "tax_id": { "country": "IT", "code": "12345678903" }, "addresses": [ { "num": "102", "street": "Via California", "locality": "Palermo", "region": "PA", "code": "33213", "country": "IT" } ], "registration": { "capital": "50000.00", "currency": "EUR", "office": "RM", "entry": "123456" }, "ext": { "it-sdi-fiscal-regime": "RF01" } }, "customer": { "name": "Mela S.r.l.", "tax_id": { "country": "IT", "code": "13029381004" }, "inboxes": [ { "key": "it-sdi-code", "code": "M5UXCR5" } ], "addresses": [ { "num": "23", "street": "Via dei Mille", "locality": "Firenze", "region": "FI", "code": "00100", "country": "IT" } ] }, "lines": [ { "quantity": "1", "item": { "name": "Tassa di Soggiorno", "price": "1.00" }, "taxes": [ { "cat": "VAT", "rate": "exempt", "ext": { "it-sdi-exempt": "N4" } } ] }, { "quantity": "1", "item": { "name": "Camera Matrimoniale", "price": "125.00" }, "taxes": [ { "cat": "VAT", "rate": "intermediate" } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "IT", "$addons": [ "it-sdi-v1" ], "type": "standard", "series": "SAMPLE", "code": "002", "issue_date": "2023-05-21", "currency": "EUR", "tax": { "prices_include": "VAT", "ext": { "it-sdi-document-type": "TD01", "it-sdi-format": "FPR12" } }, "supplier": { "name": "Hotel California", "tax_id": { "country": "IT", "code": "12345678903" }, "addresses": [ { "num": "102", "street": "Via California", "locality": "Palermo", "region": "PA", "code": "33213", "country": "IT" } ], "registration": { "capital": "50000.00", "currency": "EUR", "office": "RM", "entry": "123456" }, "ext": { "it-sdi-fiscal-regime": "RF01" } }, "customer": { "name": "Mela S.r.l.", "tax_id": { "country": "IT", "code": "13029381004" }, "inboxes": [ { "key": "it-sdi-code", "code": "M5UXCR5" } ], "addresses": [ { "num": "23", "street": "Via dei Mille", "locality": "Firenze", "region": "FI", "code": "00100", "country": "IT" } ] }, "lines": [ { "i": 1, "quantity": "1", "item": { "name": "Tassa di Soggiorno", "price": "1.00" }, "sum": "1.00", "taxes": [ { "cat": "VAT", "key": "exempt", "ext": { "it-sdi-exempt": "N4" } } ], "total": "1.00" }, { "i": 2, "quantity": "1", "item": { "name": "Camera Matrimoniale", "price": "125.00" }, "sum": "125.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "intermediate", "percent": "10.0%" } ], "total": "125.00" } ], "totals": { "sum": "126.00", "tax_included": "11.36", "total": "114.64", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "exempt", "ext": { "it-sdi-exempt": "N4" }, "base": "1.00", "amount": "0.00" }, { "key": "standard", "base": "113.64", "percent": "10.0%", "amount": "11.36" } ], "amount": "11.36" } ], "sum": "11.36" }, "tax": "11.36", "total_with_tax": "126.00", "payable": "126.00" } } ``` In this example, we're issuing a B2G invoice from an Italian supplier to the Italian government. Notice: * both supplier and customer have their Partita IVA (VAT number) and Codice Fiscale properly specified, * the minimal version contains only essential fields; `gobl build` handles all calculations, * when running `gobl build`, the system automatically calculates totals, applies IVA rates, and normalizes the document according to SDI requirements, * the built version shows all calculated fields including tax breakdowns, line totals, payment terms, and final amounts, * the [`it-sdi-v1`](https://docs.gobl.org/addons/it-sdi-v1) addon validates the document structure for B2G transactions, and, * the invoice will be transmitted through the SDI system and delivered to the customer's designated channel. ```json SDI B2G Invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "IT", "$addons": ["it-sdi-v1"], "$tags": ["b2g"], "series": "PA", "code": "2026-001", "issue_date": "2026-05-08", "currency": "EUR", "supplier": { "name": "Esempio Fornitore SRL", "tax_id": { "country": "IT", "code": "12345678903" }, "ext": { "it-sdi-fiscal-regime": "RF01" }, "addresses": [ { "num": "10", "street": "Via Roma", "locality": "Milano", "region": "MI", "code": "20121", "country": "IT" } ], "emails": [ {"addr": "amministrazione@esempio-fornitore.it"} ] }, "customer": { "name": "Comune di Roma", "tax_id": { "country": "IT", "code": "02438750586" }, "addresses": [ { "num": "1", "street": "Piazza del Campidoglio", "locality": "Roma", "region": "RM", "code": "00186", "country": "IT" } ], "inboxes": [ { "key": "it-sdi-code", "code": "UF9DN8" } ] }, "lines": [ { "quantity": "20", "item": { "name": "Servizi di consulenza informatica", "price": "150.00", "unit": "h" }, "taxes": [ { "cat": "VAT", "rate": "standard" } ] }, { "quantity": "1", "item": { "name": "Licenza software annuale", "price": "1200.00" }, "taxes": [ { "cat": "VAT", "rate": "standard" } ] } ], "payment": { "instructions": { "key": "credit-transfer", "ext": { "it-sdi-payment-means": "MP05" }, "credit_transfer": [ { "iban": "IT60X0542811101000000123456", "name": "Banca Esempio SpA", "bic": "BPMOIT22XXX" } ] }, "terms": { "due_dates": [ { "date": "2026-06-07", "percent": "100%" } ] } }, "notes": [ { "key": "general", "text": "Fattura emessa verso Pubblica Amministrazione tramite SDI. CIG: Z1A2B3C4D5 - CUP: F81B12000000001" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "IT", "$addons": [ "it-sdi-v1" ], "$tags": [ "b2g" ], "type": "standard", "series": "PA", "code": "2026-001", "issue_date": "2026-05-08", "currency": "EUR", "tax": { "ext": { "it-sdi-document-type": "TD01", "it-sdi-format": "FPA12" } }, "supplier": { "name": "Esempio Fornitore SRL", "tax_id": { "country": "IT", "code": "12345678903" }, "addresses": [ { "num": "10", "street": "Via Roma", "locality": "Milano", "region": "MI", "code": "20121", "country": "IT" } ], "emails": [ { "addr": "amministrazione@esempio-fornitore.it" } ], "ext": { "it-sdi-fiscal-regime": "RF01" } }, "customer": { "name": "Comune di Roma", "tax_id": { "country": "IT", "code": "02438750586" }, "inboxes": [ { "key": "it-sdi-code", "code": "UF9DN8" } ], "addresses": [ { "num": "1", "street": "Piazza del Campidoglio", "locality": "Roma", "region": "RM", "code": "00186", "country": "IT" } ] }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Servizi di consulenza informatica", "price": "150.00", "unit": "h" }, "sum": "3000.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "22.0%" } ], "total": "3000.00" }, { "i": 2, "quantity": "1", "item": { "name": "Licenza software annuale", "price": "1200.00" }, "sum": "1200.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "22.0%" } ], "total": "1200.00" } ], "payment": { "terms": { "due_dates": [ { "date": "2026-06-07", "amount": "5124.00", "percent": "100%" } ] }, "instructions": { "key": "credit-transfer", "credit_transfer": [ { "iban": "IT60X0542811101000000123456", "bic": "BPMOIT22XXX", "name": "Banca Esempio SpA" } ], "ext": { "it-sdi-payment-means": "MP05" } } }, "totals": { "sum": "4200.00", "total": "4200.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "base": "4200.00", "percent": "22.0%", "amount": "924.00" } ], "amount": "924.00" } ], "sum": "924.00" }, "tax": "924.00", "total_with_tax": "5124.00", "payable": "5124.00" }, "notes": [ { "key": "general", "text": "Fattura emessa verso Pubblica Amministrazione tramite SDI. CIG: Z1A2B3C4D5 - CUP: F81B12000000001" } ] } ``` This example matches the **B2B invoice** above but adds a **€2.00 Marca da bollo** (stamp duty) as a document-level charge. **Flat-rate scheme (*forfettario*):** taxpayers using the *regime forfettario* do **not** charge VAT on their invoices. When the document total goes **above €77.47**, they must account for **imposta di bollo**—typically by adding a **€2.00** stamp duty line, as in this sample. (Thresholds and rules can change; confirm with your adviser or the Agenzia delle Entrate if in doubt.) Notice: * the `charges` array includes an entry with `"key": "stamp-duty"`, amount `"2.00"`, and reason `Imposta di bollo`, * the minimal version is otherwise the same as the B2B example; `gobl build` recalculates totals including the charge, * the built version shows `totals.charge` and a higher `payable` / `total_with_tax` than the plain B2B invoice, * the [`it-sdi-v1`](https://docs.gobl.org/addons/it-sdi-v1) addon continues to validate the document for SDI transmission. ```json SDI Stamp duty invoice (Marca da Bollo) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "IT", "$addons": [ "it-sdi-v1" ], "series": "SAMPLE", "code": "002", "issue_date": "2023-05-21", "currency": "EUR", "tax": { "prices_include": "VAT" }, "supplier": { "name": "Hotel California", "tax_id": { "country": "IT", "code": "12345678903" }, "addresses": [ { "num": "102", "street": "Via California", "locality": "Palermo", "region": "PA", "code": "33213", "country": "IT" } ], "registration": { "capital": "50000.00", "currency": "EUR", "office": "RM", "entry": "123456" }, "ext": { "it-sdi-fiscal-regime": "RF01" } }, "customer": { "name": "Mela S.r.l.", "tax_id": { "country": "IT", "code": "13029381004" }, "inboxes": [ { "key": "it-sdi-code", "code": "M5UXCR5" } ], "addresses": [ { "num": "23", "street": "Via dei Mille", "locality": "Firenze", "region": "FI", "code": "00100", "country": "IT" } ] }, "lines": [ { "quantity": "1", "item": { "name": "Tassa di Soggiorno", "price": "1.00" }, "taxes": [ { "cat": "VAT", "rate": "exempt", "ext": { "it-sdi-exempt": "N4" } } ] }, { "quantity": "1", "item": { "name": "Camera Matrimoniale", "price": "125.00" }, "taxes": [ { "cat": "VAT", "rate": "intermediate" } ] } ], "charges": [ { "key": "stamp-duty", "i": 1, "amount": "2.00", "reason": "Imposta di bollo" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "IT", "$addons": [ "it-sdi-v1" ], "type": "standard", "series": "SAMPLE", "code": "002", "issue_date": "2023-05-21", "currency": "EUR", "tax": { "prices_include": "VAT", "ext": { "it-sdi-document-type": "TD01", "it-sdi-format": "FPR12" } }, "supplier": { "name": "Hotel California", "tax_id": { "country": "IT", "code": "12345678903" }, "addresses": [ { "num": "102", "street": "Via California", "locality": "Palermo", "region": "PA", "code": "33213", "country": "IT" } ], "registration": { "capital": "50000.00", "currency": "EUR", "office": "RM", "entry": "123456" }, "ext": { "it-sdi-fiscal-regime": "RF01" } }, "customer": { "name": "Mela S.r.l.", "tax_id": { "country": "IT", "code": "13029381004" }, "inboxes": [ { "key": "it-sdi-code", "code": "M5UXCR5" } ], "addresses": [ { "num": "23", "street": "Via dei Mille", "locality": "Firenze", "region": "FI", "code": "00100", "country": "IT" } ] }, "lines": [ { "i": 1, "quantity": "1", "item": { "name": "Tassa di Soggiorno", "price": "1.00" }, "sum": "1.00", "taxes": [ { "cat": "VAT", "key": "exempt", "ext": { "it-sdi-exempt": "N4" } } ], "total": "1.00" }, { "i": 2, "quantity": "1", "item": { "name": "Camera Matrimoniale", "price": "125.00" }, "sum": "125.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "intermediate", "percent": "10.0%" } ], "total": "125.00" } ], "charges": [ { "i": 1, "key": "stamp-duty", "reason": "Imposta di bollo", "amount": "2.00" } ], "totals": { "sum": "126.00", "charge": "2.00", "tax_included": "11.36", "total": "116.64", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "exempt", "ext": { "it-sdi-exempt": "N4" }, "base": "1.00", "amount": "0.00" }, { "key": "standard", "base": "113.64", "percent": "10.0%", "amount": "11.36" } ], "amount": "11.36" } ], "sum": "11.36" }, "tax": "11.36", "total_with_tax": "128.00", "payable": "128.00" } } ``` In this example, we're issuing a comprehensive B2B invoice with additional optional fields such as ordering information, payment details, and document references. Notice: * this invoice demonstrates advanced SDI features like CIG/CUP codes, payment methods, and bank details, * the minimal version includes ordering and payment details; `gobl build` calculates all totals, * when running `gobl build`, the system validates all additional fields according to SDI specifications and calculates totals, * the built version shows the complete document with all calculated fields, tax breakdowns, and properly formatted additional information, * additional fields like `ordering`, `payment`, and document references are important for public administration invoices (B2G), and, * the addon ensures all optional fields are properly validated and formatted for SDI transmission. ```json SDI B2B Invoice with additional fields theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "IT", "$addons": [ "it-sdi-v1" ], "$tags": [ "freelance" ], "series": "SAMPLE", "code": "001", "issue_date": "2023-03-02", "currency": "EUR", "supplier": { "name": "MªF. Services", "tax_id": { "country": "IT", "code": "12345678903" }, "people": [ { "name": { "given": "GIANCARLO", "surname": "ROSSI" } } ], "addresses": [ { "num": "1", "street": "VIALE DELLA LIBERTÀ", "locality": "ROMA", "region": "RM", "code": "00100", "country": "IT" } ], "emails": [ { "addr": "billing@example.com" } ], "telephones": [ { "num": "999999999" } ], "registration": { "capital": "50000.00", "currency": "EUR", "office": "RM", "entry": "123456" }, "ext": { "it-sdi-fiscal-regime": "RF02" } }, "customer": { "name": "MARIO LEONI", "tax_id": { "country": "IT", "code": "09876543217" }, "people": [ { "name": { "prefix": "Dott.", "given": "MARIO", "surname": "LEONI" } } ], "inboxes": [ { "key": "it-sdi-code", "code": "M5UXCR5" } ], "addresses": [ { "num": "1", "street": "VIALE DELI LAVORATORI", "locality": "ROMA", "region": "RM", "code": "00100", "country": "IT" } ], "emails": [ { "addr": "mario@example.com" } ] }, "lines": [ { "quantity": "20", "item": { "name": "Development of accounting software", "price": "10.00", "unit": "h" }, "taxes": [ { "cat": "VAT", "rate": "standard" } ] } ], "payment": { "instructions": { "key": "credit-transfer", "credit_transfer": [ { "iban": "IT60X0542811101000000123456", "name": "MªF. Services" } ] }, "terms": { "due_dates": [ { "date": "2023-09-01", "percent": "100%" } ] } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "IT", "$addons": [ "it-sdi-v1" ], "$tags": [ "freelance" ], "type": "standard", "series": "SAMPLE", "code": "001", "issue_date": "2023-03-02", "currency": "EUR", "tax": { "ext": { "it-sdi-document-type": "TD06", "it-sdi-format": "FPR12" } }, "supplier": { "name": "MªF. Services", "tax_id": { "country": "IT", "code": "12345678903" }, "people": [ { "name": { "given": "GIANCARLO", "surname": "ROSSI" } } ], "addresses": [ { "num": "1", "street": "VIALE DELLA LIBERTÀ", "locality": "ROMA", "region": "RM", "code": "00100", "country": "IT" } ], "emails": [ { "addr": "billing@example.com" } ], "telephones": [ { "num": "999999999" } ], "registration": { "capital": "50000.00", "currency": "EUR", "office": "RM", "entry": "123456" }, "ext": { "it-sdi-fiscal-regime": "RF02" } }, "customer": { "name": "MARIO LEONI", "tax_id": { "country": "IT", "code": "09876543217" }, "people": [ { "name": { "prefix": "Dott.", "given": "MARIO", "surname": "LEONI" } } ], "inboxes": [ { "key": "it-sdi-code", "code": "M5UXCR5" } ], "addresses": [ { "num": "1", "street": "VIALE DELI LAVORATORI", "locality": "ROMA", "region": "RM", "code": "00100", "country": "IT" } ], "emails": [ { "addr": "mario@example.com" } ] }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Development of accounting software", "price": "10.00", "unit": "h" }, "sum": "200.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "22.0%" } ], "total": "200.00" } ], "payment": { "terms": { "due_dates": [ { "date": "2023-09-01", "amount": "244.00", "percent": "100%" } ] }, "instructions": { "key": "credit-transfer", "credit_transfer": [ { "iban": "IT60X0542811101000000123456", "name": "MªF. Services" } ], "ext": { "it-sdi-payment-means": "MP05" } } }, "totals": { "sum": "200.00", "total": "200.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "base": "200.00", "percent": "22.0%", "amount": "44.00" } ], "amount": "44.00" } ], "sum": "44.00" }, "tax": "44.00", "total_with_tax": "244.00", "payable": "244.00" } } ``` In this example, we're issuing an invoice for goods or services that are exempt from VAT (IVA). Notice: * the line item includes a tax with `"key": "exempt"` indicating this is a VAT-exempt transaction, * the minimal version omits the exemption code extension (`it-sdi-exempt`), which will be automatically added during `gobl build`, * when running `gobl build`, the system calculates totals with zero VAT and validates the exemption structure, * the built version shows the complete document with the exemption code extension (e.g., `"it-sdi-exempt": "N4"`) applied to the tax rate, * exemption codes must comply with SDI requirements—consult the [complete list of exemption reasons](https://docs.gobl.org/addons/it-sdi-v1#it-sdi-exempt) in the GOBL documentation, * common exemption codes include N4 (exempt), N3.1 (exports), N3.2 (intra-community supplies), and N6.x (reverse charge scenarios), and, * the SDI validates that exempt invoices include proper exemption codes before transmission. ```json SDI Exempt Invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "IT", "$addons": [ "it-sdi-v1" ], "code": "INVOICE-001", "supplier": { "name": "Example IT Supplier S.r.l.", "tax_id": { "country": "IT", "code": "12345678903" }, "addresses": [ { "street": "Via Roma, 123", "locality": "Milan", "code": "20121", "country": "IT" } ], "emails": [ { "addr": "info@supplier.it" } ] }, "customer": { "name": "Example IT Customer S.p.A.", "tax_id": { "country": "IT", "code": "13029381004" }, "addresses": [ { "street": "Via Dante, 456", "locality": "Rome", "code": "00100", "country": "IT" } ] }, "lines": [ { "quantity": "10", "item": { "name": "Tax Exempt Service", "price": "100.00" }, "taxes": [ { "cat": "VAT", "key": "exempt" } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "IT", "$addons": [ "it-sdi-v1" ], "type": "standard", "code": "INVOICE-001", "issue_date": "2026-07-08", "currency": "EUR", "tax": { "ext": { "it-sdi-document-type": "TD01", "it-sdi-format": "FPR12" } }, "supplier": { "name": "Example IT Supplier S.r.l.", "tax_id": { "country": "IT", "code": "12345678903" }, "addresses": [ { "street": "Via Roma, 123", "locality": "Milan", "code": "20121", "country": "IT" } ], "emails": [ { "addr": "info@supplier.it" } ], "ext": { "it-sdi-fiscal-regime": "RF01" } }, "customer": { "name": "Example IT Customer S.p.A.", "tax_id": { "country": "IT", "code": "13029381004" }, "addresses": [ { "street": "Via Dante, 456", "locality": "Rome", "code": "00100", "country": "IT" } ] }, "lines": [ { "i": 1, "quantity": "10", "item": { "name": "Tax Exempt Service", "price": "100.00" }, "sum": "1000.00", "taxes": [ { "cat": "VAT", "key": "exempt", "ext": { "it-sdi-exempt": "N4" } } ], "total": "1000.00" } ], "totals": { "sum": "1000.00", "total": "1000.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "exempt", "ext": { "it-sdi-exempt": "N4" }, "base": "1000.00", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "1000.00", "payable": "1000.00" } } ``` In this example, we're issuing a credit note (nota di credito) to correct or refund a previously issued invoice. Notice: * the `type` field is set to `credit-note` to indicate this is a corrective document, * the `preceding` field references the original invoice being corrected, * the minimal version contains only essential correction details; `gobl build` calculates negative amounts, * when running `gobl build`, the system automatically calculates negative totals, IVA refunds, validates the credit note structure, and applies SDI rules, * the built version shows all calculated fields including negative amounts for the refund and proper tax adjustments, * credit notes must be properly linked to the original invoice and transmitted through SDI, and, * the SDI system validates the credit note format before accepting and forwarding it to the recipient. ```json SDI Credit Note theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "IT", "$addons": [ "it-sdi-v1" ], "$tags": [ "freelance" ], "type": "credit-note", "series": "CN", "code": "001", "issue_date": "2024-10-09", "currency": "EUR", "preceding": [ { "uuid": "0190c0ec-8109-756b-a4f0-88c4b542ab6e", "type": "standard", "issue_date": "2023-03-02", "series": "SAMPLE", "code": "001" } ], "supplier": { "name": "MªF. Services", "tax_id": { "country": "IT", "code": "12345678903" }, "people": [ { "name": { "given": "GIANCARLO", "surname": "ROSSI" } } ], "addresses": [ { "num": "1", "street": "VIALE DELLA LIBERTÀ", "locality": "ROMA", "region": "RM", "code": "00100", "country": "IT" } ], "registration": { "capital": "50000.00", "currency": "EUR", "office": "RM", "entry": "123456" }, "ext": { "it-sdi-fiscal-regime": "RF02" } }, "customer": { "name": "MARIO LEONI", "tax_id": { "country": "IT", "code": "09876543217" }, "people": [ { "name": { "prefix": "Dott.", "given": "MARIO", "surname": "LEONI" } } ], "inboxes": [ { "key": "it-sdi-code", "code": "M5UXCR5" } ], "addresses": [ { "num": "1", "street": "VIALE DELI LAVORATORI", "locality": "ROMA", "region": "RM", "code": "00100", "country": "IT" } ], "emails": [ { "addr": "mario@example.com" } ] }, "lines": [ { "quantity": "20", "item": { "name": "Development of accounting software", "price": "10.00", "unit": "h" }, "taxes": [ { "cat": "VAT", "rate": "standard" } ] } ], "payment": { "instructions": { "key": "credit-transfer", "credit_transfer": [ { "iban": "IT60X0542811101000000123456", "name": "MªF. Services" } ] } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "IT", "$addons": [ "it-sdi-v1" ], "$tags": [ "freelance" ], "type": "credit-note", "series": "CN", "code": "001", "issue_date": "2024-10-09", "currency": "EUR", "preceding": [ { "uuid": "0190c0ec-8109-756b-a4f0-88c4b542ab6e", "type": "standard", "issue_date": "2023-03-02", "series": "SAMPLE", "code": "001" } ], "tax": { "ext": { "it-sdi-document-type": "TD04", "it-sdi-format": "FPR12" } }, "supplier": { "name": "MªF. Services", "tax_id": { "country": "IT", "code": "12345678903" }, "people": [ { "name": { "given": "GIANCARLO", "surname": "ROSSI" } } ], "addresses": [ { "num": "1", "street": "VIALE DELLA LIBERTÀ", "locality": "ROMA", "region": "RM", "code": "00100", "country": "IT" } ], "registration": { "capital": "50000.00", "currency": "EUR", "office": "RM", "entry": "123456" }, "ext": { "it-sdi-fiscal-regime": "RF02" } }, "customer": { "name": "MARIO LEONI", "tax_id": { "country": "IT", "code": "09876543217" }, "people": [ { "name": { "prefix": "Dott.", "given": "MARIO", "surname": "LEONI" } } ], "inboxes": [ { "key": "it-sdi-code", "code": "M5UXCR5" } ], "addresses": [ { "num": "1", "street": "VIALE DELI LAVORATORI", "locality": "ROMA", "region": "RM", "code": "00100", "country": "IT" } ], "emails": [ { "addr": "mario@example.com" } ] }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Development of accounting software", "price": "10.00", "unit": "h" }, "sum": "200.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "22.0%" } ], "total": "200.00" } ], "payment": { "instructions": { "key": "credit-transfer", "credit_transfer": [ { "iban": "IT60X0542811101000000123456", "name": "MªF. Services" } ], "ext": { "it-sdi-payment-means": "MP05" } } }, "totals": { "sum": "200.00", "total": "200.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "base": "200.00", "percent": "22.0%", "amount": "44.00" } ], "amount": "44.00" } ], "sum": "44.00" }, "tax": "44.00", "total_with_tax": "244.00", "payable": "244.00" } } ``` See also the [stamp duty (Marca da Bollo) regulation](/compliance/italy#regulation) for details on when the €2 *imposta di bollo* applies.
*** | | | | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Compliance | [Invoicing compliance in Italy](/compliance/italy)
[Compliance timeline](/timelines/italy) | | Apps | [SDI Italy](/apps/sdi-italy)
[Smart Receipts Italy](/apps/smart-receipts-italy) | | Guides | [SDI sending guide](/guides/it-sdi-sending)
[SDI receiving guide](/guides/it-sdi-receiving)
[Smart Receipts supplier registration](/guides/it-ticket-supplier)
[Smart Receipts issuing guide](/guides/it-ticket) | | FAQ | [Italy FAQ](/faq/italy) | | GOBL | [Italy Tax Regime](https://docs.gobl.org/regimes/it)
[Italy SDI FatturaPA Addon](https://docs.gobl.org/addons/it-sdi-v1)
[Italy AdE Ticket Addon](https://docs.gobl.org/addons/it-ticket-v1) | | GitHub | [gobl.fatturapa](https://github.com/invopop/gobl.fatturapa) |
*** Ask and answer questions about SDI Italy App → # Slack Source: https://docs.invopop.com/apps/slack Send notifications from your workflow via Slack
View implementation guide ›
| | | | --------- | ------------------------------ | | Developer | [Invopop](https://invopop.com) | | Category | Notify |
Invopop's Slack app helps you keep your team updated by sending automated messages to a Slack channel of your choice. For instance, you might want to receive a message when one of your job executions fails, or get notified when invoices are successfully processed. You can connect multiple Slack channels to your workspace, allowing you to send notifications to different teams or departments based on your workflow requirements. **Key features** * **Workflow automation:** Send automated notifications to Slack channels as part of your document processing workflows. * **Multiple channel support:** Connect and send messages to multiple Slack channels from a single workspace. * **Error notifications:** Get real-time alerts when workflow steps fail, helping you quickly identify and resolve issues. * **Custom messages:** Customize message content to include relevant information about your document processing jobs. * **Easy integration:** Simple setup process that requires only a Slack account with full membership or admin role. Make sure to check out our [Slack Guide](/guides/slack) for instructions on how to configure channels and set up your workflows.
The following workflow actions will be available once you install and enable this app: Send slack messages with a bot or your own account. The Slack app fits into your existing workflows. Typically, you'll add the `Send a Slack Message` step in your error handling flow to receive notifications when workflow steps fail, or in your main flow to notify your team about successful document processing. For example, you can add a Slack notification step in the error handling area of your workflow to receive messages like `Job fe094ad0-3e12-11ef-bfd5-15fe9005edf3 failed!` when a step encounters an error. See the [Slack Guide](/guides/slack) for detailed setup instructions and configuration options.
*** Ask and answer questions about Slack App → # Smart receipts Italy Source: https://docs.invopop.com/apps/smart-receipts-italy Issue documento commerciale in Italy
Supplier registration guide › Issuing guide ›
| | | | --------- | ------------------------------ | | Developer | [Invopop](https://invopop.com) | | Category | Government | | Scope | B2C | | Country | [Italy](/compliance/italy) |
The [AdE](https://www.agenziaentrate.gov.it) (*Agenzia delle Entrate*) is Italy's tax authority responsible for managing tax collection and fiscal compliance. The *documento commerciale* (also known as *scontrino elettronico*) is a digital fiscal document that records sales transactions and transmits them to the AdE. Italian law requires businesses to transmit sales data digitally through either a certified *Registratore Telematico* (RT) or the [AdE's online portal](https://www.agenziaentrate.gov.it/portale/aree-tematiche/fatturazione-elettronica). Smart Receipts streamlines this process by providing a secure interface to relay your sales data to the AdE through a local provider. Important distinctions for the *Documento Commerciale*: * It is not an invoice (*fattura*) - invoices require detailed buyer information and follow different tax rules. * It does not replace transport documents (*documento di trasporto*). * It is not a simple internal receipt - it serves an official fiscal function requiring AdE transmission. * It must include VAT at the time of sale - deferred VAT payment is not permitted. The AdE portal provides functionality to create tickets, void them entirely, and process refunds at the item level. Invopop's Smart Receipts implementation supports all these operations, allowing you to manage your electronic tickets programmatically through our API or manually via the Console. Smart Receipts (AdE CF) is **not** a substitute for [SDI](/guides/it-sdi-sending). SDI, using the FatturaPA format, is the main channel for issuing electronic invoices in Italy. AdE CF should only be used when customer information is not available, like in online B2C scenarios. **Key features** * **Workflow automation:** This app provides automated workflows for issuing receipts, voiding receipts, and processing refunds through the AdE system. * **Real-time transmission:** Receipts are transmitted to the AdE in real-time, ensuring compliance with Italian e-receipt regulations. * **Legally compliant PDF receipts:** Receipts are generated with all mandatory fields and AdE document numbers, as required by Italian fiscal legislation. * **Supplier registration:** Register suppliers with AdE credentials to enable receipt issuance on their behalf. * **Item-level refunds:** Process refunds at the item level using corrective invoices. * **GOBL integration:** Uses the open-source [GOBL](https://gobl.org) format with the `it-ticket-v1` addon for validation and compliance. Make sure to check out our [Supplier registration guide](/guides/it-ticket-supplier) for onboarding suppliers, and the [Issuing guide](/guides/it-ticket) for instructions on how to issue receipts and set up your workflows. ## FAQ Invoicing questions Install the SDI Italy app for B2B/B2G/B2C structured invoicing, or the Smart Receipts app for B2C-only AdE CF receipts. Run invoices through the Generate FatturaPA + Send to SDI workflow. See the [Italy tax regime in GOBL](https://docs.gobl.org/regimes/it) for tax categories, codice fiscale rules, and SDI-specific extensions. The [`it-sdi-v1`](https://docs.gobl.org/addons/it-sdi-v1) addon documents required FatturaPA fields. You cannot modify an AdE CF invoice after issuing it. Instead you must: 1. Void the incorrect invoice using the "Void AdE CF Invoices" workflow 2. Issue a new invoice with the correct information We recommend adding a series and code to the invoice so that you can keep track internally even though the AdE will generate a document number. AdE CF is **not** a substitute for [SDI](/guides/it-sdi-sending). SDI is the main channel for issuing electronic invoices in Italy; Invopop issues FatturaPA documents through it. AdE CF should only be used when customer information is not available, like in online B2C scenarios. Use the standard GOBL invoice with the simplified tag. No customer tax ID is required. The `it-ticket-v1` addon handles the AdE CF-specific fields. Each receipt gets a unique Lottery Code if the lottery functionality is enabled. Registering supplier questions Provide the supplier's Partita IVA and Codice Fiscale (where different) in their party configuration. No certificate upload is needed — Invopop signs and submits to SDI as the supplier's intermediary. No supplier certificates are required. Invopop signs FatturaPA submissions with its own Agenzia delle Entrate-recognized intermediary credentials. Only the Partita IVA and routing metadata are stored. Run the Smart Receipts Register Supplier workflow with the supplier's Partita IVA. Invopop registers the merchant with Agenzia delle Entrate's AdE CF service so issuance can begin immediately. None at the supplier level. Invopop authenticates to AdE CF via its intermediary credentials. The supplier's Partita IVA is the only routing identifier needed. Receiving questions Register the recipient with SDI using Invopop's Recipient Code (`JKKZDGR`) and run the Customer Registration workflow. Invopop automatically receives matching invoices and routes them through the configured Import workflow. Inbound FatturaPA XMLs are parsed via [`gobl.fatturapa`](https://github.com/invopop/gobl.fatturapa). The original signed XML is preserved as a silo entry attachment alongside the GOBL representation. Reporting questions Per receipt, in real time — there is no periodic batch. Invopop transmits each receipt to AdE CF as it is issued. End-of-day totals are aggregated automatically by Agenzia delle Entrate from individual transmissions. No periodic format — per-receipt JSON sent to AdE CF's REST endpoint. Daily/monthly aggregations are derived automatically by Agenzia delle Entrate. More answers in our [Italy FAQ](/faq/italy) section
The following workflow actions will be available once you install and enable this app:
3
Issue GOBL invoices to the Italian AdE using their receipt (documento commerciale) format.
3
Void a receipt previously sent to the Italian AdE.
Register a GOBL party to issue receipts in the Italian AdE.
The following workflows are available to make your integration easier. Use them as templates to build upon. This workflow automates Italian documento commerciale processing and transmission to AdE. ```json Example Smart Receipts issue receipt workflow theme={"system"} { "name": "Smart Receipts issue receipt", "description": "Issue an Italian *documento commerciale* via AdE", "schema": "bill/invoice", "steps": [ { "id": "0b0bdb00-25b5-11f0-864a-193f213df097", "name": "Sign envelope", "provider": "silo.close" }, { "id": "04427d60-25b5-11f0-864a-193f213df097", "name": "Send receipt to AdE", "provider": "ticket-it.send" }, { "id": "9e973e00-2b2d-11f0-984e-0542d5f28f0b", "name": "Generate PDF", "provider": "pdf", "summary": "Italian · A4", "config": { "logo_height": 40, "locale": "it", "date_format": "%Y-%m-%d", "layout": "A4" } }, { "id": "112326b0-25b5-11f0-864a-193f213df097", "name": "Set state", "provider": "silo.state", "summary": "Set state to `sent`{.state .sent}", "config": { "state": "sent" } } ], "rescue": [ { "id": "194a66a0-25b5-11f0-864a-193f213df097", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` [Add to my workspace →](https://console.invopop.com/redirect/workflows/new?template=it-ticket-send) This workflow voids receipts that were issued in error through the AdE system. ```json Example Smart Receipts void receipt workflow theme={"system"} { "name": "Smart Receipts void receipt", "description": "Void an Italian *documento commerciale* on AdE", "schema": "bill/invoice", "steps": [ { "id": "02a62be0-2b2e-11f0-984e-0542d5f28f0b", "name": "Void receipt with AdE", "provider": "ticket-it.void" }, { "id": "1583e220-2b2e-11f0-984e-0542d5f28f0b", "name": "Set state", "provider": "silo.state", "summary": "Set state to `void`{.state .void}", "config": { "state": "void" } } ], "rescue": [ { "id": "25c98860-2b2e-11f0-984e-0542d5f28f0b", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` [Add to my workspace →](https://console.invopop.com/redirect/workflows/new?template=ticket-void-receipt) This workflow registers a supplier with AdE credentials to enable receipt issuance. ```json Example Smart Receipts register supplier workflow theme={"system"} { "name": "Smart Receipts register supplier", "description": "Register a supplier with AdE", "schema": "org/party", "steps": [ { "id": "1a1be400-2b32-11f0-984e-0542d5f28f0b", "name": "Sign envelope", "provider": "silo.close" }, { "id": "de116bb0-25b4-11f0-864a-193f213df097", "name": "Register supplier with AdE", "provider": "ticket-it.register" }, { "id": "e0a1b380-25b4-11f0-864a-193f213df097", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } } ], "rescue": [ { "id": "1deb1470-2b32-11f0-984e-0542d5f28f0b", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` [Add to my workspace →](https://console.invopop.com/redirect/workflows/new?template=ticket-register-supplier) This example shows a simple B2C invoice from an Italian supplier (Documento Commerciale). Key points to note: * The minimal version in the first tab contains only the essential fields required to create the invoice * The [`it-ticket-v1`](https://docs.gobl.org/addons/it-ticket-v1) addon ensures validation using AdE CF v1 rules built into [GOBL](https://docs.gobl.org) * Extensions (`ext`) fields specify values that cannot be determined otherwise: * Items have an extension identifying them as goods or services * VAT exemptions require an Italian exemption code * The `prices_include` field indicates that item prices include VAT * The `payment.advances` entry records the total as paid by card. Without it, the receipt is reported to the AdE as fully uncollected (*corrispettivo non riscosso*) * When running `gobl build`, the system automatically calculates totals, line item sums, IVA breakdowns, and normalizes the document according to Smart Receipts requirements * The built version in the second tab shows the normalized document with all calculated fields including line indices, sums, and total amounts ```json Documento Commerciale theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": ["it-ticket-v1"], "series": "XXIT", "code": "001", "currency": "EUR", "tax": { "prices_include": "VAT" }, "type": "standard", "supplier": { "name": "Cleaning SRL", "tax_id": { "country": "IT", "code": "74230430451" } }, "lines": [ { "quantity": "1", "item": { "name": "Cleaning services", "price": "125.00", "ext": { "it-ticket-product": "services" } }, "taxes": [ { "cat": "VAT", "ext": { "it-ticket-exempt": "N3" } } ] }, { "quantity": "3", "item": { "name": "Cleaning products", "price": "137.50", "ext": { "it-ticket-product": "goods" } }, "taxes": [ { "cat": "VAT", "rate": "standard" } ] } ], "payment": { "advances": [ { "key": "card", "description": "Card payment", "percent": "100%" } ] } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "IT", "$addons": [ "it-ticket-v1" ], "type": "standard", "series": "XXIT", "code": "001", "issue_date": "2026-07-08", "currency": "EUR", "tax": { "prices_include": "VAT" }, "supplier": { "name": "Cleaning SRL", "tax_id": { "country": "IT", "code": "74230430451" } }, "lines": [ { "i": 1, "quantity": "1", "item": { "name": "Cleaning services", "price": "125.00", "ext": { "it-ticket-product": "services" } }, "sum": "125.00", "taxes": [ { "cat": "VAT", "key": "export", "ext": { "it-ticket-exempt": "N3" } } ], "total": "125.00" }, { "i": 2, "quantity": "3", "item": { "name": "Cleaning products", "price": "137.50", "ext": { "it-ticket-product": "goods" } }, "sum": "412.50", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "22.0%" } ], "total": "412.50" } ], "payment": { "advances": [ { "key": "card", "description": "Card payment", "percent": "100%", "amount": "537.50" } ] }, "totals": { "sum": "537.50", "tax_included": "74.39", "total": "463.11", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "export", "ext": { "it-ticket-exempt": "N3" }, "base": "125.00", "amount": "0.00" }, { "key": "standard", "base": "338.11", "percent": "22.0%", "amount": "74.39" } ], "amount": "74.39" } ], "sum": "74.39" }, "tax": "74.39", "total_with_tax": "537.50", "payable": "537.50", "advance": "537.50", "due": "0.00" } } ``` After the AdE (Agenzia delle Entrate) accepts the invoice, they add a reference to each line item. This reference, stored in the [`it-ticket-line-ref`](https://docs.gobl.org/addons/it-ticket-v1#ade-line-reference) extension, is essential for processing refunds. Notice: * This example shows a complete invoice with line references added by the AdE after acceptance * The minimal version contains the basic invoice structure before AdE processing * When running `gobl build`, the system calculates all totals and normalizes the document * The built version shows the complete document with AdE-assigned line references, calculated totals, and all automatically generated fields * These line references are required for creating corrective invoices and processing refunds * The complete invoice represents the final state after successful submission to and acceptance by the AdE ```json Documento Commerciale complete theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "IT", "$addons": [ "it-ticket-v1" ], "uuid": "0196ed2c-3ca6-7000-b87f-8fb532b45250", "type": "standard", "series": "XXIT", "code": "001", "issue_date": "2025-05-20", "currency": "EUR", "tax": { "prices_include": "VAT" }, "supplier": { "name": "Cleaning SRL", "tax_id": { "country": "IT", "code": "74230430451" } }, "lines": [ { "quantity": "1", "item": { "name": "Cleaning services", "price": "125.00", "ext": { "it-ticket-product": "services" } }, "taxes": [ { "cat": "VAT", "ext": { "it-ticket-exempt": "N3" } } ], "ext": { "it-ticket-line-ref": "557647" } }, { "quantity": "3", "item": { "name": "Cleaning products", "price": "137.50", "ext": { "it-ticket-product": "goods" } }, "taxes": [ { "cat": "VAT", "rate": "standard" } ], "ext": { "it-ticket-line-ref": "557647" } } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "IT", "$addons": [ "it-ticket-v1" ], "uuid": "0196ed2c-3ca6-7000-b87f-8fb532b45250", "type": "standard", "series": "XXIT", "code": "001", "issue_date": "2025-05-20", "currency": "EUR", "tax": { "prices_include": "VAT" }, "supplier": { "name": "Cleaning SRL", "tax_id": { "country": "IT", "code": "74230430451" } }, "lines": [ { "i": 1, "quantity": "1", "item": { "name": "Cleaning services", "price": "125.00", "ext": { "it-ticket-product": "services" } }, "sum": "125.00", "taxes": [ { "cat": "VAT", "key": "export", "ext": { "it-ticket-exempt": "N3" } } ], "total": "125.00", "ext": { "it-ticket-line-ref": "557647" } }, { "i": 2, "quantity": "3", "item": { "name": "Cleaning products", "price": "137.50", "ext": { "it-ticket-product": "goods" } }, "sum": "412.50", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "22.0%" } ], "total": "412.50", "ext": { "it-ticket-line-ref": "557647" } } ], "totals": { "sum": "537.50", "tax_included": "74.39", "total": "463.11", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "export", "ext": { "it-ticket-exempt": "N3" }, "base": "125.00", "amount": "0.00" }, { "key": "standard", "base": "338.11", "percent": "22.0%", "amount": "74.39" } ], "amount": "74.39" } ], "sum": "74.39" }, "tax": "74.39", "total_with_tax": "537.50", "payable": "537.50" } } ``` When a customer requests a refund for specific items, you can process it by issuing a corrective invoice. Since this is still considered sending an invoice, you can use the same workflow as before. To create a corrective invoice, take the original [GOBL Invoice](https://docs.gobl.org/draft-0/bill/invoice) and: 1. Set the `type` field to `corrective` 2. Add a reference to the original invoice using the `preceding` object 3. Include the original document number stamp from the first invoice 4. Keep the lines and quantities you want to refund Notice: * The minimal version in the first tab contains only essential correction details including references to the original invoice * The corrective invoice preserves the [`it-ticket-line-ref`](https://docs.gobl.org/addons/it-ticket-v1#ade-line-reference) extension from the original invoice for proper tracking * When running `gobl build`, the system automatically calculates negative amounts for refunds, validates the corrective structure, and applies AdE rules * The built version in the second tab shows the normalized document with calculated negative totals, tax refunds, and all automatically generated fields * The corrective invoice references the original invoice using the `preceding` object and maintains line item references for accurate tracking * This example shows a corrective invoice that refunds two units of "Cleaning Products" from the original invoice ```json Corrective Documento Commerciale theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "IT", "$addons": [ "it-ticket-v1" ], "type": "corrective", "series": "REFUND", "code": "001", "issue_date": "2025-05-20", "currency": "EUR", "preceding": [ { "uuid": "0196ed2c-3ca6-7000-b87f-8fb532b45250", "type": "standard", "issue_date": "2025-05-20", "series": "XXIT", "code": "001", "stamps": [ { "prv": "ade-ref", "val": "ACUBE2025/0000-7816" } ] } ], "tax": { "prices_include": "VAT" }, "supplier": { "name": "Cleaning SRL", "tax_id": { "country": "IT", "code": "74230430451" } }, "lines": [ { "quantity": "2", "item": { "name": "Cleaning products", "price": "137.50", "ext": { "it-ticket-product": "goods" } }, "taxes": [ { "cat": "VAT", "rate": "standard" } ], "ext": { "it-ticket-line-ref": "557647" } } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "IT", "$addons": [ "it-ticket-v1" ], "type": "corrective", "series": "REFUND", "code": "001", "issue_date": "2025-05-20", "currency": "EUR", "preceding": [ { "uuid": "0196ed2c-3ca6-7000-b87f-8fb532b45250", "type": "standard", "issue_date": "2025-05-20", "series": "XXIT", "code": "001", "stamps": [ { "prv": "ade-ref", "val": "ACUBE2025/0000-7816" } ] } ], "tax": { "prices_include": "VAT" }, "supplier": { "name": "Cleaning SRL", "tax_id": { "country": "IT", "code": "74230430451" } }, "lines": [ { "i": 1, "quantity": "2", "item": { "name": "Cleaning products", "price": "137.50", "ext": { "it-ticket-product": "goods" } }, "sum": "275.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "22.0%" } ], "total": "275.00", "ext": { "it-ticket-line-ref": "557647" } } ], "totals": { "sum": "275.00", "tax_included": "49.59", "total": "225.41", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "base": "225.41", "percent": "22.0%", "amount": "49.59" } ], "amount": "49.59" } ], "sum": "49.59" }, "tax": "49.59", "total_with_tax": "275.00", "payable": "275.00" } } ```
*** | | | | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Compliance | [Invoicing compliance in Italy](/compliance/italy)
[Compliance timeline](/timelines/italy) | | Apps | [SDI Italy](/apps/sdi-italy)
[Smart Receipts Italy](/apps/smart-receipts-italy) | | Guides | [SDI sending guide](/guides/it-sdi-sending)
[SDI receiving guide](/guides/it-sdi-receiving)
[Smart Receipts supplier registration](/guides/it-ticket-supplier)
[Smart Receipts issuing guide](/guides/it-ticket) | | FAQ | [Italy FAQ](/faq/italy) | | GOBL | [Italy Tax Regime](https://docs.gobl.org/regimes/it)
[Italy SDI FatturaPA Addon](https://docs.gobl.org/addons/it-sdi-v1)
[Italy AdE Ticket Addon](https://docs.gobl.org/addons/it-ticket-v1) | | GitHub | [gobl.fatturapa](https://github.com/invopop/gobl.fatturapa) |
Ask and answer questions about Smart Receipts Italy App → # Spain Source: https://docs.invopop.com/apps/spain Manage all Spanish tax-agency integrations. We're progressively moving towards a country-based approach to our apps, which is why you will find these steps under the "Spain" app. You can expect our current VERI\*FACTU functionality to be grouped under this app in the future. We will ensure no changes will be required for your existing workflows.
View guide › View guide › View guide › View guide ›
View guide › View guide › View guide › View guide ›
| | | | --------- | ------------------------------ | | Developer | [Invopop](https://invopop.com) | | Category | Government | | Scope | B2B | | Country | [Spain](/compliance/spain) |
Invopop's **Spain app** provides integration with Spanish tax agencies, centralizing all compliance requirements for electronic invoicing and tax reporting in Spain. | Feature | TicketBAI | SII | | ------------------------- | ----------------------------------------- | ------------------------------------------------------------------------------------- | | **Scope** | Basque Country (Álava, Gipuzkoa, Bizkaia) | Rest of Spain (AEAT) | | **Workflow automation** | Issue invoices and onboard suppliers | Report invoices and onboard suppliers | | **Compliant documents** | XML generation and PDF with QR codes | Invoice reporting to AEAT via SII API ([with limitations](#sii-implementation-scope)) | | **Supplier registration** | Registration wizard and agreement signing | Registration wizard and agreement signing | | **White-label** | Issue on behalf of clients or directly | Report on behalf of clients or directly | | **Tax ID verification** | Via AEAT Lookup | Via AEAT Lookup | Check out the guides below to get started: * [TicketBAI invoicing guide](/guides/es-ticketbai) · [TicketBAI supplier onboarding](/guides/es-ticketbai-supplier) * [NO VERI\*FACTU invoicing guide](/guides/es-noverifactu) · [NO VERI\*FACTU supplier onboarding](/guides/es-noverifactu-supplier) * [SII invoicing guide](/guides/es-sii) · [SII supplier onboarding](/guides/es-sii-supplier) * [Spanish Tax ID Lookup guide](/guides/es-lookup) · [Facturae guide](/guides/es-facturae) ## FAQ Invoicing questions You should send the credit note with the same sign as the original invoice. In Spain, unlike other countries, credit notes must be submitted to Hacienda with inverse values. Invopop handles this conversion automatically before transforming the credit note into a "factura rectificativa" (corrective invoice). This means you only need to send the credit note following international standards (with same sign as the invoice). Invopop will automatically adapt it when submitting to Hacienda. For reference, see the [GOBL Invoice](https://docs.gobl.org/draft-0/bill/invoice) documentation with `type` set to `credit-note`. See the [Spain tax regime in GOBL](https://docs.gobl.org/regimes/es) for tax categories, NIF rules, and Spanish-specific extensions. Subsystem-specific addons live alongside: [`es-verifactu-v1`](https://docs.gobl.org/addons/es-verifactu-v1), [`es-tbai-v1`](https://docs.gobl.org/addons/es-tbai-v1), [`es-facturae-v3`](https://docs.gobl.org/addons/es-facturae-v3). Issued invoices must be reported within 4 calendar days from the date of issuance — and always before the 16th day of the month following the one in which the VAT liability arises. Saturdays, Sundays, and national holidays are excluded from the count. Received invoices follow the same 4-day rule but starting from the date the invoice is recorded in the books. SII corrections are submitted as modification records (`A1`) referencing the original entry, rather than by deleting and re-sending. In practice, after fixing the underlying [GOBL](https://docs.gobl.org) document, run the SII workflow again — Invopop detects that a previous submission exists for the same invoice and emits the modification record automatically. Build a GOBL invoice with the `es-tbai-v1` addon, send it through the TicketBAI Issue Invoice workflow. Invopop signs with its *sello de empresa* certificate, generates the chained XML, and submits to the relevant Diputación Foral (Bizkaia, Gipuzkoa, or Álava). This is expected. QR codes generated in the TicketBAI sandbox environment are intentionally non-functional to prevent sandbox invoices from being mistaken for real ones. To verify that a sandbox QR code is correct, upload the PDF or a QR image to the foral tax authority's test verification page: [pruebatuz.bizkaia.eus](https://pruebatuz.bizkaia.eus/B4PEQR0C/testQr.xhtml?idioma=es). Registering supplier questions We reject agreements when: * The uploaded document is not signed (they upload the unsigned template). * Users upload a handwritten signature without an ID. * The electronic signature is made with an FNMT certificate. * The agreement is missing a date or location. * The name is entered as an email address. The job will state the reason for rejection. A KO will be triggered and the supplier will be labelled with the `Error` state. We currently recommend sending a reminder to the supplier through a webhook. The registration link will not expire and the entity will still be able to upload their registration documents which will be validated. Should you choose to run this workflow again using this supplier, the supplier will be accepted or rejected immediately because the required documentation has already been provided and validated. If the uploaded agreement documents were rejected, a KO will be triggered and the supplier will be labelled with the `Error` state. We currently recommend sending a notification to the supplier through a webhook within the **Error Handling** section. Afterwards, if you wish to re-register the supplier with new documents, you must: 1. Unregister the supplier using the **Unregister Supplier workflow**. 2. Re-run the Register supplier workflow. This will restart the entire registration process. When uploading documents, the previously submitted agreement will appear selected by default. Simply choose a new file and click `Continue` to override the old one. See the image below for reference: Overriding the previously submitted agreement In order to complete the representation agreement you will need to provide the following information: **Company** 1. Name 2. NIF 3. Address **Legal representative** 1. Full name 2. Government ID type and number 3. Address ```json Spain supplier example theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "people": [ { "name": { "given": "Juan", "surname": "Pérez González" }, "identities": [ { "key": "national", "code": "123456789A" } ], "addresses": [ { "num": "10", "street": "Calle Ejemplo", "locality": "Madrid", "region": "Madrid", "code": "28020", "country": "ES" } ] } ], "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] } ``` If the entity is a self-employed individual (*autónomo*), only the information requested in the **Legal representative** section is required. ```json Spain autónomo supplier example theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "Juan Pérez González", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "autonomo@example.com" } ] } ``` The supplier can add their electronic signature to the PDF document ([instructions](https://helpx.adobe.com/acrobat/using/signing-pdfs.html)), or sign with a handwritten signature (we recommend using [Adobe's online service](https://www.adobe.com/acrobat/online/sign-pdf.html)). Individual documents are limited to a maximum size of 10MB. Uploads exceeding this size will result in an error. Run the SII Register Supplier workflow. The supplier signs the representation agreement and Invopop registers as their *colaborador social* with AEAT. Invopop's own certificate is then used for SII submissions on their behalf. SII web services accept any AEAT-recognized certificate. Invopop signs submissions with its *certificado de representante de persona jurídica*, acting under the colaborador social arrangement — suppliers do not upload their own certificates. Run the TicketBAI Register Supplier workflow. The legal representative signs the agreement (electronic or handwritten + ID); the supplier's foral territory determines which Diputación Foral endpoint Invopop will submit to. None — Invopop uses its own *certificado sello de empresa* (one of the three TicketBAI-permitted types). Suppliers do not need to register with the foral tax authority or upload any certificate. Reporting questions Continuously, every issued or received invoice must be reported within 4 calendar days (excluding weekends and holidays), and always before the 16th of the following month. There is no daily cadence; submissions happen as documents are processed. SOAP web services with XML payloads — distinct schemas for issued (`SuministroFactEmitidas`), received (`SuministroFactRecibidas`), investment goods, and intra-EU operations. Each call carries up to 10,000 records signed with the issuer's (or representative's) certificate. More answers in our [Spain FAQ](/faq/spain) section
### SII implementation scope Our SII implementation is under active development and focuses on core functionality for the most common use cases. If these limitations affect your business requirements, please contact us to discuss your specific needs and our implementation roadmap. The current SII integration provides a foundational implementation covering the primary VAT registry books required for most businesses operating in Spain. Understanding what is and isn't supported will help you determine if this solution meets your compliance needs. #### Supported registry books We currently support the two most commonly used VAT registry books: * ***Libro de Registro de Facturas Expedidas*** (Issued Invoices Registry) * ***Libro de Registro de Facturas Recibidas*** (Received Invoices Registry) - [with specific limitations](#received-invoices-limitations) #### Unsupported registry books The following VAT registry books are **not supported** at the moment: * ***Libro de Registro de Bienes de Inversión*** (Investment Goods Registry) * ***Libro de Registro de Determinadas Operaciones Intracomunitarias*** (Specific Intra-Community Operations Registry) * Other registries such as cash payments (*pagos en metálico*), travel agency operations (*operaciones de agencias de viajes*), etc. #### Received invoices limitations When reporting to the **Libro de Registro de Facturas Recibidas**, the following key limitations apply: 1. **Deductible VAT matching:** The deductible VAT amount (*cuota deducible*) always equals the charged VAT amount (*cuota repercutida*). Invoices where the deductible VAT is lower than the charged VAT cannot be reported. 2. **Investment goods flag:** Invoices cannot be marked as investment goods (*bienes de inversión*) within the received invoices registry. 3. **Deduction period alignment:** The deduction period must match the settlement period. Deduction periods that differ from the liquidation periods cannot be specified. These represent the primary limitations in the current implementation. #### Regional endpoints Currently, only the **AEAT (Agencia Estatal de Administración Tributaria)** endpoint is supported for SII reporting. This covers businesses operating under the standard Spanish tax framework. Support for the **Canary Islands**, **Navarra** and the **Basque Country** regional endpoints is coming soon. The following workflow actions will be available once you install and enable this app: AEAT Lookup actions
1
Verify that a Spanish tax ID (NIF/CIF) exists in the AEAT census. For companies, this confirms the tax ID is valid. For individuals, it also verifies that the name matches the tax ID on record.
1
Verify the tax ID and normalize names using AEAT data. For companies, it sets the official name; for individuals, it applies the AEAT-returned format.
Facturae actions
1
Convert GOBL invoices into Spanish Facturae 3.2.2 XML files.
TicketBAI actions
1
Convert GOBL Invoices into TicketBAI XML format and send to the tax agency in Spain.
1
Generate a TicketBAI XML document from a GOBL invoice.
Send a cancel request for a previously sent TicketBAI invoice. Register TicketBAI parties before issuing invoices on their behalf. Block the job while waiting for the end-user to complete their registration steps. Wait for approval that the uploaded documentation is correct. Disables a previously registered party from issuing invoices. SII actions
2
Record issued invoices in the SII system.
2
Record received invoices in the SII system.
Register SII parties before reporting invoices on their behalf. Block the job while waiting for the end-user to complete their registration steps. Wait for approval that the uploaded documentation is correct. Disables a previously registered party from reporting invoices. NO VERI\*FACTU actions Generate and digitally sign an invoicing record XML from a GOBL invoice. Generate and digitally sign a cancellation record for a previously recorded invoice. Generate and digitally sign an event record XML from a GOBL status. Persist a signed record in the database for regulatory compliance. Build a GOBL status event document and upload it as a silo entry. Register a party for NO VERI\*FACTU mode. Remove a party's NO VERI\*FACTU registration.
TicketBAI invoice workflows ```json Example TicketBAI invoice workflow theme={"system"} { "name": "TicketBAI issue invoice", "description": "Issue a TicketBAI invoice and generate PDF with QR", "schema": "bill/invoice", "steps": [ { "id": "dd319d60-8bc1-11ef-96af-b55bf69bb0b8", "name": "Add sequential code", "config": { "name": "TicketBAI Invoice", "start": 1, "prefix": "F", "padding": 6 }, "summary": "Dynamic · TicketBAI · F000001", "provider": "sequence.enumerate" }, { "id": "ba77d5b0-7b3a-11ef-bffc-d9a10ebf9f89", "name": "Set state", "config": { "state": "processing" }, "summary": "Set state to `processing`{.state .processing}", "provider": "silo.state" }, { "id": "fc75e4f0-8721-11ef-a962-73e3f2037a52", "name": "Sign envelope", "provider": "silo.close" }, { "id": "fc618ea0-a757-11ef-8377-c15ac3014ffb", "name": "Generate TicketBAI XML", "provider": "gov-es.ticketbai.generate" }, { "id": "0448df60-a758-11ef-8377-c15ac3014ffb", "name": "Send invoice to TicketBAI", "provider": "gov-es.ticketbai.send" }, { "id": "c61adaa0-7b55-11ef-bffc-d9a10ebf9f89", "name": "Generate PDF", "config": { "locale": "es", "date_format": "%Y-%m-%d", "logo_height": 40 }, "summary": "Spanish · A4", "provider": "pdf" }, { "id": "d8693d70-7b3a-11ef-bffc-d9a10ebf9f89", "name": "Set state", "config": { "state": "sent" }, "summary": "Set state to `sent`{.state .sent}", "provider": "silo.state" } ], "rescue": [ { "id": "dd889490-7b3a-11ef-bffc-d9a10ebf9f89", "name": "Set state", "config": { "state": "error" }, "summary": "Set state to `error`{.state .error}", "provider": "silo.state" } ] } ``` ```json Example TicketBAI cancel invoice workflow theme={"system"} { "name": "TicketBAI cancel invoice", "description": "Cancel an invoice via TicketBAI", "schema": "bill/invoice", "steps": [ { "id": "2f897e30-3c9c-11f0-8690-a921c0418914", "name": "Cancel invoice in TicketBAI", "provider": "gov-es.ticketbai.cancel" }, { "id": "334ffc10-3c9c-11f0-8690-a921c0418914", "name": "Set state", "provider": "silo.state", "summary": "Set state to `void`{.state .void}", "config": { "state": "void" } } ], "rescue": [ { "id": "384cfe20-3c9c-11f0-8690-a921c0418914", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` TicketBAI party workflows ```json Example TicketBAI register supplier workflow theme={"system"} { "name": "TicketBAI register supplier", "description": "Register a supplier with TicketBAI", "schema": "org/party", "steps": [ { "id": "554c7040-66d7-11f0-a392-dfb6c99d6698", "name": "Register supplier with TicketBAI", "provider": "gov-es.ticketbai.register" }, { "id": "62148880-66d7-11f0-a392-dfb6c99d6698", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "5b924600-66d7-11f0-a392-dfb6c99d6698", "name": "Wait for TicketBAI supplier agreement upload", "provider": "gov-es.ticketbai.wait.upload" }, { "id": "6bec1080-66d7-11f0-a392-dfb6c99d6698", "name": "Set state", "provider": "silo.state", "summary": "Set state to `registered`{.state .registered}", "config": { "state": "registered" } }, { "id": "670d1dc0-66d7-11f0-a392-dfb6c99d6698", "name": "Wait for TicketBAI supplier approval", "provider": "gov-es.ticketbai.wait.approval" } ], "rescue": [ { "id": "76c13260-66d7-11f0-a392-dfb6c99d6698", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` ```json Example TicketBAI unregister supplier workflow theme={"system"} { "name": "TicketBAI unregister supplier", "description": "Unregister a supplier from TicketBAI", "schema": "org/party", "steps": [ { "id": "8a613610-67ba-11f0-bcaf-170efff782a9", "name": "Unregister supplier from TicketBAI", "provider": "gov-es.ticketbai.unregister" }, { "id": "96a6b0d0-67ba-11f0-bcaf-170efff782a9", "name": "Set state", "provider": "silo.state", "summary": "Set state to `void`{.state .void}", "config": { "state": "void" } } ], "rescue": [ { "id": "e8d2a6b0-67bb-11f0-bcaf-170efff782a9", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` Facturae workflows ```json Example Facturae invoice workflow theme={"system"} { "name": "Facturae generate invoice", "description": "Generate a Facturae XML invoice", "schema": "bill/invoice", "steps": [ { "id": "dc2d4780-0be4-11f1-99f1-2d47ed7bc202", "name": "Add sequential code", "provider": "sequence.enumerate", "summary": "Dynamic · Facturae · 000001", "config": { "name": "Facturae", "padding": 6, "start": 1 } }, { "id": "e2d8e3f0-0be4-11f1-99f1-2d47ed7bc202", "name": "Sign envelope", "provider": "silo.close" }, { "id": "ef9897c0-0be4-11f1-99f1-2d47ed7bc202", "name": "Generate Facturae XML", "provider": "gov-es.facturae.generate" } ], "rescue": [] } ``` SII invoice workflows ```json Example SII issue invoice workflow theme={"system"} { "name": "SII issue invoice", "description": "Record an issued invoice with SII and generate PDF", "schema": "bill/invoice", "steps": [ { "id": "59f4dee0-bc8f-11ef-8ca1-573cbe7db4cd", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "ec41cce0-0fc3-11f0-8a81-7911b3ecee3c", "name": "Add sequential code", "provider": "sequence.enumerate", "summary": "Dynamic · SII · 000001", "config": { "name": "SII", "padding": 6, "start": 1 } }, { "id": "fc75e4f0-8721-11ef-a962-73e3f2037a52", "name": "Sign envelope", "provider": "silo.close" }, { "id": "61661540-bc8f-11ef-8ca1-573cbe7db4cd", "name": "Record issued invoice in SII", "provider": "gov-es.sii.record.issued" }, { "id": "65312700-bc8f-11ef-8ca1-573cbe7db4cd", "name": "Generate PDF", "provider": "pdf", "summary": "Spanish · A4", "config": { "date_format": "%Y-%m-%d", "layout": "A4", "locale": "es", "logo_height": 60 } }, { "id": "6abb4de0-bc8f-11ef-8ca1-573cbe7db4cd", "name": "Set state", "provider": "silo.state", "summary": "Set state to `sent`{.state .sent}", "config": { "state": "sent" } } ], "rescue": [ { "id": "798b1d00-bc8f-11ef-8ca1-573cbe7db4cd", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` ```json Example SII record received invoice workflow theme={"system"} { "name": "SII record received invoice", "description": "Record a received invoice with SII", "schema": "bill/invoice", "steps": [ { "id": "59f4dee0-bc8f-11ef-8ca1-573cbe7db4cd", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "ec41cce0-0fc3-11f0-8a81-7911b3ecee3c", "name": "Add sequential code", "provider": "sequence.enumerate", "summary": "Dynamic · SII · 000001", "config": { "name": "SII", "padding": 6, "start": 1 } }, { "id": "fc75e4f0-8721-11ef-a962-73e3f2037a52", "name": "Sign envelope", "provider": "silo.close" }, { "id": "61661540-bc8f-11ef-8ca1-573cbe7db4cd", "name": "Record received invoice in SII", "provider": "gov-es.sii.record.received" }, { "id": "6abb4de0-bc8f-11ef-8ca1-573cbe7db4cd", "name": "Set state", "provider": "silo.state", "summary": "Set state to `sent`{.state .sent}", "config": { "state": "sent" } } ], "rescue": [ { "id": "798b1d00-bc8f-11ef-8ca1-573cbe7db4cd", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` SII party workflows ```json Example SII register supplier workflow theme={"system"} { "name": "SII register supplier", "description": "Register a supplier with SII", "schema": "org/party", "steps": [ { "id": "52f5d190-831c-11f0-9ba3-7d4deb7b9d0e", "name": "Register supplier with SII", "provider": "gov-es.sii.register" }, { "id": "5bfc9c10-831c-11f0-9ba3-7d4deb7b9d0e", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "627c94a0-831c-11f0-9ba3-7d4deb7b9d0e", "name": "Wait for SII supplier agreement upload", "provider": "gov-es.sii.wait.upload" }, { "id": "6f84ea30-831c-11f0-9ba3-7d4deb7b9d0e", "name": "Set state", "provider": "silo.state", "summary": "Set state to `registered`{.state .registered}", "config": { "state": "registered" } }, { "id": "78dabf10-831c-11f0-9ba3-7d4deb7b9d0e", "name": "Wait for SII supplier approval", "provider": "gov-es.sii.wait.approval" } ], "rescue": [ { "id": "846415c0-831c-11f0-9ba3-7d4deb7b9d0e", "name": "Set state", "provider": "silo.state", "summary": "Set state to `rejected`{.state .rejected}", "config": { "state": "rejected" } }, { "id": "d0e996c0-d9db-11f0-9b9a-5143ba8c831d", "name": "Unregister supplier from SII", "provider": "gov-es.sii.unregister" } ] } ``` ```json Example SII unregister supplier workflow theme={"system"} { "name": "SII unregister supplier", "description": "Unregister a supplier from SII", "schema": "org/party", "steps": [ { "id": "8a613610-67ba-11f0-bcaf-170efff782a9", "name": "Unregister supplier from SII", "provider": "gov-es.sii.unregister" }, { "id": "96a6b0d0-67ba-11f0-bcaf-170efff782a9", "name": "Set state", "provider": "silo.state", "summary": "Set state to `void`{.state .void}", "config": { "state": "void" } } ], "rescue": [ { "id": "e8d2a6b0-67bb-11f0-bcaf-170efff782a9", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` NO VERI\*FACTU invoice workflows ```json Example NO VERI*FACTU invoice workflow with states expandable theme={"system"} { "name": "NO VERI*FACTU issue invoice", "description": "Issue an invoice via NO VERI*FACTU and generate PDF", "schema": "bill/invoice", "steps": [ { "id": "a1b2c3d0-0001-11f1-a000-000000000001", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" }, "next": [] }, { "id": "a1b2c3d0-0001-11f1-a000-000000000002", "name": "Add sequential code", "provider": "sequence.enumerate", "summary": "Dynamic · NO VERI*FACTU · 000001", "config": { "name": "NoVerifactu", "padding": 6, "start": 1 }, "next": [] }, { "id": "a1b2c3d0-0001-11f1-a000-000000000003", "name": "Sign envelope", "provider": "silo.close", "next": [] }, { "id": "5bb35ae0-3ca4-11f1-90b7-0d81b4010093", "name": "Generate invoice for NO VERI*FACTU", "provider": "gov-es.noverifactu.generate.invoice", "next": [] }, { "id": "64c2d7f0-3ca4-11f1-90b7-0d81b4010093", "name": "Record for NO VERI*FACTU", "provider": "gov-es.noverifactu.record", "next": [] }, { "id": "a1b2c3d0-0001-11f1-a000-000000000006", "name": "Generate PDF", "provider": "pdf", "summary": "Spanish · A4", "config": { "date_format": "%Y-%m-%d", "layout": "A4", "locale": "es", "logo_height": 60 }, "next": [] }, { "id": "a1b2c3d0-0001-11f1-a000-000000000007", "name": "Set state", "provider": "silo.state", "summary": "Set state to `registered`{.state .registered}", "config": { "state": "registered" }, "next": [] } ], "rescue": [ { "id": "a1b2c3d0-0001-11f1-a000-000000000008", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" }, "next": [] } ] } ``` ```json Example NO VERI*FACTU cancel workflow with states expandable theme={"system"} { "name": "NO VERI*FACTU cancel invoice", "description": "Cancel an invoice via NO VERI*FACTU", "schema": "bill/invoice", "steps": [ { "id": "b2c3d4e0-0002-11f1-a000-000000000005", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "9f500280-3ca4-11f1-90b7-0d81b4010093", "name": "Generate cancellation for NO VERI*FACTU", "provider": "gov-es.noverifactu.generate.cancel" }, { "id": "a6eeb180-3ca4-11f1-90b7-0d81b4010093", "name": "Record for NO VERI*FACTU", "provider": "gov-es.noverifactu.record" }, { "id": "b2c3d4e0-0002-11f1-a000-000000000003", "name": "Set state", "provider": "silo.state", "summary": "Set state to `void`{.state .void}", "config": { "state": "void" } } ], "rescue": [ { "id": "b2c3d4e0-0002-11f1-a000-000000000004", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` NO VERI\*FACTU party workflows ```json Example NO VERI*FACTU register supplier workflow expandable theme={"system"} { "name": "NO VERI*FACTU register supplier", "description": "Register a supplier with NO VERI*FACTU, generate the start-of-mode event, and subscribe to summary events", "schema": "org/party", "steps": [ { "id": "c21b4130-3a65-11f1-a475-db4c42dd4e99", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" }, "next": [] }, { "id": "78e845e0-3ca3-11f1-90b7-0d81b4010093", "name": "Register supplier with NO VERI*FACTU", "provider": "gov-es.noverifactu.register", "next": [] }, { "id": "8857fe80-3ca3-11f1-90b7-0d81b4010093", "name": "Build status for NO VERI*FACTU", "provider": "gov-es.noverifactu.build.status", "next": [], "summary": "Build status: 01 - Start of NO VERI*FACTU mode", "config": { "event_type": "01" } }, { "id": "d16d34a0-3a91-11f1-a472-21be9722e465", "name": "Create a job", "provider": "transform.job.create", "summary": "Send to NO VERI*FACTU process event (bill/status)", "config": { "silo_entry_meta_key": "", "workflow_id": "" }, "next": [] }, { "id": "03cb3000-3a92-11f1-a472-21be9722e465", "name": "Subscribe to periodic execution", "provider": "cron.subscribe", "summary": "Every 6 hours", "config": { "workflow_id": "", "interval": "hourly", "factor": 6 }, "next": [] }, { "id": "c3d4e5f0-0003-11f1-a000-000000000002", "name": "Set state", "provider": "silo.state", "summary": "Set state to `registered`{.state .registered}", "config": { "state": "registered" }, "next": [] } ], "rescue": [ { "id": "c3d4e5f0-0003-11f1-a000-000000000005", "name": "Unregister supplier from NO VERI*FACTU", "provider": "gov-es.noverifactu.unregister", "next": [] }, { "id": "c3d4e5f0-0003-11f1-a000-000000000006", "name": "Set state", "provider": "silo.state", "summary": "Set state to `rejected`{.state .rejected}", "config": { "state": "rejected" }, "next": [] } ] } ``` ```json Example NO VERI*FACTU unregister supplier workflow expandable theme={"system"} { "name": "NO VERI*FACTU unregister supplier", "description": "Unregister a supplier from NO VERI*FACTU and generate the end-of-mode event", "schema": "org/party", "steps": [ { "id": "d4e5f6a0-0004-11f1-a000-000000000007", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "3e4bd770-3a92-11f1-a472-21be9722e465", "name": "Unsubscribe from periodic execution", "provider": "cron.unsubscribe" }, { "id": "f46dfa20-3ca3-11f1-90b7-0d81b4010093", "name": "Build status for NO VERI*FACTU", "provider": "gov-es.noverifactu.build.status", "summary": "Build status: 02 - End of NO VERI*FACTU mode", "config": { "event_type": "02" } }, { "id": "2fbe2590-3caf-11f1-ae77-65667068cb42", "name": "Create a job", "provider": "transform.job.create", "summary": "Send to NO VERI*FACTU process event (bill/status)", "config": { "silo_entry_meta_key": "", "workflow_id": "" } }, { "id": "9a9235e0-3cb0-11f1-ae77-65667068cb42", "name": "Unregister supplier from NO VERI*FACTU", "provider": "gov-es.noverifactu.unregister" }, { "id": "d4e5f6a0-0004-11f1-a000-000000000004", "name": "Set state", "provider": "silo.state", "summary": "Set state to `void`{.state .void}", "config": { "state": "void" } } ], "rescue": [ { "id": "d4e5f6a0-0004-11f1-a000-000000000006", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` NO VERI\*FACTU event workflows ```json Example NO VERI*FACTU event processing workflow expandable theme={"system"} { "name": "NO VERI*FACTU process event", "description": "Generate and store a NO VERI*FACTU event record", "schema": "bill/status", "steps": [ { "id": "e5f6a7b0-0005-11f1-a000-000000000004", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "bbf19740-3a6b-11f1-9a44-6748aa5d4a91", "name": "Modify silo entry", "provider": "silo.modify", "summary": "Default series to \"NVF\"", "config": { "jq": ".series //= \"NVF\"", "merge_type": "application/jq", "scope": "doc" } }, { "id": "a1b2c3d0-0001-11f1-a000-000000000002", "name": "Add sequential code", "provider": "sequence.enumerate", "summary": "Dynamic · NO VERI*FACTU · 000001", "config": { "name": "NoVerifactu", "padding": 6, "start": 1 } }, { "id": "e5f6a7b0-0005-11f1-a000-000000000006", "name": "Sign envelope", "provider": "silo.close" }, { "id": "f8df5470-3c97-11f1-8c73-6dd226144d30", "name": "Generate event for NO VERI*FACTU", "provider": "gov-es.noverifactu.generate.event" }, { "id": "050b05a0-3c98-11f1-8c73-6dd226144d30", "name": "Record for NO VERI*FACTU", "provider": "gov-es.noverifactu.record" }, { "id": "e5f6a7b0-0005-11f1-a000-000000000005", "name": "Set state", "provider": "silo.state", "summary": "Set state to `registered`{.state .registered}", "config": { "state": "registered" } } ], "rescue": [ { "id": "e5f6a7b0-0005-11f1-a000-000000000003", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` ```json Example NO VERI*FACTU summary event cron workflow expandable theme={"system"} { "name": "NO VERI*FACTU summary event", "description": "Build a NO VERI*FACTU summary event (cron-driven)", "schema": "org/party", "steps": [ { "id": "f6a7b8c0-0006-11f1-a000-000000000001", "name": "Build status for NO VERI*FACTU", "provider": "gov-es.noverifactu.build.status", "summary": "Build status: 10 - Summary event", "config": { "event_type": "10" } }, { "id": "4f527c60-3a95-11f1-a472-21be9722e465", "name": "Create a job", "provider": "transform.job.create", "summary": "Send to NO VERI*FACTU process event (bill/status)", "config": { "silo_entry_meta_key": "", "workflow_id": "" } } ], "rescue": [ { "id": "f6a7b8c0-0006-11f1-a000-000000000003", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` A Spanish company with its NIF and the legal representative required for supplier registration. ```json Spain supplier example theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "people": [ { "name": { "given": "Juan", "surname": "Pérez González" }, "identities": [ { "key": "national", "code": "123456789A" } ], "addresses": [ { "num": "10", "street": "Calle Ejemplo", "locality": "Madrid", "region": "Madrid", "code": "28020", "country": "ES" } ] } ], "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] } ``` A Spanish business customer identified by NIF with a full address. ```json Spain customer example theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "Cliente Ejemplo SA", "tax_id": { "country": "ES", "code": "A58818501" }, "addresses": [ { "num": "12", "street": "Gran Vía", "locality": "Madrid", "region": "Madrid", "code": "28013", "country": "ES" } ], "emails": [ { "addr": "compras@clienteejemplo.es" } ] } ``` TicketBAI example documents In this example, we're issuing a standard B2B invoice from a Basque supplier to a customer in Madrid. Scenario details: * The supplier is based out of Bilbao in Bizkaia, using the sandbox data provided by TicketBAI. * The customer is in Madrid. * They're selling software development services with standard VAT. * The series for the invoice is "F1". Notice: * the minimal version in the first tab contains only the essential fields required to create the invoice, * we're applying the [`es-tbai-v1`](https://docs.gobl.org/addons/es-tbai-v1) addon to ensure GOBL's TicketBAI validation checks are applied, * there is no `currency` nor `issue_date`, as these will be assigned automatically, * there is no invoice `code` as this will be assigned by the workflow, * TicketBAI **requires** a general note, so we've added one at the bottom, * when running `gobl build`, the system automatically calculates totals, assigns the `$regime` to `ES`, sets the [`es-tbai-region`](https://docs.gobl.org/addons/es-tbai-v1#region-code) extension to `BI` (Bizkaia) based on the supplier's address, applies the standard VAT rate (21%), and assigns the [`es-tbai-product`](https://docs.gobl.org/addons/es-tbai-v1#ticketbai-product-key) extension to `services` based on the item unit, * the built version in the second tab shows the normalized document with calculated totals, line item sums, tax breakdowns, and automatically generated fields, and, * there are no totals or calculations in the minimal version; all these will be made automatically when uploading. ```json TicketBAI B2B Invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": ["es-tbai-v1"], "series": "F1", "supplier": { "name": "HFPn5yhXZ9tdD4pHRbvwymaVPrGZQr", "tax_id": { "country": "ES", "code": "A99805194" }, "addresses": [ { "num": "42", "street": "San Frantzisko", "locality": "Bilbo", "region": "Bizkaia", "code": "48003", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Receive One S.L.", "tax_id": { "country": "ES", "code": "B98602642" }, "emails": [ { "addr": "billing@example.com" } ], "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ] }, "lines": [ { "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "taxes": [ { "cat": "VAT", "rate": "standard" } ] } ], "notes": [ { "key": "general", "text": "Invoice for development services" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-tbai-v1" ], "type": "standard", "series": "F1", "issue_date": "2026-07-08", "currency": "EUR", "tax": { "ext": { "es-tbai-region": "BI" } }, "supplier": { "name": "HFPn5yhXZ9tdD4pHRbvwymaVPrGZQr", "tax_id": { "country": "ES", "code": "A99805194" }, "addresses": [ { "num": "42", "street": "San Frantzisko", "locality": "Bilbo", "region": "Bizkaia", "code": "48003", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Receive One S.L.", "tax_id": { "country": "ES", "code": "B98602642" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "21.0%", "ext": { "es-tbai-product": "services", "es-tbai-regime": "01" } } ], "total": "1800.00" } ], "totals": { "sum": "1800.00", "total": "1800.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "es-tbai-product": "services", "es-tbai-regime": "01" }, "base": "1800.00", "percent": "21.0%", "amount": "378.00" } ], "amount": "378.00" } ], "sum": "378.00" }, "tax": "378.00", "total_with_tax": "2178.00", "payable": "2178.00" }, "notes": [ { "key": "general", "text": "Invoice for development services" } ] } ``` In this example, we're issuing a simplified B2C invoice from a Basque supplier for an in-person sale. Scenario details: * The supplier is based out of Bilbao in Bizkaia, using the sandbox data provided by TicketBAI. * There is no customer. * Physical goods are being sold with a standard VAT rate. * The series for the invoice is "FS1". Notice: * the minimal version in the first tab contains only the essential fields required to create the simplified invoice, * there is no `customer` object, * the `tax` object contains the `prices_include` value set to `VAT`, which will ensure all totals will be calculated assuming that prices include VAT, * the line item includes a [`es-tbai-product`](https://docs.gobl.org/addons/es-tbai-v1#ticketbai-product-key) extension with the value `goods`, * TicketBAI **requires** a general note, in this case we've added a generic message, * when running `gobl build`, the system automatically calculates the tax-included totals (splitting the €25.10 price into €20.74 base + €4.36 VAT), assigns the `$regime` to `ES`, sets the [`es-tbai-region`](https://docs.gobl.org/addons/es-tbai-v1#region-code) extension to `BI` (Bizkaia), applies the standard VAT rate (21%), and normalizes all fields, * the built version in the second tab shows the normalized document with calculated totals including tax-included calculations, line item sums, tax breakdowns, and automatically generated fields, and, * there are no totals or calculations in the minimal version; all these will be made automatically when uploading. ```json TicketBAI B2C Invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": ["es-tbai-v1"], "$tags": ["simplified"], "series": "FS1", "tax": { "prices_include": "VAT" }, "supplier": { "name": "HFPn5yhXZ9tdD4pHRbvwymaVPrGZQr", "tax_id": { "country": "ES", "code": "A99805194" }, "addresses": [ { "num": "42", "street": "San Frantzisko", "locality": "Bilbo", "region": "Bizkaia", "code": "48003", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "lines": [ { "quantity": "1", "item": { "name": "Advanced screwdriver set", "price": "25.10", "ext": { "es-tbai-product": "goods" } }, "taxes": [ { "cat": "VAT", "rate": "standard" } ] } ], "notes": [ { "key": "general", "text": "In person sale" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-tbai-v1" ], "$tags": [ "simplified" ], "type": "standard", "series": "FS1", "issue_date": "2026-07-08", "currency": "EUR", "tax": { "prices_include": "VAT", "ext": { "es-tbai-region": "BI", "es-tbai-simplified": "S" } }, "supplier": { "name": "HFPn5yhXZ9tdD4pHRbvwymaVPrGZQr", "tax_id": { "country": "ES", "code": "A99805194" }, "addresses": [ { "num": "42", "street": "San Frantzisko", "locality": "Bilbo", "region": "Bizkaia", "code": "48003", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "lines": [ { "i": 1, "quantity": "1", "item": { "name": "Advanced screwdriver set", "price": "25.10", "ext": { "es-tbai-product": "goods" } }, "sum": "25.10", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "21.0%", "ext": { "es-tbai-product": "services", "es-tbai-regime": "01" } } ], "total": "25.10" } ], "totals": { "sum": "25.10", "tax_included": "4.36", "total": "20.74", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "es-tbai-product": "services", "es-tbai-regime": "01" }, "base": "20.74", "percent": "21.0%", "amount": "4.36" } ], "amount": "4.36" } ], "sum": "4.36" }, "tax": "4.36", "total_with_tax": "25.10", "payable": "25.10" }, "notes": [ { "key": "general", "text": "In person sale" } ] } ``` In this example, we're issuing a rectifying invoice that credits part of a previously issued TicketBAI invoice. Notice: * the `type` is set to `credit-note`, which produces a factura rectificativa "por diferencias" — the lines describe the amounts being credited rather than restating the full corrected invoice, * the `preceding` array references the original invoice by `series`, `code`, and `issue_date`, * the preceding entry carries the [`es-tbai-correction`](https://docs.gobl.org/addons/es-tbai-v1#correction-code) extension set to `R1` (correction due to legal grounds, art. 80.1, 80.2, and 80.6 of the Spanish VAT law); codes `R2`–`R4` cover other correction causes, * TicketBAI **requires** a general note, so we've added one at the bottom, and, * there are no totals or calculations in the minimal version; all these will be made automatically when uploading. ```json TicketBAI Credit Note theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": ["es-tbai-v1"], "type": "credit-note", "series": "R1", "preceding": [ { "type": "standard", "series": "F1", "code": "0042", "issue_date": "2025-03-10", "ext": { "es-tbai-correction": "R1" } } ], "supplier": { "name": "HFPn5yhXZ9tdD4pHRbvwymaVPrGZQr", "tax_id": { "country": "ES", "code": "A99805194" }, "addresses": [ { "num": "42", "street": "San Frantzisko", "locality": "Bilbo", "region": "Bizkaia", "code": "48003", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Receive One S.L.", "tax_id": { "country": "ES", "code": "B98602642" }, "emails": [ { "addr": "billing@example.com" } ], "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ] }, "lines": [ { "quantity": "5", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "taxes": [ { "cat": "VAT", "rate": "standard" } ] } ], "notes": [ { "key": "general", "text": "Credit note for services not delivered" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-tbai-v1" ], "type": "credit-note", "series": "R1", "issue_date": "2026-07-21", "currency": "EUR", "preceding": [ { "type": "standard", "issue_date": "2025-03-10", "series": "F1", "code": "0042", "ext": { "es-tbai-correction": "R1" } } ], "tax": { "ext": { "es-tbai-region": "BI" } }, "supplier": { "name": "HFPn5yhXZ9tdD4pHRbvwymaVPrGZQr", "tax_id": { "country": "ES", "code": "A99805194" }, "addresses": [ { "num": "42", "street": "San Frantzisko", "locality": "Bilbo", "region": "Bizkaia", "code": "48003", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Receive One S.L.", "tax_id": { "country": "ES", "code": "B98602642" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "lines": [ { "i": 1, "quantity": "5", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "450.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "21.0%", "ext": { "es-tbai-product": "services", "es-tbai-regime": "01" } } ], "total": "450.00" } ], "totals": { "sum": "450.00", "total": "450.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "es-tbai-product": "services", "es-tbai-regime": "01" }, "base": "450.00", "percent": "21.0%", "amount": "94.50" } ], "amount": "94.50" } ], "sum": "94.50" }, "tax": "94.50", "total_with_tax": "544.50", "payable": "544.50" }, "notes": [ { "key": "general", "text": "Credit note for services not delivered" } ] } ``` Facturae example documents A standard Facturae invoice from a Spanish supplier to a Spanish public sector customer. Notice: * the [`es-facturae-v3`](https://docs.gobl.org/addons/es-facturae-v3) addon is required, * the `es-facturae-doc-type` and `es-facturae-invoice-class` tax extensions are set automatically by the addon when the document is built or uploaded — the built version shows the derived values, * both supplier and customer must have full address details and valid Spanish tax IDs. ```json Facturae B2G Invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-facturae-v3" ], "code": "TEST01001F", "issue_date": "2021-12-08", "supplier": { "name": "Hypeprop Sl", "alias": "Hypeprop", "tax_id": { "country": "ES", "code": "B23103039" }, "people": [ { "name": { "given": "Paloma", "surname": "Araujo" } } ], "addresses": [ { "num": "74", "street": "Campo Real", "locality": "Torrejón De La Calzada", "region": "Madrid", "code": "28023", "country": "ES" } ], "emails": [ { "addr": "rxazy27xfc@iname.com" } ], "telephones": [ { "label": "office", "num": "+34910730028" } ] }, "customer": { "name": "Moniward Sl", "tax_id": { "country": "ES", "code": "B77436020" }, "addresses": [ { "num": "35", "street": "Plaza Horno", "locality": "Nombela", "region": "Toledo", "code": "45083", "country": "ES" } ], "emails": [ { "addr": "bfn25xf3p@lycos.co.uk" } ] }, "lines": [ { "quantity": "20", "item": { "name": "Operations and development - day rate", "price": "200.00" }, "taxes": [ { "cat": "VAT", "rate": "general" } ] }, { "quantity": "2", "item": { "name": "Additional Overtime", "price": "101.00" }, "taxes": [ { "cat": "VAT", "rate": "general" } ] } ], "payment": { "terms": { "key": "due-date", "due_dates": [ { "date": "2021-12-30", "percent": "100%" } ], "notes": "Some kind of payment term note" }, "instructions": { "key": "credit-transfer", "credit_transfer": [ { "iban": "ES25 0188 2570 7185 4470 4761", "name": "Bankrandom" } ] } }, "notes": [ { "key": "general", "text": "Thank you for your custom!" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-facturae-v3" ], "type": "standard", "code": "TEST01001F", "issue_date": "2021-12-08", "currency": "EUR", "tax": { "ext": { "es-facturae-doc-type": "FC", "es-facturae-invoice-class": "OO" } }, "supplier": { "name": "Hypeprop Sl", "alias": "Hypeprop", "tax_id": { "country": "ES", "code": "B23103039" }, "people": [ { "name": { "given": "Paloma", "surname": "Araujo" } } ], "addresses": [ { "num": "74", "street": "Campo Real", "locality": "Torrejón De La Calzada", "region": "Madrid", "code": "28023", "country": "ES" } ], "emails": [ { "addr": "rxazy27xfc@iname.com" } ], "telephones": [ { "label": "office", "num": "+34910730028" } ] }, "customer": { "name": "Moniward Sl", "tax_id": { "country": "ES", "code": "B77436020" }, "addresses": [ { "num": "35", "street": "Plaza Horno", "locality": "Nombela", "region": "Toledo", "code": "45083", "country": "ES" } ], "emails": [ { "addr": "bfn25xf3p@lycos.co.uk" } ] }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Operations and development - day rate", "price": "200.00" }, "sum": "4000.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "21.0%" } ], "total": "4000.00" }, { "i": 2, "quantity": "2", "item": { "name": "Additional Overtime", "price": "101.00" }, "sum": "202.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "21.0%" } ], "total": "202.00" } ], "payment": { "terms": { "key": "due-date", "due_dates": [ { "date": "2021-12-30", "amount": "5084.42", "percent": "100%" } ], "notes": "Some kind of payment term note" }, "instructions": { "key": "credit-transfer", "credit_transfer": [ { "iban": "ES25 0188 2570 7185 4470 4761", "name": "Bankrandom" } ] } }, "totals": { "sum": "4202.00", "total": "4202.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "base": "4202.00", "percent": "21.0%", "amount": "882.42" } ], "amount": "882.42" } ], "sum": "882.42" }, "tax": "882.42", "total_with_tax": "5084.42", "payable": "5084.42" }, "notes": [ { "key": "general", "text": "Thank you for your custom!" } ] } ``` A corrective invoice (credit note) referencing a previous Facturae invoice. Notice: * the `type` is set to `credit-note`, * a `preceding` entry references the original invoice with the `es-facturae-correction` code, * the addon derives the `es-facturae-invoice-class` extension as `OR` (rectificativa) during build — you don't need to set it by hand. ```json Facturae Credit Note theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-facturae-v3" ], "type": "credit-note", "code": "TEST01001R", "issue_date": "2021-12-08", "preceding": [ { "type": "standard", "issue_date": "2021-12-08", "code": "TEST01001F", "ext": { "es-facturae-correction": "01" } } ], "supplier": { "name": "Hypeprop Sl", "alias": "Hypeprop", "tax_id": { "country": "ES", "code": "B23103039" }, "people": [ { "name": { "given": "Paloma", "surname": "Araujo" } } ], "addresses": [ { "num": "74", "street": "Campo Real", "locality": "Torrejón De La Calzada", "region": "Madrid", "code": "28023", "country": "ES" } ], "emails": [ { "addr": "rxazy27xfc@iname.com" } ], "telephones": [ { "label": "office", "num": "+34910730028" } ] }, "customer": { "name": "Moniward Sl", "tax_id": { "country": "ES", "code": "B77436020" }, "addresses": [ { "num": "35", "street": "Plaza Horno", "locality": "Nombela", "region": "Toledo", "code": "45083", "country": "ES" } ], "emails": [ { "addr": "bfn25xf3p@lycos.co.uk" } ] }, "lines": [ { "quantity": "20", "item": { "name": "Operations and development - day rate", "price": "200.00" }, "taxes": [ { "cat": "VAT", "rate": "general" } ] }, { "quantity": "2", "item": { "name": "Additional Overtime", "price": "101.00" }, "taxes": [ { "cat": "VAT", "rate": "general" } ] } ], "notes": [ { "key": "general", "text": "Thank you for your custom!" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-facturae-v3" ], "type": "credit-note", "code": "TEST01001R", "issue_date": "2021-12-08", "currency": "EUR", "preceding": [ { "type": "standard", "issue_date": "2021-12-08", "code": "TEST01001F", "ext": { "es-facturae-correction": "01" } } ], "tax": { "ext": { "es-facturae-doc-type": "FC", "es-facturae-invoice-class": "OR" } }, "supplier": { "name": "Hypeprop Sl", "alias": "Hypeprop", "tax_id": { "country": "ES", "code": "B23103039" }, "people": [ { "name": { "given": "Paloma", "surname": "Araujo" } } ], "addresses": [ { "num": "74", "street": "Campo Real", "locality": "Torrejón De La Calzada", "region": "Madrid", "code": "28023", "country": "ES" } ], "emails": [ { "addr": "rxazy27xfc@iname.com" } ], "telephones": [ { "label": "office", "num": "+34910730028" } ] }, "customer": { "name": "Moniward Sl", "tax_id": { "country": "ES", "code": "B77436020" }, "addresses": [ { "num": "35", "street": "Plaza Horno", "locality": "Nombela", "region": "Toledo", "code": "45083", "country": "ES" } ], "emails": [ { "addr": "bfn25xf3p@lycos.co.uk" } ] }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Operations and development - day rate", "price": "200.00" }, "sum": "4000.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "21.0%" } ], "total": "4000.00" }, { "i": 2, "quantity": "2", "item": { "name": "Additional Overtime", "price": "101.00" }, "sum": "202.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "21.0%" } ], "total": "202.00" } ], "totals": { "sum": "4202.00", "total": "4202.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "base": "4202.00", "percent": "21.0%", "amount": "882.42" } ], "amount": "882.42" } ], "sum": "882.42" }, "tax": "882.42", "total_with_tax": "5084.42", "payable": "5084.42" }, "notes": [ { "key": "general", "text": "Thank you for your custom!" } ] } ``` An invoice addressed to a public administration via the FACe platform, including the three required DIR3 administrative centers. Notice: * the customer includes an identity with `scope: "tax"` for the **Oficina Contable** (DIR3 code `01`), * `delivery.receiver` includes the **Órgano Gestor** identity (DIR3 code `02`), * `ordering.buyer` includes the **Unidad Tramitadora** identity (DIR3 code `03`), * each public body publishes their DIR3 codes — look them up in the [DIR3 directory](https://administracionelectronica.gob.es/ctt/dir3). ```json Facturae FACe Invoice (B2G with Admin Centers) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-facturae-v3" ], "code": "TEST01002F", "issue_date": "2021-12-08", "supplier": { "name": "Hypeprop Sl", "alias": "Hypeprop", "tax_id": { "country": "ES", "code": "B23103039" }, "people": [ { "name": { "given": "Paloma", "surname": "Araujo" } } ], "addresses": [ { "num": "74", "street": "Campo Real", "locality": "Torrejón De La Calzada", "region": "Madrid", "code": "28023", "country": "ES" } ], "emails": [ { "addr": "rxazy27xfc@iname.com" } ], "telephones": [ { "label": "office", "num": "+34910730028" } ] }, "customer": { "name": "Ayuntamiento de Madrid", "tax_id": { "country": "ES", "code": "P2807900B" }, "identities": [ { "scope": "tax", "code": "L01280796" } ], "addresses": [ { "num": "4", "street": "Plaza de la Villa", "locality": "Madrid", "region": "Madrid", "code": "28005", "country": "ES" } ], "emails": [ { "addr": "facturacion@madrid.es" } ] }, "lines": [ { "quantity": "20", "item": { "name": "Services rendered", "price": "200.00" }, "taxes": [ { "cat": "VAT", "rate": "general" } ] } ], "ordering": { "buyer": { "name": "Departamento de Compras", "identities": [ { "code": "LA0007408" } ], "addresses": [ { "num": "10", "street": "Gran Vía", "locality": "Madrid", "region": "Madrid", "code": "28013", "country": "ES" } ] } }, "payment": { "terms": { "key": "due-date", "due_dates": [ { "date": "2021-12-30", "percent": "100%" } ] }, "instructions": { "key": "credit-transfer", "credit_transfer": [ { "iban": "ES25 0188 2570 7185 4470 4761", "name": "Bankrandom" } ] } }, "delivery": { "receiver": { "name": "Concejalía de Hacienda", "identities": [ { "code": "LA0007407" } ], "addresses": [ { "num": "3", "street": "Calle Alcalá", "locality": "Madrid", "region": "Madrid", "code": "28014", "country": "ES" } ] } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-facturae-v3" ], "type": "standard", "code": "TEST01002F", "issue_date": "2021-12-08", "currency": "EUR", "tax": { "ext": { "es-facturae-doc-type": "FC", "es-facturae-invoice-class": "OO" } }, "supplier": { "name": "Hypeprop Sl", "alias": "Hypeprop", "tax_id": { "country": "ES", "code": "B23103039" }, "people": [ { "name": { "given": "Paloma", "surname": "Araujo" } } ], "addresses": [ { "num": "74", "street": "Campo Real", "locality": "Torrejón De La Calzada", "region": "Madrid", "code": "28023", "country": "ES" } ], "emails": [ { "addr": "rxazy27xfc@iname.com" } ], "telephones": [ { "label": "office", "num": "+34910730028" } ] }, "customer": { "name": "Ayuntamiento de Madrid", "tax_id": { "country": "ES", "code": "P2807900B" }, "identities": [ { "scope": "tax", "code": "L01280796" } ], "addresses": [ { "num": "4", "street": "Plaza de la Villa", "locality": "Madrid", "region": "Madrid", "code": "28005", "country": "ES" } ], "emails": [ { "addr": "facturacion@madrid.es" } ] }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Services rendered", "price": "200.00" }, "sum": "4000.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "21.0%" } ], "total": "4000.00" } ], "ordering": { "buyer": { "name": "Departamento de Compras", "identities": [ { "code": "LA0007408" } ], "addresses": [ { "num": "10", "street": "Gran Vía", "locality": "Madrid", "region": "Madrid", "code": "28013", "country": "ES" } ] } }, "payment": { "terms": { "key": "due-date", "due_dates": [ { "date": "2021-12-30", "amount": "4840.00", "percent": "100%" } ] }, "instructions": { "key": "credit-transfer", "credit_transfer": [ { "iban": "ES25 0188 2570 7185 4470 4761", "name": "Bankrandom" } ] } }, "delivery": { "receiver": { "name": "Concejalía de Hacienda", "identities": [ { "code": "LA0007407" } ], "addresses": [ { "num": "3", "street": "Calle Alcalá", "locality": "Madrid", "region": "Madrid", "code": "28014", "country": "ES" } ] } }, "totals": { "sum": "4000.00", "total": "4000.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "base": "4000.00", "percent": "21.0%", "amount": "840.00" } ], "amount": "840.00" } ], "sum": "840.00" }, "tax": "840.00", "total_with_tax": "4840.00", "payable": "4840.00" } } ``` SII example documents Simplified invoices are used for B2C transactions when the customer is not a business. The transaction amount should be under €400 (VAT included) with some [exceptions](https://sede.agenciatributaria.gob.es/Sede/iva/facturacion-registro/facturacion-iva/tipos-factura.html) in which this threshold is increased to €3,000. Notice: * the minimal version in the first tab contains only the essential fields required to create the simplified invoice, * to create a simplified SII invoice, include the `simplified` tag in your GOBL document with the [`es-sii-v1`](https://docs.gobl.org/addons/es-sii-v1) addon, * when running `gobl build`, the system automatically calculates totals, assigns the `$regime` to `ES`, sets the [`es-sii-doc-type`](https://docs.gobl.org/addons/es-sii-v1#invoice-type) extension to `F2` (Simplified invoice), applies the standard VAT rate (21%), and normalizes all fields, * the built version in the second tab shows the normalized document with calculated totals, line item sums, tax breakdowns, and automatically generated fields, and, * there are no totals or calculations in the minimal version; all these will be made automatically when uploading. ```json SII B2C Invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "es-sii-v1" ], "$tags": [ "simplified" ], "series": "SAMPLE", "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "lines": [ { "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "taxes": [ { "cat": "VAT", "rate": "general" } ] } ], "notes": [ { "key": "general", "text": "This is a sample invoice with a standard tax" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-sii-v1" ], "$tags": [ "simplified" ], "type": "standard", "series": "SAMPLE", "issue_date": "2026-07-08", "currency": "EUR", "tax": { "ext": { "es-sii-doc-type": "F2" } }, "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "21.0%", "ext": { "es-sii-regime": "01" } } ], "total": "1800.00" } ], "totals": { "sum": "1800.00", "total": "1800.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "es-sii-regime": "01" }, "base": "1800.00", "percent": "21.0%", "amount": "378.00" } ], "amount": "378.00" } ], "sum": "378.00" }, "tax": "378.00", "total_with_tax": "2178.00", "payable": "2178.00" }, "notes": [ { "key": "general", "text": "This is a sample invoice with a standard tax" } ] } ``` Regular invoices are used for B2B transactions. Regular invoices must be issued when: * The customer is a registered business (has a tax identification number). * The transaction amount is €400 VAT included or above, or the customer requires a full invoice. * The customer needs a complete invoice with all tax details for accounting or tax purposes. Notice: * the minimal version in the first tab contains only the essential fields required to create the standard B2B invoice, * to create a regular SII invoice, include the [`es-sii-v1`](https://docs.gobl.org/addons/es-sii-v1) addon and ensure the `customer` field contains valid tax identification details, * the `supplier` must be previously registered with the tax authority and the `customer` NIF or VAT ID must be valid, * when running `gobl build`, the system automatically calculates totals, assigns the `$regime` to `ES`, sets the [`es-sii-doc-type`](https://docs.gobl.org/addons/es-sii-v1#invoice-type) extension to `F1` (Standard invoice), applies the standard VAT rate (21%), and normalizes all fields, * the built version in the second tab shows the normalized document with calculated totals, line item sums, tax breakdowns, and automatically generated fields, and, * there are no totals or calculations in the minimal version; all these will be made automatically when uploading. ```json SII B2B Invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "es-sii-v1" ], "series": "SAMPLE", "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Sample Consumer", "tax_id": { "country": "ES", "code": "B63272603" } }, "lines": [ { "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "taxes": [ { "cat": "VAT", "rate": "general" } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-sii-v1" ], "type": "standard", "series": "SAMPLE", "issue_date": "2026-07-08", "currency": "EUR", "tax": { "ext": { "es-sii-doc-type": "F1" } }, "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Sample Consumer", "tax_id": { "country": "ES", "code": "B63272603" } }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "21.0%", "ext": { "es-sii-regime": "01" } } ], "total": "1800.00" } ], "totals": { "sum": "1800.00", "total": "1800.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "es-sii-regime": "01" }, "base": "1800.00", "percent": "21.0%", "amount": "378.00" } ], "amount": "378.00" } ], "sum": "378.00" }, "tax": "378.00", "total_with_tax": "2178.00", "payable": "2178.00" } } ``` Reverse charge invoices are used for B2B services provided to customers in other EU member states. Reverse charge must be applied when: * The customer is a registered business in another EU member state (has a valid EU VAT ID). * The service is provided to a business customer (B2B), not a consumer. * The service is subject to VAT but the customer accounts for the VAT in their own country. Notice: * the minimal version in the first tab contains only the essential fields required to create the reverse charge invoice, * to create a reverse charge SII invoice, use the tax key `reverse-charge` in your invoice lines, * you also need to set the items `key` to `services`, which will generate a breakdown by operation type required for this type of invoices, * with reverse charge, no VAT is charged by the supplier; the customer accounts for VAT in their own country, * the `supplier` must be previously registered with the tax authority and the `customer` VAT ID must be valid and registered in the EU VIES system, * when running `gobl build`, the system automatically sets the operation type to `S2` (Subject and Not Exempt - With reverse charge) when reporting the document to SII, applies the reverse charge tax treatment, and normalizes all fields, * the built version in the second tab shows the normalized document with the reverse charge configuration, operation type breakdown, and automatically generated fields, and, * there are no totals or calculations in the minimal version; all these will be made automatically when uploading. ```json SII B2B Invoice Services (EU) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "es-sii-v1" ], "series": "SAMPLE", "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Sample Consumer", "tax_id": { "country": "DE", "code": "111111125" } }, "lines": [ { "quantity": "20", "item": { "key": "services", "name": "Development services", "price": "90.00", "unit": "h" }, "taxes": [ { "cat": "VAT", "key": "reverse-charge" } ] } ], "notes": [ { "key": "general", "text": "This is a sample invoice with reverse charge" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-sii-v1" ], "type": "standard", "series": "SAMPLE", "issue_date": "2026-07-08", "currency": "EUR", "tax": { "ext": { "es-sii-doc-type": "F1" } }, "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Sample Consumer", "tax_id": { "country": "DE", "code": "111111125" } }, "lines": [ { "i": 1, "quantity": "20", "item": { "key": "services", "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "taxes": [ { "cat": "VAT", "key": "reverse-charge", "ext": { "es-sii-product": "services", "es-sii-regime": "01" } } ], "total": "1800.00" } ], "totals": { "sum": "1800.00", "total": "1800.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "reverse-charge", "ext": { "es-sii-product": "services", "es-sii-regime": "01" }, "base": "1800.00", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "1800.00", "payable": "1800.00" }, "notes": [ { "key": "general", "text": "This is a sample invoice with reverse charge" } ] } ``` Intra-community supply invoices are used for B2B goods delivered to customers in other EU member states. Intra-community supplies must be applied when: * The customer is a registered business in another EU member state (has a valid EU VAT ID). * Goods are physically delivered to another EU member state. * The supply is exempt from VAT in the origin country (Spain) and subject to VAT in the destination country. Notice: * the minimal version in the first tab contains only the essential fields required to create the intra-community supply invoice, * to create an intra-community supply SII invoice, use the tax key `intra-community` in your invoice lines, * you also need to set the items `key` to `goods`, which will report to SII a breakdown by operation type required for this type of invoices, * with intra-community supplies, no VAT is charged in Spain; the customer accounts for VAT in their destination country, * the `supplier` must be previously registered with the tax authority and the `customer` VAT ID must be valid and registered in the EU VIES system, * when running `gobl build`, the [`es-sii-v1`](https://docs.gobl.org/addons/es-sii-v1) addon automatically sets the [`es-sii-exempt`](https://docs.gobl.org/addons/es-sii-v1#exemption-reason) extension to `E5` ([Artículo 25 Ley de IVA](https://www.boe.es/eli/es/l/1992/12/28/37/con#a25)) and the [`es-sii-regime`](https://docs.gobl.org/addons/es-sii-v1#special-regime-or-relevance-key) extension to `02` (Export), * the built version in the second tab shows the normalized document with the intra-community configuration, exemption codes, operation type breakdown, and automatically generated fields, and, * there are no totals or calculations in the minimal version; all these will be made automatically when uploading. ```json SII B2B Invoice Goods (EU) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "es-sii-v1" ], "series": "SAMPLE", "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Sample Consumer", "tax_id": { "country": "DE", "code": "111111125" } }, "lines": [ { "quantity": "20", "item": { "key": "goods", "name": "Goods", "price": "90.00" }, "taxes": [ { "cat": "VAT", "key": "intra-community", "ext": { "es-sii-regime": "02" } } ] } ], "notes": [ { "key": "general", "text": "This is a sample invoice with a intra-community" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-sii-v1" ], "type": "standard", "series": "SAMPLE", "issue_date": "2026-07-08", "currency": "EUR", "tax": { "ext": { "es-sii-doc-type": "F1" } }, "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Sample Consumer", "tax_id": { "country": "DE", "code": "111111125" } }, "lines": [ { "i": 1, "quantity": "20", "item": { "key": "goods", "name": "Goods", "price": "90.00" }, "sum": "1800.00", "taxes": [ { "cat": "VAT", "key": "intra-community", "ext": { "es-sii-exempt": "E5", "es-sii-product": "goods", "es-sii-regime": "02" } } ], "total": "1800.00" } ], "totals": { "sum": "1800.00", "total": "1800.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "intra-community", "ext": { "es-sii-exempt": "E5", "es-sii-product": "goods", "es-sii-regime": "02" }, "base": "1800.00", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "1800.00", "payable": "1800.00" }, "notes": [ { "key": "general", "text": "This is a sample invoice with a intra-community" } ] } ``` Outside scope invoices are used for B2B services provided to customers outside the EU. Notice: * the minimal version in the first tab contains only the essential fields required to create the outside scope invoice, * to create an outside scope SII invoice, use the tax key `outside-scope` in your invoice lines, * services provided to non-EU customers are generally outside the scope of Spanish VAT, * the `supplier` must be previously registered with the tax authority; customer tax identification is optional but recommended for record-keeping purposes, * when running `gobl build`, the [`es-sii-v1`](https://docs.gobl.org/addons/es-sii-v1) addon automatically sets the [`es-sii-oot`](https://docs.gobl.org/addons/es-sii-v1#type-of-operation-outside-scope) extension to `location` and normalizes all fields, * the built version in the second tab shows the normalized document with the outside scope configuration and automatically generated fields, and, * there are no totals or calculations in the minimal version; all these will be made automatically when uploading. ```json SII B2B invoice services (non-EU) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "es-sii-v1" ], "series": "SAMPLE", "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Sample Consumer", "tax_id": { "country": "SG", "code": "201312345A" } }, "lines": [ { "quantity": "20", "item": { "key": "services", "name": "Development services", "price": "90.00", "unit": "h" }, "taxes": [ { "cat": "VAT", "key": "outside-scope" } ] } ], "notes": [ { "key": "general", "text": "This is a sample invoice with a outside-scope tax" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-sii-v1" ], "type": "standard", "series": "SAMPLE", "issue_date": "2026-07-08", "currency": "EUR", "tax": { "ext": { "es-sii-doc-type": "F1" } }, "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Sample Consumer", "tax_id": { "country": "SG", "code": "201312345A" } }, "lines": [ { "i": 1, "quantity": "20", "item": { "key": "services", "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "taxes": [ { "cat": "VAT", "key": "outside-scope", "ext": { "es-sii-outside-scope": "location", "es-sii-product": "services", "es-sii-regime": "01" } } ], "total": "1800.00" } ], "totals": { "sum": "1800.00", "total": "1800.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "outside-scope", "ext": { "es-sii-outside-scope": "location", "es-sii-product": "services", "es-sii-regime": "01" }, "base": "1800.00", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "1800.00", "payable": "1800.00" }, "notes": [ { "key": "general", "text": "This is a sample invoice with a outside-scope tax" } ] } ``` Export invoices are used for B2B goods delivered to customers outside the EU. Notice: * the minimal version in the first tab contains only the essential fields required to create the export invoice, * to create an export SII invoice, use the tax key `export` in your invoice lines, * exported goods are exempt from Spanish VAT, * the `supplier` must be previously registered with the tax authority; customer tax identification is optional but recommended for record-keeping purposes, * when running `gobl build`, the [`es-sii-v1`](https://docs.gobl.org/addons/es-sii-v1) addon automatically sets the [`es-sii-exempt`](https://docs.gobl.org/addons/es-sii-v1#exemption-reason) extension to `E2` ([Artículo 21 Ley de IVA](https://www.boe.es/eli/es/l/1992/12/28/37/con#a21)) and the [`es-sii-regime`](https://docs.gobl.org/addons/es-sii-v1#special-regime-or-relevance-key) extension to `02` (Export), * the built version in the second tab shows the normalized document with the export configuration, exemption codes, and automatically generated fields, and, * there are no totals or calculations in the minimal version; all these will be made automatically when uploading. ```json SII B2B Invoice Goods (No EU) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "es-sii-v1" ], "series": "SAMPLE", "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Sample Consumer", "tax_id": { "country": "SG", "code": "201312345A" } }, "lines": [ { "quantity": "20", "item": { "key": "goods", "name": "Goods", "price": "90.00" }, "taxes": [ { "cat": "VAT", "key": "export" } ] } ], "notes": [ { "key": "general", "text": "This is a sample invoice with an export" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-sii-v1" ], "type": "standard", "series": "SAMPLE", "issue_date": "2026-07-08", "currency": "EUR", "tax": { "ext": { "es-sii-doc-type": "F1" } }, "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Sample Consumer", "tax_id": { "country": "SG", "code": "201312345A" } }, "lines": [ { "i": 1, "quantity": "20", "item": { "key": "goods", "name": "Goods", "price": "90.00" }, "sum": "1800.00", "taxes": [ { "cat": "VAT", "key": "export", "ext": { "es-sii-exempt": "E2", "es-sii-product": "goods", "es-sii-regime": "02" } } ], "total": "1800.00" } ], "totals": { "sum": "1800.00", "total": "1800.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "export", "ext": { "es-sii-exempt": "E2", "es-sii-product": "goods", "es-sii-regime": "02" }, "base": "1800.00", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "1800.00", "payable": "1800.00" }, "notes": [ { "key": "general", "text": "This is a sample invoice with an export" } ] } ``` Exempt `E1` invoices are used for B2B transactions that are exempt from VAT pursuant to [Artículo 20 Ley de IVA](https://www.boe.es/eli/es/l/1992/12/28/37/con#a20), which covers exemptions in internal operations. Notice: * the minimal version in the first tab contains only the essential fields required to create the exempt E1 invoice, * to create an exempt E1 SII invoice, use the tax key `exempt` in your invoice lines, * exempt operations are not subject to VAT but must still be reported, * the `supplier` must be previously registered with the tax authority and the `customer` NIF must be valid, * when running `gobl build`, the [`es-sii-v1`](https://docs.gobl.org/addons/es-sii-v1) addon automatically sets the [`es-sii-exempt`](https://docs.gobl.org/addons/es-sii-v1#exemption-reason) extension to `E1` and normalizes all fields, * the built version in the second tab shows the normalized document with the exempt E1 configuration and automatically generated fields, and, * there are no totals or calculations in the minimal version; all these will be made automatically when uploading. ```json SII B2B Exempt E1 Invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "es-sii-v1" ], "series": "SAMPLE", "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Sample Consumer", "tax_id": { "country": "ES", "code": "B63272603" } }, "lines": [ { "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "taxes": [ { "cat": "VAT", "key": "exempt" } ] } ], "notes": [ { "key": "general", "text": "This is a sample invoice with a exempt tax" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-sii-v1" ], "type": "standard", "series": "SAMPLE", "issue_date": "2026-07-08", "currency": "EUR", "tax": { "ext": { "es-sii-doc-type": "F1" } }, "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Sample Consumer", "tax_id": { "country": "ES", "code": "B63272603" } }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "taxes": [ { "cat": "VAT", "key": "exempt", "ext": { "es-sii-exempt": "E1", "es-sii-regime": "01" } } ], "total": "1800.00" } ], "totals": { "sum": "1800.00", "total": "1800.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "exempt", "ext": { "es-sii-exempt": "E1", "es-sii-regime": "01" }, "base": "1800.00", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "1800.00", "payable": "1800.00" }, "notes": [ { "key": "general", "text": "This is a sample invoice with a exempt tax" } ] } ``` One-Stop-Shop (OSS) invoices are used for B2C distance sales of goods and services to consumers in other EU member states when the supplier is registered under the OSS scheme. Notice: * the minimal version in the first tab contains only the essential fields required to create the OSS invoice, * to create an OSS SII invoice, include the `simplified` tag in your GOBL document with the [`es-sii-v1`](https://docs.gobl.org/addons/es-sii-v1) addon, * OSS allows suppliers to register for VAT in one EU member state and account for VAT on all EU distance sales through that single registration, * the `supplier` must be previously registered with the tax authority and enrolled in the OSS scheme, * when running `gobl build`, the invoice will be treated as a simplified invoice ([`es-sii-doc-type`](https://docs.gobl.org/addons/es-sii-v1#invoice-type) extension set to `F2`) and VAT is accounted for through the OSS scheme in the destination country, * the built version in the second tab shows the normalized document with the OSS configuration and automatically generated fields, and, * there are no totals or calculations in the minimal version; all these will be made automatically when uploading. ```json SII B2C One Stop Shop Invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "es-sii-v1" ], "$tags": [ "simplified" ], "series": "SAMPLE", "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "lines": [ { "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "taxes": [ { "cat": "VAT", "rate": "general" } ] } ], "notes": [ { "key": "general", "text": "This is a sample invoice with a standard tax" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-sii-v1" ], "$tags": [ "simplified" ], "type": "standard", "series": "SAMPLE", "issue_date": "2026-07-08", "currency": "EUR", "tax": { "ext": { "es-sii-doc-type": "F2" } }, "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "21.0%", "ext": { "es-sii-regime": "01" } } ], "total": "1800.00" } ], "totals": { "sum": "1800.00", "total": "1800.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "es-sii-regime": "01" }, "base": "1800.00", "percent": "21.0%", "amount": "378.00" } ], "amount": "378.00" } ], "sum": "378.00" }, "tax": "378.00", "total_with_tax": "2178.00", "payable": "2178.00" }, "notes": [ { "key": "general", "text": "This is a sample invoice with a standard tax" } ] } ``` The Catalan tourist tax (IEET, *Impost sobre les Estades en Establiments Turístics*) is a regional tax administered by the Agència Tributària de Catalunya — not the AEAT — so it is **not** reported as a tax to SII. Hotels declare it directly to the Generalitat through the quarterly Modelo 950. Notice: * model the IEET as a document-level [`charge`](https://docs.gobl.org/draft-0/bill/invoice#charge) with `key: "tax"`, which keeps it out of the VAT base while still appearing as a separate line on the guest's invoice as required by Art. 35 of Llei 5/2017, * do not model the IEET as a `VAT` tax line — it is a fixed amount per night, not a percentage, and the AEAT does not collect it, * the `reason` field on the charge is what the guest sees on the invoice; include the establishment type, location, nights, and rate so the breakdown is unambiguous, * accommodation is invoiced with reduced VAT (10%) on the room base; the IEET charge is added on top of `total_with_tax` to produce `payable`, * the quarterly Modelo 950 to the Generalitat is independent of individual invoices, but structuring the IEET as a typed charge lets hotels query their GOBL invoices for the data they need to file it. ```json B2C Hotel + IEET (Catalonia tourist tax) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "es-sii-v1" ], "$tags": [ "simplified" ], "series": "SAMPLE", "issue_date": "2026-05-06", "supplier": { "name": "Hotel Barcelona Example SL", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "locality": "Barcelona", "code": "08001", "country": "ES" } ] }, "lines": [ { "quantity": "3", "item": { "name": "Double room — 3 nights", "price": "180.00", "unit": "day" }, "taxes": [ { "cat": "VAT", "rate": "reduced" } ] } ], "charges": [ { "key": "tax", "reason": "IEET — Hotel 4★, Barcelona city — 3 nights × 1 guest × €3.40", "amount": "10.20" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-sii-v1" ], "$tags": [ "simplified" ], "type": "standard", "series": "SAMPLE", "issue_date": "2026-05-06", "currency": "EUR", "tax": { "ext": { "es-sii-doc-type": "F2" } }, "supplier": { "name": "Hotel Barcelona Example SL", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "locality": "Barcelona", "code": "08001", "country": "ES" } ] }, "lines": [ { "i": 1, "quantity": "3", "item": { "name": "Double room — 3 nights", "price": "180.00", "unit": "day" }, "sum": "540.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "reduced", "percent": "10.0%", "ext": { "es-sii-regime": "01" } } ], "total": "540.00" } ], "charges": [ { "i": 1, "key": "tax", "reason": "IEET — Hotel 4★, Barcelona city — 3 nights × 1 guest × €3.40", "amount": "10.20" } ], "totals": { "sum": "540.00", "charge": "10.20", "total": "550.20", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "es-sii-regime": "01" }, "base": "540.00", "percent": "10.0%", "amount": "54.00" } ], "amount": "54.00" } ], "sum": "54.00" }, "tax": "54.00", "total_with_tax": "604.20", "payable": "604.20" } } ``` A replacement invoice (factura de canje) substitutes one or more previously issued simplified invoices with a full invoice — typically when a consumer later asks for a complete invoice with their tax details. Notice: * the `type` stays `standard` and the `replacement` tag is set under `tax.tags`, which the [`es-sii-v1`](https://docs.gobl.org/addons/es-sii-v1) addon maps to the SII document type `F3`, * the `preceding` array references the simplified invoice being replaced by `series`, `code`, and `issue_date`, * unlike a corrective invoice, a replacement is not a rectification — the amounts are simply restated on a full invoice with the customer identified, and, * there are no totals or calculations in the minimal version; all these will be made automatically when uploading. ```json Factura de canje theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-sii-v1" ], "type": "standard", "tax": { "tags": [ "replacement" ] }, "series": "FC", "issue_date": "2026-02-26", "currency": "EUR", "preceding": [ { "type": "standard", "issue_date": "2026-02-20", "series": "FS", "code": "001" } ], "supplier": { "name": "Easor Software Solutions S.L.", "tax_id": { "country": "ES", "code": "B24830515" }, "addresses": [ { "num": "532", "street": "Avenida Diagonal", "locality": "Barcelona", "region": "Barcelona", "code": "08006", "country": "ES" } ] }, "customer": { "name": "Cliente Ejemplo S.L.", "tax_id": { "country": "ES", "code": "B63272603" } }, "lines": [ { "quantity": "1", "item": { "name": "Servicio de consultoría", "price": "500.00" }, "taxes": [ { "cat": "VAT", "rate": "general" } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-sii-v1" ], "$tags": [ "replacement" ], "type": "standard", "series": "FC", "issue_date": "2026-02-26", "currency": "EUR", "preceding": [ { "type": "standard", "issue_date": "2026-02-20", "series": "FS", "code": "001" } ], "tax": { "ext": { "es-sii-doc-type": "F3" } }, "supplier": { "name": "Easor Software Solutions S.L.", "tax_id": { "country": "ES", "code": "B24830515" }, "addresses": [ { "num": "532", "street": "Avenida Diagonal", "locality": "Barcelona", "region": "Barcelona", "code": "08006", "country": "ES" } ] }, "customer": { "name": "Cliente Ejemplo S.L.", "tax_id": { "country": "ES", "code": "B63272603" } }, "lines": [ { "i": 1, "quantity": "1", "item": { "name": "Servicio de consultoría", "price": "500.00" }, "sum": "500.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "21.0%", "ext": { "es-sii-regime": "01" } } ], "total": "500.00" } ], "totals": { "sum": "500.00", "total": "500.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "es-sii-regime": "01" }, "base": "500.00", "percent": "21.0%", "amount": "105.00" } ], "amount": "105.00" } ], "sum": "105.00" }, "tax": "105.00", "total_with_tax": "605.00", "payable": "605.00" } } ``` ```json SII Credit Note theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-sii-v1" ], "type": "credit-note", "series": "CN", "preceding": [ { "type": "standard", "issue_date": "2025-11-13", "series": "SAMPLE", "code": "004" } ], "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Sample Consumer", "tax_id": { "country": "ES", "code": "B63272603" } }, "lines": [ { "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "taxes": [ { "cat": "VAT", "rate": "general" } ] } ], "notes": [ { "key": "general", "text": "This is a sample invoice with a standard tax" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-sii-v1" ], "type": "credit-note", "series": "CN", "issue_date": "2026-07-21", "currency": "EUR", "preceding": [ { "type": "standard", "issue_date": "2025-11-13", "series": "SAMPLE", "code": "004" } ], "tax": { "ext": { "es-sii-correction-type": "I", "es-sii-doc-type": "R1" } }, "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Sample Consumer", "tax_id": { "country": "ES", "code": "B63272603" } }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "21.0%", "ext": { "es-sii-regime": "01" } } ], "total": "1800.00" } ], "totals": { "sum": "1800.00", "total": "1800.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "es-sii-regime": "01" }, "base": "1800.00", "percent": "21.0%", "amount": "378.00" } ], "amount": "378.00" } ], "sum": "378.00" }, "tax": "378.00", "total_with_tax": "2178.00", "payable": "2178.00" }, "notes": [ { "key": "general", "text": "This is a sample invoice with a standard tax" } ] } ``` ```json SII Corrective Invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-sii-v1" ], "type": "corrective", "series": "CO", "preceding": [ { "type": "standard", "issue_date": "2024-11-13", "series": "SAMPLE", "code": "004", "tax": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "es-sii-regime": "01" }, "base": "1800.00", "percent": "21.0%" } ] } ] } } ], "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Sample Consumer", "tax_id": { "country": "ES", "code": "B63272603" } }, "lines": [ { "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "taxes": [ { "cat": "VAT", "rate": "general" } ] } ], "notes": [ { "key": "general", "text": "This is a sample invoice with a standard tax" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-sii-v1" ], "type": "corrective", "series": "CO", "issue_date": "2026-07-21", "currency": "EUR", "preceding": [ { "type": "standard", "issue_date": "2024-11-13", "series": "SAMPLE", "code": "004", "tax": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "es-sii-regime": "01" }, "base": "1800.00", "percent": "21.0%", "amount": "378.00" } ], "amount": "378.00" } ], "sum": "378.00" } } ], "tax": { "ext": { "es-sii-correction-type": "S", "es-sii-doc-type": "R1" } }, "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Sample Consumer", "tax_id": { "country": "ES", "code": "B63272603" } }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "21.0%", "ext": { "es-sii-regime": "01" } } ], "total": "1800.00" } ], "totals": { "sum": "1800.00", "total": "1800.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "es-sii-regime": "01" }, "base": "1800.00", "percent": "21.0%", "amount": "378.00" } ], "amount": "378.00" } ], "sum": "378.00" }, "tax": "378.00", "total_with_tax": "2178.00", "payable": "2178.00" }, "notes": [ { "key": "general", "text": "This is a sample invoice with a standard tax" } ] } ``` Copy and paste these documents into the [GOBL builder](https://build.gobl.org) in order to preview and verify them. The following API Endpoints are available when you enable this app: * [Verify Tax ID](/api-ref/apps/gov-es/lookup) * [Generate Agreement PDF](/api-ref/apps/gov-es/agreement-fetch) * [Upload Agreement PDF](/api-ref/apps/gov-es/agreement-upload) * [Upload Identity Image](/api-ref/apps/gov-es/identity-upload) * [Confirm](/api-ref/apps/gov-es/confirm)
*** | | | | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Compliance | [Invoicing compliance in Spain](/compliance/spain)
[Compliance timeline](/timelines/spain) | | Apps | [Spain](/apps/spain)
[VERI\*FACTU Spain](/apps/verifactu-spain)
[TicketBAI (Spain app)](/apps/spain) | | Guides | [Facturae guide](/guides/es-facturae)
[VERI\*FACTU invoicing guide](/guides/es-verifactu)
[VERI\*FACTU supplier onboarding](/guides/es-verifactu-supplier)
[SII invoicing guide](/guides/es-sii)
[SII supplier onboarding](/guides/es-sii-supplier)
[TicketBAI guide](/guides/es-ticketbai) | | FAQ | [Spain FAQ](/faq/spain) | | GOBL | [Spain Tax Regime](https://docs.gobl.org/regimes/es)
[VERI\*FACTU Addon](https://docs.gobl.org/addons/es-verifactu-v1)
[Facturae Addon](https://docs.gobl.org/addons/es-facturae-v3)
[SII Addon](https://docs.gobl.org/addons/es-sii-v1) | | GitHub | [gobl.facturae](https://github.com/invopop/gobl.facturae)
[gobl.verifactu](https://github.com/invopop/gobl.verifactu)
[gobl.ticketbai](https://github.com/invopop/gobl.ticketbai) |
Ask and answer questions about the Spain App → # Stripe Source: https://docs.invopop.com/apps/stripe Import and process invoices and credit notes from Stripe
View implementation guide ›
| | | | --------- | ------------------------------ | | Developer | [Invopop](https://invopop.com) | | Category | Integrations |
The Stripe integration allows you to automatically generate tax-compliant invoices and credit notes from your [Stripe](https://stripe.com/) dashboard. When a Stripe invoice or credit note reaches the [finalized status](https://support.stripe.com/questions/invoice-states), the integration automatically creates a new job in your selected Invopop workflow. The integration consists of two components: 1. An Invopop app within your Stripe dashboard (installed from the [Stripe App Marketplace](https://marketplace.stripe.com/apps/invopop)) 2. An app in your Invopop console The job will extract the invoice data from Stripe and execute the workflow actions, such as converting it to any e-invoice format and submitting it to your local tax authority. **Key features** * **Automatic import:** Finalized Stripe invoices and credit notes are automatically imported into Invopop and saved to the `Sales` folder. * **Workflow automation:** Process imported invoices through your configured workflows to generate compliant invoices, PDFs, and submit to tax authorities. * **Real-time processing:** Track invoice status directly in your Stripe dashboard with the Invopop panel in the right sidebar. * **Historical import:** Import historical invoices issued before connecting Invopop by clicking Process this invoice in the Stripe dashboard. * **Error handling:** Retry failed imports directly from Stripe or troubleshoot in the Invopop console. * **Multi-format support:** Convert Stripe invoices to any e-invoice format supported by Invopop, including country-specific formats like VERI\*FACTU (Spain), XRechnung (Germany), and more. Make sure to check out our [Stripe Guide](/guides/stripe) for instructions on how to install the app, connect your accounts, configure workflows, and monitor invoice processing.
The following workflow actions will be available once you install and enable this app: Import invoice and credit note data from Stripe into Invopop. Processes payment for an invoice through Stripe Adds to the Payment Instructions the Virtual IBAN assigned to the customer The following workflows are available to make your integration easier. Use them as templates to build upon. This workflow syncs with Stripe to generate a PDF invoice on finalized sales. ```json Example Stripe PDF workflow theme={"system"} { "name": "Stripe PDF invoice", "description": "Sync from Stripe and generate a PDF", "schema": "bill/invoice", "steps": [ { "id": "7dd8e370-139b-11f0-b939-af2e8ae705ac", "name": "Import invoice from Stripe", "provider": "stripe.import" }, { "id": "95a82a10-139b-11f0-b939-af2e8ae705ac", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "84cf92a0-139b-11f0-b939-af2e8ae705ac", "name": "Sign envelope", "provider": "silo.close" }, { "id": "86a5b230-139b-11f0-b939-af2e8ae705ac", "name": "Generate PDF", "provider": "pdf", "summary": "Spanish · A4", "config": { "date_format": "%Y-%m-%d", "layout": "A4", "locale": "es", "logo_height": 40 } }, { "id": "8b321820-139b-11f0-b939-af2e8ae705ac", "name": "Set state", "provider": "silo.state", "summary": "Set state to `sent`{.state .sent}", "config": { "state": "sent" } } ], "rescue": [ { "id": "90f4b420-139b-11f0-b939-af2e8ae705ac", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` [Add to my workspace →](https://console.invopop.com/redirect/workflows/new?template=stripe-invoice) This workflow syncs with Stripe to issue a VERI\*FACTU invoice on finalized sales in Spain. ```json Example Stripe to VERI*FACTU workflow theme={"system"} { "name": "Stripe VERI*FACTU invoice", "description": "Sync from Stripe and issue a VERI*FACTU invoice", "schema": "bill/invoice", "steps": [ { "id": "7dd8e370-139b-11f0-b939-af2e8ae705ac", "name": "Import invoice from Stripe", "provider": "stripe.import" }, { "id": "95a82a10-139b-11f0-b939-af2e8ae705ac", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "794f78d0-139d-11f0-9ab7-c391120166e0", "name": "Modify silo entry", "provider": "silo.modify", "summary": "Add `es-verifactu-v1` addon and \"Factura\" note", "config": { "addons": [ "es-verifactu-v1" ], "allow_invalid_json": false, "data": { "doc": { "notes": [ { "key": "general", "text": "Factura" } ] } }, "expr": "", "merge_type": "application/merge-patch+json", "sign": false, "tags": [] } }, { "id": "84cf92a0-139b-11f0-b939-af2e8ae705ac", "name": "Sign envelope", "provider": "silo.close" }, { "id": "fc307c60-139b-11f0-b939-af2e8ae705ac", "name": "Generate VERI*FACTU", "provider": "verifactu.generate" }, { "id": "fe479c90-139b-11f0-b939-af2e8ae705ac", "name": "Send invoice to VERI*FACTU", "provider": "verifactu.send" }, { "id": "86a5b230-139b-11f0-b939-af2e8ae705ac", "name": "Generate PDF", "provider": "pdf", "summary": "Spanish · A4", "config": { "date_format": "%Y-%m-%d", "layout": "A4", "locale": "es", "logo_height": 40 } }, { "id": "8b321820-139b-11f0-b939-af2e8ae705ac", "name": "Set state", "provider": "silo.state", "summary": "Set state to `sent`{.state .sent}", "config": { "state": "sent" } } ], "rescue": [ { "id": "90f4b420-139b-11f0-b939-af2e8ae705ac", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` [Add to my workspace →](https://console.invopop.com/redirect/workflows/new?template=stripe-verifactu)
*** Ask and answer questions about Stripe App → # SW Sapien Source: https://docs.invopop.com/apps/sw-sapien Bulk download and import CFDIs from Mexico's SAT using SW Sapien's Efisco service. The SW Sapien app is not available by default. Contact us if you are interested in using it.
View implementation guide ›
| | | | --------- | ------------------------------ | | Developer | [Invopop](https://invopop.com) | | Category | Government | | Scope | Issued, Received | | Country | [Mexico](/compliance/mexico) |
The **SW Sapien app** connects Invopop to [SW Sapien's](https://sw.com.mx/) Efisco service to bulk download CFDI documents from the SAT (Servicio de Administración Tributaria). Instead of managing sensitive e.firma (FIEL) certificates or building brittle web-scraping solutions, this app delegates the complexity of SAT authentication and download to a trusted third-party provider. This app handles CFDI **download** only. Once downloaded, each CFDI is passed to the [SAT Mexico app](/apps/sat-mexico) for conversion to [GOBL](https://docs.gobl.org) format via a separate workflow. #### Key features * **Bulk CFDI download:** Request and download CFDIs for a given date range, both issued and received, through SW Sapien's Efisco API. * **Automatic job dispatch:** For each downloaded CFDI, the app uploads the file and creates a workflow job that triggers the conversion process. * **Periodic execution:** Combine with the [Cron app](/apps/cron) to schedule automatic daily (or other interval) imports. * **Flexible document types:** Configure whether to import received invoices, issued invoices, or both. * **No sensitive certificate management:** Authentication with SAT is handled entirely by SW Sapien, so e.firma (FIEL) certificates never need to be stored in Invopop. Check out our [Mexico: Receiving invoices guide](/guides/mx-sat-receiving) for step-by-step setup instructions. The app also supports importing issued invoices; refer to the configuration options below for details.
The following workflow actions will be available once you install and enable this app: Initiate the registration of a party with SW Sapien's Efisco service, generating a link for uploading the e.firma (FIEL) certificate. Request CFDI downloads from SW Sapien's Efisco service for a specified date range, wait for completion, and dispatch individual conversion jobs for each CFDI. The following templates help you get started quickly. Use them as is or as a base for your own flows. Initiate the registration of a party with SW Sapien's Efisco service to enable CFDI downloads. ```json Example SW Sapien register party workflow theme={"system"} { "name": "SW Sapien register party", "description": "Register a party with SW Sapien Efisco to enable CFDI downloads", "schema": "org/party", "steps": [ { "id": "aaa044b0-14cc-11f1-85d2-9d77c04210bc", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "ae845cb0-14cc-11f1-85d2-9d77c04210bc", "name": "Register supplier with Efisco", "provider": "sw-sapien.efisco.register" } ], "rescue": [ { "id": "a3b4c5d0-4d5e-11f0-e004-7d8e9f0a1b2c", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` Download CFDIs from SAT via SW Sapien's Efisco service and dispatch a conversion job for each document. This workflow is designed to be executed periodically using the [Cron app](/apps/cron). ```json Example SW Sapien bulk import CFDIs workflow theme={"system"} { "name": "SW Sapien bulk import CFDIs", "description": "Bulk-import CFDIs from SAT via SW Sapien Efisco", "schema": "org/party", "steps": [ { "id": "28b5e810-14cc-11f1-85d2-9d77c04210bc", "name": "Bulk import CFDIs from Efisco", "provider": "sw-sapien.efisco.import", "summary": "Received → no workflow", "config": { "document_type": "Recepcion", "workflow_id": "" } } ], "rescue": [ { "id": "a7b8c9d0-2b3c-11f0-c002-5b6c7d8e9f0a", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` Convert an individual CFDI to [GOBL](https://docs.gobl.org) format using the [SAT Mexico app](/apps/sat-mexico). ```json Example SAT import CFDI workflow theme={"system"} { "name": "SAT import CFDI", "description": "Import a CFDI received through SAT", "schema": "bill/invoice", "steps": [ { "id": "6346e330-14cc-11f1-85d2-9d77c04210bc", "name": "Import CFDI from SAT", "provider": "sat-mx.import" }, { "id": "74f01110-14cc-11f1-85d2-9d77c04210bc", "name": "Set state", "provider": "silo.state", "summary": "Set state to `received`{.state .received}", "config": { "state": "received" } } ], "rescue": [ { "id": "e5f6a7b0-1a2b-11f0-b001-4a5b6c7d8e9f", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ```
*** | | | | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Compliance | [Invoicing compliance in Mexico](/compliance/mexico)
[Compliance timeline](/timelines/mexico) | | Apps | [SAT Mexico](/apps/sat-mexico)
[SW Sapien](/apps/sw-sapien)
[Cron](/apps/cron) | | Guides | [Supplier registration](/guides/mx-sat-supplier)
[Issuing documents](/guides/mx-sat-issuing)
[Receiving invoices](/guides/mx-sat-receiving) | | FAQ | [Mexico FAQ](/faq/mexico) | | GOBL | [Mexico Tax Regime](https://docs.gobl.org/regimes/mx)
[Mexican SAT CFDI Addon](https://docs.gobl.org/addons/mx-cfdi-v4) | | GitHub | [gobl.cfdi](https://github.com/invopop/gobl.cfdi) |
Ask and answer questions about SW Sapien App → # UN/CEFACT CII Source: https://docs.invopop.com/apps/uncefact-cii Convert GOBL to the UN/CEFACT CII format.
| | | | --------- | ------------------------------ | | Developer | [Invopop](https://invopop.com) | | Category | Format |
**UN/CEFACT CII (Cross Industry Invoice)** is a key document within the family of Supply Chain "Cross-Industry" messages that are exchanged globally between trading partners. UN/CEFACT CII is part of a group of messages in supply chain procedures called the [Cross-Industry family of deliverables](https://unece.org/trade/documents/2008/11/brs-cross-industry-common-requirements) which are all based on the principle of a maximum data set, are integrated into the Supply Chain Reference Data Model, and are fully interoperable with each other. The standard has achieved significant adoption in Europe. UN/CEFACT CII was chosen in 2016 as one of two obligatory standards within the European Union for public procurement, meaning that every public agency within the EU is obliged to accept this standard for electronic invoicing. The standard is typically implemented in XML format using the Supply Chain Reference Data Model (SCRDM). **Key features** Supported CII syntaxes: * `EU` · Peppol BIS Billing CII Invoice V3 * `EU` · EN 16931 CII Invoice * `FR` · Factur-X CII V1 * `DE` · ZUGFeRD V2 * `DE` · XRechnung V3 * `FR` · Chorus Pro V1
1
Generate a UN/CEFACT CII XML Invoice.
1
Import a UN/CEFACT CII document like an invoice, and convert to GOBL.
Sample invoices demonstrating various UN/CEFACT CII implementations across different countries and use cases. Standard ZUGFeRD invoice for business-to-consumer transactions with embedded XML in PDF format. ```json ZUGFeRD B2C Invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "DE", "$addons": [ "eu-en16931-v2017", "de-zugferd-v2" ], "$tags": [ "simplified" ], "uuid": "3aea7b56-59d8-4beb-90bd-f8f280d852a0", "type": "standard", "series": "SAMPLE", "code": "001", "issue_date": "2022-02-01", "currency": "EUR", "supplier": { "name": "Provide One GmbH", "tax_id": { "country": "DE", "code": "879558966" }, "addresses": [ { "num": "16", "street": "Dietmar-Hopp-Allee", "locality": "Walldorf", "code": "69190", "country": "DE" } ], "emails": [ { "addr": "billing@example.com" } ] }, "lines": [ { "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "discounts": [ { "reason": "Special discount", "percent": "10%", "amount": "180.00" } ], "taxes": [ { "cat": "VAT", "rate": "general" } ], "total": "1620.00" } ], "payment": { "advances": [ { "description": "Paid in full", "percent": "100%", "amount": "1927.80" } ], "instructions": { "key": "card" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "DE", "$addons": [ "eu-en16931-v2017", "de-zugferd-v2" ], "$tags": [ "simplified" ], "uuid": "3aea7b56-59d8-4beb-90bd-f8f280d852a0", "type": "standard", "series": "SAMPLE", "code": "001", "issue_date": "2022-02-01", "currency": "EUR", "tax": { "ext": { "untdid-document-type": "380" } }, "supplier": { "name": "Provide One GmbH", "tax_id": { "country": "DE", "code": "879558966" }, "addresses": [ { "num": "16", "street": "Dietmar-Hopp-Allee", "locality": "Walldorf", "code": "69190", "country": "DE" } ], "emails": [ { "addr": "billing@example.com" } ] }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "discounts": [ { "reason": "Special discount", "percent": "10%", "amount": "180.00" } ], "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "19%", "ext": { "untdid-tax-category": "S" } } ], "total": "1620.00" } ], "payment": { "advances": [ { "description": "Paid in full", "percent": "100%", "amount": "1927.80" } ], "instructions": { "key": "card", "ext": { "untdid-payment-means": "48" } } }, "totals": { "sum": "1620.00", "total": "1620.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "untdid-tax-category": "S" }, "base": "1620.00", "percent": "19%", "amount": "307.80" } ], "amount": "307.80" } ], "sum": "307.80" }, "tax": "307.80", "total_with_tax": "1927.80", "payable": "1927.80", "advance": "1927.80", "due": "0.00" } } ``` Comprehensive ZUGFeRD invoice demonstrating additional optional fields such as ordering information, payment terms, delivery details, and discounts. ```json ZUGFeRD B2B Invoice with additional fields theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "DE", "$addons": [ "eu-en16931-v2017", "de-zugferd-v2" ], "type": "standard", "series": "SAMPLE", "code": "001", "issue_date": "2024-02-13", "currency": "EUR", "tax": { "ext": { "untdid-document-type": "380" } }, "supplier": { "name": "Provide One GmbH", "tax_id": { "country": "DE", "code": "111111125" }, "people": [ { "name": { "given": "John", "surname": "Doe" } } ], "addresses": [ { "num": "16", "street": "Dietmar-Hopp-Allee", "locality": "Walldorf", "code": "69190", "country": "DE" } ], "emails": [ { "addr": "billing@example.com" } ], "telephones": [ { "num": "+49100200300" } ] }, "customer": { "name": "Sample Consumer", "tax_id": { "country": "DE", "code": "282741168" }, "addresses": [ { "num": "25", "street": "Werner-Heisenberg-Allee", "locality": "München", "code": "80939", "country": "DE" } ], "emails": [ { "addr": "email@sample.com" } ] }, "lines": [ { "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "19%", "ext": { "untdid-tax-category": "S" } } ] } ], "discounts": [ { "reason": "Promotion discount", "amount": "10.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "19%", "ext": { "untdid-tax-category": "S" } } ], "ext": { "untdid-allowance": "88" } } ], "charges": [ { "reason": "Freight", "amount": "11.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "19%", "ext": { "untdid-tax-category": "S" } } ] } ], "ordering": { "code": "PO4711", "period": { "start": "2013-03-10", "end": "2013-04-10" }, "contracts": [ { "code": "2013-05" } ], "receiving": [ { "code": "3544" } ], "despatch": [ { "code": "5433" } ] }, "payment": { "payee": { "name": "Ebeneser Scrooge AS", "identities": [ { "label": "CompanyID", "code": "989823401" }, { "label": "0088", "code": "2298740918237" } ] }, "terms": { "due_dates": [ { "date": "2013-07-20", "percent": "100%" } ], "notes": "2 % discount if paid within 2 days\n Penalty percentage 10% from due date" }, "instructions": { "key": "credit-transfer", "ref": "0003434323213231", "credit_transfer": [ { "iban": "NO9386011117947", "bic": "DNBANOKK" } ], "card": { "last4": "1234", "holder": "John Doe" }, "direct_debit": { "ref": "1234567890", "creditor": "987654321", "account": "DE89370400440532013000" }, "ext": { "untdid-payment-means": "30" } } }, "delivery": { "receiver": { "addresses": [ { "street": "Deliverystreet 2", "street_extra": "Side door", "locality": "DeliveryCity", "region": "RegionD", "code": "523427", "country": "NO" } ] }, "identities": [ { "label": "0088", "code": "6754238987643" } ], "date": "2024-02-10" } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "DE", "$addons": [ "eu-en16931-v2017", "de-zugferd-v2" ], "type": "standard", "series": "SAMPLE", "code": "001", "issue_date": "2024-02-13", "currency": "EUR", "tax": { "ext": { "untdid-document-type": "380" } }, "supplier": { "name": "Provide One GmbH", "tax_id": { "country": "DE", "code": "111111125" }, "people": [ { "name": { "given": "John", "surname": "Doe" } } ], "addresses": [ { "num": "16", "street": "Dietmar-Hopp-Allee", "locality": "Walldorf", "code": "69190", "country": "DE" } ], "emails": [ { "addr": "billing@example.com" } ], "telephones": [ { "num": "+49100200300" } ] }, "customer": { "name": "Sample Consumer", "tax_id": { "country": "DE", "code": "282741168" }, "addresses": [ { "num": "25", "street": "Werner-Heisenberg-Allee", "locality": "München", "code": "80939", "country": "DE" } ], "emails": [ { "addr": "email@sample.com" } ] }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "19%", "ext": { "untdid-tax-category": "S" } } ], "total": "1800.00" } ], "discounts": [ { "i": 1, "reason": "Promotion discount", "amount": "10.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "19%", "ext": { "untdid-tax-category": "S" } } ], "ext": { "untdid-allowance": "88" } } ], "charges": [ { "i": 1, "reason": "Freight", "amount": "11.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "19%", "ext": { "untdid-tax-category": "S" } } ] } ], "ordering": { "code": "PO4711", "period": { "start": "2013-03-10", "end": "2013-04-10" }, "contracts": [ { "code": "2013-05" } ], "receiving": [ { "code": "3544" } ], "despatch": [ { "code": "5433" } ] }, "payment": { "payee": { "name": "Ebeneser Scrooge AS", "identities": [ { "label": "CompanyID", "code": "989823401" }, { "label": "0088", "code": "2298740918237" } ] }, "terms": { "due_dates": [ { "date": "2013-07-20", "amount": "2143.19", "percent": "100%" } ], "notes": "2 % discount if paid within 2 days\n Penalty percentage 10% from due date" }, "instructions": { "key": "credit-transfer", "ref": "0003434323213231", "credit_transfer": [ { "iban": "NO9386011117947", "bic": "DNBANOKK" } ], "card": { "last4": "1234", "holder": "John Doe" }, "direct_debit": { "ref": "1234567890", "creditor": "987654321", "account": "DE89370400440532013000" }, "ext": { "untdid-payment-means": "30" } } }, "delivery": { "receiver": { "addresses": [ { "street": "Deliverystreet 2", "street_extra": "Side door", "locality": "DeliveryCity", "region": "RegionD", "code": "523427", "country": "NO" } ] }, "identities": [ { "label": "0088", "code": "6754238987643" } ], "date": "2024-02-10" }, "totals": { "sum": "1800.00", "discount": "10.00", "charge": "11.00", "total": "1801.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "untdid-tax-category": "S" }, "base": "1801.00", "percent": "19%", "amount": "342.19" } ], "amount": "342.19" } ], "sum": "342.19" }, "tax": "342.19", "total_with_tax": "2143.19", "payable": "2143.19" } } ``` Factur-X invoice for business-to-business transactions. Factur-X is the French implementation of the same standard as ZUGFeRD. ```json Factur-X B2B invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "FR", "$addons": [ "fr-ctc-flow2-v1", "fr-facturx-v1" ], "type": "standard", "series": "SAMPLE", "code": "2345", "issue_date": "2025-06-18", "currency": "EUR", "tax": { "ext": { "fr-ctc-billing-mode": "S2" } }, "supplier": { "name": "Provide One SARL", "tax_id": { "country": "FR", "code": "43498927917" }, "identities": [ { "type": "SIRET", "code": "49892791768734" } ], "inboxes": [ { "key": "peppol", "scheme": "0225", "code": "498927917" } ], "addresses": [ { "num": "42", "street": "Avenue des Ternes", "locality": "Paris", "code": "75017", "country": "FR" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Sample Consumer SAS", "tax_id": { "country": "FR", "code": "39356000000" }, "identities": [ { "type": "SIRET", "code": "35600000012345" } ], "inboxes": [ { "key": "peppol", "scheme": "0225", "code": "356000000" } ], "addresses": [ { "num": "1", "street": "Rue Sundacsakn", "locality": "Saint-Germain-En-Laye", "code": "75050", "country": "FR" } ], "emails": [ { "addr": "email@sample.com" } ] }, "lines": [ { "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "discounts": [ { "reason": "Special discount", "percent": "10%" } ], "taxes": [ { "cat": "VAT", "rate": "standard" } ] } ], "payment": { "advances": [ { "description": "Paid in full", "percent": "100%" } ], "terms": { "key": "due-date", "due_dates": [ { "date": "2025-06-18", "amount": "1944.00" } ] }, "instructions": { "key": "card", "card": {} } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "FR", "$addons": [ "eu-en16931-v2017", "fr-ctc-flow2-v1", "fr-facturx-v1" ], "type": "standard", "series": "SAMPLE", "code": "2345", "issue_date": "2025-06-18", "currency": "EUR", "tax": { "rounding": "currency", "ext": { "fr-ctc-billing-mode": "S2", "untdid-document-type": "380" } }, "supplier": { "name": "Provide One SARL", "tax_id": { "country": "FR", "code": "43498927917" }, "identities": [ { "type": "SIRET", "code": "49892791768734", "ext": { "iso-scheme-id": "0009" } }, { "scope": "legal", "type": "SIREN", "code": "498927917", "ext": { "iso-scheme-id": "0002" } } ], "endpoints": [ { "uri": "iso6523-actorid-upis::0225:498927917" } ], "inboxes": [ { "key": "peppol", "scheme": "0225", "code": "498927917" } ], "addresses": [ { "num": "42", "street": "Avenue des Ternes", "locality": "Paris", "code": "75017", "country": "FR" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Sample Consumer SAS", "tax_id": { "country": "FR", "code": "39356000000" }, "identities": [ { "type": "SIRET", "code": "35600000012345", "ext": { "iso-scheme-id": "0009" } }, { "scope": "legal", "type": "SIREN", "code": "356000000", "ext": { "iso-scheme-id": "0002" } } ], "endpoints": [ { "uri": "iso6523-actorid-upis::0225:356000000" } ], "inboxes": [ { "key": "peppol", "scheme": "0225", "code": "356000000" } ], "addresses": [ { "num": "1", "street": "Rue Sundacsakn", "locality": "Saint-Germain-En-Laye", "code": "75050", "country": "FR" } ], "emails": [ { "addr": "email@sample.com" } ] }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "discounts": [ { "reason": "Special discount", "percent": "10%", "amount": "180.00" } ], "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "20%", "ext": { "untdid-tax-category": "S" } } ], "total": "1620.00" } ], "payment": { "terms": { "key": "due-date", "due_dates": [ { "date": "2025-06-18", "amount": "1944.00" } ] }, "advances": [ { "description": "Paid in full", "percent": "100%", "amount": "1944.00" } ], "instructions": { "key": "card", "card": {}, "ext": { "untdid-payment-means": "48" } } }, "totals": { "sum": "1620.00", "total": "1620.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "untdid-tax-category": "S" }, "base": "1620.00", "percent": "20%", "amount": "324.00" } ], "amount": "324.00" } ], "sum": "324.00" }, "tax": "324.00", "total_with_tax": "1944.00", "payable": "1944.00", "advance": "1944.00", "due": "0.00" }, "notes": [ { "key": "payment", "text": "Conditions de paiement selon les conditions générales de vente.", "ext": { "untdid-text-subject": "PMT" } }, { "key": "payment-method", "text": "Pénalités et indemnités de retard applicables conformément aux conditions générales de vente.", "ext": { "untdid-text-subject": "PMD" } }, { "key": "payment-term", "text": "Aucun escompte n'est accordé pour paiement anticipé.", "ext": { "untdid-text-subject": "AAB" } } ] } ``` Chorus Pro invoice for business-to-government transactions in France, used for public procurement. ```json Chorus Pro B2G Invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "FR", "$addons": [ "eu-en16931-v2017", "fr-choruspro-v1" ], "uuid": "019783e7-33b1-7000-a1a5-6139e214b447", "type": "standard", "series": "SAMPLE", "code": "2345", "issue_date": "2025-06-18", "currency": "EUR", "supplier": { "name": "Provide One Inc.", "tax_id": { "country": "FR", "code": "43498927917" }, "identities": [ { "type": "SIRET", "code": "49892791768734" } ], "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] }, "customer": { "name": "Sample Consumer", "tax_id": { "country": "FR", "code": "39356000000" }, "identities": [ { "type": "SIRET", "code": "35600000012345" } ], "addresses": [ { "num": "1", "street": "Rue Sundacsakn", "locality": "Saint-Germain-En-Laye", "code": "75050", "country": "FR" } ], "emails": [ { "addr": "email@sample.com" } ] }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "discounts": [ { "reason": "Special discount", "percent": "10%", "amount": "180.00" } ], "taxes": [ { "cat": "VAT", "rate": "standard" } ], "total": "1620.00" } ], "payment": { "advances": [ { "description": "Paid in full", "percent": "100%", "amount": "1944.00" } ], "instructions": { "key": "card" } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "FR", "$addons": [ "eu-en16931-v2017", "fr-choruspro-v1" ], "uuid": "019783e7-33b1-7000-a1a5-6139e214b447", "type": "standard", "series": "SAMPLE", "code": "2345", "issue_date": "2025-06-18", "currency": "EUR", "tax": { "ext": { "fr-choruspro-framework": "A1", "untdid-document-type": "380" } }, "supplier": { "name": "Provide One Inc.", "tax_id": { "country": "FR", "code": "43498927917" }, "identities": [ { "type": "SIRET", "code": "49892791768734", "ext": { "iso-scheme-id": "0009" } } ], "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ], "ext": { "fr-choruspro-scheme": "1" } }, "customer": { "name": "Sample Consumer", "tax_id": { "country": "FR", "code": "39356000000" }, "identities": [ { "type": "SIRET", "code": "35600000012345", "ext": { "iso-scheme-id": "0009" } } ], "addresses": [ { "num": "1", "street": "Rue Sundacsakn", "locality": "Saint-Germain-En-Laye", "code": "75050", "country": "FR" } ], "emails": [ { "addr": "email@sample.com" } ], "ext": { "fr-choruspro-scheme": "1" } }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "discounts": [ { "reason": "Special discount", "percent": "10%", "amount": "180.00" } ], "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "20%", "ext": { "untdid-tax-category": "S" } } ], "total": "1620.00" } ], "payment": { "advances": [ { "description": "Paid in full", "percent": "100%", "amount": "1944.00" } ], "instructions": { "key": "card", "ext": { "untdid-payment-means": "48" } } }, "totals": { "sum": "1620.00", "total": "1620.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "untdid-tax-category": "S" }, "base": "1620.00", "percent": "20%", "amount": "324.00" } ], "amount": "324.00" } ], "sum": "324.00" }, "tax": "324.00", "total_with_tax": "1944.00", "payable": "1944.00", "advance": "1944.00", "due": "0.00" } } ```
# VERI*FACTU Spain Source: https://docs.invopop.com/apps/verifactu-spain Convert and send invoices to the Spanish tax authorities using the VERI*FACTU system.
View implementation guide › View implementation guide ›
| | | | --------- | ------------------------------ | | Developer | [Invopop](https://invopop.com) | | Category | Government | | Scope | B2B, B2C | | Country | [Spain](/compliance/spain) |
Invopop's **VERI\*FACTU app** is designed to support full compliance with Spain’s VERI\*FACTU e-invoicing regulation. It provides endpoints and workflows to automate supplier onboarding, document upload, identity verification, and invoice generation, enabling businesses and intermediaries to issue e-invoices in accordance with Spanish law. **Key features** 1. **Workflow automation:** this app makes several workflow actions available to issue invoices and onboard suppliers. 2. **Legally compliant PDF invoices:** VERI\*FACTU requires QR codes to consult the status of a document with the AEAT. This app will automatically generate compliant PDF invoices. 3. **VERI\*FACTU XML generation:** this app will generate a legally compliant XML which is included as an attachment in the Silo Entry and sent to the tax agency when issuing an invoice. 4. **Supplier registration & verification:** this app will generate a registration link where suppliers will upload their identity documents and sign an agreement to issue invoices under their name (also available through the API). 5. **White-label:** the process allows issuance on behalf of clients (white-label) or directly as an organization, according to user needs. 6. **QR code:** Generates the VERI\*FACTU QR code according to the AEAT specifications. Make sure to check out our VERI\*FACTU implementation guides for instructions on how to [issue invoices](/guides/es-verifactu) and [onboard suppliers](/guides/es-verifactu-supplier). ## FAQ Invoicing questions You should send the credit note with the same sign as the original invoice. In Spain, unlike other countries, credit notes must be submitted to Hacienda with inverse values. Invopop handles this conversion automatically before transforming the credit note into a "factura rectificativa" (corrective invoice). This means you only need to send the credit note following international standards (with same sign as the invoice). Invopop will automatically adapt it when submitting to Hacienda. For reference, see the [GOBL Invoice](https://docs.gobl.org/draft-0/bill/invoice) documentation with `type` set to `credit-note`. See the [Spain tax regime in GOBL](https://docs.gobl.org/regimes/es) for tax categories, NIF rules, and Spanish-specific extensions. Subsystem-specific addons live alongside: [`es-verifactu-v1`](https://docs.gobl.org/addons/es-verifactu-v1), [`es-tbai-v1`](https://docs.gobl.org/addons/es-tbai-v1), [`es-facturae-v3`](https://docs.gobl.org/addons/es-facturae-v3). In VERI\*FACTU, you should only cancel an invoice if it hasn't been handed to the customer nor accepted by the tax authority. Different from a credit note or a corrective, canceling an invoice doesn't produce a second document, which means you don't have a paper to hand to your customer to show the cancellation. That's why, if the invoice has been handed to the customer, we recommend issuing a credit note instead. The response from VERI\*FACTU should contain all the details you need to be able to decide what changes need to be made to the [GOBL](https://docs.gobl.org) document in order to be processed correctly. Make the changes either via the Invopop API or console directly on the same document, and simply resend to the VERI\*FACTU workflow. Invopop will ensure that the correct substitution document is generated by checking previous attempts and including the correct codes in the new request. We do not provide the QR code image itself. The QR code is a visual representation of a URL that you need to generate on your own if you're creating custom PDFs or need it for any other purpose. The full requirements are in the AEAT [VERI\*FACTU QR specification](https://www.agenciatributaria.es/static_files/AEAT_Desarrolladores/EEDD/IVA/VERI-FACTU/DetalleEspecificacTecnCodigoQRfactura.pdf) PDF document in Spanish. Here you can read that: > The "QR" code must have a size between 30x30 and 40x40 millimeters and follow the specifications of the ISO/IEC 18004:2015 standard. For the generation of the "QR" code, the M (medium) error correction level shall be used. Generate your own QR code image as follows: * **API**: fetch the entry and get `data -> head -> stamps -> verifactu-qr`. * **Console**: in the invoice entry click on the kebab `···` menu and select **View Headers**. Use the VERI\*FACTU URL in a library capable of generating ISO/IEC 18004:2015 QR images (Invopop uses [go-qr](https://github.com/piglig/go-qr)) Store or embed the image in your PDF. You can [see how we generate QR images](https://github.com/invopop/gobl.html/blob/main/components/images/images.go) in our open source gobl.html library. VERI\*FACTU requires every request to be linked with a fingerprint or hash. During the "Generate VERI\*FACTU" and "Cancel VERI\*FACTU" actions, Invopop will automatically find the last request made for the same supplier, and incorporate the chained data into the new request. It's important to understand that VERI\*FACTU focuses on requests, and not individual documents; a single invoice may have multiple entries in the chain if it has been processed multiple times due to incorrect details, cancellations, or substitutions. Invopop guarantees the chain is never broken using database transactions and retries in the case of collisions. The most common errors are related to format issues or invalid extensions, which are already handled in Invopop through the [`es-verifactu-v1`](https://docs.gobl.org/addons/es-verifactu-v1) addon validations. These prevent most of the typical problems before they reach the submission stage. Among the errors that aren't yet validated on our side, the five most frequent ones are: * `4104: Error en la cabecera: el valor del campo NIF del bloque ObligadoEmision no está identificado.` → The issuer's name must match what's registered for that NIF (tax ID). * `4102: El XML no cumple el esquema. Falta informar campo obligatorio.` → Usually occurs when a required field is missing in the XML, often within the Desglose (taxes) section. * `1110: El NIF no está identificado en el censo de la AEAT.` → The provided NIF (tax ID) isn't found in the AEAT registry (often due to typos or testing data). * `3000: Registro de facturación duplicado.` → Triggered when issuing the same invoice series/code twice. * `2001: El NIF del bloque Destinatarios no está identificado en el censo de la AEAT.` → Similar to 1110, but applies to the NIF (tax ID) of the customer. You can set your own description using the notes object in the invoice. The key used for the description needs to be set to general. For example: ``` "notes": [ { "key": "general", "text": "This will appear as DescripcionOperacion" } ] ``` We generate a default description if the note is not provided which is what you are currently seeing. This default description will neatly cut off before it reaches a length of 500 characters as that is the limit the AEAT imposes. | Key | Text | | ------------------- | ------------------------------------------------------------ | | `reverse-charge` | Reverse Charge / Inversión del sujeto pasivo. | | `simplified-scheme` | Factura expedida por contribuyente en régimen simplificado. | | `self-billed` | Facturación por el destinatario. | | `travel-agency` | Régimen especial de las agencias de viajes. | | `second-hand-goods` | Régimen especial de los bienes usados. | | `art` | Régimen especial de los objetos de arte. | | `antiques` | Régimen especial de las antigüedades y objetos de colección. | | `cash-basis` | Régimen especial del criterio de caja. | Registering supplier questions We reject agreements when: * The uploaded document is not signed (they upload the unsigned template). * Users upload a handwritten signature without an ID. * The electronic signature is made with an FNMT certificate. * The agreement is missing a date or location. * The name is entered as an email address. The job will state the reason for rejection. A KO will be triggered and the supplier will be labelled with the `Error` state. We currently recommend sending a reminder to the supplier through a webhook. The registration link will not expire and the entity will still be able to upload their registration documents which will be validated. Should you choose to run this workflow again using this supplier, the supplier will be accepted or rejected immediately because the required documentation has already been provided and validated. If the uploaded agreement documents were rejected, a KO will be triggered and the supplier will be labelled with the `Error` state. We currently recommend sending a notification to the supplier through a webhook within the **Error Handling** section. Afterwards, if you wish to re-register the supplier with new documents, you must: 1. Unregister the supplier using the **Unregister Supplier workflow**. 2. Re-run the Register supplier workflow. This will restart the entire registration process. When uploading documents, the previously submitted agreement will appear selected by default. Simply choose a new file and click `Continue` to override the old one. See the image below for reference: Overriding the previously submitted agreement In order to complete the representation agreement you will need to provide the following information: **Company** 1. Name 2. NIF 3. Address **Legal representative** 1. Full name 2. Government ID type and number 3. Address ```json Spain supplier example theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "people": [ { "name": { "given": "Juan", "surname": "Pérez González" }, "identities": [ { "key": "national", "code": "123456789A" } ], "addresses": [ { "num": "10", "street": "Calle Ejemplo", "locality": "Madrid", "region": "Madrid", "code": "28020", "country": "ES" } ] } ], "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] } ``` If the entity is a self-employed individual (*autónomo*), only the information requested in the **Legal representative** section is required. ```json Spain autónomo supplier example theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "Juan Pérez González", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "autonomo@example.com" } ] } ``` The supplier can add their electronic signature to the PDF document ([instructions](https://helpx.adobe.com/acrobat/using/signing-pdfs.html)), or sign with a handwritten signature (we recommend using [Adobe's online service](https://www.adobe.com/acrobat/online/sign-pdf.html)). Individual documents are limited to a maximum size of 10MB. Uploads exceeding this size will result in an error. Run the VERI\*FACTU Register Supplier workflow. The legal representative signs the PDF agreement (electronic or handwritten signature with ID) and Invopop registers the supplier with AEAT for invoicing on their behalf. More answers in our [Spain FAQ](/faq/spain) section
The following workflow actions will be available once you install and enable this app:
1
Convert GOBL Invoices into VERI\*FACTU XML format used in Spain.
1
Send a previously generated VERI\*FACTU document to the tax agency in Spain.
Send a cancel request for previously sent VERI\*FACTU Invoice. Register VERI\*FACTU parties before issuing invoices on their behalf. Block the job while waiting for the end-user to complete their registration steps. Wait for approval that the uploaded documentation is correct. Disables a previously registered party from issuing invoices.
Invoice workflows ```json Example VERI*FACTU invoice workflow theme={"system"} { "name": "VERI*FACTU issue invoice", "description": "Issue a VERI*FACTU invoice and generate PDF with QR", "schema": "bill/invoice", "steps": [ { "id": "59f4dee0-bc8f-11ef-8ca1-573cbe7db4cd", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "ec41cce0-0fc3-11f0-8a81-7911b3ecee3c", "name": "Add sequential code", "provider": "sequence.enumerate", "summary": "Dynamic · VERI*FACTU · 000001", "config": { "name": "Verifactu", "padding": 6, "start": 1 } }, { "id": "fc75e4f0-8721-11ef-a962-73e3f2037a52", "name": "Sign envelope", "provider": "silo.close" }, { "id": "ef2ce710-bc8e-11ef-8ca1-573cbe7db4cd", "name": "Generate VERI*FACTU XML", "provider": "verifactu.generate" }, { "id": "61661540-bc8f-11ef-8ca1-573cbe7db4cd", "name": "Send invoice to VERI*FACTU", "provider": "verifactu.send" }, { "id": "65312700-bc8f-11ef-8ca1-573cbe7db4cd", "name": "Generate PDF", "provider": "pdf", "summary": "Spanish · A4", "config": { "date_format": "%Y-%m-%d", "layout": "A4", "locale": "es", "logo_height": 60 } }, { "id": "6abb4de0-bc8f-11ef-8ca1-573cbe7db4cd", "name": "Set state", "provider": "silo.state", "summary": "Set state to `sent`{.state .sent}", "config": { "state": "sent" } } ], "rescue": [ { "id": "798b1d00-bc8f-11ef-8ca1-573cbe7db4cd", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` ```json Example VERI*FACTU cancel workflow theme={"system"} { "name": "VERI*FACTU cancel invoice", "description": "Cancel an invoice via VERI*FACTU", "schema": "bill/invoice", "steps": [ { "id": "2f897e30-3c9c-11f0-8690-a921c0418914", "name": "Cancel invoice in VERI*FACTU", "provider": "verifactu.cancel" }, { "id": "334ffc10-3c9c-11f0-8690-a921c0418914", "name": "Set state", "provider": "silo.state", "summary": "Set state to `void`{.state .void}", "config": { "state": "void" } } ], "rescue": [ { "id": "384cfe20-3c9c-11f0-8690-a921c0418914", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` Party workflows ```json Example VERI*FACTU register supplier workflow theme={"system"} { "name": "VERI*FACTU register supplier", "description": "Register a supplier with VERI*FACTU", "schema": "org/party", "steps": [ { "id": "74b9cf20-da92-11f0-864b-8d842f7d4ab2", "name": "Verify Spanish Tax ID", "provider": "gov-es.lookup.verify" }, { "id": "554c7040-66d7-11f0-a392-dfb6c99d6698", "name": "Register supplier with VERI*FACTU", "provider": "verifactu.register", "next": [] }, { "id": "62148880-66d7-11f0-a392-dfb6c99d6698", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" }, "next": [] }, { "id": "5b924600-66d7-11f0-a392-dfb6c99d6698", "name": "Wait for VERI*FACTU supplier agreement upload", "provider": "verifactu.wait.upload", "next": [] }, { "id": "6bec1080-66d7-11f0-a392-dfb6c99d6698", "name": "Set state", "provider": "silo.state", "summary": "Set state to `registered`{.state .registered}", "config": { "state": "registered" }, "next": [] }, { "id": "670d1dc0-66d7-11f0-a392-dfb6c99d6698", "name": "Wait for VERI*FACTU supplier approval", "provider": "verifactu.wait.approval", "next": [] } ], "rescue": [ { "id": "4be625f0-da6d-11f0-864b-8d842f7d4ab2", "name": "Unregister supplier from VERI*FACTU", "provider": "verifactu.unregister" }, { "id": "535bf030-da6d-11f0-864b-8d842f7d4ab2", "name": "Set state", "provider": "silo.state", "summary": "Set state to `rejected`{.state .rejected}", "config": { "state": "rejected" } } ] } ``` ```json Example VERI*FACTU unregister supplier workflow theme={"system"} { "name": "VERI*FACTU unregister supplier", "description": "Unregister a supplier from VERI*FACTU", "schema": "org/party", "steps": [ { "id": "8a613610-67ba-11f0-bcaf-170efff782a9", "name": "Unregister supplier from VERI*FACTU", "provider": "verifactu.unregister" }, { "id": "96a6b0d0-67ba-11f0-bcaf-170efff782a9", "name": "Set state", "provider": "silo.state", "summary": "Set state to `void`{.state .void}", "config": { "state": "void" } } ], "rescue": [ { "id": "e8d2a6b0-67bb-11f0-bcaf-170efff782a9", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` Invoices: Simplified invoices are used for B2C transactions when the customer is not a business. The transaction amount should be under €400 (VAT included) with some [exceptions](https://sede.agenciatributaria.gob.es/Sede/iva/facturacion-registro/facturacion-iva/tipos-factura.html) in which this threshold is increased to €3,000. To create a simplified VERI\*FACTU invoice, include the `simplified` tag in your GOBL document with the [`es-verifactu-v1`](https://docs.gobl.org/addons/es-verifactu-v1) addon. ```json B2C Invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-verifactu-v1" ], "$tags": [ "simplified" ], "type": "standard", "series": "SAMPLE", "issue_date": "2024-11-13", "currency": "EUR", "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ] }, "lines": [ { "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "taxes": [ { "cat": "VAT", "rate": "general" } ], "total": "1800.00" } ], "notes": [ { "key": "general", "text": "This is a sample invoice with a standard tax" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-verifactu-v1" ], "$tags": [ "simplified" ], "type": "standard", "series": "SAMPLE", "issue_date": "2024-11-13", "currency": "EUR", "tax": { "ext": { "es-verifactu-doc-type": "F2" } }, "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ] }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "21.0%", "ext": { "es-verifactu-op-class": "S1", "es-verifactu-regime": "01" } } ], "total": "1800.00" } ], "totals": { "sum": "1800.00", "total": "1800.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "es-verifactu-op-class": "S1", "es-verifactu-regime": "01" }, "base": "1800.00", "percent": "21.0%", "amount": "378.00" } ], "amount": "378.00" } ], "sum": "378.00" }, "tax": "378.00", "total_with_tax": "2178.00", "payable": "2178.00" }, "notes": [ { "key": "general", "text": "This is a sample invoice with a standard tax" } ] } ``` Regular invoices are used for B2B transactions. Regular invoices must be issued when: * The customer is a registered business (has a tax identification number). * The transaction amount is €400 VAT included or above, or the customer requires a full invoice. * The customer needs a complete invoice with all tax details for accounting or tax purposes. To create a regular VERI\*FACTU invoice, include the [`es-verifactu-v1`](https://docs.gobl.org/addons/es-verifactu-v1) addon and ensure the `customer` field contains valid tax identification details. The addon will automatically set the document type to `F1` when the silo entry is built (which happens automatically when saving a silo entry through the API or console). The `supplier` must be [previously registered](https://docs.invopop.com/guides/es-verifactu-supplier#create-a-supplier-entry) with the tax authority and the `customer` NIF or VAT ID must be valid. ```json B2B Invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-verifactu-v1" ], "type": "standard", "series": "SAMPLE", "code": "004", "issue_date": "2024-11-13", "currency": "EUR", "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ] }, "customer": { "name": "Sample Consumer", "tax_id": { "country": "ES", "code": "B63272603" } }, "lines": [ { "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "taxes": [ { "cat": "VAT", "rate": "general" } ], "total": "1800.00" } ], "notes": [ { "key": "general", "text": "This is a sample invoice with a exempt tax" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-verifactu-v1" ], "type": "standard", "series": "SAMPLE", "code": "004", "issue_date": "2024-11-13", "currency": "EUR", "tax": { "ext": { "es-verifactu-doc-type": "F1" } }, "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ] }, "customer": { "name": "Sample Consumer", "tax_id": { "country": "ES", "code": "B63272603" } }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "21.0%", "ext": { "es-verifactu-op-class": "S1", "es-verifactu-regime": "01" } } ], "total": "1800.00" } ], "totals": { "sum": "1800.00", "total": "1800.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "es-verifactu-op-class": "S1", "es-verifactu-regime": "01" }, "base": "1800.00", "percent": "21.0%", "amount": "378.00" } ], "amount": "378.00" } ], "sum": "378.00" }, "tax": "378.00", "total_with_tax": "2178.00", "payable": "2178.00" }, "notes": [ { "key": "general", "text": "This is a sample invoice with a exempt tax" } ] } ``` Reverse charge invoices are used for B2B services provided to customers in other EU member states. Reverse charge must be applied when: * The customer is a registered business in another EU member state (has a valid EU VAT ID). * The service is provided to a business customer (B2B), not a consumer. * The service is subject to VAT but the customer accounts for the VAT in their own country. To create a reverse charge VERI\*FACTU invoice, use the tax key `reverse-charge` in your invoice lines. The [`es-verifactu-v1`](https://docs.gobl.org/addons/es-verifactu-v1) addon will automatically set the operation class to `S2` (Subject and Not Exempt - With reverse charge) when the silo entry is built. With reverse charge, no VAT is charged by the supplier. The customer accounts for VAT in their own country. The `supplier` must be [previously registered](https://docs.invopop.com/guides/es-verifactu-supplier#create-a-supplier-entry) with the tax authority and the `customer` VAT ID must be valid and registered in the EU VIES system. ```json B2B Intra-community Services invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-verifactu-v1" ], "type": "standard", "series": "SAMPLE", "code": "sett/000001", "issue_date": "2024-11-13", "currency": "EUR", "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ] }, "customer": { "name": "Sample Consumer", "tax_id": { "country": "DE", "code": "111111125" } }, "lines": [ { "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "taxes": [ { "cat": "VAT", "key": "reverse-charge" } ], "total": "1800.00" } ], "notes": [ { "key": "general", "text": "This is a sample invoice with reverse charge" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-verifactu-v1" ], "type": "standard", "series": "SAMPLE", "code": "sett/000001", "issue_date": "2024-11-13", "currency": "EUR", "tax": { "ext": { "es-verifactu-doc-type": "F1" } }, "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ] }, "customer": { "name": "Sample Consumer", "tax_id": { "country": "DE", "code": "111111125" } }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "taxes": [ { "cat": "VAT", "key": "reverse-charge", "ext": { "es-verifactu-op-class": "S2", "es-verifactu-regime": "01" } } ], "total": "1800.00" } ], "totals": { "sum": "1800.00", "total": "1800.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "reverse-charge", "ext": { "es-verifactu-op-class": "S2", "es-verifactu-regime": "01" }, "base": "1800.00", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "1800.00", "payable": "1800.00" }, "notes": [ { "key": "general", "text": "This is a sample invoice with reverse charge" } ] } ``` Intra-community supply invoices are used for B2B goods delivered to customers in other EU member states. Intra-community supplies must be applied when: * The customer is a registered business in another EU member state (has a valid EU VAT ID). * Goods are physically delivered to another EU member state. * The supply is exempt from VAT in the origin country (Spain) and subject to VAT in the destination country. To create an intra-community supply VERI\*FACTU invoice, use the tax key `intra-community` in your invoice lines. The [`es-verifactu-v1`](https://docs.gobl.org/addons/es-verifactu-v1) addon will automatically set the exemption code to `E5` ([Artículo 25 Ley de IVA](https://www.boe.es/eli/es/l/1992/12/28/37/con#a25)) when the silo entry is built. With intra-community supplies, no VAT is charged in Spain. The customer accounts for VAT in their destination country. The `supplier` must be [previously registered](https://docs.invopop.com/guides/es-verifactu-supplier#create-a-supplier-entry) with the tax authority and the `customer` VAT ID must be valid and registered in the EU VIES system. ```json Intra-community goods invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-verifactu-v1" ], "type": "standard", "series": "SAMPLE", "code": "sett/000003", "issue_date": "2024-11-13", "currency": "EUR", "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ] }, "customer": { "name": "Sample Consumer", "tax_id": { "country": "DE", "code": "111111125" } }, "lines": [ { "quantity": "20", "item": { "name": "Goods", "price": "90.00" }, "sum": "1800.00", "taxes": [ { "cat": "VAT", "key": "intra-community" } ], "total": "1800.00" } ], "notes": [ { "key": "general", "text": "This is a sample invoice with a intra-community" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-verifactu-v1" ], "type": "standard", "series": "SAMPLE", "code": "sett/000003", "issue_date": "2024-11-13", "currency": "EUR", "tax": { "ext": { "es-verifactu-doc-type": "F1" } }, "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ] }, "customer": { "name": "Sample Consumer", "tax_id": { "country": "DE", "code": "111111125" } }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Goods", "price": "90.00" }, "sum": "1800.00", "taxes": [ { "cat": "VAT", "key": "intra-community", "ext": { "es-verifactu-exempt": "E5", "es-verifactu-regime": "01" } } ], "total": "1800.00" } ], "totals": { "sum": "1800.00", "total": "1800.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "intra-community", "ext": { "es-verifactu-exempt": "E5", "es-verifactu-regime": "01" }, "base": "1800.00", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "1800.00", "payable": "1800.00" }, "notes": [ { "key": "general", "text": "This is a sample invoice with a intra-community" } ] } ``` Outside scope invoices are used for B2B services provided to customers outside the EU. To create an outside scope VERI\*FACTU invoice, use the tax key `outside-scope` in your invoice lines. The [`es-verifactu-v1`](https://docs.gobl.org/addons/es-verifactu-v1) addon will automatically set the operation class to `N2` (Not Subject - Due to location rules) when the silo entry is built. Services provided to non-EU customers are generally outside the scope of Spanish VAT. The `supplier` must be previously registered with the tax authority. Customer tax identification is optional but recommended for record-keeping purposes. ```json B2B International Services invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-verifactu-v1" ], "type": "standard", "series": "SAMPLE", "code": "sett/000002", "issue_date": "2025-11-17", "currency": "EUR", "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ] }, "customer": { "name": "Sample Consumer", "tax_id": { "country": "SG", "code": "201312345A" } }, "lines": [ { "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "taxes": [ { "cat": "VAT", "key": "outside-scope" } ], "total": "1800.00" } ], "notes": [ { "key": "general", "text": "This is a sample invoice with a outside-scope tax" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-verifactu-v1" ], "type": "standard", "series": "SAMPLE", "code": "sett/000002", "issue_date": "2025-11-17", "currency": "EUR", "tax": { "ext": { "es-verifactu-doc-type": "F1" } }, "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ] }, "customer": { "name": "Sample Consumer", "tax_id": { "country": "SG", "code": "201312345A" } }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "taxes": [ { "cat": "VAT", "key": "outside-scope", "ext": { "es-verifactu-op-class": "N2", "es-verifactu-regime": "01" } } ], "total": "1800.00" } ], "totals": { "sum": "1800.00", "total": "1800.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "outside-scope", "ext": { "es-verifactu-op-class": "N2", "es-verifactu-regime": "01" }, "base": "1800.00", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "1800.00", "payable": "1800.00" }, "notes": [ { "key": "general", "text": "This is a sample invoice with a outside-scope tax" } ] } ``` Export invoices are used for B2B goods delivered to customers outside the EU. To create an export VERI\*FACTU invoice, use the tax key `export` in your invoice lines. The [`es-verifactu-v1`](https://docs.gobl.org/addons/es-verifactu-v1) addon will automatically set the exemption code to `E2` ([Artículo 21 Ley de IVA](https://www.boe.es/eli/es/l/1992/12/28/37/con#a21)) and regime code to `02` (Export) when the silo entry is built. Exported goods are exempt from Spanish VAT. The `supplier` must be previously registered with the tax authority. Customer tax identification is optional but recommended for record-keeping purposes. ```json B2B International Goods invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-verifactu-v1" ], "type": "standard", "series": "SAMPLE", "code": "sett/000004", "issue_date": "2025-11-17", "currency": "EUR", "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ] }, "customer": { "name": "Sample Consumer", "tax_id": { "country": "SG", "code": "201312345A" } }, "lines": [ { "quantity": "20", "item": { "name": "Goods", "price": "90.00" }, "sum": "1800.00", "taxes": [ { "cat": "VAT", "key": "export" } ], "total": "1800.00" } ], "notes": [ { "key": "general", "text": "This is a sample invoice with a export" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-verifactu-v1" ], "type": "standard", "series": "SAMPLE", "code": "sett/000004", "issue_date": "2025-11-17", "currency": "EUR", "tax": { "ext": { "es-verifactu-doc-type": "F1" } }, "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ] }, "customer": { "name": "Sample Consumer", "tax_id": { "country": "SG", "code": "201312345A" } }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Goods", "price": "90.00" }, "sum": "1800.00", "taxes": [ { "cat": "VAT", "key": "export", "ext": { "es-verifactu-exempt": "E2", "es-verifactu-regime": "02" } } ], "total": "1800.00" } ], "totals": { "sum": "1800.00", "total": "1800.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "export", "ext": { "es-verifactu-exempt": "E2", "es-verifactu-regime": "02" }, "base": "1800.00", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "1800.00", "payable": "1800.00" }, "notes": [ { "key": "general", "text": "This is a sample invoice with a export" } ] } ``` Exempt `E1` invoices are used for B2B transactions that are exempt from VAT pursuant to [Artículo 20 Ley de IVA](https://www.boe.es/eli/es/l/1992/12/28/37/con#a20), which covers exemptions in internal operations. To create an exempt E1 VERI\*FACTU invoice, use the tax key `exempt` in your invoice lines. The [`es-verifactu-v1`](https://docs.gobl.org/addons/es-verifactu-v1) addon will automatically set the exemption code to `E1` when the silo entry is built. Exempt operations are not subject to VAT but must still be reported. The `supplier` must be previously registered with the tax authority and the `customer` NIF must be valid. ```json B2B Exempt E1 Invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-verifactu-v1" ], "type": "standard", "series": "SAMPLE", "code": "004", "issue_date": "2024-11-13", "currency": "EUR", "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ] }, "customer": { "name": "Sample Consumer", "tax_id": { "country": "ES", "code": "B63272603" } }, "lines": [ { "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "taxes": [ { "cat": "VAT", "key": "exempt" } ], "total": "1800.00" } ], "notes": [ { "key": "general", "text": "This is a sample invoice with a exempt tax" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-verifactu-v1" ], "type": "standard", "series": "SAMPLE", "code": "004", "issue_date": "2024-11-13", "currency": "EUR", "tax": { "ext": { "es-verifactu-doc-type": "F1" } }, "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ] }, "customer": { "name": "Sample Consumer", "tax_id": { "country": "ES", "code": "B63272603" } }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "taxes": [ { "cat": "VAT", "key": "exempt", "ext": { "es-verifactu-exempt": "E1", "es-verifactu-regime": "01" } } ], "total": "1800.00" } ], "totals": { "sum": "1800.00", "total": "1800.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "exempt", "ext": { "es-verifactu-exempt": "E1", "es-verifactu-regime": "01" }, "base": "1800.00", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "1800.00", "payable": "1800.00" }, "notes": [ { "key": "general", "text": "This is a sample invoice with a exempt tax" } ] } ``` One-Stop-Shop (OSS) invoices are used for B2C distance sales of goods and services to consumers in other EU member states when the supplier is registered under the OSS scheme. To create an OSS VERI\*FACTU invoice, include the `simplified` tag in your GOBL document with the [`es-verifactu-v1`](https://docs.gobl.org/addons/es-verifactu-v1) addon. The invoice will be treated as a simplified invoice (document type `F2`) and VAT is accounted for through the OSS scheme in the destination country. OSS allows suppliers to register for VAT in one EU member state and account for VAT on all EU distance sales through that single registration. The `supplier` must be [previously registered](https://docs.invopop.com/guides/es-verifactu-supplier#create-a-supplier-entry) with the tax authority and enrolled in the OSS scheme. ```json B2C One Stop Shop Invoice theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-verifactu-v1" ], "$tags": [ "simplified" ], "type": "standard", "series": "SAMPLE", "code": "004", "issue_date": "2024-11-13", "currency": "EUR", "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ] }, "lines": [ { "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "taxes": [ { "cat": "VAT", "rate": "standard" } ], "total": "1800.00" } ], "notes": [ { "key": "general", "text": "This is a sample invoice with a standard tax" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-verifactu-v1" ], "$tags": [ "simplified" ], "type": "standard", "series": "SAMPLE", "code": "004", "issue_date": "2024-11-13", "currency": "EUR", "tax": { "ext": { "es-verifactu-doc-type": "F2" } }, "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ] }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "21.0%", "ext": { "es-verifactu-op-class": "S1", "es-verifactu-regime": "01" } } ], "total": "1800.00" } ], "totals": { "sum": "1800.00", "total": "1800.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "es-verifactu-op-class": "S1", "es-verifactu-regime": "01" }, "base": "1800.00", "percent": "21.0%", "amount": "378.00" } ], "amount": "378.00" } ], "sum": "378.00" }, "tax": "378.00", "total_with_tax": "2178.00", "payable": "2178.00" }, "notes": [ { "key": "general", "text": "This is a sample invoice with a standard tax" } ] } ``` ```json Rectificativa por diferencias theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-verifactu-v1" ], "uuid": "01971bb1-1499-7001-81ea-26f51cf396e1", "type": "credit-note", "series": "CN", "issue_date": "2025-05-29", "currency": "EUR", "preceding": [ { "uuid": "3aea7b56-59d8-4beb-90bd-f8f280d852a0", "type": "standard", "issue_date": "2024-11-13", "series": "SAMPLE", "code": "004" } ], "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ] }, "customer": { "name": "Sample Consumer", "tax_id": { "country": "ES", "code": "B63272603" } }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "taxes": [ { "cat": "VAT", "rate": "general" } ], "total": "1800.00" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-verifactu-v1" ], "uuid": "01971bb1-1499-7001-81ea-26f51cf396e1", "type": "credit-note", "series": "CN", "issue_date": "2025-05-29", "currency": "EUR", "preceding": [ { "uuid": "3aea7b56-59d8-4beb-90bd-f8f280d852a0", "type": "standard", "issue_date": "2024-11-13", "series": "SAMPLE", "code": "004" } ], "tax": { "ext": { "es-verifactu-correction-type": "I", "es-verifactu-doc-type": "R1" } }, "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ] }, "customer": { "name": "Sample Consumer", "tax_id": { "country": "ES", "code": "B63272603" } }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "21.0%", "ext": { "es-verifactu-op-class": "S1", "es-verifactu-regime": "01" } } ], "total": "1800.00" } ], "totals": { "sum": "1800.00", "total": "1800.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "es-verifactu-op-class": "S1", "es-verifactu-regime": "01" }, "base": "1800.00", "percent": "21.0%", "amount": "378.00" } ], "amount": "378.00" } ], "sum": "378.00" }, "tax": "378.00", "total_with_tax": "2178.00", "payable": "2178.00" } } ``` ```json Rectificativa por sustitución theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-verifactu-v1" ], "type": "corrective", "series": "CO", "issue_date": "2025-05-29", "currency": "EUR", "preceding": [ { "uuid": "3aea7b56-59d8-4beb-90bd-f8f280d852a0", "type": "standard", "issue_date": "2024-11-13", "series": "SAMPLE", "code": "004", "tax": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "es-verifactu-op-class": "S1", "es-verifactu-regime": "01" }, "base": "1800.00", "percent": "21.0%", "amount": "378.00" } ], "amount": "378.00" } ], "sum": "378.00" } } ], "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ] }, "customer": { "name": "Sample Consumer", "tax_id": { "country": "ES", "code": "B63272603" } }, "lines": [ { "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "taxes": [ { "cat": "VAT", "rate": "general" } ], "total": "1800.00" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-verifactu-v1" ], "type": "corrective", "series": "CO", "issue_date": "2025-05-29", "currency": "EUR", "preceding": [ { "uuid": "3aea7b56-59d8-4beb-90bd-f8f280d852a0", "type": "standard", "issue_date": "2024-11-13", "series": "SAMPLE", "code": "004", "tax": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "es-verifactu-op-class": "S1", "es-verifactu-regime": "01" }, "base": "1800.00", "percent": "21.0%", "amount": "378.00" } ], "amount": "378.00" } ], "sum": "378.00" } } ], "tax": { "ext": { "es-verifactu-correction-type": "S", "es-verifactu-doc-type": "R1" } }, "supplier": { "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ] }, "customer": { "name": "Sample Consumer", "tax_id": { "country": "ES", "code": "B63272603" } }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "21.0%", "ext": { "es-verifactu-op-class": "S1", "es-verifactu-regime": "01" } } ], "total": "1800.00" } ], "totals": { "sum": "1800.00", "total": "1800.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "es-verifactu-op-class": "S1", "es-verifactu-regime": "01" }, "base": "1800.00", "percent": "21.0%", "amount": "378.00" } ], "amount": "378.00" } ], "sum": "378.00" }, "tax": "378.00", "total_with_tax": "2178.00", "payable": "2178.00" } } ``` ```json Factura de canje theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-verifactu-v1" ], "type": "standard", "tax": { "tags": [ "replacement" ] }, "series": "FC", "issue_date": "2026-02-26", "currency": "EUR", "preceding": [ { "type": "standard", "issue_date": "2026-02-20", "series": "FS", "code": "001" } ], "supplier": { "name": "Easor Software Solutions S.L.", "tax_id": { "country": "ES", "code": "B24830515" }, "addresses": [ { "num": "532", "street": "Avenida Diagonal", "locality": "Barcelona", "region": "Barcelona", "code": "08006", "country": "ES" } ] }, "customer": { "name": "Cliente Ejemplo S.L.", "tax_id": { "country": "ES", "code": "B63272603" } }, "lines": [ { "quantity": "1", "item": { "name": "Servicio de consultoría", "price": "500.00" }, "taxes": [ { "cat": "VAT", "rate": "general" } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-verifactu-v1" ], "$tags": [ "replacement" ], "type": "standard", "series": "FC", "issue_date": "2026-02-26", "currency": "EUR", "preceding": [ { "type": "standard", "issue_date": "2026-02-20", "series": "FS", "code": "001" } ], "tax": { "ext": { "es-verifactu-doc-type": "F3" } }, "supplier": { "name": "Easor Software Solutions S.L.", "tax_id": { "country": "ES", "code": "B24830515" }, "addresses": [ { "num": "532", "street": "Avenida Diagonal", "locality": "Barcelona", "region": "Barcelona", "code": "08006", "country": "ES" } ] }, "customer": { "name": "Cliente Ejemplo S.L.", "tax_id": { "country": "ES", "code": "B63272603" } }, "lines": [ { "i": 1, "quantity": "1", "item": { "name": "Servicio de consultoría", "price": "500.00" }, "sum": "500.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "21.0%", "ext": { "es-verifactu-op-class": "S1", "es-verifactu-regime": "01" } } ], "total": "500.00" } ], "totals": { "sum": "500.00", "total": "500.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "es-verifactu-op-class": "S1", "es-verifactu-regime": "01" }, "base": "500.00", "percent": "21.0%", "amount": "105.00" } ], "amount": "105.00" } ], "sum": "105.00" }, "tax": "105.00", "total_with_tax": "605.00", "payable": "605.00" } } ``` The Catalan tourist tax (IEET, *Impost sobre les Estades en Establiments Turístics*) is a regional tax administered by the Agència Tributària de Catalunya — not the AEAT — so it is **not** classified as a tax in the VERI\*FACTU record. Hotels declare it directly to the Generalitat through the quarterly Modelo 950. Model the IEET as a document-level [`charge`](https://docs.gobl.org/draft-0/bill/invoice#charge) with `key: "tax"`. This keeps it outside the VAT base (Art. 35 of Llei 5/2017 requires it to be shown separately from the consideration) and lets it flow into the invoice's `ImporteTotal` for VERI\*FACTU without being reported as a tax category. Do not model the IEET as a `VAT` tax line — it is a fixed amount per night, not a percentage, and should not be reported to the AEAT. The `reason` field on the charge is what appears on the guest's invoice, so include the establishment type, location, nights, and rate for a clear breakdown. ```json B2C Hotel + IEET (Catalonia tourist tax) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "es-verifactu-v1" ], "$tags": [ "simplified" ], "series": "SAMPLE", "issue_date": "2026-05-06", "supplier": { "name": "Hotel Barcelona Example SL", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "locality": "Barcelona", "code": "08001", "country": "ES" } ] }, "customer": { "name": "John Smith", "addresses": [ { "locality": "London", "country": "GB" } ] }, "lines": [ { "quantity": "3", "item": { "name": "Double room — 3 nights", "price": "180.00", "unit": "day" }, "taxes": [ { "cat": "VAT", "rate": "reduced" } ] } ], "charges": [ { "key": "tax", "reason": "IEET — Hotel 4★, Barcelona city — 3 nights × 1 guest × €3.40", "amount": "10.20" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "ES", "$addons": [ "es-verifactu-v1" ], "$tags": [ "simplified" ], "type": "standard", "series": "SAMPLE", "issue_date": "2026-05-06", "currency": "EUR", "tax": { "ext": { "es-verifactu-doc-type": "F2" } }, "supplier": { "name": "Hotel Barcelona Example SL", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "locality": "Barcelona", "code": "08001", "country": "ES" } ] }, "customer": { "name": "John Smith", "addresses": [ { "locality": "London", "country": "GB" } ] }, "lines": [ { "i": 1, "quantity": "3", "item": { "name": "Double room — 3 nights", "price": "180.00", "unit": "day" }, "sum": "540.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "reduced", "percent": "10.0%", "ext": { "es-verifactu-op-class": "S1", "es-verifactu-regime": "01" } } ], "total": "540.00" } ], "charges": [ { "i": 1, "key": "tax", "reason": "IEET — Hotel 4★, Barcelona city — 3 nights × 1 guest × €3.40", "amount": "10.20" } ], "totals": { "sum": "540.00", "charge": "10.20", "total": "550.20", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "es-verifactu-op-class": "S1", "es-verifactu-regime": "01" }, "base": "540.00", "percent": "10.0%", "amount": "54.00" } ], "amount": "54.00" } ], "sum": "54.00" }, "tax": "54.00", "total_with_tax": "604.20", "payable": "604.20" } } ``` Suppliers: To register a company supplier in Spain you must provide: * **Company information**: name, NIF (tax identification number), and address * **Legal representative information**: full name, government ID type and number (DNI, NIE, or passport), and address The legal representative is the person authorized to sign the representation agreement on behalf of the company. The supplier must be [previously registered](https://docs.invopop.com/guides/es-verifactu-supplier#create-a-supplier-entry) with the tax authority before invoices can be issued on their behalf. ```json Spain supplier example theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "people": [ { "name": { "given": "Juan", "surname": "Pérez González" }, "identities": [ { "key": "national", "code": "123456789A" } ], "addresses": [ { "num": "10", "street": "Calle Ejemplo", "locality": "Madrid", "region": "Madrid", "code": "28020", "country": "ES" } ] } ], "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] } ``` An *autónomo* is a self-employed individual in Spain who operates as a sole proprietor. To register them, a NIF (tax id number) with the corresponding full name and address must be provided. Unlike company suppliers, autónomos do not require separate legal representative information since the individual is the authorized signatory. The supplier must be [previously registered](https://docs.invopop.com/guides/es-verifactu-supplier#create-a-supplier-entry) with the tax authority before invoices can be issued on their behalf. ```json Spain autónomo supplier example theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "Juan Pérez González", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "autonomo@example.com" } ] } ```
*** | | | | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Compliance | [Invoicing compliance in Spain](/compliance/spain)
[Compliance timeline](/timelines/spain) | | Apps | [Spain](/apps/spain)
[VERI\*FACTU Spain](/apps/verifactu-spain)
[TicketBAI (Spain app)](/apps/spain) | | Guides | [Facturae guide](/guides/es-facturae)
[VERI\*FACTU invoicing guide](/guides/es-verifactu)
[VERI\*FACTU supplier onboarding](/guides/es-verifactu-supplier)
[SII invoicing guide](/guides/es-sii)
[SII supplier onboarding](/guides/es-sii-supplier)
[TicketBAI guide](/guides/es-ticketbai) | | FAQ | [Spain FAQ](/faq/spain) | | GOBL | [Spain Tax Regime](https://docs.gobl.org/regimes/es)
[VERI\*FACTU Addon](https://docs.gobl.org/addons/es-verifactu-v1)
[Facturae Addon](https://docs.gobl.org/addons/es-facturae-v3)
[SII Addon](https://docs.gobl.org/addons/es-sii-v1) | | GitHub | [gobl.facturae](https://github.com/invopop/gobl.facturae)
[gobl.verifactu](https://github.com/invopop/gobl.verifactu)
[gobl.ticketbai](https://github.com/invopop/gobl.ticketbai) |
Ask and answer questions about the VERI\*FACTU Spain App → # E-invoicing in the Americas Source: https://docs.invopop.com/compliance/americas Clearance-based continuous transaction control (CTC) models dominate the American continent and each country operates its own tax authority infrastructure ## Executive summary The Americas share a distinctive approach to e-invoicing: every country in the region operates a **clearance model**, also known as [continuous transaction control (CTC)](/compliance/glossary). Under this architecture, each invoice must be submitted to the national tax authority and formally authorized before it becomes legally valid. No invoice can reach a customer until the government has approved the transaction, giving tax authorities real-time visibility into all business activity. Unlike Europe or Asia-Pacific, there is no shared international standard across the Americas. Each country has developed its own XML format, tax authority infrastructure, and certification process. Brazil uses NF-e and NFS-e through SEFAZ, Mexico relies on CFDI through the SAT, Colombia issues FEV through DIAN, and Argentina uses Factura Electrónica through ARCA. Colombia is the only country in the region that has adopted an international format — OASIS UBL 2.1. The region's e-invoicing systems are among the most mature in the world. Brazil and Mexico have had mandatory e-invoicing since 2008 and 2014 respectively, making Latin America the global pioneer of clearance-based models. Newer entrants like Chile and Peru are following the same pattern. ## Common standards and formats Each country in the Americas uses a **country-specific XML schema** rather than an international standard like UBL or Peppol. | Country | Format | Tax authority | | --------- | -------------------------------------------------- | ------------------------------------------------------ | | Argentina | XML (ARCA schema) | [ARCA](https://www.afip.gob.ar) | | Brazil | Local XML (NF-e, NFS-e, NFC-e, NFCom, CT-e, MDF-e) | [RFB / SEFAZ](https://www.gov.br/receitafederal/pt-br) | | Chile | DTE XML | [SII](https://homer.sii.cl) | | Colombia | OASIS UBL 2.1 (DIAN schema) | [DIAN](https://www.dian.gov.co) | | Mexico | CFDI (XML) | [SAT](https://sat.gob.mx) | | Peru | UBL 2.1 (SUNAT schema) | [SUNAT](https://www.sunat.gob.pe) | Colombia stands out as the only country in the region to adopt the OASIS UBL standard, applying a DIAN-specific schema on top. ## Compliance model All six countries use the **clearance model (CTC)**. This is the defining characteristic of e-invoicing in the Americas. Under CTC, the tax authority acts as an intermediary between supplier and buyer. The typical flow is: 1. The supplier generates an invoice in the required XML format. 2. The invoice is submitted electronically to the tax authority (or an authorized intermediary). 3. The tax authority validates the invoice and returns an authorization code. 4. Only after authorization does the invoice become legally valid and deliverable to the buyer. Because every invoice passes through the tax authority in real time, **e-reporting is fully integrated into the invoicing process**. There are no separate periodic reporting submissions — each issued invoice automatically serves as a tax report. Mexico adds a unique layer to this model by using **PACs (Proveedores Autorizados de Certificación)**, authorized private intermediaries that validate and certify invoices before forwarding them to SAT. ## Invopop countries in this region ARCA clearance model, Factura Electrónica SEFAZ clearance model, NF-e / NFS-e / NFC-e SII clearance model, DTE DIAN clearance model, FEV (UBL 2.1) SAT clearance model, CFDI SUNAT clearance model, UBL 2.1 # Invoicing compliance in Argentina Source: https://docs.invopop.com/compliance/argentina Argentina's mandatory e-invoicing requirements, Factura Electrónica implementation, and e-reporting obligations for B2B, B2C, and B2G transactions View current and upcoming regulation → | | | | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Compliance | [Invoicing compliance in Argentina](/compliance/argentina)
[Compliance timeline](/timelines/argentina) | | Apps | [Argentina](/apps/argentina) | | Guides | [ARCA supplier onboarding](/guides/ar-arca-suppliers)
[ARCA invoices](/guides/ar-arca-invoices) | | FAQ | [Argentina FAQ](/faq/argentina) | | GOBL | [Argentina Tax Regime](https://docs.gobl.org/regimes/ar)
[Argentina ARCA Addon](https://docs.gobl.org/addons/ar-arca-v4) |
## Executive summary Argentina operates a mandatory electronic invoicing system through **ARCA (Agencia de Recaudación y Control Aduanero)**, formerly known as AFIP until November 2024, the national tax and customs authority. The system uses a **clearance model** (also known as continuous transaction control or CTC), where each invoice must be submitted to ARCA for validation and authorization in real time before it becomes legally valid. The Argentine e-invoicing system requires all registered taxpayers to issue electronic invoices (facturas electrónicas). Being a registered taxpayer means you hold a **CUIT (Clave Única de Identificación Tributaria)**, Argentina's tax identification number, and have a **Clave Fiscal**, a digital key used to access ARCA services online. Taxpayers can issue e-invoices either through ARCA's web portal or by integrating with **WSFE (Webservices de Factura Electrónica)**, ARCA's web service infrastructure. E-invoices are generated in **XML format** conforming to ARCA's prescribed schema (not a global standard like UBL). Each invoice requires a **CAE (Código de Autorización Electrónico)**, a 14-digit authorization code issued by ARCA that validates the invoice and must be included on the invoice for it to be legally valid. The system covers B2B, B2C, B2G, and tourism transactions across various invoice types (A, B, C, E, T, and others). E-reporting in Argentina is fully integrated into the electronic invoicing system — see [E-reporting](#e-reporting) below. ## Invoicing in Argentina Factura A is used by VAT-registered businesses (Responsables Inscriptos) when selling to other VAT-registered entities. These invoices include detailed VAT breakdowns and allow the buyer to claim input VAT credits. | | | | -------------------- | ------------------------------------------------------------------------------------------------------------ | | **Models** | B2B, B2G | | **Format** | XML (ARCA schema) | | **Infrastructure** | [ARCA](https://www.afip.gob.ar) | | **Model** | Clearance continuous transaction control (CTC) | | **Code** | 001 (Invoice), 002 (Debit Note), 003 (Credit Note) | | **Scope & Deadline** | Mandatory for all registered taxpayers | | **Agency** | [ARCA](https://www.afip.gob.ar) | | **Invopop Support** | Available - [ARCA Supplier onboarding](/guides/ar-arca-suppliers), [ARCA Invoices](/guides/ar-arca-invoices) | Factura B is used when selling to non-VAT-registered clients (final consumers or Monotributistas). VAT is included in the price but not separately detailed for input credit purposes. | | | | -------------------- | ------------------------------------------------------------------------------------------------------------ | | **Models** | B2C, B2B | | **Format** | XML (ARCA schema) | | **Infrastructure** | [ARCA](https://www.afip.gob.ar) | | **Model** | Clearance continuous transaction control (CTC) | | **Code** | 006 (Invoice), 007 (Debit Note), 008 (Credit Note) | | **Scope & Deadline** | Mandatory for all registered taxpayers | | **Agency** | [ARCA](https://www.afip.gob.ar) | | **Invopop Support** | Available - [ARCA Supplier onboarding](/guides/ar-arca-suppliers), [ARCA Invoices](/guides/ar-arca-invoices) | Factura C is used by taxpayers under the Simplified Regime (Monotributo), a simplified tax scheme for small businesses and self-employed individuals. These invoices do not discriminate VAT. | | | | -------------------- | ------------------------------------------------------------------------------------------------------------ | | **Models** | B2C, B2B | | **Format** | XML (ARCA schema) | | **Infrastructure** | [ARCA](https://www.afip.gob.ar) | | **Model** | Clearance continuous transaction control (CTC) | | **Code** | 011 (Invoice), 012 (Debit Note), 013 (Credit Note) | | **Scope & Deadline** | Mandatory for Monotributistas | | **Agency** | [ARCA](https://www.afip.gob.ar) | | **Invopop Support** | Available - [ARCA Supplier onboarding](/guides/ar-arca-suppliers), [ARCA Invoices](/guides/ar-arca-invoices) | Factura E is used for export operations of goods and services. When exporting services that meet certain conditions, ARCA treats them like goods exports, meaning the taxpayer is exempt from VAT and can claim back VAT paid on local purchases. | | | | -------------------- | ------------------------------------------------------------------------------------------------------------ | | **Models** | B2B (Export) | | **Format** | XML (ARCA schema) | | **Infrastructure** | [ARCA](https://www.afip.gob.ar) | | **Model** | Clearance continuous transaction control (CTC) | | **Code** | 019 (Invoice), 020 (Debit Note), 021 (Credit Note) | | **Scope & Deadline** | Mandatory for export operations | | **Agency** | [ARCA](https://www.afip.gob.ar) | | **Invopop Support** | Available - [ARCA Supplier onboarding](/guides/ar-arca-suppliers), [ARCA Invoices](/guides/ar-arca-invoices) | Factura T is issued by hotels and tourism providers to non-resident tourists. It is dispatched through ARCA's WSCT (Web Service de Comprobantes T) service, and ARCA automatically reimburses the 21% VAT on qualifying accommodation items so the tourist pays only the net amount. | | | | -------------------- | ------------------------------------------------------------------------------------------------------------ | | **Models** | Tourism (B2C, foreign consumers) | | **Format** | XML (ARCA WSCT schema) | | **Infrastructure** | [ARCA](https://www.afip.gob.ar) | | **Model** | Clearance continuous transaction control (CTC) | | **Code** | 195 (Invoice), 196 (Debit Note), 197 (Credit Note) | | **Scope & Deadline** | Hotels and tourism providers serving non-resident tourists | | **Agency** | [ARCA](https://www.afip.gob.ar) | | **Invopop Support** | Available - [ARCA Supplier onboarding](/guides/ar-arca-suppliers), [ARCA Invoices](/guides/ar-arca-invoices) | ## E-reporting E-reporting is fully integrated into Argentina's electronic invoicing system rather than being a separate process. Under the clearance model, every electronic invoice is generated, submitted to ARCA, validated, and authorized in real time. Only upon receiving the CAE (Código de Autorización Electrónico) is the invoice legally valid and simultaneously reported to the tax authority. This means **issuing an e-invoice automatically fulfills reporting obligations** without requiring separate periodic submissions. This real-time architecture gives ARCA continuous visibility into all business transactions, enabling automated VAT reconciliation and streamlined audits. ## Regulation Argentine invoices use a two-part numbering system: **XXXXX-YYYYYYYY** * **Punto de Venta (POS)**: A 5-digit code linked to the electronic invoicing method (e.g., Web Service, ARCA portal). Each POS has its own independent sequence and is listed in an official ARCA table. * **Sequential Number**: An 8-digit code starting from `00000001` and increasing by 1 with each invoice. The sequence must be continuous with no skipped or repeated numbers. The invoice type (A, B, C, etc.) and POS together define the invoice series. For example: * Factura A from POS 0001: `00001-00000001` * Factura B from POS 0002: `00002-00000001` | Letter | Issuer | Recipient | | ------ | ------------------------------------------- | ---------------------------------------------------------------------------- | | **A** | IVA Registered | Other IVA Registered; or IVA Non-Registered | | **B** | IVA Registered | Final consumers; IVA exempt; non-responsible; Monotributo; "Non-categorized" | | **C** | IVA Non-Registered, IVA Exempt, Monotributo | Anyone | | **E** | Any obligated subject | Foreign importers (export operations, including special customs area) | | **T** | Hotels and tourism providers | Non-resident tourists (accommodation and travel services) | Each letter class uses an **independent numbering sequence**. **IVA (VAT - Impuesto al Valor Agregado)** VAT is the primary tax applied to most goods and services. Different rates (alícuotas) apply based on the nature of the product or service: | **ARCA code** | **Rate** | **Description** | | ------------- | -------- | --------------------------------------------- | | 3 | 0% | VAT-exempt sales (exports, exempt activities) | | 8 | 5% | Special reduced rate | | 9 | 2.5% | Special reduced rate | | 4 | 10.5% | Reduced rate (construction, agriculture) | | 5 | 21% | Standard VAT rate | | 6 | 27% | Higher rate (utilities, telecom services) | Only taxpayers registered as *Responsables Inscriptos* can deduct VAT on their purchases. When VAT is deductible, each invoice line should include the base amount, the alícuota code, the applicable VAT rate percentage, and the resulting tax amount. **Other Tax Types** | **Tax** | **Description** | **Applies To** | | ---------------------- | ----------------------------- | ------------------------------- | | **IIBB** | Gross income tax (provincial) | Varies by province and activity | | **Ganancias** | Income tax | Based on net profit | | **Impuestos Internos** | Internal taxes | Alcohol, tobacco, luxury goods | GOBL supports these tax types in its [Argentina tax regime](https://docs.gobl.org/regimes/ar). **Consumer Tax Transparency Regime (General Resolution 5614/2024)** Starting January 1, 2025, large companies must itemize VAT and other indirect national taxes on electronic invoices. All other taxpayers must comply by April 1, 2025. **Foreign Currency Invoicing (General Resolution 5616/2024)** Exchange rate information must be included in electronic invoices of types A, B, C, and E. Implementation timeline: * January 15, 2025: WebService technical manuals available * March 5, 2025: Mobile Invoicing system and electronic receipt platforms updated * April 15, 2025: Mandatory use of WebService technical manuals * **CUIT** of both issuer and receiver * **Invoice number** (Punto de Venta + Sequential Number) * **CAE (Código de Autorización Electrónico)**: 14-digit authorization code from ARCA * **VAT Status** (*Tipo de Contribuyente*) of both parties * **Date and place of issuance** * **Product/service descriptions** with quantities and unit prices * **Tax breakdown** (IVA, IIBB if applicable, etc.) with appropriate alícuota codes * **Total amounts** with separate display of net, taxes, and gross * **QR code** generated according to ARCA specifications * **Economic activity code** of the issuer For export invoices (Factura E), additional information about the destination country and export regime may be required. Electronic invoices must be archived for a minimum of **10 years** in Argentina. This requirement applies to **both the issuer and the receiver**. The archive must include: * The original electronic invoice (XML format) * The CAE authorization code * Digital signature and timestamp * Audit logs of submissions Electronic storage is allowed, and the data must reside in Argentina. The archived e-invoices must maintain integrity (unaltered original XML with its digital signature and CAE) and be available for inspection by ARCA upon request. The electronic archive is legally equivalent to a paper original. ARCA provides web service infrastructure for automated invoice submission. Currently available web services include: * **wsfev1** (Web Service de Factura Electrónica V1): For invoices A, B, C, and M without item detail, supporting CAE and CAEA * **wsmtxca** (Web Service Factura Electrónica): For invoices A and B with item details, supporting CAE and CAEA * **wsfexv1** (Web Service de Factura Electrónica de Exportación V1): For type E (export) invoices * **wsct** (Web Service de Comprobantes T): For type T tourism invoices issued to non-resident tourists Authentication requires the WSAA (Webservice de Autenticación y Autorización) to obtain a Ticket de Acceso (TA), which uses an X.509 digital certificate issued by ARCA's Certifying Authority. * Government agencies (national, provincial, municipal) that are not state-owned enterprises. * Postal/courier services (only for stamp sales and meter-based services). * Public telephone companies (only for token/card-based access). * Financial entities regulated under Law 21.526 (banks, etc.) — except for specific operations like real estate rentals, safe deposit boxes, and data processing services for third parties. * Public passenger transport companies (bus, train, taxi, remis) when access is via numbered tickets/tokens — but taxi/remis drivers must issue full invoices if the customer requests one or if the operation is IVA-taxable. * Agricultural producers/cooperatives when the buyer is obligated to issue the supporting document. * Entertainment/amusement venues when access is via numbered tickets. * Lottery/betting concessionaires (only for that activity). * Corporate directors, syndics, and similar officers (only for fees received from the entity, backed by the entity's own receipt). * Judicial fee recipients (attorneys, experts, etc.) — only for judicially awarded fees. * Non-profit entities under Income Tax Law art. 20 (e), (f), (g), (m). * Parking meter token/card sellers. * Dependent workers and domestic service providers. * Non-IVA-registered subjects making cash-only sales to final consumers under ARS \$10 (or lower provincial threshold), who do not have fiscal controllers. * Credit/debit card system issuers/administrators. * Individuals renting a single property for ≤ ARS \$1,500/month. * Vending machine operators (subject to specific technical requirements for the machine's counter and sealing). * Airport concessionaires (for aerodrome usage fees on domestic/international flights). Even exempt subjects must comply with invoice obligations from other laws (commercial, civil, accounting, etc.). If they are required to use Fiscal Controllers, they must do so regardless of this exemption. ## FAQ Compliance questions * **CUIT** (Clave Única de Identificación Tributaria) is Argentina's tax identification number. Every registered taxpayer must have a CUIT to issue electronic invoices. * **Clave Fiscal** is a digital key used to access ARCA's online services, including the certificate management portal. You need it to generate digital certificates for electronic invoicing. Both are obtained through ARCA when you register as a taxpayer. These are two different tax regimes in Argentina: **Responsable Inscripto** (Registered Taxpayer): * Standard tax regime for most businesses * Must charge and collect VAT separately * Can issue Factura A (to other registered taxpayers) and Factura B (to consumers) * Must file monthly VAT and income tax returns **Monotributista**: * Simplified tax regime for small businesses and self-employed individuals * Pays a fixed monthly amount covering VAT and income tax * Can only issue Factura C * Cannot deduct VAT on purchases Your choice of regime determines which invoice types you can issue. Argentina has several VAT rates (alícuotas): | AFIP Code | Rate | Description | | --------- | ----- | --------------------------------------------- | | 3 | 0% | VAT-exempt sales (exports, exempt activities) | | 9 | 2.5% | Special reduced rate | | 8 | 5% | Special reduced rate | | 4 | 10.5% | Reduced rate (construction, agriculture) | | 5 | 21% | Standard VAT rate (most goods and services) | | 6 | 27% | Higher rate (utilities, telecom services) | The standard rate is 21%, which applies to most goods and services. GOBL's [Argentina tax regime](https://docs.gobl.org/regimes/ar) supports all of these rates. A clearance model (also called real-time validation or continuous transaction control) is a regulatory architecture in which each invoice must be electronically submitted to the tax authority and formally approved before it becomes legally valid. In Argentina's case, the issuer submits invoice data to ARCA, which validates it and returns a CAE (Código de Autorización Electrónico). Only with this authorization code can the invoice be legally issued to the customer. This architecture gives ARCA real-time visibility into all business transactions, preventing fraud and enabling automated tax compliance verification. AFIP (Administración Federal de Ingresos Públicos) was Argentina's national tax authority until November 2024. It was then renamed to ARCA (Agencia de Recaudación y Control Aduanero). The organization's functions and systems remain the same—only the name has changed. You may still see references to AFIP in older documentation and systems. The CAE (Código de Autorización Electrónico) is a 14-digit authorization code issued by ARCA that validates an invoice. Every electronic invoice must receive a CAE before it becomes legally valid. The CAE must be displayed on the invoice along with its expiration date (typically 15 days from issuance). Without a CAE, an invoice is not legally valid in Argentina, and the issuer cannot claim it as a deductible expense or VAT credit. Argentina has several invoice types based on the tax classification of both the issuer and the customer: * **Factura A**: Issued by registered taxpayers (Responsable Inscripto) to other registered taxpayers. VAT is broken down separately. * **Factura B**: Issued by registered taxpayers to final consumers, exempt entities, and non-categorized subjects. VAT is included in the total price. * **Factura C**: Issued by monotributistas (simplified tax regime) to any type of customer. No VAT breakdown. * **Factura E**: Used for export operations of goods and services (support coming soon). * **Factura T**: Issued by hotels and tourism providers to non-resident tourists. ARCA automatically reimburses the 21% VAT on qualifying accommodation items. Invopop supports all of these invoice types through the Argentina app, except Factura E, which is coming soon. Argentine regulations require invoices to be submitted to ARCA promptly after the transaction occurs. While ARCA may accept invoices with recent past dates, it's best practice to issue invoices in real time or as close to the transaction date as possible. For recording operation dates that differ from the issue date, use GOBL's `op_date` field to store the actual transaction date while keeping `issue_date` as the current date. As a Responsable Inscripto (registered taxpayer): **Issue Factura A when your customer is:** * Another Responsable Inscripto * A Monotributista * Any entity that needs to claim VAT credits **Issue Factura B when your customer is:** * A final consumer (Consumidor Final) * An exempt entity (Exento) * A non-categorized subject * A foreign tourist The key difference is that Factura A breaks down VAT separately (allowing the buyer to claim input VAT credits), while Factura B includes VAT in the total price. The supplier party (issuer) must have an active CUIT, a Clave Fiscal at security level 3 or higher, and a valid ARCA digital certificate generated specifically for electronic invoicing (separate from the one used for AFIP web access). More available in our [Argentina FAQ](/faq/argentina) section *** Ask and answer questions about Argentina's regulation → # E-invoicing in Asia Source: https://docs.invopop.com/compliance/asia Overview of e-invoicing compliance across Asia, where Peppol is the unifying standard and countries are adopting phased mandates through 2025 and 2026 ## Executive summary Asia's e-invoicing landscape is built around the **[Peppol](/apps/peppol) network**, the same international standard used across Europe and Oceania. Singapore led the way by becoming the first Peppol Authority outside Europe in 2018, and Malaysia is following the same path. This gives businesses in the region built-in cross-border interoperability with all other Peppol-connected jurisdictions worldwide. The region's approach differs from the Americas' clearance model. Rather than requiring government pre-approval for every invoice, Asian countries are adopting **reporting models** where structured invoice data flows to the tax authority in near real time alongside the buyer. Singapore's [five-corner model](/compliance/glossary) is the defining architecture: the supplier and buyer exchange invoices through their respective Peppol Access Points, while the tax authority (IRAS) receives a copy of every transaction as the "fifth corner." Mandates are rolling out in phases through 2025 and 2026, starting with voluntary GST registrants and progressively extending to all registered businesses. ## Common standards and formats **Peppol** is the shared standard across Asia, providing a unified network for invoice exchange and cross-border interoperability. | Country | Format | Network | Tax authority | | --------- | --------------------------------------- | ------- | ----------------------------------------------------------------- | | Malaysia | Peppol (details TBD) | Peppol | TBD | | Singapore | PINT-SG / BIS Billing 3.0 (UBL 2.1 XML) | Peppol | [IRAS](https://www.iras.gov.sg) / [IMDA](https://www.imda.gov.sg) | Singapore uses the **PINT-SG** format, a Singapore-specific adaptation of OASIS UBL 2.1 XML that includes local requirements such as GST registration numbers, PayNow/GIRO payment methods, and IRAS validation rules. This format is progressively replacing the earlier Singapore BIS Billing 3.0 specification. ## Compliance model The region uses a **five-corner Peppol model** for e-invoicing and e-reporting. In this model: 1. The supplier sends an invoice through their Peppol Access Point. 2. The Access Point routes the invoice to the buyer's Access Point using the Peppol network. 3. The tax authority (such as IRAS in Singapore) receives a copy of the transaction as the fifth corner. This approach combines e-invoicing and e-reporting into a single flow. However, unlike the Americas' clearance model, invoices do not require government pre-approval to be legally valid. The tax authority receives data for monitoring and compliance purposes without acting as a gatekeeper. Singapore also maintains a separate **GST F5** quarterly return requirement. Both the real-time Peppol reporting and the periodic aggregate return coexist — filing GST F5 remains mandatory even for businesses transmitting invoices via InvoiceNow. ## Invopop countries in this region Peppol network, phasing in 2026 Peppol five-corner model, PINT-SG format # Invoicing compliance in Australia Source: https://docs.invopop.com/compliance/australia Australia's e-invoicing and e-reporting obligations for consumer, business and government transactions Invopop support for Australia is coming soon (Peppol PINT A-NZ). For inquiries, contact us at [support@invopop.com](mailto:support@invopop.com). *** Ask and answer questions about Australia's regulation → # Invoicing compliance in Belgium Source: https://docs.invopop.com/compliance/belgium Belgium's mandatory e-invoicing requirements, Peppol implementation, and upcoming e-reporting obligations for B2B and B2G transactions View current and upcoming regulation → | | | | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Compliance | [Invoicing compliance in Belgium](/compliance/belgium)
[Compliance timeline](/timelines/belgium) | | Apps | [Peppol](/apps/peppol)
[OASIS UBL](/apps/oasis-ubl)
[UN/CEFACT CII](/apps/uncefact-cii) | | Guides | [Peppol guide](/guides/peppol)
[Chargebee guide](/guides/cb-belgium) | | FAQ | [Belgium FAQ](/faq/belgium) | | GOBL | [Belgium Tax Regime](https://docs.gobl.org/regimes/be)
[EN 16931-1:2017 Addon](https://docs.gobl.org/addons/eu-en16931-v2017) | | GitHub | [gobl.ubl](https://github.com/invopop/gobl.ubl)
[gobl.cii](https://github.com/invopop/gobl.cii) |
## Executive summary Since January 1, 2026, electronic invoicing is **mandatory for domestic B2B transactions** in Belgium (the B2G mandate was already in effect). **Key requirements:** * **Format**: Invoices must follow the European EN 16931 standard, with Peppol BIS in UBL format as the default and preferred format. * **Network**: Peppol is the default channel for transmitting electronic invoices. * **Technical capability**: All taxpayers must have the technical capability to issue and receive e-invoices via Peppol, even when using alternative platforms. * **PDF invoices**: Sending a PDF invoice by email or via a platform is no longer enough to be compliant. By 2028, Belgium plans to move to a Peppol-based five-corner model with near real-time e-reporting — see [E-reporting](#e-reporting) below. Invopop provides Peppol integration solutions through its apps and integrations with platforms like Stripe, Chargebee, and NetSuite to ensure compliance. ## Invoicing in Belgium Belgium is evolving toward full digitalization of invoicing, with B2G Peppol enforcements already in place, with upcoming requirements for B2B in 2026 through 2028 when e-reporting becomes mandatory through a Peppol-based five-corner model. Peppol is mandatory for companies from January 1st, 2026. Belgium’s e-reporting and fiscalization regulation enforcement requires businesses to use the Peppol network to issue invoices. | | | | -------------------- | ------------------------------------------------------------------------------------- | | **Models** | B2B, B2G | | **Format** | Peppol BIS | | **Infrastructure** | Peppol | | **Model** | Peppol | | **Scope & Deadline** | All B2B invoices from **Jan 1, 2026**; mandatory for suppliers to public authorities. | | **Agency** | [Service Public Fédéral Finances](https://finances.belgium.be) | | **Invopop Support** | [Peppol](/apps/peppol) | Connect the app to get you covered → ## E-reporting Belgium plans to adopt a Peppol-based five-corner model in 2028, integrating e-invoicing with near real-time e-reporting. This new system will replace the annual customer listing report and is designed to reduce the country’s VAT gap, currently estimated at around €4.8 billion per year. Businesses will be able to comply using either certified e-invoicing service providers or adapted ERP, invoicing, or accounting software, though participation through service providers will not be mandatory. ## Regulation Belgium is adopting the Peppol BIS 3.0 standard which is fully compliant with the EU [EN 16931 Standard](https://ec.europa.eu/digital-building-blocks/sites/spaces/DIGITAL/pages/467108950/EN+16931+compliance). Peppol BIS 3.0 documents that are created and sent must comply with all the rules that are defined for the CORE invoice or the CIUS specification that it is based on. A CIUS is a usage specification that can't break the CORE standard. In the case of Belgium, the CIUS is the Peppol BIS 3.0 standard which extends the CORE standard. Invopop helps you generate compliant Peppol BIS 3.0 (UBL) invoices from a single open source format called [GOBL](https://docs.gobl.org), performing all the necessary validations and conversions to support compliant EN 16931 (CORE) + Peppol BIS 3.0 (CIUS) invoices and other document types. The obligation does not apply to: * Foreign taxpayers not established in Belgium (even if VAT registered in Belgium) * Belgian entities exclusively engaged in exempt transactions (Article 44 VAT Code) – e.g., financial, medical, educational, social, sport, cultural sectors. * Bankrupt VAT-taxpayers (with still active VAT number) * A Belgian entity required to file regular periodic VAT returns and provide a Belgian VAT number. Thus if the customer doesn’t, the obligation may not apply. * A transaction must be subject to Belgian VAT (local taxable supply). The obligation does not apply for: * Transactions exempt under Article 44 VAT Code. * Transactions deemed to take place for VAT purposes in another Member State or outside the EU. Peppol requires Invopop to collect proof of ownership for regulatory compliance. As outlined in [Section 3.3 End user Identification of the Internal Regulations II document](https://openpeppol.atlassian.net/wiki/spaces/AF/pages/3963191334/Internal+Regulations), key details such as VAT number, address, contact information, and company name must be provided and validated during registration. The mandatory fields for Peppol registration are: * Company name (fiscal name) * VAT number (tax ID) * Complete company address * Contact information * Peppol participant ID * Proof of ownership document Proof of ownership can be: * An invoice with direct debit authorization * Any official document that proves you represent the company * Business registration certificate ## FAQ Compliance questions Belgium Since 1 January 2026 B2B transactions are mandatory where both parties are Belgian VAT-registered. B2G has been mandatory since 2024. B2C and cross-border B2B are out of scope for the current mandate. Any entity with a Belgian KBO/BCE enterprise number (and a VAT number where applicable). From 1 January 2026, Belgian VAT-registered recipients must be reachable via Peppol. Received invoices must be archived in their original structured format for 7 years. Peppol Mandatory dates vary by country. Belgium requires structured B2B e-invoicing — Peppol BIS by default — from January 2026. Germany is phasing in B2B e-invoicing between 2025 and 2028. France's Factur-X via Peppol applies once the PA reform takes effect. Outside mandates, Peppol delivery is voluntary but increasingly expected for B2G and cross-border trade. Yes. Every document exchanged on Peppol BIS uses a UBL or CII syntax that conforms to the EN16931 European e-invoicing standard, plus the relevant Peppol BIS specification. Invopop generates compliant XML automatically when you use the Peppol app. Peppol is a federated network — anyone could otherwise register a Participant ID for a company they don't represent. Proof of ownership ties the Participant ID to a verifiable contact at the company, which is what allows the registration to be published on the SML. Requirements vary by Authority. In Belgium, for example, the supplier must provide a recent extract from the Banque-Carrefour des Entreprises (KBO/BCE) plus a signed mandate. Invopop walks the registering party through the local requirements during the registration wizard. Yes — a Peppol BIS document delivered through a certified Access Point is treated as the legal e-invoice in any country that recognises Peppol. The signed UBL or CII XML is the authoritative record; archive it alongside any human-readable rendering you generate. Retention is set by each country's tax authority — typically 7 to 10 years in the EU. Invopop preserves the original XML and any generated PDF in the silo entry so you can satisfy local archival requirements wherever you operate. More available in our [Belgium FAQ](/faq/belgium) section *** Ask and answer questions about Belgium's regulation → # Invoicing compliance in Brazil Source: https://docs.invopop.com/compliance/brazil Brazil's mandatory e-invoicing requirements, Notas Fiscais implementation, and e-reporting obligations for B2B and B2G transactions View current and upcoming regulation → | | | | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Compliance | [Invoicing compliance in Brazil](/compliance/brazil)
[Compliance timeline](/timelines/brazil) | | Apps | [Documentos Fiscais Eletrônicos Brazil](/apps/documentos-fiscais-electronicos-brazil) | | Guides | [Supplier registration](/guides/br-dfe-supplier)
[Issuing invoices](/guides/br-dfe) | | FAQ | [Brazil FAQ](/faq/brazil) | | GOBL | [Brazil Tax Regime](https://docs.gobl.org/regimes/br)
[Brazil NF-e Addon](https://docs.gobl.org/addons/br-nfe-v4)
[Brazil NFS-e Addon](https://docs.gobl.org/addons/br-nfse-v1) |
## Executive summary Brazil operates a sophisticated, mandatory electronic invoicing system that covers different document types through **SEFAZ (Secretaria da Fazenda)**, the state tax authority infrastructure. The system has been mandatory since 2008 and uses a **clearance model** (also known as continuous transaction control or CTC), where each invoice must be electronically submitted to tax authorities and formally authorized before it becomes legally valid. This real-time validation ensures that businesses cannot dispatch goods, book revenue, or send invoices to customers until the government has approved the transaction. The Brazilian e-invoicing system encompasses multiple document types for different transaction scenarios. **NF-e (Nota Fiscal Eletrônica)** is used for B2B and B2G sales of goods and products, requiring authorization before shipping. **NFC-e (Nota Fiscal de Consumidor Eletrônica)** covers B2C retail transactions for face-to-face sales or home delivery. **NFS-e (Nota Fiscal de Serviços Eletrônica)** handles B2B and B2G service transactions, with tax assessed by municipalities. **NFCom** applies to telecommunications and communication services, mandatory since November 2025. Additionally, **CT-e (Conhecimento de Transporte Eletrônico)** and **MDF-e (Manifesto Eletrônico de Documentos Fiscais)** cover transportation of goods and grouping of multiple fiscal documents, respectively. Brazil operates a comprehensive e-reporting system through **SPED (Sistema Público de Escrituração Digital)**, which collects financial, accounting, tax, and labor information from Brazilian companies. Invopop covers Brazilian invoicing through the **Documentos Fiscais Eletrônicos Brazil** app, supporting NF-e, NFS-e, and NFC-e documents. The platform also offers integrations with Stripe and Chargebee, enabling businesses to issue compliant invoices directly from their merchant or ERP platforms while automatically handling the complex SEFAZ authorization process. ## Invoicing in Brazil The Nota Fiscal de Consumidor Eletrônica (NFC-e) is used for face-to-face retail sales or for home delivery to the final consumer (individual or legal entity). | | | | -------------------- | ------------------------------------------------------------------------------------- | | **Models** | B2C | | **Format** | Local XML | | **Infrastructure** | [SEFAZ](https://www.nfe.fazenda.gov.br/portal/principal.aspx) | | **Model** | Clearance continuous transaction control (CTC) | | **Scope & Deadline** | Mandatory since 2008 | | **Agency** | [RFB](https://www.gov.br/receitafederal/pt-br) | | **Invopop Support** | [Documentos Fiscais Eletrônicos Brazil](/apps/documentos-fiscais-electronicos-brazil) | Get covered → The Nota Fiscal Eletrônica (NF-e) is used for the sale of goods or products which are reported to the tax authority before shipping. The administration will issue an authorization code that must be printed on the PDF of each invoice. | | | | -------------------- | ------------------------------------------------------------------------------------- | | **Models** | B2B, B2G | | **Format** | Local XML | | **Infrastructure** | [SEFAZ](https://www.nfe.fazenda.gov.br/portal/principal.aspx) | | **Model** | Clearance continuous transaction control (CTC) | | **Scope & Deadline** | Mandatory since 2008 | | **Agency** | [RFB](https://www.gov.br/receitafederal/pt-br) | | **Invopop Support** | [Documentos Fiscais Eletrônicos Brazil](/apps/documentos-fiscais-electronicos-brazil) | Get covered → Since January 2026 the NFS-e tax format follows a national standard, replacing municipal formats. The Nota Fiscal de Serviços Eletrônica (NFS-e) is used for service transactions. Tax is assessed by municipalities which then return a code which calculates the tax. | | | | -------------------- | ------------------------------------------------------------------------------------- | | **Models** | B2B, B2G | | **Format** | Local XML | | **Infrastructure** | [SEFAZ](https://www.nfe.fazenda.gov.br/portal/principal.aspx) | | **Model** | Clearance continuous transaction control (CTC) | | **Scope & Deadline** | Mandatory since 2008 | | **Agency** | [RFB](https://www.gov.br/receitafederal/pt-br) | | **Invopop Support** | [Documentos Fiscais Eletrônicos Brazil](/apps/documentos-fiscais-electronicos-brazil) | Get covered → The Nota Fiscal de Serviços de Comunicação Eletrônica (NFCom) is used by companies in the telecommunications (mobile, fixed, broadband) and communication (broadcasting, newspapers, etc.) industries. | | | | -------------------- | ------------------------------------------------------------- | | **Models** | B2C, B2B | | **Format** | Local XML | | **Infrastructure** | [SEFAZ](https://www.nfe.fazenda.gov.br/portal/principal.aspx) | | **Model** | Clearance continuous transaction control (CTC) | | **Scope & Deadline** | Mandatory since November 2025 | | **Agency** | [RFB](https://www.gov.br/receitafederal/pt-br) | | **Invopop Support** | [Request support](https://www.invopop.com/contact) | The Conhecimento de Transporte Eletrônico (CT-e) is used for the transportation of goods. MDF-e (Manifesto Eletrônico de Documentos Fiscais) groups multiple fiscal documents (like NF-e or CT-e) when a single vehicle transports goods covered by different invoices or transport documents. | | | | -------------------- | ------------------------------------------------------------- | | **Models** | B2B, B2G | | **Format** | Local XML | | **Infrastructure** | [SEFAZ](https://www.nfe.fazenda.gov.br/portal/principal.aspx) | | **Model** | Clearance continuous transaction control (CTC) | | **Scope & Deadline** | CT-e Mandatory since 2010, MDF-e since 2014 | | **Agency** | [RFB](https://www.gov.br/receitafederal/pt-br) | | **Invopop Support** | [Request support](https://www.invopop.com/contact) | ## E-reporting Brazil has a comprehensive e-reporting system through its SPED (Sistema Público de Escrituração Digital - Public System of Digital Bookkeeping) framework. The SPED system is a reporting system that collects all financial, accounting, tax and labor information from Brazilian companies, composed of 12 modules, with 7 ancillary obligations and 5 fiscal documents (listed in the e-invoicing section). | | | | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **Format** | Structured plaintext files | | **Scope & deadline** | HR and payroll (eSocial), yearly bookkeeping (ECD), digital tax return (ECF), monthly reporting of tax documents to federal authorities (EFD), to state tax authorities (EFD-ICMS/IPI) and social security contributions (EFD-ReInf). For banks e-Financeira is a compliance obligation as well. | | **Invopop support** | No | ## Regulation Electronic invoices in Brazil must be archived for a minimum of five years. This applies to all types of e-invoices, which must be stored in the required XML format. A clearance model (sometimes called real-time validation or pre-clearance) is a regulatory architecture in which each invoice must be electronically submitted to the tax authority and formally approved before it becomes legally valid. The government acts as an intermediary between the supplier and the buyer and the invoice will only be valid with state authorization. Only after authorization can you dispatch goods, book revenue or send an invoice to the customer. ## FAQ Compliance questions Brazil Yes — invoicing is mandatory for all transactions in Brazil, including B2C (NFC-e for retail goods, NFS-e for services). Any entity with a CNPJ (legal entity) or CPF (individual) registered in Brazil. State and municipal registrations (Inscrição Estadual / Municipal) are also required depending on whether the supplier issues NF-e (state) or NFS-e (municipal) documents. NF-e NF-e (model 55) for goods has been mandatory since 2008 — phased in by sector and turnover. NFC-e (model 65, retail B2C) replaced the paper Cupom Fiscal in most states between 2014 and 2020. Both are now required for any commercial circulation of goods. The supplier needs an active state Inscrição Estadual, a CNAE that authorizes goods circulation, and an A1 certificate matching the issuing CNPJ. Some states (SP, RJ, MG) require additional credenciamento before NF-e issuance. NFS-e ISS (Imposto Sobre Serviços) is not treated as a standard transactional tax calculated on top of a net amount. Instead, it is an **informative tax embedded in the final price**—the invoice only reports what portion of the total corresponds to ISS. In GOBL, ISS is flagged as an "informative" tax category. This means: * ISS must be added to the GOBL invoice like any other tax, with the proper percentage. * The tax amount is not added to the price; it represents the portion of the total that corresponds to ISS. * The NFS-e document displays ISS as informational data, reflecting what was already embedded in the final price. * **Do not use `prices_include` with ISS**—since ISS is informative, it should not be treated as a price-inclusive tax. It is not necessary, any fields pertaining to the previous municipal tax implementation will be ignored and the invoice will already have all the data to be compliant. However, it is always recommended to remove ignored fields to avoid confusion and keep your documents clean. NFS-e is municipal, so the supplier needs an Inscrição Municipal in every município where they invoice services. Special tax regimes (Simples Nacional, MEI, ISS estimado) impose additional fields and rates. More available in our [Brazil FAQ](/faq/brazil) section *** Ask and answer questions about Brazil's regulation → # Invoicing compliance in Chile Source: https://docs.invopop.com/compliance/chile Chile's e-invoicing and e-reporting obligations for consumer, business and government transactions Invopop support for Chile is expected to be ready in the third quarter of 2026 (SII). For inquiries, contact us at [support@invopop.com](mailto:support@invopop.com). *** Ask and answer questions about Chile's regulation → # Invoicing compliance in Colombia Source: https://docs.invopop.com/compliance/colombia Colombia's mandatory e-invoicing requirements, FEV implementation, and e-reporting obligations for B2B and B2G transactions View current and upcoming regulation → | | | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Compliance | [Invoicing compliance in Colombia](/compliance/colombia)
[Compliance timeline](/timelines/colombia) | | Apps | [DIAN Colombia](/apps/dian-colombia) | | Guides | [Supplier registration](/guides/co-dian-supplier)
[Issuing invoices](/guides/co-dian) | | FAQ | [Colombia FAQ](/faq/colombia) | | GOBL | [Colombia Tax Regime](https://docs.gobl.org/regimes/co)
[Colombia DIAN Addon](https://docs.gobl.org/addons/co-dian-v2) |
## Executive summary Colombia operates a mandatory e-invoicing system through **DIAN (Dirección de Impuestos y Aduanas Nacionales)**, the national tax and customs authority. The system uses a **clearance model** (also known as continuous transaction control or CTC), where each invoice must be submitted to DIAN, digitally signed, and validated in real time before it becomes legally valid. The Colombian e-invoicing system centers on **FEV (Factura Electrónica de Venta)**, the official electronic invoice format used for B2B and B2G transactions. FEV has been mandatory for all B2B invoices since 2020 and uses the **OASIS UBL format** (UBL 2.1 DIAN schema). Since 2024, **Documento Equivalente Electrónico** has been required for B2C transactions, bringing retail and point-of-sale transactions under the electronic invoicing system as well. E-reporting in Colombia is fully integrated into the FEV system — see [E-reporting](#e-reporting) below. Invopop provides coverage for Colombian invoicing through the **DIAN Colombia** app, supporting FEV documents for B2B and B2G transactions. The platform also offers integrations with Stripe and Chargebee, enabling businesses to issue compliant invoices directly from their merchant or ERP platforms while automatically handling the complex DIAN authorization process. ## Invoicing in Colombia Colombia's official electronic invoice, FEV, is a fiscal and legal document that records the sale of goods or services in a digital format, with tax validity equivalent to a paper invoice. | | | | -------------------- | ---------------------------------------------- | | **Models** | B2B, B2G | | **Format** | OASIS UBL (UBL 2.1 DIAN schema) | | **Infrastructure** | [DIAN](https://www.dian.gov.co) | | **Model** | Clearance continuous transaction control (CTC) | | **Scope & Deadline** | Since 2020, all B2B invoices are required | | **Agency** | [DIAN](https://www.dian.gov.co) | | **Invopop Support** | [DIAN Colombia App](/apps/dian-colombia) | Connect the app to get you covered → Historically, retailers issued paper POS receipts instead of full electronic invoices. Since 2024 DIAN requires these to be electronic as well — effectively bringing B2C transactions under the electronic invoicing system. | | | | -------------------- | -------------------------------------------------------- | | **Models** | B2C | | **Format** | OASIS UBL (UBL 2.1 DIAN schema) | | **Infrastructure** | [DIAN](https://www.dian.gov.co) | | **Model** | Clearance continuous transaction control (CTC) | | **Scope & Deadline** | Since 2024 B2C invoices are required | | **Agency** | [DIAN](https://www.dian.gov.co) | | **Invopop Support** | No, but you can issue equivalent FEV simplified invoices | ## E-reporting E-reporting is fully integrated into the Factura Electrónica de Venta (FEV) system rather than being a separate process. Under the clearance model, every electronic invoice is generated, digitally signed, transmitted, and validated by DIAN in real time, and only upon validation is it legally issued and simultaneously reported to the tax authority. This means there are no separate periodic submissions, **issuing the FEV automatically fulfills reporting obligations**. ## Regulation 1. VAT (IVA: Impuesto sobre el Valor Añadido) * Standard: 19% * Reduced: 5% 2. IC (Impuesto al Consumo) * From 4% to 16% depending on the product or service 3. ICA (Impuesto de Industria y Comercio) 4. INC (Impuesto Nacional al Consumo) 5. ReteIVA (Retención en la fuente por el Impuesto al Valor Agregado) 6. ReteICA (Retención en la fuente por el Impuesto de Industria y Comercio) 7. Retefuente (Retención en la fuente por el Impuesto de la Renta) GOBL supports these tax types in its [Colombia tax regime](https://docs.gobl.org/regimes/co#tax-categories). Invoices must be archived for a minimum of **five years** in Colombia, starting from January 1 of the year following the document's issuance or receipt. This requirement applies to **both the issuer and the receiver**, and it is crucial to store the original electronic invoice (XML format), digital signature, and validation response securely. Colombia’s unique RADIAN system combines e-invoicing with the legal and financial framework of negotiable instruments, enabling immediate use of invoices for liquidity and credit operations. Upon buyer acceptance, the invoice can be registered in RADIAN, giving it the status of a “título valor electrónico”. This allows invoices to be factored (sold to a financial institution before due date), used as collateral for loans, or legally enforced for payment in a way similar to traditional paper invoices or promissory notes. ### Compliance questions All businesses selling goods or services in Colombia. The FEV (Factura Electrónica de Venta) has been mandatory for B2B and B2G invoices since 2020, and since 2024 B2C transactions must be documented with the Documento Equivalente Electrónico, bringing retail and point-of-sale receipts under the electronic system as well. OASIS UBL 2.1 following the DIAN schema. Colombia operates a clearance model (continuous transaction control): each invoice is digitally signed, submitted to the DIAN, and validated in real time. On validation, the invoice receives a CUFE (Código Único de Factura Electrónica) that makes it legally valid. No. E-reporting is fully integrated into the FEV clearance flow — an invoice is reported to the tax authority at the moment the DIAN validates it. There are no separate periodic invoice submissions. A minimum of five years, counted from January 1 of the year following issuance or receipt. The obligation applies to both the issuer and the receiver, and covers the original XML, its digital signature, and the DIAN validation response. RADIAN is the DIAN registry that turns validated invoices into negotiable instruments. Once the buyer accepts an invoice, it can be registered in RADIAN as a "título valor electrónico", allowing it to be factored, used as loan collateral, or legally enforced for payment. Not currently. For B2C transactions you can issue equivalent simplified FEV invoices instead, which are fully supported through the [DIAN Colombia app](/apps/dian-colombia). More available in our [Colombia FAQ](/faq/colombia) section *** Ask and answer questions about Colombia's regulation → # Invoicing compliance in Croatia Source: https://docs.invopop.com/compliance/croatia Croatia's Fiscalization 2.0 (eRačun): structured e-invoicing over a 4-corner network, with separate real-time reporting of every invoice to the tax authority View current and upcoming regulation → | | | | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Compliance | [Invoicing compliance in Croatia](/compliance/croatia)
[Compliance timeline](/timelines/croatia) | | Apps | [PEPPOL](/apps/peppol) (B2G) | | FAQ | [Croatia FAQ](/faq/croatia) | | GOBL | [EU EN 16931 Addon](https://docs.gobl.org/addons/eu-en16931-v2017) | | GitHub | [gobl.ubl](https://github.com/invopop/gobl.ubl) |
Invopop support for Croatia (Fiscalization 2.0 / eRačun) is work in progress. The information below is provided for reference. For availability and onboarding, contact us at [support@invopop.com](mailto:support@invopop.com). ## Executive summary Croatia's **Fiscalization 2.0**, also called **eRačun**, became mandatory for VAT-registered businesses on 1 January 2026. A single law introduced two separate obligations that work independently: 1. **Exchange** a structured e-invoice with your trading partner over a 4-corner network (the same style of network as Peppol, but on Croatia's own directory). 2. **Report** each invoice, and later its payment or rejection, to the tax authority's Fiscalization System (**CIS**) in real time. Invoices follow the European **EN 16931** standard with a Croatian profile (**HR CIUS**). Because of that profile, a plain Peppol invoice is not enough for a domestic Croatian transaction. Consumer sales stay on the older receipt system, which prints a code and a QR on the receipt. [Exchange](#sending-and-receiving-e-invoices-b2b-b2g) and [reporting](#reporting-to-the-tax-authority) apply to VAT-registered Croatian businesses from January 2026. Smaller businesses and public bodies that are not VAT-registered must be able to issue from January 2027. [Consumer sales](#consumer-sales-b2c) stay on the older receipt system. The standard VAT rate is **25%**, with reduced rates of **13%** and **5%**. ## Invoicing in Croatia Croatia runs two independent systems. B2B and B2G invoices are fiscalized to CIS and delivered either over Croatia's own 4-corner network or, for public bodies, over Peppol. Consumer sales never use either network: each one is signed and reported straight to CIS as a receipt. The two systems share the same tax authority backend, but nothing else. **Sending and receiving e-invoices (B2B, B2G)** Every invoice is reported to the tax authority's Fiscalization System (CIS). Delivery to the recipient runs over one of two networks: public bodies have been reachable over Peppol since 2019, predating Fiscalization 2.0, while businesses are reached over Croatia's own 4-corner network. ```mermaid actions={false} theme={"system"} %%{init: {'theme':'base','themeVariables':{'actorBkg':'#e8f5ee','actorBorder':'#169958','actorTextColor':'#103830','actorLineColor':'#bcdccb','signalColor':'#0f7a45','signalTextColor':'#103830','noteBkgColor':'#ffffff','noteBorderColor':'#169958','noteTextColor':'#103830','labelBoxBkgColor':'#169958','labelBoxBorderColor':'#0f7a45','labelTextColor':'#ffffff','sequenceNumberColor':'#ffffff'}}}%% sequenceDiagram autonumber participant IS as Issuer participant SP as Issuer's service provider participant RP as Recipient's provider participant TA as Tax authority (CIS) IS->>SP: Invoice data alt B2G SP->>RP: Send over Peppol else B2B, on the HR network SP->>RP: Send over the 4-corner network (HR profile) end RP-->>SP: Delivery receipt SP->>TA: Report as issued RP->>TA: Report as received ``` The issuer's system sends the invoice details to its service provider, which builds it in Croatia's EN 16931 profile (HR CIUS). B2G only For a public body, the service provider sends the invoice over Peppol. B2B only For a business, the service provider sends the invoice over Croatia's own 4-corner network in the HR profile. The recipient's provider confirms delivery back to the sender's provider. Separately from the exchange, the issuer's service provider reports the invoice to the tax authority as issued. The recipient's provider reports the same invoice to the tax authority as received, within 5 working days. **Consumer sales (B2C)** There is no invoice exchange for a consumer sale. The point of sale system signs the receipt locally and reports it straight to the tax authority in real time. ```mermaid actions={false} theme={"system"} %%{init: {'theme':'base','themeVariables':{'actorBkg':'#e8f5ee','actorBorder':'#169958','actorTextColor':'#103830','actorLineColor':'#bcdccb','signalColor':'#0f7a45','signalTextColor':'#103830','noteBkgColor':'#ffffff','noteBorderColor':'#169958','noteTextColor':'#103830','labelBoxBkgColor':'#169958','labelBoxBorderColor':'#0f7a45','labelTextColor':'#ffffff','sequenceNumberColor':'#ffffff'}}}%% sequenceDiagram autonumber participant POS as Point of sale participant SP as Service provider participant TA as Tax authority (CIS) POS->>SP: Sale data SP->>SP: Sign locally SP->>TA: Send receipt request TA-->>SP: JIR (or error) SP-->>POS: Receipt with JIR, ZKI and QR ``` The point of sale sends the sale data to the service provider. The service provider computes the ZKI by signing the receipt locally with the business's certificate. The service provider sends the signed receipt request to the tax authority's Fiscalization System (CIS). CIS returns the JIR, a unique receipt identifier, or an error. The point of sale prints the receipt with the JIR, the ZKI and a QR code. Domestic invoices are exchanged between certified service providers over a 4-corner network, using Croatia's own directory to find the recipient. The invoice must use the Croatian EN 16931 profile and include a product classification code on each line. Public bodies have been reachable via Peppol since 2019, but the Croatian profile and the reporting step still apply. | | | | ------------------- | -------------------------------------------------------------------------------------------- | | **Scope** | B2B, B2G (domestic) | | **Format** | UBL 2.1 or CII, using the Croatian EN 16931 profile (HR CIUS) | | **Compliance** | e-invoicing | | **Model** | Decentralized 4-corner network on Croatia's own directory | | **Effective date** | Mandatory since **January 2026** for VAT-registered businesses; others from **January 2027** | | **Agency** | Porezna uprava (tax authority) | | **Invopop support** | Work in progress | Separately from sending the invoice, every issued and received invoice is reported to the tax authority's Fiscalization System (CIS), signed with a qualified certificate. Unlike a consumer receipt, there is no code to print. The report simply succeeds or returns an error. A recipient reports a received invoice within 5 working days. | | | | ------------------- | -------------------------------------------------------------- | | **Scope** | B2B, B2G (reported by both the sender and the recipient) | | **Channel** | Direct report to the tax authority, separate from the exchange | | **Deadline** | Sender at issuance; recipient within 5 working days of receipt | | **Effective date** | Mandatory since **January 2026** | | **Agency** | Porezna uprava (tax authority) | | **Invopop support** | Work in progress | Consumer sales stay on the older receipt system, a separate connection to the same tax-authority backend. The receipt is signed, sent to the authority in real time, and printed with an identifier, a security code and a QR code. Since the new law, this covers all payment methods, not just cash. | | | | ------------------- | ---------------------------------------------------------------------- | | **Scope** | B2C | | **Format** | Receipt fiscalization (prints an identifier, a security code and a QR) | | **Channel** | Real-time report to the tax authority | | **Effective date** | In force; now covers all payment methods | | **Agency** | Porezna uprava (tax authority) | | **Invopop support** | Work in progress | ## E-reporting Beyond reporting the invoice itself, businesses report what happens next: the payment of an outgoing invoice and the rejection of an incoming one are both reported by the 20th of the following month. Rejecting an invoice means the recipient will not claim the VAT back. These reports are what set an invoice's status (paid, rejected) in the tax authority's portal. ## Regulation Croatian e-invoices follow the European **EN 16931** standard through a national profile (**HR CIUS**), in UBL 2.1 or CII format. A few Croatian additions apply: * A product classification code (KPD) is required on each invoice line (but not on credit notes or prepayments). * Standard European codes are used for units of measure, currencies, document types and VAT categories. The legal invoice is the structured XML file. No particular PDF layout is required. A readable copy is optional. Croatia adopted the euro in 2023 and applies the standard EU VAT framework. | Rate | Percentage | Application | | -------- | ---------- | --------------------------- | | Standard | **25%** | Most goods and services | | Reduced | **13%** | Selected goods and services | | Reduced | **5%** | Selected goods and services | Businesses are identified by their tax number (OIB). Cash payments on a business invoice are capped at EUR 700. Sending and reporting are signed with a qualified certificate that carries the business's tax number, issued by any EU trust provider (not by the tax authority). A company that provides invoicing or reporting services to others must be certified as an information intermediary by the tax authority. There is no requirement to be based in Croatia, and several foreign providers are already certified. E-invoices must be kept for 6 years in their original structured form. Fines reach up to EUR 66,360 for companies. Software providers are responsible for their software meeting the rules, and there is no grace period: the system has been enforceable since it went live in January 2026. * [Porezna uprava](https://porezna.gov.hr/fiskalizacija): Croatian tax authority, fiscalization documentation * [List of information brokers](https://porezna-uprava.gov.hr/hr/popis-informacijskih-posrednika/8019): certified service providers * [European Commission, eInvoicing in Croatia](https://ec.europa.eu/digital-building-blocks/sites/spaces/DIGITAL/pages/467108879/eInvoicing+in+Croatia) ## FAQ Compliance questions Yes. Under Fiscalization 2.0 (eRačun), VAT-registered Croatian businesses have had to exchange structured e-invoices and report each one to the tax authority since January 2026. Businesses that are not VAT-registered, and public bodies, must be able to issue from January 2027. Consumer sales stay on the older receipt system. Not for a domestic Croatian transaction. Croatia uses the European EN 16931 standard with its own national profile (HR CIUS), and the invoice must carry that profile. The transport network is the same style as Peppol, but the invoice content has to follow the Croatian profile. Two things that work independently. First, exchange a structured e-invoice with your trading partner over a 4-corner network. Second, report each invoice, and later its payment or rejection, to the tax authority in real time. Consumer sales stay on the older receipt system, a separate connection to the same tax-authority backend. The receipt is signed, reported in real time, and printed with an identifier, a security code and a QR code. Since the new law, this covers all payment methods, not just cash. E-invoices must be kept for 6 years in their original structured form. A standard rate of 25%, with reduced rates of 13% and 5%. Croatia uses the euro. More available in our [Croatia FAQ](/faq/croatia) section *** Ask and answer questions about Croatia's regulation → # Invoicing compliance in Denmark Source: https://docs.invopop.com/compliance/denmark Denmark's mandatory e-invoicing requirements, NemHandel, OIOUBL, Peppol BIS, and digital bookkeeping obligations View current and upcoming regulation → | | | | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Compliance | [Invoicing compliance in Denmark](/compliance/denmark)
[Compliance timeline](/timelines/denmark) | | Apps | [Peppol](/apps/peppol) | | Guides | [Peppol guide](/guides/peppol)
[Chargebee guide](/guides/cb-denmark) | | FAQ | [Denmark FAQ](/faq/denmark) | | GOBL | [EU EN 16931 Addon](https://docs.gobl.org/addons/eu-en16931-v2017) | | GitHub | [gobl.ubl](https://github.com/invopop/gobl.ubl) |
## Executive summary Denmark was the first country in Europe to mandate B2G e-invoicing, effective February 2005, and now is adopting broader B2B digitalization. The country operates a mature e-invoicing infrastructure through **NemHandel** and **Peppol**, using **OIOUBL 2.1** and **Peppol BIS Billing 3.0** as accepted formats. The January 2026 [cancellation of OIOUBL 3.0](https://www.vatupdate.com/2026/02/09/denmark-cancels-oioubl-3-0-and-unveils-new-unified-e-invoicing-strategy/) signals a strategic pivot toward Peppol as the single unified standard. [NemHandel / Peppol](#nemhandel-peppol-b2g) is mandatory for all invoices to public authorities. [Digital Bookkeeping Act](#digital-bookkeeping-act-b2b) requires all businesses to use certified digital bookkeeping systems capable of sending and receiving structured e-invoices in Peppol BIS 3.0 and OIOUBL formats, with rollout completing in 2026. There is currently **no B2B e-invoicing transmission mandate** in Denmark — the Bookkeeping Act creates a capability requirement, not a usage mandate. A domestic e-reporting obligation is expected by approximately 2028. Denmark has a single flat **25% VAT rate (moms)** with no reduced rates, and uses a post-audit compliance model with no real-time reporting to tax authorities. ## Invoicing in Denmark Denmark's e-invoicing framework is built on NemHandel and Peppol, paired with a Bookkeeping Act that requires all businesses to be e-invoicing-capable. The framework applies uniformly across Denmark (excluding Greenland and the Faroe Islands, which have their own independent tax systems). * [NemHandel / Peppol](#nemhandel-peppol-b2g) mandatory since February 2005 for all invoices to Danish public authorities. * [Digital Bookkeeping Act](#digital-bookkeeping-act-b2b) requires certified digital bookkeeping systems capable of e-invoicing, phased in through 2026 for all businesses with turnover above DKK 300,000. Denmark has no B2B e-invoicing transmission mandate as of 2026. The Bookkeeping Act requires e-invoicing-capable systems but does not mandate that every B2B invoice is sent electronically. A domestic e-reporting obligation is expected by approximately 2028. Suppliers invoicing Danish public authorities must submit electronic invoices via NemHandel or the Peppol network — paper invoices are rejected. Public entities are identified by an **EAN/GLN number** in the NemHandelsregisteret (NHR), which is integrated with the Peppol SML. Accepted formats are **OIOUBL 2.1** and **Peppol BIS Billing 3.0**. NemHandel is managed by the Danish Business Authority (Erhvervsstyrelsen), Denmark's Peppol Authority. | | | | ------------------- | ------------------------------------------------------------------------------------------------------- | | **Scope** | B2G | | **Format** | OIOUBL 2.1, Peppol BIS Billing 3.0 | | **Compliance** | e-invoicing | | **Infrastructure** | NemHandel / Peppol (four-corner model) | | **Model** | Decentralized (access point network) | | **Effective date** | Mandatory since **February 2005** | | **Agency** | [Erhvervsstyrelsen (ERST)](https://erhvervsstyrelsen.dk) / [Digitaliseringsstyrelsen](https://digst.dk) | | **Invopop support** | [Peppol App](/apps/peppol) | Connect the app to send invoices to Danish public authorities → The Digital Bookkeeping Act is being phased in through 2026. All businesses with annual turnover exceeding DKK 300,000 must use a compliant digital bookkeeping system from January 1, 2026. Denmark's 2022 Bookkeeping Act requires businesses to use certified digital bookkeeping systems capable of sending and receiving structured e-invoices in Peppol BIS 3.0 and OIOUBL formats. This is a **capability mandate**: systems must support e-invoicing, but there is no requirement that every invoice is transmitted electronically. Systems must also support SAF-T exports on demand and perform automated weekly backups to a secure, EU/EEA-hosted server. | | | | ------------------- | ------------------------------------------------------------------ | | **Scope** | B2B, B2G (capability requirement, not transmission mandate) | | **Format** | Peppol BIS Billing 3.0, OIOUBL 2.1 | | **Compliance** | Digital bookkeeping and e-invoicing readiness | | **Infrastructure** | Peppol / NemHandel | | **Model** | Post-audit with SAF-T on demand | | **Effective date** | Phased rollout, completing **January 1, 2026** for most businesses | | **Agency** | [Erhvervsstyrelsen (ERST)](https://erhvervsstyrelsen.dk) | | **Invopop support** | [Peppol App](/apps/peppol), upcoming SAF-T support. | Connect the app to get you covered → ## E-reporting There is no real-time reporting to tax authorities — SAF-T exports are provided on demand during SKAT inspections. Formal system certification is not required, though an ISAE 3402 audit declaration based on a SKAT template is recommended for documentation. Non-compliance triggers fines starting at DKK 10,000, escalating for repeated violations. ## Regulation Danish invoice requirements implement EU VAT Directive Article 226 through the Momsloven (Danish VAT Act) and Momsbekendtgørelsen (Ministerial Order on VAT). A full invoice is required for B2B sales of DKK 3,000 or more (incl. VAT) and B2C sales exceeding DKK 5,000. **Full Invoice** * **Supplier's full name and address**, and **CVR number** (8-digit business registration number; formatted as DK + 8 digits for EU VAT purposes). * **Buyer's full name and address**. For intra-EU B2B transactions, the buyer's VAT number must also be included. * **Sequential invoice number** — unique and part of an ongoing series. * **Invoice date** (date of issue). * **Delivery / supply date** if different from the invoice date. * **Clear description** of the goods delivered or services provided, including quantity and unit price excluding VAT. * **Any discounts** not already included in the unit price. * **Taxable base** — total price excluding VAT. * **VAT rate** applied (25%). * **VAT amount** in DKK or EUR. If the invoice is in another currency, the total Danish VAT must additionally be stated in DKK or EUR, along with the exchange rate used. * **Total amount including VAT**. * For **reverse charge** transactions: a reference to the applicable provision and the customer's VAT number. * For **VAT-exempt or zero-rated supplies**: a reference to the applicable VAT Act provision (e.g. "0% VAT — intra-Community supply, Momslovens §34"). **Simplified Invoice** Permitted for B2B sales below DKK 3,000 or B2C sales up to DKK 5,000: * Supplier's name, address, and CVR number. * Invoice date. * Description of goods or services. * Total amount including VAT and VAT rate, or the statement "moms inkluderet" (VAT included). Under the **Bogføringsloven** (Danish Bookkeeping Act), all accounting records — including invoices, receipts, and supporting documentation — must be retained for **5 years from the end of the financial year** to which they relate. Records must be stored in a structured, machine-readable format that cannot be altered, backdated, or deleted. The Act requires automated weekly backups to a secure server hosted within the EU/EEA by an independent third party. Note that certain sectors or EU-funded projects may require longer retention under specific grant terms or sectoral regulations. Denmark levies a single flat VAT rate with no reduced rates — one of the simplest VAT structures in the EU. 1. **Moms (Merværdiafgift) — Standard rate: 25%** * Applies to all taxable goods and services. There are no reduced rates. 2. **Zero-rated supplies (0%, with input VAT recovery)** under Momslovens §§34–36: * Exports of goods outside the EU * Intra-Community supplies of goods to VAT-registered buyers in other EU member states * International passenger transport * Certain seagoing vessels and aircraft * Newspapers and periodicals (below a certain threshold of advertising content) 3. **VAT-exempt supplies** (no VAT charged, no input VAT deduction) under Momslovens §13: * Healthcare and medical services * Education * Financial and insurance services * Domestic passenger transport (taxis, buses, scheduled domestic aviation) * Postal services (universal service obligation) * Residential letting * Cultural activities (theatre, concerts, museums) * Gambling and lottery Denmark does **not** apply VAT in Greenland or the Faroe Islands. Transactions between Denmark proper and these territories are treated as exports/imports. **OIOUBL** (Offentlig Information Online – Universal Business Language) is Denmark's national e-invoicing standard, based on **OASIS UBL 2.0**. The current version, **OIOUBL 2.1**, has been in mandatory use since May 2022 and constitutes Denmark's Core Invoice Usage Specification (CIUS) under EN 16931. It supports invoices, credit notes, reminders, and additional business documents with Danish-specific fields beyond the base Peppol BIS format. Both OIOUBL 2.1 and **Peppol BIS Billing 3.0** are accepted for B2G transactions. Updated Schematron validation rules (v1.17) become mandatory from **May 15, 2026**. **OIOUBL 3.0**, published as a release candidate in November 2024, was **formally cancelled on January 14, 2026** by Erhvervsstyrelsen. The decision followed feedback from service providers that maintaining two parallel standards was operationally unsustainable. Denmark is now converging on a single Peppol-aligned standard — likely based on Peppol PINT or a Danish National CIUS of EN 16931. Further details will be published by Erhvervsstyrelsen once the technical specification is finalized. Denmark introduced **electronic sales registration (ESR) requirements** effective **January 1, 2024**, targeting businesses with annual turnover between DKK 50,000 and DKK 10 million in specific sectors: cafés, pubs, nightclubs, restaurants, fast food establishments, ice cream parlors, grill bars, and grocery stores/kiosks. Approximately 12,500 businesses are affected. POS systems in scope must: * Record all transactions in an immutable electronic journal. * Store data in **SAF-T format**. * Digitally sign transactions using an **OCES certificate**. * Separate sales totals by payment method. There is **no real-time reporting** to tax authorities — SAF-T exports are provided on demand during SKAT inspections. Formal system certification is not required, though an ISAE 3402 audit declaration based on a SKAT template is recommended for documentation. Non-compliance triggers fines starting at **DKK 10,000**, escalating for repeated violations. Denmark's VAT law and e-invoicing regulations apply to **Denmark proper only**. Both Greenland and the Faroe Islands are autonomous territories within the Kingdom of Denmark with independent tax legislation. **Greenland** is not part of the EU (it withdrew from the EEC in 1985). It has **no VAT or sales tax**. Corporate income tax is 31.8%. Supplies from Denmark to Greenland are treated as exports (zero-rated for Danish VAT); supplies from Greenland to Denmark are imports subject to 25% moms. Greenland is not subject to the Danish Bookkeeping Act or NemHandel requirements. **The Faroe Islands** never joined the EU and operate their own VAT system called **MVG** (meirvirðisgjald), levied at 25% and administered by the Faroese tax authority **TAKS** (Skattistovan). Corporate tax is 18%. The Faroe Islands have no mandatory e-invoicing requirements and are not subject to Danish bookkeeping legislation. *** Ask and answer questions about Denmark's regulation → # E-invoicing in Europe Source: https://docs.invopop.com/compliance/europe Overview of e-invoicing compliance across Europe, where EN 16931 and Peppol provide a common foundation but countries vary widely in compliance models ## Executive summary Europe is the most diverse e-invoicing region in the world. While the EU provides a common legal and technical foundation through **[EN 16931](/compliance/glossary)** and **[EU Directive 2014/55/EU](https://eur-lex.europa.eu/eli/dir/2014/55/oj)**, each country has adopted a different compliance model — from Italy's full clearance system to Belgium and Norway's decentralized Peppol exchange, and France's unique five-corner platform architecture. The **[Peppol](/apps/peppol) network** is the most widely adopted infrastructure, used for B2G invoicing in most EU countries and increasingly mandated for B2B transactions. EN 16931, the European Norm defining the semantic data model for electronic invoices, provides the interoperability backbone. On top of these shared foundations, countries layer their own formats (FatturaPA in Italy, XRechnung in Germany, Factur-X in France) and reporting requirements (SII in Spain, SAF-T in Norway and Portugal, myDATA in Greece). The period from 2026 to 2028 represents the most significant wave of B2B e-invoicing mandates in European history. France, Germany, Belgium, Greece, Poland, and Norway all have major milestones in this window. Looking further ahead, the EU's **VAT in the Digital Age (ViDA)** initiative is expected to introduce harmonized digital reporting requirements across all member states by approximately 2030. ## Common standards and formats ### EN 16931 [EN 16931](/compliance/glossary) is the European Norm that defines the semantic data model for electronic invoices. It acts as the interoperability backbone across all EU member states, ensuring that invoices can be understood regardless of the specific format used. EU Directive 2014/55/EU mandates that all public authorities in the EU must accept e-invoices conforming to EN 16931. ### Peppol The [Peppol network](/apps/peppol) provides the decentralized infrastructure for exchanging electronic documents. Businesses connect through certified Access Points that handle routing and delivery. Peppol is used for B2G invoicing in most EU countries and is becoming the default network for B2B transactions in France, Belgium, and the Nordic countries. ### Country-specific formats While EN 16931 provides the semantic foundation, countries implement it through different syntaxes and extensions: Indicates upcoming GOBL support | Country | B2B | B2G | | ------------------------------------------------------------------ | ----------------------------------------------------------- | ----------------------------------------------------------- | | Austria | — | Peppol BIS 3.0
e-Rechnung | | Belgium | Peppol BIS 3.0 | Peppol BIS 3.0 | | Croatia | HR-FISK 2.0 | HR-FISK 2.0 | | Cyprus | — | Peppol BIS 3.0 | | Denmark | Peppol BIS 3.0 | Peppol BIS 3.0
OIOUBL | | Estonia | Peppol BIS 3.0 | Peppol BIS 3.0 | | Finland | Peppol BIS 3.0
Finvoice | Peppol BIS 3.0
Finvoice | | France | Peppol BIS 3.0
Factur-X
UN/CEFACT CII | Peppol BIS 3.0
Factur-X
UN/CEFACT CII | | Germany | XRechnung
ZUGFeRD | XRechnung
Peppol BIS 3.0 | | Greece | myDATA | myDATA
Peppol BIS 3.0 | | Ireland | — | Peppol BIS 3.0 | | Italy | FatturaPA | FatturaPA
Peppol BIS 3.0 | | Lithuania | — | Peppol BIS 3.0 | | Luxembourg | — | Peppol BIS 3.0 | | Netherlands | Peppol BIS 3.0 | Peppol BIS 3.0
SI-UBL 2.0 | | Norway | EHF Billing 3.0
Peppol BIS 3.0 | EHF Billing 3.0
Peppol BIS 3.0 | | Poland | KSeF FA(3) | KSeF FA(3)
Peppol BIS 3.0 | | Portugal | — | Peppol BIS 3.0 | | Sweden | Peppol BIS 3.0 | Peppol BIS 3.0 | ## Compliance models Europe has the widest diversity of compliance models of any region. The same transaction type (B2B) can follow entirely different regulatory architectures depending on the country. **Italy** operates a full [clearance model](/compliance/glossary) through the SDI (Sistema di Interscambio). Every invoice must be submitted to SDI, which validates it and routes it to the buyer. The invoice is only legally valid after SDI approval. This model has been mandatory for all businesses since 2019 and is the closest European equivalent to the Latin American approach. **France** is building a unique architecture where businesses connect through certified **Plateformes Agréées (PAs)**. Each PA looks up the buyer in the state Annuaire directory and routes the invoice to the buyer's PA over Peppol. In parallel, the PA submits the invoice data to a government data concentrator for VAT reporting. This creates a [five-corner model](/compliance/glossary) that integrates e-invoicing and e-reporting into a single flow. **Belgium**, **Norway**, **Denmark**, and **Finland** use the Peppol network as their primary e-invoicing infrastructure. Invoices flow directly between business Access Points without passing through a government clearance hub. Tax authorities receive data through separate reporting mechanisms or plan to add a fifth-corner reporting layer. **Germany** requires XRechnung for B2G (via Peppol) but is transitioning B2B to mandatory structured e-invoice acceptance (January 2025) followed by mandatory issuance (2027-2028). **Portugal** uses the ATCUD validation code system alongside SAF-T reporting. **Greece** combines Peppol for B2G with the myDATA real-time reporting platform. **Spain** layers VERI\*FACTU, TicketBAI, Facturae, and SII across different regions and company sizes. ## Key dates | Country | Milestone | | -------- | ------------------------------------------------------------------------ | | Belgium | B2B Peppol mandatory — January 1, 2026 | | France | B2B mandatory acceptance + large/medium issuance — September 2026 | | France | B2B mandatory issuance for all — September 2027 | | Germany | B2B mandatory e-invoice receipt — January 2025 (already effective) | | Germany | B2B mandatory issuance (turnover more than €800k) — January 2027 | | Germany | B2B mandatory issuance for all — January 2028 | | Greece | Mandatory for companies with revenue more than €1M — February 2026 | | Greece | Mandatory for all businesses — October 2026 | | Norway | B2B mandatory e-invoice sending proposed — January 2028 | | Poland | KSeF mandatory for large taxpayers — February 2026 | | Poland | KSeF mandatory for others — April 2026; micro-enterprises — January 2027 | | Portugal | B2B ATCUD/QR mandatory — January 1, 2026 | | Spain | VERI\*FACTU mandatory for businesses — January 1, 2027 | The 2026-2028 window is the critical period for European e-invoicing. Nearly every country is implementing or expanding B2B mandates during this time. ### VAT in the Digital Age (ViDA) Looking beyond individual country mandates, the EU's **ViDA** initiative aims to introduce harmonized Digital Reporting Requirements (DRRs) across all member states. Expected around 2030, ViDA will likely require real-time or near-real-time digital reporting based on EN 16931. Several countries — notably Germany — are explicitly designing their current systems with ViDA alignment in mind. ## Invopop countries in this region Peppol BIS 3.0, B2B mandate January 2026 Peppol / eRačun Peppol BIS 3.0, e-bookkeeping Peppol BIS 3.0 Peppol five-corner model, PA platforms XRechnung / ZUGFeRD, B2B phased 2025-2028 EN 16931, myDATA reporting Transitioning to Peppol SDI clearance model, FatturaPA Peppol BIS Billing 3.0, SAF-T KSeF, phased mandate 2026-2027 ATCUD/QR validation, SAF-T Transitioning to Peppol VERI\*FACTU, TicketBAI, Facturae, SII # Invoicing compliance in Finland Source: https://docs.invopop.com/compliance/finland Finland's mandatory B2G e-invoicing under Act 241/2019, the voluntary B2B right-to-request model, Peppol BIS Billing 3.0, Finvoice and TEAPPSXML formats, and VAT obligations View current and upcoming regulation → | | | | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Compliance | [Invoicing compliance in Finland](/compliance/finland)
[Compliance timeline](/timelines/finland) | | Apps | [Finland](/apps/finland)
[Peppol](/apps/peppol) | | Guides | [Supplier registration](/guides/fi-finvoice-supplier)
[Issuing invoices](/guides/fi-finvoice)
[Receiving invoices](/guides/fi-finvoice-receiving)
[Peppol guide](/guides/peppol) | | FAQ | [Finland FAQ](/faq/finland) | | GOBL | [Finland Tax Regime](https://docs.gobl.org/regimes/fi)
[EU EN 16931 Addon](https://docs.gobl.org/addons/eu-en16931-v2017) | | GitHub | [gobl.fi.finvoice](https://github.com/invopop/gobl.fi.finvoice)
[gobl.ubl](https://github.com/invopop/gobl.ubl) |
## Executive summary Finland introduced mandatory B2G e-invoicing early relative to most EU member states. Public administration bodies have been required to receive electronic invoices since 2019, and voluntary B2B adoption is already high, supported by a statutory **right to request** e-invoices rather than a blanket transmission mandate. [Peppol BIS Billing 3.0 (B2G)](#peppol-network-b2g) has been mandatory since April 2019 for central government and since April 2020 for all contracting authorities, under the Act on Electronic Invoicing to Public Procurers and Contracting Entities (241/2019), which implements EU Directive 2014/55/EU. Since April 2021, public bodies may only accept invoices compliant with the EN 16931 standard. [Voluntary B2B e-invoicing](#right-to-request-e-invoicing-b2b): businesses with an annual turnover above EUR 10,000 have a statutory right to request e-invoices from their suppliers, but there is no domestic transmission mandate. The EU's **VAT in the Digital Age (ViDA)** initiative is expected to introduce a harmonized B2B digital reporting requirement from around July 2030. There is **no B2C e-invoicing mandate** in Finland. Three EN 16931-compliant format families coexist: **Peppol BIS Billing 3.0** (UBL 2.1), the channel routed via the Finnish State Treasury as the national Peppol Authority; **Finvoice 3.0**, the dominant proprietary domestic format delivered over the Finnish bank network; and **TEAPPSXML 3.0**, a proprietary operator format used mainly between larger enterprises and public administration. Finland applies standard VAT (ALV) at **25.5%**, with reduced rates of **13.5%** and **10%**. There is no domestic real-time e-reporting obligation. Finland relies on a post-audit compliance model. ## Invoicing in Finland Finland's e-invoicing framework is administered by the Finnish Tax Administration (Verohallinto) and governed for e-invoicing purposes by the Act on Electronic Invoicing to Public Procurers and Contracting Entities (241/2019). Two networks run side by side: Peppol, the mandatory channel for B2G exchange, and the domestic operator network (Finvoice or TEAPPSXML), where most Finnish businesses receive their invoices. * [Peppol BIS Billing 3.0](#peppol-network-b2g) mandatory since April 2019 (central government) and April 2020 (all contracting authorities). * [Right to request e-invoicing](#right-to-request-e-invoicing-b2b) lets B2B buyers above the EUR 10,000 turnover threshold compel suppliers to issue e-invoices, without a blanket mandate. * [Finvoice and TEAPPSXML](#domestic-channels-finvoice-and-teappsxml) remain the dominant domestic formats for recipients outside the Peppol network. The diagram below shows how an outbound invoice reaches the buyer through the operator, on whichever network the buyer lives: ```mermaid actions={false} theme={"system"} %%{init: {'theme':'base','themeVariables':{'actorBkg':'#e8f5ee','actorBorder':'#169958','actorTextColor':'#103830','actorLineColor':'#bcdccb','signalColor':'#0f7a45','signalTextColor':'#103830','noteBkgColor':'#ffffff','noteBorderColor':'#169958','noteTextColor':'#103830','labelBoxBkgColor':'#169958','labelBoxBorderColor':'#0f7a45','labelTextColor':'#ffffff','sequenceNumberColor':'#ffffff'}}}%% sequenceDiagram autonumber participant S as Supplier participant IV as Invopop participant AX as Operator participant B as Buyer S->>IV: Invoice (GOBL) IV->>IV: Generate the e-invoice IV->>AX: Submit to the operator alt Buyer on the domestic network AX->>B: Deliver as Finvoice or TEAPPSXMLXML else Buyer on Peppol AX->>B: Deliver over Peppol end ``` The supplier's system sends the invoice to Invopop as a GOBL document. Invopop generates a compliant e-invoice from the GOBL document. Invopop submits the invoice to the accredited Finnish operator it partners with, which resolves how the buyer is reachable and refuses anything that would not arrive as a true e-invoice. If the buyer receives through the domestic operator network, the invoice is delivered there as Finvoice, or TEAPPSXML where the buyer's operator uses it. If the buyer is registered on Peppol, the invoice is delivered over Peppol instead. Suppliers invoicing Finnish public authorities must submit invoices via the Peppol network in **Peppol BIS Billing 3.0** (UBL 2.1) format. Paper and unstructured PDF invoices are not accepted. The **Finnish State Treasury (Valtiokonttori)** has been the national Peppol Authority since 2022, managing SMP registration for Finnish participants. Unlike clearance countries, Finland has no central government invoice-validation hub: contracting authorities receive invoices directly over Peppol or via their operator/bank channel, in a decentralized four-corner model. Peppol e-ordering has also applied to central government purchases since April 2024. | | | | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | | **Scope** | B2G | | **Format** | Peppol BIS Billing 3.0 (UBL 2.1) | | **Compliance** | e-invoicing | | **Infrastructure** | Peppol network (four-corner model) | | **Model** | Decentralized (access point network) | | **Effective date** | Mandatory since **April 2019** (central government); **April 2020** (all contracting authorities); EN 16931-only since **April 2021** | | **Agency** | Valtiokonttori (Finnish State Treasury), national Peppol Authority | | **Invopop support** | [Finland App](/apps/finland) | Connect the app to send invoices to Finnish public authorities → Finland has no B2B e-invoicing transmission mandate as of 2026. The EU's ViDA initiative is expected to introduce a harmonized digital reporting requirement across member states from around July 2030. B2B e-invoicing in Finland is voluntary, but businesses with an annual turnover exceeding **EUR 10,000** have a statutory right to request that their suppliers issue e-invoices instead of paper or PDF. This right-to-request mechanism, rather than a blanket mandate, is one of the reasons Finland has a comparatively high voluntary e-invoicing adoption rate. Requested invoices typically flow over the same Peppol rails used for B2G, or via Finvoice for domestic-only trading partners. | | | | ------------------- | ------------------------------------------------------------------------------- | | **Scope** | B2B (voluntary, with a statutory right to request) | | **Format** | Peppol BIS Billing 3.0, Finvoice 3.0 | | **Trigger** | Buyer turnover above EUR 10,000 | | **Mandate status** | No transmission mandate; ViDA harmonized B2B reporting expected **1 July 2030** | | **Invopop support** | [Finland App](/apps/finland) | Invopop reaches receivers on this network through the [Finland App](/apps/finland): invoices are delivered through an accredited Finnish operator, in the format the receiver expects. Around 370,000 Finnish companies (most of the market) receive their e-invoices through this network of accredited operators and banks rather than Peppol. **Finvoice 3.0**, maintained by Finance Finland, is the dominant domestic format, exchanged over the Finnish bank network. **TEAPPSXML 3.0**, a proprietary operator format from Tietoevry, is used mainly for inter-operator exchange and by larger enterprises and public administration. Both are EN 16931-compliant, so conversion to and from Peppol BIS is largely lossless for core invoice data. | | | | ------------------- | ---------------------------- | | **Invopop support** | [Finland App](/apps/finland) | | | | | | ------------- | ---------------------- | ----------------------------------------------- | | **Format** | Finvoice 3.0 | TEAPPSXML 3.0 | | **Owner** | Finance Finland | Tietoevry | | **Syntax** | Proprietary XML | Proprietary XML | | **Transport** | Finnish bank network | Operator network | | **Scope** | Domestic B2B, B2G, B2C | Inter-operator, larger enterprises/public admin | ## E-reporting Finland has no real-time or periodic e-reporting requirement layered on top of e-invoicing today. VAT is declared through the standard periodic VAT return filed with Verohallinto. The EU's ViDA initiative is expected to introduce harmonized Digital Reporting Requirements based on EN 16931 data across member states from around 2030, which would extend to Finland's intra-EU B2B transactions in the first instance. ## Regulation Finnish invoice content requirements implement EU VAT Directive Article 226 through the Arvonlisäverolaki (Finnish VAT Act). **Full invoice** * **Supplier's name and address**, and **Y-tunnus** (Business ID) or VAT number. * **Buyer's name and address**. For intra-EU B2B transactions, the buyer's VAT number must also be included. * **Sequential invoice number**, unique and part of an ongoing series. * **Invoice date** (date of issue). * **Delivery / supply date**, if different from the invoice date. * **Description** of the goods delivered or services provided, including quantity and unit price excluding VAT. * **Taxable base**: total price excluding VAT, per VAT rate applied. * **VAT rate(s)** applied (25.5% / 13.5% / 10%) and the **VAT amount** in EUR. * **Total amount including VAT**. * For **reverse charge** transactions: a reference to the applicable provision and the customer's VAT number. * For **VAT-exempt or zero-rated supplies**: a reference to the applicable exemption. **Simplified invoice** Permitted for low-value transactions and certain retail/service situations under Arvonlisäverolaki: * Supplier's name and Y-tunnus/VAT number. * Invoice date. * Description of goods or services. * Total amount including VAT and the VAT rate applied. Invoice corrections are not restricted to specific document types. Any corrective document referencing the original invoice is accepted. Finland applies standard EU VAT rules under the Arvonlisäverolaki (VAT Act), administered by Verohallinto. | Rate | Percentage | Application | | ------------- | ---------- | ----------------------------------------------------------------------------------- | | Standard | **25.5%** | Most goods and services | | Reduced | **13.5%** | Food, restaurants, books, transport, accommodation, and cultural events (from 2026) | | Super-reduced | **10%** | Newspapers and magazines | | Zero-rated | **0%** | Exports outside the EU and intra-EU supplies to VAT-registered buyers | Businesses are identified by their **Y-tunnus** (Business ID: 7 digits plus a check digit, formatted `1234567-8`). The Finnish VAT number is formed by prefixing `FI` and removing the hyphen (e.g. `FI12345678`). Under the **Kirjanpitolaki** (Finnish Accounting Act, 1336/1997), vouchers (invoices and supporting documentation included) must be retained for **6 years** from the end of the calendar year in which the financial year closed (in practice "6+1"), and financial statements for **10 years**, with authenticity, integrity, and readability preserved throughout. Some categories of documentation may be subject to longer sector-specific retention rules; confirm exact figures with local counsel before relying on them for edge cases. * [Valtiokonttori](https://www.valtiokonttori.fi): Finnish State Treasury, national Peppol Authority * [Verohallinto](https://www.vero.fi/en/): Finnish Tax Administration, VAT guidance * [GOBL Finland regime](https://docs.gobl.org/regimes/fi): VAT rates, Y-tunnus format, e-invoicing mandate summary * [GOBL EU EN 16931 addon](https://docs.gobl.org/addons/eu-en16931-v2017): UNTDID tax category and document type mapping ## FAQ Compliance questions Finland B2G e-invoicing has been mandatory since 1 April 2019 for central government and since 1 April 2020 for all contracting authorities, under Act 241/2019 (implementing EU Directive 2014/55/EU). Since 1 April 2021, public bodies may only accept invoices compliant with EN 16931. B2B e-invoicing remains voluntary. Businesses above the EUR 10,000 turnover threshold have a statutory right to request e-invoices from suppliers, but there is no blanket transmission mandate. There is no B2C mandate. Businesses with an annual turnover exceeding EUR 10,000 can compel their suppliers to issue e-invoices instead of paper or PDF. It's a statutory right rather than a default obligation to transmit electronically, and it is one of the reasons Finland has a comparatively high voluntary e-invoicing adoption rate without a blanket mandate. Standard rate 25.5%, reduced rate 13.5% (food, restaurants, books, transport, accommodation, cultural events, from 2026), and super-reduced rate 10% (newspapers and magazines). Exports outside the EU and intra-EU supplies to VAT-registered buyers are zero-rated. Under the Kirjanpitolaki (Finnish Accounting Act, 1336/1997), vouchers — invoices included — must be retained for 6 years from the end of the calendar year in which the financial year closed (in practice "6+1"), and financial statements for 10 years, with authenticity, integrity, and readability preserved throughout. Confirm any sector-specific extensions with local counsel before relying on them for edge cases. Finvoice Finvoice is the Finnish XML e-invoicing format, published by Finance Finland (*Finanssiala*), the banking association. Version 3.0 is conformant with the European standard EN 16931, and it is the dominant format on Finland's domestic operator network. You don't produce Finvoice documents yourself: send a GOBL invoice, and it is delivered in the format the receiver's network expects. No. Finland runs two e-invoicing networks side by side: the domestic operator network, where around 370,000 companies receive their invoices, and Peppol, with roughly 13,000 end users (about 0.24% of annual volume). The Finland app covers receivers on either network: you send one GOBL invoice with the receiver's e-invoice address, and the routing is resolved for you. Peppol Mandatory dates vary by country. Belgium requires structured B2B e-invoicing — Peppol BIS by default — from January 2026. Germany is phasing in B2B e-invoicing between 2025 and 2028. France's Factur-X via Peppol applies once the PA reform takes effect. Outside mandates, Peppol delivery is voluntary but increasingly expected for B2G and cross-border trade. Yes. Every document exchanged on Peppol BIS uses a UBL or CII syntax that conforms to the EN16931 European e-invoicing standard, plus the relevant Peppol BIS specification. Invopop generates compliant XML automatically when you use the Peppol app. Peppol is a federated network — anyone could otherwise register a Participant ID for a company they don't represent. Proof of ownership ties the Participant ID to a verifiable contact at the company, which is what allows the registration to be published on the SML. Requirements vary by Authority. In Belgium, for example, the supplier must provide a recent extract from the Banque-Carrefour des Entreprises (KBO/BCE) plus a signed mandate. Invopop walks the registering party through the local requirements during the registration wizard. Yes — a Peppol BIS document delivered through a certified Access Point is treated as the legal e-invoice in any country that recognises Peppol. The signed UBL or CII XML is the authoritative record; archive it alongside any human-readable rendering you generate. Retention is set by each country's tax authority — typically 7 to 10 years in the EU. Invopop preserves the original XML and any generated PDF in the silo entry so you can satisfy local archival requirements wherever you operate. More available in our [Finland FAQ](/faq/finland) section *** Ask and answer questions about Finland's regulation → # Invoicing compliance in France Source: https://docs.invopop.com/compliance/france France's mandatory e-invoicing and e-reporting framework — Plateforme Agréée model, Annuaire, PPF, Chorus Pro, and the September 2026 mandate. Plateforme Agréée — Facturation électronique — République Française Invopop is an [**officially approved Plateforme Agréée (PA)**](https://www.impots.gouv.fr/je-consulte-la-liste-des-plateformes-agreees) under the DGFiP mandate. View current and upcoming regulation → | | | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Compliance | [Invoicing compliance in France](/compliance/france)
[Compliance timeline](/timelines/france) | | Apps | [France](/apps/france)
[Peppol](/apps/peppol)
[Chorus Pro France](/apps/choruspro-france) | | Guides | Chorus Pro — [Supplier registration](/guides/fr-chorus-pro-supplier) · [Issuing invoices](/guides/fr-chorus-pro)
[PA Guide](/guides/fr-pa) — [Registration](/guides/fr-pa-registration) · [Invoicing](/guides/fr-pa-invoicing) · [Status](/guides/fr-pa-status) · [Reporting](/guides/fr-pa-reporting) | | FAQ | [France FAQ](/faq/france) | | GOBL | [France Tax Regime](https://docs.gobl.org/regimes/fr)
[Chorus Pro Addon](https://docs.gobl.org/addons/fr-choruspro-v1)
[French Factur-X Addon](https://docs.gobl.org/addons/fr-facturx-v1) | | GitHub | [gobl.xinvoice](https://github.com/invopop/gobl.xinvoice) |
## Executive summary France's B2B e-invoicing reform runs on a **five-corner model**: businesses connect through a certified **Plateforme Agréée (PA)**, which routes each invoice over the Peppol network to the buyer's PA, while the PA also forwards the mandated dataset to the **PPF** (*Portail Public de Facturation*) — the government data concentrator that stores VAT data per transaction. PAs look up routing through the **Annuaire**, France's national directory of e-invoicing endpoints. Different transaction types follow different rules: * **B2G** has been mandatory since 2020 via [Chorus Pro](#chorus-pro-b2g). * **B2B** is being rolled out in phases: voluntary pilot in 2025, mandatory **receive** for everyone plus mandatory **issuance** for large and medium-sized companies on 1 September 2026, mandatory issuance for all businesses on 1 September 2027. * **B2C** is exempt from e-invoicing but is subject to **e-reporting** to the PPF. * **Cross-border B2B** is also out of scope for e-invoicing and reported via e-reporting. Invopop is an [officially approved Plateforme Agréée](https://www.impots.gouv.fr/je-consulte-la-liste-des-plateformes-agreees) under the DGFiP mandate. Coverage: | | App / Guide | | ---------------------------------------- | --------------------------------------------------------------------------------------- | | B2G via Chorus Pro | [Chorus Pro France](/apps/choruspro-france) · [Chorus Pro guide](/guides/fr-chorus-pro) | | B2B PA — registration, invoicing, status | [PA guide](/guides/fr-pa) | | B2C and cross-border e-reporting | [PA reporting guide](/guides/fr-pa-reporting) (in development) | Stripe and Chargebee integrations let merchants and ERPs issue compliant invoices with the PA routing handled automatically. ## E-invoicing E-invoicing applies to domestic B2B (via a Plateforme Agréée) and B2G (via Chorus Pro). Each business connects through a certified PA. The PA looks up the buyer in the Annuaire and routes the invoice over Peppol to the buyer's PA, while forwarding a simplified **F1 invoice** to the PPF as the fifth corner. | | | | -------------------- | ------------------------------------------------------------------------------------------------------------------------------ | | **Models** | B2B | | **Status** | Mandatory (phased — see below) | | **Format** | UBL (Peppol France CIUS), CII, Factur-X (PDF/A-3 with embedded CII) | | **Infrastructure** | Peppol + Annuaire + PPF | | **Model** | Five-corner | | **Scope & deadline** | 1 Sept 2026: all businesses must receive; large and medium-sized companies must issue. 1 Sept 2027: all businesses must issue. | | **Agency** | [Direction Générale des Finances Publiques](https://www.economie.gouv.fr/dgfip) (DGFiP) | | **Invopop support** | [PA guide](/guides/fr-pa) | Get covered → Get covered → B2G e-invoicing has been mandatory in France since 2020. All suppliers invoicing French public entities submit electronic invoices through Chorus Pro. | | | | ------------------- | --------------------------------------------------------------------------------------- | | **Models** | B2G | | **Status** | Mandatory since 2020 | | **Format** | EN 16931 with Chorus Pro extensions (CII) | | **Infrastructure** | [Chorus Pro](https://portail.chorus-pro.gouv.fr/) | | **Model** | Centralized | | **Agency** | [Direction Générale des Finances Publiques](https://www.economie.gouv.fr/dgfip) (DGFiP) | | **Invopop support** | [Chorus Pro guide](/guides/fr-chorus-pro) | Get covered → ## E-reporting E-reporting applies to B2C sales, cross-border B2B, and any flow where one party is not registered in the Annuaire — i.e. everything that is out of scope for e-invoicing. For e-reporting use cases, a PA aggregates transaction and payment data and submits periodic reports (the **Flux 10** dataset) to the PPF on a cadence tied to the party's VAT regime. The regulation splits this into two distinct obligations — **transaction data** and **payment data** — which apply to different cases and follow different deadlines. E-reporting becomes mandatory on the same dates as e-invoicing issuance: 1 Sept 2026 for large and medium-sized companies, 1 Sept 2027 for all businesses. Non-established taxable persons are an exception: their obligation to e-report acquisitions is postponed to 1 September 2027 regardless of the size of the business. ### When e-reporting applies **E-reporting of transactions** is required for all cross-border B2B and B2C sales, regardless of how VAT is accounted for. **E-reporting of payments** is required only for **supplies of services**, where VAT becomes due when the payment is collected (*encaissement*). It does **not** apply when: * The business has opted to **pay VAT on debits** (*sur les débits*): VAT is already accounted for when the invoice is issued, so the invoice itself serves as the payment record. This waiver does not apply to **advance payments** or **agricultural transactions**, where VAT falls due on receipt of payment and so must still be reported. * The transaction is subject to **reverse charge**: the customer accounts for the VAT, so the supplier has no payment VAT to report. The debit-option waiver affects **payment reporting only**. Transaction data must be reported in all cases. ### Reporting flows Each recorded document is classified into one of four Flux 10 data blocks, based on whether it is a cross-border B2B or a domestic B2C operation, and whether it carries transaction or payment data: | Flow | Reports | Applies to | | ------ | ----------- | ------------------------------------------ | | `10.1` | Transaction | Cross-border B2B invoices | | `10.2` | Payment | Payments against cross-border B2B invoices | | `10.3` | Transaction | B2C transactions | | `10.4` | Payment | B2C payments | ### What each report must contain The field-level mapping including required extensions, document-type codes, permitted VAT rates and party identifier schemes is maintained in the GOBL add-on documentation: Scenario-by-scenario data requirements → ### How Invopop processes reporting * **Aggregation**: data is consolidated per declarant at **SIREN level** and by the declarant's role in each transaction (seller or buyer). * **Cadence**: submission frequency follows the declarant's VAT regime. Because transaction and payment data can fall on different deadlines, they are submitted as separate reports. See the [PA reporting guide](/guides/fr-pa-reporting) for the registration, recording and submission workflow. | | | | -------------------- | ---------------------------------------------------------------------------------------- | | **Format** | GOBL with the [`fr-ctc-flow10-v1`](https://docs.gobl.org/addons/fr-ctc-flow10-v1) add-on | | **Cadence** | Determined by VAT regime — ten-day, monthly, or bimonthly | | **Scope & deadline** | 1 Sept 2026 for large and medium-sized companies, 1 Sept 2027 for all businesses | | **Invopop support** | In development — see [reporting guide](/guides/fr-pa-reporting) | Transaction and payment data are reported on a cadence set by the declarant's VAT regime. | VAT regime | Transaction data | Payment data | | ------------------------- | ---------------- | ------------ | | *Réel normal mensuel* | Ten-day period | Monthly | | *Réel normal trimestriel* | Monthly | Monthly | | *Réel simplifié* | Monthly | Monthly | | *Franchise en base* | Bimonthly | Bimonthly | ## Regulation According to [Article 242 nonies A of Annexe II of the Code général des impôts](https://bofip.impots.gouv.fr/bofip/140-PGP.html) and [Article 289 CGI](https://www.service-public.fr/professionnels-entreprises/vosdroits/F31808), invoices must contain the following mandatory elements: **Standard invoice** * **Supplier identification**: full name or business name, address, and SIREN/SIRET number. * **Client identification**: full name or business name and address. * **VAT identification numbers** of both the supplier and the client. For invoices totaling €150 HT (excluding tax) or less, the client's VAT number is not required. * **Invoice number**: unique, based on a chronological and continuous sequence. Separate numbering series are permitted when justified by business conditions (for example, different sites or different invoicing methods). * **Issue date** of the invoice. * **Date of delivery or service completion**, if different from the invoice date. * **Description of goods or services**: for each line, the precise denomination, quantity, and unit price excluding tax. * **Applicable VAT rate(s)** for each line, or the legal basis for exemption when VAT does not apply. * **Discounts, rebates, and allowances** acquired at the time of the transaction and directly linked to it. * **Total amount excluding tax**, the total VAT amount broken down by rate, and the total amount including tax. * **Payment terms**: due date, conditions of payment, and the applicable late payment penalty rate. * **Late payment indemnity**: the fixed compensation for recovery costs (currently €40). * **Early payment discount** (escompte): the rate if applicable, or a mention that no discount is offered. For specific transactions, additional mentions are required: * **VAT exemption**: reference to the applicable legal provision (for example, Article 262 ter I CGI for intra-EU supplies, or Article 283-2 CGI for reverse charge). * **Self-billing**: the mention "autofacturation" when the client issues the invoice on behalf of the supplier. * **Margin scheme**: the mention "Régime particulier - Biens d'occasion" or equivalent when applicable. * **New vehicles**: specific characteristics as defined in Article 298 sexies CGI. Invoices must be issued **on the date of delivery or service completion**. For recurring or continuous supplies, they may be issued periodically. **Simplified invoice (≤ €150 HT)** For transactions totaling €150 HT or less, the client's VAT identification number is not required. All other standard mentions still apply. Under [Article 242 nonies A of the CGI](https://www.assistant-juridique.fr/numeroter_facture.jsp), invoice numbering in France must follow three principles: * **Uniqueness**: each invoice must carry a number that is never reused within the same accounting period. * **Chronological order**: numbers must follow the actual order of issuance. An invoice dated January 15 cannot have a lower number than one dated January 10. * **Continuity**: the sequence must be uninterrupted with no gaps. Skipping from invoice 130 to 132 is prohibited. Businesses may use multiple numbering series when justified by operational needs, such as different invoicing methods (electronic versus paper), different client categories, or different sites. Each series must independently respect the three principles above. Common formats include: * Prefix with sequential number: `F-0001`, `F-0002` * Year with sequential number: `2026-001`, `2026-002` * Year, month, and sequential number: `2026-03-001`, `2026-03-002` Failure to comply with numbering rules can result in fines up to 50% of the invoice amount for a missing number, and gaps in the sequence may be treated as evidence of concealment. Under [Article 289 CGI](https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000006309596), any document modifying an initial invoice must reference it specifically and unambiguously. A credit note must include: * All the mandatory mentions required for a standard invoice. * A clear reference to the original invoice number(s) being corrected. * The nature and amount of the correction. * The corrected VAT amount. Credit notes are issued for returns, post-sale discounts, billing errors, or other adjustments that reduce the originally invoiced amount. [Article 289 CGI](https://www.lexbase.fr/texte-de-loi/autre-version/L0371IWN.html) allows a client or third party to issue invoices on behalf of a supplier under a formal invoicing mandate (mandat de facturation). Requirements include: * A prior written agreement between the parties. * Each invoice is issued in the name and on behalf of the supplier. * The supplier must accept each invoice (explicit or tacit acceptance as agreed). * The mention "autofacturation" must appear on the invoice. * The supplier retains full responsibility for the accuracy of the tax information. **Retention period.** Under [Article L123-22 of the Code de commerce](https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000006219327), all accounting documents and supporting records, including invoices, must be retained for **ten years** from the close of the fiscal year to which they relate. The tax administration requires a minimum of **six years** (Article L102 B of the Livre des procédures fiscales), but since the commercial obligation is longer, businesses must respect the ten-year period. **Original form and probative value.** Invoices issued or received electronically must be stored **in their original electronic format** for the tax retention period (Article L102 B LPF) — a PDF rendering or data extract is not the invoice of record. Throughout retention the archive must preserve **authenticity of origin, integrity of content, and legibility**. French practice relies on probative-value archiving systems (coffre-fort numérique) per **NF Z 42-013 / ISO 14641**; storage may be located in France or another EU member state provided the administration has guaranteed online access (Article L102 C LPF). **Authenticity and integrity methods (Article 289 VII CGI).** Every invoice must be covered by one of four mechanisms: 1. A **piste d'audit fiable** (reliable audit trail): documented, permanent business controls establishing a verifiable link between each invoice and the underlying supply of goods or services. 2. A **qualified electronic signature or seal**. 3. A compliant **EDI** exchange (Article 289 bis conditions). 4. Since the reform, use of the **Article 289 bis e-invoicing procedure** itself — domestic B2B invoices exchanged through a Plateforme Agréée satisfy the requirement by construction. In practice the piste d'audit fiable remains necessary for flows outside the PA mandate — B2C, cross-border invoices, and any paper or unstructured PDF invoicing during the transition. **Who is the archive of record.** The reform does not transfer the archiving obligation to the platform: **supplier and buyer each remain legally responsible** for retaining their own invoices for the full period. A PA may offer compliant archiving as an additional service, but routing invoices through a PA does not by itself discharge the retention obligation. **Metropolitan France** | Rate | Percentage | Examples | | ------------- | ---------- | ---------------------------------------------------------------------------------------------- | | Standard | 20% | Most goods and services | | Intermediate | 10% | Restaurants, hotels, passenger transport, some renovations, certain medications | | Reduced | 5.5% | Basic foodstuffs, books, non-alcoholic beverages, medical devices, cultural and sports tickets | | Super-reduced | 2.1% | Newspapers, magazines, certain reimbursable medications, some cultural events | **Overseas departments (Guadeloupe, Martinique, Réunion)** | Rate | Percentage | | -------- | ---------- | | Standard | 8.5% | | Reduced | 2.1% | VAT is not currently applicable in **Guyane** and **Mayotte**. The **Direction Générale des Finances Publiques (DGFIP)** is the French public finance directorate responsible for tax collection and enforcement. It oversees the implementation of e-invoicing and e-reporting requirements in France. Website: [https://www.economie.gouv.fr/dgfip](https://www.economie.gouv.fr/dgfip) France's phased rollout for B2B e-invoicing and e-reporting: * **2025**: Voluntary pilot phase * **1 September 2026**: * All businesses must be able to receive e-invoices * Large and medium-sized companies must issue e-invoices * E-reporting of issued transactions (B2C sales and cross-border B2B) becomes mandatory for these companies * **1 September 2027**: * All remaining businesses (small and micro-businesses) must issue e-invoices * E-reporting of issued transactions becomes mandatory for all businesses * Non-established taxable persons must start e-reporting of acquisitions, regardless of business size (postponed from 1 September 2026) The implementation has been delayed multiple times to ensure businesses and platforms are adequately prepared. * [France delays mandatory e-invoicing to March 2026](https://www.invopop.com/blog/france-e-invoicing-delayed-march-2026) - 18 September, 2023 * [Electronic invoicing in France](https://www.invopop.com/blog/electronic-invoicing-in-france) - 14 February, 2023 * [Government article in English](https://entreprendre.service-public.gouv.fr/actualites/A15683?lang=en) - 29 August, 2025 ## FAQ Compliance questions France 1 September 2026 for receiving (all businesses) and issuing for large/mid-size companies. 1 September 2027 extends issuing to SMEs and micro-businesses. B2G via Chorus Pro has been mandatory since 2017–2020 (phased by company size). Chorus Pro For all B2G transactions with French public administrations — phased in by supplier size from 2017, fully mandatory since 2020. Once an invoice is destined for a public entity, Chorus Pro is the only legal channel. Suppliers must register on Chorus Pro's portal and obtain credentials. Foreign businesses without a SIRET can register with their local tax ID but must verify acceptance with the receiving administration on a case-by-case basis. PA (Plateforme Agréée) E-invoices cannot be deleted or retracted. Instead a credit note or corrected invoice is sent referencing the original. The supplier must be registered in the Annuaire (the DGFiP-maintained directory of B2B participants) via an approved PA. Once registered, Invopop becomes the supplier's PA for sending and receiving over Peppol. Yes. From 1 September 2026 every French business, regardless of size, must be able to receive e-invoices, which requires an Annuaire registration through a PA. SMEs and micro-businesses are not required to issue e-invoices or e-report until 1 September 2027 — those obligations follow the company's size band, so registering to receive does not bring them forward. Until then they can be [registered for receiving only](/guides/fr-pa-registration#registering-without-e-reporting). **E-invoicing** transmits the invoice itself between trading parties via Peppol, with the PPF receiving the regulated dataset as a fifth corner. **E-reporting** is a periodic submission to the PPF covering transactions out of scope for e-invoicing — B2C, cross-border B2B, and any flow where the counterparty is not in the Annuaire. Yes — B2C is exempt from e-invoicing but is subject to e-reporting. From 1 September 2026 (large and medium-sized companies) or 1 September 2027 (all businesses), B2C transactions must be reported periodically to the PPF. If the supply is taxable under French reverse charge (i.e. VAT is paid on import), the transaction must be e-reported. Report payment data only when VAT is due on receipt of payment, such as for services under "cash VAT" (TVA sur les encaissements). E-invoicing does not apply. If the business is liable to French VAT, e-reporting applies to the relevant flows. E-reporting for reverse-charge VAT and intra-EU acquisitions is deferred until 1 September 2027. Peppol Mandatory dates vary by country. Belgium requires structured B2B e-invoicing — Peppol BIS by default — from January 2026. Germany is phasing in B2B e-invoicing between 2025 and 2028. France's Factur-X via Peppol applies once the PA reform takes effect. Outside mandates, Peppol delivery is voluntary but increasingly expected for B2G and cross-border trade. Yes. Every document exchanged on Peppol BIS uses a UBL or CII syntax that conforms to the EN16931 European e-invoicing standard, plus the relevant Peppol BIS specification. Invopop generates compliant XML automatically when you use the Peppol app. Peppol is a federated network — anyone could otherwise register a Participant ID for a company they don't represent. Proof of ownership ties the Participant ID to a verifiable contact at the company, which is what allows the registration to be published on the SML. Requirements vary by Authority. In Belgium, for example, the supplier must provide a recent extract from the Banque-Carrefour des Entreprises (KBO/BCE) plus a signed mandate. Invopop walks the registering party through the local requirements during the registration wizard. Yes — a Peppol BIS document delivered through a certified Access Point is treated as the legal e-invoice in any country that recognises Peppol. The signed UBL or CII XML is the authoritative record; archive it alongside any human-readable rendering you generate. Retention is set by each country's tax authority — typically 7 to 10 years in the EU. Invopop preserves the original XML and any generated PDF in the silo entry so you can satisfy local archival requirements wherever you operate. More available in our [France FAQ](/faq/france) section *** Ask and answer questions about France's regulation → # Invoicing compliance in Germany Source: https://docs.invopop.com/compliance/germany Germany's mandatory e-invoicing requirements, XRechnung and ZUGFeRD implementation, and upcoming e-reporting obligations for B2B and B2G transactions View current and upcoming regulation → | | | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Compliance | [Invoicing compliance in Germany](/compliance/germany)
[Compliance timeline](/timelines/germany) | | Apps | [OASIS UBL](/apps/oasis-ubl)
[ZUGFeRD](/apps/uncefact-cii) | | Guides | [XRechnung & ZUGFeRD guide](/guides/de-ubl)
[Chargebee guide](/guides/cb-germany) | | FAQ | [Germany FAQ](/faq/germany) | | GOBL | [Germany Tax Regime](https://docs.gobl.org/regimes/de)
[German XRechnung Addon](https://docs.gobl.org/addons/de-xrechnung-v3)
[German ZUGFeRD Addon](https://docs.gobl.org/addons/de-zugferd-v2) | | GitHub | [gobl.xinvoice](https://github.com/invopop/gobl.xinvoice) |
## Executive summary Germany distinguishes clearly between B2G and B2B electronic invoicing. For B2G, the **XRechnung** format—based on **EN 16931** and implemented in **UBL** or **CII** syntax—has been mandatory since November 2020 for all invoices to public authorities, typically exchanged via the **Peppol network**. For B2B, businesses must be able to receive structured e-invoices compliant with EN 16931, while issuing such invoices will become mandatory from Jan 2027 for companies with turnover above €800,000, and from January 2028 for all businesses in domestic B2B transactions. **ZUGFeRD**, a hybrid PDF + XML format aligned with EN 16931 and equivalent to France’s Factur-X, is accepted alongside XRechnung. Germany is preparing for EU-wide Digital Reporting Requirements (ViDA), expected around 2030, which will introduce VAT e-reporting requirements based on EN 16931 data. Structured invoices must be **archived in their original XML format** for **eight years**, in compliance with **GoBD** rules ensuring data integrity, readability, and domestic accessibility. Invopop provides coverage for German invoicing through the **OASIS UBL** and **ZUGFeRD** apps, supporting both XRechnung and ZUGFeRD formats. The platform also offers integrations with Stripe and Chargebee, enabling businesses to issue compliant invoices directly from their merchant or ERP platforms while automatically handling format compliance and Peppol network routing when required. ## Invoicing in Germany Electronic invoicing is well established and regulated, with a clear distinction between B2G and B2B/B2C transactions. For B2G, the XRechnung format is mandatory for invoices to public authorities, and these are primarily exchanged via the Peppol network or authorized access points. Since January 2025, all German businesses must be able to receive structured e-invoices compliant with EN 16931; B2C invoicing remains unregulated in format. Under the recently passed Wachstumschancengesetz (Growth Opportunities Act), Germany will implement a phased rollout for domestic B2B invoicing in structured electronic formats. For more information, check the ZUGFeRD section below. XRechnung is Germany’s standard for e-invoices in public procurement (B2G, called E-Rechnungen), though it can also be used for B2B transactions. It’s part of the implementation of the EU directive 2014/55/EU, which requires all contracting authorities in the EU to accept electronic invoices in a structured XML file. It can be implemented using two different syntaxes, CII and UBL. | | | | -------------------- | --------------------------------------------------------------------- | | **Models** | B2G (primary use) or B2B | | **Format** | OASIS UBL and UN/CEFACT CII | | **Infrastructure** | [Peppol](/apps/peppol) | | **Model** | Hybrid | | **Scope & Deadline** | B2G Since Nov. 2020 | | **Agency** | [BMI](https://www.bmi.bund.de/) | | **Invopop Support** | [OASIS UBL](/apps/oasis-ubl)
[UN/CEFACT CII](/apps/uncefact-cii) |
ZUGFeRD is a German standard for electronic invoicing designed to bridge the gap between traditional invoices and digital formats. ZUGFeRD combines a standard PDF/A-3 invoice with an embedded XML file containing the structured data. This hybrid approach is well suited for B2B transactions, as it allows both people and accounting software to work with the same document. It is fully aligned with the European Norm EN 16931. It is worth noting that ZUGFeRD and Factur-X are a joint project between Germany and France, and their content is identical. | | | | -------------------- | ------------------------------------------------------------------------------------------- | | **Models** | B2B (primary use) | | **Format** | PDF/A-3 with embedded UN/CEFACT CII XML | | **Infrastructure** | Direct exchange (email, portals) | | **Model** | Post-audit | | **Scope & Deadline** | B2B issuance mandatory from Jan 2027 (turnover above €800,000), Jan 2028 for all businesses | | **Agency** | [FeRD](https://www.ferd-net.de/) | | **Invopop Support** | [UN/CEFACT CII](/apps/uncefact-cii) |
## E-reporting Germany is aligning with the EU's ViDA directive, which projects Digital Reporting Requirements (DRRs). Digital reporting obligation is likely around 2030 or later for Germany, though exact timelines and legal details are not yet fixed. The forthcoming reporting model would require EN 16931 compliant data enabling tax authorities to access invoice‑level data for VAT monitoring and fraud prevention. ## Regulation In July 2025, the Ministry of Finance made public how structured e-invoices must be archived: * Only the XML must be archived (even if it's a ZUGFeRD hybrid) the embedded XML is the tax‑binding element. PDFs are optional if a readable view can be generated. * Invoices must be stored in the XML format received (CII or UBL), even if converted internally, to satisfy audit requirements. * Data generally must remain in Germany and must comply with GoBD. * Germany shortened the invoice archival period from 10 to 8 years. Germany’s e‑invoicing compliance is strict and technical, especially around invoice content, format, and archiving: * Legally required invoice elements: seller/buyer tax IDs, invoice number, date, line‑item details, VAT breakdowns, and references to contracts or purchase orders if applicable. Missing or incorrect data can make an invoice legally invalid. * Structured formats: For B2G, this is XRechnung; for future B2B mandates, invoices will need to be EN 16931-compliant (XRechnung or ZUGFeRD). PDFs without an XML attachment are insufficient for mandated channels. * Archiving: All invoices, whether received or issued, must be retained digitally and unaltered for 8 years in a compliant system. ## FAQ Compliance questions Germany Receiving capability has been mandatory since 1 January 2025. Issuing becomes mandatory on 1 January 2027 for companies with turnover above €800k, and 1 January 2028 for everyone else. B2G has been mandatory since 2020. There is no legal mandate to use Peppol in Germany. The requirement is to issue and receive invoices in a structured, EN 16931-compliant format (like XRechnung or ZUGFeRD). In practice, Peppol is by far the most widely used network, because it is the standardized, government‑endorsed way to exchange XRechnung invoices electronically with German public authorities and, increasingly, with large businesses. Using Peppol ensures: * Interoperability with virtually all public sector recipients. * Compliance with format and technical rules without having to negotiate separate connections or portals. * Access via certified Peppol Access Points, which handle validation and delivery. * Other delivery channels exist (email, portal upload), but they are often less convenient, less standardized, and may not scale for high-volume or cross-border invoicing. So, while Peppol isn't legally required, almost everyone uses it in practice for compliance and efficiency. Timing is linked to contractual and procedural deadlines, not a specific law that defines a universal submission window. However, in the context of B2G many authorities specify invoice submission within 10 days of service completion in their contracts or portals, so it's best to issue the invoice as early as possible. In the case of B2B the general VAT rule states that the invoice must be issued within 15 days after the end of the month in which the supply was made, if the transaction is subject to VAT and involves another taxable business. This 15-day window is critical because late issuance can make VAT reporting inconsistent between supplier and customer and it may also affect the buyer's right to input VAT deduction. Any entity with a Steuernummer (tax number) or USt-IdNr (VAT ID). Foreign suppliers selling into German B2G need a valid VAT ID and a Leitweg-ID provided by the recipient. For B2G, the supplier must include the recipient's Leitweg-ID (the German B2G routing identifier) in the BuyerReference field. For B2B, no extra obligations beyond the standard Peppol participant registration. Since 1 January 2025, every German VAT-registered business must accept structured e-invoices (XRechnung, ZUGFeRD ≥ EN 16931). Archival in original format for 8 years (§ 14b UStG) — the structured XML is the legal record, the PDF is supplementary. Monthly or quarterly Umsatzsteuer-Voranmeldung (USt-VA) and the annual Umsatzsteuerjahreserklärung. Cross-border B2B sales also require Zusammenfassende Meldung (EC sales list). E-reporting tied to e-invoicing is expected from 2028 but not yet legislated. Peppol Mandatory dates vary by country. Belgium requires structured B2B e-invoicing — Peppol BIS by default — from January 2026. Germany is phasing in B2B e-invoicing between 2025 and 2028. France's Factur-X via Peppol applies once the PA reform takes effect. Outside mandates, Peppol delivery is voluntary but increasingly expected for B2G and cross-border trade. Yes. Every document exchanged on Peppol BIS uses a UBL or CII syntax that conforms to the EN16931 European e-invoicing standard, plus the relevant Peppol BIS specification. Invopop generates compliant XML automatically when you use the Peppol app. Peppol is a federated network — anyone could otherwise register a Participant ID for a company they don't represent. Proof of ownership ties the Participant ID to a verifiable contact at the company, which is what allows the registration to be published on the SML. Requirements vary by Authority. In Belgium, for example, the supplier must provide a recent extract from the Banque-Carrefour des Entreprises (KBO/BCE) plus a signed mandate. Invopop walks the registering party through the local requirements during the registration wizard. Yes — a Peppol BIS document delivered through a certified Access Point is treated as the legal e-invoice in any country that recognises Peppol. The signed UBL or CII XML is the authoritative record; archive it alongside any human-readable rendering you generate. Retention is set by each country's tax authority — typically 7 to 10 years in the EU. Invopop preserves the original XML and any generated PDF in the silo entry so you can satisfy local archival requirements wherever you operate. More available in our [Germany FAQ](/faq/germany) section *** Ask and answer questions about Germany's regulation → # Regulatory definitions Source: https://docs.invopop.com/compliance/glossary A brief glossary of the main terms used in regulations and invoicing. This section clarifies terms as they are defined or used in relevant laws and official technical standards. It serves as a reference for understanding the legal and compliance context that governs invoicing, reporting, and certification requirements. ## Global | | | | ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Access Point** | Entry point for connecting to electronic document networks such as [Peppol](/apps/peppol) | | **B2B** | Business-to-Business transactions | | **B2C** | Business-to-Consumer transactions | | **B2G** | Business-to-Government transactions | | **BIS (Peppol)** | Business Interoperability Specifications (see [Peppol](/apps/peppol)) | | **Centralized Model** | E-invoicing model where invoices are routed through a central hub or platform | | **CIUS** | Core Invoice Usage Specification — a usage profile that restricts EN 16931 for a specific country or context without breaking compliance | | **CII (UN/CEFACT)** | Cross Industry Invoice format (see [UN/CEFACT CII](/apps/uncefact-cii)) | | **Clearance Model** | Regulatory architecture where invoices must be validated and approved by tax authorities before becoming legally valid (also known as CTC) | | **Compliance** | Adherence to legal and regulatory requirements | | **CORE** | European invoice standard base specification that defines the semantic data model for electronic invoices | | **Correction** | Process of fixing errors in previously issued documents | | **Credit Note** | A document issued to correct or cancel a previously issued invoice | | **CTC** | Continuous Transaction Control, a clearance model where transactions are validated in real time | | **Debit Note** | A document issued to increase the amount owed from a previous invoice | | **Digital Signature** | Cryptographic signature ensuring document authenticity and integrity | | **E-invoicing** | Electronic invoicing process using structured data formats | | **E-reporting** | Real-time reporting to the tax authority | | **EN 16931** | European standard that defines the semantic data model for electronic invoices, ensuring interoperability across EU countries (see [EN 16931-1:2017 Addon](https://docs.gobl.org/addons/eu-en16931-v2017)) | | **Five-corner Model** | E-invoicing model that integrates e-invoicing with e-reporting, involving supplier, buyer, their platforms, and the tax authority | | **Fiscalization** | Software and hardware requirements implemented to avoid fraud in the retail sector | | **Hybrid Model** | E-invoicing model combining multiple approaches, such as PDF with embedded XML | | **Integration** | Connection between different systems or services | | **Migration** | Process of moving from one system or standard to another | | **Onboarding** | Process of registering and setting up new suppliers or customers | | **Participant** | Entity registered to send/receive documents through electronic networks (see [Peppol](/apps/peppol)) | | **Proof of Ownership** | Documentation verifying legal entity ownership | | **QR Code** | Quick Response code containing document verification information | | **Registration** | Process of enrolling entities in electronic document systems | | **RTIR** | Real-Time Invoice Reporting model, where invoices are reported to tax authorities in real time | | **Sandbox** | Testing environment for development and integration | | **Schema Validation** | Process of checking document structure against defined rules | | **Tax Authority** | Government agency responsible for tax collection and compliance | | **Tax Regime** | The jurisdiction's tax rules and regulations applied to documents | | **UBL** | Universal Business Language, OASIS standard for electronic documents (see [OASIS UBL](/apps/oasis-ubl)) | | **Validation Error** | Issue identified during document structure or content verification | | **White-label** | Service offered under another company's brand | ## Brazil | | | | --------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | | **NF-e** | Nota Fiscal Eletrônica, Brazilian electronic invoice for B2B and B2G sales of goods | | **NFC-e** | Nota Fiscal de Consumidor Eletrônica, Brazilian electronic invoice for B2C retail transactions | | **NFCom** | Nota Fiscal de Serviços de Comunicação Eletrônica, Brazilian electronic invoice for telecommunications and communication services | | **NFS-e** | Nota Fiscal de Serviços Eletrônica, Brazilian electronic invoice for B2B and B2G service transactions | | **RFB** | Receita Federal do Brasil, the Brazilian Federal Revenue Service | | **SEFAZ** | Secretaria da Fazenda, Brazilian state tax authority infrastructure managing electronic invoicing | | **SPED** | Sistema Público de Escrituração Digital, Brazil's comprehensive e-reporting system collecting financial, accounting, tax, and labor information | ## Colombia | | | | ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | | **DIAN** | Dirección de Impuestos y Aduanas Nacionales, the Colombian tax and customs authority (see [DIAN Colombia](/apps/dian-colombia)) | | **Documento Equivalente Electrónico** | Colombian electronic document required for B2C transactions since 2024 | | **FEV** | Factura Electrónica de Venta, Colombia's official electronic invoice format for B2B and B2G transactions | | **Municipal Code** | Five-digit code used in Colombia instead of postal code to specify the municipality | | **RADIAN** | Colombian system combining e-invoicing with negotiable instruments, enabling invoices to be used as financial instruments | | **Título Valor Electrónico** | Electronic negotiable instrument status given to invoices in Colombia's RADIAN system | ## France | | | | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Annuaire** | French state directory used by Plateformes Agréées to route invoices to buyers | | **Chorus Pro** | French government platform for B2G electronic invoicing, mandatory for invoicing public entities (see [Chorus Pro France](/apps/choruspro-france)) | | **Data Concentrator** | French government system that stores VAT data for each transaction as part of e-reporting | | **DGFIP** | Direction Générale des Finances Publiques, the French public finance directorate responsible for tax collection | | **PA** | Plateforme Agréée, certified platform in France that routes invoices through Peppol and submits data to the data concentrator (see [PA Guide](/guides/fr-pa)) | | **PDP** | Plateforme de Dématérialisation Partenaire, former name of the *Plateforme Agréé* | | **Peppol BIS 3.0** | Latest version of Peppol Business Interoperability Specifications, fully compliant with EN 16931 (see [Peppol](/apps/peppol)) | | **PPF** | Portail Public de Facturation, French public invoicing portal part of the PA system | ## Germany | | | | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **GoBD** | German rules (Grundsätze zur ordnungsmäßigen Führung und Aufbewahrung von Büchern, Aufzeichnungen und Unterlagen in elektronischer Form) ensuring data integrity, readability, and domestic accessibility for archived documents | | **XRechnung** | Germany's standard for e-invoices in public procurement (B2G), based on EN 16931 and implemented in UBL or CII syntax (see [XRechnung guide](/guides/de-ubl)) | | **ZUGFeRD** | German hybrid format combining PDF/A-3 with embedded XML, aligned with EN 16931 and equivalent to France's Factur-X (see [ZUGFeRD guide](/guides/de-ubl)) | ## Greece | | | | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------- | | **IAPR** | Independent Authority for Public Revenue, the Greek tax authority managing myDATA (see [myDATA issuing invoices guide](/guides/gr-iapr)) | | **MARK** | Unique identifier assigned by myDATA to validated invoices in Greece | | **myDATA** | My Digital Accounting and Tax Application, Greece's electronic invoicing and reporting platform | ## Italy | | | | ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | | **Documento Commerciale** | Italian digital fiscal document for B2C transactions that records sales and transmits them to the tax authority | | **FatturaPA** | Italian standardized XML format for electronic invoicing used in B2B and B2G transactions | | **Recipient Code** | Seven-digit alphanumeric identifier used in Italy's SDI system to route invoices to the correct recipient | | **SDI** | Sistema di Interscambio, Italy's central hub for transmitting, validating, and delivering electronic invoices (see [SDI Italy](/apps/sdi-italy)) | | **Unique Code** | Six-character alphanumeric code (also known as IPA code) used in Italy to identify specific government agency offices for B2G invoices | ## Mexico | | | | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | | **CFDI** | Comprobante Fiscal Digital por Internet, Mexico's standardized electronic invoicing format | | **CSD** | Certificado de Sello Digital, digital seal certificate required for Mexican CFDI invoices (see [CFDI supplier registration guide](/guides/mx-sat-supplier)) | | **PAC** | Proveedor Autorizado de Certificación, Authorized Certification Provider required to validate and certify Mexican CFDI invoices | | **RFC** | Registro Federal de Contribuyentes, Mexican tax identification number | | **SAT** | Servicio de Administración Tributaria, Mexico's tax authority managing the CFDI system (see [SAT Mexico](/apps/sat-mexico)) | ## Poland | | | | -------- | ---------------------------------------------------------------------------------------------------- | | **KSeF** | Krajowy System e-Faktur, Poland's mandatory electronic invoicing system (see [Poland](/apps/poland)) | ## Portugal | Term | Definition | | --------- | ------------------------------------------------------------------------------------------------------------- | | **ATCUD** | Unique code assigned to each invoice by the Portuguese Tax Authority (AT) | | **AT** | Autoridade Tributária, the Portuguese Tax Authority (see [AT Portugal](/apps/at-portugal)) | | **SAF-T** | Standard Audit File for Tax, XML-based format used to report accounting and invoicing data to tax authorities | ## Spain | | | | --------------- | --------------------------------------------------------------------------------------------------------------------------------- | | **AEAT** | Agencia Estatal de Administración Tributaria, the Spanish Tax Agency | | **FACe** | Spanish centralized government platform for submitting B2G invoices in Facturae format | | **NaTicket** | Upcoming electronic invoicing system for Navarra, Spain, based on TicketBAI and VERI\*FACTU | | **SII** | Suministro Inmediato de Información, Spain's near-real-time VAT reporting system for large companies | | **TBAI** | TicketBAI identifier, unique code assigned to each invoice in the Basque Country's TicketBAI system | | **TicketBAI** | Electronic invoicing and anti-fraud system used in the Basque Country (Álava, Bizkaia, Gipuzkoa), Spain | | **VERI\*FACTU** | Spain's e-reporting and fiscalization system requiring digitally signed invoices with QR codes for B2C, B2B, and B2G transactions | # Invoicing compliance in Greece Source: https://docs.invopop.com/compliance/greece Greece's mandatory e-invoicing requirements, EN 16931 implementation, and myDATA e-reporting obligations for B2B, B2C, and B2G transactions View current and upcoming regulation → | | | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Compliance | [Invoicing compliance in Greece](/compliance/greece)
[Compliance timeline](/timelines/greece) | | Apps | [ILYDA Greece](/apps/ilyda-greece) | | Guides | [Supplier registration](/guides/gr-iapr-supplier)
[Issuing invoices](/guides/gr-iapr) | | FAQ | [Greece FAQ](/faq/greece) | | GOBL | [Greece Tax Regime](https://docs.gobl.org/regimes/gr)
[Greece myDATA addon](https://docs.gobl.org/addons/gr-mydata-v1) |
## Executive summary Greece mandates e-reporting through the **myDATA** (My Digital Accounting and Tax Application) platform, managed by the Independent Authority for Public Revenue (IAPR). This system requires businesses to report invoices and accounting data in real time, ensuring compliance with Greek tax regulations and enabling automatic generation of electronic accounting books. Invopop has partnered with ILYDA to issue invoices in Greece. Each supplier must be registered with ILYDA to issue invoices on their behalf. Mandatory B2B e-invoicing arrives in February 2026 for companies with revenues over €1 million, and in October 2026 for everyone else — see the [regulation timeline](/timelines/greece) for details. Greece's e-invoicing system is based on the **EN 16931** standard with CIUS restrictions, requiring invoices in XML format. The system uses a hybrid infrastructure model combining public and private platforms, with centralized validation and tracking through myDATA. Invopop covers Greek invoicing through the ILYDA Greece app, as well as integrations with platforms like Stripe and Chargebee. This allows businesses to issue compliant EN 16931 invoices efficiently and manage white-label (B2B2B) operations. ## Invoicing in Greece The [myDATA](https://www.aade.gr/en/mydata) (My Digital Accounting and Tax Application) platform is Greece’s standardized electronic invoicing and bookkeeping system, managed by the Independent Authority for Public Revenue ([IAPR](https://www.aade.gr/en)). This system enables businesses to report invoices and accounting data in real time, ensuring compliance with Greek tax regulations. Starting in February 2026, companies with revenues exceeding €1 million in the 2023 fiscal year in Greece will be required to issue electronic invoices for the sale of goods and provision of services within the country, as well as for transactions with companies from third countries (outside the European Union). All other businesses will follow on October 1, 2026. Consult our [Greece's e-invoicing regulation timeline](/timelines/greece) for an overview of upcoming regulation in Greece. EN 16931 is the European standard that defines the semantic data model for electronic invoices. It establishes a common structure and set of data elements to ensure interoperability across countries, systems, and sectors within the EU. The standard allows implementations in syntaxes like UBL or CII. Its goal is to simplify cross-border trade, reduce administrative costs, and support the digital transformation of public and private procurement across Europe. | | | | -------------------- | --------------------------------------------------------------------- | | **Models** | B2C, B2B, B2G | | **Format** | EN 16931 + CIUS (XML) | | **Infrastructure** | Hybrid: public and private platforms | | **Model** | Centralized | | **Scope & Deadline** | February 2026 for companies > €1M, Oct 2026 for all other businesses. | | **Agency** | [IAPR](https://www.aade.gr/en) | | **Invopop Support** | [ILYDA Greece App](/apps/ilyda-greece) | Get covered in Greece → ## E-reporting E-reporting is the mandatory electronic submission of invoice data to tax authorities, usually in real time, for compliance and audit purposes. This enables tax administrations to monitor transactions and ensure VAT control as part of broader continuous transaction control (CTC) systems. All companies resident in Greece (or in any event subject to local accounting requirements) have to comply with the system, with no threshold foreseen. The taxable person with a turnover of less than EUR 50,000 or issuing less than 50 invoices per year will be able to use a special data entry form, which allows them to manually upload invoice data on the myDATA web portal. myDATA is Greece's real-time electronic invoicing and reporting platform that digitizes accounting data for B2G, B2B, and B2C transactions. Companies must send transaction and accounting data to myDATA, which validates it and assigns a unique identifier (MARK). The system automatically generates electronic accounting books (a detailed book and a summary book) and is crucial for tax compliance. | | | | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Format** | EN 16931 + CIUS (XML) | | **Scope & deadline** | myDATA reporting was phased in from 2021; since January 1, 2024, all companies must declare their sales invoices in real time, uploading tax transactions and delivery notes to myDATA. | | **Invopop support** | [ILYDA Greece App](/apps/ilyda-greece) | Get covered in Greece → ## Regulation The main eInvoice process flow scenario for public procurement is the following: 1. Preparation of eInvoice data by the supplier/contractor and transmission to an eInvoicing service provider. 2. The eInvoicing service provider validates invoice data before submitting it, using the respective Interoperability Centre services. 3. The eInvoicing service provider reports and registers the eInvoice, for taxation reasons, to the myDATA application, a digital financial information application for taxation operated by the Independent Authority of Public Revenue in Greece. 4. The eInvoicing service provider prepares the eInvoice based on the European standard semantic model, the national specification that derives from the Joint Ministerial Decisions, and the Peppol Business Interoperability Specification. 5. The eInvoicing service provider submits the eInvoice to the access point of the Interoperability Centre through the Peppol network. 6. The Interoperability Centre receives and validates the eInvoice, according to the European and national rules for eInvoicing, 7. The Interoperability Centre routes the eInvoice to the competent contracting authority or competent IT system of the public body, 8. The competent contracting authority and financial service handle the invoice according to their internal procurement and payment practices using one of the IT systems or web application mentioned in the previous section. The competent authorities send the appropriate messages regarding the status of the processing of the eInvoice through the Interoperability Centre and the eInvoicing service providers to the supplier/contractor. Greece requires archiving invoices during 5 years. Invopop has partnered with ILYDA to issue invoices in Greece. Each supplier must be registered with ILYDA to issue invoices on their behalf. This involves: * Authorizing ILYDA as an electronic invoicing provider in Taxisnet. * Declaring ILYDA as invoice issuer in myDATA. * Signing a service provision agreement with ILYDA. * Please contact us via Slack or [support@invopop.com](mailto:support@invopop.com) whenever you need to onboard a new supplier. We will walk you through the process. Supplier registration is only possible in production. In the sandbox environment, your invoices must use a supplier with the tax ID code set to `177472438` which is the TIN of the test supplier pre-enabled in that environment. ## FAQ **Compliance questions** Greece B2G has been mandatory since 2023 (phased in by company size). B2B reporting through myDATA has been mandatory for all transactions since 2021. Full structured B2B e-invoicing is being phased in following EU ViDA timelines. Any entity with a Greek AFM (tax ID) registered with the IAPR. Foreign businesses operating in Greece need a Greek fiscal representative or a non-resident AFM. Recipients must classify each received invoice in myDATA (καταχώρηση) within the deadline matching their books. Standard archival is 5 years. Monthly or quarterly VAT (Φ2) declarations, plus the annual VAT clearing return (Φ1). Withholding taxes have their own schedule. myDATA classification of issued and received invoices is continuous and feeds the periodic returns. Greece's myDATA system uses a detailed set of invoice type codes that classify every transaction reported to the tax authority (IAPR). Each type has a numeric code (like `1.1` or `11.1`) and describes the nature of the transaction — whether it's a standard sale, a service, a credit note, a retail receipt, and so on. When using GOBL, many of these types are assigned automatically based on the invoice type and tags you set. For the rest, you can set the `gr-mydata-invoice-type` extension directly in the tax section of your invoice, using type `other`. ### Sales Invoices (1.x) | Code | Description | GOBL Type | Tags | | ----- | ------------------------------------------------------------- | ---------- | ----------------------- | | `1.1` | Sales Invoice | `standard` | `goods` | | `1.2` | Sales Invoice / Intra-community Supplies | `standard` | `goods`, `export`, `eu` | | `1.3` | Sales Invoice / Third Country Supplies | `standard` | `goods`, `export` | | `1.4` | Sales Invoice / Sale on Behalf of Third Parties | `standard` | `goods`, `self-billed` | | `1.5` | Sales Invoice / Clearance of Sales on Behalf of Third Parties | `other` | — | | `1.6` | Sales Invoice / Supplemental Accounting Source Document | `other` | — | ### Service Invoices (2.x) | Code | Description | GOBL Type | Tags | | ----- | ------------------------------------------------------------------ | ---------- | -------------------------- | | `2.1` | Service Rendered Invoice | `standard` | *(default)* or `services` | | `2.2` | Intra-community Service Rendered Invoice | `standard` | `services`, `export`, `eu` | | `2.3` | Third Country Service Rendered Invoice | `standard` | `services`, `export` | | `2.4` | Service Rendered Invoice / Supplemental Accounting Source Document | `other` | — | ### Credit Invoices (5.x) | Code | Description | GOBL Type | Tags | | ----- | ------------------------------- | ------------- | ---- | | `5.1` | Credit Invoice / Associated | `credit-note` | — | | `5.2` | Credit Invoice / Non-Associated | `other` | — | ### Retail / Simplified (11.x) | Code | Description | GOBL Type | Tags | | ------ | ----------------------------------------------- | ------------- | ------------------------------------ | | `11.1` | Retail Sales Receipt (ΑΛΠ) | `standard` | `goods`, `simplified` | | `11.2` | Service Rendered Receipt (ΑΠΥ) | `standard` | `services`, `simplified` | | `11.3` | Simplified Invoice | `standard` | `simplified` | | `11.4` | Retail Sales Credit Note | `credit-note` | `simplified` | | `11.5` | Retail Sales Receipt on Behalf of Third Parties | `standard` | `goods`, `simplified`, `self-billed` | Additional codes exist for proof of expenditure (3.x), self-delivery / self-supply (6.x), contracts and rents (7.x, 8.x, 15.x, 16.x), expense / purchase records (13.x, 14.x), and accounting entries (17.x). Greek regulation does not allow two myDATA providers to operate simultaneously for the same VAT number. If your business currently uses a different provider, you will need to switch to Invopop's provider (ILYDA) before issuing invoices through the platform. The regulatory restriction applies to simultaneous use of multiple providers, not to changing from one to another. See the [myDATA supplier registration guide](/guides/gr-iapr-supplier) for details on the onboarding process, or contact us via Slack or [support@invopop.com](mailto:support@invopop.com). Each AFM can have only one active myDATA provider at a time — switching providers requires deregistering the previous one in Taxisnet. The supplier must also declare its issuance branch (κλειδί χρήστη) and issuance series (σειρά). Recipients must classify (χαρακτηρισμός) every issued invoice that lists them as counterpart, by the periodic return deadline. Failure to classify exposes the recipient to fines and discrepancies in IAPR's automated VAT reconciliation. Continuous: every issued invoice transmitted in real time, every received invoice classified. Supplementary monthly/quarterly aggregations (e.g., E3 income statements) reconcile to myDATA totals automatically — discrepancies trigger IAPR queries. More answers in our [Greece FAQ](/faq/greece) section *** Ask and answer questions about Greece's regulation → # Invoicing compliance in Hungary Source: https://docs.invopop.com/compliance/hungary Integration in progress ## Current status In active development, coming soon. For inquiries about Hungary, contact us at [support@invopop.com](mailto:support@invopop.com). *** Ask and answer questions about Hungary's regulation → # Invoicing compliance in Italy Source: https://docs.invopop.com/compliance/italy Italy's mandatory e-invoicing requirements, FatturaPA and Documento Commerciale implementation, and e-reporting obligations for B2B, B2C, and B2G transactions View current and upcoming regulation → | | | | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Compliance | [Invoicing compliance in Italy](/compliance/italy)
[Compliance timeline](/timelines/italy) | | Apps | [SDI Italy](/apps/sdi-italy)
[Smart Receipts Italy](/apps/smart-receipts-italy) | | Guides | [SDI sending guide](/guides/it-sdi-sending)
[SDI receiving guide](/guides/it-sdi-receiving)
[Smart Receipts supplier registration](/guides/it-ticket-supplier)
[Smart Receipts issuing guide](/guides/it-ticket) | | FAQ | [Italy FAQ](/faq/italy) | | GOBL | [Italy Tax Regime](https://docs.gobl.org/regimes/it)
[Italy SDI FatturaPA Addon](https://docs.gobl.org/addons/it-sdi-v1)
[Italy AdE Ticket Addon](https://docs.gobl.org/addons/it-ticket-v1) | | GitHub | [gobl.fatturapa](https://github.com/invopop/gobl.fatturapa) |
## Executive summary Italy mandates electronic invoicing for all businesses through the **Sistema di Interscambio (SDI)**, the government's central hub for transmitting, validating, and delivering electronic invoices. The system uses **FatturaPA**, a standardized XML format that ensures compliance with validation rules set by the Italian tax authority (Agenzia delle Entrate). **B2B and B2G transactions** must be issued through SDI using the FatturaPA format. **B2C transactions** have two options: they can use the **Documento Commerciale** (a digital fiscal receipt that transmits sales data directly to the tax authority) or route through SDI—though the SDI option still requires the customer's tax information in the FatturaPA format. SDI uses a Recipient Code—a seven-digit alphanumeric identifier—to route invoices to the correct recipient. For B2G transactions, invoices must also include a Unique Code (IPA code) to identify the specific government agency office. The system provides real-time validation and delivery confirmation. Italy's e-reporting system is embedded within its mandatory electronic invoicing regime. All issued invoices and receipts are forwarded to the AdE, giving tax authorities immediate visibility of every transaction. Invopop simplifies SDI integration by allowing you to work with [GOBL](https://docs.gobl.org) format instead of XML, providing synchronous validation before submission, and offering a simple API integration with automatic handling of SDI notifications and status updates. Invopop covers Italy through dedicated apps for [SDI Italy](/apps/sdi-italy) and [Smart Receipts Italy](/apps/smart-receipts-italy), as well as integrations with platforms like [Stripe](/apps/stripe) and [Chargebee](/apps/chargebee). ## Invoicing in Italy FatturaPA is the Italian standard for electronic invoicing. It is an XML-based format that is used to issue and receive invoices. | | | | -------------------- | ---------------------------------------------------------- | | **Models** | B2B, B2G | | **Format** | FatturaPA (XML) | | **Infrastructure** | SDI | | **Model** | Clearance | | **Scope & Deadline** | B2G mandatory since 2015; all B2B since 1 January 2019 | | **Agency** | [Agenzia delle Entrate](https://www.agenziaentrate.gov.it) | | **Invopop support** | [SDI Italy App](/apps/sdi-italy) | Connect the app to get you covered → The **Documento Commerciale** is a digital fiscal document that records sales transactions and transmits them to the Agenzia delle Entrate (AdE). This digital receipt replaces traditional paper receipts while maintaining full fiscal compliance and serves as official proof of purchase for your customers. Italian law requires businesses to transmit sales data digitally through either a certified Registratore Telematico (RT) or the AdE’s online portal. | | | | -------------------- | ---------------------------------------------------------------- | | **Models** | B2C | | **Format** | Documento Commerciale (XML) | | **Infrastructure** | Agenzia delle Entrate (AdE) | | **Model** | Clearance | | **Scope & Deadline** | Mandatory for retail (B2C) sales since 2019 (telematic receipts) | | **Agency** | [Agenzia delle Entrate](https://www.agenziaentrate.gov.it) | | **Invopop support** | [Smart Receipts Italy App](/apps/smart-receipts-italy) | Connect the app to get you covered → ## E-reporting Italy operates a full real-time e-reporting system embedded within its mandatory electronic invoicing regime. All B2B, B2C, and B2G invoices are issued in FatturaPA XML and transmitted through the Sistema di Interscambio (SdI), which forwards data directly to the Agenzia delle Entrate, giving tax authorities immediate visibility of every transaction. Retail sales are covered through the *documento commerciale*, whose daily totals are automatically sent by certified cash registers. Since July 2022, cross-border transactions must be reported via SdI using special invoice types (TD17–TD19), completing Italy’s real-time coverage of domestic and foreign sales. If you are issuing FatturaPA invoices and Documento Commerciale receipts, you are already covered by the e-reporting system. ## Regulation **Complete (B2B) Invoice** Mandatory information for electronic invoices includes: * Invoice issue date * Unique, sequential invoice number * Issuer data (i.e., company, business, or trading name; first and last name; residence or domicile) * Customer data (i.e., company, business, or trading name; first and last name; residence or domicile) * Customer’s VAT identification number or, in the case of a taxable person established in another EU member state, the VAT identification number issued by that state * Description, quantity, and price of the goods or services involved in the transaction * Date on which the goods or services were supplied * Date on which payment was made, if different from the invoice date * VAT rate and taxable amount * Recipient code (i.e., a seven-digit, alphanumeric identifier used to ensure the proper delivery of an electronic invoice to a business or professional) **Simplified Invoice** * Invoice issue date * Unique, sequential invoice number * Issuer data (i.e., company, business, or trading name; first and last name; residence or domicile) * VAT number * Customer information (i.e., first and last name, address, and tax code, as this is an individual without a VAT number) * Description, quantity, and price of the goods or services involved in the transaction * Date on which the goods or services were provided * Date of payment, if different from the invoice date * VAT rate and taxable amount * The code “0000000” in the beneficiary code field **B2G Invoice** In addition to the above, B2G invoices must include the following: * **Unique code**
This is a six-character, alphanumeric code that uniquely identifies a specific government agency and ensures the e-invoice is routed correctly. A single public entity can have multiple unique codes, each assigned to a different office within the organisation. It’s also known as a “unique office code” or “IPA code” (referring to the Index of Public Administrations \[IPA]). The unique code is mandatory. * **CIG code**
This is a 10-digit, alphanumeric code used to identify an offer. It must be indicated on the invoice, unless an exemption from the traceability requirement applies, as provided for by Law No. 136 of 13 August 2010. * **CUP code**
This is a 15-character, alphanumeric code that identifies a public investment project. It should only be entered if specifically requested by the company.
Italy has strict rules for storing electronic invoices. Businesses must: **Storage requirements:** * Keep e-invoice records for at least 10 years from the last entry * Ensure invoices cannot be changed during this time * Group invoices into digital archive packages with a digital signature and timestamp **Administrative requirements:** * Designate a Conservation Manager (someone responsible for managing the archives) * Create a Conservation Manual (a document explaining how records are stored) **Deadline:** * Complete the archiving process within three months after the annual income tax return is due 1. VAT * Standard: 22% * Reduced: 10% * Reduced(2): 5% * Super-reduced: 4% * Zero: 0% 2. IRPEF (Income tax) * Up to €28,000: 23% * €28,001–50,000 (incl. first bracket): 35%. * Above €50,001: 43%. 3. IRES (Corporate Income Tax) * 24% 4. INPS (National Social Security Institute) * 9.19% on the income up to a ceiling of €55,448 of income * 10.19% on the excess above the maximum amount. 5. ENASARCO (Contribution to the National Welfare Board for Sales Agents and Representatives) 6. Other Social Security Contributions The **Imposta di Bollo** (stamp duty), commonly known as *Marca da Bollo*, is a fixed **€2.00** tax applied to invoices that are **exempt from VAT** and whose total exceeds **€77.47**. It is essentially an alternative to VAT: when VAT is not charged, the stamp duty applies instead. Invoices that include VAT, or that fall below the €77.47 threshold, are not subject to stamp duty. In the FatturaPA XML sent through SDI, stamp duty is represented via the `` block, with `` set to `SI` and `` indicating the amount. In GOBL, this is modeled as a document-level charge with `"key": "stamp-duty"` — see our [stamp duty invoice example](/apps/sdi-italy#documents) for a working sample. There are two common configurations: the supplier can either **charge the €2 to the customer** (adding it to the invoice total) or **absorb the cost** themselves (the stamp duty is still declared but not passed on). Regardless of who bears the cost, payment is made **quarterly** via the F24 form, with the Agenzia delle Entrate providing a pre-filled draft based on the stamp duty amounts declared in submitted invoices. This is particularly relevant for taxpayers under the ***regime forfettario*** (flat-rate scheme), who do not charge VAT on their invoices. When their invoice total exceeds €77.47, the *Marca da Bollo* must be applied. Some transactions are exempt from stamp duty altogether, such as intra-Community supplies of goods.
## FAQ Compliance questions Italy 1 January 2019 for all B2B and B2C transactions between resident parties (B2G has been mandatory since 2014). 1 July 2022 extended the mandate to flat-rate scheme contributors. Cross-border B2B is reported via SDI (the esterometro was retired in 2022). Any entity with an Italian Partita IVA (VAT number) — companies, professionals, and flat-rate scheme contributors. Codice Fiscale alone is not sufficient for invoicing through SDI. All resident businesses must receive electronic invoices through SDI — it's the only legal channel. Invoices must be archived in their structured FatturaPA XML form for 10 years. Quarterly VAT (LIPE), annual VAT return (Modello IVA), Esterometro (cross-border B2B summary, replaced by SDI direct submission since 2022), and Modello 730/Redditi for personal returns. SDI clearance handles the per-invoice reporting layer. SDI Yes, electronic invoicing through SDI is mandatory in Italy for B2G, B2B, and B2C transactions. All invoices must be issued in FatturaPA format and transmitted through the SDI (*Sistema di Interscambio*) platform. There are two main ways to correct an invoice in the Italian SDI system: 1. Issue a credit note (Nota di Credito - TD04) to fully or partially cancel the original invoice. 2. Issue a debit note (Nota di Debito - TD05) to integrate/correct the original invoice with additional charges. The corrective document must reference the original invoice number and date. The supplier must have an active Partita IVA registered with the Agenzia delle Entrate. Invopop acts as the supplier's intermediary (intermediario fiscale) — no individual supplier certificate is required. Recipients must register a Codice Destinatario (recipient code) with the Agenzia delle Entrate. Once registered, all incoming invoices route through SDI to the registered intermediary. Archival in original XML for 10 years. Smart Receipts For B2C transactions where the customer's Codice Fiscale or Partita IVA is unknown — typical retail or online checkouts. AdE CF generates a Documento Commerciale (commercial receipt) instead of a FatturaPA. Once the customer's tax ID is known, regular SDI invoicing must be used. The supplier must have a Partita IVA and operate in a sector that issues commercial receipts (retail, hospitality, etc.). They need to register with Agenzia delle Entrate as an AdE CF issuer before going live. Each documento commerciale is transmitted in real time through the AdE CF service; the Agenzia delle Entrate derives daily corrispettivi totals automatically, replacing the historical *registratore di cassa* daily total. More available in our [Italy FAQ](/faq/italy) section *** Ask and answer questions about Italy's regulation → # Invoicing compliance in Malaysia Source: https://docs.invopop.com/compliance/malaysia Malaysia's e-invoicing and e-reporting obligations for consumer, business and government transactions Invopop support for Malaysia is coming soon (Peppol Malaysia). For inquiries, contact us at [support@invopop.com](mailto:support@invopop.com). *** Ask and answer questions about Malaysia's regulation → # Invoicing compliance in Mexico Source: https://docs.invopop.com/compliance/mexico SAT CFDI implementation and compliance for B2B, B2C, and B2G transactions View current and upcoming regulation → | | | | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Compliance | [Invoicing compliance in Mexico](/compliance/mexico)
[Compliance timeline](/timelines/mexico) | | Apps | [SAT Mexico](/apps/sat-mexico)
[SW Sapien](/apps/sw-sapien)
[Cron](/apps/cron) | | Guides | [Supplier registration](/guides/mx-sat-supplier)
[Issuing documents](/guides/mx-sat-issuing)
[Receiving invoices](/guides/mx-sat-receiving) | | FAQ | [Mexico FAQ](/faq/mexico) | | GOBL | [Mexico Tax Regime](https://docs.gobl.org/regimes/mx)
[Mexican SAT CFDI Addon](https://docs.gobl.org/addons/mx-cfdi-v4) | | GitHub | [gobl.cfdi](https://github.com/invopop/gobl.cfdi) |
## Executive summary Mexico mandates electronic invoicing through the **CFDI** (Comprobante Fiscal Digital por Internet) system, managed by the **SAT** (Servicio de Administración Tributaria). All taxpayers must issue electronic invoices in XML format. The system uses a clearance model: invoices must be validated and certified by an authorized certification provider (PAC) before they acquire fiscal effect, and SAT receives the certified document in real time. This continuous feed gives SAT visibility into every transaction in the economy, and is the basis for automated VAT reconciliation, pre-filled returns, and audit-by-data. CFDI 4.0 is the current schema version and applies to B2B, B2C, and B2G transactions equally. | | | | ------------------- | -------------------------------------------------- | | **Scope** | B2B, B2C, B2G | | **Format** | CFDI 4.0 (XML) | | **Infrastructure** | PAC → SAT | | **Clearance model** | Real-time stamping (timbrado) before fiscal effect | | **Agency** | [SAT](https://sat.gob.mx) | | **Invopop addon** | [SAT Mexico App](/apps/sat-mexico) | | **PAC** | [SW Sapien](/apps/sw-sapien) | Issue CFDI documents in Mexico → ## The SAT CFDI system SAT is the tax agency in Mexico, CFDI is the invoice format required by SAT. It is an XML document that must be sealed with the issuer's Certificado de Sello Digital (CSD), submitted to a PAC for validation, and stamped by SAT through that PAC. The result is a CFDI with a fiscal folio (UUID) and a SAT digital seal. Without those, the document has no fiscal effect. There are six CFDI document types: | Type | Code | Description | Invopop coverage | | ---------------------------------- | ---- | ------------------------------------------------------------------------------------- | :--------------: | | Ingreso | `I` | Standard sales invoice. | Yes | | Egreso | `E` | Credit note (returns, discounts, post-sale adjustments). | Yes | | Pago | `P` | Payment receipt (REP) issued when collecting against a previously-issued PPD invoice. | Yes | | Nómina | `N` | Payroll receipt, one per employee per pay period. | No | | Traslado | `T` | Movement of goods without a sale (carries the Carta Porte complement for transport). | No | | Retenciones e Información de Pagos | `R` | Withholding declaration, uses a separate XSD schema. | No | On top of this base structure, SAT publishes **complementos** — sector-specific XML extension nodes that attach to the CFDI and are sealed under the same digital signature. Each *complemento* has its own XSD and lifecycle. The most relevant ones include Pago (mandatory for any deferred or installment invoice), Carta Porte (mandatory for most freight movements), Comercio Exterior 2.0 (exports), Nómina (payroll detail), Hidrocarburos y Petrolíferos (energy sector, mandatory since 2026), Donatarias (authorized non-profits), INE (electoral expenses), IEDU (private education), and Divisas (currency exchange operations). ### Invopop CFDI support Coverage of the Mexican CFDI ecosystem evolves continuously, and this scope reflects what the SAT Mexico app supports today. We work closely with our customers and partners to expand it: **Document types** | Type | Description | | ------- | --------------------------------------------------------------------------------------------------- | | Ingreso | Standard B2B and B2C sales invoices. | | Egreso | Credit notes for returns, discounts, and corrections. | | Pago | Payment receipts (REP / comprobante de pago) issued as payments are collected against PPD invoices. | **Method of payment** | Code | Description | | ----- | ---------------------------------------------------------------------- | | `PUE` | Pago en Una sola Exhibición (single up-front payment) | | `PPD` | Pago en Parcialidades o Diferido (payment in installments or deferred) | `FormaPago` is validated against the `c_FormaPago` catalog. **Relationships** | Code | Description | | ---- | ------------------------------------------------------ | | `01` | Nota de crédito (credit note) | | `02` | Nota de débito (debit note) | | `03` | Devolución de mercancía (return) | | `04` | Sustitución (substitution) | | `05` | Traslados de mercancías (transport of goods) | | `06` | Factura por traslados previos (previously-moved goods) | | `07` | Anticipo (advance) | **Accounts payable** Convert received CFDI XML documents into GOBL format for accounts payable processing. Pairs with the SW Sapien app for bulk download from SAT. Bulk download CFDI documents from the SAT → **Special invoice modes** | Mode | Description | | ------------------- | --------------------------------------------------------------------------------------------------------------------------- | | CFDI Globales | Público-en-general aggregation, with periodicity (daily, weekly, biweekly, monthly, bimonthly), month, and year extensions. | | Third-party sales | Vendido a terceros via the `seller` object on individual lines. | | White-label / B2B2B | Invopop can issue invoices on behalf of multiple suppliers under a single platform, each with their own CSD. | **Operational** | Capability | Description | | ------------------- | ---------------------------------------------------------------------------------------------------------------------- | | PAC integration | Through [SW Sapien](https://sw.com.mx), including supplier onboarding (CSD upload, e.firma authorization for the PAC). | | Stamping | Timbrado and retrieval of the certified XML. | | PDF generation | Includes QR and CFDI stamps. Configurable layout, locale, and currency/date format. | | Sandbox environment | Register your own or any test CSDs for testing. | If your operation requires a document type, complemento, or workflow that isn't currently covered, get in touch. Many of these requests already align with our roadmap, and we prioritize new development based on customer volume and demand. **Document types** | Type | Description | | ----------- | ----------------------------------------------------------- | | Nómina | Payroll receipts. | | Traslado | Standalone transfer documents. | | Retenciones | Uses a different XSD; not part of the CFDI 4.0 base schema. | **Complementos** | Complemento | Description | | ---------------------------- | ----------------------------------------------------------------------------------------------------------- | | Carta Porte | Required for in-country freight movement. | | Comercio Exterior 2.0 | Required for definitive exports. | | Hidrocarburos y Petrolíferos | Mandatory for the energy sector since 2026. | | Sector-specific complementos | Donatarias, INE, IEDU, Divisas, Detallista, Servicios Parciales de Construcción, Aerolíneas, Notarios, etc. | **Other unsupported features** | Item | Description | | --------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Addendas | Proprietary B2B XML extensions defined by individual buyers (Walmart, Liverpool, Pemex, automotive OEMs, etc.). Each is buyer-specific and not standardized by SAT. | | Cancellation flow | Submission of cancellation requests with `MotivoCancelacion` codes is not currently exposed through the app. Cancellations must be handled directly with SAT or through the PAC's portal. | | Real-time data access | For digital platforms under the May 2026 Article 30-B obligation. Separate reporting channel, not a CFDI flow. | | Buzón Tributario | Monitoring or interaction. | | Lista 69-B | Screening of counterparties. | | Contabilidad electrónica and DIOT | Periodic informational filings. | ### CFDI document types Each document type has its own schema and business rules for how it relates to other documents in accounting. The standard invoice for any taxable sale of goods, provision of services, leasing, or activity that generates income. Must comply with Article 29-A of the CFF: issuer and receiver RFC, name, régimen fiscal, postal code, line-level description, unit value, totals, transferred and withheld taxes, payment method and form, and UsoCFDI declared by the receiver. The Ingreso CFDI is the document that triggers the obligation. Whether the cash event is recognized at the same time depends on the `MetodoPago` attribute (PUE vs PPD). Used to reduce previously-invoiced income: returns, post-sale discounts, rebates, corrections, partial cancellations, and the application of advance payments. Always relates back to one or more Ingreso CFDIs through the `CfdiRelacionados` node. Common `TipoRelacion` codes for Egresos: * `01` — Nota de crédito de los documentos relacionados. * `02` — Nota de débito de los documentos relacionados. * `03` — Devolución de mercancía sobre facturas o traslados previos. * `07` — CFDI por aplicación de anticipo. An Egreso does not by itself cancel the original CFDI. Cancellation is a separate action governed by the cancellation rules below. A CFDI of type P is required whenever a payment is collected against an invoice that was issued with `MetodoPago = PPD`. The Pago complement carries the actual payment date, currency, exchange rate, form of payment, and a list of `DoctoRelacionado` nodes referencing each invoice the payment applies to, with the partial amount, the running balance before and after, and the partiality number. A single REP can settle payments against multiple invoices. A single invoice paid in installments produces multiple REPs over time. **Deadline:** the REP must be issued no later than the fifth calendar day of the month following the one in which the payment was received (rule 2.7.1.35 of the RMF). **Invopop coverage:** Invopop issues type-P documents. Model the receipt as a GOBL [`bill.Payment`](https://docs.gobl.org/draft-0/bill/payment) referencing each PPD invoice being settled, and process it through the SAT payment workflow to stamp the CFDI de pago. See the [payment receipt example](/guides/mx-sat-issuing) in the issuing guide. A CFDI carrying the Nómina complement, issued for every payment of salaries, wages, and assimilated remuneration. One per employee per pay period. Used when goods are moved without a sale (between warehouses, returns to suppliers, gratuitous transfers). For a Traslado document, `SubTotal` and `Total` must be zero. In nearly all real-world cases, a Traslado must carry the **Carta Porte** complement describing the route, transport mode, vehicle, operator, and goods. A separate document family with its own XSD, used to declare withholdings on payments to foreign residents, dividends, interest, leasing payments, share dispositions, and certain financial instruments. ### CFDI complement types Extra blocks of information that attach to a CFDI when the operation falls under a specific sector or activity. When a complement is required, the invoice cannot be stamped without it. Mandatory complement for the transport of goods within Mexico by road, rail, sea, or air. Carries the route (origin and destination), transport mode, vehicle and trailer plates, the operator's identification, and a detailed manifest of the goods being moved including weight and hazardous-material classification where applicable. Attaches to a Traslado (type T) when a company moves its own goods, or to an Ingreso (type I) when invoicing a transport service to a third party. Currently at version 3.x with separate sub-schemas per transport mode (Autotransporte, FerroviarioTransporte, TransporteMaritimo, TransporteAereo). Required for definitive exports involving the sale of goods (typically clave de pedimento A1). Captures the issuer's and receiver's full addresses, the foreign tax ID of the receiver, INCOTERMS, currency and exchange rate to USD, and per-line detail including harmonized tariff codes (fracciones arancelarias), customs unit of measure, and the USD value of the goods. Version 2.0 has been integrated with CFDI 4.0 since January 2024. Free-of-charge exports use the same complement on a Traslado document. Mandatory complement for the energy sector since 2026. Applies to taxpayers commercializing hydrocarbons or refined petroleum products and is intended to give SAT real-time traceability over fuel flows. Carries the SAT-issued permit type and number, validated against the `c_TipoPermiso` catalog. Revision A (April 2026) added new permit types for commercialization activities along with their specific format structures and validation regular expressions. For non-profits authorized by SAT to issue tax-deductible donation receipts (donatarias autorizadas). Carries the SAT authorization office number and the date of the official authorization or its most recent ratification published in the DOF. Without this complement on the CFDI, the donation cannot be deducted by the donor. Used by political parties, candidates, and associations subject to the Instituto Nacional Electoral's reporting obligations. Identifies the type of process (ordinary, pre-campaign, campaign), the scope (federal, local), and the entity for which the spending was made. Allows INE to reconcile electoral expense declarations against actual invoiced spending. Required for invoices issued by private educational institutions for tuition payments (colegiaturas) eligible for personal income tax deduction. Captures the student's CURP, the educational level (preescolar, primaria, secundaria, profesional técnico, bachillerato), the official authorization number (RVOE), and the school's RFC. Annual deduction caps apply per educational level. Used by exchange houses (casas de cambio) and authorized financial institutions reporting foreign currency exchange operations. Identifies the operation type (purchase or sale of foreign currency) for fiscal reporting. The payment receipt complement attached to type-P documents (REPs). Carries the payment date, currency, exchange rate to MXN, and form of payment, plus a list of `DoctoRelacionado` nodes — one per invoice the payment applies to — with the original invoice's UUID, the partial amount being settled, the partiality number, and the running balance before and after. A single Pago complement can settle multiple invoices, and a single PPD invoice can accumulate multiple Pago complements over time as installments are paid. The payroll detail complement attached to type-N documents. Issued one per employee per pay period. Captures the employee's identification (RFC, CURP, NSS), employment data (start date, contract type, working day type, salary base), the period covered, and a full breakdown of perceptions (regular salary, overtime, bonuses, vacation premium, profit sharing) and deductions (ISR withholding, IMSS contributions, loan repayments, alimony). Also includes settlement payments for terminations and other special payment scenarios. ### CFDI payment types Mexican invoices declare upfront whether the customer is paying at issuance or paying later. The choice determines whether a follow-up payment receipt (REP) must be issued, and it changes when income tax and VAT are recognized. The operation is settled in full at or before invoice issuance, or when payment will be received with certainty by the last calendar day of the month in which the invoice is issued. PUE invoices declare the payment method (transfer, credit card, cash, etc.) and require no follow-up document. For tax effects, income is recognized at issuance. If a CFDI was issued as PUE but the customer fails to pay by the last day of the issuance month, the issuer must: 1. Cancel the original PUE invoice (motivo 01, with substitution). 2. Issue a new CFDI as PPD with `FormaPago = 99`, related to the original via `TipoRelacion = 04` (Sustitución de los CFDI previos). 3. Issue REPs as payments are subsequently received. A difference to observe in relation to other regimes is that the trigger is calendar-based, not payment-event-based. The conservative approach is to issue PPD whenever there is any uncertainty about same-month payment. Use when payment will occur after the issuance month, or in two or more installments. PPD invoices must use `FormaPago = 99` (Por definir) on the original document, since the actual form of payment isn't yet known. For each payment received afterward, the issuer must produce a CFDI of type P (REP) referencing the original UUID, with the actual `FormaPago` of that specific payment, the partial amount, and the running balance. For tax effects, income is recognized as REPs are issued, on a cash basis. This is the mechanism that makes ISR and IVA recognition follow the actual cash event rather than the invoice issuance date — particularly relevant for RESICO contributors, whose entire tax base is computed from emitted CFDIs and REPs. Each REP must be issued by the fifth calendar day of the month following the one in which payment was received (rule 2.7.1.35 RMF). Missing the deadline doesn't invalidate the invoice but prevents the customer from deducting in the correct period. Invopop supports issuing both the PPD invoice and the subsequent REPs as payments are received. ### Party identification and reporting PACs validate the receiver's RFC, name, fiscal régimen, and postal code against the live SAT registry at stamping time. All four must agree. The source document is the receiver's **Constancia de Situación Fiscal (CIF)**. Note that requiring the CIF document itself as a precondition for invoicing is unlawful (Article 83 § IX CFF) — the issuer needs the four data points, not the document. **Persona Física (13 characters)** Issued to individuals. Structure: 4 letters from the person's first surname, second surname, and first name + 6 digits for date of birth (YYMMDD) + 3-character homoclave assigned by SAT. Example: `PEJL850315ABC` for Juan Pérez López born 15 March 1985. **Persona Moral (12 characters)** Issued to companies, associations, and other legal entities. Structure: 3 letters from the entity name + 6 digits for date of constitution (YYMMDD) + 3-character homoclave. The shorter length is the immediate visual cue distinguishing morales from físicas. **Generic RFCs** Predefined codes used when the receiver does not have a real RFC. * `XAXX010101000` — generic national. Used for público en general (Mexican consumers who don't request invoices) and for nationals not yet registered with SAT. * `XEXX010101000` — generic foreign. Used for receivers without Mexican fiscal residence. For both generic RFCs: * `RegimenFiscalReceptor` must be `616` (Sin obligaciones fiscales). * `UsoCFDI` must be `S01` (Sin efectos fiscales). The CFDI is not deductible. * `DomicilioFiscalReceptor` must equal `LugarExpedicion`. * For `XEXX010101000`, the receiver's country code (per `c_Pais`) and foreign tax ID should be supplied where available. Mexico uses standard postal codes, but CFDI 4.0 enforces three different fields with different rules. There is no separate "fiscal postal code" — it is the same postal code, validated against SAT's `c_CodigoPostal` catalog (Anexo 20) and against the receiver's CIF. **LugarExpedicion (issuer)** Postal code of the physical location where the document is issued (`mx-cfdi-issue-place` in GOBL). If invoiced from a branch, use the branch's postal code regardless of where the billing system is hosted. Drives the document's time zone (Mexico has eight) and the fiscal stimulus zone flag (border-zone IVA reduction). **DomicilioFiscalReceptor (receiver)** Postal code of the receiver's tax domicile. For real RFCs, this must match what SAT has on file. A mismatch causes the PAC to reject stamping. For generic RFCs (`XAXX010101000`, `XEXX010101000`), this field must equal `LugarExpedicion`. **Catalog gaps** SAT's `c_CodigoPostal` catalog is updated periodically (multiple times in 2026 alone) and does not always contain every postal code in active use. When the receiver's postal code is not in the catalog, SAT's filling guide instructs the issuer to register the closest catalog code from the place of issuance. This is one of the most common causes of stamping failures during new customer onboarding. Each issuer and receiver must declare a `RegimenFiscal` from the `c_RegimenFiscal` catalog. The catalog distinguishes regimes available to parties. The receiver's régimen also constrains which `UsoCFDI` codes are valid for that invoice — not all combinations are allowed. The full catalog (all supported by Invopop): | Code | Description | | ----- | ------------------------------------------------------------------------------------------ | | `601` | General de Ley Personas Morales | | `603` | Personas Morales con Fines no Lucrativos | | `605` | Sueldos y Salarios e Ingresos Asimilados a Salarios | | `606` | Arrendamiento | | `607` | Régimen de Enajenación o Adquisición de Bienes | | `608` | Demás ingresos | | `610` | Residentes en el Extranjero sin Establecimiento Permanente en México | | `611` | Ingresos por Dividendos (socios y accionistas) | | `612` | Personas Físicas con Actividades Empresariales y Profesionales | | `614` | Ingresos por intereses | | `615` | Régimen de los ingresos por obtención de premios | | `616` | Sin obligaciones fiscales (generic RFCs only) | | `620` | Sociedades Cooperativas de Producción que optan por diferir sus ingresos | | `621` | Incorporación Fiscal (legacy, being phased out) | | `622` | Actividades Agrícolas, Ganaderas, Silvícolas y Pesqueras | | `623` | Opcional para Grupos de Sociedades | | `624` | Coordinados | | `625` | Régimen de las Actividades Empresariales con ingresos a través de Plataformas Tecnológicas | | `626` | Régimen Simplificado de Confianza (RESICO) | The `UsoCFDI` field declares the receiver's intended fiscal treatment of the document. The most common codes: | Code | Description | | ----------- | ----------------------------------------------------------------------------------------------------------------------------------------- | | `G01` | Adquisición de mercancías | | `G02` | Devoluciones, descuentos o bonificaciones | | `G03` | Gastos en general | | `I01`–`I08` | Construcciones, mobiliario, transporte, cómputo, telecomunicaciones, otra maquinaria | | `D01`–`D10` | Personal deductions (medical, funeral, donations, mortgage interest, voluntary retirement, schooling). Available only to personas físicas | | `CP01` | Pagos. Used on REPs | | `CN01` | Nómina. Used on payroll CFDIs | | `S01` | Sin efectos fiscales. Used for non-deductible documents and globales | Validation: the chosen `UsoCFDI` must be allowed for the receiver's `RegimenFiscal`. Picking the wrong combination is one of the most frequent stamping errors. ### B2C aggregation reporting Retail-style operations that don't issue per-transaction invoices to consumers must issue a periodic **factura global** aggregating all operations with público en general. The `mx-cfdi-v4` addon supports this via the `global` invoice tag, with extensions for: | Field | Extension | Values | | ---------- | ----------------------- | -------------------------------------------------------------------- | | **Period** | `mx-cfdi-global-period` | daily (01), weekly (02), biweekly (03), monthly (04), bimonthly (05) | | **Month** | `mx-cfdi-global-month` | individual months 01–12 or paired months 13–18 | | **Year** | `mx-cfdi-global-year` | 4-digit year | The global is issued to `XAXX010101000` with régimen 616 and UsoCFDI S01. Purchases under MXN 100 are not required to be invoiced individually but must still be included in the global. In practice, many operations issue globals as the simpler path. ### Cancellations The issuer submits a cancellation request through SAT or a PAC, and the receiver has three business days to accept or reject the cancellation. If the receiver takes no action, the cancellation is accepted. **The customer can reject a cancellation** A CFDI is not cancelled by issuer action alone. If the three day deadline passes without response, the cancellation takes effect by positive ficta. If the receiver rejects, the CFDI remains valid. This means a wrongly-issued invoice can remain on the issuer's books if the customer rejects the cancellation. The practical workaround is to coordinate with the customer before submitting. The cancellation flow is not currently automated through the SAT Mexico app. Cancellations must be initiated through SAT directly. **Exceptions where acceptance is not required** Cancellation is immediate without receiver acceptance for: * CFDIs of type Egreso (E), Traslado (T), Retenciones (R), and Nómina (N). * CFDIs cancelled within one business day of issuance. * Operations with público en general (RFC `XAXX010101000`). * CFDIs received by foreign residents. * CFDIs with total value up to MXN 1,000 (with carve-outs for Pago, Hidrocarburos, and Carta Porte for fuels). * CFDIs issued by financial system members. **Cancellation reasons** Every cancellation must declare a reason: | Code | Description | | ---- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | | `01` | Comprobante emitido con errores con relación. The original is being replaced by a substitute CFDI; the substitute's UUID must be supplied. | | `02` | Comprobante emitido con errores sin relación. No replacement. | | `03` | No se llevó a cabo la operación. The transaction did not occur. | | `04` | Operación nominativa relacionada en una factura global. The operation was included in a previous global invoice; the global's UUID must be supplied. | Invopop doesn't currently support the substitution flow. We recommend issuing `02`(no replacement) and issuing a new invoice The correct sequence for replacing an erroneous CFDI: 1. Issue the new CFDI with `TipoRelacion = 04` (Sustitución de los CFDI previos), referencing the UUID of the document being replaced. 2. Submit the cancellation request for the original, motivo 01, referencing the new UUID. 3. The PAC validates whether receiver acceptance is required and routes accordingly. Note: while the original is referenced as substituted-by, it temporarily shows as "No cancelable." The cancellation request itself breaks the relation and moves it back to a cancellable state. Per Article 29-A § 4 of the CFF and rule 2.7.1.47 RMF, CFDIs must be cancelled by the last day of the month in which the annual ISR declaration for the issuance fiscal year is due: * Personas morales: 31 March of the following year. * Personas físicas: 30 April of the following year. The First Chamber of the Supreme Court ruled this time limit unconstitutional in April 2024 (press release 098/2024), but the rule remains in operation pending legislative change. ## Compliance From Article 29-A of the CFF and the Anexo 20 filling guide: * RFC, name, and régimen fiscal of the issuer. * RFC, name, régimen fiscal, and postal code of the receiver. * Folio fiscal (UUID) and SAT digital seal. * Issuer's CSD digital seal and the serial number of the certificate used. * Place and date of issuance (`LugarExpedicion`, `Fecha`). * UsoCFDI declared by the receiver. * Per-line: quantity, unit of measure (from `c_ClaveUnidad`), description, product/service code (from `c_ClaveProdServ`), unit value, taxes itemised by rate, withholdings where applicable. * `MetodoPago` (PUE/PPD) and `FormaPago` from `c_FormaPago`. * `Moneda` and `TipoCambio` for non-MXN invoices. * Pedimento number and date for first-hand sales of imported goods. * Certification date, time, and SAT certificate serial. The printed representation (PDF) must additionally include: 1. QR code as defined in section I.D of Anexo 20. 2. Serial numbers of the issuer's and SAT's CSDs. 3. The legend: "Este documento es una representación impresa de un CFDI." 4. Issuance and certification timestamps. 5. Original string (cadena original) of the SAT certification complement. Source: [SAT](https://www.sat.gob.mx/minisitio/Factura/solicita_requisitos.htm) Article 30 of the Federal Tax Code requires accounting records, including CFDIs, to be retained for five years. * The period starts from the date the relevant tax return was filed, or should have been. * For records covering a longer period, the five years run from the last fiscal year covered. * If records are part of an active legal case, the period starts when the final decision is issued. A PAC (Proveedor Autorizado de Certificación) is a private company licensed by SAT to validate, seal, and forward CFDIs on behalf of issuers. The PAC is the operational gateway: an unstamped CFDI has no fiscal effect. Invopop uses [SW Sapien](/apps/sw-sapien) as its PAC. Suppliers authorize the PAC once via e.firma (FIEL) sign-off, after which Invopop can issue CFDIs on their behalf using their CSD. CSD certificate generation remains the supplier's responsibility — Invopop does not generate CSDs but accepts the certificate and key during onboarding. The Buzón Tributario is the official electronic mailbox SAT uses to communicate with each contributor. Cancellation requests, audit notifications, formal requirements, and (since May 2026) real-time data demands flow through it. Every contributor must keep it active and monitored. Invopop does not interact with the Buzón. SAT publishes ongoing lists of taxpayers presumed to issue fake invoices (EFOS) and those who used them (EDOS). Invoices issued by an EFOS-listed supplier may be deemed non-deductible for the receiver. Companies routinely screen vendor masters against the list. Article 30-B of the CFF, introduced in the 2026 RMF, requires technology platforms (domestic and foreign) to provide SAT with continuous online access to tax and operational data, available no later than the day after each transaction. This applies to marketplaces, ride-hailing, lodging, food delivery, and digital service providers operating in Mexico. It is a separate reporting obligation from the CFDI flow. Invopop addresses this with [digital platform reporting](/guides/mx-sat-platform-reporting): register a platform, record each operation with the fields required by rule 2.9.21, and give SAT a private, access-controlled portal to browse, filter, and export them on demand. ## FAQ Compliance questions CFDI 1.0 became mandatory for large taxpayers in 2011 and was extended to all taxpayers in 2014. CFDI 4.0 (the current version) replaced 3.3 on 1 April 2023. There is no entity below the mandate threshold — any taxpayer issuing an invoice must do so as a CFDI. Any taxpayer registered with SAT — Persona Física (13-char RFC) or Persona Moral (12-char RFC). The supplier must have an active CSD (Certificado de Sello Digital) and a fiscal regime (`RegimenFiscal`) recorded in their CIF. Recipients must verify each CFDI's UUID through SAT's public consultation, retain the XML for 5 years (Article 30 CFF), and accept or reject cancellation requests within 3 business days when applicable. Monthly provisional ISR and IVA payments (DyP) plus the annual ISR return. RESICO contributors have a fully automated monthly tax base computed from issued CFDIs and REPs. Stamping replaces invoice-level reporting. No. Conditioning invoicing on the receiver providing their CIF document is unlawful under Article 83 § IX of the CFF and carries fines. The data on the CIF (RFC, name, régimen, postal code) is required, but the issuer must be willing to accept those four pieces of information by other means. In practice, most B2B workflows still ask for the CIF, but it cannot be made a hard precondition. Cancellation in Mexico is bilateral by default. The issuer submits a request, the receiver has three business days to accept or reject, and rejection keeps the CFDI valid. Issuers cannot unilaterally void an invoice that requires acceptance. The exceptions are: small amounts, certain document types, same-day cancellation, and público en general invoices. The practical recommendation is to coordinate with the customer before submitting any cancellation request, especially for high-value B2B invoices. Beyond the procedural difference, the two methods determine *when* income is recognized for ISR and IVA purposes. PUE income is recognized at issuance; PPD income is recognized as REPs are issued. Choosing the wrong method shifts tax liability into the wrong period and creates discrepancies during SAT's automated reconciliation. RESICO contributors are particularly exposed because their entire monthly tax base is computed from CFDIs and REPs. A complemento is a SAT-defined XML extension with a published XSD, sealed inside the digital signature, and validated at stamping. An addenda is a non-fiscal XML block defined unilaterally by a private buyer (Walmart, Liverpool, Pemex, automotive OEMs, etc.) and inserted into the `` node of the CFDI. SAT does not validate addenda content, but the buyer's ERP rejects payment without it. Each large enterprise customer typically defines its own addenda spec; there is no central catalog. Addendas are not currently supported by Invopop. The supplier must have an active CSD (not a FIEL — FIEL is for SAT login, CSD is for invoicing), be in good standing on Lista 69-B (not classified as EFOS), and maintain valid postal codes matching their CIF. More available in our [Mexico FAQ](/faq/mexico) section *** Ask and answer questions about Mexico's regulation → # E-invoicing in the Middle East Source: https://docs.invopop.com/compliance/middle-east Overview of e-invoicing compliance in the Middle East, where Saudi Arabia and the UAE are pursuing different approaches — ZATCA clearance and Peppol five-corner respectively ## Executive summary The Middle East is an emerging e-invoicing region where two countries are pursuing fundamentally different compliance architectures. **Saudi Arabia** has adopted a [clearance model](/compliance/glossary) through ZATCA (Zakat, Tax and Customs Authority), similar to the approach used across Latin America. The **UAE** is taking the opposite path, adopting a [Peppol five-corner model](/compliance/glossary) aligned with the European and Asia-Pacific approach. Both countries are targeting 2026 for broader rollouts. Despite their different architectures, both share the goal of increasing tax transparency and reducing fraud through digital transaction monitoring. ## Common standards and formats Unlike Europe (EN 16931) or the Americas (clearance CTC), the Middle East does not share a single regional standard. Each country is building its own system independently. | Country | Format | Model | Tax authority | | ------------ | --------------- | ------------------ | --------------------------------------------------- | | Saudi Arabia | ZATCA (FATOORA) | Clearance (CTC) | [ZATCA](https://zatca.gov.sa) | | UAE | Peppol 5C | Five-corner Peppol | [Federal Tax Authority UAE](https://tax.gov.ae/en/) | ### Saudi Arabia — ZATCA clearance Saudi Arabia's e-invoicing system, known as FATOORA, requires businesses to submit invoices to ZATCA for validation before they become legally valid. This [clearance model](/compliance/glossary) gives ZATCA real-time visibility into all transactions. The system has been phased in since 2021, starting with e-invoice generation requirements and progressing to full integration with ZATCA's platform. ### UAE — Peppol five-corner The UAE is adopting the [Peppol network](/apps/peppol) with a five-corner model, where the tax authority receives a copy of every transaction alongside the buyer. This approach aligns the UAE with the architecture used by Singapore, France, and other Peppol-connected jurisdictions, providing built-in cross-border interoperability. ## Key dates | Country | Milestone | | ------------ | ------------------------------------------- | | Saudi Arabia | ZATCA e-invoicing — supported today | | UAE | Peppol 5C e-invoicing support — coming soon | Saudi Arabia is supported today; UAE support is in active development. ## Invopop countries in this region ZATCA clearance model Peppol five-corner model # Invoicing compliance in New Zealand Source: https://docs.invopop.com/compliance/new-zealand New Zealand's e-invoicing and e-reporting obligations for consumer, business and government transactions Invopop support for New Zealand is coming soon (Peppol PINT A-NZ). For inquiries, contact us at [support@invopop.com](mailto:support@invopop.com). *** Ask and answer questions about New Zealand's regulation → # Invoicing compliance in Norway Source: https://docs.invopop.com/compliance/norway Norway's mandatory B2G e-invoicing, Peppol BIS Billing 3.0 requirements, SAF-T framework, VAT reporting obligations, and the upcoming B2B e-invoicing mandate targeting 2028 View current and upcoming regulation → | | | | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Compliance | [Invoicing compliance in Norway](/compliance/norway)
[Compliance timeline](/timelines/norway) | | Apps | [Peppol](/apps/peppol) | | Guides | [Norway Peppol guide](/guides/no-peppol)
[Peppol guide](/guides/peppol) | | FAQ | [Norway FAQ](/faq/norway) | | GOBL | [Norway Tax Regime](https://docs.gobl.org/regimes/no)
[EU EN 16931 Addon](https://docs.gobl.org/addons/eu-en16931-v2017) | | GitHub | [gobl.ubl](https://github.com/invopop/gobl.ubl) |
## Executive summary Norway is Europe's most mature Peppol adopter, with mandatory B2G e-invoicing since 2012 and a proposed B2B mandate targeting 2028. Though not an EU member, Norway voluntarily aligns with European digital standards — it uses Peppol BIS Billing 3.0 (based on EN 16931) as its national invoicing format and is actively positioning itself ahead of the EU's ViDA timeline. [Peppol BIS Billing 3.0](#b2g-e-invoicing) has been mandatory for all public sector suppliers since April 2019. Nearly 360,000 receivers are registered in ELMA, Norway's national Peppol registry, and approximately 170 million invoice transactions are processed annually. [SAF-T Financial](#saf-t) has been mandatory since January 2020 for all enterprises with a bookkeeping obligation that store accounting information electronically. Version 1.30 became mandatory from January 2025. [B2B e-invoicing](#b2b-e-invoicing-mandate) is currently voluntary but a formal mandate has been proposed, with a consultation closed in October 2025. The proposal targets mandatory sending by 2028 and mandatory receiving by 2030. ## Invoicing in Norway Norway built its e-invoicing infrastructure on Peppol, of which it was a founding participant. The national EHF (Elektronisk HandelsFormat) standard has fully converged with Peppol BIS Billing 3.0 — EHF 3.0 is not a separate format but a rebranding of Peppol BIS. All public sector invoicing runs through the Peppol eDelivery Network via certified Access Points, with ELMA serving as the national Peppol SMP registry. Norway mandates electronic invoicing for all public procurement transactions. Suppliers to the entire public sector must submit invoices in Peppol BIS Billing 3.0 format via the Peppol network. | | | | ------------------- | ------------------------------------------------------------------------------------------------- | | **Scope** | B2G | | **Format** | Peppol BIS Billing 3.0 (EHF 3.0) | | **Compliance** | e-invoicing | | **Infrastructure** | Peppol eDelivery Network via certified Access Points | | **Model** | Decentralized (Peppol) | | **Threshold** | Applies to public procurement above NOK 100,000 (excl. VAT) | | **Effective date** | Mandatory since **1 April 2019** (FOR-2019-04-01-444) | | **Agency** | [DFØ](https://www.anskaffelser.no) (Norwegian Peppol Authority) / [Digdir](https://www.digdir.no) | | **Invopop support** | [Peppol App](/apps/peppol) | Connect the app to send and receive invoices in Norway → The B2B mandate is not yet law. A consultation closed on 31 October 2025 and final legislative decisions remain pending as of February 2026. The Norwegian Ministry of Finance has launched a formal evaluation of mandatory B2B e-invoicing. The proposal, prepared by Skatteetaten, would require all businesses with bookkeeping obligations to send and receive invoices in Peppol BIS Billing 3.0 format via the Peppol network. | | | | ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | | **Scope** | B2B | | **Format** | Peppol BIS Billing 3.0 | | **Proposed send date** | **1 January 2028** | | **Proposed receive date** | **1 January 2030** | | **Exemptions** | Sole proprietors without accounting obligations and turnover below NOK 50,000; bankruptcy estates; B2C, cash sales, and exports to foreign customers | | **Agency** | [Skatteetaten](https://www.skatteetaten.no) | ## E-reporting Norway's VAT return (mva-meldingen) was modernized on 1 January 2022, replacing the old RF-0002 form. The new return has 30 boxes (vs. the previous 19), aligned with SAF-T standard tax codes. All filing is mandatory electronic submission via Altinn or ERP API connections. | | | | ------------------------------- | ---------------------------------------------------------- | | **Standard frequency** | Bi-monthly (6 periods) | | **Annual filing** | Available for businesses with turnover below NOK 1 million | | **Primary industries** | Annually by default (agriculture, forestry, fisheries) | | **Foreign sellers (VOEC/VOES)** | Quarterly | | **Submission** | [Altinn](https://www.altinn.no) portal or ERP API | | **Agency** | [Skatteetaten](https://www.skatteetaten.no) | Bi-monthly deadlines fall one month and ten days after each two-month period (e.g., January–February is due by April 10). Corrections must be submitted as full replacement returns rather than delta-only. ## Regulation Norway's SAF-T (Standard Audit File for Tax) framework has been mandatory since 1 January 2020 for all enterprises with a bookkeeping obligation that store accounting information electronically. SAF-T is submitted on-demand only — when requested by tax authorities during an audit — with no periodic filing requirement. | | | | ---------------------- | ---------------------------------------------------------------------------------------------------------- | | **Scope** | All bookkeeping-obligated businesses (including foreign entities with a permanent establishment in Norway) | | **Format** | SAF-T Financial (XML) | | **Current version** | **1.30** (mandatory from 1 January 2025) | | **Submission** | On-demand via [Altinn](https://www.altinn.no) portal or ERP API | | **Turnover exemption** | Annual turnover below NOK 5 million (unless accounting data is already digital) | | **Voucher exemption** | Fewer than 600 vouchers annually using spreadsheets | | **Agency** | [Skatteetaten](https://www.skatteetaten.no) | Version 1.30 introduced significant changes: removal of standard chart-of-accounts mapping (replaced by `GroupingCategory` and `GroupingCode`), new balance account structures, new VAT presentation methods, and previously voluntary elements becoming mandatory. Version 1.20 remains valid for financial year 2024 and earlier. A separate SAF-T component covering POS transaction data. Required for businesses subject to the Kassasystemloven (Cash Register Systems Act) — companies with bookkeeping obligations conducting cash sales above NOK 50,000 (excl. VAT) annually. Norwegian invoice content requirements derive from **Bokføringsforskriften (Bookkeeping Regulations) § 5-1-1 and § 5-1-2** and the **Merverdiavgiftsloven** (VAT Act). **Complete invoice** * Sequential invoice number and documentation date * Seller's name and organization number with **"MVA" suffix** if VAT-registered * Buyer identification (name plus address or organization number) * Detailed description of goods or services * Time and place of delivery * Quantity and unit price * VAT rate and amount **in NOK** (even when invoicing in foreign currency) * Total amount including VAT * Payment due date * Items at different VAT rates must appear on separate lines * Limited liability companies (AS) and public limited companies (ASA) must include the word **"Foretaksregisteret"** — including on international invoices * For reverse-charge supplies, the invoice must indicate the mechanism applies **Simplified invoice** Permitted when the total consideration is less than **NOK 50,000 including VAT**. Requires only: * Seller details (name, address, MVA number) * Description of goods or services * Total consideration with VAT amount Norway applies its own VAT legislation — the **Merverdiavgiftsloven** (Value Added Tax Act 2009). The VAT registration threshold is **NOK 50,000** in taxable turnover within 12 months (NOK 140,000 for charitable organizations). | Rate | Percentage | Application | | ------------------ | ---------- | --------------------------------------------------------------------------------------------------------------------- | | Standard | **25%** | Most goods and services | | Reduced (food) | **15%** | Foodstuffs (excl. alcohol, tobacco); water/wastewater services (from 1 July 2025) | | Reduced (services) | **12%** | Passenger transport, hotel accommodation, cinema, museums, amusement parks, sporting events, public broadcasting | | Special (marine) | **11.11%** | Wild marine resources — introduced 1 January 2025 | | Zero rate | **0%** | Exports, international transport, newspapers (print/digital), books, electric vehicles (up to NOK 500,000 until 2026) | **Territorial notes**: Svalbard and Jan Mayen are VAT-free and fall outside the Norwegian VAT area. Exports from mainland Norway to Svalbard are zero-rated. Norwegian businesses purchasing taxable services from these territories must apply the reverse-charge mechanism. Under **Bokføringsloven (Bookkeeping Act) § 13**: * **5 years** after the end of the financial year for primary documentation (invoices, vouchers, ledgers, mandatory financial reporting specifications) * **3.5 years** for secondary documentation (supporting specifications) * **10 years** for construction and engineering project accounts and certain banking records Records must generally be stored in Norway. Electronic records may be stored in another EEA country, the UK, or Switzerland if Skatteetaten is notified in writing (Bokføringsforskriften § 7-5). All archived material must remain readable, printable, secured against alteration, and available to control authorities throughout the retention period. * [ELMA registry](https://www.elma.difi.no) — search for Norwegian Peppol receivers * [anskaffelser.no](https://www.anskaffelser.no) — public procurement guidance and EHF specifications * [Skatteetaten VAT](https://www.skatteetaten.no/en/business-and-organisation/vat-and-duties/vat/) — Norwegian Tax Administration VAT guidance * [Altinn](https://www.altinn.no) — electronic filing portal for VAT returns and SAF-T ## FAQ Compliance questions Norway Not yet. B2G has been mandatory since April 2019 — all suppliers to the public sector must invoice in Peppol BIS Billing 3.0 (EHF) format via the Peppol network. A formal B2B mandate has been proposed, targeting mandatory sending by 2028 and mandatory receiving by 2030, but it is not yet law. Any entity with a Norwegian organization number from the Brønnøysund Register Centre (shown with an "MVA" suffix when VAT-registered). Participants are registered in ELMA, Norway's national Peppol registry, through a certified Access Point such as Invopop. Public sector bodies must be able to receive Peppol BIS (EHF) invoices. For businesses, receiving via Peppol remains voluntary until the proposed 2030 mandate. Invoices and other accounting documentation must be archived for 5 years under the Bokføringsloven (Bookkeeping Act). Peppol Mandatory dates vary by country. Belgium requires structured B2B e-invoicing — Peppol BIS by default — from January 2026. Germany is phasing in B2B e-invoicing between 2025 and 2028. France's Factur-X via Peppol applies once the PA reform takes effect. Outside mandates, Peppol delivery is voluntary but increasingly expected for B2G and cross-border trade. Yes. Every document exchanged on Peppol BIS uses a UBL or CII syntax that conforms to the EN16931 European e-invoicing standard, plus the relevant Peppol BIS specification. Invopop generates compliant XML automatically when you use the Peppol app. Peppol is a federated network — anyone could otherwise register a Participant ID for a company they don't represent. Proof of ownership ties the Participant ID to a verifiable contact at the company, which is what allows the registration to be published on the SML. Requirements vary by Authority. In Belgium, for example, the supplier must provide a recent extract from the Banque-Carrefour des Entreprises (KBO/BCE) plus a signed mandate. Invopop walks the registering party through the local requirements during the registration wizard. Yes — a Peppol BIS document delivered through a certified Access Point is treated as the legal e-invoice in any country that recognises Peppol. The signed UBL or CII XML is the authoritative record; archive it alongside any human-readable rendering you generate. Retention is set by each country's tax authority — typically 7 to 10 years in the EU. Invopop preserves the original XML and any generated PDF in the silo entry so you can satisfy local archival requirements wherever you operate. More available in our [Norway FAQ](/faq/norway) section *** Ask and answer questions about Norway's regulation → # E-invoicing in Oceania Source: https://docs.invopop.com/compliance/oceania Overview of e-invoicing compliance in Oceania, where Australia and New Zealand share a joint Peppol PINT A-NZ profile for cross-border interoperability ## Executive summary Australia and New Zealand share a uniquely harmonized approach to e-invoicing. Both countries have adopted the **[Peppol](/apps/peppol) network** and developed a joint invoice profile — **PINT A-NZ** — that works across both jurisdictions. This trans-Tasman alignment means businesses operating in either country use the same format and network, with built-in interoperability across all Peppol-connected jurisdictions worldwide. The region is still in the early stages of e-invoicing adoption, with both countries expected to formalize mandates during 2026. The shared PINT A-NZ profile positions Oceania as one of the most interoperable regions globally, connecting directly to the Peppol networks in Europe and Asia-Pacific. ## Common standards and formats Both countries use the same format and network infrastructure, making Oceania the most internally harmonized e-invoicing region. | Country | Format | Network | Status | | ----------- | ---------------- | ------- | ------------------------ | | Australia | Peppol PINT A-NZ | Peppol | Emerging — expected 2026 | | New Zealand | Peppol PINT A-NZ | Peppol | Emerging — expected 2026 | **PINT A-NZ** (Peppol International Invoice — Australia/New Zealand) is a localized adaptation of the Peppol international invoice specification. It is based on OASIS UBL 2.1 XML with specific extensions for Australian and New Zealand tax requirements, including GST handling and local business identifiers (ABN in Australia, NZBN in New Zealand). ## Compliance model Oceania follows the **decentralized Peppol exchange model**. Businesses connect to the Peppol network through certified Access Points and exchange invoices directly. There is no government clearance step — invoices do not require tax authority approval before reaching the buyer. As the mandates mature, both countries may introduce a reporting layer (such as a five-corner model where the tax authority receives a copy of each transaction), but the current framework focuses on establishing the Peppol exchange infrastructure first. ## Key dates | Country | Milestone | | ----------- | -------------------------------------- | | Australia | Peppol PINT A-NZ support — coming soon | | New Zealand | Peppol PINT A-NZ support — coming soon | Both countries are in the early stages of mandate development. Invopop support for both is coming soon. ## Invopop countries in this region Peppol PINT A-NZ Peppol PINT A-NZ # Invoicing compliance in Perú Source: https://docs.invopop.com/compliance/peru Perú's e-invoicing and e-reporting obligations for consumer, business and government transactions Invopop support for Perú is expected to be ready in the third quarter of 2026 (UBL SUNAT). For inquiries, contact us at [support@invopop.com](mailto:support@invopop.com). *** Ask and answer questions about Perú's regulation → # Invoicing compliance in Poland Source: https://docs.invopop.com/compliance/poland Poland's mandatory e-invoicing requirements, KSeF implementation, and e-reporting obligations for B2B and B2G transactions View current and upcoming regulation to ensure you are covered → | | | | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Compliance | [Invoicing compliance in Poland](/compliance/poland)
[Compliance timeline](/timelines/poland) | | Apps | [Poland](/apps/poland) | | Guides | [Supplier registration](/guides/pl-ksef-supplier)
[Issuing invoices](/guides/pl-ksef) | | FAQ | [Poland FAQ](/faq/poland) | | GOBL | [Poland Tax Regime](https://docs.gobl.org/regimes/pl)
[Polish KSeF FA(3) Addon](https://docs.gobl.org/addons/pl-favat-v3) |
## Executive summary Poland is transitioning to KSeF 2.0: a centralized, clearance-based system that routes B2B invoices through a single state hub. E-invoices will replace traditional PDFs as structured documents of XML code, presented in the Polish FA(3) schema. The reform aims to curb VAT fraud, improve transparency, and standardize digital invoicing across the economy. To improve adoption, KSeF offers multiple issuance channels including the [e-Faktur](https://ap.ksef.mf.gov.pl) web portal, a dedicated API for ERP integration, and an official mobile app. QR codes and a 24-hour offline mode have also been developed for easy verification and to maintain functionality during temporary network outages. Key insights: * Every Polish business is required to **receive** e-invoices from 1 February 2026. * The start date for issuing e-invoices is phased: large companies (over PLN 200M annual sales) from 1 February 2026, other taxable companies from 1 April 2026, and micro entrepreneurs from 1 January 2027. * B2C transactions are out of scope. * Cross-border transactions (B2Bi) invoices are generated through KSeF. * B2G e-invoicing continues through the PEF platform, which is now linked to KSeF. * **Penalties are suspended during 2026** (grace period). From 1 January 2027, non-compliance fines can reach up to 100% of the VAT amount shown on non-compliant invoices (or 18.7% of gross value for zero-rated transactions). ## Invoicing in Poland Poland has used e-invoicing for the public sector since 2019, and as of February 2026, the requirement extends to domestic B2B transactions. Businesses grant the required authorizations (with a KSeF token or certificate), and the system validates, transmits, and receives each e-invoice, ready to view in a company’s accounting system. Each invoice is validated by the tax authority before it reaches the customer; once cleared, it receives a unique KSeF identifier and is considered legally issued. B2G e-invoices are issued through PEF, the public sector platform. As of the new mandate, PEF will synchronize with KSeF to apply the same validation sequences, so public entities can decide to use either portal. | | | | -------------------- | ------------------------------------------------------------------------------------------ | | **Models** | B2G, B2B | | **Format** | FA(3) XML | | **Infrastructure** | KSeF | | **Model** | Clearance continuous transaction control (CTC) | | **Scope & Deadline** | Mandatory for B2G invoices since 2019; phased from February 2026-2027 for B2B transactions | | **Agency** | [Polish Ministry of Finance](https://efaktura.gov.pl/?) | | **Invopop support** | [Poland App](/apps/poland) | ## E-reporting Involves sending invoice data to tax authorities in real-time or near real-time, typically as part of government initiatives to improve tax compliance and reduce VAT fraud. Known locally as JPK (Jednolity Plik Kontrolny), SAF-T is a mandatory electronic reporting system standardizing how businesses submit accounting data to the tax authorities. Companies must send XML files directly from their accounting systems, using schemas defined by the ministry. The core file, JPK\_VAT, is submitted monthly and details all VAT transactions, while other versions (e.g., JPK\_KR for general ledger, JPK\_FA for invoices) can be requested during audits. Since October 2020, the JPK\_V7 format has merged VAT reporting and return obligations into a single file, combining transactional data with declaration elements for both VAT-registered entities and smaller taxpayers. | | | | -------------------- | -------------------------------------- | | **Format** | SAF-T (XML) | | **Scope & deadline** | Mandatory since 2020 for all taxpayers | | **Invopop support** | No | ## Regulation For international transactions, the invoice is created and cleared in KSeF just like a domestic one. Once the invoice is validated, the tax data is recorded and it receives a KSeF ID to prove compliance. Because a foreign recipient without a Polish NIP (tax ID) cannot log in to KSeF, delivery takes place outside the platform. The commercial channels continue as before: via email, EDI attachment or paper. The document must include the KSeF references, in particular a QR code, so the buyer can scan the document and view a verifiable version online. An e-invoice contains the same business information as a traditional invoice, but must follow the FA(3) XML structure.  * Date and time (in the YYYY-MM-DDTHH:MM:SS format). * **Optional**: Name of the ICT software used by the taxpayer. * Supplier information (NIP). * Buyer information (NIP). * Third parties relating to the invoice if applicable (such as an e-invoicing provider). * Information regarding transaction terms. * KRS number: The invoice footer (“Stopka”) includes an optional “Rejestry” block for registry identifiers such as KRS and REGON. * **Optional:** From 1 February 2026 the optional “Zalacznik” element may be used where a transaction involves a complex set of data for units of measure, quantities, or net unit prices. Attachments are part of the structured file and are limited to data closely related to tax content. Prior notification (via e-Urząd Skarbowy) is required to enable attachments, and each attachment cannot exceed 3 MB. Non-tax materials (e.g., contracts or marketing content) are not allowed as invoice attachments. * B2C transactions * Non-established businesses For a full list of exemptions, see the "[scope](https://ksef.podatki.gov.pl/informacje-ogolne-ksef-20/zakres-obowiazkowego-ksef/)" page on the KSeF website. KSeF certificates are digital documents that authenticate a company in the KSeF portal. **Type 1 certificate** The designated individual of each company will apply for a type 1 certificate to use the KSeF API in an ERP or accounting software. Access is granted after the authorized person confirms their identity with a certified e-signature. KSeF certificates are available to download online from 1 November 2025 and will be added directly to the KSeF API from February 2026.  **Type 2 certificate**  For offline invoices, businesses send a type 2 certificate that includes two QR codes for customers to scan on their phone: one QR code for the buyer to access the invoice online, another to validate the supplier's identity.  For more information see the government FAQs section on [e-invoice QR codes](https://ksef.podatki.gov.pl/pytania-i-odpowiedzi-ksef-20/#:~:text=Co%20to%20jest%20kod%20QR%20i%20do%20czego%20s%C5%82u%C5%BCy%3F). B2C transactions are excluded from the e-invoicing mandate. The Polish tax authority already receives B2C sales data from online fiscal cash registers that continuously transmit receipts to the Central Repository of Cash Registers (CRK). For B2B transactions, receipts that include a buyer NIP below PLN 450 remain compliant as simplified invoices until 31 December 2026. Companies will need to submit these transactions via KSeF from 2027.  A foreign entity is not required to issue invoices in KSeF if it has no registered office and no fixed establishment in Poland. It is also outside the mandate if it has a fixed establishment in Poland that does not participate in the specific supply. Such businesses still may opt to issue invoices through KSeF voluntarily.  A fixed establishment is defined as having "sufficient permanent presence with human and technical resources". As the assessment is case-by-case, the Ministry of Finance has indicated it will publish additional explanations on the fixed establishment criteria. Poland has implemented a grace period for KSeF adoption: **no penalties or formal sanctions will be imposed during 2026**. This allows businesses time to adapt their systems and processes without financial risk. **Starting 1 January 2027**, the Ministry of Finance will enforce compliance with financial penalties: * Fines up to **100% of the VAT amount** shown on invoices not issued via KSeF when required. * For zero-rated or VAT-exempt transactions, fines up to **18.7% of the gross invoice value**. * Tax authorities have discretion to adjust penalties based on severity and circumstances. **Additional consequences:** * Invoices not issued through KSeF may be considered invalid for VAT deduction purposes. * Business partners may refuse to accept non-compliant invoices. * Tax office audits from 2027 onwards will incorporate KSeF compliance checks. * **QR codes:** KSeF provides QR codes for B2Bi transactions to verify whether a document exists in the system and, for offline issuance, to authenticate the issuer. Offline invoices show two QR codes ("OFFLINE" and a certificate QR) until they are delivered to KSeF. * **Offline procedures:** In addition to real-time online clearance, KSeF supports: (1) offline24 (to issue now, upload by end of the next business day), (2) scheduled maintenance offline (to upload the day after maintenance ends), and (3) emergency mode (to upload within seven business days after an official outage). * **Retention:** Invoices accepted by KSeF are archived and available in the system for 10 years. * [Extensive FAQs](https://ksef.podatki.gov.pl/pytania-i-odpowiedzi-ksef-20?) * [E-invoicing legislation](https://ksef.podatki.gov.pl/informacje-ogolne-ksef-20/podstawy-prawne-oraz-kluczowe-terminy?) * [KSeF weekly video tutorials (Polish)](https://ksef.podatki.gov.pl/srody-z-ksef/) * [Technical documentation (English)](https://ksef-test.mf.gov.pl/?) * [Government repository (Polish)](https://ksef.podatki.gov.pl//pliki-do-pobrania-ksef-20/) * [KSeF sandbox environment](https://ksef.podatki.gov.pl/strefa-testowa-ksef/) ## FAQ Compliance questions 1 February 2026 for taxpayers with turnover above PLN 200M, 1 April 2026 for all other businesses, and 1 January 2027 for micro entrepreneurs. B2C is optional. Foreign-only businesses without a fixed Polish establishment are out of scope. Any entity with a Polish NIP and active KSeF access. Large taxpayers (turnover > PLN 200M) must be onboarded by 1 February 2026, all other businesses by 1 April 2026, and micro entrepreneurs by 1 January 2027. Foreign-only entities without a Polish fixed establishment cannot use KSeF. Once KSeF is mandatory, all B2B invoices must be received through KSeF — paper or PDF rejection is no longer permitted between Polish parties. Archival is automatic in KSeF for 10 years; recipients can pull copies at any time. JPK\_V7M (monthly) or JPK\_V7K (quarterly) consolidated VAT and SAF-T file. Once KSeF is mandatory, JPK\_V7 is expected to draw directly from KSeF data, eliminating manual reconciliation. Currently supported invoice types: * **Standard Invoices (VAT)**: Regular B2B invoices with FA(3) schema * **Credit Notes (KOR)**: Invoice corrections and adjustments All invoices must include the `pl-favat-v3` addon in GOBL to ensure FA(3) schema compliance. Additional invoice types can be supported based on customer requirements. Contact [support](mailto:support@invopop.com) if you need specific invoice types. No. B2C invoices in KSeF are optional. The mandatory requirement applies only to B2B transactions. The KSeF certificate must belong to the company account directly or to a user with both InvoiceRead and InvoiceWrite permissions in KSeF. Suppliers must declare KSeF as their issuer in the Ministry of Finance taxpayer's portal before going live. Once KSeF is mandatory, all Polish B2B recipients must accept KSeF-issued invoices. KSeF itself archives for 10 years; recipients have no separate archival duty for the structured XML. More available in our [Poland FAQ](/faq/poland) section *** Ask and answer questions about Poland's regulation → # Invoicing compliance in Portugal Source: https://docs.invopop.com/compliance/portugal Portugal's mandatory e-invoicing requirements, ATCUD/QR implementation, and SAF-T e-reporting obligations for B2B and B2G transactions View current and upcoming regulation → | | | | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Compliance | [Invoicing compliance in Portugal](/compliance/portugal)
[Compliance timeline](/timelines/portugal) | | Apps | [AT Portugal](/apps/at-portugal) | | Guides | [Supplier registration](/guides/pt-at-supplier)
[Issuing invoices](/guides/pt-at) | | FAQ | [Portugal FAQ](/faq/portugal) | | GOBL | [Portugal Tax Regime](https://docs.gobl.org/regimes/pt)
[Portugal SAF-T addon](https://docs.gobl.org/addons/pt-saft-v1) |
## Executive summary Portugal requires all invoices to carry an **ATCUD** validation code and a **QR code** — in force since 2023. Businesses must to use approved software that generates invoices with unique validation codes (ATCUD) assigned by the Portuguese Tax Authority (AT). Each invoice must include a QR code that links to the AT's online verification service, allowing customers and tax authorities to validate invoice authenticity. Invoicing in Portugal is based on the EN 16931 standard with CIUS restrictions, requiring businesses to notify the AT of their numbering series before issuance. The AT then validates and issues unique codes for each series, creating a centralized tracking mechanism for all invoices. Portugal also requires **SAF-T (Standard Audit File for Tax)** reporting, an XML-based format used to submit accounting and invoicing data to tax authorities. This system enables standardized digital audits and tax compliance, with mandatory reporting for B2G and B2B transactions from January 1, 2024. This article covers [ATCUD/QR invoicing requirements](#atcudqr-b2b-b2c), [SAF-T reporting](#saft-pt-b2b-b2g), and [Portuguese invoicing regulations](#regulation). Invopop covers Portuguese invoicing through its AT Portugal app, as well as integrations with platforms like Stripe and Chargebee. This allows businesses to issue compliant ATCUD invoices efficiently and manage white-label (B2B2B) operations. ## Invoicing in Portugal Portugal does not mandate a specific electronic invoice format. Instead, businesses report tax information to the Portuguese Tax Authority (AT - Autoridade Tributária e Aduaneira) either periodically through SAF-T (PT) reports or in real time via web service. Although no format is required, all invoices must include ATCUD and a QR code. 1. **ATCUD (Unique Code)**: * Businesses must register their invoice numbering series with the AT * The AT issues a validation code for each registered series * This code must appear on each invoice 2. **QR Code**: * All invoices must contain a QR code * The QR code links to the AT's online verification service | | | | -------------------- | --------------------------------------------------- | | **Models** | B2B, B2C | | **Format** | Unspecified (paper or PDF used in practice) | | **Infrastructure** | Hybrid: public and private platforms | | **Model** | Centralized | | **Scope & Deadline** | All B2B invoices from **Jan 1, 2026** | | **Agency** | [AT Portugal](https://www.portaldasfinancas.gov.pt) | | **Invopop Support** | [AT Portugal App](/apps/at-portugal) | Get covered → CIUS-PT is a XML-based invoice format used for B2G transactions. | | | | -------------------- | --------------------------------------------------- | | **Models** | B2G | | **Format** | CIUS-PT (XML) | | **Infrastructure** | [BASE](https://www.base.gov.pt/base4) | | **Scope & Deadline** | Mandatory for B2G invoices from **Jan 1, 2024** | | **Agency** | [AT Portugal](https://www.portaldasfinancas.gov.pt) | | **Invopop Support** | No | ## E-reporting The SAF-T (Standard Audit File for Tax) system was introduced in Portugal in 2008 to facilitate the electronic submission of VAT returns, accounting records, and transport documents. This system requires files to be generated in specific formats containing detailed information regarding commercial transactions. Taxpayers with headquarters, based or permanently established in Portugal, subject to corporate tax (IRC) or income tax (IRS) that keep organized accounting, must comply with this system. SAF-T (Standard Audit File for Tax) is an XML-based file format used to report accounting and invoicing data to the tax authority, enabling standardized digital audits and tax compliance. | | | | -------------------- | --------------------------- | | **Format** | SAF-T PT (XML) | | **Scope & deadline** | B2G and B2B from 1 Jan 2024 | | **Invopop support** | Yes | Get covered → ## Regulation According to [Article 36(5) of the Código do IVA](https://info.portaldasfinancas.gov.pt/pt/informacao_fiscal/codigos_tributarios/civa_rep/Pages/iva36.aspx), all invoices must be dated, sequentially numbered, and contain the following: **Standard invoice** * **Supplier identification**: name or business name, registered address, and NIF (Número de Identificação Fiscal). * **Customer identification**: name or business name, address, and NIF of the customer when the customer is a taxable person. For non-taxable individuals (final consumers), the NIF is only required when the customer requests it. * **Goods or services description**: quantity and usual denomination, with enough detail to determine the applicable tax rate. Non-invoiced packaging must be listed separately with an express mention of its agreed return. * **Unit price**: price net of tax and any other elements included in the taxable value, along with any discounts or rebates not already reflected in the unit price. * **Applicable VAT rate(s)** and the corresponding **tax amount(s)**. When a single invoice covers items subject to different VAT rates, the description, price, and tax must be broken down separately for each rate. * **Exemption justification**: if VAT does not apply, the invoice must state the legal basis for the exemption (for example, "IVA – regime de isenção" for Article 53 small-business exemptions). * **Date of supply**: the date goods were delivered or services were performed, if different from the invoice issue date. Also required when advance payments are received before the operation is complete. * **ATCUD**: the document unique code assigned through series registration with the AT. * **QR code**: linking to the AT's online verification service. Invoices must be issued no later than the **fifth business day** following the date when VAT becomes due. For certain intra-EU service provisions, the deadline extends to the 15th day of the following month. **Simplified invoice (fatura simplificada)** Under [Article 40 of the Código do IVA](https://informador.pt/legislacao/lexit/codigos/direito-fiscal/codigo-do-iva/capitulo-v-liquidacao-e-pagamento-do-imposto/seccao-iii-outras-obrigacoes-dos-contribuintes/artigo-40-o-faturas-simplificadas/), simplified invoices may be issued for: * Retail sales to final consumers up to **€1,000** * Other supplies of goods or services up to **€100** A simplified invoice must contain: * Supplier name or business name and NIF. * Goods or services description and quantities. * Price: either the net price plus VAT amount and rate, or the total price with VAT included and the applicable rate. * Customer NIF: mandatory only when the customer is a taxable person (B2B). For final consumers, it is included only if the customer requests it. * Exemption justification, if applicable. * Sequential number and date of issue. [Decreto-Lei 28/2019](https://info.portaldasfinancas.gov.pt/pt/apoio_contribuinte/Novas_regras_faturacao/Paginas/default.aspx) governs invoice processing obligations in Portugal, including numbering rules and the ATCUD system. **Numbering rules** * Invoices must be issued within one or more series, dated and numbered sequentially and continuously. * Each series must run for at least one fiscal year. * The series identifier must be unique per establishment and/or software program, and cannot be reused for the same document type by the same taxpayer. * Separate series are required for different document types (invoices, credit notes, receipts, and so on). **Series registration** Before issuing invoices, businesses must communicate each documentary series to the AT through the e-fatura portal. The communication must include: * The series identifier * The document type * The starting sequential number * The expected date the series will begin use **ATCUD composition** The AT assigns a validation code (minimum eight characters) for each registered series. The ATCUD is formed by concatenating: 1. The series validation code 2. A hyphen 3. The sequential document number The ATCUD must appear on the invoice in the format: `ATCUD:XXXXXXXX-NNNNNNNN`. All businesses in Portugal must use invoicing software certified by the AT. [Decreto-Lei 28/2019](https://risema.pt/decreto-lei-n-o-28-2019-de-15-02-2019/) establishes that: * Software must be registered and approved by the AT before use. * Each invoice must include a digital signature hash generated by the certified software, creating a chain of integrity across documents. * The software must support the generation of ATCUD codes and QR codes on all tax-relevant documents. * Businesses using the AT's free online invoicing portal are also considered compliant. When the customer issues an invoice on behalf of the supplier, [Article 36(11) of the Código do IVA](https://ztlm.eu/autofaturacao-acordo-escrito-e-obrigatorio-segundo-o-codigo-do-iva/) requires a **prior written agreement** between the parties. The agreement must include: * Full identification of both parties (name, NIF, address) * An express statement that the customer will issue invoices on the supplier's behalf * A description of the covered operations * Express acceptance by the supplier * Period of validity and revocation conditions * Signatures of both parties The agreement must be communicated to the AT through the e-fatura portal and retained for ten years. eInvoicing for public procurement is managed through [BASE](https://www.base.gov.pt/base4), a central platform that provides solutions like acinGov and saphetygov for electronic invoicing. While the FE-AP platform can be used to receive invoices, its use is not mandatory, leading to various methods for sending invoices, including web-based services, direct electronic connections, third-party portals, or email. Business owners must keep transaction records for **ten years**. If the tax settlement period is longer than ten years, records must be maintained until the end of the settlement period. More information can be found on the [Tax and Customs Authority PDF](https://info.portaldasfinancas.gov.pt/pt/informacao_fiscal/legislacao/instrucoes_administrativas/Documents/Oficio_Circulado_30213_2019.pdf) (in Portuguese). 1. VAT * General rate: 23% * PT-AC: 16% * PT-MA: 22% * Intermediate rate: 13% * PT-AC: 9% * PT-MA: 12% * Reduced rate: 6% * PT-AC: 4% * PT-MA: 4% Read more about [taxation in Portugal](https://en.wikipedia.org/wiki/Taxation_in_Portugal). Under [Article 39 of the Código do IVA](https://info.portaldasfinancas.gov.pt/pt/informacao_fiscal/codigos_tributarios/civa/Pages/iva39.aspx), invoice issuance is waived when all of the following conditions are met: the customer is a private individual not using the goods or services for commercial, industrial, or professional activity, and the transaction is paid in cash. The exemption applies to: * Retail sales by retailers or street vendors. * Sales through vending machines. * Services where access is via a numbered receipt, admission ticket, transport ticket, or other printed bearer document proving payment. * Other service provisions valued under €10. Even when exempt, retailers and service providers must still issue an invoice when: * The customer is a VAT-taxable person. * A non-taxable customer requests one. Exempt businesses must still issue pre-numbered sales receipts or use electronic cash registers that document all operations. Refer to the [QR code technical specification](https://info.portaldasfinancas.gov.pt/pt/docs/Conteudos_1pagina/Documents/QR_Code_Technical_Specifications.pdf) published by the Autoridade Tributária (AT). When using our "Generate PDF" action, Invopop complies with the requirements by the AT in producing PDF invoices with the QR code. ## FAQ Compliance questions All invoices issued in Portugal must include a unique sequential number, a series identifier, an ATCUD code (Article 35-A CIVA), and a QR code (Portaria 195/2020). Software must be certified by the Autoridade Tributária — Invopop is certified. Any entity with a Portuguese NIF — companies, sole traders, and freelancers. NIFs starting with 1, 2, or 3 are individuals (autónomos); NIFs starting with 5 are legal entities, which require additional registration metadata (share capital, commercial registry). Recipients must verify the QR/ATCUD on each invoice via AT's e-fatura portal and retain the document for 10 years (Article 123 CIVA). Auto-classification of received invoices into expense categories happens through e-fatura. Monthly or quarterly IVA periódica plus the annual IES (Informação Empresarial Simplificada). Invoice-level data is reported continuously through real-time submission or monthly SAF-T export — both feed AT's e-fatura system automatically. Supplier registration information includes the company's share capital, the commercial registry office, and optionally the NIF used during registration. Portuguese law requires this information to appear on all printed fiscal documents, including PDFs. **When is it mandatory?** Registration information is mandatory for companies and legal entities. However, self-employed individuals and freelancers (whose NIF starts with 1, 2, or 3) are exempt from this requirement, as they typically do not have formal registration details. **What about the "other" field?** The `other` field is optional and can be used to specify the NIF of the company when it was registered if different from the current one. The supplier must use certified billing software, register their issuance series with AT, and choose a reporting model (monthly SAF-T or real-time). Self-employed taxpayers (NIF starting 1/2/3) are exempt from supplier registration metadata; companies must declare share capital and commercial registry. Either real-time per-invoice transmission or monthly SAF-T export by the 5th of the following month. Both satisfy the reporting obligation under Portaria 195/2020 — the choice is operational. More available in our [Portugal FAQ](/faq/portugal) section *** Ask and answer questions about Portugal's regulation → # Invoicing compliance in Romania Source: https://docs.invopop.com/compliance/romania Romania's e-invoicing and e-reporting obligations for consumer, business and government transactions Invopop support for Romania is coming soon (Peppol RO e-invoice). For inquiries, contact us at [support@invopop.com](mailto:support@invopop.com). *** Ask and answer questions about Romania's regulation → # Invoicing compliance in Saudi Arabia Source: https://docs.invopop.com/compliance/saudi-arabia Saudi Arabia's ZATCA Fatoora e-invoicing obligations for business and consumer transactions Invopop supports Saudi Arabia (ZATCA) e-invoicing. See the [Clearance & Reporting](/guides/sa-zatca-clearance-reporting) and [Registration](/guides/sa-zatca-registration) guides to get started. View current and upcoming regulation → | | | | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Compliance | [Invoicing compliance in Saudi Arabia](/compliance/saudi-arabia)
[Compliance timeline](/timelines/saudi-arabia) | | Apps | [Saudi Arabia](/apps/saudi-arabia) | | Guides | [Registration](/guides/sa-zatca-registration)
[Clearance & reporting](/guides/sa-zatca-clearance-reporting) | | FAQ | [Saudi Arabia FAQ](/faq/saudi-arabia) | | GOBL | [Saudi Arabia Tax Regime](https://docs.gobl.org/regimes/sa)
[ZATCA Addon](https://docs.gobl.org/addons/sa-zatca-v1) | | GitHub | [gobl.sa.zatca](https://github.com/invopop/gobl.sa.zatca) |
## Executive summary Saudi Arabia mandates electronic invoicing through the **Fatoora** system, operated by **ZATCA** (Zakat, Tax and Customs Authority). All VAT-registered taxpayers must issue invoices in XML format from a compliant solution that connects to ZATCA. **Standard tax invoices** (B2B, B2G) follow a clearance model, where ZATCA digitally stamps the document before it's shared with the buyer. **Simplified tax invoices** (B2C) follow a reporting model, where the document is issued at the point of sale and reported to ZATCA within 24 hours. **Key requirements:** * **Format**: UBL 2.1 XML with ZATCA's KSA extensions. * **Clearance (B2B, B2G)**: standard invoices are stamped by ZATCA in real time before they reach the buyer. * **Reporting (B2C)**: simplified invoices are issued at the point of sale and reported to ZATCA within 24 hours. * **Security**: each invoice carries a ZATCA-issued cryptographic stamp (CSID), a QR code, an Invoice Counter Value (ICV) and a Previous Invoice Hash (PIH). Invopop provides ZATCA/Fatoora integration through its [Saudi Arabia app](/apps/saudi-arabia) to ensure compliance. ## Invoicing in Saudi Arabia ZATCA operates the **Fatoora** platform, which VAT-registered taxpayers use to clear standard tax invoices in real time and report simplified tax invoices within 24 hours of issuance. The invoice is a UBL 2.1 XML document with ZATCA-specific extensions: in the clearance flow it is cryptographically stamped by ZATCA itself; in the reporting flow the stamp is applied by Invopop using the supplier's ZATCA-issued certificate. The mandate covers all **resident VAT-registered taxable persons**, plus any third party issuing invoices on their behalf — non-resident taxable persons are out of scope. Required where the buyer is a VAT-registered business or a government entity, carrying the full set of mandatory fields. The issuer submits the XML to ZATCA in real time; ZATCA validates, applies its own cryptographic stamp, and returns the cleared invoice. Only the cleared document is legally valid and shareable with the buyer. | | | | -------------------- | -------------------------------------------------------------------------------------------------- | | **Models** | B2B, B2G | | **Format** | UBL 2.1 XML with KSA extensions | | **Infrastructure** | Fatoora | | **Model** | Clearance (real-time) | | **Scope & Deadline** | Resident VAT-registered taxpayers; rolling out in waves (see [timeline](/timelines/saudi-arabia)). | | **Agency** | [ZATCA](https://zatca.gov.sa) | | **Invopop Support** | [Saudi Arabia](/apps/saudi-arabia) | Connect the app to get you covered → Used for transactions with end consumers; the buyer's VAT details are not required and the field set is reduced. The issuer signs and delivers the invoice to the buyer immediately at the point of sale, then **reports** it to ZATCA within 24 hours. | | | | -------------------- | -------------------------------------------------------------------------------------------------- | | **Models** | B2C | | **Format** | UBL 2.1 XML with KSA extensions | | **Infrastructure** | Fatoora | | **Model** | Reporting (within 24h) | | **Scope & Deadline** | Resident VAT-registered taxpayers; rolling out in waves (see [timeline](/timelines/saudi-arabia)). | | **Agency** | [ZATCA](https://zatca.gov.sa) | | **Invopop Support** | [Saudi Arabia](/apps/saudi-arabia) | Connect the app to get you covered → ## Implementation phases ZATCA introduced e-invoicing in two phases. Mandatory for all VAT-registered residents since 4 December 2021. Required taxpayers to: * Issue invoices and notes in a structured electronic format from a compliant solution. * Stop issuing handwritten or manually edited invoices. * Include a QR code on simplified tax invoices. Phase 1 did not require integration with ZATCA's platform, the obligation was to generate compliant electronic documents and store them. The integration phase started on 1 January 2023 and is rolling out to taxpayers in **waves** based on their VAT-taxable revenue. In addition to Phase 1 requirements, Phase 2 introduces: * Integration of the issuer's solution with the Fatoora platform via API. * Cryptographic stamping with a ZATCA-issued certificate (CSID). * Real-time clearance of standard invoices and 24-hour reporting of simplified invoices. * An expanded QR code carrying the seller's VAT registration number, cryptographic signature and invoice hash. * UBL 2.1 XML in line with ZATCA's *Electronic Invoice XML Implementation Standard*. Onboarding has progressed through waves at descending revenue thresholds. The most recent announcements: | Wave | VAT-taxable revenue threshold | Reference year(s) | Integration deadline | | ---- | ----------------------------- | ------------------ | -------------------- | | 23 | > SAR 750,000 | 2022, 2023 or 2024 | 31 March 2026 | | 24 | > SAR 375,000 | 2022, 2023 or 2024 | 30 June 2026 | Wave 24 effectively brings every VAT-registered business under the mandatory VAT registration threshold (SAR 375,000) into scope. ZATCA notifies taxpayers in each wave at least six months before their go-live date. ## Compliance From ZATCA's *Detailed Guidelines for E-Invoicing* and the *E-Invoicing Implementation Resolution*: **Standard tax invoice (B2B, B2G)** * Seller name, address, VAT registration number, and one of the following identities: MOMRAH, MHRSD, 700, MISA or Commercial Registration number. * Buyer name, address, and either a VAT registration number or one of the following identities: Tax Identification Number, Commercial Registration number, MOMRAH, MHRSD, 700, MISA, National ID, GCC, Iqama Number or Passport ID. * Invoice issue date and supply date if different. * Sequential invoice number and UUID. * Line-item description, quantity, unit price and any discounts. * VAT rate and VAT amount per line. * VAT-exclusive subtotal, VAT total and VAT-inclusive total, expressed in SAR. * QR code with the eight Phase 2 TLV tags. * Invoice Counter Value (ICV) and Previous Invoice Hash (PIH). * ZATCA's clearance stamp. **Simplified tax invoice (B2C)** The simplified invoice carries a reduced field set: seller details, issue date, line items, VAT breakdown, totals in SAR, QR code, UUID, ICV, PIH and the issuer's cryptographic stamp. Buyer details are not required, except in specific cases set by the VAT Implementing Regulation. Source: [ZATCA E-Invoicing](https://zatca.gov.sa/en/E-Invoicing/Pages/default.aspx). Invoices are issued in **Saudi Riyal (SAR)**. Foreign-currency invoices are permitted, but the VAT amount must also be shown in SAR, converted using the SAMA (Saudi Central Bank) exchange rate on the supply date. Saudi Arabia's standard VAT rate is **15%**, in force since 1 July 2020 (raised from the original 5%). * **Standard rate**: 15% — applies to most goods and services. * **Zero-rated**: exports outside the GCC, qualifying international transport, qualifying medicines and medical equipment, investment-grade gold, silver and platinum (≥99% purity), private education and healthcare, and the supply of qualified military goods. * **Exempt**: certain margin-based financial services and residential real-estate rentals. Source: [ZATCA VAT rules and regulations](https://zatca.gov.sa/en/RulesRegulations/VAT/Pages/default.aspx). Issued invoices cannot be cancelled or edited once they have been cleared (standard) or reported (simplified). Any correction must be made by issuing a **credit note** (reduction) or **debit note** (increase) that references the original invoice's number, date and reason for correction. Notes follow the same clearance or reporting flow as the document type they correct. The VAT Implementing Regulation requires invoices and supporting records to be retained for **at least 6 years** from the end of the relevant tax period. Records must be **stored within Saudi Arabia**; digital archives must reside on servers located in the Kingdom, and originals must not be deleted or altered. The obligation applies to all **resident taxable persons** registered for VAT in Saudi Arabia, including any third party issuing invoices on their behalf (e.g. billing service providers). Non-resident taxable persons are out of scope of the e-invoicing mandate, even where they are otherwise registered for VAT. ## Reference documents ZATCA publishes the full regulatory and technical specification on its e-invoicing site: * [E-Invoicing landing page](https://zatca.gov.sa/en/E-Invoicing/Pages/default.aspx) * [Roll-out phases](https://zatca.gov.sa/en/E-Invoicing/Introduction/Pages/Roll-out-phases.aspx) * [E-Invoicing Implementation Resolution](https://zatca.gov.sa/en/E-Invoicing/Introduction/LawsAndRegulations/Documents/E-Invoicing%20Implementation%20Resolution_EN.pdf) * [Detailed Guidelines for E-Invoicing](https://zatca.gov.sa/en/E-Invoicing/Introduction/Guidelines/Documents/E-Invoicing_Detailed__Guideline.pdf) * [Electronic Invoice XML Implementation Standard](https://zatca.gov.sa/ar/E-Invoicing/SystemsDevelopers/Documents/20230519_ZATCA_Electronic_Invoice_XML_Implementation_Standard_%20vF.pdf) * [Electronic Invoice Security Features Implementation Standards](https://zatca.gov.sa/ar/E-Invoicing/SystemsDevelopers/Documents/20230519_ZATCA_Electronic_Invoice_Security_Features_Implementation_Standards_vF.pdf) *** Ask and answer questions about Saudi Arabia's regulation → # Invoicing compliance in Singapore Source: https://docs.invopop.com/compliance/singapore Singapore's mandatory e-invoicing requirements, GST InvoiceNow, Peppol network adoption, and GST reporting obligations for B2B and B2G transactions View current and upcoming regulation → | | | | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Compliance | [Invoicing compliance in Singapore](/compliance/singapore)
[Compliance timeline](/timelines/singapore) | | FAQ | [Singapore FAQ](/faq/singapore) |
## Executive summary Singapore's e-invoicing and reporting framework is built around InvoiceNow, a single nationwide network operated by the Infocomm Media Development Authority (IMDA) and anchored in the internationally recognized Peppol standard. Singapore has pursued a phased approach to implement its e-invoicing and reporting framework. [GST InvoiceNow Requirement](#invoicenow-b2b-b2g) is already mandatory for newly incorporated companies that voluntarily register for GST, and will progressively extend to all GST-registered businesses. It requires structured invoice data to be transmitted to IRAS (Inland Revenue Authority of Singapore) via the Peppol network, using a [five-corner model](/faq/singapore#what-is-the-five-corner-model-in-the-context-of-peppol) where IRAS is the fifth corner. [GST F5 Reporting](#gst-f5-reporting) requires all GST-registered businesses to file quarterly aggregate VAT returns via IRAS's myTax Portal. This article also provides insight and further resources to understand [invoice regulation in Singapore](#regulation). ## Invoicing in Singapore Singapore's approach to invoicing digitalization is centralized and standards-driven. The Infocomm Media Development Authority (IMDA) governs the InvoiceNow network, while the Inland Revenue Authority of Singapore (IRAS) is responsible for GST enforcement and the mandatory e-reporting dimension. Singapore became the first Peppol Authority outside Europe in 2018, giving businesses on the network built-in cross-border interoperability with all other Peppol-connected jurisdictions. * [GST InvoiceNow Requirement](#invoicenow-b2b-b2g) — mandatory for new voluntary GST registrants, rolling out to all GST-registered businesses through 2026 and beyond. * [GST F5 Reporting](#gst-f5-reporting) — quarterly aggregate GST returns required for all GST-registered businesses. Mandatory from 1 November 2025 for newly incorporated companies that voluntarily register for GST. Mandatory from 1 April 2026 for all new voluntary GST registrants. Extension to compulsory registrants and all existing GST-registered businesses is planned for subsequent phases (dates TBC by IRAS). Singapore's fiscal mandates, requiring GST-registered businesses to transmit structured invoice data to IRAS via the Peppol-based InvoiceNow network. Invoices are sent in real time through an IMDA-accredited Access Point provider. IRAS acts as the fifth corner of the network receiving a copy of every covered transaction. The system uses the **PINT-SG** format (progressively replacing Singapore BIS Billing 3.0), based on OASIS UBL 2.1 XML with Singapore-specific adaptations including GST registration numbers, PayNow/GIRO payment methods, and IRAS validation rules. | | | | ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | | **Scope** | B2B, B2G | | **Format** | PINT-SG / Singapore BIS Billing 3.0 (UBL 2.1 XML) | | **Compliance** | E-invoicing and e-reporting | | **Infrastructure** | Peppol network (decentralized, via accredited Access Points) | | **Model** | Near real-time invoice reporting (five-corner Peppol) | | **Effective date** | Mandatory from **1 November 2025** (new voluntary GST registrants, newly incorporated); **1 April 2026** (all new voluntary GST registrants) | | **Agency** | [IRAS](https://www.iras.gov.sg) / [IMDA](https://www.imda.gov.sg) | | **Invopop support** | Coming soon | ## E-reporting Involves sending invoice data or aggregate tax information to IRAS, either in near real time (via InvoiceNow) or periodically (via the GST F5 return). All GST-registered businesses must file a quarterly GST return (Form F5) via IRAS's myTax Portal, reporting aggregate totals across output tax, input tax, and net GST payable. Returns are due one month after the end of each accounting period. The GST F5 is not replaced by InvoiceNow — both obligations coexist. | | | | ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Scope** | B2C, B2B, B2G | | **Format** | Aggregate return (15-box GST F5 form) | | **Compliance** | E-reporting | | **Effective date** | Mandatory for all GST-registered businesses | | **Notes** | Monthly filing available by election. Nil returns required even with no transactions. Late filing incurs a S$200 penalty per month, up to S$10,000 per return. | | **Agency** | [IRAS](https://www.iras.gov.sg) | | **Invopop support** | Coming soon | ## Regulation **Full Tax Invoice (B2B — required when total exceeds S\$1,000)** A GST-registered supplier must issue a full tax invoice within **30 days** of the time of supply. It must contain: * The words "Tax Invoice" displayed prominently * A unique, sequential serial number * Date of issue * Supplier's name, address, and GST registration number * Customer's name and address * Description of goods or services supplied * Quantity and unit price (excluding GST) for each line item * Any discounts or reductions applied * The GST rate (9%) * Total GST amount in Singapore dollars * Total amount payable including GST * Indication of whether each supply is standard-rated (9%), zero-rated (0%), or exempt **Simplified Tax Invoice (total payable S\$1,000 or less)** A simplified tax invoice may be issued and requires only: * Supplier's name, address, and GST registration number * Date of issue * Sequential serial number * Description of goods or services * Total amount payable including GST (GST need not be shown separately) Customer details and per-line GST breakdowns are not required on simplified invoices. **Credit Notes** Credit notes must include the words "Credit Note" prominently, the supplier's GST registration details, the reason for the credit, a reference to the original tax invoice, and the GST rate and amount credited. Credit notes that do not adjust GST must state "This is not a credit note for GST purposes." A GST-registered business does not need to issue a tax invoice for: 1. **Zero-rated supplies** (exports of goods, international services) — a commercial invoice or export documentation suffices, though GST records must still be maintained. 2. **Exempt supplies** — including most financial services, residential property leases, and investment-grade precious metals. No tax invoice is required, and input tax on costs related to exempt supplies generally cannot be claimed. 3. **Supplies to non-GST-registered customers** — a simplified invoice or receipt is acceptable. A full tax invoice is only required when the customer is GST-registered and requests one. 4. **Deemed supplies** — such as gifts exceeding S\$200 in value; these are self-accounted and do not require an outward invoice. Even in these cases, you must issue a tax invoice if a GST-registered customer requests one for input tax claim purposes. **The archival period for invoices and accounting records in Singapore is as follows:** * **5 years (IRAS — GST and income tax):** The standard minimum. Records must be retained for five years from the end of the relevant GST accounting period or Year of Assessment — even after a business ceases operations or deregisters from GST. Required under Section 67 of the Income Tax Act and Section 46 of the GST Act. * **5 years (ACRA — Companies Act):** Section 199 of the Companies Act independently requires companies to retain accounting records for five years from the end of the financial year in which the transactions were completed. * **Longer periods in special cases:** * **Ongoing audits or legal disputes:** Records must be retained until the matter is fully resolved. * **Capital assets:** Supporting records for capital expenditure claims should be retained for the full duration of claiming, which may exceed five years. Electronic records are fully acceptable for all tax purposes with no prior IRAS approval required, provided they remain accessible, retain their original form, and are protected from tampering with a proper audit trail. To connect to InvoiceNow, a business requires: * A valid **Unique Entity Number (UEN)** * **CorpPass** KYC certification * A connection to an **IMDA-accredited Access Point provider** (Peppol Service Provider) Businesses using off-the-shelf accounting software should check IMDA's list of **InvoiceNow-Ready Solution Providers (IRSPs)** for compatible products. Businesses running in-house ERP systems should engage an accredited Access Point directly — integration typically takes 3 to 12 months. Financial support available: * **Productivity Solutions Grant (PSG):** Up to S\$30,000 * **InvoiceNow Accelerate programme:** One year of free services for newly incorporated businesses * Free-of-charge solution packages from select IRSPs **Registration threshold:** Businesses with annual taxable turnover exceeding \*\*S$1 million** must register for GST — assessed either retrospectively (at calendar year-end) or prospectively (when turnover is expected to exceed S$1 million in the next 12 months). Late registration carries a fine of up to S\$10,000 plus a 10% surcharge on GST due from the date liability arose. **Current GST rates:** | Supply type | Rate | | ------------------------------------------------------------------ | ---- | | Standard-rated (local B2B and B2C supplies) | 9% | | Zero-rated (exports of goods, international services) | 0% | | Exempt (financial services, residential property, precious metals) | N/A | **Cross-border and digital services:** * **Overseas Vendor Registration (OVR) regime:** Overseas suppliers of digital services, remote services, and low-value goods (≤ S$400) to Singapore consumers must register for GST if global turnover exceeds S$1 million and Singapore B2C supplies exceed S\$100,000. * **Reverse charge:** Partially exempt GST-registered businesses that import services must self-account for GST as if they were the supplier. * **Import GST:** GST at 9% applies on the CIF value plus customs duty for goods imported into Singapore. The Major Exporter Scheme and Import GST Deferment Scheme provide relief for qualifying businesses. IRAS conducts risk-based GST audits rather than mandatory fiscal device checks. Key compliance tools include: * **IRAS Audit File (IAF):** A detailed pipe-delimited or XML file generated from the general ledger, required when selected for audit. Most major accounting software supports IAF generation. * **GST Assisted Self-Help Kit (ASK):** A voluntary self-assessment framework with three components — internal process review, pre-filing checklist, and annual review of prior submissions. Mandatory when applying for certain GST schemes (e.g., Import GST Deferment Scheme). * **Voluntary Disclosure Programme:** Errors voluntarily disclosed within one year of the filing deadline qualify for reduced or waived penalties. Disclosure via GST ASK strengthens the case for penalty reduction. Penalties for non-compliance: * Late or incorrect GST returns: up to 200% of tax undercharged * Inadequate record-keeping: up to S$5,000 (GST Act), S$1,000 (Income Tax Act), or S\$5,000 / 12 months' imprisonment (Companies Act) * Non-registration: fine up to S\$10,000 plus 10% surcharge on GST owed * [IRAS GST InvoiceNow Requirement](https://www.iras.gov.sg/taxes/goods-services-tax-\(gst\)/gst-invoicenow-requirement) * [IMDA InvoiceNow](https://www.imda.gov.sg/how-we-can-help/nationwide-e-invoicing-framework/invoicenow) * [Singapore Peppol Guide](https://www.peppolguide.sg/) *** Ask and answer questions about Singapore's regulation → # Invoicing compliance in Spain Source: https://docs.invopop.com/compliance/spain Spain's mandatory e-invoicing requirements, VERI*FACTU, TicketBAI, and Facturae implementation, and SII e-reporting obligations for B2B and B2G transactions View current and upcoming regulation → | | | | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Compliance | [Invoicing compliance in Spain](/compliance/spain)
[Compliance timeline](/timelines/spain) | | Apps | [Spain](/apps/spain)
[VERI\*FACTU Spain](/apps/verifactu-spain)
[TicketBAI (Spain app)](/apps/spain) | | Guides | [Facturae guide](/guides/es-facturae)
[VERI\*FACTU invoicing guide](/guides/es-verifactu)
[VERI\*FACTU supplier onboarding](/guides/es-verifactu-supplier)
[SII invoicing guide](/guides/es-sii)
[SII supplier onboarding](/guides/es-sii-supplier)
[TicketBAI guide](/guides/es-ticketbai) | | FAQ | [Spain FAQ](/faq/spain) | | GOBL | [Spain Tax Regime](https://docs.gobl.org/regimes/es)
[VERI\*FACTU Addon](https://docs.gobl.org/addons/es-verifactu-v1)
[Facturae Addon](https://docs.gobl.org/addons/es-facturae-v3)
[SII Addon](https://docs.gobl.org/addons/es-sii-v1) | | GitHub | [gobl.facturae](https://github.com/invopop/gobl.facturae)
[gobl.verifactu](https://github.com/invopop/gobl.verifactu)
[gobl.ticketbai](https://github.com/invopop/gobl.ticketbai) |
## Executive summary In Spain, e-invoicing compliance is governed by a complex, regionally differentiated system designed to ensure transparency, prevent fraud, and align with EU digitalization standards. The country relies on multiple overlapping frameworks rather than a single unified system, reflecting both regional fiscal autonomy and incremental regulatory evolution. [VERI\*FACTU](#veri-factu-b2b) is already available and becomes mandatory on January 1, 2027 for companies and on July 1, 2027 for all other taxpayers, except those already reporting via SII or TicketBAI. It requires digitally signed invoices and a QR code linking to AEAT verification. [Crea y Crece](#crea-y-crece-b2b) (RD 238/2026) introduces mandatory structured B2B e-invoicing through a new public/private platform system, rolling out in phases starting \~12 months after the upcoming Orden Ministerial (expected late 2026). [TicketBAI](#ticketbai-b2b) applies in the Basque Country (Álava, Bizkaia, Gipuzkoa) and mandates certified software for digitally signed XML invoices, including QR codes and unique identifiers. [Facturae](#facturae-b2g) is required for B2G transactions. XML invoices are reported through the FACe platform. [SII](#sii-large-companies) mandates near-real-time VAT reporting for large companies and select taxpayers. This article also provides insight and further resources to understand [invoice regulation in Spain](#regulation). ## Invoicing in Spain Spain’s numerous invoicing and reporting systems stems from its decentralized fiscal structure, where regions like the Basque Country and Navarra manage their own tax authorities, alongside the national AEAT. Instead of a unified reform, Spain has evolved through incremental, purpose-specific initiatives. This layered approach reflects the country’s effort to balance regional autonomy, EU digitalization mandates, and the fight against tax fraud, but it has produced a patchwork of systems that coexist under overlapping jurisdictions. * [VERI\*FACTU](#veri-factu-b2b) enforced in 2027, required for self-employed individuals and companies not covered by SII or TicketBAI. * [Crea y Crece](#crea-y-crece-b2b) introduces mandatory B2B e-invoicing through a new public/private platform system, rolling out in phases following the upcoming Orden Ministerial. * [TicketBAI](#ticketbai-b2b) required for issuers with tax obligations to the foral agencies of Álava, Bizkaia and Gipuzkoa. * [Facturae](#facturae-b2g) is required when businesses invoice Spanish public administrations (B2G), requiring invoices in XML format submitted through the **FACe** platform. * [SII](#sii-large-companies) mandates near-real-time reporting of invoice data to the Spanish Tax Agency (AEAT) for large companies. ### Spain VERI\*FACTU will be mandatory for companies from January 1, 2027, and for all other taxpayers from July 1, 2027. Companies reporting with SII or TicketBAI are exempt from reporting with VERI\*FACTU. Spain’s upcoming e-reporting and fiscalization regulation requiring businesses to use approved software that records and digitally signs each invoice to ensure transparency and prevent fraud. The format requires a QR code which links to the online verification service of the AEAT. | | | | ------------------- | ---------------------------------------------------------------------------- | | **Scope** | B2C, B2B, B2G | | **Format** | VERI\*FACTU (XML) | | **Compliance** | Fiscalization and e-reporting (not e-invoicing) | | **Infrastructure** | Hybrid: public and private platforms | | **Model** | Real Time Invoice Reporting and fiscalization | | **Effective date** | Mandatory for businesses issuing B2C, B2B, B2G invoices from **Jan 1, 2027** | | **Agency** | [AEAT](https://sede.agenciatributaria.gob.es) | | **Invopop Support** | [VERI\*FACTU Spain App](/apps/verifactu-spain) | Connect the app to get you covered → Ley 18/2022 ("Crea y Crece") mandates structured electronic invoicing for all B2B transactions in Spain. The technical framework is set out in **Real Decreto 238/2026** (in force since 20 April 2026). Effective deadlines depend on the upcoming Orden Ministerial: companies with turnover above €8M will have 12 months from the OM's entry into force, and all other businesses 24 months. Invoices must follow the EN 16931 semantic model, carry a unique identifier, and be signed with an advanced electronic signature. They are exchanged either through the AEAT's new free **Solución Pública de Facturación Electrónica** or through interoperable private platforms — which must additionally send a UBL "copia fiel" of each invoice to the Solución Pública at the moment of issuance. Recipients must report acceptance/rejection and effective payment within 4 calendar days (excluding Saturdays, Sundays, and national holidays). Crea y Crece is distinct from VERI\*FACTU: VERI\*FACTU regulates invoicing software and tax-agency reporting; Crea y Crece regulates how B2B invoices are exchanged between businesses. | | | | ------------------- | ------------------------------------------------------------------------------------------------------------------------ | | **Scope** | B2B | | **Format** | EN 16931–compliant: Facturae, UBL (incl. Peppol BIS), CII, EDIFACT | | **Compliance** | E-invoicing and invoice-state reporting | | **Infrastructure** | AEAT Solución Pública + interconnected private platforms | | **Model** | Decentralised exchange with mandatory UBL copy to AEAT | | **Effective date** | \~12 months after the Orden Ministerial enters into force for businesses with turnover > €8M; \~24 months for all others | | **Agency** | [AEAT](https://sede.agenciatributaria.gob.es) (technical), Ministerio de Economía / Ministerio de Hacienda (regulatory) | | **Invopop support** | TBD | Facturae is the Spanish XML-based format for electronic invoices used in B2G transactions. It requires a digital signature and aligns with EN 16931 (EU) for electronic invoicing. Invoices in Facturae format are submitted at [FACe](https://face.gob.es/es), a centralized government platform. Note that the supplier must issue a VERI\*FACTU or TicketBAI invoice **in addition** to the Facturae invoice. | | | | ------------------- | -------------------------------------------------------------------------------------------- | | **Scope** | B2G | | **Format** | Facturae | | **Compliance** | e-invoicing and e-reporting | | **Infrastructure** | [FACe](https://face.gob.es/es) | | **Model** | Centralized | | **Effective date** | Mandatory for companies issuing invoices to public authorities since 2015 | | **Agency** | [Agencia Estatal de Administración Tributaria](https://sede.agenciatributaria.gob.es) (AEAT) | | **Invopop support** | [Facturae Spain App](/apps/facturae-spain) (invoicing, reporting done through FACe) | Connect the app to get you covered → Companies reporting to TicketBAI or SII are exempt from issuing VERI\*FACTU ### Álava, Gipuzkoa and Bizkaia Spain’s Haciendas Forales are the provincial tax authorities of the Basque Country (Álava, Bizkaia, and Gipuzkoa), which possess unique fiscal autonomy under the Spanish Constitution. These provinces manage variations of the TicketBAI standard which Invopop simplifies. Read our comprehensive article [What is the TicketBAI regulation in Euskadi?](https://www.invopop.com/blog/what-is-ticketbai) for more information. TicketBAI is the Basque Country’s electronic invoicing and anti-fraud system. It requires businesses to use certified software that generates a digitally signed XML file for every invoice and automatically sends it to the corresponding provincial tax authority (Álava, Bizkaia, or Gipuzkoa). Each invoice must also include a QR code and TBAI identifier, allowing verification by both customers and tax inspectors. Full compliance now mandatory across the Basque Country. | | | | ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Scope** | B2C, B2B, B2G | | **Format** | TicketBAI (XML) | | **Infrastructure** | Hybrid system: Public solution and private platforms | | **Compliance** | e-invoicing and e-reporting | | **Model** | Real Time Invoice Reporting | | **Region** | Álava, Bizkaia and Gipuzkoa | | **Effective date** | Since January 1st, 2022 | | **Agencies** | [Agencia Foral de Gipuzkoa](https://www.gipuzkoa.eus/es/web/ogasuna/ticketbai)
[Hacienda Foral de Álava](https://web.araba.eus/es/hacienda/ticketbai)
[Hacienda Foral de Bizkaia](https://www.batuz.eus/es/inicio) | | **Invopop support** | [Spain App](/apps/spain) (TicketBAI) | Connect the app to get you covered →
### Navarra Upcoming format/reporting announced in September 2025 by the tax authorities of Navarra. The government has not published information about this implementation, but has stated that it will be based on TicketBAI and VERI\*FACTU. Details and Invopop support will be announced once the technical specification is made available. Upcoming format/reporting announced in September 2025 by the tax authorities of Navarra. The government has not published information about this implementation, but has stated that it will be based on TicketBAI and VERI\*FACTU. Details and Invopop support will be announced once the technical specification is made available. ## E-reporting Involves sending invoice data to tax authorities in real-time or near real-time, typically as part of government initiatives to improve tax compliance and reduce VAT fraud. SII allows AEAT to receive VAT-related information almost in real time. It aims to reduce errors in VAT declarations, improve fraud detection, and streamline administrative reporting. Obligatory for large companies with an annual turnover > €6 million and optional for smaller companies that want faster reconciliation with the Tax Agency. | | | | ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Scope** | B2C, B2B, B2G | | **Format** | SII (XML) | | **Compliance** | Fiscalization and e-reporting | | **Effective date** | Mandatory since 2017 | | **Notes** | Applies to large companies (turnover exceeding €6,010,121.04 in the previous year), VAT groups, and those registered in the REDEME (Monthly VAT Refund Register). | | **Agency** | [AEAT](https://sede.agenciatributaria.gob.es) | | **Invopop support** | [Spain App](/apps/spain) | Connect the app to get SII support → ## Regulation **Complete (B2B) Invoice** * Invoice number and series (where applicable). The numbering of invoices within each series shall be consecutive. * Series for the following invoices are mandatory: * Those issued by the customers or by third parties (each needs its own series). * Correction invoices (Credit/Debit notes). * In forced collection proceedings, invoices issued by winning bidders who are business owners or professionals . * Issue date. * Full name or complete business name of both the party issuing the invoice and the customer. * Tax ID Number assigned by the Spanish tax authorities or another EU Member State. The customer's Tax ID Number must also be included when: * It's a tax-exempt sale of goods between EU countries. * The customer is responsible for paying the tax on the transaction. * The transaction takes place within the Spanish tax territory (TAI), and the business owner or professional issuing the invoice is considered to be based in that territory. * Address of both the party issuing the invoice and the customer. * Description of the goods or services, including all information needed to calculate the taxable amount, such as the unit price before tax, and any discounts or reductions not already included in that unit price. * The tax rate or rates applied to the transactions. * The tax amount being charged, which must be shown separately. * The date when the transactions took place or when advance payment was received, if different from the invoice date. * In sales of new vehicles, the first use date and the distance traveled or hours of navigation or flight up to delivery. * If any of the following apply, it must be mentioned: tax-exempt transaction, customer issues the invoice, reverse charge (customer pays the tax), Travel Agency special scheme, or second-hand goods special scheme **Simplified Invoice** * Number and, if relevant, series. * Date of issue. * Date of the transaction if different from the issue date. * Tax ID Number (NIF) and full name or business name of the issuer. * Description of the goods delivered or services provided. * Tax rate, and optionally the phrase "VAT included" * Total amount. * For correction invoices, reference to the invoice being corrected. * If any of the following apply, it must be mentioned: tax-exempt transaction, customer issues the invoice, reverse charge (customer pays the tax), Travel Agency special scheme, or second-hand goods special scheme. The tax authority may require additional information in certain situations, but this can never exceed what's required for a complete invoice. In certain situations it may authorize that simplified invoices that don't include some of the above requirements. These authorizations must be properly published. You don't have to issue invoices in the following scenarios: 1. **Tax-exempt transactions** under [Article 20 of Law 37/1992](https://www.boe.es/buscar/act.php?id=BOE-A-1992-28740), **with some exceptions**: you still need to invoice for healthcare and hospital services, property sales, and goods exempt because you couldn't claim back the VAT you paid. 2. **If you're under the [Equivalence Surcharge Regime](https://sede.agenciatributaria.gob.es/Sede/iva/regimenes-tributacion-iva/regimen-especial-recargo-equivalencia/que-consiste-regimen-especial-recargo-equivalencia.html)** (a special VAT system). However, you must invoice for property sales that aren't tax-exempt (unless they're part of enforcing a guarantee). 3. **If you're under the [Simplified Tax Regime](https://sede.agenciatributaria.gob.es/Sede/iva/regimenes-tributacion-iva/regimen-simplificado.html)**, unless your tax is calculated based on how much you earn. You still need to invoice when selling fixed assets. 4. **Other cases where the Tax Agency gives you permission** - they might waive the invoice requirement for certain industries or specific companies to keep business running smoothly. **Important:** Even in these four cases, you must issue an invoice if: * Your customer is a business/professional or a private individual who needs it for tax purposes * You're selling to another EU country * You're exporting goods * Your customer is a government body or a legal entity that isn't acting as a business 5. **If you're in farming, livestock, or fishing under the special regime for those sectors**. You'll need to issue an "agricultural receipt" for compensation reimbursements if you bought from others in the same regime. You always need to invoice for property sales. 6. **Financial and insurance transactions** - no matter who you're dealing with, even other businesses. **Exception:** you do need to invoice for taxable transactions (that aren't exempt) in mainland Spain, the Balearic Islands, or another EU country. **The archival period of invoices dictated by the AEAT is the following:** * **4 years:** This is the minimum general requirement for most invoices for tax purposes. Starting from the date for filing the corresponding tax return, according to General Tax Law 58/2003. * **6 years:** Commercial regulations require you to keep business documentation for 6 years, including invoices, correspondence, and supporting documents, under Article 30 of the Commercial Code. * **10 years (or longer):** Some special cases require longer retention periods: * **Capital assets/investments:** Must be kept for up to 10 years. * **Public grants:** Invoices related to EU public funding may need to be kept for up to 10 years, depending on European regulations. * **Legal disputes or inspections:** You may need to keep invoices longer if there's an ongoing lawsuit or tax inspection, such as in cases of tax fraud. There is no official certification for VERI\*FACTU from the AEAT (the Spanish tax agency). Instead, each developer, company, or provider that implements an invoicing software must provide an electronically signed declaration where they certify that their system meets all the requirements established in the regulations. This document is binding and must be kept available for the Tax Authority. The AEAT requires that this declaration be available and always visible within the system itself, and it must include certain control elements such as the installation number, issuer data, software version, and system ID. If you are a white label user of Invopop (you issue invoices in the name of third parties), you are required to display a link to this "declaración responsable" in your software. Here is [the template from the AEAT](https://sede.agenciatributaria.gob.es/static_files/Sede/Tema/IVA/Verifactu/EjemplosDeclaracionResponsable\(V0.5.1\).pdf), and our own for your reference: [Declaración responsable VERI\*FACTU - Invopop](https://drive.google.com/file/d/1IR2EuavoEi8E3hlAM4u-XTIFbalxxKzj/view). Some of our customers have asked us if it is necessary to mention Invopop in their *declaración responable*. It is not required, but we appreciate it. The Spanish Tax Agency (AEAT) requires that companies formally authorize Invopop to issue invoices on their behalf. To comply with this regulation, the supplier’s legal representative must sign an agreement granting Invopop the necessary consent to generate and manage invoices in their name. This signed authorization ensures that all invoicing activities carried out by Invopop are legally valid and recognized by the AEAT. For this process, the supplier can sign the agreement PDF with a valid digital certificate, such as one issued by the FNMT, or a handwritten signature with a company stamp (sello de empresa), in which case the user must provide a valid ID such as DNI, NIE or passport. In the case of self-employed individuals (autónomos) a company stamp is not required. [View the representation agreeement process](/guides/es-verifactu-supplier#onboard-suppliers-through-the-supplier-registration-wizard). **Autónomo (Self-employed individual)** An autónomo's NIF is simply their DNI or NIE: * **DNI** (Documento Nacional de Identidad) — for Spanish nationals. Format: 8 digits + 1 letter (e.g., `12345678A`) * **NIE** (Número de Identidad de Extranjero) — for foreign residents. Format: 1 letter + 7 digits + 1 letter (e.g., `X1234567A`) Since an autónomo operates as a natural person (not a separate legal entity), their personal ID number is their tax number. There's no distinction between the person and the business. **Company (Sociedad / Legal entity)** A company has a CIF (Código de Identificación Fiscal), which is now technically also called a NIF but for legal entities. Format: 1 letter + 7 digits + 1 control character (letter or digit) (e.g., `B12345678`) The first letter indicates the type of entity: * **A** — Sociedad Anónima (S.A.) * **B** — Sociedad Limitada (S.L.) — the most common * **C** — Sociedad Colectiva * **G** — Associations / Foundations * **N** — Foreign entities * **P** — Local government bodies * **Q/S** — Public bodies 1. VAT (IVA: Impuesto sobre el Valor Añadido) * Standard: 21% * Reduced: 10% * Super-reduced: 4% * Each of these can include an Equivalence Surcharge for retailers (eqs). * Variants exist for special sectors, e.g., agriculture, modules. 2. IGIC (Impuesto General Indirecto Canario) * Zero: 0% * Reduced: 3%. * General: 7,00% * Incremented: 9,5% and 15,0% * Special: 20% 2. IPSI (Ceuta & Melilla) * General: 4% Melilla, 3% Ceuta * Reduced: 0,5% * Incremented: 10% 3. IRPF Rates (Personal Income Tax) * Professional rates: 15% * Professional starting rate: 7.0% * Rental or Interest Capital: 19.0% * Modules Rate: 1% Our blog posts are comprehensively researched and a great source of information regarding electronic invoicing, reporting and fiscalization. We recommend the following reads: * [What is the TicketBAI regulation in Euskadi?](https://www.invopop.com/blog/what-is-ticketbai) * [Verifactu: Spain’s E-Invoicing System Explained](https://www.invopop.com/blog/verifactu-invoicing-system) * [Spain publishes draft for B2B e-invoicing system](https://www.invopop.com/blog/spain-draft-royal-decree-b2b-e-invoicing) * [Spain publishes consultation on B2B e-invoicing](https://www.invopop.com/blog/spain-consultation-b2b-e-invoicing) * [Electronic invoicing in Spain](https://www.invopop.com/blog/electronic-invoicing-in-spain) ## FAQ Compliance questions Spain Crea y Crece (Ley 18/2022, "Law on the Creation and Growth of Companies") is a Spanish law introducing **mandatory B2B electronic invoicing** for all businesses and professionals established in Spain. Its primary policy goal is **combating late payments**. Spain has one of the longest average payment periods in the EU (\~80 days), and the law forces structured, traceable data on every B2B invoice, plus mandatory **invoice status reporting** (acceptance, rejection, payment date) so payment behavior becomes visible and measurable. Key parameters as they stand now: * **Scope**: domestic B2B transactions where the recipient is a business or professional established in Spain. * **Architecture**: hybrid — a free public AEAT platform plus interoperable private platforms. * **Format**: EN 16931-compliant UBL is mandatory for the public solution and for *copias fieles* submitted from private platforms; Facturae, UBL, CII and EDIFACT are accepted between private platforms. * **Timeline**: Royal Decree 238/2026 was published 31 March 2026; the Ministerial Order is expected to enter force 1 October 2026, triggering the clocks — **12 months later** for companies with turnover >€8M, **24 months later** for everyone else, with status reporting deferred a further year for sole traders / IRPF attribution entities. This regulation aims to transform invoicing from "PDF by email" into a structured, reportable, interoperable network. Any entity with a Spanish NIF — companies, autónomos, and foreign entities with Spanish fiscal presence. Foreign-only entities issuing into Spain must operate through their local fiscal representation or a non-resident NIF. Quarterly or monthly VAT (Modelo 303), annual recap (Modelo 390), recapitulative intra-EU declaration (Modelo 349), and the annual third-party transactions return (Modelo 347). Crea y Crece (2027) adds invoice status reporting (acceptance, rejection, payment date) on top. Facturae Mandatory for B2G transactions with Spanish public administrations above €5,000 since 2015 (Ley 25/2013). Voluntary for B2B today; will become broadly mandatory once Crea y Crece's implementing decree takes effect (currently expected 2027). For B2G submissions, the supplier needs a valid digital certificate recognized by FACe (Cl\@ve, FNMT, etc.). For Invopop-generated XAdES signatures the certificate is Invopop's own; suppliers using their own signing flow upload theirs. Spanish public administrations must accept Facturae through FACe or a regional equivalent (e-FACT in Cataluña, FACeB2B for B2B). Private sector recipients have no Facturae-specific obligations beyond the standard 4-year archival. No-VERI\*FACTU "No-VERI\*FACTU" is the alternative compliance mode under the same Spanish billing-software regulation (Reglamento de Sistemas Informáticos de Facturación). Invoices are *not* sent to AEAT in real time; instead they are registered locally in the certified system and may be inspected on demand. Suitable for businesses that prefer to keep records private unless asked. Same fiscal residence requirements as VERI\*FACTU. Additionally, the supplier must be able to produce the chained register on AEAT request; Invopop retains it on their behalf for the legally required period. SII SII (*Suministro Inmediato de Información*) is mandatory for taxpayers that file VAT on a monthly basis. In practice this includes companies with annual turnover above €6,010,121.04, members of VAT groups (REGE), and businesses registered in the monthly VAT refund register (REDEME). Other taxpayers can opt in voluntarily. The supplier must be a Spanish-resident taxpayer subject to SII (turnover > €6M, REGE, or REDEME) or have voluntarily opted in. They must hold a digital certificate for AEAT or appoint Invopop as their representative via signed agreement. Issued and received invoices must be reported within 4 calendar days. Subsequent corrections, cancellations, and intra-EU operations have additional bookkeeping streams (Libro de Bienes de Inversión, Libro de Operaciones Intracomunitarias). TicketBAI No, you don't need to register with TicketBAI, or upload any digital certificates to Invopop. As a certified billing provider, Invopop will sign all invoices with our own digital certificate. TicketBAI allows three types of certificates; Invopop uses the *certificado sello de empresa* which allows us to sign e-invoices on behalf of our customers, saving you the burden of registering and uploading certificates yourself. * Bizkaia: by the end of each quarter, except for companies under SII (turnover above 6 million euros), which must report within 4 days. * Gipuzkoa and Álava: The submission must be done immediately after generating the invoice. The supplier must have fiscal residence in one of the three foral territories (Bizkaia, Gipuzkoa, Álava) and sign a representation agreement allowing Invopop to issue on their behalf. No supplier-side certificate required. VERI\*FACTU Following congress approval, the VERI\*FACTU mandate has been postponed by one year. The new dates are: * January 1, 2027 for companies * July 1, 2027 for self-employed individuals. VERI\*FACTU will be mandatory for companies from January 1st, 2027. The rest of taxpayers (mainly self-employed individuals) from 1 July 2027. Companies reporting with SII (large companies) or TicketBAI are exempt from reporting with VERI\*FACTU. VERI\*FACTU invoices don't necessarily need to be printed because they are issued with electronic invoicing systems such as Invopop. Source: [AEAT FAQ](https://sede.agenciatributaria.gob.es/Sede/iva/sistemas-informaticos-facturacion-verifactu/preguntas-frecuentes/posibilidad-remision-informacion-factura-parte-receptor.html?faqId=9e9e77fe52572910VgnVCM100000dc381e0aRCRD). Yes, VERI\*FACTU allows issue dates to be in the past, as long as they are after October 28, 2024. The issue date can't be set with a date in the future. The AEAT is not strict about the validation, but it's best to keep your intentions clear. [GOBL](https://docs.gobl.org) gives you alternative fields such as `op_date` and `value_date` to store details about your invoicing operation. Spanish fiscal law requires the customer to be identified with an ID document (preferably official). Set the `es-verifactu-identity-type` extension to `07` ("Not registered in census" / "No censado"), which maps to the `IDOtro` field in VERI\*FACTU. Here is an example of a customer identity block in [GOBL](https://docs.gobl.org): ```json theme={"system"} "customer": { "name": "Consumer", "identities": [ { "label": "NIE", "country": "ES", "code": "Z1111111S", "ext": { "es-verifactu-identity-type": "07" } } ] } ``` For the full list of identity type codes, see the [`es-verifactu-v1`](https://docs.gobl.org/addons/es-verifactu-v1) addon documentation. Suppliers must use a certified billing system (Invopop is one). Each supplier must sign a representation agreement allowing Invopop to issue invoices on their behalf — without a digital certificate from the supplier's side. More available in our [Spain FAQ](/faq/spain) section *** Ask and answer questions about Spain's regulation → # Invoicing compliance in UAE Source: https://docs.invopop.com/compliance/uae UAE's e-invoicing and e-reporting obligations for consumer, business and government transactions Invopop support for UAE is coming soon (Peppol 5C). For inquiries, contact us at [support@invopop.com](mailto:support@invopop.com). *** Ask and answer questions about UAE's regulation → # API keys Source: https://docs.invopop.com/console/api-keys Access your workspace from anywhere Invopop API Keys are generated using the [Console](https://console.invopop.com). Enter **Configuration → API Keys** and click on **+ New API Key** on the top right corner. Enter the name and the description and click "Save". You'll be presented with a screen showing a new token. For security reasons, we don’t store this token. Copy it now, or you’ll need to create a new API key if it’s lost. Invopop uses JSON Web Tokens. If you're interested in seeing the contents, head over to [JWT.io](https://jwt.io) and paste your token to see what's inside. Tokens must be included in the `Authorization` HTTP header in all requests as a type `Bearer`. Test everything is working correctly using the [ping](/api-ref/utils/ping) endpoint and curl: ```bash theme={"system"} $ curl -H "Authorization: Bearer [token]" https://api.invopop.com/utils/v1/ping {"ping":"pong"} ``` ## Related resources | | | | -------------- | -------------------------------------------------------------------------------------------------------------------- | | API Reference | [Authentication](/api-ref/authentication)
[Ping](/api-ref/utils/ping) | | Related Guides | [Authentication Guide](/guides/authentication) | # Apps Source: https://docs.invopop.com/console/apps Add country support and features to your workflows Apps list Apps extend your workspace functionality by adding country-specific compliance features, document formats, notification services, storage integrations, and more. Each app provides specific capabilities that you can use in your workflows to process documents according to local regulations or integrate with external services. ## Getting started In a freshly started workspace, no apps are enabled by default. You must enable apps before you can use their features in your workflows. The apps list is divided into two sections: * **Enabled apps**: Apps that are currently active in your workspace * **Discover apps**: Available apps that you can enable ## Enabling an app To enable an app, click on the **Enable** button. Once enabled, the app appears in the enabled apps section and becomes available for configuration. ## Configuring apps After enabling an app, configure it with the necessary settings, credentials, or parameters required for it to function. Each app's configuration page provides specific instructions for the required settings. Enable only the apps you need for your workflows. You can enable additional apps at any time as your requirements change. ## Globally useful apps * [PDF Generator](/apps/pdf-generator) generate legally compliant PDFs from your GOBL sources. * [Email](/apps/email) send emails from your workflows, with or without attachments. * [Slack](/apps/slack) Send notifications from your workflow via Slack. [View more in our apps section](/apps/) ## API Reference * [PDF Generator - Preview](/api-ref/apps/pdf/preview) * [Peppol - Ownership Upload](/api-ref/apps/peppol/ownership-upload) * [VERI\*FACTU - Agreement Fetch](/api-ref/apps/verifactu/agreement-fetch) * [VERI\*FACTU - Agreement Upload](/api-ref/apps/verifactu/agreement-upload) * [VERI\*FACTU - Identity Upload](/api-ref/apps/verifactu/identity-upload) * [VERI\*FACTU - Confirm](/api-ref/apps/verifactu/confirm) # Document contents Source: https://docs.invopop.com/console/doc-content Files, Activity, Meta and GOBL Envelope ## Introduction Every document stored in the Invopop Console is represented internally by a signed GOBL Envelope plus companion data (files, activity logs, relationships, metadata, and signatures). The Document Content view lets you inspect the full lifecycle and structure of a document so you can: * Verify integrity (signatures, hashes, states) * Understand changes over time (activity timeline) * Access generated artifacts (PDF, XML, JSON, regulatory payloads) * Explore related documents (credit notes, corrections, substitutions) * See enriched metadata (regime addons, workflow states, custom keys) Use this page whenever you need to audit a document, debug a workflow result, or prepare regulatory / customer inquiries. ## Envelope Envelope wraps around a document adding headers and digital signatures. ### JSON Schema ID Schema identifies the schema that should be used to understand this document ### Header Details on what the contents are. ### Document The data inside the envelope. ## Files The Files tab lists generated or attached artifacts: Common File Types: * PDF: Human-readable rendition (may include mandatory QR, stamp, legends). * XML / Structured: Regulatory submission payloads (Facturae, FatturaPA, KSeF FA(3), CFDI, UBL, CII). * JSON: Original or transformed GOBL snapshot. * Auxiliary: Attachments (agreement, identity docs, shipping notes, images). * Signature logs or hash chains. Metadata shown often includes size, checksum (SHA256), creation timestamps, and MIME type. Use checksums to verify external copies match stored originals. Workflow Interactions: * Generation steps (e.g. “Generate PDF”, “Generate VERI\*FACTU XML”) append files. * Cancellation / correction workflows may add new XML replacing or referencing prior versions. * Archival workflows create summarized CSV/SAF-T exports and attach them. Retention: * Files are immutable once attached; regeneration creates a new file or updates version counters (depending on workflow design). * Never delete compliance artifacts—retain for audit lifetimes (often 5–10 years). ## Activity A chronological log of significant actions affecting the document: Common Events: * Creation (entry uploaded) * Workflow job started / completed / errored * State transitions (Draft → Sent → Paid / Void / Error) * Signature applied or verified * Attachment added * External submission (e.g. SDI, AEAT, PAC, KSeF) * Cancellation or correction accepted * Reconciliation (payment posted) Use Activity to debug failed workflows: * Inspect failed step name and error code. * Identify if a retry subsequently succeeded. * Confirm ordering for chained regimes (e.g. hash chain continuity, sequence increments). Audit Integrity: * Each event is timestamped (UTC) and references the job/workflow ID. * Non-destructive: Past events remain even after corrections. ## Related Lists documents logically connected to the current envelope: Typical Relations: * Credit note referencing an invoice. * Corrective invoice replacing an original. * Payment complement tying to issued invoice (CFDI). * Replacement sequence (substitution under specific regimes). * Cancellation or void record linked to original document. Best Practices: * Always navigate to related documents to confirm both halves of a correction or refund are consistent. * Use related view to bulk export a chain (original + adjustments + replacements) for external audits. ## Meta Structured metadata and key-value pairs attached to the envelope that provide enhanced context: Examples: * Regime Addons: `es-verifactu-v1`, `pt-saft-v4`. * Submission Protocols: `submission.protocol`, `ksef.hash`, `cfdi.uuid`. * Signature Fingerprints: `signature.sha256`, `chain.previous_hash`. * Workflow Tracking: `workflow.id`, `job.id`, `attempt`. * Payment Resolution: `payment.status`, `payment.last_checked`. * Custom Business Fields: department code, cost center, channel. Usage: * Workflows read/write meta fields to govern conditional logic (e.g. skip generation if `pdf.generated == true`). * API clients can filter entries by meta values for reporting. Guidelines: * Keep keys namespaced to avoid collisions (`verifactu.*`, `ksef.*`, `cfdi.*`, `custom.*`). * Avoid overwriting critical regulatory fields—append new versions or maintain snapshots. ## Signatures JSON Web Signatures of the header. Signature blocks attest to document integrity and authenticity. Depending on regime and workflow: Contents: * Signer identity (certificate thumbprint, key ID). * Timestamp at signing. * Hash or digest algorithm (e.g. SHA256). * Envelope canonicalization details. * Previous hash (for chaining sequences or regulatory chain requirements). * Optional signature version or compliance profile. Verification: * Console may display a validity indicator (✔ Valid / ⚠ Warning / ✖ Invalid). * Invalid signatures often result from post-sign modification of core fields or mismatched hashing algorithm settings. Chain Integrity: * For regimes requiring chained documents (Portugal hash chain, VERI\*FACTU request chain, Brazilian NF-e sequences), each signature references the preceding hash to prevent tampering. * Cancellations and corrections may generate new signature entries, preserving prior ones. Best Practices: * Sign after finalizing monetary and tax details. * Regenerate PDF only after signature (so signature metadata can appear in the rendered document footer/header if required). * For multi-sign flows (organization + intermediary) ensure ordering is consistent; verify both before submission. *** ## Quick troubleshooting guide | Symptom | Likely Cause | Resolution | | --------------------------- | ---------------------------------------------- | --------------------------------------------------------------------------- | | Totals mismatch | Line rounding vs tax calculation inconsistency | Recompute sums; ensure currency precision matches regime defaults. | | Missing PDF | Workflow skipped Render step | Trigger a regeneration workflow; check if a condition prevented generation. | | Signature invalid | Envelope mutated post-sign | Re-sign with updated envelope; avoid editing signed fields directly. | | Missing related credit note | Credit workflow failed | Inspect Activity for failed job; re-run correction workflow. | | Protocol absent | Submission workflow incomplete | Confirm external API connectivity; retry transmission step. | ## Recommended review flow 1. Open Header: confirm type, regime, series/code, state. 2. Inspect Signatures: validate all present and valid. 3. Review Meta: ensure protocol/UUID and tax chain metadata. 4. Check Files: required artifacts (PDF + submission XML) present. 5. Scan Activity: look for errors or retries. 6. Inspect Related: confirm corrections or cancellations linked. 7. Export or archive if the document reached terminal state (Sent, Paid, Void, Corrected, Archived). ## Glossary * Envelope: Structured wrapper for the business document and signatures. * Addon: Extension enabling regime-specific transformations. * Protocol / UUID / Hash: External authority identifier proving successful submission. * Preceding: Reference block pointing to an original or prior document. * Chain: Sequential cryptographic linkage between documents for integrity. *** If you need deeper technical detail, consult API references for Silo Entries and Workflow Jobs; this page focuses on Console interpretation and manual audit steps. ## Related resources | | | | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | API Reference | [Fetch an entry](/api-ref/silo/entries/fetch-an-entry)
[Fetch a file](/api-ref/silo/entries/files-fetch)
[Find related entries](/api-ref/silo/entries/find-related)
[Fetch a job](/api-ref/transform/jobs/fetch-a-job) | # Correct an invoice Source: https://docs.invopop.com/console/doc-correct Correct issued invoices from the Console We have a step by step guide to help you correct invoices from the API and the Console When you make a mistake on an invoice, you need to fix it properly to stay legal and keep good records. The most common method is a **credit note**, which cancels, refunds, or adjusts an invoice. It links back to the original and changes the amount without erasing it. **Debit notes** request additional money you forgot to charge, but most businesses rarely use these. Instead, they just send a new invoice for the extra charges. **Corrective invoices** are only available in certain countries like Spain and Poland. They create a new invoice to replace the old one, and you'd use them where adjusting the charged amount wouldn't work, like getting the customer's name or tax ID wrong. **When do you need corrections?** You might need to fix an invoice if you charged the wrong amount, got customer details wrong, the tax authorities partially accepted the document (possible in regimes like Spain), goods were returned or damaged, or you forgot required information. Whatever method you use to fix the mistake, it must connect back to the original invoice so you have a complete record of what happened. ### How to correct an invoice 1. In the [Console](https://console.invopop.com), click on **Invoices** in the left sidebar. 2. Select the invoice you want to correct. The invoice must be issued before a correction can be made. 3. Click on the **Correct** button in the top-right corner. This will open the **Correction** dialog. Correction dialog The available fields will depend on the `$regime` of your document, but will always include a `Series` and a `Type`: * **Series:** usually corrective documents will have a different series from your standard documents or invoices. A common pattern is replacing the standard series with `CN` (standing for `credit-note`). * **Type:** the options available depend on the regime, but will often include `debit-note` and `credit-note`. Unless you have a specific accounting need, it is often a better practice to avoid issuing a debit note by issuing a full refund through a credit note and then issuing a new invoice. Finally click on the Correct button and you will have a corrective invoice that you should send to the tax authority through a workflow, as you would do with a standard invoice. ## Related resources | | | | -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Related Guides | [Correct an Invoice](/guides/correct-invoice) | | API Reference | [Create an entry (POST)](/api-ref/silo/entries/create-an-entry-post)
[Create an entry (PUT)](/api-ref/silo/entries/create-an-entry-put) | # Create documents Source: https://docs.invopop.com/console/doc-create From the console and the API ### Creating a new document When you enter a document section (Invoices, Orders, Deliveries, Payments, Parties and Items), on the top right corner you will see a `New [document type]` button. Clicking on it displays the document editor. This view has two modes: **Code view** and **Form view**, switchable using the toggle in the upper-right corner. ### Code view Invoice editor In code view, the editor presents the document as a JSON object. This mode is intended for users who prefer to work directly with the underlying structure of the invoice. * **JSON Editor:** When creating a new document, the editor loads a minimal boilerplate invoice object. Any missing or incomplete fields are highlighted with red squiggles. These markers correspond to validation issues—either required fields that have not been filled in or values that do not meet schema rules. * **Build Button:** The **Build** action validates the JSON against the defined GOBL schema. If the document is valid, the system enriches it with any required calculated or default data. You will only be able to save the invoice if the document is built and valid. * **Error & Warning Drawer:** A collapsible drawer appears at the bottom of the screen. It lists any errors or warnings identified in the current document, including missing properties, invalid values, or schema mismatches. Each entry links directly to the relevant line in the JSON. The drawer can be hidden when not needed. *** ### Form view Invoice editor Switching to form view displays the same data into a structured, user-friendly layout with input fields. Form view ensures that the document can be created without interacting with code, code view gives full control to those who prefer manual editing. ## Related resources | | | | -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | API Reference | [Create an entry (POST)](/api-ref/silo/entries/create-an-entry-post)
[Create an entry (PUT)](/api-ref/silo/entries/create-an-entry-put) | | Related Guides | [PDF Invoice Guide](/guides/pdf-invoice) | # Edit documents Source: https://docs.invopop.com/console/doc-edit Edit documents through the console ## When to edit documents The most common reason to edit a document is to fix errors or mistakes in the data before submitting it to a tax authority. You might discover these issues during review, or they may come to light after a tax authority rejects the document. Once a document has been issued or sent to a tax authority, you should not edit it directly. Instead, use the [correction workflow](/console/doc-correct) to issue a credit note, debit note, or corrective invoice. ## Understanding document validation GOBL validates documents against a strict schema, which means you will rarely encounter validation errors during editing. When validation issues do occur, they typically indicate: * Missing required fields * Invalid data formats or values * Schema mismatches The document editor highlights these issues with visual indicators, making it easy to identify and fix problems before submission. ## Editing rejected documents Most editing scenarios occur when a tax authority rejects a document. Common rejection reasons include: * Incorrect tax identification numbers * Dates outside the allowed range * Missing or incorrect mandatory fields * Calculation errors * Formatting issues specific to the tax regime ## Removing signatures and stamps To edit a signed or stamped document, you need to remove its signatures first. The console provides a straightforward way to do this: 1. Open the document you want to edit 2. Click the **Edit** button in the top-right corner 3. If the document has signatures or stamps, you'll see an option to remove them Remove signatures dialog Removing signatures does not delete the original signed version. The system preserves the complete document history, including all signed and stamped versions. ## How editing works When you remove signatures to edit a document, the system creates a new unsigned version behind the scenes. This process: * Preserves the original signed or stamped document in the document's history * Creates a new editable version that you can modify * Maintains a complete audit trail of all document versions You can then make the necessary corrections using the same editor interface used for creating documents. The editor supports both **Code view** and **Form view**, just like when creating new documents. For more details about the editor interface, see [Creating documents](/console/doc-create). ## After editing Once you've made your corrections: 1. **Review your changes**: Use the editor's validation features to ensure the document is correct 2. **Build the document**: Click **Build** to validate the document against the GOBL schema and enrich it with calculated data 3. **Save the document**: Save your changes to store the updated version 4. **Resubmit**: Send the corrected document through your desired workflow to resubmit it to the tax authority The system tracks all versions of the document, so you can always review the history and see what changed between versions. ## Related resources | | | | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | | API Reference | [Update an entry](/api-ref/silo/entries/update-an-entry)
[Fetch an entry](/api-ref/silo/entries/fetch-an-entry) | # Replicate documents Source: https://docs.invopop.com/console/doc-replicate Replicate documents through the console Document replication creates a new document based on an existing one. This is useful when you need to create similar documents without manually re-entering all the information. When you replicate a document, the system creates a copy with: * A new unique identifier (UUID) * For invoices: the code removed and the issue date set to the current date * All other data from the source document preserved You can then modify the replicated document as needed before saving it. ## When to replicate documents Replication saves time when creating documents that share most of their content with existing documents. Here are common scenarios where replication is helpful: * **Recurring services with variable quantities.** For example, a maintenance contract where the base fee is identical each month, but hours or consumables change slightly. * **Seasonal or cyclical orders.** Clients who reorder the same products periodically (quarterly restocking, annual service packages). The base invoice mirrors prior cycles; only dates or quantities shift. * **Template for similar customers.** If several clients receive a comparable service package with minor price or detail differences, starting from a proven invoice avoids rebuilding the structure from scratch. ## How to replicate a document Replicate document 1. Open the document you want to replicate 2. Click the **Replicate** button in the document actions menu 3. The system creates a new document with the same content 4. Edit the replicated document as needed 5. Save the new document The replicated document is independent from the source document. Changes you make to one do not affect the other. ## After replication Once you've replicated a document: 1. **Review the content** to make sure all relevant information from the source document is present. 2. **Update variable fields** such as quantities, dates, amounts, or other fields that need to change. 3. **Verify customer details** to make sure addresses, names, and tax IDs are correct. 4. **Build the document** to validate and enrich the document with calculated data. 5. **Save** the document or send it through your workflow. Use replication to maintain consistency across similar documents while reducing manual data entry and the risk of errors. ## Related resources | | | | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | API Reference | [Create an entry (POST)](/api-ref/silo/entries/create-an-entry-post)
[Create an entry (PUT)](/api-ref/silo/entries/create-an-entry-put) | # Document states Source: https://docs.invopop.com/console/doc-states Learn how document states track workflow events and label documents throughout their lifecycle. States States are labels that do not reflect the internal state of the document. This decoupling means the state system provides metadata about workflow events, not assertions about the document's validity or integrity. Instead, states help you track the history of what happened to your document through a job run. For example, if a job encounters an error but doesn't explicitly set a state label, the document's state won't be marked as `Error`, even though the document may actually be affected. The state label only changes when you explicitly change it through the "Set state" workflow step or [through the API](/api-ref/silo/entries/update-an-entry#response-state) (though `Empty` and `Invalid` are exceptions to this rule). We provide the following states to label the document throughout its lifecycle. Here they are described in order to assist you in selecting appropriate states for your documents (via API or workflows). | | | | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Invalid** | This state cannot be selected. It is set by the system when a GOBL document is uploaded through the API with the `allow_invalid` option, or is received through a network such as Peppol or SDI which allow receiving invoices. | | **Empty** | Initial creation state before processing | | **Draft** | Mainly used to mark documents that will require further changes. | | **Processing** | Mainly used to indicate the document is being processed. Typically, the **Set state** step will be placed at the beginning of a workflow and changed later in the workflow, such as `Sent` or `Error` depending on the outcome. | | **Registered** | When a party has been granted invoice issuing entitlements, or a document has been registered for reporting. | | **Completed** | Generic label for completion of a process. | | **Sent** | Document has been successfully transmitted (e.g., to tax authority or customer) | | **Received** | Document has been successfully received (e.g., receiving a document in your Peppol inbox). | | **Error** | Processing failed with an error, often placed in the error handling area of a workflow. | | **Rejected** | Rejected by the tax authority or by a third party (e.g., Peppol participant) | | **Paid** | Document (invoice or receipt) has been marked as paid | | **Void** | Document or party has been cancelled or voided | The Activity tab in the Console shows a chronological log of all state transitions and significant events affecting the document. Think of silo entry states as workflow markers. They are a way for your system and team to track a document's progress in your workflow. Invopop provides workflow templates that include recommended points where the silo entry state may be updated, but these are just guidelines. You're free to modify or override them as needed, as these values have no impact on actual document processing, delivery, or government validation. # Document types Source: https://docs.invopop.com/console/doc-types Schemas supported by Invopop ## Overview Invopop supports a set of business document types based on the [GOBL (Go Business Language)](https://docs.gobl.org) schema. All documents are stored as GOBL Envelopes, which wrap the document data with headers and digital signatures for integrity and authenticity. ## Core document types ### Invoices `bill/invoice` [GOBL Schema](https://docs.gobl.org/draft-0/bill/invoice) An invoice represents a payment claim for goods or services supplied under conditions agreed between the supplier and the customer. Invoices are the most commonly used document type and form the foundation of most billing workflows. #### Invoice types Invoices can be categorized by their `type` field: * **`standard`**: A regular invoice issued for goods or services. This is the default type for most invoices. * **`proforma`** - used to send a “preview” of the final invoice to a customer for their approval. If a customer approves a proforma invoice, they’re effectively entering into a contract with the supplier for the services or goods to be supplied, so while tax agencies don’t consider this an essential type for tax collection, they can have legal consequences. * **`credit-note`**: A document issued by the supplier to the buyer to indicate the intent to credit a specified amount. Credit notes are used to cancel, refund, or adjust a validated invoice. They reference the original invoice through a `preceding` block and are the most widely accepted method for making corrections. See [Correcting an Invoice](/console/doc-correct) for details. * **`debit-note`**: A document issued by the supplier to request additional funds related to a previously issued invoice (e.g., to account for omitted shipping costs). While valid, debit notes are rarely used in practice—issuing a new invoice is generally recommended instead. * **`corrective`**: A corrective invoice (also known as a rectifying invoice) is a new document that references and replaces the original one. It's typically used when there are significant errors in fields such as the buyer's name, tax ID, or invoice date, and it fully replaces the original invoice for legal and accounting purposes. Countries that support corrective invoices include Spain and Poland. In some countries where the tax regime supports it, such as Spain, GOBL may attempt to map credit and debit notes into the appropriate corrective format. There are some other regime specific invoice types such as simplified invoices that are supported through invoice scenarios. [Read more about simplified invoices](https://docs.gobl.org/use-cases/invoicing#invoice-scenarios) in the GOBL docs. ### Orders `bill/order` [GOBL Schema](https://docs.gobl.org/draft-0/bill/order) Order documents are used for the initial part of an order-to-invoice process where the buyer requests goods or services from the seller. Orders represent purchase orders or sales orders and are typically the first step in a procurement workflow. You can use orders for the following use cases: * Purchase order processing * Sales order management * Order-to-invoice workflows * Portugal AT (Autoridade Tributária) compliance ### Deliveries `bill/delivery` [GOBL Schema](https://docs.gobl.org/draft-0/bill/delivery) A delivery document is used to describe the delivery of goods or potentially also services. Delivery notes track the physical or digital transfer of items and are often required for logistics and inventory management. You can use deliveries for the following use cases: * Shipping documentation * Goods receipt confirmation * Portugal AT (Autoridade Tributária) compliance * Inventory management workflows ### Payments `bill/payment` [GOBL Schema](https://docs.gobl.org/draft-0/bill/payment) A payment document is used to link an invoice or invoices with a payment transaction. Payments record the settlement of outstanding invoices and are essential for accounting reconciliation. You can use payments for the following use cases: * Invoice payment recording * Payment reconciliation * Portugal AT (Autoridade Tributária) compliance * Accounting workflows ### Parties `org/party` [GOBL Schema](https://docs.gobl.org/draft-0/org/party) A Party represents a legal entity or individual involved in a business transaction. Parties can be suppliers, customers, or other business contacts. They are stored as separate documents and referenced by UUID in invoices and other documents. You can use parties for the following use cases: * Some regimes (Spain) and networks (Peppol) require supplier registration. * Customer and supplier data management. #### Party types * **Suppliers**: Legal entities or persons on behalf of whom invoices should be issued * **Customers**: Recipients of invoices and other business documents * **Business contacts**: Any other party involved in transactions ### Items `org/item` [GOBL Schema](https://docs.gobl.org/draft-0/org/item) An Item represents a product or service offered for sale. Items can be stored as separate documents and referenced in invoices, orders, and deliveries to maintain consistent product catalogs. You can use items for the following use cases: * Product catalog management * Service definition and pricing * Consistent product information across documents ## Document relationships Documents can be linked together using UUID references. Common relationships include: * **Credit notes → Invoices**: Credit notes reference the original invoice through a `preceding` block * **Corrective invoices → Original invoices**: Corrective invoices replace original invoices * **Payments → Invoices**: Payments link to one or more invoices being settled * **Invoices → Parties**: Invoices reference supplier and customer parties by UUID * **Invoices → Items**: Invoice lines can reference item documents by UUID See [Related Documents](/guides/related-docs) for more information on linking documents. ## Workflows and document types Workflows are configured to process specific document types. When creating a workflow, you'll select a template based on the document type: * **Invoice workflows**: Process `bill/invoice` documents (standard, credit-note, debit-note, corrective) * **Party workflows**: Process `org/party` documents (suppliers, customers) * **Order workflows**: Process `bill/order` documents * **Delivery workflows**: Process `bill/delivery` documents * **Payment workflows**: Process `bill/payment` documents Each workflow template is designed for a specific document schema. The workflow steps available may vary depending on the document type and the configured regime. ## Series and document types [Series](/console/series) are used to generate sequential codes for documents that require unique identifiers. Different document types typically use different series: * **Invoices**: Usually require sequential numbering (e.g., `INV-001`, `INV-002`) * **Credit notes**: Often use a separate series (e.g., `CN-001`, `CN-002`) * **Orders**: May use order-specific series * **Deliveries**: May use delivery-specific series In some countries, such as Portugal, series names must follow specific formats with document type prefixes (e.g., `FT` for invoices, `NC` for credit notes). ## Country-specific considerations Different countries and tax regimes have specific requirements for document types: * **Spain**: Supports corrective invoices for VERI\*FACTU and TicketBAI compliance * **Italy**: Uses credit notes (Nota di Credito - TD04) and debit notes (Nota di Debito - TD05) for SDI corrections * **Poland**: Supports corrective invoices for KSeF compliance * **Portugal**: Requires specific document type prefixes in series names (FT, FS, FR, NC, etc.) * **Mexico**: Uses credit notes (Nota de Crédito) for SAT CFDI corrections * **Colombia**: Requires CUFE codes in credit notes referencing original invoices ## Document envelope structure All documents are stored as [GOBL Envelopes](https://docs.gobl.org/draft-0/envelope), which include: * **Header**: Metadata about the document (type, regime, series, code, state) * **Document**: The actual business document (invoice, order, party, etc.) * **Signatures**: JSON Web Signatures for integrity and authenticity See [Document Contents](/console/doc-content) for detailed information about the envelope structure and how to inspect documents in the Console. ## Read more * [Creating Documents](/console/doc-create) * [Editing Documents](/console/doc-edit) * [Correcting Invoices](/console/doc-correct) * [Document Contents](/console/doc-content) * [Replicating Documents](/console/doc-replicate) * [Related Documents Guide](/guides/related-docs) * [Workflows Overview](/console/workflow-intro) * [Series Management](/console/series) ## FAQ The key difference lies in *what* each document proves. A **receipt** confirms that a **payment has been made**. It is produced by a payment or cash-register device (for example, a card reader or POS terminal) and serves as proof of transaction settlement. An **invoice** documents the **sale of goods or services**. It is issued by a billing system (such as a POS, PMS, or ERP) and includes a breakdown of items, taxes, and totals. A **simplified invoice** is a type of invoice commonly used for **B2C transactions** and usually **does not include customer identification details**. **Example:** In a restaurant, the printed bill showing the items and taxes is the *simplified invoice*. After you pay by card, the slip produced by the card reader is the *receipt*. The first documents the sale; the second documents the payment. From a regulatory perspective: * **Fiscalization rules** typically apply to **payment recording devices** (cash registers, card readers) → *receipts* * **E-invoicing and e-reporting rules** apply to **billing systems** (POS, PMS, ERP) → *invoices* In some countries, these systems overlap; in others (like Italy), they are separate or mutually exclusive. This is why businesses often require **both** a fiscalization provider and an e-invoicing provider to remain fully compliant. ## Related resources | | | | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | API Reference | [Create an entry (POST)](/api-ref/silo/entries/create-an-entry-post)
[Create an entry (PUT)](/api-ref/silo/entries/create-an-entry-put)
[Fetch all entries](/api-ref/silo/entries/fetch-all-entries) | | GOBL | [GOBL Schema](https://docs.gobl.org/draft-0/envelope) | # Platform Source: https://docs.invopop.com/console/index Manage documents, configure workflows, connect Apps and collaborate with your team, from a single place. ## Console The web interface of Invopop's API. Manage documents, configure and monitor workflow execution, and connect apps. Create and process business documents from our web interface. Automate and streamline processes related to document handling. Jobs log workflow process steps so you can debug and verify workflow runs. Power your workspace with regime, format, notification and transformation features. Create and manage API Keys for your workspace. ## Admin Organization-level settings for workspaces, team management, billing, and account security. Configure workspaces for your organization. Set up payment methods to subscribe to Invopop. Manage who has access to your workspaces. Your profile and security. Coming soon! # Search Source: https://docs.invopop.com/console/search Search documents Search results You can search for documents in your workspace by clicking on the search field, or by typing / (slash) anywhere within the console. Doing this will bring up the search results panel. ## Search results The **Search Results** command-based search modal displays all documents that match the search. When a term is entered into the search bar, the system retrieves and lists relevant documents. The interface is keyboard-friendly, so you can use the and arrow keys to navigate through the results and press Enter to open the selected document. ## Related resources | | | | ------------- | --------------------------------------------------------------------------- | | API Reference | [Search entries](/api-ref/silo/entries/search-entries) | # Series Source: https://docs.invopop.com/console/series A series is a placeholder for a counter with number formatting details to be able to generate a code. ## Overview **Series** allow users to configure numbering templates for any document that requires unique sequential identifiers (such as invoices). Each series defines how numbers are formatted, including prefixes, suffixes, and zero-padding rules. For example, a series configured with the options on the left produces identifiers like those in the right box:
| | | | ------------ | ----- | | Prefix | `ES-` | | Padding | `5` | | Start number | `1` | | Code | `INV` |
``` INV-ES-00001 INV-ES-00002 INV-ES-00003 ```
## Create a new series Create series form | **Field** | **Description** | **API Property** | | -------------------------- | ------------------------------------------------------------------------------------------- | ---------------- | | **Name** | Human-readable label identifying the series. | `name` | | **Code** (Optional) | Internal or business code used to categorize series. | `code` | | **Prefix** (Optional) | Text placed before the numeric portion of the generated code. | `prefix` | | **Padding** | Total number of digits in the numeric sequence. Zeros are added to the left when necessary. | `padding` | | **Start Number** | The first number to be issued in the sequence. | `last_index` | | **Suffix** (Optional) | Text appended after the numeric part. | `suffix` | | **Description** (Optional) | Free text for internal documentation or identification. | `description` | ## Preview panel On the right side of the form, the UI displays a **live preview** of the resulting code based on the current field values. For example: ``` INV-ES-00001 ``` Here you can verify the final output format before saving. ## Using your series You will be able to use the series you've created from the API or through the "Add sequential code" step in your workflow. This will ensure your invoice numbers remain numbered correctly, as many regimes require not only unique invoice identifiers but also sequential numbering. ### 'Add sequential code' workflow step This workflow step allows you to use previously created Series, or to use a new numbering sequence tied specifically to the Tax ID and the series of the originating document. If "Dynamic sequence" is selected, the document must have a `series` defined. ## Tips * Use **prefixes** for country or business unit codes (e.g., `ES-`, `FR-`, `US-`). * Adjust **padding** to maintain consistent visual width across codes, and make sure you choose a length adequate for your invoicing volume. * **Start Number** will usually be `1`, unless you are continuing a series. * **Code** and **Description** fields are for human readability and internal organization. ## Related resources | | | | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | API Reference | [Sequences - Introduction](/api-ref/sequences/introduction)
[Series - Overview](/api-ref/sequences/series/overview)
[Series - Fetch all series](/api-ref/sequences/series/fetch-all-series)
[Series - Create a series](/api-ref/sequences/series/create-a-series)
[Series - Fetch a series](/api-ref/sequences/series/fetch-a-series)
[Entries - Overview](/api-ref/sequences/entries/overview)
[Entries - Fetch all series entries](/api-ref/sequences/entries/fetch-all-series-entries)
[Entries - Create a series entry](/api-ref/sequences/entries/create-a-series-entry)
[Entries - Fetch a series entry](/api-ref/sequences/entries/fetch-a-series-entry) | | Related Guides | [Series Guide](/guides/series) | ## FAQ This happens because you have not defined a `series` in your document. This is used to determine which dynamic sequence to assign in the "Add sequential code" workflow step. Many jurisdictions require separate numbering series for different document types; e.g., one for standard invoices and another for credit notes. Even when it’s not mandatory, keeping distinct series is simply good practice and makes administration easier, so we recommend this approach. # Workflow conditions Source: https://docs.invopop.com/console/workflow-conditions Configure a workflow in Invopop to process documents. Conditions create blocks that execute when a given *status* and *code* (optional) match the response of a workflow step. There are two status signals (`OK` and `KO`) plus `Any`, which matches regardless of the status. * **OK**: when a workflow step completes as expected. * **KO**: when there was an error in the step's execution. * **Any**: will match both `OK` and `KO`. Codes are generally text or numbers returned by providers. Only some steps will return codes along with their status signals. For example, the *Send invoice to VERI\*FACTU* step will return the error code as [specified by the AEAT](https://prewww2.aeat.es/static_files/common/internet/dep/aplicaciones/es/aeat/tikeV1.0/cont/ws/errores.properties) along with the `KO` status signal. Since GOBL already handles many of the validations in tax authorities lists, we recommend only implementing conditions which happen in your workflow with certain regularity and which should be handled automatically. As an example, we will handle the case where a supplier is not registered in the taxpayer census by the AEAT: On the desired step, click on the menu button `...` and select **Add condition**. Add condition Add match conditions Configure the matching conditions in the popover: 1. **Status**: `KO`. 2. **Code**: `4107` (Tax ID not identified in the taxpayer census). 3. **End workflow here**: `✔` (the workflow will stop executing after this block). Add condition action Click on "Select an action" and handle the condition as you wish. In this case, we are choosing to send a Slack message (e.g. for manual intervention). ## Related resources | | | | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | API Reference | [Create a workflow](/api-ref/transform/workflows/create-a-workflow)
[Update a workflow](/api-ref/transform/workflows/update-a-workflow)
[Fetch a workflow](/api-ref/transform/workflows/fetch-a-workflow) | | Related Guides | [Workflows Guide](/guides/workflows) | # How to create a workflow Source: https://docs.invopop.com/console/workflow-create Configure a workflow in Invopop to process documents. Although workflows can be created via the API, we strongly recommend using the [Invopop Console](https://console.invopop.com) for an easier set up. In the **Workflows** section click on **+ Create workflow**. You will see a template selection screen. The first two items are blank workflows for each document type: Parts of a workflow * **Empty Invoice workflow**: for sales or expenses. * **Empty Party workflow**: for suppliers or customers. Choose [Empty Invoice workflow](https://console.invopop.com/redirect/workflows/new?template=empty-invoice) for this example and then click **Load Template**. Give your workflow a name and description by filling the fields on the right sidebar. Add steps to your new workflow by tapping on the **+ Add step** button and selecting an action from the right. Some steps will require configuration in order to function correctly. The "developer mode" Developer mode switch switch at the top right of the canvas can be used to display the JSON representation of the workflow. This makes it easy to copy and paste workflows from examples or other workspaces. Make sure to return to the visual editor view to ensure the document is validated. ## Creating conditions Conditions create blocks that execute when a given *status* and *code* (optional) match the response of a workflow step. There are two status signals (`OK` and `KO`) plus `Any`, which matches regardless of the status. * **OK**: when a workflow step completes as expected. * **KO**: when there was an error in the step's execution. * **Any**: will match both `OK` and `KO`. Codes are generally text or numbers returned by providers. Only some steps will return codes along with their status signals. For example, the *Send invoice to VERI\*FACTU* step will return the error code as [specified by the AEAT](https://prewww2.aeat.es/static_files/common/internet/dep/aplicaciones/es/aeat/tikeV1.0/cont/ws/errores.properties) along with the `KO` status signal. Since GOBL already handles many of the validations in tax authorities lists, we recommend only implementing conditions which happen in your workflow with certain regularity and which should be handled automatically. As an example, we will handle the case where a supplier is not registered in the taxpayer census by the AEAT: On the desired step, click on the menu button `...` and select **Add condition**. Add condition Add match conditions Configure the matching conditions in the popover: 1. **Status**: `KO`. 2. **Code**: `4107` (Tax ID not identified in the taxpayer census). 3. **End workflow here**: `✔` (the workflow will stop executing after this block). Add condition action Click on "Select an action" and handle the condition as you wish. In this case, we are choosing to send a Slack message (e.g. for manual intervention). ## Running a workflow Workflows in Invopop can be executed through the following methods: * Manually via the Invopop Console * Via API calls to the [create job endpoint](/api-ref/transform/jobs/create-a-job-put) * Automatically by an embedded application. Workflows are executed on *silo entries* (such as invoices or suppliers). This action creates a *job*. When a job is run, the silo entry will be updated with any changes or attachments generated during processing. The status of a job can be seen in the silo entry's activity tab, or in the **Workflows** → **History** section accessible from the left sidebar. ## Error handling Any step that causes an error (`KO`) from which the job can't recover, and is not handled through a condition, will trigger the error handling flow. To enable this section, tap on Handle Errors at the bottom of the workflow creation screen, then add steps into this area which you want to execute when the job fails (often times setting the entry's state to `Error` and possibly sending a notification). ## FAQ If your step conditions display a **This step contains deprecated conditions** warning, your workflow will continue working normally, but we recommend updating your workflow so that you can modify it without unexpected behavior. Steps under deprecated conditions will display with a warning symbol ⚠️ with the label "Go to \[action name]". Click on the menu button `...` and select "Replace", and then select the replacement action from the sidebar. So, for example, if the deprecated step is labelled "Go to Set state", replace this step with "Set state" and choose the same configuration as the original step (which you should find further down within the same workflow). Once all deprecated steps are replaced, locate the referenced action(s) and delete. ## Related resources | | | | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | API Reference | [Create a workflow](/api-ref/transform/workflows/create-a-workflow)
[Fetch all workflows](/api-ref/transform/workflows/fetch-all-workflows)
[Create a job (POST)](/api-ref/transform/jobs/create-a-job-post)
[Create a job (PUT)](/api-ref/transform/jobs/create-a-job-put) | | Related Guides | [Workflows Guide](/guides/workflows) | # Customize workflow templates Source: https://docs.invopop.com/console/workflow-edit Update workflow definitions, steps and triggers. Coming soon. # Workflow history Source: https://docs.invopop.com/console/workflow-history Monitor and inspect jobs, the execution steps of workflow runs. The **Workflow History** provides a complete log of all workflow executions in your workspace. Use it to audit activity, trace issues, and verify that automated processes ran as expected. ## Job history list Job history view showing workflow executions At the top of the page, use **filters** to narrow the list of executions: * **Job ID** — Search for a specific job ID * **Workflow** — Filter by workflow name * **Status** — Display jobs that are running, completed or completed with errors These controls help you locate specific jobs or focus on executions relevant to your debugging session. The **main table** displays each workflow execution with the following information: * **Started at** — UTC timestamp when the job began. * **Job ID** — Unique identifier for the run. Use the copy button to share when reporting issues or cross-referencing logs. * **Workflow** — Name and version of the workflow that was executed. This helps distinguish between different automation paths or schema versions. * **Duration** — Total time the job took to complete. Short values indicate normal behavior, while longer durations usually indicate long running processes such as waiting for a supplier to register. Our workflow steps have expected durations, and if a step takes longer than expected it will `KO` and the job will fail. * **Status** — Visual indicator showing whether a job is running (yellow), completed successfully (green) or ended with an error (red). Each job shows the specific workflow version that processed it. This helps you correlate workflow changes with job outcomes. For more information, see [Workflow versions](/console/workflow-versions). ## Job detail Click any job in the history table to view its execution details. This view provides a step-by-step trace of the workflow run, showing how the workflow progressed, which actions were taken, and where any failures occurred. Job execution details view ### Summary information At the top of the details view, a summary panel displays key metadata: | Field | Description | | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **Status** | Final outcome of the job run (completed, completed with errors, or failed) | | **Started at** | UTC timestamp when execution began | | **Duration** | Total processing time | | **Job ID** | Unique identifier with a copy button for sharing | | **Workflow ID** | Identifier of the workflow definition used. Clicking will take you to the specific [workflow version](/console/workflow-versions) used to execute this job. | | **Silo Entry ID** | Reference to the underlying data record processed by the workflow. Clicking will take you to the entry processed by this job. | Use the Run again button to re-execute the same job, useful for iterative reprocessing after fixing issues. ### Reading the execution trace Below the summary, each workflow step is listed in execution order. Every step shows: * **Status** — Last known status text for this job. Can be one of the following: | | | | -------- | --------------------------------------------- | | `RUN` | attempting to execute the task. | | `QUEUED` | processor requested more time, job is queued. | | `ERR` | recoverable error, can try again. | | `OK` | job completed successfully. | | `SKIP` | not executed, reason will be stated. | | `KO` | unrecoverable failure ("knocked out"). | * **Intent ID** — Unique identifier for the step execution * **Log output** — Detailed execution logs (expandable for failed steps) ### Identifying failures When a step fails, expand its log output to see: * **RUN** — When the step started executing * **KO** — When the step failed * **Error message** — Specific validation errors, API responses, or other failure details Use this information to understand what went wrong. Common issues include: * Missing required fields in the document data * Validation errors from tax authorities or service providers * Network or API connectivity problems * Configuration errors in workflow steps ### Fixing issues After identifying the failure: 1. Review the error message to understand what's missing or incorrect 2. Check the document data or workflow configuration 3. Make the necessary corrections 4. Use Run again to test the fix 5. Verify the job completes successfully This view is essential for diagnosing validation errors, signature issues, or logic faults in your workflows. The step-by-step trace and detailed logs make it straightforward to identify exactly where and why a workflow failed. ## Related resources | | | | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | API Reference | [Fetch a job](/api-ref/transform/jobs/fetch-a-job)
[Fetch a job by key](/api-ref/transform/jobs/fetch-a-job-by-key) | | Related Guides | [Workflows Guide](/guides/workflows) | # Workflows overview Source: https://docs.invopop.com/console/workflow-intro Configure a workflow in Invopop to process documents. ## What is a workflow? A workflow in Invopop is a sequence of steps executed for each incoming job. Each step is powered by the provider of a service. Examples of services include: * Generating PDFs * Forwarding invoices to tax agencies * Modifying documents * Sending emails * Posting webhooks * Sending documents to ERPs or other systems Workflows automate and streamline your document and invoicing processes. Invopop ensures each step is executed reliably, with built-in retries and error handling. The steps are executed sequentially (the next step only executes after the previous one has completed) so you don't need to handle asynchronous responses. ## Anatomy of a workflow Parts of a workflow A workflow is composed of two main areas: * **Main flow:** defines the standard sequence of steps that the workflow follows under normal conditions. It represents the intended execution path, showing how tasks progress when the steps execute correctly (`OK`) and when exceptions or errors are handled within conditions. * **Error handling flow** defines the sequence of steps when an unhandled error or exception occurs. It allows you to specify alternative actions, recovery logic, or notifications to ensure the process can handle unexpected conditions gracefully. Keep in mind the error handling flow is executed if a step does not handle its own error through a condition. Both flows are composed of *steps* which can contain *conditions*. * **Steps** are actions performed with the entry being processed, such as sending the document to a tax authority, generating a PDF, or sending a notification to the customer or issuer. * **Conditions** determine the logic that directs how a workflow proceeds. They evaluate the *status* and *code* outcome of a given step, and if there's a match, it will execute the steps contained within that condition. If the status of a condition is `KO`, the *error handling flow* won't be executed as this would be a *handled error*. ## Related resources | | | | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | API Reference | [Create a workflow](/api-ref/transform/workflows/create-a-workflow)
[Fetch all workflows](/api-ref/transform/workflows/fetch-all-workflows)
[Fetch a workflow](/api-ref/transform/workflows/fetch-a-workflow)
[Update a workflow](/api-ref/transform/workflows/update-a-workflow)
[Create a job (POST)](/api-ref/transform/jobs/create-a-job-post)
[Create a job (PUT)](/api-ref/transform/jobs/create-a-job-put) | | Related Guides | [Workflows Guide](/guides/workflows) | # Workflow versions Source: https://docs.invopop.com/console/workflow-versions View and manage workflow versions ## Understanding workflow versions Workflow versions provide a complete history of your workflow changes and allow you to track which version was used for each job execution. When you create or modify a workflow, your changes are saved as a draft. A new version is only created when you publish the workflow. This versioning system helps you: * Track changes over time * Identify which workflow version processed specific documents * Revert to previous versions if needed * Maintain a clear audit trail of workflow modifications ## Drafts vs. published versions When you create a new workflow or save modifications to an existing one, your changes are saved as a draft. Drafts allow you to experiment and refine your workflow without affecting active job processing. Workflow versions menu showing draft and published versions A new version is created only when you publish a workflow. Publishing makes the workflow active and available for processing new jobs. Each published version is immutable, meaning it cannot be changed once published. This ensures that jobs processed with a specific version always use the exact workflow configuration that was active at that time. ## Viewing workflow versions You can view all existing workflow versions in the workflow information sidepanel. This panel appears automatically when: * You first open a workflow * You click on the workflow's canvas area (when no steps are selected) The sidepanel displays all versions in chronological order, with the most recent version at the top. Each version shows: * Version number * Publication date and time * Whether it's the current active version ## Identifying workflow versions in job history When you inspect a document's activity or job history, you can see the specific workflow version that was used to process that job. This information helps you: * Debug issues by understanding which workflow configuration was active * Track which version processed specific documents * Correlate workflow changes with job outcomes Job history showing workflow version information ## Restoring previous versions If you need to undo changes or revert to a previous workflow configuration, you can restore any previous version. This is useful when: * Recent changes caused unexpected behavior * You want to roll back to a known working configuration * You need to compare different workflow versions Workflow version preview with restore option When viewing a previous version, it appears with a checkered background to visually distinguish it from the current version. This helps you understand that you're viewing historical workflow data. ### How to restore a version 1. Open the workflow information sidepanel 2. Select the version you want to restore 3. Click **Restore as Draft** to create a new draft based on that version 4. Review the restored workflow configuration 5. Make any additional changes if needed 6. Click **Publish** to create a new version Restoring a version creates a new draft, not a new version. You must publish the draft to create a new version that will be used for processing jobs. ### Returning to the current version If you're viewing a previous version and want to return to the latest version, click **Back to Vx (current)**, where "x" represents the current version number. This immediately switches your view back to the active workflow version. ## Related resources | | | | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | API Reference | [Fetch a workflow](/api-ref/transform/workflows/fetch-a-workflow)
[Fetch all workflows](/api-ref/transform/workflows/fetch-all-workflows) | | Related Guides | [Workflows Guide](/guides/workflows) | # Argentina FAQ Source: https://docs.invopop.com/faq/argentina Frequently asked questions about invoicing compliance in Argentina ### Compliance questions * **CUIT** (Clave Única de Identificación Tributaria) is Argentina's tax identification number. Every registered taxpayer must have a CUIT to issue electronic invoices. * **Clave Fiscal** is a digital key used to access ARCA's online services, including the certificate management portal. You need it to generate digital certificates for electronic invoicing. Both are obtained through ARCA when you register as a taxpayer. These are two different tax regimes in Argentina: **Responsable Inscripto** (Registered Taxpayer): * Standard tax regime for most businesses * Must charge and collect VAT separately * Can issue Factura A (to other registered taxpayers) and Factura B (to consumers) * Must file monthly VAT and income tax returns **Monotributista**: * Simplified tax regime for small businesses and self-employed individuals * Pays a fixed monthly amount covering VAT and income tax * Can only issue Factura C * Cannot deduct VAT on purchases Your choice of regime determines which invoice types you can issue. Argentina has several VAT rates (alícuotas): | AFIP Code | Rate | Description | | --------- | ----- | --------------------------------------------- | | 3 | 0% | VAT-exempt sales (exports, exempt activities) | | 9 | 2.5% | Special reduced rate | | 8 | 5% | Special reduced rate | | 4 | 10.5% | Reduced rate (construction, agriculture) | | 5 | 21% | Standard VAT rate (most goods and services) | | 6 | 27% | Higher rate (utilities, telecom services) | The standard rate is 21%, which applies to most goods and services. GOBL's [Argentina tax regime](https://docs.gobl.org/regimes/ar) supports all of these rates. A clearance model (also called real-time validation or continuous transaction control) is a regulatory architecture in which each invoice must be electronically submitted to the tax authority and formally approved before it becomes legally valid. In Argentina's case, the issuer submits invoice data to ARCA, which validates it and returns a CAE (Código de Autorización Electrónico). Only with this authorization code can the invoice be legally issued to the customer. This architecture gives ARCA real-time visibility into all business transactions, preventing fraud and enabling automated tax compliance verification. AFIP (Administración Federal de Ingresos Públicos) was Argentina's national tax authority until November 2024. It was then renamed to ARCA (Agencia de Recaudación y Control Aduanero). The organization's functions and systems remain the same—only the name has changed. You may still see references to AFIP in older documentation and systems. The CAE (Código de Autorización Electrónico) is a 14-digit authorization code issued by ARCA that validates an invoice. Every electronic invoice must receive a CAE before it becomes legally valid. The CAE must be displayed on the invoice along with its expiration date (typically 15 days from issuance). Without a CAE, an invoice is not legally valid in Argentina, and the issuer cannot claim it as a deductible expense or VAT credit. Argentina has several invoice types based on the tax classification of both the issuer and the customer: * **Factura A**: Issued by registered taxpayers (Responsable Inscripto) to other registered taxpayers. VAT is broken down separately. * **Factura B**: Issued by registered taxpayers to final consumers, exempt entities, and non-categorized subjects. VAT is included in the total price. * **Factura C**: Issued by monotributistas (simplified tax regime) to any type of customer. No VAT breakdown. * **Factura E**: Used for export operations of goods and services (support coming soon). * **Factura T**: Issued by hotels and tourism providers to non-resident tourists. ARCA automatically reimburses the 21% VAT on qualifying accommodation items. Invopop supports all of these invoice types through the Argentina app, except Factura E, which is coming soon. Argentine regulations require invoices to be submitted to ARCA promptly after the transaction occurs. While ARCA may accept invoices with recent past dates, it's best practice to issue invoices in real time or as close to the transaction date as possible. For recording operation dates that differ from the issue date, use GOBL's `op_date` field to store the actual transaction date while keeping `issue_date` as the current date. As a Responsable Inscripto (registered taxpayer): **Issue Factura A when your customer is:** * Another Responsable Inscripto * A Monotributista * Any entity that needs to claim VAT credits **Issue Factura B when your customer is:** * A final consumer (Consumidor Final) * An exempt entity (Exento) * A non-categorized subject * A foreign tourist The key difference is that Factura A breaks down VAT separately (allowing the buyer to claim input VAT credits), while Factura B includes VAT in the total price. The supplier party (issuer) must have an active CUIT, a Clave Fiscal at security level 3 or higher, and a valid ARCA digital certificate generated specifically for electronic invoicing (separate from the one used for AFIP web access). ### Invoicing questions Factura A (B2B between Responsables Inscriptos), Factura B (consumers and exempt entities), Factura C (Monotributistas to anyone), Factura E (exports) and Factura T (tourism services to non-resident tourists). Type is determined by the issuer's tax regime and the customer's classification — Invopop selects the right one automatically when both are set. Most ARCA-cleared invoices are delivered as PDFs with the CAE printed on them, though the underlying XML is also available on request. Invopop can convert the XML into [GOBL](https://docs.gobl.org) for downstream processing; PDF-only documents need OCR or manual capture. Argentine invoices use a two-part numbering system: **XXXXX-YYYYYYYY** * **Punto de Venta (POS)**: A 5-digit code (e.g., 00001) that identifies the point of sale or electronic invoicing method. * **Sequential Number**: An 8-digit code (e.g., 00000001) that increases by 1 with each invoice. The sequence must be continuous with no skipped or repeated numbers. Each invoice type (A, B, C) and POS combination has its own independent sequence. For example, Factura A from POS 0001 starts at `00001-00000001`, while Factura B from the same POS would also start at `00001-00000001`. Invopop automatically manages sequential numbering for each punto de venta. A Punto de Venta (POS) is a 5-digit code that identifies where invoices are issued from. In electronic invoicing, it represents the electronic invoicing method or channel (e.g., Web Service, ARCA portal). Each POS has its own independent invoice sequence for each invoice type. You must register your punto de venta with ARCA before you can issue invoices through it in production. In the sandbox environment, you can use test punto de venta numbers without registration. No, you can use the same punto de venta for different invoice types (Factura A, B, C, etc.). However, each invoice type will have its own independent sequential numbering within that punto de venta. For example, using POS 00001: * Factura A: 00001-00000001, 00001-00000002, 00001-00000003... * Factura B: 00001-00000001, 00001-00000002, 00001-00000003... WSFE (Web Services de Factura Electrónica) is ARCA's web service infrastructure for automated invoice submission. ARCA provides several web services: * **wsfev1**: For invoices A, B, C, and M without item detail * **wsmtxca**: For invoices A and B with item details * **wsfexv1**: For type E (export) invoices * **wsct**: For type T (tourism) invoices issued to non-resident tourists Invopop integrates with these services to automatically submit your invoices to ARCA and receive CAE authorization codes in real time. If ARCA rejects an invoice, you'll receive an error message explaining the reason for rejection. Common reasons include: * Invalid or unregistered CUIT * Missing required fields * Incorrect tax calculations * Sequential numbering errors * Invalid punto de venta Review the error message, correct the issue in your GOBL document, and resubmit the invoice. The rejected invoice does not count toward your sequential numbering, so you can use the same number after correction. See the [Argentina tax regime in GOBL](https://docs.gobl.org/regimes/ar) for tax IDs, tax categories, and AFIP/ARCA-specific extensions. The [`ar-arca-v1`](https://docs.gobl.org/addons/ar-arca-v1) addon documents required fields for invoice submission to ARCA. ### Registering supplier questions Yes, to issue invoices through ARCA's web services, you need to upload your ARCA digital certificate to Invopop. This certificate is issued by ARCA and is used to authenticate your requests to their system. The registration process involves: 1. Generating a certificate signing request (CSR) with ARCA 2. Downloading the certificate and private key 3. Uploading them to Invopop through the supplier registration flow See our [ARCA Supplier Onboarding guide](/guides/ar-arca-suppliers) for detailed instructions. To register a supplier for ARCA invoicing, you need: **Company Information:** * Legal name (Razón Social) * CUIT (tax ID) * Fiscal address * Economic activity code * Tax classification (Responsable Inscripto or Monotributista) **Digital Certificates:** * ARCA digital certificate (.crt file) * Private key (.key file) * Key password (if applicable) See our [ARCA Supplier Onboarding guide](/guides/ar-arca-suppliers) for detailed registration instructions. The supplier registration process typically takes a few minutes once the supplier has their digital certificates ready. The steps are: 1. Generate a registration link in Invopop 2. Supplier uploads their certificate and key 3. System validates the credentials with ARCA 4. Registration is complete The longest part is usually obtaining the digital certificate from ARCA, which can take a few days if the supplier hasn't done it before. Yes, a single supplier can have multiple puntos de venta. Each punto de venta operates independently with its own sequential numbering for each invoice type. When registering a supplier, you specify which punto de venta to use. You must register each punto de venta with ARCA in production before using it to issue invoices. Digital certificates issued by ARCA have an expiration date. When a certificate is about to expire, the supplier must generate a new one through ARCA's portal and upload it to Invopop. To update an expired certificate: 1. Obtain a new certificate from ARCA 2. Use the supplier registration workflow to upload the new certificate 3. The new certificate will replace the old one It's recommended to renew certificates before they expire to avoid disruption to your invoicing process. Yes, Invopop supports white-label (B2B2B) operations in Argentina. This means you can issue invoices on behalf of your clients using their CUIT and digital certificates. This is particularly useful for platforms and software providers who want to offer invoicing services to their customers without requiring them to integrate directly with ARCA. Each supplier (your client) needs to complete the registration process with their own certificates, and then you can issue invoices on their behalf through Invopop's workflows. An ARCA digital certificate, consisting of a `.crt` X.509 certificate and the matching `.key` private key. Both files are uploaded together; the certificate must be valid (not expired, not revoked) and authorized for the ARCA web services you intend to use — WSFE for Factura A, B and C, WSFEX for Factura E, and WSCT for Factura T. Generate a registration link via the ARCA Register Supplier workflow, send it to the supplier, and have them upload their ARCA digital certificate and private key. Once validated, the supplier is ready to issue. See the [ARCA Supplier Onboarding guide](/guides/ar-arca-suppliers). The ARCA digital certificate (`.crt`) and private key (`.key`) are stored encrypted. Invopop only uses them to authenticate ARCA web service requests (WSFE and WSCT) on the supplier's behalf and never returns the key in API responses. *** Ask and answer questions about Argentina's regulation → # Australia FAQ Source: https://docs.invopop.com/faq/australia Frequently asked questions about invoicing compliance in Australia FAQ content for Australia is being prepared. For specific questions, please contact [support@invopop.com](mailto:support@invopop.com). *** Ask and answer questions about Australia's regulation → # Belgium FAQ Source: https://docs.invopop.com/faq/belgium Frequently asked questions about invoicing compliance in Belgium ### Compliance questions **Belgium** Since 1 January 2026 B2B transactions are mandatory where both parties are Belgian VAT-registered. B2G has been mandatory since 2024. B2C and cross-border B2B are out of scope for the current mandate. Any entity with a Belgian KBO/BCE enterprise number (and a VAT number where applicable). From 1 January 2026, Belgian VAT-registered recipients must be reachable via Peppol. Received invoices must be archived in their original structured format for 7 years. **Peppol** Mandatory dates vary by country. Belgium requires structured B2B e-invoicing — Peppol BIS by default — from January 2026. Germany is phasing in B2B e-invoicing between 2025 and 2028. France's Factur-X via Peppol applies once the PA reform takes effect. Outside mandates, Peppol delivery is voluntary but increasingly expected for B2G and cross-border trade. Yes. Every document exchanged on Peppol BIS uses a UBL or CII syntax that conforms to the EN16931 European e-invoicing standard, plus the relevant Peppol BIS specification. Invopop generates compliant XML automatically when you use the Peppol app. Peppol is a federated network — anyone could otherwise register a Participant ID for a company they don't represent. Proof of ownership ties the Participant ID to a verifiable contact at the company, which is what allows the registration to be published on the SML. Requirements vary by Authority. In Belgium, for example, the supplier must provide a recent extract from the Banque-Carrefour des Entreprises (KBO/BCE) plus a signed mandate. Invopop walks the registering party through the local requirements during the registration wizard. Yes — a Peppol BIS document delivered through a certified Access Point is treated as the legal e-invoice in any country that recognises Peppol. The signed UBL or CII XML is the authoritative record; archive it alongside any human-readable rendering you generate. Retention is set by each country's tax authority — typically 7 to 10 years in the EU. Invopop preserves the original XML and any generated PDF in the silo entry so you can satisfy local archival requirements wherever you operate. ### Invoicing questions **Belgium** Install the Peppol app, register your supplier with its KBO/BCE-based participant ID (scheme `0208`), and use a workflow that generates a Peppol BIS Billing 3.0 document and sends it via the Lookup → Send actions. In Belgium specifically there is no need to send a copy to the tax authority until the e-reporting mandate comes into effect in Jan 2028. See the [Belgium tax regime in GOBL](https://docs.gobl.org/regimes/be) for tax IDs and category codes. The Peppol BIS Billing 3.0 mapping is shared across EU members and comes from the [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) addon. Belgium uses two Peppol scheme identifiers: * **`0208` (KBO/BCE enterprise number)** — This is the **preferred and default** scheme for Belgium. It corresponds to the company's KBO/BCE number (Kruispuntbank van Ondernemingen / Banque-Carrefour des Entreprises), which is the official Belgian business register. Most Belgian companies are registered in Peppol under this scheme. * **`9925` (BE VAT number)** — This is an older, alternative scheme based on the Belgian VAT number. It is typically used by entities that have a Belgian VAT number but are not registered in the KBO/BCE — for example, foreign companies with a Belgian VAT registration. **When you should use `0208`:** Always use `0208` as your first choice when sending invoices to Belgian companies. This is the standard identifier and what the vast majority of Belgian businesses are registered under. **When `9925` may be needed:** If you get a "receiver not found" error when sending to a Belgian company using `0208`, and you have confirmed the company exists in the [Peppol Directory](https://directory.peppol.eu), check whether they are registered under `9925` instead. This is uncommon but does happen. To specify the scheme when sending, include the customer's Peppol inbox in your GOBL document: ```json theme={"system"} "customer": { "name": "Example Company", "tax_id": { "country": "BE", "code": "0123456789" }, "inboxes": [ { "key": "peppol", "scheme": "9925", "code": "BE0123456789" } ] } ``` Note that when using `9925`, the code must include the `BE` prefix (e.g. `BE0123456789`), whereas `0208` uses the raw KBO/BCE number without a prefix. Use the **Lookup Participant ID** workflow step to verify a recipient's Peppol registration before sending. If a lookup with `0208` fails, try again with `9925`. **Peppol** In countries where Peppol is the standard but not mandatory, you may still need to issue an e-invoice when the recipient isn't on the network. Both parties can agree on an alternative transfer method, but the invoice must still be EN16931 compliant. Recommended approach: * Set up a separate workflow that generates the XML without the send-Peppol-document step * Or reuse your existing workflow without the customer Peppol ID — the send step is automatically skipped * Fetch the generated XML and deliver it through the agreed channel, typically email B2C invoices typically lack the structured customer information required for Peppol delivery, and most consumers don't have inboxes. Use a conditional workflow: 1. Add an **If/Else** step that checks for a customer inbox using `count(customer.inboxes, true) > 0`. 2. On the `false` branch, generate a PDF and email it to the customer, then stop the flow. This routes B2B invoices through Peppol while keeping a smooth path for consumers. If a job fails with `KO` and `receiver not found in the peppol network`, treat it like an invalid email address — the recipient simply isn't reachable on Peppol. Add the **Lookup Participant ID** step (ideally in a separate validation workflow run against customer data) so you catch missing IDs before generating the invoice. No. The regime is automatically derived from the supplier's settings, which is the recommended approach for Peppol — leave it unset on the document. See the [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) addon for the field and validation rules Peppol BIS Billing 3.0 builds on, and the [Peppol app reference](/apps/peppol) for supported document types and Participant ID schemes. ### Registering supplier questions **Belgium** Run the Register Participant workflow with the supplier's KBO/BCE number (scheme `0208`), the same as onboarding a supplier in any other country. If the supplier is already registered with another Peppol provider and you'd rather bring that registration over than register fresh, see [Migrating a participant from another provider](/guides/peppol#migrating-a-participant-from-another-provider). **Peppol** Upload the company as a party (Console → Parties → Suppliers → + New Supplier, or via the Create an Entry API) with name, tax\_id, address, and email. Then run it through the party registration workflow — the contact will receive a registration wizard link to provide proof of ownership. Once approved, the party is registered on the Peppol network (SMP+SML+Peppol visibility by default with the `ubl-invoice` doc group) and ready to receive invoices. A supplier with that Participant ID already exists in your workspace. Either reuse the existing party or, if it really is a new entity, check whether it should be registered under an alternative scheme (for example Belgium's `9925` VAT scheme rather than the default `0208`). Register them through different silo entries, even though they represent the same legal party. The supplier must upload proof of ownership for each inbox. Unique identifiers for entities on the Peppol network, made up of two parts: * **Scheme** — identifies the type of identifier (e.g. `9920` for Spanish VAT, `0208` for Belgian KBO/BCE) * **Code** — the actual identification number Participant IDs are usually based on VAT numbers or local business identifiers, and Invopop can derive them automatically from a Tax ID. Some countries support multiple schemes — Belgium, for example, defaults to `0208` but some entities are only registered under `9925` (VAT). If you hit a "receiver not found" error, the recipient may be registered under an alternative scheme. Peppol Party visibility determines what you can send and receive: * `smp` — SMP only, for testing * `smp+sml` — SMP and SML, useful when you only want to send * `smp+sml+peppol` — SMP, SML, and the Peppol Directory, recommended for both sending and receiving (and for being discoverable in the Directory) In general, use the highest visibility available. ### Receiving questions **Peppol** Register the recipient as a Peppol participant with Invopop as their Access Point. Incoming documents are routed through your configured Import workflow, which converts the UBL or CII payload to GOBL and stores the entry in the Expenses folder. Yes. Either format can be removed based on your needs. The default template includes both for comprehensiveness, but if you're certain you'll only receive invoices in one syntax, dropping the other simplifies the workflow and reduces the apps you need to activate. The Import workflow's UBL and CII parser steps map the inbound XML into a GOBL invoice. From there you can route it to webhooks, Google Drive, accounting integrations, or any other destination — the GOBL representation is the single source of truth for downstream processing. *** Ask and answer questions about Belgium's regulation → # Brazil FAQ Source: https://docs.invopop.com/faq/brazil Frequently asked questions about invoicing compliance in Brazil ### Compliance questions **Brazil** Yes — invoicing is mandatory for all transactions in Brazil, including B2C (NFC-e for retail goods, NFS-e for services). Any entity with a CNPJ (legal entity) or CPF (individual) registered in Brazil. State and municipal registrations (Inscrição Estadual / Municipal) are also required depending on whether the supplier issues NF-e (state) or NFS-e (municipal) documents. **NF-e** NF-e (model 55) for goods has been mandatory since 2008 — phased in by sector and turnover. NFC-e (model 65, retail B2C) replaced the paper Cupom Fiscal in most states between 2014 and 2020. Both are now required for any commercial circulation of goods. The supplier needs an active state Inscrição Estadual, a CNAE that authorizes goods circulation, and an A1 certificate matching the issuing CNPJ. Some states (SP, RJ, MG) require additional credenciamento before NF-e issuance. **NFS-e** ISS (Imposto Sobre Serviços) is not treated as a standard transactional tax calculated on top of a net amount. Instead, it is an **informative tax embedded in the final price**—the invoice only reports what portion of the total corresponds to ISS. In GOBL, ISS is flagged as an "informative" tax category. This means: * ISS must be added to the GOBL invoice like any other tax, with the proper percentage. * The tax amount is not added to the price; it represents the portion of the total that corresponds to ISS. * The NFS-e document displays ISS as informational data, reflecting what was already embedded in the final price. * **Do not use `prices_include` with ISS**—since ISS is informative, it should not be treated as a price-inclusive tax. It is not necessary, any fields pertaining to the previous municipal tax implementation will be ignored and the invoice will already have all the data to be compliant. However, it is always recommended to remove ignored fields to avoid confusion and keep your documents clean. NFS-e is municipal, so the supplier needs an Inscrição Municipal in every município where they invoice services. Special tax regimes (Simples Nacional, MEI, ISS estimado) impose additional fields and rates. ### Invoicing questions **Brazil** Invopop supports NF-e, NFS-e and NFC-e documents. Transport documents (MDF-e and CT-e) are not currently supported. For further details on how GOBL prepares data for conversion, see: * The [Brazil Regime GOBL Reference](https://docs.gobl.org/regimes/br). * The [NFS-e Addon GOBL Reference](https://docs.gobl.org/addons/br-nfse-v1). * The [NF-e Addon GOBL Reference](https://docs.gobl.org/addons/br-nfe-v4). **NF-e** Yes. A foreign customer that does not have a Brazilian CNPJ or CPF can be identified by providing a country-qualified `identity` (e.g. a passport number) on the customer party. The `identity.country` must be an ISO country code other than `BR`. When a foreign customer is used: * the `tax_id` block can be omitted, * the customer address `country` is required and must not be `BR` (it is auto-filled from the identity country if missing), * the `state` field and the `br-ibge-municipality` extension are not required, as they only apply to Brazilian parties. Example customer block for a foreign buyer: ```json theme={"system"} "customer": { "name": "Acme International Inc.", "identities": [ { "key": "passport", "country": "US", "code": "US-FOREIGN-123" } ], "addresses": [ { "num": "500", "street": "Market Street", "locality": "San Francisco", "code": "94105", "country": "US" } ] } ``` Build a GOBL invoice with the `br-nfe-v4` addon, send it through the Issue NF-e workflow. Invopop signs with the supplier's A1 cert, transmits to the issuer's state SEFAZ, receives the protocolo de autorização, and exposes the authorized XML and DANFE PDF. After a successful issuance, SEFAZ returns two identifiers that Invopop stores as envelope stamps on the silo entry under `data.head.stamps`: * `sefaz-key` — the 44-digit NF-e access key (*chave de acesso*) that uniquely identifies the document. * `sefaz-auth` — the authorization protocol number (*número do protocolo*) confirming SEFAZ acceptance. Use them to reconcile your records, build the DANFE QR code, or query SEFAZ directly. ```json theme={"system"} "stamps": [ { "provider": "sefaz-key", "value": "35240114200166000187550010000000071123456789" }, { "provider": "sefaz-auth", "value": "135240000123456" } ] ``` NF-e (`br-nfe-v4`) covers electronic invoices for the circulation of **goods** in Brazil. It maps to two fiscal models: * **Model 55 — NF-e**: B2B or business-to-government transactions * **Model 65 — NFC-e**: B2C consumer transactions (simplified) #### Notation * ✅ **Required** — validation will fail if missing * ⬜ **Optional** — can be omitted * 🔧 **Auto-normalized** — set automatically if not provided ### Invoice Header | Field | Required | Notes | | ------------ | ---------------------------- | ----------------------------------------------- | | `$schema` | auto | `https://gobl.org/draft-0/bill/invoice` | | `$addons` | ✅ | `["br-nfe-v4"]` | | `$tags` | ⬜ | Use `["simplified"]` for NFC-e (model 65) | | `uuid` | ⬜ | Auto-generated if absent | | `type` | ⬜ | Defaults to `standard` | | `series` | ✅ | Pattern: `^(?:0\|[1-9]{1}[0-9]{0,2})$` | | `code` | ⬜ | Required to sign the document. | | `issue_date` | ✅ | ISO date, e.g. `"2024-11-15"` | | `currency` | ✅ | Must be `"BRL"` | | `tax` | ✅ | See Tax Extensions | | `notes` | ✅ | At least one note with `key: "reason"` required | | `lines` | ✅ | At least one line item | | `charges` | ⬜ | Document-level charges | | `discounts` | ⬜ | Document-level discounts | | `supplier` | ✅ | See Supplier | | `customer` | ✅ model 55
⬜ model 65 | See Customer | | `payment` | ✅ if not fully paid | See Payment | | `ordering` | ⬜ | | | `delivery` | ⬜ | | ### Tax Extensions | Extension | Required | Values | | --------------------------------- | -------- | ------------------------------------------------------------------- | | `tax.ext.br-nfe-model` | ✅ | `"55"` (NF-e, B2B) or `"65"` (NFC-e, B2C) | | `tax.ext.br-nfe-presence` | ✅ | See table below. Restricted by model. | | `tax.ext.br-nfe-regime` | ⬜ | `"1"`=Simples Nacional, `"2"`=Simples Nacional Excess, `"3"`=Normal | | `tax.ext.br-nfe-fiscal-incentive` | ⬜ | `"1"`=Has incentive, `"2"`=No incentive | **`br-nfe-presence` allowed values:** | Code | Description | NF-e (55) | NFC-e (65) | | ---- | ------------- | --------- | ---------- | | `0` | N/A | ✅ | ❌ | | `1` | In-person | ✅ | ✅ | | `2` | Internet | ✅ | ❌ | | `3` | Tele-service | ✅ | ❌ | | `4` | Home delivery | ❌ | ✅ | | `5` | Off-site | ✅ | ❌ | | `9` | Others | ✅ | ❌ | ```json theme={"system"} "tax": { "ext": { "br-nfe-model": "55", "br-nfe-presence": "1" } } ``` ### Notes At least one note with `key: "reason"` is **required**. It maps to the NF-e `natOp` field (nature of the operation). ### Supplier | Field | Required | Notes | | -------------------------------------- | -------- | --------------------------------------------------------------- | | `name` | ✅ | | | `tax_id.country` | ✅ | `"BR"` | | `tax_id.code` | ✅ | CNPJ (14 digits) or CPF (11 digits), Mod11 validated | | `identities[].key: "br-nfe-state-reg"` | ✅ | State Registration (Inscrição Estadual) | | `addresses` | ✅ | At least one | | `addresses[].country` | ✅ 🔧 | ISO country code. Auto-filled from `tax_id.country` if missing. | | `ext.br-ibge-municipality` | ✅ | 7-digit IBGE municipality code | ### Customer (Model 55 — required, Model 65 — optional) Brazilian customers must provide a Brazilian `tax_id`. Foreign customers can issue an NF-e by providing a country-qualified `identity` (e.g. a passport number) instead of a `tax_id`. | Field | Required | Notes | | ------------------------------------ | ------------------------------------------ | ------------------------------------------------------------------------------------------------------ | | `tax_id.country` | ✅ for BR customers | `"BR"` | | `tax_id.code` | ✅ when `tax_id` is present | CNPJ or CPF | | `identities[]` with non-BR `country` | ✅ for foreign customers without a `tax_id` | E.g. `{ "key": "passport", "country": "US", "code": "US-FOREIGN-123" }` | | `addresses` | ✅ | | | `addresses[].country` | ✅ 🔧 | ISO country code. Auto-filled from the `tax_id` country or the first identity that declares a country. | | `addresses[].state` | ✅ for BR customers | Must be a valid Brazilian state acronym (e.g. `SP`). Not required for foreign customers. | | `ext.br-ibge-municipality` | ✅ for BR customers | 7-digit IBGE code. Not required for foreign customers. | ### Line items Required tax categories per line: `ICMS`, `PIS`, `COFINS`. `IPI` is optional. | Extension | Required | Notes | | ---------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `line.ext.br-nfe-cfop` | ✅ model 55
⬜ model 65 | CFOP (Código Fiscal de Operações e Prestações) code identifying the fiscal nature of the operation, e.g. `"5102"` for in-state resale. Required on every line of an NF-e (model 55). | Optional item identities: `item.identities[].key: "ncm" | "gtin" | "gtin+taxable"`. ### Payment Required when the invoice is not fully paid. Must include `payment.instructions.key`. Payment-means mapping is auto-set unless `key: "other"`.
**NFS-e** Build a GOBL invoice with the `br-nfse-v1` addon and send it through the Issue NFS-e workflow. Until the federal NFS-e (DPS) takes over in 2026, Invopop routes per-municipality — the workflow handles the underlying API differences transparently. Billing platforms like Chargebee and Stripe are not aware of ISS particularities and tend to wrongly treat ISS as a typical tax included in the price. This causes `invalid-prices-include` errors during import because that pricing model is not compatible with how ISS works for NFS-e. The correct setup is: 1. **Do not configure ISS as a tax** in your billing platform (Chargebee, Stripe, etc.). 2. Prices in your billing platform should already be the **final public prices** with ISS embedded. 3. Add a **Modify Silo Entry** step to your import workflow that injects the ISS tax with the desired percentage into the GOBL invoice. This workflow approach ensures ISS is properly added to the GOBL invoice as an informative tax category before submission to the Brazilian tax authority, while avoiding the pricing conflicts that occur when billing platforms try to handle ISS as a standard tax. NFS-e (`br-nfse-v1`) covers electronic service invoices (*Notas Fiscais de Serviços Eletrônicas*) in Brazil. Service invoices are regulated at the **municipal** level, so several fields carry municipality-specific codes. The addon implements the ABRASF national standard (v2.04). ### Invoice Header | Field | Required | Notes | | ------------ | -------- | ----------------------------- | | `$addons` | ✅ | `["br-nfse-v1"]` | | `series` | ✅ | Any non-empty string | | `code` | ⬜ | Required to sign the document | | `issue_date` | ✅ | ISO date | | `currency` | ✅ | Must be `"BRL"` | | `lines` | ✅ | At least one line item | | `charges` | ❌ | Not supported by NFS-e | | `discounts` | ❌ | Not supported by NFS-e | | `supplier` | ✅ | See Supplier | ### Supplier | Field | Required | Notes | | ------------------------------------------- | -------- | --------------------------------------------- | | `name` | ✅ | | | `tax_id.country` | ✅ | `"BR"` | | `tax_id.code` | ✅ | CNPJ or CPF | | `identities[].key: "br-nfse-municipal-reg"` | ✅ | Municipal Registration | | `addresses` | ✅ | | | `ext.br-ibge-municipality` | ✅ | 7-digit IBGE municipality code | | `ext.br-nfse-simples` | ✅ | `"1"` opt-in, `"2"` opt-out | | `ext.br-nfse-fiscal-incentive` | ✅ | `"1"` has incentive, `"2"` does not (default) | | `ext.br-nfse-special-regime` | ⬜ | Special regime values | ### Customer Optional. When provided, `ext.br-ibge-municipality` is required if addresses are present. ### Line items Required item extension: `item.ext.br-nfse-service` (municipality service code). Optional item extensions: `item.ext.br-nfse-cnae`, plus the all-or-none trio `item.ext.br-nfse-{operation,tax-status,tax-class}`. Required tax category per line: `ISS`. ISS extension `taxes[ISS].ext.br-nfse-iss-liability` defaults to `"1"` (Liable). ### Registering supplier questions **Brazil** Upload the supplier's A1 digital certificate (PFX or P12) plus password through the registration workflow. Invopop validates it against the relevant SEFAZ or municipal endpoint and activates the supplier for issuing. A1 certificates (X.509 + private key, exported as PKCS#12) and their passwords are stored encrypted. Invopop uses them to sign documents and authenticate to the relevant SEFAZ or municipal endpoint on the supplier's behalf. **NF-e** Upload the A1 certificate plus its password through the Register Supplier workflow, providing the supplier's CNPJ and Inscrição Estadual. Invopop validates the certificate against SEFAZ and activates the supplier for the corresponding UF. An ICP-Brasil A1 certificate issued to the supplier's CNPJ (or CPF for individuals). Format: PKCS#12 (.pfx/.p12) containing the X.509 cert and matching private key. Validity is typically 1 year. **NFS-e** Upload the supplier's A1 certificate plus the Inscrição Municipal for the relevant city. The federal DPS (2026) consolidates registration; until then, separate enrollment per municipality may be required for high-volume issuance. Most municipalities accept the same ICP-Brasil A1 certificate used for NF-e. A few require A3 (smartcard/USB token) — Invopop currently supports A1 only. Ask and answer questions about Brazil's regulation → # Chile FAQ Source: https://docs.invopop.com/faq/chile Frequently asked questions about invoicing compliance in Chile FAQ content for Chile is being prepared. For specific questions, please contact [support@invopop.com](mailto:support@invopop.com). *** Ask and answer questions about Chile's regulation → # Colombia FAQ Source: https://docs.invopop.com/faq/colombia Frequently asked questions about invoicing compliance in Colombia ### Compliance questions All businesses selling goods or services in Colombia. The FEV (Factura Electrónica de Venta) has been mandatory for B2B and B2G invoices since 2020, and since 2024 B2C transactions must be documented with the Documento Equivalente Electrónico, bringing retail and point-of-sale receipts under the electronic system as well. OASIS UBL 2.1 following the DIAN schema. Colombia operates a clearance model (continuous transaction control): each invoice is digitally signed, submitted to the DIAN, and validated in real time. On validation, the invoice receives a CUFE (Código Único de Factura Electrónica) that makes it legally valid. No. E-reporting is fully integrated into the FEV clearance flow — an invoice is reported to the tax authority at the moment the DIAN validates it. There are no separate periodic invoice submissions. A minimum of five years, counted from January 1 of the year following issuance or receipt. The obligation applies to both the issuer and the receiver, and covers the original XML, its digital signature, and the DIAN validation response. RADIAN is the DIAN registry that turns validated invoices into negotiable instruments. Once the buyer accepts an invoice, it can be registered in RADIAN as a "título valor electrónico", allowing it to be factored, used as loan collateral, or legally enforced for payment. Not currently. For B2C transactions you can issue equivalent simplified FEV invoices instead, which are fully supported through the [DIAN Colombia app](/apps/dian-colombia). ### Invoicing questions The DIAN requires a [Municipal Code](https://www.dian.gov.co/atencionciudadano/formulariosinstructivos/Formularios/2007/Codigos_municipios_2007.pdf) rather than a postal code to specify the municipality of the supplier. Make sure you are setting a municipal code (5 digits) and not a postal code (6 digits) in the supplier's [`co-dian-municipality`](https://docs.gobl.org/addons/co-dian-v2) extension. Through [Plemsi](https://plemsi.com), an authorized technology provider for DIAN electronic invoicing. The [DIAN Colombia workflow](/guides/co-dian) signs the GOBL envelope, sends the invoice to the DIAN via Plemsi, receives the CUFE, and generates a compliant PDF with the DIAN QR code. Set `$schema` to `https://gobl.org/draft-0/bill/invoice`, the supplier's `tax_id.country` to `CO`, and include the supplier's and customer's DIAN municipality codes via the [`co-dian-municipality`](https://docs.gobl.org/addons/co-dian-v2) extension in each party's `ext`. See the [GOBL Colombia tax regime](https://github.com/invopop/gobl/blob/main/regimes/co/README.md) for the full field reference and examples. VAT (IVA, 19% standard or 5% reduced), consumption taxes (IC, INC), the industry and commerce tax (ICA), and the retained taxes ReteIVA, ReteICA, and Retefuente. A single invoice may need to combine up to three value added and retained taxes — all are supported by the [GOBL Colombia tax regime](https://docs.gobl.org/regimes/co#tax-categories). Yes. The same DIAN Colombia workflow handles invoices and credit notes when configured with a dynamic sequential code, so each document type draws from its own authorized numbering range. Plemsi's sandbox has a single enabled supplier (tax code `9015852843`) and one series per document type: `SETT` for invoices and `NCTT` for credit notes. The series are shared across users, so we assign you a specific number range to avoid collisions. Contact us via Slack or [support@invopop.com](mailto:support@invopop.com) to enable the sandbox in your workspace. ### Registering supplier questions The supplier must be registered with the DIAN with an active RUT (Registro Único Tributario), authorize Plemsi as their technology provider in the DIAN, and hold a valid billing numbering range authorization. The [supplier registration guide](/guides/co-dian-supplier) walks through each step. The supplier's legal representative authorizes Plemsi in the DIAN, requests a billing numbering range authorization (the DIAN issues a form 1876), and associates that resolution with Plemsi. Then contact us via Slack or [support@invopop.com](mailto:support@invopop.com) with the supplier's company details so we can create and configure the Plemsi account. See the [supplier registration guide](/guides/co-dian-supplier) for the full checklist. Yes. DIAN numbering range authorizations have both a number limit and an expiration date. When one runs out, the supplier's legal representative must file a renewal ("Solicitud de Habilitación de Numeración de Facturación") with the DIAN and associate the new resolution with Plemsi. No. You can use Invopop's Plemsi billing account, or create your own and provide your credentials. In either case, contact us to configure the account — Plemsi account setup for Invopop suppliers is done by our team. No. The Plemsi sandbox has a single pre-registered supplier with tax code `9015852843`, which all test invoices must use. Supplier registration only applies to the live environment. Ask and answer questions about Colombia's regulation → # Croatia FAQ Source: https://docs.invopop.com/faq/croatia Frequently asked questions about invoicing compliance in Croatia ### Compliance questions Yes. Under Fiscalization 2.0 (eRačun), VAT-registered Croatian businesses have had to exchange structured e-invoices and report each one to the tax authority since January 2026. Businesses that are not VAT-registered, and public bodies, must be able to issue from January 2027. Consumer sales stay on the older receipt system. Not for a domestic Croatian transaction. Croatia uses the European EN 16931 standard with its own national profile (HR CIUS), and the invoice must carry that profile. The transport network is the same style as Peppol, but the invoice content has to follow the Croatian profile. Two things that work independently. First, exchange a structured e-invoice with your trading partner over a 4-corner network. Second, report each invoice, and later its payment or rejection, to the tax authority in real time. Consumer sales stay on the older receipt system, a separate connection to the same tax-authority backend. The receipt is signed, reported in real time, and printed with an identifier, a security code and a QR code. Since the new law, this covers all payment methods, not just cash. E-invoices must be kept for 6 years in their original structured form. A standard rate of 25%, with reduced rates of 13% and 5%. Croatia uses the euro. ### Invoicing questions The European EN 16931 standard with the Croatian national profile (HR CIUS), in UBL 2.1 or CII format. Each invoice line must also include a product classification code. KPD is Croatia's product classification. A KPD code is required on each invoice line, but not on credit notes or prepayments. No. There is no requirement to be based in Croatia. A company that provides invoicing or reporting services to others must be certified as an information intermediary by the tax authority, and several foreign providers are already certified. A recipient reports a received invoice to the tax authority within 5 working days. The sender reports at the point of issuing. *** Ask and answer questions about Croatia's regulation → # Denmark FAQ Source: https://docs.invopop.com/faq/denmark Frequently asked questions about invoicing compliance in Denmark No. As of 2026, Denmark has **no B2B or B2C e-invoicing transmission mandate**. The [Digital Bookkeeping Act](/compliance/denmark#digital-bookkeeping-act-b2b) requires businesses to use certified systems that are *capable* of sending and receiving structured e-invoices (Peppol BIS 3.0 and OIOUBL), but it does not require that every invoice is actually sent electronically. You must be ready to e-invoice, but you are not yet obligated to do so for B2B or B2C transactions. E-invoicing is only mandatory for **B2G** — all invoices to Danish public authorities must be submitted electronically via NemHandel or the Peppol network. A domestic e-reporting obligation covering B2B is expected by approximately 2028. *** Ask and answer questions about Denmark's regulation → # Finland FAQ Source: https://docs.invopop.com/faq/finland Frequently asked questions about invoicing compliance in Finland ### Compliance questions **Finland** B2G e-invoicing has been mandatory since 1 April 2019 for central government and since 1 April 2020 for all contracting authorities, under Act 241/2019 (implementing EU Directive 2014/55/EU). Since 1 April 2021, public bodies may only accept invoices compliant with EN 16931. B2B e-invoicing remains voluntary. Businesses above the EUR 10,000 turnover threshold have a statutory right to request e-invoices from suppliers, but there is no blanket transmission mandate. There is no B2C mandate. Businesses with an annual turnover exceeding EUR 10,000 can compel their suppliers to issue e-invoices instead of paper or PDF. It's a statutory right rather than a default obligation to transmit electronically, and it is one of the reasons Finland has a comparatively high voluntary e-invoicing adoption rate without a blanket mandate. Standard rate 25.5%, reduced rate 13.5% (food, restaurants, books, transport, accommodation, cultural events, from 2026), and super-reduced rate 10% (newspapers and magazines). Exports outside the EU and intra-EU supplies to VAT-registered buyers are zero-rated. Under the Kirjanpitolaki (Finnish Accounting Act, 1336/1997), vouchers — invoices included — must be retained for 6 years from the end of the calendar year in which the financial year closed (in practice "6+1"), and financial statements for 10 years, with authenticity, integrity, and readability preserved throughout. Confirm any sector-specific extensions with local counsel before relying on them for edge cases. **Finvoice** Finvoice is the Finnish XML e-invoicing format, published by Finance Finland (*Finanssiala*), the banking association. Version 3.0 is conformant with the European standard EN 16931, and it is the dominant format on Finland's domestic operator network. You don't produce Finvoice documents yourself: send a GOBL invoice, and it is delivered in the format the receiver's network expects. No. Finland runs two e-invoicing networks side by side: the domestic operator network, where around 370,000 companies receive their invoices, and Peppol, with roughly 13,000 end users (about 0.24% of annual volume). The Finland app covers receivers on either network: you send one GOBL invoice with the receiver's e-invoice address, and the routing is resolved for you. **Peppol** Mandatory dates vary by country. Belgium requires structured B2B e-invoicing — Peppol BIS by default — from January 2026. Germany is phasing in B2B e-invoicing between 2025 and 2028. France's Factur-X via Peppol applies once the PA reform takes effect. Outside mandates, Peppol delivery is voluntary but increasingly expected for B2G and cross-border trade. Yes. Every document exchanged on Peppol BIS uses a UBL or CII syntax that conforms to the EN16931 European e-invoicing standard, plus the relevant Peppol BIS specification. Invopop generates compliant XML automatically when you use the Peppol app. Peppol is a federated network — anyone could otherwise register a Participant ID for a company they don't represent. Proof of ownership ties the Participant ID to a verifiable contact at the company, which is what allows the registration to be published on the SML. Requirements vary by Authority. In Belgium, for example, the supplier must provide a recent extract from the Banque-Carrefour des Entreprises (KBO/BCE) plus a signed mandate. Invopop walks the registering party through the local requirements during the registration wizard. Yes — a Peppol BIS document delivered through a certified Access Point is treated as the legal e-invoice in any country that recognises Peppol. The signed UBL or CII XML is the authoritative record; archive it alongside any human-readable rendering you generate. Retention is set by each country's tax authority — typically 7 to 10 years in the EU. Invopop preserves the original XML and any generated PDF in the silo entry so you can satisfy local archival requirements wherever you operate. ### Invoicing questions **Finland** Yes. Most Finnish businesses receive e-invoices through the domestic operator network rather than Peppol, and the [Finland app](/apps/finland) reaches both: you send one GOBL invoice with the receiver's e-invoice address, and it is delivered in the format the receiver's network expects. There is no need to check which network the receiver is on. **Finvoice** Because in Finland an e-invoice doubles as a payment order. Finvoice was created by the banks (it's published by Finance Finland, the banking association) and grew out of the bank network, where the receiver approves the invoice for payment directly in their bank. That's why every Finvoice invoice, credit notes included, must carry the payment order: an IBAN, a payment reference, and a dated due date. Most Finnish receivers get their invoices as Finvoice, and one missing this data would fail on its way to the receiver, where we can't see it, so the [`fi-finvoice-v3` addon](https://docs.gobl.org/addons/fi-finvoice-v3) rejects it up front instead. Three checks run before anything leaves the platform: the supplier must have an electronic address (`supplier-address-missing`), the invoice must carry a payment bank account (`payment-account-missing`), and the receiver must be reachable as a true e-invoice (`receiver-not-einvoice`). The last one matters most: receivers only reachable on paper, by email, or through the consumer bank channels (e-lasku, suoramaksu, Netposti) are rejected up front, with the channel the operator would have used named in the error, rather than quietly delivered another way. If the connection to the operator fails after the request may have already been written, we can't tell whether the invoice was accepted, and resubmitting could deliver it twice. The job reports the attempt with its timestamp under the `send-unconfirmed` code instead of retrying. Check with support before sending the invoice again. Business-to-government is the segment where e-invoicing is mandatory in Finland, and the state applies its own reference conventions: order numbers must start with `V1`, agreement numbers with `VSK1`, and posting references with `TK1`, with at most one of each per invoice. Set the order number in `ordering.purchases` and the agreement number in `ordering.contracts` on the GOBL invoice. Invopop doesn't validate or normalise these prefixes, so format them exactly as the contracting authority provided them, or the state will reject the invoice. The operator's synchronous accept is the final programmatic signal: there is no delivery status API to poll afterwards. If a receiving operator later rejects the invoice, that rejection arrives by email in production. No news after acceptance is good news. **Peppol** In countries where Peppol is the standard but not mandatory, you may still need to issue an e-invoice when the recipient isn't on the network. Both parties can agree on an alternative transfer method, but the invoice must still be EN16931 compliant. Recommended approach: * Set up a separate workflow that generates the XML without the send-Peppol-document step * Or reuse your existing workflow without the customer Peppol ID — the send step is automatically skipped * Fetch the generated XML and deliver it through the agreed channel, typically email B2C invoices typically lack the structured customer information required for Peppol delivery, and most consumers don't have inboxes. Use a conditional workflow: 1. Add an **If/Else** step that checks for a customer inbox using `count(customer.inboxes, true) > 0`. 2. On the `false` branch, generate a PDF and email it to the customer, then stop the flow. This routes B2B invoices through Peppol while keeping a smooth path for consumers. If a job fails with `KO` and `receiver not found in the peppol network`, treat it like an invalid email address — the recipient simply isn't reachable on Peppol. Add the **Lookup Participant ID** step (ideally in a separate validation workflow run against customer data) so you catch missing IDs before generating the invoice. No. The regime is automatically derived from the supplier's settings, which is the recommended approach for Peppol — leave it unset on the document. See the [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) addon for the field and validation rules Peppol BIS Billing 3.0 builds on, and the [Peppol app reference](/apps/peppol) for supported document types and Participant ID schemes. ### Supplier questions **Finland** Upload the supplier as a GOBL party with `tax_id.country = FI` and the Business ID (y-tunnus), then run the [Finland app](/apps/finland)'s registration workflow. Registration provisions the party its own operator account and allocates its e-invoice address — a party must be registered before it can send or receive anything. See the [supplier registration guide](/guides/fi-finvoice-supplier). Scheme `0216`, wrapping the party's OVT code — `0037` followed by the Business ID without its hyphen. Under Finland's Peppol Authority Specific Requirements, the OVT code is the mandatory participant identifier for Finnish organisations on Peppol. The `0037` at the start of the code itself is a country prefix, not the scheme. **Finvoice** An OVT code: `0037` followed by the party's Business ID (y-tunnus) without its hyphen, sometimes with a five-character suffix for routing inside large organisations (for example `003726174164`). On Peppol, the same code is wrapped in scheme `0216` (`0216:003726174164`). You can look any counterparty up in the national registry at [verkkolaskuosoite.fi](https://verkkolaskuosoite.fi): since 2024 it mirrors the Peppol address list too, so one lookup covers both networks. The OVT code, as an inbox with scheme `0216`. Other forms circulate on the Finnish network (IBAN-style addresses from the older bank channel, operator-prefixed ones such as `TE0037…`), but the OVT code is the canonical form, and it's what the routing pre-check and the generated e-invoice use. Registration provisions the party its own account with the operator, and it only completes once every service is in force and the party's e-invoice address has been allocated on the operator's side. Until then the registration job stays queued rather than reporting success on an account that can't yet receive. Yes. Each party gets its own operator account, its own e-invoice address, and its own reception polling schedule. Register each one separately by running the registration workflow on its party record. **Peppol** Upload the company as a party (Console → Parties → Suppliers → + New Supplier, or via the Create an Entry API) with name, tax\_id, address, and email. Then run it through the party registration workflow — the contact will receive a registration wizard link to provide proof of ownership. Once approved, the party is registered on the Peppol network (SMP+SML+Peppol visibility by default with the `ubl-invoice` doc group) and ready to receive invoices. A supplier with that Participant ID already exists in your workspace. Either reuse the existing party or, if it really is a new entity, check whether it should be registered under an alternative scheme (for example Belgium's `9925` VAT scheme rather than the default `0208`). Register them through different silo entries, even though they represent the same legal party. The supplier must upload proof of ownership for each inbox. Unique identifiers for entities on the Peppol network, made up of two parts: * **Scheme** — identifies the type of identifier (e.g. `9920` for Spanish VAT, `0208` for Belgian KBO/BCE) * **Code** — the actual identification number Participant IDs are usually based on VAT numbers or local business identifiers, and Invopop can derive them automatically from a Tax ID. Some countries support multiple schemes — Belgium, for example, defaults to `0208` but some entities are only registered under `9925` (VAT). If you hit a "receiver not found" error, the recipient may be registered under an alternative scheme. Peppol Party visibility determines what you can send and receive: * `smp` — SMP only, for testing * `smp+sml` — SMP and SML, useful when you only want to send * `smp+sml+peppol` — SMP, SML, and the Peppol Directory, recommended for both sending and receiving (and for being discoverable in the Directory) In general, use the highest visibility available. ### Receiving questions **Finvoice** Reception is polled, not pushed: each registered party's inbox at the operator is swept on a schedule, every five minutes by default. Add the time the sender's own operator takes to deliver, and an invoice normally appears within minutes, but not instantly. If you're testing, allow up to a quarter of an hour before suspecting a problem. Each received document becomes one entry in your workspace carrying the GOBL invoice, the original XML as received from the network, and a PDF rendering, whatever format the sender issued. Two things: the Finland app must be configured with a sync workflow and an import workflow, and the party must be registered. Registration checks the workflow configuration first, so set the workflows up before running it. Once registered, polling starts automatically; received invoices simply appear as new entries processed by your import workflow. **Peppol** Register the recipient as a Peppol participant with Invopop as their Access Point. Incoming documents are routed through your configured Import workflow, which converts the UBL or CII payload to GOBL and stores the entry in the Expenses folder. Yes. Either format can be removed based on your needs. The default template includes both for comprehensiveness, but if you're certain you'll only receive invoices in one syntax, dropping the other simplifies the workflow and reduces the apps you need to activate. The Import workflow's UBL and CII parser steps map the inbound XML into a GOBL invoice. From there you can route it to webhooks, Google Drive, accounting integrations, or any other destination — the GOBL representation is the single source of truth for downstream processing. *** Ask and answer questions about Finland's regulation → # France FAQ Source: https://docs.invopop.com/faq/france Frequently asked questions about invoicing compliance in France ### Compliance questions **France** 1 September 2026 for receiving (all businesses) and issuing for large/mid-size companies. 1 September 2027 extends issuing to SMEs and micro-businesses. B2G via Chorus Pro has been mandatory since 2017–2020 (phased by company size). **Chorus Pro** For all B2G transactions with French public administrations — phased in by supplier size from 2017, fully mandatory since 2020. Once an invoice is destined for a public entity, Chorus Pro is the only legal channel. Suppliers must register on Chorus Pro's portal and obtain credentials. Foreign businesses without a SIRET can register with their local tax ID but must verify acceptance with the receiving administration on a case-by-case basis. **PA (Plateforme Agréée)** E-invoices cannot be deleted or retracted. Instead a credit note or corrected invoice is sent referencing the original. The supplier must be registered in the Annuaire (the DGFiP-maintained directory of B2B participants) via an approved PA. Once registered, Invopop becomes the supplier's PA for sending and receiving over Peppol. Yes. From 1 September 2026 every French business, regardless of size, must be able to receive e-invoices, which requires an Annuaire registration through a PA. SMEs and micro-businesses are not required to issue e-invoices or e-report until 1 September 2027 — those obligations follow the company's size band, so registering to receive does not bring them forward. Until then they can be [registered for receiving only](/guides/fr-pa-registration#registering-without-e-reporting). **E-invoicing** transmits the invoice itself between trading parties via Peppol, with the PPF receiving the regulated dataset as a fifth corner. **E-reporting** is a periodic submission to the PPF covering transactions out of scope for e-invoicing — B2C, cross-border B2B, and any flow where the counterparty is not in the Annuaire. Yes — B2C is exempt from e-invoicing but is subject to e-reporting. From 1 September 2026 (large and medium-sized companies) or 1 September 2027 (all businesses), B2C transactions must be reported periodically to the PPF. If the supply is taxable under French reverse charge (i.e. VAT is paid on import), the transaction must be e-reported. Report payment data only when VAT is due on receipt of payment, such as for services under "cash VAT" (TVA sur les encaissements). E-invoicing does not apply. If the business is liable to French VAT, e-reporting applies to the relevant flows. E-reporting for reverse-charge VAT and intra-EU acquisitions is deferred until 1 September 2027. **Peppol** Mandatory dates vary by country. Belgium requires structured B2B e-invoicing — Peppol BIS by default — from January 2026. Germany is phasing in B2B e-invoicing between 2025 and 2028. France's Factur-X via Peppol applies once the PA reform takes effect. Outside mandates, Peppol delivery is voluntary but increasingly expected for B2G and cross-border trade. Yes. Every document exchanged on Peppol BIS uses a UBL or CII syntax that conforms to the EN16931 European e-invoicing standard, plus the relevant Peppol BIS specification. Invopop generates compliant XML automatically when you use the Peppol app. Peppol is a federated network — anyone could otherwise register a Participant ID for a company they don't represent. Proof of ownership ties the Participant ID to a verifiable contact at the company, which is what allows the registration to be published on the SML. Requirements vary by Authority. In Belgium, for example, the supplier must provide a recent extract from the Banque-Carrefour des Entreprises (KBO/BCE) plus a signed mandate. Invopop walks the registering party through the local requirements during the registration wizard. Yes — a Peppol BIS document delivered through a certified Access Point is treated as the legal e-invoice in any country that recognises Peppol. The signed UBL or CII XML is the authoritative record; archive it alongside any human-readable rendering you generate. Retention is set by each country's tax authority — typically 7 to 10 years in the EU. Invopop preserves the original XML and any generated PDF in the silo entry so you can satisfy local archival requirements wherever you operate. ### Invoicing questions **France** Two channels depending on the recipient: B2G uses Chorus Pro (CII format); B2B from September 2026 uses the Plateforme Agréée model (UBL, CII, or Factur-X via Peppol). Invopop is an approved PA — install the France PA app for B2B and the Chorus Pro app for B2G. In Factur-X PDFs, the XML file is embedded within the PDF itself. To extract and view it, use the `Attachments` section in Adobe Acrobat Reader, or a tool like the [SysTools PDF Extractor](https://www.systoolsgroup.com/pdf/extractor/). **Chorus Pro** Chorus Pro primarily supports CII format based on EN16931. Invopop currently focuses on CII with plans to add additional formats in the future. French businesses need a SIRET number. Foreign businesses can use their local tax identifier, but should verify acceptance with the receiving French institution. Yes, you can modify and resubmit invoices until the receiving institution accepts them. Once accepted, invoices become locked and cannot be modified. Use your GOBL invoice series and code combined as the invoice identifier in the Chorus Pro portal to locate your submitted invoices. Chorus Pro has specific file size and format requirements. Invopop handles these automatically when generating CII XML files from your GOBL invoices. The recipient's SIRET (or equivalent identifier) plus a Chorus Pro service code where applicable. Invopop generates EN 16931 CII XML by default — UBL is also accepted by Chorus Pro. **PA (Plateforme Agréée)** Invopop is an [officially approved Plateforme Agréée](https://www.impots.gouv.fr/je-consulte-la-liste-des-plateformes-agreees) under the DGFiP mandate. Registration, invoicing, and lifecycle status are available today; e-reporting (Flow 10) is in active development. See the [PA hub readiness matrix](/guides/fr-pa) for the current state. The base [FR tax regime](https://docs.gobl.org/regimes/fr) plus the EN 16931 profile. For Peppol delivery, `peppol-bis-v3`. The forthcoming `fr-ctc-flow10-v1` addon covers e-reporting payloads — separate from the e-invoicing flow. No. Most Peppol countries treat self-billing as a document type of its own, but France models it as a **standard invoice** with the `untdid-document-type` extension set to `389`. In GOBL you never set the code yourself: add the `self-billed` tag and the [`fr-ctc-flow2-v1`](https://docs.gobl.org/addons/fr-ctc-flow2-v1#standard-self-billed) add-on applies it automatically. See [Self-billing](/guides/fr-pa-invoicing#self-billing) for the full flow. Each invoice or lifecycle status sent through France PA costs **5 pops**: 1 pop for the conversion to UBL/CII, 2 pops to send it over Peppol, 1 pop to forward it to the PPF, and 1 pop for the silo entry. See [Pops & pricing](/get-started/pricing) for how pops work. **Peppol** In countries where Peppol is the standard but not mandatory, you may still need to issue an e-invoice when the recipient isn't on the network. Both parties can agree on an alternative transfer method, but the invoice must still be EN16931 compliant. Recommended approach: * Set up a separate workflow that generates the XML without the send-Peppol-document step * Or reuse your existing workflow without the customer Peppol ID — the send step is automatically skipped * Fetch the generated XML and deliver it through the agreed channel, typically email B2C invoices typically lack the structured customer information required for Peppol delivery, and most consumers don't have inboxes. Use a conditional workflow: 1. Add an **If/Else** step that checks for a customer inbox using `count(customer.inboxes, true) > 0`. 2. On the `false` branch, generate a PDF and email it to the customer, then stop the flow. This routes B2B invoices through Peppol while keeping a smooth path for consumers. If a job fails with `KO` and `receiver not found in the peppol network`, treat it like an invalid email address — the recipient simply isn't reachable on Peppol. Add the **Lookup Participant ID** step (ideally in a separate validation workflow run against customer data) so you catch missing IDs before generating the invoice. No. The regime is automatically derived from the supplier's settings, which is the recommended approach for Peppol — leave it unset on the document. See the [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) addon for the field and validation rules Peppol BIS Billing 3.0 builds on, and the [Peppol app reference](/apps/peppol) for supported document types and Participant ID schemes. ### Registering supplier questions **France** For B2B PA flows: register the supplier via the France PA Register Party workflow (publishes the SIREN to the Annuaire and Peppol). For Chorus Pro: register the supplier with their SIRET on Chorus Pro's portal and link credentials in the Chorus Pro app. France PA does not require supplier-side certificates — Peppol uses Invopop's AP cert. Chorus Pro uses an OAuth token bound to the supplier's account; the token is encrypted at rest in Invopop. **Chorus Pro** Ensure the supplier has a valid Chorus Pro account and provided correct credentials. Contact support if registration workflow issues persist. OAuth 2.0 client credentials issued by Chorus Pro after registration. Invopop stores the token encrypted; suppliers can revoke access at any time through Chorus Pro's portal. **PA (Plateforme Agréée)** Run the France PA Register Party workflow with the supplier's SIREN. Invopop publishes them to the Annuaire and the Peppol SMP — they are then routable for both invoicing and e-reporting through Invopop. Yes. Copy the PPF register supplier template and remove the **Register party for reporting** step. The party gets its Annuaire line and Peppol inbox and can receive invoices, but no reporting cadence starts. When its obligations begin, run the removed step against the party to complete the registration. See [Registering without e-reporting](/guides/fr-pa-registration#registering-without-e-reporting). None at the supplier level. The Plateforme Agréée holds an OpenPeppol-issued mTLS certificate (Invopop's), and the PA-to-PPF channel uses additional DGFiP credentials managed by Invopop. It depends on the flows the merchant uses: * **E-invoicing (B2B)** — **150 pops** per merchant: 50 pops for the French directory (Annuaire) registration plus 100 pops for Peppol. * **E-reporting only (B2C or international B2B)** — **50 pops** per merchant to register the party for reporting. Each registered merchant counts as a seat: the same seat pops are deducted on registration and again every 30 days for as long as the merchant stays registered — see [Pops & pricing](/get-started/pricing) for how seats are billed. **Peppol** Upload the company as a party (Console → Parties → Suppliers → + New Supplier, or via the Create an Entry API) with name, tax\_id, address, and email. Then run it through the party registration workflow — the contact will receive a registration wizard link to provide proof of ownership. Once approved, the party is registered on the Peppol network (SMP+SML+Peppol visibility by default with the `ubl-invoice` doc group) and ready to receive invoices. A supplier with that Participant ID already exists in your workspace. Either reuse the existing party or, if it really is a new entity, check whether it should be registered under an alternative scheme (for example Belgium's `9925` VAT scheme rather than the default `0208`). Register them through different silo entries, even though they represent the same legal party. The supplier must upload proof of ownership for each inbox. Unique identifiers for entities on the Peppol network, made up of two parts: * **Scheme** — identifies the type of identifier (e.g. `9920` for Spanish VAT, `0208` for Belgian KBO/BCE) * **Code** — the actual identification number Participant IDs are usually based on VAT numbers or local business identifiers, and Invopop can derive them automatically from a Tax ID. Some countries support multiple schemes — Belgium, for example, defaults to `0208` but some entities are only registered under `9925` (VAT). If you hit a "receiver not found" error, the recipient may be registered under an alternative scheme. Peppol Party visibility determines what you can send and receive: * `smp` — SMP only, for testing * `smp+sml` — SMP and SML, useful when you only want to send * `smp+sml+peppol` — SMP, SML, and the Peppol Directory, recommended for both sending and receiving (and for being discoverable in the Directory) In general, use the highest visibility available. ### Receiving questions **France** Register the recipient with Invopop as their Plateforme Agréée. Inbound documents (UBL, CII, Factur-X) are converted to GOBL and stored in the Expenses folder. Chorus Pro inbound flow is separate and routes via the Chorus Pro app. UBL via [`gobl.peppol`](https://github.com/invopop/gobl.peppol); CII and Factur-X via [`gobl.cii`](https://github.com/invopop/gobl.cii). The original structured XML (or PDF/A-3 with embedded XML) is preserved as a silo entry attachment. **PA (Plateforme Agréée)** Register the recipient via Invopop as their PA. Inbound UBL/CII/Factur-X documents are routed to the configured Import workflow and become GOBL silo entries. Lifecycle status updates (CDAR) feed back to the issuer through the same channel. UBL, CII, or Factur-X (PDF with embedded CII XML), all conforming to EN 16931 and the French CTC profile. Invopop preserves the original and exposes the GOBL conversion. Yes. A single company can be reachable at several destinations by registering different routing identifiers (electronic addresses) in the Annuaire — one per PDP or inbox. Invoices addressed to a given identifier are delivered to the platform registered against it, so you can route some invoices to Invopop and others to a different PDP (for example a travel-and-expense tool) for the same SIREN. The Annuaire supports several address formats that map to increasingly granular destinations within the same company: * `SIREN` — the company as a whole. * `SIREN_SIRET` — a specific establishment. * `SIREN_SIRET_ROUTINGCODE` — a site, department, or workflow within an establishment. * `SIREN_SUFFIX` — a custom routing suffix. Give each PDP or inbox a distinct identifier and share the matching address with each issuer, so their invoices reach the intended destination. You can [look up an electronic address](/guides/fr-lookup) in the Annuaire to confirm where it currently routes. **Peppol** Register the recipient as a Peppol participant with Invopop as their Access Point. Incoming documents are routed through your configured Import workflow, which converts the UBL or CII payload to GOBL and stores the entry in the Expenses folder. Yes. Either format can be removed based on your needs. The default template includes both for comprehensiveness, but if you're certain you'll only receive invoices in one syntax, dropping the other simplifies the workflow and reduces the apps you need to activate. The Import workflow's UBL and CII parser steps map the inbound XML into a GOBL invoice. From there you can route it to webhooks, Google Drive, accounting integrations, or any other destination — the GOBL representation is the single source of truth for downstream processing. ### Reporting questions **France** For TVA, file via DGFiP's portal — Invopop does not generate CA3 yet. For e-reporting (Flow 10): submit via your Plateforme Agréée — Invopop's e-reporting workflow batches transactions per period and submits to the PPF. TVA: DGFiP's EDI-TVA XML schema. E-reporting Flow 10: a structured JSON/XML payload defined by the PPF specification (currently in beta). Invopop emits Flow 10 via the upcoming `fr-ctc-flow10-v1` GOBL addon. **PA (Plateforme Agréée)** Flow 10 e-reporting: 3× per month (every 10 days) for B2C and cross-border transactions. Lifecycle status (CDAR): per event, near real-time. Specific deadlines depend on the supplier's tax filing cadence (monthly/quarterly). Flow 10 uses a JSON envelope wrapping aggregated transaction data, defined in the PPF technical specification. Lifecycle CDAR payloads are XML messages exchanged over Peppol with structured status codes. Recording a transaction for e-reporting (B2C or international B2B) costs **2 pops** per invoice: 1 pop to record it and 1 pop for the silo entry. On top of that, each report submission costs **10 pops**. See [Pops & pricing](/get-started/pricing) for how pops work. Ask and answer questions about France's regulation → # Germany FAQ Source: https://docs.invopop.com/faq/germany Frequently asked questions about invoicing compliance in Germany ### Compliance questions **Germany** Receiving capability has been mandatory since 1 January 2025. Issuing becomes mandatory on 1 January 2027 for companies with turnover above €800k, and 1 January 2028 for everyone else. B2G has been mandatory since 2020. There is no legal mandate to use Peppol in Germany. The requirement is to issue and receive invoices in a structured, EN 16931-compliant format (like XRechnung or ZUGFeRD). In practice, Peppol is by far the most widely used network, because it is the standardized, government‑endorsed way to exchange XRechnung invoices electronically with German public authorities and, increasingly, with large businesses. Using Peppol ensures: * Interoperability with virtually all public sector recipients. * Compliance with format and technical rules without having to negotiate separate connections or portals. * Access via certified Peppol Access Points, which handle validation and delivery. * Other delivery channels exist (email, portal upload), but they are often less convenient, less standardized, and may not scale for high-volume or cross-border invoicing. So, while Peppol isn't legally required, almost everyone uses it in practice for compliance and efficiency. Timing is linked to contractual and procedural deadlines, not a specific law that defines a universal submission window. However, in the context of B2G many authorities specify invoice submission within 10 days of service completion in their contracts or portals, so it's best to issue the invoice as early as possible. In the case of B2B the general VAT rule states that the invoice must be issued within 15 days after the end of the month in which the supply was made, if the transaction is subject to VAT and involves another taxable business. This 15-day window is critical because late issuance can make VAT reporting inconsistent between supplier and customer and it may also affect the buyer's right to input VAT deduction. Any entity with a Steuernummer (tax number) or USt-IdNr (VAT ID). Foreign suppliers selling into German B2G need a valid VAT ID and a Leitweg-ID provided by the recipient. For B2G, the supplier must include the recipient's Leitweg-ID (the German B2G routing identifier) in the BuyerReference field. For B2B, no extra obligations beyond the standard Peppol participant registration. Since 1 January 2025, every German VAT-registered business must accept structured e-invoices (XRechnung, ZUGFeRD ≥ EN 16931). Archival in original format for 8 years (§ 14b UStG) — the structured XML is the legal record, the PDF is supplementary. Monthly or quarterly Umsatzsteuer-Voranmeldung (USt-VA) and the annual Umsatzsteuerjahreserklärung. Cross-border B2B sales also require Zusammenfassende Meldung (EC sales list). E-reporting tied to e-invoicing is expected from 2028 but not yet legislated. **Peppol** Mandatory dates vary by country. Belgium requires structured B2B e-invoicing — Peppol BIS by default — from January 2026. Germany is phasing in B2B e-invoicing between 2025 and 2028. France's Factur-X via Peppol applies once the PA reform takes effect. Outside mandates, Peppol delivery is voluntary but increasingly expected for B2G and cross-border trade. Yes. Every document exchanged on Peppol BIS uses a UBL or CII syntax that conforms to the EN16931 European e-invoicing standard, plus the relevant Peppol BIS specification. Invopop generates compliant XML automatically when you use the Peppol app. Peppol is a federated network — anyone could otherwise register a Participant ID for a company they don't represent. Proof of ownership ties the Participant ID to a verifiable contact at the company, which is what allows the registration to be published on the SML. Requirements vary by Authority. In Belgium, for example, the supplier must provide a recent extract from the Banque-Carrefour des Entreprises (KBO/BCE) plus a signed mandate. Invopop walks the registering party through the local requirements during the registration wizard. Yes — a Peppol BIS document delivered through a certified Access Point is treated as the legal e-invoice in any country that recognises Peppol. The signed UBL or CII XML is the authoritative record; archive it alongside any human-readable rendering you generate. Retention is set by each country's tax authority — typically 7 to 10 years in the EU. Invopop preserves the original XML and any generated PDF in the silo entry so you can satisfy local archival requirements wherever you operate. ### Invoicing questions **Germany** Pick a format based on the recipient: XRechnung (UBL or CII) for B2G via Peppol, ZUGFeRD/Factur-X for B2B where a human-readable PDF is also wanted. Both are EN 16931-compliant — Invopop generates either from the same GOBL invoice. Generate a GOBL invoice with the `de-xrechnung-v3` addon, then run the Peppol Send workflow. Invopop emits XRechnung (UBL or CII per recipient preference), looks up the recipient's Access Point, and delivers via Peppol. Both syntaxes are equally valid and contain the same information, so in the majority of cases the choice has no consequences. If you plan on sending invoices through the Peppol network, we recommend using UBL as it is the supported format. If you plan on also issuing invoices in ZUGFeRD or Factur-X, it might be more convenient to use CII, as it is the syntax also supported by ZUGFeRD and Factur-X. For ZUGFeRD PDFs, the XML file is embedded within the PDF itself. To extract and view it, you can use the `Attachments` section in Adobe Acrobat Reader. Alternatively, you can use specialized tools like the [SysTools PDF Extractor](https://www.systoolsgroup.com/pdf/extractor/) to extract the XML file. See the [Germany tax regime in GOBL](https://docs.gobl.org/regimes/de) for tax categories and identifiers. The XRechnung mapping lives in [`de-xrechnung-v3`](https://docs.gobl.org/addons/de-xrechnung-v3); ZUGFeRD/Factur-X share the EN 16931 CII profile. **Peppol** In countries where Peppol is the standard but not mandatory, you may still need to issue an e-invoice when the recipient isn't on the network. Both parties can agree on an alternative transfer method, but the invoice must still be EN16931 compliant. Recommended approach: * Set up a separate workflow that generates the XML without the send-Peppol-document step * Or reuse your existing workflow without the customer Peppol ID — the send step is automatically skipped * Fetch the generated XML and deliver it through the agreed channel, typically email B2C invoices typically lack the structured customer information required for Peppol delivery, and most consumers don't have inboxes. Use a conditional workflow: 1. Add an **If/Else** step that checks for a customer inbox using `count(customer.inboxes, true) > 0`. 2. On the `false` branch, generate a PDF and email it to the customer, then stop the flow. This routes B2B invoices through Peppol while keeping a smooth path for consumers. If a job fails with `KO` and `receiver not found in the peppol network`, treat it like an invalid email address — the recipient simply isn't reachable on Peppol. Add the **Lookup Participant ID** step (ideally in a separate validation workflow run against customer data) so you catch missing IDs before generating the invoice. No. The regime is automatically derived from the supplier's settings, which is the recommended approach for Peppol — leave it unset on the document. See the [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) addon for the field and validation rules Peppol BIS Billing 3.0 builds on, and the [Peppol app reference](/apps/peppol) for supported document types and Participant ID schemes. ### Registering supplier questions **Germany** No certificate-based registration is required to issue. To send via Peppol, register the supplier as a Peppol participant (typically by USt-IdNr scheme `9930`). For ZUGFeRD/Factur-X, no registration is needed — the supplier just attaches the XML to their PDF. Run the Register Participant workflow with the supplier's USt-IdNr (scheme `9930`). Invopop publishes the participant in Peppol's SMP and routes outbound documents from that point onward. **Peppol** Upload the company as a party (Console → Parties → Suppliers → + New Supplier, or via the Create an Entry API) with name, tax\_id, address, and email. Then run it through the party registration workflow — the contact will receive a registration wizard link to provide proof of ownership. Once approved, the party is registered on the Peppol network (SMP+SML+Peppol visibility by default with the `ubl-invoice` doc group) and ready to receive invoices. A supplier with that Participant ID already exists in your workspace. Either reuse the existing party or, if it really is a new entity, check whether it should be registered under an alternative scheme (for example Belgium's `9925` VAT scheme rather than the default `0208`). Register them through different silo entries, even though they represent the same legal party. The supplier must upload proof of ownership for each inbox. Unique identifiers for entities on the Peppol network, made up of two parts: * **Scheme** — identifies the type of identifier (e.g. `9920` for Spanish VAT, `0208` for Belgian KBO/BCE) * **Code** — the actual identification number Participant IDs are usually based on VAT numbers or local business identifiers, and Invopop can derive them automatically from a Tax ID. Some countries support multiple schemes — Belgium, for example, defaults to `0208` but some entities are only registered under `9925` (VAT). If you hit a "receiver not found" error, the recipient may be registered under an alternative scheme. Peppol Party visibility determines what you can send and receive: * `smp` — SMP only, for testing * `smp+sml` — SMP and SML, useful when you only want to send * `smp+sml+peppol` — SMP, SML, and the Peppol Directory, recommended for both sending and receiving (and for being discoverable in the Directory) In general, use the highest visibility available. ### Receiving questions **Peppol** Register the recipient as a Peppol participant with Invopop as their Access Point. Incoming documents are routed through your configured Import workflow, which converts the UBL or CII payload to GOBL and stores the entry in the Expenses folder. Yes. Either format can be removed based on your needs. The default template includes both for comprehensiveness, but if you're certain you'll only receive invoices in one syntax, dropping the other simplifies the workflow and reduces the apps you need to activate. The Import workflow's UBL and CII parser steps map the inbound XML into a GOBL invoice. From there you can route it to webhooks, Google Drive, accounting integrations, or any other destination — the GOBL representation is the single source of truth for downstream processing. Ask and answer questions about Germany's regulation → # Greece FAQ Source: https://docs.invopop.com/faq/greece Frequently asked questions about invoicing compliance in Greece ### Compliance questions **Greece** B2G has been mandatory since 2023 (phased in by company size). B2B reporting through myDATA has been mandatory for all transactions since 2021. Full structured B2B e-invoicing is being phased in following EU ViDA timelines. Any entity with a Greek AFM (tax ID) registered with the IAPR. Foreign businesses operating in Greece need a Greek fiscal representative or a non-resident AFM. Recipients must classify each received invoice in myDATA (καταχώρηση) within the deadline matching their books. Standard archival is 5 years. Monthly or quarterly VAT (Φ2) declarations, plus the annual VAT clearing return (Φ1). Withholding taxes have their own schedule. myDATA classification of issued and received invoices is continuous and feeds the periodic returns. **myDATA** Greece's myDATA system uses a detailed set of invoice type codes that classify every transaction reported to the tax authority (IAPR). Each type has a numeric code (like `1.1` or `11.1`) and describes the nature of the transaction — whether it's a standard sale, a service, a credit note, a retail receipt, and so on. When using GOBL, many of these types are assigned automatically based on the invoice type and tags you set. For the rest, you can set the `gr-mydata-invoice-type` extension directly in the tax section of your invoice, using type `other`. ### Sales Invoices (1.x) | Code | Description | GOBL Type | Tags | | ----- | ------------------------------------------------------------- | ---------- | ----------------------- | | `1.1` | Sales Invoice | `standard` | `goods` | | `1.2` | Sales Invoice / Intra-community Supplies | `standard` | `goods`, `export`, `eu` | | `1.3` | Sales Invoice / Third Country Supplies | `standard` | `goods`, `export` | | `1.4` | Sales Invoice / Sale on Behalf of Third Parties | `standard` | `goods`, `self-billed` | | `1.5` | Sales Invoice / Clearance of Sales on Behalf of Third Parties | `other` | — | | `1.6` | Sales Invoice / Supplemental Accounting Source Document | `other` | — | ### Service Invoices (2.x) | Code | Description | GOBL Type | Tags | | ----- | ------------------------------------------------------------------ | ---------- | -------------------------- | | `2.1` | Service Rendered Invoice | `standard` | *(default)* or `services` | | `2.2` | Intra-community Service Rendered Invoice | `standard` | `services`, `export`, `eu` | | `2.3` | Third Country Service Rendered Invoice | `standard` | `services`, `export` | | `2.4` | Service Rendered Invoice / Supplemental Accounting Source Document | `other` | — | ### Credit Invoices (5.x) | Code | Description | GOBL Type | Tags | | ----- | ------------------------------- | ------------- | ---- | | `5.1` | Credit Invoice / Associated | `credit-note` | — | | `5.2` | Credit Invoice / Non-Associated | `other` | — | ### Retail / Simplified (11.x) | Code | Description | GOBL Type | Tags | | ------ | ----------------------------------------------- | ------------- | ------------------------------------ | | `11.1` | Retail Sales Receipt (ΑΛΠ) | `standard` | `goods`, `simplified` | | `11.2` | Service Rendered Receipt (ΑΠΥ) | `standard` | `services`, `simplified` | | `11.3` | Simplified Invoice | `standard` | `simplified` | | `11.4` | Retail Sales Credit Note | `credit-note` | `simplified` | | `11.5` | Retail Sales Receipt on Behalf of Third Parties | `standard` | `goods`, `simplified`, `self-billed` | Additional codes exist for proof of expenditure (3.x), self-delivery / self-supply (6.x), contracts and rents (7.x, 8.x, 15.x, 16.x), expense / purchase records (13.x, 14.x), and accounting entries (17.x). Greek regulation does not allow two myDATA providers to operate simultaneously for the same VAT number. If your business currently uses a different provider, you will need to switch to Invopop's provider (ILYDA) before issuing invoices through the platform. The regulatory restriction applies to simultaneous use of multiple providers, not to changing from one to another. See the [myDATA supplier registration guide](/guides/gr-iapr-supplier) for details on the onboarding process, or contact us via Slack or [support@invopop.com](mailto:support@invopop.com). Each AFM can have only one active myDATA provider at a time — switching providers requires deregistering the previous one in Taxisnet. The supplier must also declare its issuance branch (κλειδί χρήστη) and issuance series (σειρά). Recipients must classify (χαρακτηρισμός) every issued invoice that lists them as counterpart, by the periodic return deadline. Failure to classify exposes the recipient to fines and discrepancies in IAPR's automated VAT reconciliation. Continuous: every issued invoice transmitted in real time, every received invoice classified. Supplementary monthly/quarterly aggregations (e.g., E3 income statements) reconcile to myDATA totals automatically — discrepancies trigger IAPR queries. ### Invoicing questions **myDATA** Build a GOBL invoice with the `gr-mydata-v1` addon, run the IAPR Issue Invoice workflow. Invopop signs and transmits via ILYDA, retrieves the MARK identifier, and stores it on the silo entry. Install the ILYDA Greece app, register the supplier (one provider at a time per VAT — see our FAQ), and run invoices through the IAPR workflow. PDFs are generated alongside the myDATA submission. The Greek tax authority (IAPR) requires the invoice type to be specified as part of the invoice. In [GOBL](https://docs.gobl.org), this type can be set using the `gr-mydata-invoice-type` extension in the tax section and setting the [GOBL invoice type](https://docs.gobl.org/draft-0/bill/invoice) to other. Alternatively, GOBL will set the extension for you based on the type and the tax tags you set in your [GOBL invoice](https://docs.gobl.org/draft-0/bill/invoice). You can read more in the [GOBL Greece Tax Regime readme](https://github.com/invopop/gobl/blob/main/regimes/gr/README.md). If you produce a PDF version of the invoice, the invoice type label will be displayed instead of "Invoice". For further details on how GOBL prepares data for conversion, see the [Greek Tax Regime](https://github.com/invopop/gobl/blob/main/regimes/gr/README.md). If you issue a credit note shortly after the invoice it refers to, the MyDATA system may reject it because the original invoice hasn't completed synchronization. You'll typically see an error like: ``` Fatal error 301: Invoice with ΜΑΡΚ xxxx not found for VAT number xxxx ``` This happens because there can be a delay between when an invoice is accepted by MyDATA and when it becomes fully available for reference by other documents like credit notes. This delay can range from a few minutes to several hours, depending on MyDATA system load. **Solution**: If you receive this error, retry issuing the credit note after waiting some time. You may need to wait anywhere from a few minutes to several hours for the original invoice to be fully synchronized in the MyDATA system before the credit note can successfully reference it. See the [Greece tax regime in GOBL](https://docs.gobl.org/regimes/gr) for tax categories and AFM rules. The myDATA mapping lives in [`gr-mydata-v1`](https://docs.gobl.org/addons/gr-mydata-v1) including all invoice type codes. ### Registering supplier questions **myDATA** Contact Invopop to begin the onboarding flow with ILYDA. Production registration is multi-step: the supplier authorizes ILYDA in Taxisnet, declares ILYDA as their issuer in myDATA, and signs ILYDA's service agreement, then onboards with Invopop. Sandbox uses a shared pre-registered test AFM (`177472438`) — no manual steps required. No supplier-side certificates. ILYDA submits to myDATA on the supplier's behalf using its provider credentials, authorized by the supplier through Taxisnet. The supplier holds only their Taxisnet username/password. Suppliers don't upload credentials to Invopop — ILYDA holds the IAPR submission credentials on the supplier's behalf based on the Taxisnet authorization. Only the AFM and registration metadata are stored in Invopop. Ask and answer questions about Greece's regulation → # Hungary FAQ Source: https://docs.invopop.com/faq/hungary Frequently asked questions about invoicing compliance in Hungary FAQ content for Hungary is being prepared. For specific questions, please contact [support@invopop.com](mailto:support@invopop.com). *** Ask and answer questions about Hungary's regulation → # Italy FAQ Source: https://docs.invopop.com/faq/italy Frequently asked questions about invoicing compliance in Italy ### Compliance questions **Italy** 1 January 2019 for all B2B and B2C transactions between resident parties (B2G has been mandatory since 2014). 1 July 2022 extended the mandate to flat-rate scheme contributors. Cross-border B2B is reported via SDI (the esterometro was retired in 2022). Any entity with an Italian Partita IVA (VAT number) — companies, professionals, and flat-rate scheme contributors. Codice Fiscale alone is not sufficient for invoicing through SDI. All resident businesses must receive electronic invoices through SDI — it's the only legal channel. Invoices must be archived in their structured FatturaPA XML form for 10 years. Quarterly VAT (LIPE), annual VAT return (Modello IVA), Esterometro (cross-border B2B summary, replaced by SDI direct submission since 2022), and Modello 730/Redditi for personal returns. SDI clearance handles the per-invoice reporting layer. **SDI** Yes, electronic invoicing through SDI is mandatory in Italy for B2G, B2B, and B2C transactions. All invoices must be issued in FatturaPA format and transmitted through the SDI (*Sistema di Interscambio*) platform. There are two main ways to correct an invoice in the Italian SDI system: 1. Issue a credit note (Nota di Credito - TD04) to fully or partially cancel the original invoice. 2. Issue a debit note (Nota di Debito - TD05) to integrate/correct the original invoice with additional charges. The corrective document must reference the original invoice number and date. The supplier must have an active Partita IVA registered with the Agenzia delle Entrate. Invopop acts as the supplier's intermediary (intermediario fiscale) — no individual supplier certificate is required. Recipients must register a Codice Destinatario (recipient code) with the Agenzia delle Entrate. Once registered, all incoming invoices route through SDI to the registered intermediary. Archival in original XML for 10 years. **Smart Receipts** For B2C transactions where the customer's Codice Fiscale or Partita IVA is unknown — typical retail or online checkouts. AdE CF generates a Documento Commerciale (commercial receipt) instead of a FatturaPA. Once the customer's tax ID is known, regular SDI invoicing must be used. The supplier must have a Partita IVA and operate in a sector that issues commercial receipts (retail, hospitality, etc.). They need to register with Agenzia delle Entrate as an AdE CF issuer before going live. Each documento commerciale is transmitted in real time through the AdE CF service; the Agenzia delle Entrate derives daily corrispettivi totals automatically, replacing the historical *registratore di cassa* daily total. ### Invoicing questions **Italy** Install the SDI Italy app for B2B/B2G/B2C structured invoicing, or the Smart Receipts app for B2C-only AdE CF receipts. Run invoices through the Generate FatturaPA + Send to SDI workflow. See the [Italy tax regime in GOBL](https://docs.gobl.org/regimes/it) for tax categories, codice fiscale rules, and SDI-specific extensions. The [`it-sdi-v1`](https://docs.gobl.org/addons/it-sdi-v1) addon documents required FatturaPA fields. **SDI** The SDI system can take up to 24 hours to process invoices, especially during peak periods. While waiting, the "Send to SDI" step will remain in the `QUEUED` state. The system will automatically check for updates, and the status will change once SDI has processed the invoice. Once the SDI process is complete, the workflow will show one of several status codes: * `delivered` - The invoice was successfully delivered to a B2B recipient * `accepted-pa` - The invoice was accepted by a Public Administration * `not-delivered` - The invoice couldn't be delivered, but was processed correctly by SDI Check the workflow history to see the exact status. No, sending and receiving invoices require different workflows: * For sending invoices, a workflow with the Generate FatturaPA and Send to SDI steps is needed * For receiving invoices, two workflows are required: 1. A Customer Registration workflow (run once for each company that needs to receive invoices) 2. An Import Invoices workflow (configured to run automatically) For more information on receiving invoices, see our [Italy - SDI: Receiving Invoices](/guides/it-sdi-receiving) guide. Invopop handles both Italian tax identification numbers in the supplier and customer sections of invoices: * **Partita IVA** (VAT number): Automatically extracted from the `tax_id/code` field. * **Codice Fiscale** (fiscal code): Must be specified as an identity with the key `it-fiscal-code`. Here's an example showing both identifiers in a supplier object: ```json Supplier with Partita IVA and Codice Fiscale theme={"system"} { "supplier": { "name": "MªF. Services", "tax_id": { "country": "IT", "code": "12345678903" }, "identities": [ { "key": "it-fiscal-code", "code": "MRTMTT91D08F205J" } ] } } ``` **Smart Receipts** You cannot modify an AdE CF invoice after issuing it. Instead you must: 1. Void the incorrect invoice using the "Void AdE CF Invoices" workflow 2. Issue a new invoice with the correct information We recommend adding a series and code to the invoice so that you can keep track internally even though the AdE will generate a document number. AdE CF is **not** a substitute for [SDI](/guides/it-sdi-sending). SDI is the main channel for issuing electronic invoices in Italy; Invopop issues FatturaPA documents through it. AdE CF should only be used when customer information is not available, like in online B2C scenarios. Use the standard GOBL invoice with the simplified tag. No customer tax ID is required. The `it-ticket-v1` addon handles the AdE CF-specific fields. Each receipt gets a unique Lottery Code if the lottery functionality is enabled. ### Registering supplier questions **Italy** Provide the supplier's Partita IVA and Codice Fiscale (where different) in their party configuration. No certificate upload is needed — Invopop signs and submits to SDI as the supplier's intermediary. No supplier certificates are required. Invopop signs FatturaPA submissions with its own Agenzia delle Entrate-recognized intermediary credentials. Only the Partita IVA and routing metadata are stored. **SDI** Just configure the supplier's Partita IVA in their party. SDI does not require explicit supplier registration to issue — Invopop signs and submits as intermediary the moment the workflow runs. None — Invopop submits via its intermediary credentials (a server-to-server channel with Agenzia delle Entrate). Suppliers don't manage any certificates for SDI. **Smart Receipts** Run the Smart Receipts Register Supplier workflow with the supplier's Partita IVA. Invopop registers the merchant with Agenzia delle Entrate's AdE CF service so issuance can begin immediately. None at the supplier level. Invopop authenticates to AdE CF via its intermediary credentials. The supplier's Partita IVA is the only routing identifier needed. ### Receiving questions **Italy** Register the recipient with SDI using Invopop's Recipient Code (`JKKZDGR`) and run the Customer Registration workflow. Invopop automatically receives matching invoices and routes them through the configured Import workflow. Inbound FatturaPA XMLs are parsed via [`gobl.fatturapa`](https://github.com/invopop/gobl.fatturapa). The original signed XML is preserved as a silo entry attachment alongside the GOBL representation. **SDI** If an invoice received through SDI contains errors: 1. The import process will still attempt to convert it to [GOBL](https://docs.gobl.org) format 2. Any validation errors will be logged, and the rescue steps in your workflow will be triggered 3. You can review the errors and decide how to handle the invoice If the invoice has significant structural issues that prevent conversion, you may need to contact the sender to request a corrected invoice. Invoices are typically received within minutes after being sent by suppliers through SDI. The automatic import process in Invopop processes them as soon as they are received by our system. Yes, multiple companies can be registered to receive invoices through a single Invopop workspace. For each company, you must: 1. Register the Recipient Code `JKKZDGR` with the Italian tax authority for that specific company 2. Have its tax ID registered using the Customer Registration workflow in Invopop 3. Use the same Import Invoices workflow configured in the app settings This two-step registration process (with the tax authority and with Invopop) must be completed for each company you want to register. This is particularly useful for white-labeling scenarios where a user manages multiple entities. Yes, but only one party at a time can hold a given tax ID. Run the [unregister workflow](/guides/it-sdi-receiving#unregistering-a-company) on the party that currently holds it, then register the new one. Registering a tax ID that another party already holds fails with `supplier already registered in a different workspace or with a different entry`. Sandbox and live are counted separately, so the same tax ID can be registered in both at the same time. The two-step registration process serves different purposes: 1. **Registering with the Italian tax authority** - Tells SDI to route invoices addressed to your company to Invopop's system using the *Codice Destinatario* `JKKZDGR`. 2. **Registering with Invopop** (Customer Registration workflow) - Tells Invopop's system which invoices to accept and process for your workspace. Both steps are necessary: the first routes the invoices to Invopop, and the second ensures Invopop knows which workspace should receive those invoices. Signed FatturaPA XML (versions 1.2.x), conforming to the Agenzia delle Entrate schema. The signature is XAdES; SDI's own *Notifica di Esito Committente* envelopes the document during transmission. ### Reporting questions **Smart Receipts** Per receipt, in real time — there is no periodic batch. Invopop transmits each receipt to AdE CF as it is issued. End-of-day totals are aggregated automatically by Agenzia delle Entrate from individual transmissions. No periodic format — per-receipt JSON sent to AdE CF's REST endpoint. Daily/monthly aggregations are derived automatically by Agenzia delle Entrate. Ask and answer questions about Italy's regulation → # Malaysia FAQ Source: https://docs.invopop.com/faq/malaysia Frequently asked questions about invoicing compliance in Malaysia FAQ content for Malaysia is being prepared. For specific questions, please contact [support@invopop.com](mailto:support@invopop.com). *** Ask and answer questions about Malaysia's regulation → # Mexico FAQ Source: https://docs.invopop.com/faq/mexico Frequently asked questions about invoicing compliance in Mexico ### Compliance questions CFDI 1.0 became mandatory for large taxpayers in 2011 and was extended to all taxpayers in 2014. CFDI 4.0 (the current version) replaced 3.3 on 1 April 2023. There is no entity below the mandate threshold — any taxpayer issuing an invoice must do so as a CFDI. Any taxpayer registered with SAT — Persona Física (13-char RFC) or Persona Moral (12-char RFC). The supplier must have an active CSD (Certificado de Sello Digital) and a fiscal regime (`RegimenFiscal`) recorded in their CIF. Recipients must verify each CFDI's UUID through SAT's public consultation, retain the XML for 5 years (Article 30 CFF), and accept or reject cancellation requests within 3 business days when applicable. Monthly provisional ISR and IVA payments (DyP) plus the annual ISR return. RESICO contributors have a fully automated monthly tax base computed from issued CFDIs and REPs. Stamping replaces invoice-level reporting. No. Conditioning invoicing on the receiver providing their CIF document is unlawful under Article 83 § IX of the CFF and carries fines. The data on the CIF (RFC, name, régimen, postal code) is required, but the issuer must be willing to accept those four pieces of information by other means. In practice, most B2B workflows still ask for the CIF, but it cannot be made a hard precondition. Cancellation in Mexico is bilateral by default. The issuer submits a request, the receiver has three business days to accept or reject, and rejection keeps the CFDI valid. Issuers cannot unilaterally void an invoice that requires acceptance. The exceptions are: small amounts, certain document types, same-day cancellation, and público en general invoices. The practical recommendation is to coordinate with the customer before submitting any cancellation request, especially for high-value B2B invoices. Beyond the procedural difference, the two methods determine *when* income is recognized for ISR and IVA purposes. PUE income is recognized at issuance; PPD income is recognized as REPs are issued. Choosing the wrong method shifts tax liability into the wrong period and creates discrepancies during SAT's automated reconciliation. RESICO contributors are particularly exposed because their entire monthly tax base is computed from CFDIs and REPs. A complemento is a SAT-defined XML extension with a published XSD, sealed inside the digital signature, and validated at stamping. An addenda is a non-fiscal XML block defined unilaterally by a private buyer (Walmart, Liverpool, Pemex, automotive OEMs, etc.) and inserted into the `` node of the CFDI. SAT does not validate addenda content, but the buyer's ERP rejects payment without it. Each large enterprise customer typically defines its own addenda spec; there is no central catalog. Addendas are not currently supported by Invopop. The supplier must have an active CSD (not a FIEL — FIEL is for SAT login, CSD is for invoicing), be in good standing on Lista 69-B (not classified as EFOS), and maintain valid postal codes matching their CIF. ### Invoicing questions Individual CFDIs are not required for sales under MXN \$100, but those sales must still be included in the global CFDI. Often issuing all invoices will simplify your operation. Yes. We obtain the supplier's CSD (digital seal) and credentials to issue invoices in that company's name. Read more in our [white label use case](/guides/white-label). Yes. The `mx-cfdi-v4` addon supports both PUE and PPD on the original invoice, and Invopop also issues the subsequent payment receipts (REPs / Pago / comprobante de pago) that must be emitted as payments are collected. Model each receipt as a GOBL [`bill.Payment`](https://docs.gobl.org/draft-0/bill/payment) referencing the PPD invoices being settled and run it through the SAT issue payment workflow. See the [payment receipt example](/guides/mx-sat-issuing) in the issuing guide. Yes, if the original was issued as PUE and payment is not received by the last day of the issuance month, rule 2.7.1.32 RMF requires cancelling the original and re-issuing as PPD with `FormaPago = 99`, then issuing REPs as payments come in. This is calendar-driven, not payment-event-driven, and it surprises most non-Mexican implementations. The conservative approach is to issue PPD whenever there is any uncertainty about same-month payment. REPs must be issued by the fifth calendar day of the month following payment receipt (rule 2.7.1.35 RMF). Missing the deadline does not invalidate the underlying invoice, but it prevents the customer from deducting the expense in the correct period and exposes the issuer to fines. This is a recurring source of friction and the reason customers will sometimes refuse to accept cancellations from a supplier with poor REP discipline. Install the SAT Mexico app (uses SW Sapien as PAC) plus the SW Sapien app for credentials. Onboard each issuing supplier with their CSD certificate and `mx-cfdi-issue-place`. Run invoices through the Issue CFDI workflow. The library that transforms GOBL into CFDI documents is publicly available as an open-source project and can be found at [github.com/invopop/gobl.cfdi](https://github.com/invopop/gobl.cfdi). For further details on how GOBL prepares data for conversion, see the [Mexico Tax Regime](https://github.com/invopop/gobl/blob/main/regimes/mx/README.md). The most common cause is a mismatch between the receiver's postal code in the CFDI and the postal code SAT has on file for that RFC. Resolution: ask the customer for their CIF (Constancia de Situación Fiscal) and use the postal code printed there, exactly. Secondary causes: * The postal code is real but not yet in `c_CodigoPostal`. Use the closest catalog code from the place of issuance. * The receiver is `XAXX010101000` or `XEXX010101000` and `DomicilioFiscalReceptor` differs from `LugarExpedicion`. They must be equal for generic RFCs. * The branch issuing the document is configured with the matriz's postal code instead of its own. In Mexico, a reduced VAT rate of 8% applies to transactions in border zones (northern and southern border regions). To successfully issue invoices with this rate, **both** of the following conditions must be met: 1. The supplier's RFC must be enabled by the SAT to invoice with the reduced rate in border zones. 2. Both the `mx-cfdi-issue-place` field and the customer's postal code (when included) must correspond to border zones. If either condition is not met, the SAT will reject the invoice with an error. CFDI40999 is a generic "unclassified error" returned by the SAT when no other, more specific error code applies. This error can have multiple causes. A common scenario is invoicing in border zones with the reduced 8% VAT rate. If you receive this error in that context, verify: 1. **RFC registration**: The supplier's RFC must be registered in the taxpayers registry for the appropriate border region tax incentive. Without this registration, the SAT will reject all invoices with the reduced rate. See [SAT's registration requirements and procedures](https://www.sat.gob.mx/minisitio/EstimulosFiscalesFronteraNorteSur/) for more information. 2. **Issue place postal code**: The [`mx-cfdi-issue-place`](https://docs.gobl.org/addons/mx-cfdi-v4#place-of-issue) field must contain a postal code from a municipality within a border zone. 3. **Tax rate**: Ensure you're applying the correct percentage (typically 8%) for the border zone. If the error persists after verifying these points, or you're getting this error for other reasons, please reach out to our support team. This error appears when you try to issue an invoice for a supplier (identified by its RFC) that has not been registered in your workspace. Before you can issue on a supplier's behalf, its CSD certificate must be uploaded and validated through the registration flow. To fix it, make sure the supplier is correctly registered by following the [Register a supplier](/guides/mx-sat-supplier#register-a-supplier) steps in the supplier registration guide. In **Sandbox** you may also hit this error for suppliers that were registered in the past. This is due to a change in how supplier registration is now enforced before sending invoices. To resolve it, open the supplier's Silo Entry in the Console and run the registration process again from the start, completing every step. The UsoCFDI must be allowed for the receiver's `RegimenFiscal`. The catalog defines the valid combinations; not every code works for every régimen. For example, D01–D10 (personal deductions) are only valid for individuals, never for legal entities. RESICO contributors (régimen 626) have a restricted set. When in doubt, default to `S01` (Sin efectos fiscales) — it is always valid but produces a non-deductible invoice for the receiver. Always ask the customer which UsoCFDI they need before issuing. By default, Invopop uses Mexico City's time zone (UTC-6) when automatically setting the [`issue_date`](https://docs.gobl.org/draft-0/bill/invoice#issue-date) and [`issue_time`](https://docs.gobl.org/draft-0/bill/invoice#issue-time) fields. However, the SAT validates these fields based on the time zone of the postal code specified in [`mx-cfdi-issue-place`](https://docs.gobl.org/addons/mx-cfdi-v4#place-of-issue). If the issuing location is in a different time zone, the SAT may reject the invoice with an error indicating the timestamp is in the future, as it only allows up to 5 minutes ahead of the local time. To avoid this, explicitly set `issue_date` and `issue_time` in your GOBL invoice using the local time zone of the issuing location when operating outside Mexico City's time zone. For non-MXN invoices, `TipoCambio` must be present and use the FIX rate published by Banxico in the DOF the day prior to the operation (Article 20 CFF, Article 56 Ley Aduanera). Common errors: * Using the day-of rate instead of the prior day's. * Quoting the inverse (USD per MXN instead of MXN per USD). * Setting `TipoCambio` on an MXN invoice (it must be 1 or absent). * Rounding inconsistently between line totals and document totals — Anexo 20 has specific rounding rules. See the [Mexico tax regime in GOBL](https://docs.gobl.org/regimes/mx) for tax categories, RFC structure, and CFDI extensions. The [`mx-cfdi-v4`](https://docs.gobl.org/addons/mx-cfdi-v4) addon documents required fields including UsoCFDI, RegimenFiscal, and place-of-issue. ### Registering supplier questions Invopop uses [SW Sapien](https://sw.com.mx), an Authorised Certification Provider (PAC), to sign and stamp CFDI documents for the Mexican tax authority. Without a valid CSD, the issuer cannot stamp any CFDI through any PAC. SAT can administratively revoke a CSD when it suspects fraudulent activity, repeated non-compliance, or tax debts. Operations halt until the supplier resolves the underlying cause and obtains a new CSD. CSDs also expire every four years. Suppliers should monitor CSD validity proactively; Invopop relies on the CSD uploaded during supplier registration and does not manage its lifecycle. Generate a registration link via the SAT Mexico Register Supplier workflow. The supplier uploads their CSD certificate (`.cer` + `.key` + password) and authorizes the PAC. Once validated, the supplier is ready to issue CFDIs. A CSD (Certificado de Sello Digital) issued by SAT specifically for invoicing — distinct from the FIEL (e.firma) used for portal login. The CSD comprises a `.cer` (X.509) and `.key` (encrypted private key) with a password set at generation. Validity: 4 years. The CSD certificate (`.cer`), private key (`.key`), and key password are stored encrypted at rest. Invopop uses them only to seal CFDIs before transmission to the PAC; the password and key are never returned in API responses. *** | | | | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Compliance | [Invoicing compliance in Mexico](/compliance/mexico)
[Compliance timeline](/timelines/mexico) | | Apps | [SAT Mexico](/apps/sat-mexico)
[SW Sapien](/apps/sw-sapien)
[Cron](/apps/cron) | | Guides | [Supplier registration](/guides/mx-sat-supplier)
[Issuing documents](/guides/mx-sat-issuing)
[Receiving invoices](/guides/mx-sat-receiving) | | FAQ | [Mexico FAQ](/faq/mexico) | | GOBL | [Mexico Tax Regime](https://docs.gobl.org/regimes/mx)
[Mexican SAT CFDI Addon](https://docs.gobl.org/addons/mx-cfdi-v4) | | GitHub | [gobl.cfdi](https://github.com/invopop/gobl.cfdi) |
Ask and answer questions about Mexico's regulation → # New Zealand FAQ Source: https://docs.invopop.com/faq/new-zealand Frequently asked questions about invoicing compliance in New Zealand FAQ content for New Zealand is being prepared. For specific questions, please contact [support@invopop.com](mailto:support@invopop.com). *** Ask and answer questions about New Zealand's regulation → # Norway FAQ Source: https://docs.invopop.com/faq/norway Frequently asked questions about invoicing compliance in Norway ### Compliance questions **Norway** Not yet. B2G has been mandatory since April 2019 — all suppliers to the public sector must invoice in Peppol BIS Billing 3.0 (EHF) format via the Peppol network. A formal B2B mandate has been proposed, targeting mandatory sending by 2028 and mandatory receiving by 2030, but it is not yet law. Any entity with a Norwegian organization number from the Brønnøysund Register Centre (shown with an "MVA" suffix when VAT-registered). Participants are registered in ELMA, Norway's national Peppol registry, through a certified Access Point such as Invopop. Public sector bodies must be able to receive Peppol BIS (EHF) invoices. For businesses, receiving via Peppol remains voluntary until the proposed 2030 mandate. Invoices and other accounting documentation must be archived for 5 years under the Bokføringsloven (Bookkeeping Act). **Peppol** Mandatory dates vary by country. Belgium requires structured B2B e-invoicing — Peppol BIS by default — from January 2026. Germany is phasing in B2B e-invoicing between 2025 and 2028. France's Factur-X via Peppol applies once the PA reform takes effect. Outside mandates, Peppol delivery is voluntary but increasingly expected for B2G and cross-border trade. Yes. Every document exchanged on Peppol BIS uses a UBL or CII syntax that conforms to the EN16931 European e-invoicing standard, plus the relevant Peppol BIS specification. Invopop generates compliant XML automatically when you use the Peppol app. Peppol is a federated network — anyone could otherwise register a Participant ID for a company they don't represent. Proof of ownership ties the Participant ID to a verifiable contact at the company, which is what allows the registration to be published on the SML. Requirements vary by Authority. In Belgium, for example, the supplier must provide a recent extract from the Banque-Carrefour des Entreprises (KBO/BCE) plus a signed mandate. Invopop walks the registering party through the local requirements during the registration wizard. Yes — a Peppol BIS document delivered through a certified Access Point is treated as the legal e-invoice in any country that recognises Peppol. The signed UBL or CII XML is the authoritative record; archive it alongside any human-readable rendering you generate. Retention is set by each country's tax authority — typically 7 to 10 years in the EU. Invopop preserves the original XML and any generated PDF in the silo entry so you can satisfy local archival requirements wherever you operate. ### Invoicing questions **Norway** Install the Peppol app, register your supplier with their Norwegian organization number (scheme `0192`), and use a workflow that generates a Peppol BIS Billing 3.0 document and sends it via the Lookup → Send actions. No. Norway has no clearance or e-reporting requirement for invoices — they travel directly to the customer over the Peppol network. Skatteetaten only requests accounting data on demand via SAF-T during audits. See the [Norway tax regime in GOBL](https://docs.gobl.org/regimes/no) for tax IDs and category codes. The Peppol BIS Billing 3.0 mapping is shared across the network and comes from the [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) addon. Both schemes identify a company by its Norwegian organization number: * **`0192` (organization number)** — This is the **preferred and default** scheme for Norway. It corresponds to the company's 9-digit organization number in the Enhetsregisteret (Central Coordinating Register) at the Brønnøysund Register Centre. * **`9908` (NO:ORGNR)** — This is the legacy scheme for the same organization number, deprecated in favor of `0192`. Some older ELMA registrations may still use it. **When you should use `0192`:** Always use `0192` as your first choice when sending invoices to Norwegian companies. This is the standard identifier and what the vast majority of Norwegian businesses are registered under. **When `9908` may be needed:** If you get a "receiver not found" error when sending to a Norwegian company using `0192`, and you have confirmed the company exists in the [Peppol Directory](https://directory.peppol.eu), check whether they are still registered under the legacy `9908` scheme. To specify the scheme when sending, include the customer's Peppol inbox in your GOBL document: ```json theme={"system"} "customer": { "name": "Example Company", "tax_id": { "country": "NO", "code": "987654321MVA" }, "inboxes": [ { "key": "peppol", "scheme": "0192", "code": "987654321" } ] } ``` In both schemes the code is the bare 9-digit organization number, without the `NO` prefix or `MVA` suffix used in VAT numbers. Use the **Lookup Participant ID** workflow step to verify a recipient's Peppol registration before sending. If a lookup with `0192` fails, try again with `9908`. Limited liability companies (AS), public limited companies (ASA) and branches of foreign companies must show the word "Foretaksregisteret" on their sales documents — see the [invoice content requirements](/compliance/norway). Add it as a tax-scoped identity on the supplier: ```json theme={"system"} "supplier": { "name": "Fjordlys AS", "tax_id": { "country": "NO", "code": "123456785MVA" }, "identities": [ { "type": "TAX", "code": "Foretaksregisteret", "scope": "tax" } ] } ``` The identity becomes a second `PartyTaxScheme` on the supplier, under scheme `TAX`, which is where the Peppol rule NO-R-002 looks for it. Sole traders (enkeltpersonforetak) aren't covered by the requirement and should leave the identity out. NO-R-002 is a warning rather than a fatal rule, so an invoice without it still reaches the recipient and no workflow step will report the omission. Norway has four positive VAT rates. All of them are category `S` in Peppol — the percentage carries the distinction, not the category code. | Rate | Percentage | Applies to | | ------------------ | ---------- | ----------------------------------------------------------------------------------------- | | Standard | 25% | Most goods and services | | Reduced (food) | 15% | Foodstuffs, water and wastewater services | | Reduced (services) | 12% | Passenger transport, accommodation, cinema, museums, sporting events, public broadcasting | | Special (marine) | 11.11% | Wild marine resources sold through a fiskesalgslag | Set the percentage on the line tax and tag it with the [`untdid-tax-category`](https://docs.gobl.org/addons/eu-en16931-v2017) extension: ```json theme={"system"} "taxes": [ { "cat": "VAT", "percent": "25.0%", "ext": { "untdid-tax-category": "S" } } ] ``` Supplies that carry no VAT use a different category and omit the percentage: | Category | Meaning | | -------- | ---------------------------------------------------------------------- | | `Z` | Zero rated goods — exports, international transport, newspapers, books | | `E` | Exempt from tax | | `K` | VAT exempt for EEA intra-community supply of goods and services | | `AE` | VAT reverse charge | | `G` | Free export item, tax not charged | See the [Norway compliance page](/compliance/norway) for what each rate covers and the registration threshold. **Peppol** In countries where Peppol is the standard but not mandatory, you may still need to issue an e-invoice when the recipient isn't on the network. Both parties can agree on an alternative transfer method, but the invoice must still be EN16931 compliant. Recommended approach: * Set up a separate workflow that generates the XML without the send-Peppol-document step * Or reuse your existing workflow without the customer Peppol ID — the send step is automatically skipped * Fetch the generated XML and deliver it through the agreed channel, typically email B2C invoices typically lack the structured customer information required for Peppol delivery, and most consumers don't have inboxes. Use a conditional workflow: 1. Add an **If/Else** step that checks for a customer inbox using `count(customer.inboxes, true) > 0`. 2. On the `false` branch, generate a PDF and email it to the customer, then stop the flow. This routes B2B invoices through Peppol while keeping a smooth path for consumers. If a job fails with `KO` and `receiver not found in the peppol network`, treat it like an invalid email address — the recipient simply isn't reachable on Peppol. Add the **Lookup Participant ID** step (ideally in a separate validation workflow run against customer data) so you catch missing IDs before generating the invoice. No. The regime is automatically derived from the supplier's settings, which is the recommended approach for Peppol — leave it unset on the document. See the [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) addon for the field and validation rules Peppol BIS Billing 3.0 builds on, and the [Peppol app reference](/apps/peppol) for supported document types and Participant ID schemes. ### Supplier questions **Norway** Run the Register Participant workflow with the supplier's organization number (scheme `0192`). Invopop registers the participant in ELMA, Norway's national Peppol registry, so we become the supplier's Access Point for sending and receiving. ELMA allows only one receiving Access Point per participant. If the company is already registered — common in Norway given the long-standing B2G mandate — the existing registration must be released or migrated to Invopop before we can receive documents on their behalf. Sending invoices does not require this migration. **Peppol** Upload the company as a party (Console → Parties → Suppliers → + New Supplier, or via the Create an Entry API) with name, tax\_id, address, and email. Then run it through the party registration workflow — the contact will receive a registration wizard link to provide proof of ownership. Once approved, the party is registered on the Peppol network (SMP+SML+Peppol visibility by default with the `ubl-invoice` doc group) and ready to receive invoices. A supplier with that Participant ID already exists in your workspace. Either reuse the existing party or, if it really is a new entity, check whether it should be registered under an alternative scheme (for example Belgium's `9925` VAT scheme rather than the default `0208`). Register them through different silo entries, even though they represent the same legal party. The supplier must upload proof of ownership for each inbox. Unique identifiers for entities on the Peppol network, made up of two parts: * **Scheme** — identifies the type of identifier (e.g. `9920` for Spanish VAT, `0208` for Belgian KBO/BCE) * **Code** — the actual identification number Participant IDs are usually based on VAT numbers or local business identifiers, and Invopop can derive them automatically from a Tax ID. Some countries support multiple schemes — Belgium, for example, defaults to `0208` but some entities are only registered under `9925` (VAT). If you hit a "receiver not found" error, the recipient may be registered under an alternative scheme. Peppol Party visibility determines what you can send and receive: * `smp` — SMP only, for testing * `smp+sml` — SMP and SML, useful when you only want to send * `smp+sml+peppol` — SMP, SML, and the Peppol Directory, recommended for both sending and receiving (and for being discoverable in the Directory) In general, use the highest visibility available. ### Receiving questions **Peppol** Register the recipient as a Peppol participant with Invopop as their Access Point. Incoming documents are routed through your configured Import workflow, which converts the UBL or CII payload to GOBL and stores the entry in the Expenses folder. Yes. Either format can be removed based on your needs. The default template includes both for comprehensiveness, but if you're certain you'll only receive invoices in one syntax, dropping the other simplifies the workflow and reduces the apps you need to activate. The Import workflow's UBL and CII parser steps map the inbound XML into a GOBL invoice. From there you can route it to webhooks, Google Drive, accounting integrations, or any other destination — the GOBL representation is the single source of truth for downstream processing. *** Ask and answer questions about Norway's regulation → # Perú FAQ Source: https://docs.invopop.com/faq/peru Frequently asked questions about invoicing compliance in Perú FAQ content for Perú is being prepared. For specific questions, please contact [support@invopop.com](mailto:support@invopop.com). *** Ask and answer questions about Perú's regulation → # Poland FAQ Source: https://docs.invopop.com/faq/poland Frequently asked questions about invoicing compliance in Poland ### Compliance questions 1 February 2026 for taxpayers with turnover above PLN 200M, 1 April 2026 for all other businesses, and 1 January 2027 for micro entrepreneurs. B2C is optional. Foreign-only businesses without a fixed Polish establishment are out of scope. Any entity with a Polish NIP and active KSeF access. Large taxpayers (turnover > PLN 200M) must be onboarded by 1 February 2026, all other businesses by 1 April 2026, and micro entrepreneurs by 1 January 2027. Foreign-only entities without a Polish fixed establishment cannot use KSeF. Once KSeF is mandatory, all B2B invoices must be received through KSeF — paper or PDF rejection is no longer permitted between Polish parties. Archival is automatic in KSeF for 10 years; recipients can pull copies at any time. JPK\_V7M (monthly) or JPK\_V7K (quarterly) consolidated VAT and SAF-T file. Once KSeF is mandatory, JPK\_V7 is expected to draw directly from KSeF data, eliminating manual reconciliation. Currently supported invoice types: * **Standard Invoices (VAT)**: Regular B2B invoices with FA(3) schema * **Credit Notes (KOR)**: Invoice corrections and adjustments All invoices must include the `pl-favat-v3` addon in GOBL to ensure FA(3) schema compliance. Additional invoice types can be supported based on customer requirements. Contact [support](mailto:support@invopop.com) if you need specific invoice types. No. B2C invoices in KSeF are optional. The mandatory requirement applies only to B2B transactions. The KSeF certificate must belong to the company account directly or to a user with both InvoiceRead and InvoiceWrite permissions in KSeF. Suppliers must declare KSeF as their issuer in the Ministry of Finance taxpayer's portal before going live. Once KSeF is mandatory, all Polish B2B recipients must accept KSeF-issued invoices. KSeF itself archives for 10 years; recipients have no separate archival duty for the structured XML. ### Invoicing questions International (cross-border) invoices are handled just like domestic invoices in KSeF: * The invoice is created in GOBL with the foreign recipient's details * It's converted to FA(3) XML format and submitted to KSeF * KSeF validates and clears the invoice, assigning a unique KSeF ID * The invoice is registered in the KSeF system However, since foreign recipients cannot access KSeF, you must deliver the invoice through other channels (email, EDI, etc.). Include the KSeF QR code in the delivery for verification purposes. **Test mode** (sandbox only): Uses self-signed certificates generated automatically by Invopop. Perfect for quick testing without accessing the KSeF portal. Invoices are not sent to real KSeF servers. **Demo mode** (sandbox only): Connects to the official [KSeF Demo Portal](https://ap-demo.ksef.mf.gov.pl/web/). Requires manual certificate generation, simulating the full production flow in a safe test environment. **Production mode** (live workspace): Connects to the live [KSeF Portal](https://ap.ksef.mf.gov.pl/). Requires valid company credentials and certificates. All invoices are submitted to the official KSeF system. Use test mode for initial integration testing, then switch to demo mode when you're ready to simulate the real certificate flow before going live. Official KSeF applications: * [KSeF Taxpayer Application](https://ksef.podatki.gov.pl/aplikacja-podatnika-ksef-i-inne-narzedzia/bezplatne-narzedzie-wersja-produkcyjna/) – the main portal with all functionalities * [KSeF Mobile Application](https://ksef.podatki.gov.pl/aplikacja-podatnika-ksef-i-inne-narzedzia/aplikacja-mobilna-ksef/) – a mobile app for on-the-go access * [e-mikrofirma](https://login.mf.gov.pl/Account/Select?ReturnUrl=%2Fconnect%2Fauthorize%2Fcallback%3Fclient_id%3D09e2877e-702a-4e27-8818-9472ca964c0a%26redirect_uri%3Dhttps%253A%252F%252Furzadskarbowy.gov.pl%26response_type%3Dcode%26scope%3Dprofile%2520openid%2520DataHub.UserAccess%2520eFormsClientApi.UserAccess%2520ChatApi.UserAccess%2520offline_access%26state%3D8f196c7682654d0da49b42bfc9045e51%26code_challenge%3DSIwxyxXJpAzUgzrMW96UIH9vNc6P0-dkdc7l482AWQA%26code_challenge_method%3DS256) – a simplified portal aimed at micro-entrepreneurs For testing: * [KSeF Demo Portal](https://ap-demo.ksef.mf.gov.pl/web/) – demo environment for testing Install the KSeF Poland app, register your supplier (Test, Demo, or Production environment), and run invoices through the Send Invoice workflow. Each environment requires its own NIP and certificate setup. This error means the uploaded KSeF certificate does not have the required permissions to issue invoices. This typically happens when the certificate was uploaded by someone who is not the company administrator and only has limited permissions granted by the main company account. The KSeF certificate uploaded to Invopop must belong to either: * The **company account** directly logged into KSeF, or * An entity that has both **InvoiceRead** and **InvoiceWrite** permissions (managed within KSeF) To resolve this, you have two options: 1. **Grant permissions in KSeF**: The company admin (or whoever has direct access to the KSeF company account) grants `InvoiceRead` and `InvoiceWrite` permissions to the user who uploaded the certificate to Invopop. This can be done from the [KSeF application portal](https://ap.ksef.mf.gov.pl/) and requires no further action in Invopop (no need to unregister/register). 2. **Re-register with a new certificate**: Unregister the supplier in Invopop and register it again using a certificate generated from the main KSeF company account (or another account with the required permissions). See the [Poland tax regime in GOBL](https://docs.gobl.org/regimes/pl) for tax categories and NIP rules. The [`pl-favat-v3`](https://docs.gobl.org/addons/pl-favat-v3) addon documents the FA(3) schema fields required for KSeF. Polish invoicing law requires a unit of measure for every line, and KSeF maps it to the `P_8A` field on each `FaWiersz`. Invopop supports two ways to populate it: 1. **Canonical unit code on `Item.Unit`** — preferred when the unit exists in the GOBL unit catalogue or as a UN/ECE Recommendation 20 code. For example, `Item.Unit: "H87"` (piece) or `Item.Unit: "KGM"` (kilogram). The gobl.ksef converter emits the UN/ECE code directly into `P_8A`. 2. **Free-form label on `Item.Meta["unit-label"]`** — use this for Polish abbreviations that do not match a canonical code, such as `"szt."` (sztuka — piece), `"usł."` (usługa — service), `"kpl."` (komplet — set) or `"opak."` (opakowanie — package). The value is passed through to `P_8A` unchanged, so the supplier's exact wording is preserved on the KSeF XML. Example line item using a free-form label: ```json theme={"system"} { "item": { "name": "Konsultacja prawna", "price": "200.00", "meta": { "unit-label": "usł." } }, "quantity": "1" } ``` When an inbound KSeF invoice contains a `P_8A` value that is not a recognised GOBL or UN/ECE code, gobl.ksef preserves the original string under `Item.Meta["unit-label"]` so round-trips do not lose the supplier's wording. `Item.Unit` is only populated when the value validates as a canonical code. ### Registering supplier questions Common reasons for registration failures: * **Certificate and private key mismatch**: Ensure you uploaded both files from the same certificate generation * **Incorrect password**: Verify the password matches what you set during certificate generation * **Future start date**: Certificate start date must be today or in the past * **Wrong portal environment**: Demo certificates won't work with production, and vice versa * **File encoding issues**: For API uploads, ensure files are properly base64-encoded * **Expired certificate**: Check that the certificate is still valid * **Invalid NIP**: Verify the Polish Tax ID is correct and has access to KSeF Check the workflow error logs in the Invopop Console for detailed error messages that can help diagnose the specific issue. **For sandbox testing**: * **Test mode**: Generate fake NIPs at [http://generatory.it/](http://generatory.it/). These work immediately with self-signed certificates. * **Demo mode**: You need a real NIP with access to the KSeF Demo Portal. Choose an environment (Test, Demo, or Production). Generate a KSeF certificate from the relevant portal (or use a self-signed cert in Test mode), upload it to Invopop with the matching password, and register the supplier through the KSeF Register Supplier workflow. A KSeF certificate exported as PKCS#12 (.p12) with password, generated through the KSeF Application Portal (or auto-generated by Invopop in Test mode). The certificate must have InvoiceRead + InvoiceWrite permissions. The KSeF certificate (PKCS#12 .p12 with password) is stored encrypted at rest. Invopop uses it to authenticate session creation with KSeF on the supplier's behalf; the password is never returned in API responses. ### Receiving questions Invopop automatically imports received invoices through a polling service: 1. **Configure polling interval** during party registration (hourly, daily, weekly, or monthly) 2. **Set up the sync workflow** to query KSeF for new invoices 3. **Configure the import workflow** to convert FA(3) XML to GOBL format 4. **Link the workflows** in the Poland app configuration The system automatically checks KSeF at your chosen interval and imports any new invoices to your configured folder. **For manual import**, use the API to trigger import jobs with specific KSeF numbers or date ranges. See the [Import Received Invoices](/guides/pl-ksef#import-received-invoices) section in the guide. Yes. You can manually trigger a sync workflow to import invoices from a specific date range using the [Create a Job endpoint](/api-ref/transform/jobs/create-a-job-post). Pass the `from` and `upto` date parameters to sync all invoices received within that period: ```json theme={"system"} { "workflow_id": "YOUR_SYNC_WORKFLOW_ID", "entry_id": "YOUR_PARTY_ENTRY_ID", "args": { "from": "2026-01-01T00:00:00Z", "upto": "2026-01-31T23:59:59Z" } } ``` This is useful for backfilling invoices after a polling outage or importing historical data before enabling automatic polling. Check these indicators: 1. **Polling configuration**: Verify the polling interval is set in your party registration workflow configuration 2. **App configuration**: Confirm the Poland app has your sync workflow configured 3. **Recent imports**: Check the "Invoices · Expenses" folder for newly imported invoices 4. **Job logs**: Review job logs in the Console for sync and import workflow executions 5. **Error notifications**: Set up email or Slack notifications in your workflow error handling to alert you of failures Test the import by manually triggering the sync workflow with a date range that includes known received invoices. FA(3) XML conforming to the Ministry of Finance schema. Each invoice carries a unique KSeF reference (numer KSeF) plus the issuer's signature and a QR code linking to the public verification page. Inbound FA(3) XMLs are parsed via [`gobl.ksef`](https://github.com/invopop/gobl.ksef). Tax rates, line items, and parties map onto GOBL fields; the original signed XML is preserved as a silo entry attachment. *** Ask and answer questions about Poland's regulation → # Portugal FAQ Source: https://docs.invopop.com/faq/portugal Frequently asked questions about invoicing compliance in Portugal ### Compliance questions All invoices issued in Portugal must include a unique sequential number, a series identifier, an ATCUD code (Article 35-A CIVA), and a QR code (Portaria 195/2020). Software must be certified by the Autoridade Tributária — Invopop is certified. Any entity with a Portuguese NIF — companies, sole traders, and freelancers. NIFs starting with 1, 2, or 3 are individuals (autónomos); NIFs starting with 5 are legal entities, which require additional registration metadata (share capital, commercial registry). Recipients must verify the QR/ATCUD on each invoice via AT's e-fatura portal and retain the document for 10 years (Article 123 CIVA). Auto-classification of received invoices into expense categories happens through e-fatura. Monthly or quarterly IVA periódica plus the annual IES (Informação Empresarial Simplificada). Invoice-level data is reported continuously through real-time submission or monthly SAF-T export — both feed AT's e-fatura system automatically. Supplier registration information includes the company's share capital, the commercial registry office, and optionally the NIF used during registration. Portuguese law requires this information to appear on all printed fiscal documents, including PDFs. **When is it mandatory?** Registration information is mandatory for companies and legal entities. However, self-employed individuals and freelancers (whose NIF starts with 1, 2, or 3) are exempt from this requirement, as they typically do not have formal registration details. **What about the "other" field?** The `other` field is optional and can be used to specify the NIF of the company when it was registered if different from the current one. The supplier must use certified billing software, register their issuance series with AT, and choose a reporting model (monthly SAF-T or real-time). Self-employed taxpayers (NIF starting 1/2/3) are exempt from supplier registration metadata; companies must declare share capital and commercial registry. Either real-time per-invoice transmission or monthly SAF-T export by the 5th of the following month. Both satisfy the reporting obligation under Portaria 195/2020 — the choice is operational. ### Invoicing questions In Portugal, fiscally relevant documents issued through invoicing software must be reported to the Tax Authority (AT). There are two possible reporting models: 1. **SAF-T monthly export** – a single XML file including all documents for the month. This file is generated by the invoicing software and then uploaded manually to the AT portal, as there is no API available for submitting it automatically. 2. **Real-time transmission** – instead of a monthly file, each invoice is sent individually to the AT at the time of issuance, using the authority's API. Whether one model or the other is used usually depends on the issuer's accountant's preference (who typically uploads the SAF-T monthly report should they choose that model). Invopop's [AT Portugal app](/apps/at-portugal) supports both reporting methods, so each supplier can pick the one that best fits their needs. If a supplier uses real-time transmission — the **Send document to AT** step in the workflow — the documents submitted this way are already communicated to the AT, so they don't need to upload a monthly SAF-T file for them. The only documents that still require the monthly SAF-T upload are those not reported in real time, such as RG payment receipts, which the AT's webservice does not accept. Install the AT Portugal app, register the supplier with their NIF, and pick a reporting model (monthly SAF-T or real-time submission). Run invoices through the AT Issue Invoice workflow — Invopop generates the ATCUD, QR, and signature automatically. When issuing in Portugal you may see an error similar to: > `recording envelope: totals: (payable: too high according to Artigo 40.º do CIVA.)` **What it means:** Article 40 of the Portuguese VAT Code (*Código do IVA*) sets limits and rules for **simplified invoices** (*faturas simplificadas*). If the payable amount exceeds what is allowed for a simplified invoice in your situation, the rules effectively require a **full invoice** (*fatura completa*) with proper buyer identification—not an anonymous or minimal customer. **What to do:** * Treat the document as a **full invoice** and supply **real customer tax data** when you have it. * If you **do not** have the buyer's tax information, Portuguese practice allows the generic retail customer: set the customer **name** to `Consumidor final` and the **tax ID** to `999999990`. * For transactions **above €1,000**, the law also expects **name and address** on the document. The AT may not always reject submissions that omit some of that detail, but you should follow the rule for full compliance. Adjust your GOBL customer block (or equivalent) accordingly and re-run the workflow. **What it means:** when a credit note references an invoice issued through Invopop, every credit note line must be matched against the quantity and price still available to credit on the original invoice's lines. Line `#N` could not be matched to any of them. For a credit note line to be applied to an invoice line: 1. Its `item.name` must be **exactly identical** to the invoice line's, and both lines must have the same VAT treatment — the same rate and, where applicable, the same exemption. 2. Among the lines matching by name and VAT, it must satisfy one of: * **Same unit price** as the invoice line, with a quantity up to the remaining quantity — to credit fewer units at the original price. * **Same quantity** as the invoice line, with a unit price up to the remaining price — to credit part of the amount for the full quantity. Include only the lines you are crediting — the credit note does not need to mirror the full invoice — and the order of the lines is irrelevant. Availability is cumulative: every accepted credit note reduces the remaining quantity or price, so the total credited per line can never exceed the original invoice amount. **What to do:** check that line `#N`'s item name and VAT rate or exemption exactly match a line on the referenced invoice (watch for typos or renamed items), and that it keeps either the original unit price or the original quantity as described above. If everything matches, review credit notes previously issued against the same invoice — the remaining quantity or amount may already have been credited. Note that a credit note supports exactly **one** `preceding` reference, and line matching only applies when the referenced invoice was issued through Invopop — references to external series (for example, invoices issued by a previous provider) are accepted without matching. This error means your workflow includes the **Send to the AT** step for a payment receipt. Payment receipts are not supported for real-time reporting — the AT does not accept them via the real-time webservice. **The fix:** remove the **Send to the AT** step from your payment workflow. RG receipts are only reportable through the monthly SAF-T file. The **Record for SAF-T reporting** step alone is all you need for full compliance. Portugal defines two payment receipt types: * **RG — Outros Recibos**: Standard payment receipts, reported through the monthly SAF-T file only. Real-time reporting is not available for this type. * **RC — Recibo no âmbito do regime de IVA de Caixa**: Receipts specific to the VAT Cash accounting regime. RC payments are not currently supported by the AT Portugal app. See the [Portugal tax regime in GOBL](https://docs.gobl.org/regimes/pt) for tax categories, NIF rules, and AT-specific extensions. The [`pt-saft-v1`](https://docs.gobl.org/addons/pt-saft-v1) addon documents fields required by the SAF-T schema. ### Registering supplier questions Run the AT Register Supplier workflow with the supplier's NIF and chosen reporting model. Invopop registers the issuance series with AT and generates the ATCUD prefix to be embedded in every issued document. For real-time submission, an AT API username/password is required (issued through the AT portal). For SAF-T monthly export, no live credentials are needed — only the supplier's NIF and series registration. For real-time submission, Invopop stores AT API credentials encrypted at rest. For SAF-T export model, no live credentials are needed — the supplier (or their accountant) downloads the SAF-T file and uploads it manually to AT's portal. ### Reporting questions Real-time model: per invoice. SAF-T model: once per month, by the 5th of the following month. The choice is set at supplier registration and can be changed by re-registering. For invoice-level reporting, choose the model at supplier registration: real-time (Invopop submits per invoice) or monthly SAF-T (Invopop generates the file by the 5th of the following month, accountant uploads). Periodic VAT and IES are filed separately by the accountant. Monthly SAF-T-PT XML uploaded to AT's portal (no API for this), or real-time WebService XML calls per invoice. Both follow the same SAF-T schema; real-time submits one document at a time, SAF-T submits an aggregated file covering the month. Ask and answer questions about Portugal's regulation → # Romania FAQ Source: https://docs.invopop.com/faq/romania Frequently asked questions about invoicing compliance in Romania FAQ content for Romania is being prepared. For specific questions, please contact [support@invopop.com](mailto:support@invopop.com). *** Ask and answer questions about Romania's regulation → # Saudi Arabia FAQ Source: https://docs.invopop.com/faq/saudi-arabia Frequently asked questions about invoicing compliance in Saudi Arabia ### Invoicing questions From the GOBL invoice type. **Simplified** invoices (B2C) are **reported** to ZATCA; all **standard** invoices (B2B and B2G) are **cleared**. **Before you share it with the buyer.** Standard invoices follow the clearance model: Invopop submits the invoice to ZATCA in real time, ZATCA validates it and applies its cryptographic stamp, and the **cleared** document is returned. Only that cleared version is legally valid and shareable — so the invoice must go through Invopop before you send it on to the buyer. **Within 24 hours of issuing it.** Simplified invoices follow the reporting model, so you can give the invoice to the customer straight away at the point of sale — it does **not** need ZATCA validation first, and you can share it before it ever reaches Invopop. You then have up to **24 hours from issuance** to submit it to Invopop, which forwards it to ZATCA immediately when the workflow runs. No. Invopop calculates the Invoice Counter Value (ICV) and Previous Invoice Hash (PIH) internally on every submission. You only see them reflected in the generated invoice XML. ZATCA requires every document a party issues to form a single, unbroken cryptographic chain. Invopop maintains one chain **per party and environment** (sandbox simulation/developer vs. production are separate sequences), so each registered CSID has its own continuous counter. Two values link it together: * **ICV** starts at `1` for the first document and increments by exactly `1` for every document that follows. * **PIH** of the first document is the hash of the value `0` — the base case defined in ZATCA's data dictionary. Every document after that sets its PIH to the hash of the **immediately preceding document**. Each new document takes the hash of the immediately preceding document and increments ICV by 1, **irrespective of type and status**: * **Document type does not split the chain.** Standard invoices, simplified invoices, credit notes, and debit notes all share one sequence. * **Rejected documents still occupy their slot.** A document that ZATCA rejects keeps its ICV and hash; the next document chains off it, not off the last *accepted* one. For example, if invoice 2 is rejected, invoice 3 still uses `hash(invoice 2)` as its PIH and `ICV = 3`: | Document | ICV | PIH points to | ZATCA result | | ------------- | --- | ----------------------- | ------------ | | Invoice 1 | 1 | hash of `0` (base case) | Accepted | | Invoice 2 | 2 | hash(Invoice 1) | Rejected | | Invoice 3 | 3 | hash(Invoice 2) | Accepted | | Credit note 4 | 4 | hash(Invoice 3) | Accepted | In the **Files** section of the silo entry. After a successful submission the final XML is attached as `invoice.xml` — for standard invoices this is the ZATCA-cleared, stamped document. The QR code is also stamped onto the document. ### Registering supplier questions A workspace with the **Saudi Arabia** app enabled, and an `org/party` (the supplier) carrying: * a Saudi **VAT registration number**, * an **identity** of type `CRN`, `MOM`, `MLS`, `700`, `SAG`, or `OTH`, and * a complete **national address** (building number, postal code, district, street, additional street, and country). During the hosted onboarding wizard the supplier also provides the legal name, invoice type (`1000` standard / `0100` simplified / `1100` both), branch name, registered address, and business category — plus the FATOORA OTP. **1 hour** from when it is generated in the FATOORA portal. If it expires, generate a new one and re-enter it in the wizard. In **Developer** mode the OTP is not validated (any placeholder works) and you can only send invoices from ZATCA's fixed test VAT `399999999900003`. In **Simulation** mode the OTP must be real and you can send from any registered party. No. Simulation requires a real FATOORA account and taxpayer to generate a valid OTP. Use **Developer** mode if you want to test the flow without a real account. *** Ask and answer questions about Saudi Arabia's regulation → # Singapore FAQ Source: https://docs.invopop.com/faq/singapore Frequently asked questions about invoicing compliance in Singapore The standard Peppol network uses a four-corner model: the supplier (corner 1) sends an invoice through their Access Point (corner 2) to the buyer's Access Point (corner 3), which delivers it to the buyer (corner 4). Each party connects to the network through an accredited Access Point provider rather than exchanging documents directly. Singapore's GST InvoiceNow Requirement extends this to a **five-corner model** by adding IRAS (Inland Revenue Authority of Singapore) as the fifth corner. In this arrangement, the supplier's Access Point transmits a copy of every covered invoice to IRAS in near real time, alongside the normal delivery to the buyer. This gives the tax authority continuous visibility into transaction data without requiring businesses to file separate invoice-level reports. ```mermaid actions={false} theme={"system"} %%{init: {'flowchart': {'defaultRenderer': 'elk'}}}%% flowchart TB IRAS["🏛 IRAS — Tax Authority
(Corner 5)"] Supplier("👨🏻‍💼 Supplier
(Corner 1)") Buyer("💁‍♂️ Buyer
(Corner 4)") AP_S["🌐 Supplier Access Point
(Corner 2)"] AP_B["🌐 Buyer Access Point
(Corner 3)"] Supplier --> AP_S AP_S -- "Invoice" --> AP_B AP_B --> Buyer AP_S -. "Copy to tax authority" .-> IRAS AP_B -. "Copy to tax authority" .-> IRAS classDef tax fill:#fff,stroke:#169958,color:#103830 classDef business fill:#fff,stroke:#169958,color:#103830 classDef ap fill:#fff,stroke:#169958,color:#103830 linkStyle default stroke:#999,font-size:13px,color:#red class IRAS tax class Supplier,Buyer business class AP_S,AP_B ap ``` The five-corner model is not unique to Singapore. Other Peppol jurisdictions, including Malaysia and Australia, are adopting or exploring similar approaches where the national tax authority receives invoice data as an additional corner of the network.
*** Ask and answer questions about Singapore's regulation → # Spain FAQ Source: https://docs.invopop.com/faq/spain Frequently asked questions about invoicing compliance in Spain ### Compliance questions **Spain** Crea y Crece (Ley 18/2022, "Law on the Creation and Growth of Companies") is a Spanish law introducing **mandatory B2B electronic invoicing** for all businesses and professionals established in Spain. Its primary policy goal is **combating late payments**. Spain has one of the longest average payment periods in the EU (\~80 days), and the law forces structured, traceable data on every B2B invoice, plus mandatory **invoice status reporting** (acceptance, rejection, payment date) so payment behavior becomes visible and measurable. Key parameters as they stand now: * **Scope**: domestic B2B transactions where the recipient is a business or professional established in Spain. * **Architecture**: hybrid — a free public AEAT platform plus interoperable private platforms. * **Format**: EN 16931-compliant UBL is mandatory for the public solution and for *copias fieles* submitted from private platforms; Facturae, UBL, CII and EDIFACT are accepted between private platforms. * **Timeline**: Royal Decree 238/2026 was published 31 March 2026; the Ministerial Order is expected to enter force 1 October 2026, triggering the clocks — **12 months later** for companies with turnover >€8M, **24 months later** for everyone else, with status reporting deferred a further year for sole traders / IRPF attribution entities. This regulation aims to transform invoicing from "PDF by email" into a structured, reportable, interoperable network. Any entity with a Spanish NIF — companies, autónomos, and foreign entities with Spanish fiscal presence. Foreign-only entities issuing into Spain must operate through their local fiscal representation or a non-resident NIF. Quarterly or monthly VAT (Modelo 303), annual recap (Modelo 390), recapitulative intra-EU declaration (Modelo 349), and the annual third-party transactions return (Modelo 347). Crea y Crece (2027) adds invoice status reporting (acceptance, rejection, payment date) on top. **Facturae** Mandatory for B2G transactions with Spanish public administrations above €5,000 since 2015 (Ley 25/2013). Voluntary for B2B today; will become broadly mandatory once Crea y Crece's implementing decree takes effect (currently expected 2027). For B2G submissions, the supplier needs a valid digital certificate recognized by FACe (Cl\@ve, FNMT, etc.). For Invopop-generated XAdES signatures the certificate is Invopop's own; suppliers using their own signing flow upload theirs. Spanish public administrations must accept Facturae through FACe or a regional equivalent (e-FACT in Cataluña, FACeB2B for B2B). Private sector recipients have no Facturae-specific obligations beyond the standard 4-year archival. **No-VERI\*FACTU** "No-VERI\*FACTU" is the alternative compliance mode under the same Spanish billing-software regulation (Reglamento de Sistemas Informáticos de Facturación). Invoices are *not* sent to AEAT in real time; instead they are registered locally in the certified system and may be inspected on demand. Suitable for businesses that prefer to keep records private unless asked. Same fiscal residence requirements as VERI\*FACTU. Additionally, the supplier must be able to produce the chained register on AEAT request; Invopop retains it on their behalf for the legally required period. **SII** SII (*Suministro Inmediato de Información*) is mandatory for taxpayers that file VAT on a monthly basis. In practice this includes companies with annual turnover above €6,010,121.04, members of VAT groups (REGE), and businesses registered in the monthly VAT refund register (REDEME). Other taxpayers can opt in voluntarily. The supplier must be a Spanish-resident taxpayer subject to SII (turnover > €6M, REGE, or REDEME) or have voluntarily opted in. They must hold a digital certificate for AEAT or appoint Invopop as their representative via signed agreement. Issued and received invoices must be reported within 4 calendar days. Subsequent corrections, cancellations, and intra-EU operations have additional bookkeeping streams (Libro de Bienes de Inversión, Libro de Operaciones Intracomunitarias). **TicketBAI** No, you don't need to register with TicketBAI, or upload any digital certificates to Invopop. As a certified billing provider, Invopop will sign all invoices with our own digital certificate. TicketBAI allows three types of certificates; Invopop uses the *certificado sello de empresa* which allows us to sign e-invoices on behalf of our customers, saving you the burden of registering and uploading certificates yourself. * Bizkaia: by the end of each quarter, except for companies under SII (turnover above 6 million euros), which must report within 4 days. * Gipuzkoa and Álava: The submission must be done immediately after generating the invoice. The supplier must have fiscal residence in one of the three foral territories (Bizkaia, Gipuzkoa, Álava) and sign a representation agreement allowing Invopop to issue on their behalf. No supplier-side certificate required. **VERI\*FACTU** Following congress approval, the VERI\*FACTU mandate has been postponed by one year. The new dates are: * January 1, 2027 for companies * July 1, 2027 for self-employed individuals. VERI\*FACTU will be mandatory for companies from January 1st, 2027. The rest of taxpayers (mainly self-employed individuals) from 1 July 2027. Companies reporting with SII (large companies) or TicketBAI are exempt from reporting with VERI\*FACTU. VERI\*FACTU invoices don't necessarily need to be printed because they are issued with electronic invoicing systems such as Invopop. Source: [AEAT FAQ](https://sede.agenciatributaria.gob.es/Sede/iva/sistemas-informaticos-facturacion-verifactu/preguntas-frecuentes/posibilidad-remision-informacion-factura-parte-receptor.html?faqId=9e9e77fe52572910VgnVCM100000dc381e0aRCRD). Yes, VERI\*FACTU allows issue dates to be in the past, as long as they are after October 28, 2024. The issue date can't be set with a date in the future. The AEAT is not strict about the validation, but it's best to keep your intentions clear. [GOBL](https://docs.gobl.org) gives you alternative fields such as `op_date` and `value_date` to store details about your invoicing operation. Spanish fiscal law requires the customer to be identified with an ID document (preferably official). Set the `es-verifactu-identity-type` extension to `07` ("Not registered in census" / "No censado"), which maps to the `IDOtro` field in VERI\*FACTU. Here is an example of a customer identity block in [GOBL](https://docs.gobl.org): ```json theme={"system"} "customer": { "name": "Consumer", "identities": [ { "label": "NIE", "country": "ES", "code": "Z1111111S", "ext": { "es-verifactu-identity-type": "07" } } ] } ``` For the full list of identity type codes, see the [`es-verifactu-v1`](https://docs.gobl.org/addons/es-verifactu-v1) addon documentation. Suppliers must use a certified billing system (Invopop is one). Each supplier must sign a representation agreement allowing Invopop to issue invoices on their behalf — without a digital certificate from the supplier's side. ### Invoicing questions **Spain** You should send the credit note with the same sign as the original invoice. In Spain, unlike other countries, credit notes must be submitted to Hacienda with inverse values. Invopop handles this conversion automatically before transforming the credit note into a "factura rectificativa" (corrective invoice). This means you only need to send the credit note following international standards (with same sign as the invoice). Invopop will automatically adapt it when submitting to Hacienda. For reference, see the [GOBL Invoice](https://docs.gobl.org/draft-0/bill/invoice) documentation with `type` set to `credit-note`. See the [Spain tax regime in GOBL](https://docs.gobl.org/regimes/es) for tax categories, NIF rules, and Spanish-specific extensions. Subsystem-specific addons live alongside: [`es-verifactu-v1`](https://docs.gobl.org/addons/es-verifactu-v1), [`es-tbai-v1`](https://docs.gobl.org/addons/es-tbai-v1), [`es-facturae-v3`](https://docs.gobl.org/addons/es-facturae-v3). **Facturae** Invopop is working on direct FACe connection as part of the 2027 Crea y Crece mandate You submit the XML directly to the [FACe portal](https://face.gob.es/), Invopop does not submit it for you. FACe is the centralised entry point for all Spanish public administrations, and submission is the supplier's responsibility. You'll need: * A valid digital certificate (FNMT or DNIe). * The XML file Invopop generated (download it from the workflow output). * The three DIR3 administrative centres correctly embedded in the invoice — `Oficina Contable` (01), `Órgano Gestor` (02), `Unidad Tramitadora` (03). If these are wrong, FACe will reject the invoice. The receiving public body publishes their codes in the [DIR3 directory](https://directorio3.gob.es/). Submission options: * **FACe web portal**: manual upload, fine for low volumes. * **A registered FACe-compatible third party** (gestoría, ERP plugin, etc.). The generated XML will be added to your silo entry as an attachment under the "files" tab with the file name `facturae.xml`. Upload this file to [FACe's online validator](https://face.gob.es/es/facturas/validar-visualizar-facturas) to verify its validity. No — the Facturae app only converts GOBL to Facturae XML. Submit B2G invoices via [FACe](https://face.gob.es/es); tax reporting to the AEAT happens separately (e.g. through SII or VERI\*FACTU). **No-VERI\*FACTU** The same GOBL invoice produces either, controlled by the workflow. The QR payload and the absence of `verifactu-qr` stamps in the silo entry distinguish No-VERI\*FACTU output. AEAT submission stamps are absent in No-VERI\*FACTU mode. **SII** Issued invoices must be reported within 4 calendar days from the date of issuance — and always before the 16th day of the month following the one in which the VAT liability arises. Saturdays, Sundays, and national holidays are excluded from the count. Received invoices follow the same 4-day rule but starting from the date the invoice is recorded in the books. SII corrections are submitted as modification records (`A1`) referencing the original entry, rather than by deleting and re-sending. In practice, after fixing the underlying [GOBL](https://docs.gobl.org) document, run the SII workflow again — Invopop detects that a previous submission exists for the same invoice and emits the modification record automatically. **TicketBAI** Build a GOBL invoice with the `es-tbai-v1` addon, send it through the TicketBAI Issue Invoice workflow. Invopop signs with its *sello de empresa* certificate, generates the chained XML, and submits to the relevant Diputación Foral (Bizkaia, Gipuzkoa, or Álava). This is expected. QR codes generated in the TicketBAI sandbox environment are intentionally non-functional to prevent sandbox invoices from being mistaken for real ones. To verify that a sandbox QR code is correct, upload the PDF or a QR image to the foral tax authority's test verification page: [pruebatuz.bizkaia.eus](https://pruebatuz.bizkaia.eus/B4PEQR0C/testQr.xhtml?idioma=es). **VERI\*FACTU** In VERI\*FACTU, you should only cancel an invoice if it hasn't been handed to the customer nor accepted by the tax authority. Different from a credit note or a corrective, canceling an invoice doesn't produce a second document, which means you don't have a paper to hand to your customer to show the cancellation. That's why, if the invoice has been handed to the customer, we recommend issuing a credit note instead. The response from VERI\*FACTU should contain all the details you need to be able to decide what changes need to be made to the [GOBL](https://docs.gobl.org) document in order to be processed correctly. Make the changes either via the Invopop API or console directly on the same document, and simply resend to the VERI\*FACTU workflow. Invopop will ensure that the correct substitution document is generated by checking previous attempts and including the correct codes in the new request. We do not provide the QR code image itself. The QR code is a visual representation of a URL that you need to generate on your own if you're creating custom PDFs or need it for any other purpose. The full requirements are in the AEAT [VERI\*FACTU QR specification](https://www.agenciatributaria.es/static_files/AEAT_Desarrolladores/EEDD/IVA/VERI-FACTU/DetalleEspecificacTecnCodigoQRfactura.pdf) PDF document in Spanish. Here you can read that: > The "QR" code must have a size between 30x30 and 40x40 millimeters and follow the specifications of the ISO/IEC 18004:2015 standard. For the generation of the "QR" code, the M (medium) error correction level shall be used. Generate your own QR code image as follows: * **API**: fetch the entry and get `data -> head -> stamps -> verifactu-qr`. * **Console**: in the invoice entry click on the kebab `···` menu and select **View Headers**. Use the VERI\*FACTU URL in a library capable of generating ISO/IEC 18004:2015 QR images (Invopop uses [go-qr](https://github.com/piglig/go-qr)) Store or embed the image in your PDF. You can [see how we generate QR images](https://github.com/invopop/gobl.html/blob/main/components/images/images.go) in our open source gobl.html library. VERI\*FACTU requires every request to be linked with a fingerprint or hash. During the "Generate VERI\*FACTU" and "Cancel VERI\*FACTU" actions, Invopop will automatically find the last request made for the same supplier, and incorporate the chained data into the new request. It's important to understand that VERI\*FACTU focuses on requests, and not individual documents; a single invoice may have multiple entries in the chain if it has been processed multiple times due to incorrect details, cancellations, or substitutions. Invopop guarantees the chain is never broken using database transactions and retries in the case of collisions. The most common errors are related to format issues or invalid extensions, which are already handled in Invopop through the [`es-verifactu-v1`](https://docs.gobl.org/addons/es-verifactu-v1) addon validations. These prevent most of the typical problems before they reach the submission stage. Among the errors that aren't yet validated on our side, the five most frequent ones are: * `4104: Error en la cabecera: el valor del campo NIF del bloque ObligadoEmision no está identificado.` → The issuer's name must match what's registered for that NIF (tax ID). * `4102: El XML no cumple el esquema. Falta informar campo obligatorio.` → Usually occurs when a required field is missing in the XML, often within the Desglose (taxes) section. * `1110: El NIF no está identificado en el censo de la AEAT.` → The provided NIF (tax ID) isn't found in the AEAT registry (often due to typos or testing data). * `3000: Registro de facturación duplicado.` → Triggered when issuing the same invoice series/code twice. * `2001: El NIF del bloque Destinatarios no está identificado en el censo de la AEAT.` → Similar to 1110, but applies to the NIF (tax ID) of the customer. You can set your own description using the notes object in the invoice. The key used for the description needs to be set to general. For example: ``` "notes": [ { "key": "general", "text": "This will appear as DescripcionOperacion" } ] ``` We generate a default description if the note is not provided which is what you are currently seeing. This default description will neatly cut off before it reaches a length of 500 characters as that is the limit the AEAT imposes. | Key | Text | | ------------------- | ------------------------------------------------------------ | | `reverse-charge` | Reverse Charge / Inversión del sujeto pasivo. | | `simplified-scheme` | Factura expedida por contribuyente en régimen simplificado. | | `self-billed` | Facturación por el destinatario. | | `travel-agency` | Régimen especial de las agencias de viajes. | | `second-hand-goods` | Régimen especial de los bienes usados. | | `art` | Régimen especial de los objetos de arte. | | `antiques` | Régimen especial de las antigüedades y objetos de colección. | | `cash-basis` | Régimen especial del criterio de caja. | ### Registering supplier questions **Spain** We reject agreements when: * The uploaded document is not signed (they upload the unsigned template). * Users upload a handwritten signature without an ID. * The electronic signature is made with an FNMT certificate. * The agreement is missing a date or location. * The name is entered as an email address. The job will state the reason for rejection. A KO will be triggered and the supplier will be labelled with the `Error` state. We currently recommend sending a reminder to the supplier through a webhook. The registration link will not expire and the entity will still be able to upload their registration documents which will be validated. Should you choose to run this workflow again using this supplier, the supplier will be accepted or rejected immediately because the required documentation has already been provided and validated. If the uploaded agreement documents were rejected, a KO will be triggered and the supplier will be labelled with the `Error` state. We currently recommend sending a notification to the supplier through a webhook within the **Error Handling** section. Afterwards, if you wish to re-register the supplier with new documents, you must: 1. Unregister the supplier using the **Unregister Supplier workflow**. 2. Re-run the Register supplier workflow. This will restart the entire registration process. When uploading documents, the previously submitted agreement will appear selected by default. Simply choose a new file and click `Continue` to override the old one. See the image below for reference: Overriding the previously submitted agreement In order to complete the representation agreement you will need to provide the following information: **Company** 1. Name 2. NIF 3. Address **Legal representative** 1. Full name 2. Government ID type and number 3. Address ```json Spain supplier example theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "Invopop S.L.", "tax_id": { "country": "ES", "code": "B85905495" }, "people": [ { "name": { "given": "Juan", "surname": "Pérez González" }, "identities": [ { "key": "national", "code": "123456789A" } ], "addresses": [ { "num": "10", "street": "Calle Ejemplo", "locality": "Madrid", "region": "Madrid", "code": "28020", "country": "ES" } ] } ], "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "billing@example.com" } ] } ``` If the entity is a self-employed individual (*autónomo*), only the information requested in the **Legal representative** section is required. ```json Spain autónomo supplier example theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "Juan Pérez González", "tax_id": { "country": "ES", "code": "B85905495" }, "addresses": [ { "num": "42", "street": "Calle Pradillo", "locality": "Madrid", "region": "Madrid", "code": "28002", "country": "ES" } ], "emails": [ { "addr": "autonomo@example.com" } ] } ``` The supplier can add their electronic signature to the PDF document ([instructions](https://helpx.adobe.com/acrobat/using/signing-pdfs.html)), or sign with a handwritten signature (we recommend using [Adobe's online service](https://www.adobe.com/acrobat/online/sign-pdf.html)). Individual documents are limited to a maximum size of 10MB. Uploads exceeding this size will result in an error. **Facturae** Facturae itself has no central registration — the supplier just needs to enrol on FACe (or the relevant regional portal) using their digital certificate. Invopop signs the XML; submission to FACe is currently manual via the supplier's account. Facturae requires an XAdES signature on the XML using a qualified certificate (FNMT *persona jurídica*, Cl\@ve, ACCV, etc.). Invopop signs with its own certificate by default; bring-your-own is supported on request. **No-VERI\*FACTU** Run the No-VERI\*FACTU Register Supplier workflow. The agreement is identical to VERI\*FACTU's, but Invopop does not register the supplier with AEAT for active reporting, only for invoicing on their behalf. **SII** Run the SII Register Supplier workflow. The supplier signs the representation agreement and Invopop registers as their *colaborador social* with AEAT. Invopop's own certificate is then used for SII submissions on their behalf. SII web services accept any AEAT-recognized certificate. Invopop signs submissions with its *certificado de representante de persona jurídica*, acting under the colaborador social arrangement — suppliers do not upload their own certificates. **TicketBAI** Run the TicketBAI Register Supplier workflow. The legal representative signs the agreement (electronic or handwritten + ID); the supplier's foral territory determines which Diputación Foral endpoint Invopop will submit to. None — Invopop uses its own *certificado sello de empresa* (one of the three TicketBAI-permitted types). Suppliers do not need to register with the foral tax authority or upload any certificate. **VERI\*FACTU** Run the VERI\*FACTU Register Supplier workflow. The legal representative signs the PDF agreement (electronic or handwritten signature with ID) and Invopop registers the supplier with AEAT for invoicing on their behalf. ### Reporting questions **SII** Continuously, every issued or received invoice must be reported within 4 calendar days (excluding weekends and holidays), and always before the 16th of the following month. There is no daily cadence; submissions happen as documents are processed. SOAP web services with XML payloads — distinct schemas for issued (`SuministroFactEmitidas`), received (`SuministroFactRecibidas`), investment goods, and intra-EU operations. Each call carries up to 10,000 records signed with the issuer's (or representative's) certificate. *** Ask and answer questions about Spain's regulation → # UAE FAQ Source: https://docs.invopop.com/faq/uae Frequently asked questions about invoicing compliance in UAE FAQ content for UAE is being prepared. For specific questions, please contact [support@invopop.com](mailto:support@invopop.com). *** Ask and answer questions about UAE's regulation → # Understanding Invopop's pricing Source: https://docs.invopop.com/get-started/pricing Usage and cost of issuing invoices and other documents through Invopop Our pricing is based on **Pops**, **Apps** and **Pro Features**. * **Pops** are our unit of computing usage. When selecting a plan, you are entitled to the specified number of Pops which will be spent on storage, on the actions performed on your documents, and if applicable, on the Parties you register (what we call **Seats**). **The first 200 pops are free.** * **Paid Apps**, with a fixed monthly fee, of two types: * **Countries** englobe all the integrations you may need for e-invoicing/reporting in a given country. The **first country is free**; each additional one has a fixed monthly fee. * **Integrations** are connectors to ERPs and other merchant platforms such as Stripe or Chargebee. * **Pro features** such as dedicated support and unlimited users can be added to your subscription at a flat monthly fee. You can choose a **monthly subscription**, or **save on an annual one**. ## Understanding Pops (our computing credits) Pops are calculated based on a combination of the monthly documents you process and the specific actions you perform on them. Your pop consumption starts with the number of documents you plan to process each month. `Total Pops = (Docs Processed × Base Pop Cost) + (Document Actions × Action Pop Cost) + (Number of Seats x Pops per Seat)` * Core actions such as Send email or Generate PDF cost 1 pop. * Format conversions such as Facturae, XRechnung, UBL or CII also cost 1 pop. * Each network or tax authority has a different price depending on complexity of operation and implementation: * TicketBAI, VERI\*FACTU or Peppol cost 2 pops. * SDI, AT, KSeF cost 3 pops. * DIAN, myDATA, SAT, NFSe cost 5 pops. * Each Seat - a registered Party/Merchant per network - costs 100 pops. Pop costs per action, document, and party registration ## Our Apps In addition to your Pop-based plan cost, we offer optional, fixed-monthly-fee apps (countries and integrations). These are billed separately from your base plan. **A country** includes all the integrations you could need for e-invoicing/reporting in a given country. For example, Spain would include the integration with VeriFactu, SII, Ticketbai. The **first country is free**; each additional one costs +**€300/month**. **A connector** is the self-serve integration with your ERP and other merchant platforms. Price varies per connector type, for example: | Add-on | Monthly Cost | Description | | :------------ | :-------------- | :---------------------------------- | | **Chargebee** | **+€200/month** | Connector for Chargebee integration | | **NetSuite** | **+€200/month** | Connector for NetSuite integration | | **Stripe** | **+€100/month** | Connector for Stripe integration | ## Our Pro Features **Pro features** include chat and email support, unlimited users, removing Invopop's watermark from PDFs and emails, generating audit logs and access to ISO27001. These can be added to your subscription for **+€500/month.** *** ## FAQ Invopop charges for subscriptions in advance at the start of each billing cycle. When you first subscribe, you'll be charged immediately for the full period. For subsequent renewals, you'll be charged on your billing anniversary date for the next billing period. **How do monthly renewals work?** Your subscription renews on the same day each month. For example, if you subscribe on March 31st, your renewal in February would occur on the 28th (or 29th in leap years) to account for different month lengths. **What happens if I upgrade my plan mid-cycle?** Upgrades are applied immediately. You'll receive a new invoice that accounts for your new plan, with appropriate credits for what you've already paid in the current billing period. The new benefits take effect right away. **What about downgrades?** Downgrades take effect at the end of your current billing period. This means you'll continue to enjoy your current plan's benefits until the next renewal date, when the downgrade will be applied. **Do Developer and Pro plans work the same way?** Yes, both prepaid Developer and Pro plans are charged in advance at the start of each billing cycle. The only difference is access to pro features. To continue using Invopop, you will need to upgrade to the next pop tier. Technically, a **Seat** corresponds to a Tax ID registered to issue invoices in a specific network. Every account needs at least one. In practice, most companies need only one seat or a handful. Some, however, use Invopop to provide e-invoicing to their own customers: each customer registered counts as a seat. Every seat consumes pops from your monthly allowance: 100 pops are deducted the moment you register it, and 100 pops again every 30 days from that registration date for as long as it stays registered. For Developer and Pro plans, Invopop accepts credit card payments and direct debit. These self-service plans are designed for automated payment processing through your billing portal. For Enterprise plans, Invopop also offers pay by invoice, which aligns with the higher-touch, sales-assisted nature of these subscriptions. The payment methods break down by plan type as follows: **Developer/ Pro Plans** * Credit card * Direct debit **Enterprise Plans** * Credit card * Direct debit * Pay by invoice (Net 30 terms, paid in advance) **Developer plans** include access to our [community forum](https://community.invopop.com). These plans are designed for technical users who prefer to self-serve using documentation and community resources. **Pro plans** include everything in Developer, plus direct chat and email support from our team. **Enterprise plans** include everything in Pro, plus dedicated Slack support, white-glove onboarding, regulatory advice, and guaranteed response and uptime SLAs. Enterprise plans are designed for organizations with complex needs and higher volumes. You should consider Enterprise if you need: * **Custom pricing and contracts** tailored to your specific usage patterns and business requirements * **Dedicated support** through Slack with guaranteed response times and uptime SLAs * **White-glove onboarding** with personalized setup assistance * **Pay by invoice** options with Net 30 terms * **Sales-assisted procurement** to help navigate your organization's buying process Enterprise plans provide the flexibility, support, and security features that larger organizations require. # Quickstart Source: https://docs.invopop.com/get-started/quickstart Sign up instructions and getting your first sandbox working In this tutorial, you will: 1. Sign up for an Invopop account and get your first sandbox workspace working. 2. Invite your colleagues to join your workspace. 3. Create a simple workflow to issue an invoice. 4. Upload the invoice to the workflow and process it. ## Signing up Go to [console.invopop.com](https://console.invopop.com) and select your sign up method. Selecting "Google" will take you to the Google sign-up page. Sign up form Fill in the form with your name, company, and position. The company will become your organization in Invopop, more on that later. Sign up form You'll be prompted to create a first sandbox workspace. Don't worry, you can always create more workspaces later. Create workspace You will be redirected to the Invopop console. Congratulations, you've just created your first sandbox workspace! Empty workspace ## Inviting colleagues Now that you've signed up, you can invite your colleagues to join your organization. Within the [Invopop console](https://console.invopop.com), click on your name on the bottom left corner, and select **Configure organization**. You may be prompted login again, and you'll be redirected to the workspaces page. Go to organization settings Click on the **Members** tab on the left. You'll see a list of all the members in your organization. Members Fill in the form with your colleagues' email addresses and position and click on Send. Your colleagues will receive an email with a link to join your organization and will be able to access any workspace associated with your organization. ## Creating a workflow Now let's create your first workflow. We'll start with a simple workflow that generates a PDF invoice. Go back to the workspace by clicking on the **Workspaces** tab, selecting your workspace and clicking on **Go to Console** or simply opening a new tab in [https://console.invopop.com](https://console.invopop.com). Go to workspace Click on the **Workflows** on the left sidebar. You'll see a list of all the workflows in your workspace. Workflows Click on the **Create workflow** button on the top right corner. You'll see a list of template workflows that you can use to get started. Select the "PDF Invoice" template and click on **Load template**. Let's add a step that sets the Document state to `Sent` after the PDF is generated. Click on the **+** button below the top right corner and select **Set state** in the right sidebar. Add Set state action You should now see the configuration of the **Set state** step, otherwise click on the step you've just added. Select `Sent` in the **State** dropdown. Click on the **Save Draft** button to save your draft workflow. Now click on **Publish** so you can start using it in your workspace. ## Uploading an invoice Now let's upload an invoice to your workspace that we'll later send to the 'PDF Invoice' workflow. You can upload document manually from the Console or by using the API. 1. In the [Console](https://console.invopop.com), click on **Invoices** on the left sidebar. 2. Click on the **New invoice** button on the top right corner. You'll be redirected to the document editor. 3. The document editor has two modes: the *visual view* and the *code view*. Switch to the code view by clicking on the toggle below the Save button. Toggle code view 4. Copy the invoice example below and paste it in the code view. ```json Example invoice expandable theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "GB", "uuid": "01975e35-426f-760e-aab8-a30b942fee07", "type": "credit-note", "series": "SAMPLE", "code": "000002", "issue_date": "2025-06-11", "currency": "GBP", "preceding": [ { "uuid": "019035bd-4524-73ab-bf44-6037841ce5d9", "type": "standard", "issue_date": "2024-07-31", "series": "SAMPLE", "code": "001" } ], "supplier": { "name": "Test Company Ltd.", "tax_id": { "country": "GB", "code": "000472631" }, "addresses": [ { "num": "12", "street": "Main Street", "locality": "Hull", "code": "HU17 7PQ", "country": "GB" } ], "emails": [ { "addr": "company@example.com" } ] }, "customer": { "name": "Random Company Ltd.", "tax_id": { "country": "GB", "code": "350983637" }, "addresses": [ { "num": "45", "street": "Some Street", "locality": "London", "code": "SW1A 1AA", "country": "GB" } ], "emails": [ { "addr": "random@example.com" } ] }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "discounts": [ { "reason": "Special discount", "percent": "10%", "amount": "180.00" } ], "taxes": [ { "cat": "VAT", "rate": "standard", "percent": "20.0%" } ], "total": "1620.00" } ], "totals": { "sum": "1620.00", "total": "1620.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "base": "1620.00", "percent": "20.0%", "amount": "324.00" } ], "amount": "324.00" } ], "sum": "324.00" }, "tax": "324.00", "total_with_tax": "1944.00", "payable": "1944.00" } } ``` 5. Click on the **calculator** icon to *build* the invoice. This will normalize and validate fields and add any calculated fields. Build invoice 6. Click on the **Save** button on the top right corner to save the invoice. You'll be redirected to the *invoice detail* view. Use the [Create an entry](/api-ref/silo/entries/create-an-entry-post) API endpoint with a request body that wraps your invoice in the required structure. Your request body should look like this: ```json theme={"system"} { "content_type": "application/json", "data": {} } ``` Populate the `data` field with your complete invoice object. You can use the example below: ```json expandable theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "GB", "uuid": "029035bd-4524-73ab-bf44-6037841ce5d9", "type": "standard", "series": "SAMPLE", "code": "001", "issue_date": "2024-07-31", "currency": "GBP", "supplier": { "name": "Test Company Ltd.", "tax_id": { "country": "GB", "code": "000472631" }, "addresses": [ { "num": "12", "street": "Main Street", "locality": "Hull", "code": "HU17 7PQ", "country": "GB" } ], "emails": [ { "addr": "company@example.com" } ] }, "customer": { "name": "Random Company Ltd.", "tax_id": { "country": "GB", "code": "350983637" }, "addresses": [ { "num": "45", "street": "Some Street", "locality": "London", "code": "SW1A 1AA", "country": "GB" } ], "emails": [ { "addr": "random@example.com" } ] }, "lines": [ { "i": 1, "quantity": "20", "item": { "name": "Development services", "price": "90.00", "unit": "h" }, "sum": "1800.00", "discounts": [ { "reason": "Special discount", "percent": "10%", "amount": "180.00" } ], "taxes": [ { "cat": "VAT", "rate": "standard", "percent": "20.0%" } ], "total": "1620.00" } ], "totals": { "sum": "1620.00", "total": "1620.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "base": "1620.00", "percent": "20.0%", "amount": "324.00" } ], "amount": "324.00" } ], "sum": "324.00" }, "tax": "324.00", "total_with_tax": "1944.00", "payable": "1944.00" } } ``` If everything goes well, you'll get a `200 OK` response along with the JSON for your newly registered invoice. You've just created your first invoice! You can click on Preview to see what it'd look like as a PDF. Invoice detail ## Processing an invoice Next, we'll process the invoice by sending it to the 'PDF Invoice' workflow we set up earlier. You can do this manually from the Console or by using the API. 1. In the [Console](https://console.invopop.com), click on **Invoices** in the left sidebar. > Select the invoice you just uploaded. This will open the document editor. 2. Click **Select Workflow** in the top-right corner to open the workflow selection dialog. Select workflow dialog 3. Select the workflow you want to run — in this case, **PDF Invoice** — and click **Run Workflow**. Run workflow 4. You'll see the **Status** of the invoice update to **Sent**, confirming it's been processed. Use the [`Create a Job`](/api-ref/transform/jobs/create-a-job-post) API endpoint with the following request body: ```json theme={"system"} { "workflow_id": "186522a6-e697-4e34-8498-eee961bcb845", "silo_entry_id": "03836750-461b-11f0-a07f-051acfb70532" } ``` * `silo_entry_id` should reference the Silo Entry ID of the uploaded invoice. * `workflow_id` should reference the ID of the workflow you created. If everything goes smoothly, you'll receive a `202 Accepted` response confirming the invoice has been processed. That's it! You've successfully processed your first invoice. # ARCA invoices Source: https://docs.invopop.com/guides/ar-arca-invoices This guide explains how to issue invoices in Argentina through ARCA using Invopop's workflow system. ## Prerequisites Before issuing invoices, ensure you have: * Completed the [ARCA Supplier onboarding guide](/guides/ar-arca-suppliers) * Registered the point of sale(s) you want to use in ARCA (**production only**). See the [point of sales registration guide](/guides/ar-arca-suppliers#point-of-sales-punto-de-venta) ## Setup Add a new workflow to your workspace for issuing invoices. You can start with the template below. Add to my workspace → ```json Example ARCA send invoice workflow theme={"system"} { "name": "ARCA send invoice", "description": "Issue an invoice through ARCA and retrieve the CAE code", "schema": "bill/invoice", "steps": [ { "id": "bce37ad0-f1fd-11f0-9dd9-c3ebff709d81", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "68863090-f1fd-11f0-9dd9-c3ebff709d81", "name": "Send invoice to ARCA", "provider": "gov-ar.send" }, { "id": "6cc19050-f1fd-11f0-9dd9-c3ebff709d81", "name": "Generate PDF", "provider": "pdf", "summary": "Spanish · Letter", "config": { "currency_template": "", "date_format": "%Y-%m-%d", "decimal_mark": "", "label": "", "layout": "Letter", "locale": "es", "logo_height": 40, "negative_template": "", "scripting": false, "thousands_separator": "", "watermark": "" } }, { "id": "c6221e30-f1fd-11f0-9dd9-c3ebff709d81", "name": "Set state", "provider": "silo.state", "summary": "Set state to `sent`{.state .sent}", "config": { "state": "sent" } } ], "rescue": [ { "id": "d751af40-f1fd-11f0-9dd9-c3ebff709d81", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` Keep the `Workflow ID` at hand. You'll use it later. ## Issue an invoice Use the [Create an entry](/api-ref/silo/entries/create-an-entry-put) endpoint to upload the invoice details. Include an [invoice](https://docs.gobl.org/draft-0/bill/invoice) object in the [data](/api-ref/silo/entries/create-an-entry-put#body-data) field with these required fields: * Add the [`ar-arca-v4` addon](https://docs.gobl.org/addons/ar-arca-v4) * `series`: set to your point of sale (punto de venta) number * Do not set `code` (Invopop will assign it during authorization) Do not sign your invoice before sending it to ARCA. The workflow assigns the invoice code and signs the document automatically during the **Send invoice to ARCA** step. ARCA requires invoices to be numbered sequentially without gaps. Invopop assigns the invoice `code` during the **Send invoice to ARCA** workflow step based on the last issued invoice number. Choose the appropriate invoice type based on your tax classification and customer type: Factura A is issued by registered taxpayers (Responsable Inscripto) to other registered taxpayers or monotributistas. This invoice type includes VAT broken down separately. Notice: * the minimal version in the first tab contains only the essential fields required to create the Factura A, * the [`ar-arca-v4`](https://docs.gobl.org/addons/ar-arca-v4) addon ensures the document will be validated using the ARCA rules built into the [GOBL](https://docs.gobl.org) library, * both supplier and customer must be registered taxpayers with valid CUIT numbers, * there are no totals or calculations in the minimal version; all these will be calculated automatically when running `gobl build`, * the built version in the second tab shows the normalized document with calculated totals, line item sums, IVA breakdowns shown separately, and automatically generated fields, and, * the invoice will be submitted to ARCA for authorization and receive a CAE (Código de Autorización Electrónico). ```json ARCA Invoice (Factura A) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": ["ar-arca-v4"], "uuid": "3aea7b56-59d8-4beb-90bd-f8f280d852a0", "currency": "ARS", "issue_date": "2025-01-15", "series": "1", "supplier": { "name": "Proveedor Ejemplo S.A.", "tax_id": { "country": "AR", "code": "30712345671" }, "addresses": [ { "street": "Av. Corrientes 1234", "locality": "Buenos Aires", "region": "Ciudad Autónoma de Buenos Aires", "code": "C1043", "country": "AR" } ], "emails": [ { "addr": "ventas@proveedorejemplo.com.ar" } ], "registration": { "other": "Inicio de actividades: 2016-03-01" } }, "customer": { "name": "Cliente Comercial S.R.L.", "tax_id": { "country": "AR", "code": "30987654321" }, "addresses": [ { "street": "Av. Santa Fe 2500", "locality": "Buenos Aires", "region": "Ciudad Autónoma de Buenos Aires", "code": "C1123", "country": "AR" } ], "emails": [ { "addr": "compras@clientecomercial.com.ar" } ] }, "lines": [ { "quantity": "10", "item": { "name": "Notebooks Dell Latitude", "price": "450000.00", "key": "goods" }, "taxes": [ { "cat": "VAT", "rate": "general" } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "AR", "$addons": [ "ar-arca-v4" ], "uuid": "3aea7b56-59d8-4beb-90bd-f8f280d852a0", "type": "standard", "series": "1", "issue_date": "2025-01-15", "currency": "ARS", "tax": { "ext": { "ar-arca-concept": "1", "ar-arca-doc-type": "1" } }, "supplier": { "name": "Proveedor Ejemplo S.A.", "tax_id": { "country": "AR", "code": "30712345671" }, "addresses": [ { "street": "Av. Corrientes 1234", "locality": "Buenos Aires", "region": "Ciudad Autónoma de Buenos Aires", "code": "C1043", "country": "AR" } ], "emails": [ { "addr": "ventas@proveedorejemplo.com.ar" } ], "registration": { "other": "Inicio de actividades: 2016-03-01" } }, "customer": { "name": "Cliente Comercial S.R.L.", "tax_id": { "country": "AR", "code": "30987654321" }, "addresses": [ { "street": "Av. Santa Fe 2500", "locality": "Buenos Aires", "region": "Ciudad Autónoma de Buenos Aires", "code": "C1123", "country": "AR" } ], "emails": [ { "addr": "compras@clientecomercial.com.ar" } ], "ext": { "ar-arca-vat-status": "1" } }, "lines": [ { "i": 1, "quantity": "10", "item": { "key": "goods", "name": "Notebooks Dell Latitude", "price": "450000.00" }, "sum": "4500000.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "21.0%", "ext": { "ar-arca-vat-rate": "5" } } ], "total": "4500000.00" } ], "totals": { "sum": "4500000.00", "total": "4500000.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "ar-arca-vat-rate": "5" }, "base": "4500000.00", "percent": "21.0%", "amount": "945000.00" } ], "amount": "945000.00" } ], "sum": "945000.00" }, "tax": "945000.00", "total_with_tax": "5445000.00", "payable": "5445000.00" } } ``` Factura B is issued by registered taxpayers (Responsable Inscripto) to final consumers, exempt entities, non-categorized subjects, and foreign tourists. VAT is included in the total price. Notice: * the customer is typically a final consumer (Consumidor Final) and may not have a CUIT, * the minimal version contains only essential fields; `gobl build` handles all calculations, * when running `gobl build`, the system automatically calculates totals with IVA included in the price (not shown separately as in Factura A), * the built version shows the normalized document with calculated totals where VAT is included in the final amounts, * the [`ar-arca-v4`](https://docs.gobl.org/addons/ar-arca-v4) addon applies Factura B specific rules and validations, and, * the invoice will be submitted to ARCA for authorization and receive a CAE. ```json ARCA Invoice (Factura B) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": ["ar-arca-v4"], "uuid": "4bea8c67-6ad9-5cfc-a1ce-f9f391e963b1", "currency": "ARS", "issue_date": "2025-01-16", "series": "2", "supplier": { "name": "Electrodomésticos del Sur S.A.", "tax_id": { "country": "AR", "code": "30712345671" }, "addresses": [ { "street": "Av. Rivadavia 5000", "locality": "Buenos Aires", "region": "Ciudad Autónoma de Buenos Aires", "code": "C1424", "country": "AR" } ], "emails": [ { "addr": "ventas@electrodomesticos.com.ar" } ], "registration": { "other": "Inicio de actividades: 2016-03-01" } }, "customer": { "name": "Juan Pérez", "identities": [ { "code": "25123456", "ext": { "ar-arca-identity-type": "96" } } ] }, "lines": [ { "quantity": "1", "item": { "name": "Heladera Samsung 400L", "price": "850000.00", "key": "goods" }, "taxes": [ { "cat": "VAT", "rate": "general" } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "AR", "$addons": [ "ar-arca-v4" ], "uuid": "4bea8c67-6ad9-5cfc-a1ce-f9f391e963b1", "type": "standard", "series": "2", "issue_date": "2025-01-16", "currency": "ARS", "tax": { "ext": { "ar-arca-concept": "1", "ar-arca-doc-type": "6" } }, "supplier": { "name": "Electrodomésticos del Sur S.A.", "tax_id": { "country": "AR", "code": "30712345671" }, "addresses": [ { "street": "Av. Rivadavia 5000", "locality": "Buenos Aires", "region": "Ciudad Autónoma de Buenos Aires", "code": "C1424", "country": "AR" } ], "emails": [ { "addr": "ventas@electrodomesticos.com.ar" } ], "registration": { "other": "Inicio de actividades: 2016-03-01" } }, "customer": { "name": "Juan Pérez", "identities": [ { "code": "25123456", "ext": { "ar-arca-identity-type": "96" } } ], "ext": { "ar-arca-vat-status": "5" } }, "lines": [ { "i": 1, "quantity": "1", "item": { "key": "goods", "name": "Heladera Samsung 400L", "price": "850000.00" }, "sum": "850000.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "21.0%", "ext": { "ar-arca-vat-rate": "5" } } ], "total": "850000.00" } ], "totals": { "sum": "850000.00", "total": "850000.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "ar-arca-vat-rate": "5" }, "base": "850000.00", "percent": "21.0%", "amount": "178500.00" } ], "amount": "178500.00" } ], "sum": "178500.00" }, "tax": "178500.00", "total_with_tax": "1028500.00", "payable": "1028500.00" } } ``` Factura C is issued by monotributistas (simplified tax regime for small businesses and freelancers) to any type of customer. This invoice type does not break down VAT separately. Notice: * the supplier is registered under the monotributo regime, which is a simplified tax system for small businesses, * the minimal version contains only essential fields; totals are calculated by `gobl build`, * when running `gobl build`, the system automatically calculates totals without breaking down VAT separately (VAT is included but not itemized), * the built version shows the normalized document with calculated totals where no VAT breakdown is shown, as monotributistas don't separately charge VAT, * the [`ar-arca-v4`](https://docs.gobl.org/addons/ar-arca-v4) addon applies Factura C specific rules and ensures compliance with monotributo requirements, and, * the invoice will be submitted to ARCA for authorization and receive a CAE. ```json ARCA Invoice Monotax (Factura C) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": ["ar-arca-v4"], "$tags": ["monotax"], "uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "currency": "ARS", "issue_date": "2025-01-18", "series": "1", "supplier": { "name": "María García - Diseño Gráfico", "tax_id": { "country": "AR", "code": "20172543597" }, "addresses": [ { "street": "Calle Florida 500", "locality": "Buenos Aires", "region": "Ciudad Autónoma de Buenos Aires", "code": "C1005", "country": "AR" } ], "emails": [ { "addr": "maria.garcia@email.com.ar" } ], "registration": { "other": "Inicio de actividades: 2016-03-01" } }, "customer": { "name": "Startup Tech S.R.L.", "tax_id": { "country": "AR", "code": "30987654321" }, "addresses": [ { "street": "Av. Belgrano 1000", "locality": "Buenos Aires", "region": "Ciudad Autónoma de Buenos Aires", "code": "C1092", "country": "AR" } ], "emails": [ { "addr": "admin@startuptech.com.ar" } ] }, "lines": [ { "quantity": "1", "item": { "name": "Diseño de logotipo e identidad visual", "price": "150000.00", "key": "services" } } ], "charges": [ { "key": "tax", "percent": "10%", "reason": "Tributo Nacional", "ext": { "ar-arca-tax-type": "1" } } ], "ordering": { "period": { "start": "2025-01-01", "end": "2025-01-15" } }, "payment": { "terms": { "due_dates": [ { "date": "2025-01-25", "amount": "150000.00" } ] } } } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "AR", "$addons": [ "ar-arca-v4" ], "$tags": [ "monotax" ], "uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "type": "standard", "series": "1", "issue_date": "2025-01-18", "currency": "ARS", "tax": { "ext": { "ar-arca-concept": "2", "ar-arca-doc-type": "11" } }, "supplier": { "name": "María García - Diseño Gráfico", "tax_id": { "country": "AR", "code": "20172543597" }, "addresses": [ { "street": "Calle Florida 500", "locality": "Buenos Aires", "region": "Ciudad Autónoma de Buenos Aires", "code": "C1005", "country": "AR" } ], "emails": [ { "addr": "maria.garcia@email.com.ar" } ], "registration": { "other": "Inicio de actividades: 2016-03-01" } }, "customer": { "name": "Startup Tech S.R.L.", "tax_id": { "country": "AR", "code": "30987654321" }, "addresses": [ { "street": "Av. Belgrano 1000", "locality": "Buenos Aires", "region": "Ciudad Autónoma de Buenos Aires", "code": "C1092", "country": "AR" } ], "emails": [ { "addr": "admin@startuptech.com.ar" } ], "ext": { "ar-arca-vat-status": "1" } }, "lines": [ { "i": 1, "quantity": "1", "item": { "key": "services", "name": "Diseño de logotipo e identidad visual", "price": "150000.00" }, "sum": "150000.00", "total": "150000.00" } ], "charges": [ { "i": 1, "key": "tax", "reason": "Tributo Nacional", "percent": "10%", "amount": "15000.00", "ext": { "ar-arca-tax-type": "1" } } ], "ordering": { "period": { "start": "2025-01-01", "end": "2025-01-15" } }, "payment": { "terms": { "due_dates": [ { "date": "2025-01-25", "amount": "150000.00" } ] } }, "totals": { "sum": "150000.00", "charge": "15000.00", "total": "165000.00", "tax": "0.00", "total_with_tax": "165000.00", "payable": "165000.00" } } ``` Factura T is issued by hotels and tourism providers to non-resident tourists. ARCA automatically reimburses the 21% VAT on qualifying accommodation items. Notice: * the minimal version in the first tab contains only the essential fields required to create the Factura T, * the [`ar-arca-v4`](https://docs.gobl.org/addons/ar-arca-v4) addon ensures the document will be validated using the ARCA rules built into the [GOBL](https://docs.gobl.org) library, * the document type (`ar-arca-doc-type`) must be `195` (Invoice), `196` (Debit Note) or `197` (Credit Note), and the tourism extensions `ar-arca-tourism-type` and `ar-arca-tourism-item` are mandatory, * only the standard 21% VAT rate is accepted; any other rate will be rejected by ARCA, * the built version shows the normalized document with calculated totals and the IVA breakdown, and, * the invoice will be submitted to ARCA for authorization and receive a CAE. ```json ARCA Invoice (Factura T) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": ["ar-arca-v4"], "uuid": "5cfa9d78-7be0-6dfd-b2df-0a0402fa074c", "currency": "ARS", "issue_date": "2025-02-01", "series": "1", "tax": { "ext": { "ar-arca-concept": "2", "ar-arca-doc-type": "195", "ar-arca-tourism-type": "1" } }, "supplier": { "name": "Hotel Patagonia S.A.", "tax_id": { "country": "AR", "code": "30712345671" }, "addresses": [ { "street": "Av. San Martín 500", "locality": "Bariloche", "region": "Río Negro", "code": "R8400", "country": "AR" } ], "emails": [ { "addr": "reservas@hotelpatagonia.com.ar" } ], "registration": { "other": "Inicio de actividades: 2016-03-01" } }, "customer": { "name": "John Smith", "identities": [ { "code": "AB123456", "ext": { "ar-arca-identity-type": "94" } } ], "addresses": [ { "street": "123 Main St", "locality": "New York", "region": "NY", "country": "US" } ], "ext": { "ar-arca-vat-status": "5" } }, "lines": [ { "quantity": "1", "item": { "name": "Hotel sin desayuno", "price": "100.00", "key": "services" }, "taxes": [ { "cat": "VAT", "rate": "general", "ext": { "ar-arca-tourism-item": "1", "ar-arca-vat-rate": "5" } } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "AR", "$addons": [ "ar-arca-v4" ], "uuid": "5cfa9d78-7be0-6dfd-b2df-0a0402fa074c", "type": "standard", "series": "1", "issue_date": "2025-02-01", "currency": "ARS", "tax": { "ext": { "ar-arca-concept": "2", "ar-arca-doc-type": "195", "ar-arca-tourism-type": "1" } }, "supplier": { "name": "Hotel Patagonia S.A.", "tax_id": { "country": "AR", "code": "30712345671" }, "addresses": [ { "street": "Av. San Martín 500", "locality": "Bariloche", "region": "Río Negro", "code": "R8400", "country": "AR" } ], "emails": [ { "addr": "reservas@hotelpatagonia.com.ar" } ], "registration": { "other": "Inicio de actividades: 2016-03-01" } }, "customer": { "name": "John Smith", "identities": [ { "code": "AB123456", "ext": { "ar-arca-identity-type": "94" } } ], "addresses": [ { "street": "123 Main St", "locality": "New York", "region": "NY", "country": "US" } ], "ext": { "ar-arca-vat-status": "5" } }, "lines": [ { "i": 1, "quantity": "1", "item": { "key": "services", "name": "Hotel sin desayuno", "price": "100.00" }, "sum": "100.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "21.0%", "ext": { "ar-arca-tourism-item": "1", "ar-arca-vat-rate": "5" } } ], "total": "100.00" } ], "totals": { "sum": "100.00", "total": "100.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "ar-arca-tourism-item": "1", "ar-arca-vat-rate": "5" }, "base": "100.00", "percent": "21.0%", "amount": "21.00" } ], "amount": "21.00" } ], "sum": "21.00" }, "tax": "21.00", "total_with_tax": "121.00", "payable": "121.00" } } ``` Credit notes (notas de crédito) reverse all or part of a previously authorized invoice — for returns, discounts, or billing errors. The credit note class (A, B, or C) follows the class of the invoice it corrects. Notice: * the `type` is set to `credit-note`; combined with the registered-taxpayer parties, the [`ar-arca-v4`](https://docs.gobl.org/addons/ar-arca-v4) addon maps it to document type `3` (Nota de Crédito A), * the `preceding` array references the original invoice by `series`, `code`, and `issue_date`, with a `reason` for the correction, * the preceding entry carries the [`ar-arca-doc-type`](https://docs.gobl.org/addons/ar-arca-v4) extension set to `1`, identifying the original document as a Factura A, * the lines describe only the amounts being credited — here, two returned notebooks from the original ten, and, * like invoices, the credit note is submitted to ARCA for authorization and receives its own CAE. ```json ARCA Credit Note (Nota de Crédito A) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": ["ar-arca-v4"], "uuid": "3aea7b56-59d8-4beb-90bd-f8f280d852a1", "type": "credit-note", "currency": "ARS", "issue_date": "2025-01-22", "series": "1", "preceding": [ { "type": "standard", "series": "1", "code": "00001234", "issue_date": "2025-01-15", "reason": "Devolución de mercadería", "ext": { "ar-arca-doc-type": "1" } } ], "supplier": { "name": "Proveedor Ejemplo S.A.", "tax_id": { "country": "AR", "code": "30712345671" }, "addresses": [ { "street": "Av. Corrientes 1234", "locality": "Buenos Aires", "region": "Ciudad Autónoma de Buenos Aires", "code": "C1043", "country": "AR" } ], "emails": [ { "addr": "ventas@proveedorejemplo.com.ar" } ], "registration": { "other": "Inicio de actividades: 2016-03-01" } }, "customer": { "name": "Cliente Comercial S.R.L.", "tax_id": { "country": "AR", "code": "30987654321" }, "addresses": [ { "street": "Av. Santa Fe 2500", "locality": "Buenos Aires", "region": "Ciudad Autónoma de Buenos Aires", "code": "C1123", "country": "AR" } ], "emails": [ { "addr": "compras@clientecomercial.com.ar" } ] }, "lines": [ { "quantity": "2", "item": { "name": "Notebooks Dell Latitude", "price": "450000.00", "key": "goods" }, "taxes": [ { "cat": "VAT", "rate": "general" } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "AR", "$addons": [ "ar-arca-v4" ], "uuid": "3aea7b56-59d8-4beb-90bd-f8f280d852a1", "type": "credit-note", "series": "1", "issue_date": "2025-01-22", "currency": "ARS", "preceding": [ { "type": "standard", "issue_date": "2025-01-15", "series": "1", "code": "00001234", "reason": "Devolución de mercadería", "ext": { "ar-arca-doc-type": "1" } } ], "tax": { "ext": { "ar-arca-concept": "1", "ar-arca-doc-type": "3" } }, "supplier": { "name": "Proveedor Ejemplo S.A.", "tax_id": { "country": "AR", "code": "30712345671" }, "addresses": [ { "street": "Av. Corrientes 1234", "locality": "Buenos Aires", "region": "Ciudad Autónoma de Buenos Aires", "code": "C1043", "country": "AR" } ], "emails": [ { "addr": "ventas@proveedorejemplo.com.ar" } ], "registration": { "other": "Inicio de actividades: 2016-03-01" } }, "customer": { "name": "Cliente Comercial S.R.L.", "tax_id": { "country": "AR", "code": "30987654321" }, "addresses": [ { "street": "Av. Santa Fe 2500", "locality": "Buenos Aires", "region": "Ciudad Autónoma de Buenos Aires", "code": "C1123", "country": "AR" } ], "emails": [ { "addr": "compras@clientecomercial.com.ar" } ], "ext": { "ar-arca-vat-status": "1" } }, "lines": [ { "i": 1, "quantity": "2", "item": { "key": "goods", "name": "Notebooks Dell Latitude", "price": "450000.00" }, "sum": "900000.00", "taxes": [ { "cat": "VAT", "key": "standard", "rate": "general", "percent": "21.0%", "ext": { "ar-arca-vat-rate": "5" } } ], "total": "900000.00" } ], "totals": { "sum": "900000.00", "total": "900000.00", "taxes": { "categories": [ { "code": "VAT", "rates": [ { "key": "standard", "ext": { "ar-arca-vat-rate": "5" }, "base": "900000.00", "percent": "21.0%", "amount": "189000.00" } ], "amount": "189000.00" } ], "sum": "189000.00" }, "tax": "189000.00", "total_with_tax": "1089000.00", "payable": "1089000.00" } } ``` After uploading, you'll see the document in the **Invoices** section with status `Empty`. Send the invoice to your ARCA workflow using the [Create a job](/api-ref/transform/jobs/create-a-job-post) endpoint. Use: * `workflow_id`: the Workflow ID of the *ARCA Invoice* workflow you created during setup * `silo_entry_id`: the Silo Entry ID of the invoice you uploaded The invoice status will change to `Sent` when the workflow completes successfully. You can verify that the PDF was generated by opening the invoice and selecting the PDF from the **Files** tab. The PDF includes the CAE and the required QR code. Sent invoice ## FAQ Factura A (B2B between Responsables Inscriptos), Factura B (consumers and exempt entities), Factura C (Monotributistas to anyone), Factura E (exports) and Factura T (tourism services to non-resident tourists). Type is determined by the issuer's tax regime and the customer's classification — Invopop selects the right one automatically when both are set. Most ARCA-cleared invoices are delivered as PDFs with the CAE printed on them, though the underlying XML is also available on request. Invopop can convert the XML into [GOBL](https://docs.gobl.org) for downstream processing; PDF-only documents need OCR or manual capture. Argentine invoices use a two-part numbering system: **XXXXX-YYYYYYYY** * **Punto de Venta (POS)**: A 5-digit code (e.g., 00001) that identifies the point of sale or electronic invoicing method. * **Sequential Number**: An 8-digit code (e.g., 00000001) that increases by 1 with each invoice. The sequence must be continuous with no skipped or repeated numbers. Each invoice type (A, B, C) and POS combination has its own independent sequence. For example, Factura A from POS 0001 starts at `00001-00000001`, while Factura B from the same POS would also start at `00001-00000001`. Invopop automatically manages sequential numbering for each punto de venta. A Punto de Venta (POS) is a 5-digit code that identifies where invoices are issued from. In electronic invoicing, it represents the electronic invoicing method or channel (e.g., Web Service, ARCA portal). Each POS has its own independent invoice sequence for each invoice type. You must register your punto de venta with ARCA before you can issue invoices through it in production. In the sandbox environment, you can use test punto de venta numbers without registration. No, you can use the same punto de venta for different invoice types (Factura A, B, C, etc.). However, each invoice type will have its own independent sequential numbering within that punto de venta. For example, using POS 00001: * Factura A: 00001-00000001, 00001-00000002, 00001-00000003... * Factura B: 00001-00000001, 00001-00000002, 00001-00000003... WSFE (Web Services de Factura Electrónica) is ARCA's web service infrastructure for automated invoice submission. ARCA provides several web services: * **wsfev1**: For invoices A, B, C, and M without item detail * **wsmtxca**: For invoices A and B with item details * **wsfexv1**: For type E (export) invoices * **wsct**: For type T (tourism) invoices issued to non-resident tourists Invopop integrates with these services to automatically submit your invoices to ARCA and receive CAE authorization codes in real time. If ARCA rejects an invoice, you'll receive an error message explaining the reason for rejection. Common reasons include: * Invalid or unregistered CUIT * Missing required fields * Incorrect tax calculations * Sequential numbering errors * Invalid punto de venta Review the error message, correct the issue in your GOBL document, and resubmit the invoice. The rejected invoice does not count toward your sequential numbering, so you can use the same number after correction. See the [Argentina tax regime in GOBL](https://docs.gobl.org/regimes/ar) for tax IDs, tax categories, and AFIP/ARCA-specific extensions. The [`ar-arca-v1`](https://docs.gobl.org/addons/ar-arca-v1) addon documents required fields for invoice submission to ARCA. More available in our [Argentina FAQ](/faq/argentina) section # ARCA supplier onboarding Source: https://docs.invopop.com/guides/ar-arca-suppliers Create and register suppliers in Argentina with ARCA. ## Introduction To issue invoices in Argentina through ARCA, each supplier must generate a digital certificate from the ARCA website and upload it to Invopop. This guide walks you through the complete registration process. | - | Sandbox | Live | | ------------------ | ------------------------ | ------------------------------------- | | **Supplier** | Real company required | Real company required | | **Certificates** | ARCA sandbox certificate | ARCA production certificate | | **Punto de venta** | Any number can be used | Must be registered in ARCA before use | ## Setup Argentina App 1. Go to **Configuration** → **Apps** in the [Console](https://console.invopop.com). 2. Find **Argentina** in the app list. 3. Click **Connect** to activate the app. Create a new workflow for registering suppliers. Start with the template below: Add to my workspace → Copy and paste into a new [Empty Party workflow](https://console.invopop.com/redirect/workflows/new?template=empty-party) code view. ```json Example ARCA register supplier workflow theme={"system"} { "name": "ARCA register supplier", "description": "Register a supplier with ARCA using their certificate", "schema": "org/party", "steps": [ { "id": "12e637b0-f1fe-11f0-9dd9-c3ebff709d81", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "fc109350-f1fd-11f0-9dd9-c3ebff709d81", "name": "Register supplier with ARCA", "provider": "gov-ar.register" }, { "id": "ff7d3160-f1fd-11f0-9dd9-c3ebff709d81", "name": "Wait for ARCA certificate upload", "provider": "gov-ar.wait.authorization" }, { "id": "0dc4bdb0-f1fe-11f0-9dd9-c3ebff709d81", "name": "Set state", "provider": "silo.state", "summary": "Set state to `registered`{.state .registered}", "config": { "state": "registered" } } ], "rescue": [ { "id": "f1be4e50-f203-11f0-b1d8-c7bdc0d915b1", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` ## Register a supplier The registration process is the same whether you're issuing invoices on behalf of third parties ([white label](/guides/white-label)) or under your own company name. Via API
Use the [Create an entry](/api-ref/silo/entries/create-an-entry-put) endpoint to create a new supplier [party](https://docs.gobl.org/draft-0/org/party). The required fields are: * `name` - company name * `tax_id` - tax identification number Set the `folder` parameter to `suppliers` so the entry appears in the suppliers section. The entry will have an `Empty` status initially. Via Console
Navigate to **Parties > Suppliers** and click on + New supplier. The following JSON code will appear in the editor: ```json theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "", // Name of the company or individual "tax_id": { "code": "", // 11 digit CUIT "country": "" // "AR" } } ``` Fill in the necessary information and click on Build and then Save.
Via API
Use the [Create a job](/api-ref/transform/jobs/create-a-job-post) endpoint with the following payload: ```json theme={"system"} // POST https://api.invopop.com/transform/v1/jobs { "workflow_id": "", "silo_entry_id": "" } ``` You can obtain the `workflow_id` from the workflows list, and the `silo_entry_id` from the **Meta** tab in the supplier entry. Via Console
Open the supplier entry, click Run workflow, and select **Register in ARCA**. The supplier's status will change to `Processing` while awaiting registration completion.
Your own company
In the Console, open the supplier entry and navigate to the **Meta** tab. Click on **gov-ar.invopop.com** to launch the registration wizard. Supplier entry meta Third-party companies
To send the registration link to your customer, add a webhook step before **Wait for ARCA certificate upload**. The webhook payload includes the `siloEntryId`. Use the [Fetch an Entry endpoint](/api-ref/silo/entries/fetch-an-entry) to retrieve the full entry, including the `meta` object containing the registration link. ```json Example webhook response expandable theme={"system"} data: { "meta": [ { "id": "...", "created_at": "2025-11-05T15:10:28.132Z", "updated_at": "2025-11-14T15:56:53.727Z", "owner_id": "...", "entry_id": "...", "src": "gov-ar", "key": "link", "ref": "EgDeG3pDBDe", "link_url": "https://gov-ar.invopop.com/reg/EgDeG3pDBDe", "link_scope": "public", "indexed": true, "shared": true } ] } ``` Send the `link_url` to your customer to complete their registration.
## Complete the registration wizard The wizard will guide the user to create a certificate in ARCA's portal and upload it to Invopop. The steps differ between sandbox and production. For your convenience, we provide guides in Spanish which you can share with your customers or adapt to your own needs: * **Sandbox**: [ARCA certificate wizard (in Spanish)](/guides/ar-certificates-sandbox) * **Production**: [ARCA certificate wizard (in Spanish)](/guides/ar-certificates-production) Once you've successfully uploaded and validated the certificate, the supplier is ready to issue invoices. ## Point of sales (Punto de venta) In Invopop, the point of sale is specified in the `series` field of the invoice. Once the registration process is complete, in **sandbox** you can use any point of sale number, while **production** requires registering each point of sale in ARCA before using it. The registration process varies depending on your tax classification: * **Monotributista**: A simplified tax regime for small businesses and freelancers in Argentina * **Registered taxpayer** (Responsable Inscripto): Standard tax regime for companies registered for VAT Follow these steps to register a point of sale in production: In ARCA, go to **Administración de puntos de venta y domicilios** (Point of Sale and Address Administration). Administracion de puntos de venta y domicilios Select **A/B/M de puntos de venta**, then click **Agregar nuevo punto de venta** (Add new point of sale). Choose the appropriate option for your tax classification: **For monotributista**: Select "Factura electronica - Monotributo - Web Service" Monotributista point of sale **For registered taxpayers**: Select "RECE para aplicativo y Web Service" Registered taxpayer point of sale ## FAQ Yes, to issue invoices through ARCA's web services, you need to upload your ARCA digital certificate to Invopop. This certificate is issued by ARCA and is used to authenticate your requests to their system. The registration process involves: 1. Generating a certificate signing request (CSR) with ARCA 2. Downloading the certificate and private key 3. Uploading them to Invopop through the supplier registration flow See our [ARCA Supplier Onboarding guide](/guides/ar-arca-suppliers) for detailed instructions. To register a supplier for ARCA invoicing, you need: **Company Information:** * Legal name (Razón Social) * CUIT (tax ID) * Fiscal address * Economic activity code * Tax classification (Responsable Inscripto or Monotributista) **Digital Certificates:** * ARCA digital certificate (.crt file) * Private key (.key file) * Key password (if applicable) See our [ARCA Supplier Onboarding guide](/guides/ar-arca-suppliers) for detailed registration instructions. The supplier registration process typically takes a few minutes once the supplier has their digital certificates ready. The steps are: 1. Generate a registration link in Invopop 2. Supplier uploads their certificate and key 3. System validates the credentials with ARCA 4. Registration is complete The longest part is usually obtaining the digital certificate from ARCA, which can take a few days if the supplier hasn't done it before. Yes, a single supplier can have multiple puntos de venta. Each punto de venta operates independently with its own sequential numbering for each invoice type. When registering a supplier, you specify which punto de venta to use. You must register each punto de venta with ARCA in production before using it to issue invoices. Digital certificates issued by ARCA have an expiration date. When a certificate is about to expire, the supplier must generate a new one through ARCA's portal and upload it to Invopop. To update an expired certificate: 1. Obtain a new certificate from ARCA 2. Use the supplier registration workflow to upload the new certificate 3. The new certificate will replace the old one It's recommended to renew certificates before they expire to avoid disruption to your invoicing process. Yes, Invopop supports white-label (B2B2B) operations in Argentina. This means you can issue invoices on behalf of your clients using their CUIT and digital certificates. This is particularly useful for platforms and software providers who want to offer invoicing services to their customers without requiring them to integrate directly with ARCA. Each supplier (your client) needs to complete the registration process with their own certificates, and then you can issue invoices on their behalf through Invopop's workflows. An ARCA digital certificate, consisting of a `.crt` X.509 certificate and the matching `.key` private key. Both files are uploaded together; the certificate must be valid (not expired, not revoked) and authorized for the ARCA web services you intend to use — WSFE for Factura A, B and C, WSFEX for Factura E, and WSCT for Factura T. Generate a registration link via the ARCA Register Supplier workflow, send it to the supplier, and have them upload their ARCA digital certificate and private key. Once validated, the supplier is ready to issue. See the [ARCA Supplier Onboarding guide](/guides/ar-arca-suppliers). The ARCA digital certificate (`.crt`) and private key (`.key`) are stored encrypted. Invopop only uses them to authenticate ARCA web service requests (WSFE and WSCT) on the supplier's behalf and never returns the key in API responses. More available in our [Argentina FAQ](/faq/argentina) section *** | | | | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Compliance | [Invoicing compliance in Argentina](/compliance/argentina)
[Compliance timeline](/timelines/argentina) | | Apps | [Argentina](/apps/argentina) | | Guides | [ARCA supplier onboarding](/guides/ar-arca-suppliers)
[ARCA invoices](/guides/ar-arca-invoices) | | FAQ | [Argentina FAQ](/faq/argentina) | | GOBL | [Argentina Tax Regime](https://docs.gobl.org/regimes/ar)
[Argentina ARCA Addon](https://docs.gobl.org/addons/ar-arca-v4) |
Ask and answer questions about invoicing in Argentina → # Authentication guide Source: https://docs.invopop.com/guides/authentication After completing this quick start guide you'll have generated and tested an authentication token that can be used in all subsequent requests to the Invopop API. ## Requirements You don't need to be a developer to use this guide, but you will need to have a bit of experience using the command line and know how to create a text file. For sending requests to the server we use the "curl" command, and for easy visualization of the response, the "jq" command — both included with most operating systems. Install "curl" and "jq" in case they are not installed in your system. ## Create an account Head over to the [Invopop Console](https://console.invopop.com) and follow the steps to either log in or create an account. ## Get a token 1. Once inside the console, click **Settings**. 2. Enter the API Keys section. 3. Tap the New API Key button. 4. Provide a name for future reference, and any notes perhaps describing a use case, then click Save. 5. You'll be presented with a new token in text and a button to copy the details. Tap the copy button, and paste the token somewhere safe. Invopop uses JSON Web Tokens. If you're interested in seeing the contents, head over to [JWT.io](https://jwt.io) and paste your token to see what's inside. ## Test To test our new token, open the Terminal and prepare our environment using the following command, replacing `` with the actual token generated from the Invopop console in the last step: ```bash theme={"system"} export INVOPOP_TOKEN="" ``` This saves us from copying and pasting the token every time we need to use it, and we can now make a call to the Invopop Ping service: ```bash theme={"system"} curl -H "Authorization: Bearer $INVOPOP_TOKEN" https://api.invopop.com/utils/v1/ping | jq . ``` Response: ```json theme={"system"} { "ping": "pong" } ``` This ping call doesn't do anything useful, other than ensuring that your connection and credentials are valid. Most examples throughout this documentation will assume you have set the `$INVOPOP_TOKEN` variable. ## Conclusion You've now managed to authenticate with the Invopop API using a generated token. Ask and answer questions about authentication → # Belgium Peppol guide Source: https://docs.invopop.com/guides/be-peppol Guide for Belgium Peppol e-invoicing setup and migration process Belgium handles e-invoicing through the Peppol network, which became **mandatory in January 2026**. For comprehensive information about Peppol features and capabilities, please refer to our [Peppol Guide](/guides/peppol). ## FAQ Install the Peppol app, register your supplier with its KBO/BCE-based participant ID (scheme `0208`), and use a workflow that generates a Peppol BIS Billing 3.0 document and sends it via the Lookup → Send actions. In Belgium specifically there is no need to send a copy to the tax authority until the e-reporting mandate comes into effect in Jan 2028. See the [Belgium tax regime in GOBL](https://docs.gobl.org/regimes/be) for tax IDs and category codes. The Peppol BIS Billing 3.0 mapping is shared across EU members and comes from the [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) addon. Belgium uses two Peppol scheme identifiers: * **`0208` (KBO/BCE enterprise number)** — This is the **preferred and default** scheme for Belgium. It corresponds to the company's KBO/BCE number (Kruispuntbank van Ondernemingen / Banque-Carrefour des Entreprises), which is the official Belgian business register. Most Belgian companies are registered in Peppol under this scheme. * **`9925` (BE VAT number)** — This is an older, alternative scheme based on the Belgian VAT number. It is typically used by entities that have a Belgian VAT number but are not registered in the KBO/BCE — for example, foreign companies with a Belgian VAT registration. **When you should use `0208`:** Always use `0208` as your first choice when sending invoices to Belgian companies. This is the standard identifier and what the vast majority of Belgian businesses are registered under. **When `9925` may be needed:** If you get a "receiver not found" error when sending to a Belgian company using `0208`, and you have confirmed the company exists in the [Peppol Directory](https://directory.peppol.eu), check whether they are registered under `9925` instead. This is uncommon but does happen. To specify the scheme when sending, include the customer's Peppol inbox in your GOBL document: ```json theme={"system"} "customer": { "name": "Example Company", "tax_id": { "country": "BE", "code": "0123456789" }, "inboxes": [ { "key": "peppol", "scheme": "9925", "code": "BE0123456789" } ] } ``` Note that when using `9925`, the code must include the `BE` prefix (e.g. `BE0123456789`), whereas `0208` uses the raw KBO/BCE number without a prefix. Use the **Lookup Participant ID** workflow step to verify a recipient's Peppol registration before sending. If a lookup with `0208` fails, try again with `9925`. In countries where Peppol is the standard but not mandatory, you may still need to issue an e-invoice when the recipient isn't on the network. Both parties can agree on an alternative transfer method, but the invoice must still be EN16931 compliant. Recommended approach: * Set up a separate workflow that generates the XML without the send-Peppol-document step * Or reuse your existing workflow without the customer Peppol ID — the send step is automatically skipped * Fetch the generated XML and deliver it through the agreed channel, typically email B2C invoices typically lack the structured customer information required for Peppol delivery, and most consumers don't have inboxes. Use a conditional workflow: 1. Add an **If/Else** step that checks for a customer inbox using `count(customer.inboxes, true) > 0`. 2. On the `false` branch, generate a PDF and email it to the customer, then stop the flow. This routes B2B invoices through Peppol while keeping a smooth path for consumers. If a job fails with `KO` and `receiver not found in the peppol network`, treat it like an invalid email address — the recipient simply isn't reachable on Peppol. Add the **Lookup Participant ID** step (ideally in a separate validation workflow run against customer data) so you catch missing IDs before generating the invoice. No. The regime is automatically derived from the supplier's settings, which is the recommended approach for Peppol — leave it unset on the document. See the [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) addon for the field and validation rules Peppol BIS Billing 3.0 builds on, and the [Peppol app reference](/apps/peppol) for supported document types and Participant ID schemes. More available in our [Belgium FAQ](/faq/belgium) section *** | | | | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Compliance | [Invoicing compliance in Belgium](/compliance/belgium)
[Compliance timeline](/timelines/belgium) | | Apps | [Peppol](/apps/peppol)
[OASIS UBL](/apps/oasis-ubl)
[UN/CEFACT CII](/apps/uncefact-cii) | | Guides | [Peppol guide](/guides/peppol)
[Chargebee guide](/guides/cb-belgium) | | FAQ | [Belgium FAQ](/faq/belgium) | | GOBL | [Belgium Tax Regime](https://docs.gobl.org/regimes/be)
[EN 16931-1:2017 Addon](https://docs.gobl.org/addons/eu-en16931-v2017) | | GitHub | [gobl.ubl](https://github.com/invopop/gobl.ubl)
[gobl.cii](https://github.com/invopop/gobl.cii) |
Ask and answer questions about invoicing in Belgium → # DF-e issuing invoices guide Source: https://docs.invopop.com/guides/br-dfe Issue Documentos Fiscais Eletrônicos in Brazil ## Introduction Brazil has a variety of electronic tax documents that must be issued in different cases for various tax purposes. These include service invoices (NFS-e), product invoices (NF-e), and consumer invoices (NFC-e). Each document type is subject to variations from state to state and municipality to municipality, with each jurisdiction applying its own rules, formats, and APIs for issuing fiscal documents. Invopop's **Documentos Fiscais Eletrônicos** app provides a unified way to issue fiscal documents across all Brazilian states and over 2000 municipalities using GOBL. You can find [the full list of supported municipalities here](https://tecnospeed.com.br/plugdfe/nfse/#homologacao). This guide will walk you through the steps required to issue electronic fiscal documents in a supplier's name, and to cancel them if needed. | - | Sandbox | Live | | ------------- | ---------------------------------------------------- | ------------------------------------------------------------------ | | **Responses** | Simulated/mocked | Real from DFe system | | **PDF & XML** | Always the same mock-up files attached to silo entry | Actual XML sent to tax authority and actual generated PDF attached | ## Prerequisites To issue electronic fiscal documents in Brazil, you will need: * A registered supplier: follow the [DF-e supplier registration guide](/guides/br-dfe-supplier) to connect the Documentos Fiscais Eletrônicos Brazil app and register the supplier's certificate before issuing. * Customer details (except for NFC-e where the customer is optional). * Details of the goods or services provided: * quantity, * price, * applicable tax rates (ISS, ICMS, PIS, COFINS, etc.), and, * (only for services) service code (*Código Item Lista Serviço*) as defined by the municipality. * To have chosen an invoice series ## Setup Prepare the invoicing workflows for the document types you want to issue and cancel. These instructions apply to both the sandbox and live environments. Please note that the sandbox environment is simulated, and most responses are mocked. The **Documentos Fiscais Eletrônicos Brazil** app must already be connected and configured — this is covered in the [supplier registration guide](/guides/br-dfe-supplier). All of the following steps must be carried out from the [Invopop Console](https://console.invopop.com). You can skip this step if you're not interested in issuing NFS-e documents. Follow one of the methods below and ensure to **Save** and **Publish** the workflow: Add to my workspace → Copy and paste into a new [Empty Invoice workflow](https://console.invopop.com/redirect/workflows/new?template=empty-invoice) code view. ```json Example issue NFS-e invoice workflow theme={"system"} { "name": "Issue NFS-e invoice", "description": "Issue an NFS-e service invoice via PlugNotas", "schema": "bill/invoice", "steps": [ { "id": "d1c7bde0-b651-11f0-b6c3-efa5610a4723", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "dbcb8600-b651-11f0-b6c3-efa5610a4723", "name": "Add sequential code", "provider": "sequence.enumerate", "summary": "Dynamic · NFS-e · 1", "config": { "name": "NFS-e", "padding": 1, "start": 1 } }, { "id": "e8eba950-b651-11f0-b6c3-efa5610a4723", "name": "Sign envelope", "provider": "silo.close" }, { "id": "ec64f190-b651-11f0-b6c3-efa5610a4723", "name": "Send NFS-e to Prefeitura", "provider": "nfe-br.send" }, { "id": "eecc7bb0-b651-11f0-b6c3-efa5610a4723", "name": "Set state", "provider": "silo.state", "summary": "Set state to `sent`{.state .sent}", "config": { "state": "sent" } } ], "rescue": [ { "id": "f9195ac0-b651-11f0-b6c3-efa5610a4723", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` You can skip this step if you're not interested in issuing NF-e documents. Follow one of the methods below and ensure to **Save** and **Publish** the workflow: Add to my workspace → Copy and paste into a new [Empty Invoice workflow](https://console.invopop.com/redirect/workflows/new?template=empty-invoice) code view. ```json Example issue NF-e invoice workflow theme={"system"} { "name": "Issue NF-e invoice", "description": "Issue an NF-e product invoice via PlugNotas", "schema": "bill/invoice", "steps": [ { "id": "ddfb8e79-8260-4ecd-bf59-115e837cd135", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "169c4b15-83ae-4242-b0c9-4e4915d15361", "name": "Add sequential code", "provider": "sequence.enumerate", "summary": "Dynamic · NF-e · 1", "config": { "name": "NF-e", "padding": 1, "start": 1 } }, { "id": "283dae9e-ea44-46c0-8f63-5af48ec5f388", "name": "Sign envelope", "provider": "silo.close" }, { "id": "12bd4677-dc3c-4043-85ca-54f8d034803d", "name": "Send NF-e to SEFAZ", "provider": "nfe-br.send.nfe" }, { "id": "999ad559-1040-4e69-98c9-93e62c8833d4", "name": "Set state", "provider": "silo.state", "summary": "Set state to `sent`{.state .sent}", "config": { "state": "sent" } } ], "rescue": [ { "id": "5c38f3d4-1338-4990-a248-0822c5081124", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` You can skip this step if you're not interested in issuing NFC-e documents. Follow one of the methods below and ensure to **Save** and **Publish** the workflow: Add to my workspace → Copy and paste into a new [Empty Invoice workflow](https://console.invopop.com/redirect/workflows/new?template=empty-invoice) code view. ```json Example issue NFC-e invoice workflow theme={"system"} { "name": "Issue NFC-e invoice", "description": "Issue an NFC-e consumer invoice via PlugNotas", "schema": "bill/invoice", "steps": [ { "id": "93769100-b652-11f0-a7d9-bfad358c6464", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "971c6780-b652-11f0-a7d9-bfad358c6464", "name": "Add sequential code", "provider": "sequence.enumerate", "summary": "Dynamic · NFC-e · 1", "config": { "name": "NFC-e", "padding": 1, "start": 1 } }, { "id": "9f965b50-b652-11f0-a7d9-bfad358c6464", "name": "Sign envelope", "provider": "silo.close" }, { "id": "8693f670-b653-11f0-a7d9-bfad358c6464", "name": "Send NFC-e to SEFAZ", "provider": "nfe-br.send.nfce" }, { "id": "a9dc0e70-b652-11f0-a7d9-bfad358c6464", "name": "Set state", "provider": "silo.state", "summary": "Set state to `sent`{.state .sent}", "config": { "state": "sent" } } ], "rescue": [ { "id": "b0f7f8e0-b652-11f0-a7d9-bfad358c6464", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` You can skip this step if you're not interested in cancelling NFS-e documents. Follow one of the methods below and ensure to **Save** and **Publish** the workflow: Add to my workspace → Copy and paste into a new [Empty Invoice workflow](https://console.invopop.com/redirect/workflows/new?template=empty-invoice) code view. ```json Example Cancel NFS-e invoice workflow theme={"system"} { "name": "Cancel NFS-e invoice", "description": "Cancel an NFS-e service invoice via PlugNotas", "schema": "bill/invoice", "steps": [ { "id": "5e63dc30-535e-11f1-aba1-0fa2408cece2", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "71238320-535e-11f1-aba1-0fa2408cece2", "name": "Cancel NFS-e with Prefeitura", "provider": "nfe-br.cancel.nfse" }, { "id": "65aa8020-535e-11f1-aba1-0fa2408cece2", "name": "Set state", "provider": "silo.state", "summary": "Set state to `void`{.state .void}", "config": { "state": "void" } } ], "rescue": [ { "id": "6b3199c0-535e-11f1-aba1-0fa2408cece2", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` You can skip this step if you're not interested in cancelling NF-e documents. Follow one of the methods below and ensure to **Save** and **Publish** the workflow: Add to my workspace → Copy and paste into a new [Empty Invoice workflow](https://console.invopop.com/redirect/workflows/new?template=empty-invoice) code view. ```json Example Cancel NF-e invoice workflow theme={"system"} { "name": "Cancel NF-e invoice", "description": "Cancel an NF-e product invoice via PlugNotas", "schema": "bill/invoice", "steps": [ { "id": "7b40e24a-0c51-4462-b3e9-d2d20d424a0d", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "834e52d6-d50a-4340-9ca6-f07557aa94d5", "name": "Cancel NF-e with SEFAZ", "provider": "nfe-br.cancel.nfe" }, { "id": "ddfb8e79-8260-4ecd-bf60-115e837cd135", "name": "Set state", "provider": "silo.state", "summary": "Set state to `void`{.state .void}", "config": { "state": "void" } } ], "rescue": [ { "id": "169c4b15-83ae-4243-b0c9-4e4915d15361", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` You can skip this step if you're not interested in cancelling NFC-e documents. Follow one of the methods below and ensure to **Save** and **Publish** the workflow: Add to my workspace → Copy and paste into a new [Empty Invoice workflow](https://console.invopop.com/redirect/workflows/new?template=empty-invoice) code view. ```json Example Cancel NFC-e invoice workflow theme={"system"} { "name": "Cancel NFC-e invoice", "description": "Cancel an NFC-e consumer invoice via PlugNotas", "schema": "bill/invoice", "steps": [ { "id": "5e63dc30-535e-11f1-aba1-0fa2408cece2", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } }, { "id": "71238320-535e-11f1-aba1-0fa2408cece2", "name": "Cancel NFC-e with SEFAZ", "provider": "nfe-br.cancel.nfce" }, { "id": "65aa8020-535e-11f1-aba1-0fa2408cece2", "name": "Set state", "provider": "silo.state", "summary": "Set state to `void`{.state .void}", "config": { "state": "void" } } ], "rescue": [ { "id": "6b3199c0-535e-11f1-aba1-0fa2408cece2", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` ## Running In this section, we'll provide details on how to issue invoices on behalf of a registered supplier, and how to cancel them. As usual, the recommended approach for running jobs is to perform two steps; first upload the document to the [silo](/api-ref/silo/entries/create-an-entry-put), second [create a job](/api-ref/transform/jobs/create-a-job-put). All operations described in the following sections can be performed manually via the Invopop Console, or programmatically via the API. The process is essentially the same in both cases, so we'll demonstrate the manual method for this guide. ### Send invoices The following examples are of example [GOBL](https://docs.gobl.org) documents you can copy and paste directly into the [Invopop Console](https://console.invopop.com) or store via the API as silo entries. Then, you must run the appropriate issue workflow created during setup — "DF-e issue service invoice (NFS-e)", "DF-e issue product invoice (NF-e)", or "DF-e issue consumer invoice (NFC-e)" — over them. In the sandbox environment, you'll notice that executing the workflow will always result in the same PDF and XML being attached to the silo entry. These are mock-up files returned by the sandbox environment for testing purposes. In production, the actual XML file sent to the tax authority and the actual PDF generated will be attached to the silo entry. In this example, we're issuing a simple service invoice (NFS-e) from a Brazilian supplier to another Brazilian business customer. Notice: * we've added the [`br-nfse-v1`](https://docs.gobl.org/addons/br-nfse-v1) addon; this ensures the document will be validated using the NFS-e rules built into the [GOBL](https://docs.gobl.org) library, * extensions (`ext`) and identities have been used in multiple locations for fields whose values cannot be determined any other way, * ISS percentage is provided explicitly as it varies depending on the municipality and type of service, * there are no totals or calculations; all these will be made automatically when uploading, and, * make sure to process it with the "DF-e issue service invoice (NFS-e)" workflow created during setup. ```json B2B Service Invoice (NFS-e) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "br-nfse-v1" ], "series": "XXBR", "supplier": { "name": "TechNova Soluções Digitais Ltda.", "tax_id": { "country": "BR", "code": "05229829000184" }, "identities": [ { "key": "br-nfse-municipal-reg", "code": "45678901234567" } ], "addresses": [ { "num": "101", "street": "Avenida Paulista", "locality": "Bela Vista", "region": "São Paulo", "state": "SP", "code": "01311-000", "country": "BR" } ], "emails": [ { "addr": "contact@technova.test" } ], "ext": { "br-ibge-municipality": "3550308", "br-nfse-simples": "1" } }, "customer": { "name": "Construforte Engenharia Ltda.", "tax_id": { "country": "BR", "code": "46602178000103" }, "addresses": [ { "num": "75", "street": "Avenida Sete de Setembro", "street_extra": "Bloco C", "locality": "Centro", "region": "Salvador", "state": "BA", "code": "40060-000", "country": "BR" } ] }, "lines": [ { "quantity": "15", "item": { "name": "Consultancy Services", "price": "100.00", "ext": { "br-nfse-cnae": "62.01-5-01", "br-nfse-service": "10.5" } }, "taxes": [ { "cat": "ISS", "percent": "15%" } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "BR", "$addons": [ "br-nfse-v1" ], "type": "standard", "series": "XXBR", "issue_date": "2026-07-08", "currency": "BRL", "supplier": { "name": "TechNova Soluções Digitais Ltda.", "tax_id": { "country": "BR", "code": "05229829000184" }, "identities": [ { "key": "br-nfse-municipal-reg", "code": "45678901234567" } ], "addresses": [ { "num": "101", "street": "Avenida Paulista", "locality": "Bela Vista", "region": "São Paulo", "state": "SP", "code": "01311-000", "country": "BR" } ], "emails": [ { "addr": "contact@technova.test" } ], "ext": { "br-ibge-municipality": "3550308", "br-nfse-fiscal-incentive": "2", "br-nfse-simples": "1" } }, "customer": { "name": "Construforte Engenharia Ltda.", "tax_id": { "country": "BR", "code": "46602178000103" }, "addresses": [ { "num": "75", "street": "Avenida Sete de Setembro", "street_extra": "Bloco C", "locality": "Centro", "region": "Salvador", "state": "BA", "code": "40060-000", "country": "BR" } ] }, "lines": [ { "i": 1, "quantity": "15", "item": { "name": "Consultancy Services", "price": "100.00", "ext": { "br-nfse-cnae": "62.01-5-01", "br-nfse-service": "10.5" } }, "sum": "1500.00", "taxes": [ { "cat": "ISS", "percent": "15%", "ext": { "br-nfse-iss-liability": "1" } } ], "total": "1500.00" } ], "totals": { "sum": "1500.00", "total": "1500.00", "taxes": { "categories": [ { "code": "ISS", "informative": true, "rates": [ { "ext": { "br-nfse-iss-liability": "1" }, "base": "1500.00", "percent": "15%", "amount": "225.00" } ], "amount": "225.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "1500.00", "payable": "1500.00" } } ``` In this example, we're issuing a simple service invoice (NFS-e) with the currently supported RTC (Tax Reform) fields. Notice the differences from the previous example: * we've set the [`br-nfse-operation`](https://docs.gobl.org/addons/br-nfse-v1#operation-indicator) extension, the [`br-nfse-tax-status`](https://docs.gobl.org/addons/br-nfse-v1#tax-status-code-cst) extension and the [`br-nfse-tax-class`](https://docs.gobl.org/addons/br-nfse-v1#tax-classification-code) extension at item level which will be used to determine the IBS and CBS taxes as part of the tax reform. ```json B2B Service Invoice (NFS-e) RTC theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "br-nfse-v1" ], "series": "XXBR", "supplier": { "name": "TechNova Soluções Digitais Ltda.", "tax_id": { "country": "BR", "code": "05229829000184" }, "identities": [ { "key": "br-nfse-municipal-reg", "code": "45678901234567" } ], "addresses": [ { "num": "101", "street": "Avenida Paulista", "locality": "Bela Vista", "region": "São Paulo", "state": "SP", "code": "01311-000", "country": "BR" } ], "emails": [ { "addr": "contact@technova.test" } ], "ext": { "br-ibge-municipality": "3550308", "br-nfse-simples": "1" } }, "customer": { "name": "Construforte Engenharia Ltda.", "tax_id": { "country": "BR", "code": "46602178000103" }, "addresses": [ { "num": "75", "street": "Avenida Sete de Setembro", "street_extra": "Bloco C", "locality": "Centro", "region": "Salvador", "state": "BA", "code": "40060-000", "country": "BR" } ] }, "lines": [ { "quantity": "15", "item": { "name": "Consultancy Services", "price": "100.00", "ext": { "br-nfse-cnae": "62.01-5-01", "br-nfse-operation": "030101", "br-nfse-service": "10.5", "br-nfse-tax-class": "000001", "br-nfse-tax-status": "000" } }, "taxes": [ { "cat": "ISS", "percent": "15%" } ] } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "BR", "$addons": [ "br-nfse-v1" ], "type": "standard", "series": "XXBR", "issue_date": "2026-07-08", "currency": "BRL", "supplier": { "name": "TechNova Soluções Digitais Ltda.", "tax_id": { "country": "BR", "code": "05229829000184" }, "identities": [ { "key": "br-nfse-municipal-reg", "code": "45678901234567" } ], "addresses": [ { "num": "101", "street": "Avenida Paulista", "locality": "Bela Vista", "region": "São Paulo", "state": "SP", "code": "01311-000", "country": "BR" } ], "emails": [ { "addr": "contact@technova.test" } ], "ext": { "br-ibge-municipality": "3550308", "br-nfse-fiscal-incentive": "2", "br-nfse-simples": "1" } }, "customer": { "name": "Construforte Engenharia Ltda.", "tax_id": { "country": "BR", "code": "46602178000103" }, "addresses": [ { "num": "75", "street": "Avenida Sete de Setembro", "street_extra": "Bloco C", "locality": "Centro", "region": "Salvador", "state": "BA", "code": "40060-000", "country": "BR" } ] }, "lines": [ { "i": 1, "quantity": "15", "item": { "name": "Consultancy Services", "price": "100.00", "ext": { "br-nfse-cnae": "62.01-5-01", "br-nfse-operation": "030101", "br-nfse-service": "10.5", "br-nfse-tax-class": "000001", "br-nfse-tax-status": "000" } }, "sum": "1500.00", "taxes": [ { "cat": "ISS", "percent": "15%", "ext": { "br-nfse-iss-liability": "1" } } ], "total": "1500.00" } ], "totals": { "sum": "1500.00", "total": "1500.00", "taxes": { "categories": [ { "code": "ISS", "informative": true, "rates": [ { "ext": { "br-nfse-iss-liability": "1" }, "base": "1500.00", "percent": "15%", "amount": "225.00" } ], "amount": "225.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "1500.00", "payable": "1500.00" } } ``` In this example, we're issuing an extended product invoice (NF-e) from a Brazilian supplier to another Brazilian business customer. Notice: * we've added the [`br-nfe-v4`](https://docs.gobl.org/addons/br-nfe-v4) addon without the `simplified` tag; this sets the [`br-nfe-model`](https://docs.gobl.org/addons/br-nfe-v4#model) extension to `55` (NF-e), * the customer is required for NF-e and must include a full address; Brazilian customers must declare the [`br-ibge-municipality`](https://docs.gobl.org/addons/br-nfe-v4#municipality-code) extension and a valid state, while foreign customers can be identified by a country-qualified `identity` (e.g. a passport) instead of a `tax_id`, * supplier and customer addresses must include a `country`; it is auto-filled from the party's tax ID (or first identity that declares a country) when omitted, * each line must include a [`br-nfe-cfop`](https://docs.gobl.org/addons/br-nfe-v4#cfop-fiscal-operations-and-services-code) extension to classify the fiscal operation, * item identities carry the NCM product classification code (`cProd` in the NF-e XML) and the GTIN barcode (`cEAN`), * `item.ref` maps to the supplier's internal product code, and `item.unit` is converted to a UNECE unit code, * line `discounts` reduce the taxable base (`vDesc`); line `charges` with key `delivery` map to freight (`vFrete`) and key `insurance` to insurance value (`vSeg`), * `line.order` provides the line reference within the purchase order (`nItemPed`), * a line `notes` entry with key `goods` maps to per-item additional information (`infAdProd`), * `ordering.code` sets the purchase order number (`nPed` in `compra`) and `ordering.contracts[0].code` sets the contract number (`nCont`), * `delivery.receiver` sets a separate delivery address (`entrega`) when goods ship to a different location than the buyer's fiscal address, * the payment instructions key is set to `credit-transfer`, which causes the [`br-nfe-payment-means`](https://docs.gobl.org/addons/br-nfe-v4#payment-method) extension to be set automatically to `18` (transferência bancária), * a `general` note maps to complementary information (`infCpl`) in the NF-e XML, * tax percentages are provided explicitly as they vary depending on the state and type of goods, * there are no totals or calculations; all these will be made automatically when uploading, and, * make sure to process it with the "DF-e issue product invoice (NF-e)" workflow created during setup. ```json B2B Product Invoice (NF-e) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "br-nfe-v4" ], "series": "1", "issue_date": "2026-05-22", "tax": { "ext": { "br-nfe-model": "55", "br-nfe-presence": "2" } }, "supplier": { "name": "TechNova Soluções Digitais Ltda.", "tax_id": { "country": "BR", "code": "05229829000184" }, "identities": [ { "key": "br-nfe-state-reg", "code": "12345678901234" } ], "addresses": [ { "num": "101", "street": "Avenida Paulista", "locality": "Bela Vista", "region": "São Paulo", "state": "SP", "code": "01311-000", "country": "BR" } ], "emails": [ { "addr": "contact@technova.test" } ], "ext": { "br-ibge-municipality": "3550308" } }, "customer": { "name": "Construforte Engenharia Ltda.", "tax_id": { "country": "BR", "code": "46602178000103" }, "addresses": [ { "num": "75", "street": "Avenida Sete de Setembro", "street_extra": "Bloco C", "locality": "Centro", "region": "Salvador", "state": "BA", "code": "40060-000", "country": "BR" } ], "ext": { "br-ibge-municipality": "2927408" } }, "ordering": { "code": "PED-2026-0547", "contracts": [ { "code": "CON-2026-015" } ] }, "delivery": { "receiver": { "name": "Construforte Engenharia Ltda.", "tax_id": { "country": "BR", "code": "46602178000103" }, "addresses": [ { "num": "1200", "street": "Avenida ACM", "locality": "Caminho das Árvores", "region": "Salvador", "state": "BA", "code": "41820-014", "country": "BR" } ], "ext": { "br-ibge-municipality": "2927408" } } }, "lines": [ { "quantity": "10", "order": "1", "item": { "ref": "USB-C-2M", "name": "Cabo USB-C 2 metros", "unit": "piece", "price": "28.90", "identities": [ { "key": "ncm", "code": "85444290" }, { "key": "gtin", "code": "7891234567890" } ] }, "discounts": [ { "percent": "5%", "reason": "Desconto comercial" } ], "charges": [ { "key": "delivery", "amount": "15.00" }, { "key": "insurance", "amount": "5.00" } ], "notes": [ { "key": "goods", "text": "Cabo homologado para carregamento rápido." } ], "taxes": [ { "cat": "ICMS", "percent": "12.0%" }, { "cat": "PIS", "percent": "1.65%" }, { "cat": "COFINS", "percent": "7.60%" } ], "ext": { "br-nfe-cfop": "6102" } } ], "payment": { "instructions": { "key": "credit-transfer" } }, "notes": [ { "key": "reason", "text": "Venda de Mercadorias" }, { "key": "general", "text": "Pedido nº 2026/0547." } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "BR", "$addons": [ "br-nfe-v4" ], "type": "standard", "series": "1", "issue_date": "2026-05-22", "currency": "BRL", "tax": { "ext": { "br-nfe-model": "55", "br-nfe-operation-type": "1", "br-nfe-presence": "2", "br-nfe-purpose": "1" } }, "supplier": { "name": "TechNova Soluções Digitais Ltda.", "tax_id": { "country": "BR", "code": "05229829000184" }, "identities": [ { "key": "br-nfe-state-reg", "code": "12345678901234" } ], "addresses": [ { "num": "101", "street": "Avenida Paulista", "locality": "Bela Vista", "region": "São Paulo", "state": "SP", "code": "01311-000", "country": "BR" } ], "emails": [ { "addr": "contact@technova.test" } ], "ext": { "br-ibge-municipality": "3550308", "br-nfe-regime": "3" } }, "customer": { "name": "Construforte Engenharia Ltda.", "tax_id": { "country": "BR", "code": "46602178000103" }, "addresses": [ { "num": "75", "street": "Avenida Sete de Setembro", "street_extra": "Bloco C", "locality": "Centro", "region": "Salvador", "state": "BA", "code": "40060-000", "country": "BR" } ], "ext": { "br-ibge-municipality": "2927408" } }, "lines": [ { "i": 1, "quantity": "10", "order": "1", "item": { "ref": "USB-C-2M", "name": "Cabo USB-C 2 metros", "identities": [ { "key": "ncm", "code": "85444290" }, { "key": "gtin", "code": "7891234567890" } ], "price": "28.90", "unit": "piece" }, "sum": "289.00", "discounts": [ { "reason": "Desconto comercial", "percent": "5%", "amount": "14.45" } ], "charges": [ { "key": "delivery", "amount": "15.00" }, { "key": "insurance", "amount": "5.00" } ], "taxes": [ { "cat": "ICMS", "percent": "12.0%", "ext": { "br-nfe-icms-cst": "00", "br-nfe-icms-origin": "0" } }, { "cat": "PIS", "percent": "1.65%", "ext": { "br-nfe-pis-cst": "01" } }, { "cat": "COFINS", "percent": "7.60%", "ext": { "br-nfe-cofins-cst": "01" } } ], "total": "294.55", "notes": [ { "key": "goods", "text": "Cabo homologado para carregamento rápido." } ], "ext": { "br-nfe-cfop": "6102" } } ], "ordering": { "code": "PED-2026-0547", "contracts": [ { "code": "CON-2026-015" } ] }, "payment": { "instructions": { "key": "credit-transfer", "ext": { "br-nfe-payment-means": "18" } } }, "delivery": { "receiver": { "name": "Construforte Engenharia Ltda.", "tax_id": { "country": "BR", "code": "46602178000103" }, "addresses": [ { "num": "1200", "street": "Avenida ACM", "locality": "Caminho das Árvores", "region": "Salvador", "state": "BA", "code": "41820-014", "country": "BR" } ], "ext": { "br-ibge-municipality": "2927408" } } }, "totals": { "sum": "294.55", "total": "294.55", "taxes": { "categories": [ { "code": "ICMS", "informative": true, "rates": [ { "ext": { "br-nfe-icms-cst": "00", "br-nfe-icms-origin": "0" }, "base": "294.55", "percent": "12.0%", "amount": "35.35" } ], "amount": "35.35" }, { "code": "PIS", "informative": true, "rates": [ { "ext": { "br-nfe-pis-cst": "01" }, "base": "294.55", "percent": "1.65%", "amount": "4.86" } ], "amount": "4.86" }, { "code": "COFINS", "informative": true, "rates": [ { "ext": { "br-nfe-cofins-cst": "01" }, "base": "294.55", "percent": "7.60%", "amount": "22.39" } ], "amount": "22.39" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "294.55", "payable": "294.55" }, "notes": [ { "key": "reason", "text": "Venda de Mercadorias" }, { "key": "general", "text": "Pedido nº 2026/0547." } ] } ``` In this example, we're issuing a product invoice (NF-e) from a supplier enrolled in the *Simples Nacional* tax regime. Notice the differences from the previous example: * the supplier declares its regime with the [`br-nfe-regime`](https://docs.gobl.org/addons/br-nfe-v4#tax-regime-code) extension set to `1` (*Simples Nacional*); `4` (*MEI*) behaves the same, while `2` (*Simples Nacional, Excess*) uses CST codes like the normal regime (`3`, the default), * each ICMS line carries the [`br-nfe-icms-csosn`](https://docs.gobl.org/addons/br-nfe-v4#icms-simples-nacional-status-code-csosn) extension (here `101`, taxed with credit permission) instead of the `br-nfe-icms-cst` code that normal-regime issuers use, * with CSOSN `101` the ICMS `percent` is not a charged tax: it represents the *Simples Nacional* credit rate (`pCredSN` in the NF-e XML) and the resulting amount becomes the credit value the buyer may take (`vCredICMSSN`), * CSOSN `101` transfers a tax credit and is only accepted when the customer is an ICMS taxpayer, so the customer includes a `br-nfe-state-reg` identity with its state registration number, * PIS and COFINS are still required on every line but are not levied per item under *Simples Nacional*, so they use the [`br-nfe-pis-cst`](https://docs.gobl.org/addons/br-nfe-v4#pis-tax-status-code-cst) and [`br-nfe-cofins-cst`](https://docs.gobl.org/addons/br-nfe-v4#cofins-tax-status-code-cst) extensions set to `49` (other operations) at a `0%` rate, * there are no totals or calculations; all these will be made automatically when uploading, and, * make sure to process it with the "DF-e issue product invoice (NF-e)" workflow created during setup. ```json B2B Product Invoice — Simples Nacional (NF-e) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "br-nfe-v4" ], "series": "1", "tax": { "ext": { "br-nfe-presence": "1" } }, "supplier": { "name": "Marcenaria Arte & Design ME", "tax_id": { "country": "BR", "code": "21586733000120" }, "identities": [ { "key": "br-nfe-state-reg", "code": "0623458900" } ], "addresses": [ { "num": "85", "street": "Rua dos Artesãos", "locality": "Savassi", "region": "Minas Gerais", "state": "MG", "code": "30140-071", "country": "BR" } ], "emails": [ { "addr": "contato@artedesign.com.br" } ], "ext": { "br-ibge-municipality": "3106200", "br-nfe-regime": "1" } }, "customer": { "name": "Comércio de Móveis Paulista Ltda.", "tax_id": { "country": "BR", "code": "33944792000101" }, "identities": [ { "key": "br-nfe-state-reg", "code": "112233445566" } ], "addresses": [ { "num": "742", "street": "Avenida Paulista", "locality": "Bela Vista", "region": "São Paulo", "state": "SP", "code": "01310-100", "country": "BR" } ], "ext": { "br-ibge-municipality": "3550308" } }, "lines": [ { "quantity": "5", "item": { "name": "Mesa de Jantar em Madeira Maciça", "price": "900.00", "identities": [ { "key": "ncm", "code": "94036000" } ] }, "taxes": [ { "cat": "ICMS", "percent": "2.56%", "ext": { "br-nfe-icms-csosn": "101" } }, { "cat": "PIS", "percent": "0%", "ext": { "br-nfe-pis-cst": "49" } }, { "cat": "COFINS", "percent": "0%", "ext": { "br-nfe-cofins-cst": "49" } } ], "ext": { "br-nfe-cfop": "6102" } } ], "payment": { "instructions": { "key": "credit-transfer" } }, "notes": [ { "key": "reason", "text": "Venda de mercadoria" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "BR", "$addons": [ "br-nfe-v4" ], "type": "standard", "series": "1", "issue_date": "2026-07-28", "currency": "BRL", "tax": { "ext": { "br-nfe-model": "55", "br-nfe-operation-type": "1", "br-nfe-presence": "1", "br-nfe-purpose": "1" } }, "supplier": { "name": "Marcenaria Arte \u0026 Design ME", "tax_id": { "country": "BR", "code": "21586733000120" }, "identities": [ { "key": "br-nfe-state-reg", "code": "0623458900" } ], "addresses": [ { "num": "85", "street": "Rua dos Artesãos", "locality": "Savassi", "region": "Minas Gerais", "state": "MG", "code": "30140-071", "country": "BR" } ], "emails": [ { "addr": "contato@artedesign.com.br" } ], "ext": { "br-ibge-municipality": "3106200", "br-nfe-regime": "1" } }, "customer": { "name": "Comércio de Móveis Paulista Ltda.", "tax_id": { "country": "BR", "code": "33944792000101" }, "identities": [ { "key": "br-nfe-state-reg", "code": "112233445566" } ], "addresses": [ { "num": "742", "street": "Avenida Paulista", "locality": "Bela Vista", "region": "São Paulo", "state": "SP", "code": "01310-100", "country": "BR" } ], "ext": { "br-ibge-municipality": "3550308" } }, "lines": [ { "i": 1, "quantity": "5", "item": { "name": "Mesa de Jantar em Madeira Maciça", "identities": [ { "key": "ncm", "code": "94036000" } ], "price": "900.00" }, "sum": "4500.00", "taxes": [ { "cat": "ICMS", "percent": "2.56%", "ext": { "br-nfe-icms-csosn": "101", "br-nfe-icms-origin": "0" } }, { "cat": "PIS", "percent": "0%", "ext": { "br-nfe-pis-cst": "49" } }, { "cat": "COFINS", "percent": "0%", "ext": { "br-nfe-cofins-cst": "49" } } ], "total": "4500.00", "ext": { "br-nfe-cfop": "6102" } } ], "payment": { "instructions": { "key": "credit-transfer", "ext": { "br-nfe-payment-means": "18" } } }, "totals": { "sum": "4500.00", "total": "4500.00", "taxes": { "categories": [ { "code": "ICMS", "informative": true, "rates": [ { "ext": { "br-nfe-icms-csosn": "101", "br-nfe-icms-origin": "0" }, "base": "4500.00", "percent": "2.56%", "amount": "115.20" } ], "amount": "115.20" }, { "code": "PIS", "informative": true, "rates": [ { "ext": { "br-nfe-pis-cst": "49" }, "base": "4500.00", "percent": "0%", "amount": "0.00" } ], "amount": "0.00" }, { "code": "COFINS", "informative": true, "rates": [ { "ext": { "br-nfe-cofins-cst": "49" }, "base": "4500.00", "percent": "0%", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "4500.00", "payable": "4500.00" }, "notes": [ { "key": "reason", "text": "Venda de mercadoria" } ] } ``` In this example, we're issuing a NF-e that fully returns the goods of a previously issued B2B product invoice — a *devolução total* under the pre-reform (pre-RTC) rules. Notice the differences from a standard product invoice: * the document `type` is `credit-note`; it keeps the [`br-nfe-v4`](https://docs.gobl.org/addons/br-nfe-v4) addon and is still issued as an NF-e, so [`br-nfe-model`](https://docs.gobl.org/addons/br-nfe-v4#fiscal-document-model-code) is derived as `55`, * a `preceding` entry references the original NF-e and carries its SEFAZ access key (*chave de acesso*) as a stamp — you can copy it from the `sefaz-key` entry in the `stamps` array of the original invoice's envelope `head`, where it was added once the tax authority authorized the document, * because this is a full return, the [`br-nfe-purpose`](https://docs.gobl.org/addons/br-nfe-v4#purpose-code) extension is set to `4` (*Goods Return*) and the [`br-nfe-operation-type`](https://docs.gobl.org/addons/br-nfe-v4#operation-type-code) extension to `0` (*Inbound / Entrada*), since the returned goods re-enter the supplier; standard invoices set these automatically to `1` (normal) and `1` (outbound), but corrective documents must set both explicitly, * no [`br-nfe-credit-note-type`](https://docs.gobl.org/addons/br-nfe-v4#credit-note-type-code) extension is used: that field only applies to post-reform IBS/CBS credit notes (those set `br-nfe-purpose` to `5`), * the line [`br-nfe-cfop`](https://docs.gobl.org/addons/br-nfe-v4#cfop-fiscal-operations-and-services-code) is a return code — `2202` (*Devolução de venda de mercadoria adquirida ou recebida de terceiros*) — mirroring the original `6102` sale but recorded as an inbound inter-state operation (CFOP starting with `2`), * the payment sets the [`br-nfe-payment-means`](https://docs.gobl.org/addons/br-nfe-v4#payment-method) extension to `90` (*No payment*), as a return does not involve a new payment, * there are no totals or calculations; all these will be made automatically when uploading, and, * make sure to process it with the "DF-e issue product invoice (NF-e)" workflow created during setup. ```json Credit Note — Full Return (NF-e) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "br-nfe-v4" ], "type": "credit-note", "series": "1", "issue_date": "2024-11-20", "tax": { "ext": { "br-nfe-presence": "1", "br-nfe-purpose": "4", "br-nfe-operation-type": "0" } }, "preceding": [ { "type": "standard", "series": "1", "code": "1", "issue_date": "2024-11-15", "stamps": [ { "prv": "sefaz-key", "val": "35241105229829000184550010000000011000000019" } ] } ], "supplier": { "name": "TechNova Soluções Digitais Ltda.", "tax_id": { "country": "BR", "code": "05229829000184" }, "identities": [ { "key": "br-nfe-state-reg", "code": "12345678901234" } ], "addresses": [ { "num": "101", "street": "Avenida Paulista", "locality": "Bela Vista", "region": "São Paulo", "state": "SP", "code": "01311-000", "country": "BR" } ], "emails": [ { "addr": "contact@technova.test" } ], "ext": { "br-ibge-municipality": "3550308" } }, "customer": { "name": "Construforte Engenharia Ltda.", "tax_id": { "country": "BR", "code": "46602178000103" }, "addresses": [ { "num": "75", "street": "Avenida Sete de Setembro", "street_extra": "Bloco C", "locality": "Centro", "region": "Salvador", "state": "BA", "code": "40060-000", "country": "BR" } ], "ext": { "br-ibge-municipality": "2927408" } }, "lines": [ { "quantity": "10", "item": { "name": "Cabo USB-C 2 metros", "price": "28.90", "identities": [ { "key": "ncm", "code": "85444290" } ] }, "taxes": [ { "cat": "ICMS", "percent": "12.0%" }, { "cat": "PIS", "percent": "1.65%" }, { "cat": "COFINS", "percent": "7.60%" } ], "ext": { "br-nfe-cfop": "2202" } } ], "payment": { "instructions": { "key": "other", "ext": { "br-nfe-payment-means": "90" } } }, "notes": [ { "key": "reason", "text": "Devolução total de mercadoria" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "BR", "$addons": [ "br-nfe-v4" ], "type": "credit-note", "series": "1", "issue_date": "2024-11-20", "currency": "BRL", "preceding": [ { "type": "standard", "issue_date": "2024-11-15", "series": "1", "code": "1", "stamps": [ { "prv": "sefaz-key", "val": "35241105229829000184550010000000011000000019" } ] } ], "tax": { "ext": { "br-nfe-model": "55", "br-nfe-operation-type": "0", "br-nfe-presence": "1", "br-nfe-purpose": "4" } }, "supplier": { "name": "TechNova Soluções Digitais Ltda.", "tax_id": { "country": "BR", "code": "05229829000184" }, "identities": [ { "key": "br-nfe-state-reg", "code": "12345678901234" } ], "addresses": [ { "num": "101", "street": "Avenida Paulista", "locality": "Bela Vista", "region": "São Paulo", "state": "SP", "code": "01311-000", "country": "BR" } ], "emails": [ { "addr": "contact@technova.test" } ], "ext": { "br-ibge-municipality": "3550308", "br-nfe-regime": "3" } }, "customer": { "name": "Construforte Engenharia Ltda.", "tax_id": { "country": "BR", "code": "46602178000103" }, "addresses": [ { "num": "75", "street": "Avenida Sete de Setembro", "street_extra": "Bloco C", "locality": "Centro", "region": "Salvador", "state": "BA", "code": "40060-000", "country": "BR" } ], "ext": { "br-ibge-municipality": "2927408" } }, "lines": [ { "i": 1, "quantity": "10", "item": { "name": "Cabo USB-C 2 metros", "identities": [ { "key": "ncm", "code": "85444290" } ], "price": "28.90" }, "sum": "289.00", "taxes": [ { "cat": "ICMS", "percent": "12.0%", "ext": { "br-nfe-icms-cst": "00", "br-nfe-icms-origin": "0" } }, { "cat": "PIS", "percent": "1.65%", "ext": { "br-nfe-pis-cst": "01" } }, { "cat": "COFINS", "percent": "7.60%", "ext": { "br-nfe-cofins-cst": "01" } } ], "total": "289.00", "ext": { "br-nfe-cfop": "2202" } } ], "payment": { "instructions": { "key": "other", "ext": { "br-nfe-payment-means": "90" } } }, "totals": { "sum": "289.00", "total": "289.00", "taxes": { "categories": [ { "code": "ICMS", "informative": true, "rates": [ { "ext": { "br-nfe-icms-cst": "00", "br-nfe-icms-origin": "0" }, "base": "289.00", "percent": "12.0%", "amount": "34.68" } ], "amount": "34.68" }, { "code": "PIS", "informative": true, "rates": [ { "ext": { "br-nfe-pis-cst": "01" }, "base": "289.00", "percent": "1.65%", "amount": "4.77" } ], "amount": "4.77" }, { "code": "COFINS", "informative": true, "rates": [ { "ext": { "br-nfe-cofins-cst": "01" }, "base": "289.00", "percent": "7.60%", "amount": "21.96" } ], "amount": "21.96" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "289.00", "payable": "289.00" }, "notes": [ { "key": "reason", "text": "Devolução total de mercadoria" } ] } ``` In this example, we're issuing a simple consumer invoice (NFC-e) from a Brazilian supplier. Notice: * we've added the [`br-nfe-v4`](https://docs.gobl.org/addons/br-nfe-v4) addon with the `simplified` tag; this sets the [`br-nfe-model`](https://docs.gobl.org/addons/br-nfe-v4#model) extension to `65` (NFC-e), * the customer is optional and in this example we've omitted it, * extensions (`ext`) and identities have been used in multiple locations for fields whose values cannot be determined any other way, * each line must include a [`br-nfe-cfop`](https://docs.gobl.org/addons/br-nfe-v4#cfop-fiscal-operations-and-services-code) extension to classify the fiscal operation, just as on an NF-e, * the payment instructions key is set to `card`, which causes the [`br-nfe-payment-means`](https://docs.gobl.org/addons/br-nfe-v4#payment-method) extension to be set automatically to `03` (cartão de crédito), * tax percentages are provided explicitly as they vary depending on the state and type of goods, * there are no totals or calculations; all these will be made automatically when uploading, and, * make sure to process it with the "DF-e issue consumer invoice (NFC-e)" workflow created during setup. ```json B2C Consumer Invoice (NFC-e) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "br-nfe-v4" ], "$tags": [ "simplified" ], "series": "123", "tax": { "ext": { "br-nfe-presence": "1" } }, "supplier": { "name": "TechNova Soluções Digitais Ltda.", "tax_id": { "country": "BR", "code": "05229829000184" }, "identities": [ { "key": "br-nfe-state-reg", "code": "12345678901234" } ], "addresses": [ { "num": "101", "street": "Avenida Paulista", "locality": "Bela Vista", "region": "São Paulo", "state": "SP", "code": "01311-000", "country": "BR" } ], "emails": [ { "addr": "contact@technova.test" } ], "ext": { "br-ibge-municipality": "3550308", "br-nfse-simples": "1" } }, "lines": [ { "quantity": "2", "item": { "name": "Cabo USB-C 2 metros", "price": "28.90" }, "taxes": [ { "cat": "ICMS", "percent": "18.0%" }, { "cat": "PIS", "percent": "1.65%" }, { "cat": "COFINS", "percent": "7.60%" } ], "ext": { "br-nfe-cfop": "5102" } } ], "payment": { "instructions": { "key": "card" } }, "notes": [ { "key": "reason", "text": "Venda de mercadoria" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "BR", "$addons": [ "br-nfe-v4" ], "$tags": [ "simplified" ], "type": "standard", "series": "123", "issue_date": "2026-07-28", "currency": "BRL", "tax": { "ext": { "br-nfe-model": "65", "br-nfe-operation-type": "1", "br-nfe-presence": "1", "br-nfe-purpose": "1" } }, "supplier": { "name": "TechNova Soluções Digitais Ltda.", "tax_id": { "country": "BR", "code": "05229829000184" }, "identities": [ { "key": "br-nfe-state-reg", "code": "12345678901234" } ], "addresses": [ { "num": "101", "street": "Avenida Paulista", "locality": "Bela Vista", "region": "São Paulo", "state": "SP", "code": "01311-000", "country": "BR" } ], "emails": [ { "addr": "contact@technova.test" } ], "ext": { "br-ibge-municipality": "3550308", "br-nfe-regime": "3", "br-nfse-simples": "1" } }, "lines": [ { "i": 1, "quantity": "2", "item": { "name": "Cabo USB-C 2 metros", "price": "28.90" }, "sum": "57.80", "taxes": [ { "cat": "ICMS", "percent": "18.0%", "ext": { "br-nfe-icms-cst": "00", "br-nfe-icms-origin": "0" } }, { "cat": "PIS", "percent": "1.65%", "ext": { "br-nfe-pis-cst": "01" } }, { "cat": "COFINS", "percent": "7.60%", "ext": { "br-nfe-cofins-cst": "01" } } ], "total": "57.80", "ext": { "br-nfe-cfop": "5102" } } ], "payment": { "instructions": { "key": "card", "ext": { "br-nfe-payment-means": "03" } } }, "totals": { "sum": "57.80", "total": "57.80", "taxes": { "categories": [ { "code": "ICMS", "informative": true, "rates": [ { "ext": { "br-nfe-icms-cst": "00", "br-nfe-icms-origin": "0" }, "base": "57.80", "percent": "18.0%", "amount": "10.40" } ], "amount": "10.40" }, { "code": "PIS", "informative": true, "rates": [ { "ext": { "br-nfe-pis-cst": "01" }, "base": "57.80", "percent": "1.65%", "amount": "0.95" } ], "amount": "0.95" }, { "code": "COFINS", "informative": true, "rates": [ { "ext": { "br-nfe-cofins-cst": "01" }, "base": "57.80", "percent": "7.60%", "amount": "4.39" } ], "amount": "4.39" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "57.80", "payable": "57.80" }, "notes": [ { "key": "reason", "text": "Venda de mercadoria" } ] } ``` In this example, we're issuing a consumer invoice (NFC-e) from a supplier enrolled in the *Simples Nacional* tax regime. Notice the differences from the previous example: * the supplier declares its regime with the [`br-nfe-regime`](https://docs.gobl.org/addons/br-nfe-v4#tax-regime-code) extension set to `1` (*Simples Nacional*), * ICMS carries the [`br-nfe-icms-csosn`](https://docs.gobl.org/addons/br-nfe-v4#icms-simples-nacional-status-code-csosn) extension set to `102` (taxed without credit permission) with a `0%` percent, * PIS and COFINS use the [`br-nfe-pis-cst`](https://docs.gobl.org/addons/br-nfe-v4#pis-tax-status-code-cst) and [`br-nfe-cofins-cst`](https://docs.gobl.org/addons/br-nfe-v4#cofins-tax-status-code-cst) extensions set to `49` (other operations) at a `0%` rate, * the line carries a [`br-nfe-cfop`](https://docs.gobl.org/addons/br-nfe-v4#cfop-fiscal-operations-and-services-code) extension set to `5102`, * all of these fields must be set explicitly (i.e., you have them in the minimal example), since the automatic defaults are the normal-regime ones: an ICMS line that omits the CSOSN fails validation, while an omitted PIS or COFINS CST silently falls back to `01`, * there are no totals or calculations; all these will be made automatically when uploading, and, * make sure to process it with the "DF-e issue consumer invoice (NFC-e)" workflow created during setup. ```json B2C Consumer Invoice — Simples Nacional (NFC-e) theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$addons": [ "br-nfe-v4" ], "$tags": [ "simplified" ], "series": "123", "tax": { "ext": { "br-nfe-presence": "1" } }, "supplier": { "name": "Drogaria Vida Saudável Ltda.", "tax_id": { "country": "BR", "code": "55263640000186" }, "identities": [ { "key": "br-nfe-state-reg", "code": "35503304557308" } ], "addresses": [ { "num": "200", "street": "Rua Primeiro de Março", "street_extra": "Torre A", "locality": "Centro", "region": "Rio de Janeiro", "state": "RJ", "code": "20010-000", "country": "BR" } ], "emails": [ { "addr": "saudemais@example.com" } ], "ext": { "br-ibge-municipality": "3304557", "br-nfe-regime": "1" } }, "lines": [ { "quantity": "2", "item": { "name": "Caixa de Máscaras Cirúrgicas", "price": "10.00" }, "taxes": [ { "cat": "ICMS", "percent": "0%", "ext": { "br-nfe-icms-csosn": "102", "br-nfe-icms-origin": "0" } }, { "cat": "PIS", "percent": "0%", "ext": { "br-nfe-pis-cst": "49" } }, { "cat": "COFINS", "percent": "0%", "ext": { "br-nfe-cofins-cst": "49" } } ], "ext": { "br-nfe-cfop": "5102" } } ], "payment": { "instructions": { "key": "card" } }, "notes": [ { "key": "reason", "text": "Venda de mercadoria" } ] } ``` ```json Built version theme={"system"} { "$schema": "https://gobl.org/draft-0/bill/invoice", "$regime": "BR", "$addons": [ "br-nfe-v4" ], "$tags": [ "simplified" ], "type": "standard", "series": "123", "issue_date": "2026-07-28", "currency": "BRL", "tax": { "ext": { "br-nfe-model": "65", "br-nfe-operation-type": "1", "br-nfe-presence": "1", "br-nfe-purpose": "1" } }, "supplier": { "name": "Drogaria Vida Saudável Ltda.", "tax_id": { "country": "BR", "code": "55263640000186" }, "identities": [ { "key": "br-nfe-state-reg", "code": "35503304557308" } ], "addresses": [ { "num": "200", "street": "Rua Primeiro de Março", "street_extra": "Torre A", "locality": "Centro", "region": "Rio de Janeiro", "state": "RJ", "code": "20010-000", "country": "BR" } ], "emails": [ { "addr": "saudemais@example.com" } ], "ext": { "br-ibge-municipality": "3304557", "br-nfe-regime": "1" } }, "lines": [ { "i": 1, "quantity": "2", "item": { "name": "Caixa de Máscaras Cirúrgicas", "price": "10.00" }, "sum": "20.00", "taxes": [ { "cat": "ICMS", "percent": "0%", "ext": { "br-nfe-icms-csosn": "102", "br-nfe-icms-origin": "0" } }, { "cat": "PIS", "percent": "0%", "ext": { "br-nfe-pis-cst": "49" } }, { "cat": "COFINS", "percent": "0%", "ext": { "br-nfe-cofins-cst": "49" } } ], "total": "20.00", "ext": { "br-nfe-cfop": "5102" } } ], "payment": { "instructions": { "key": "card", "ext": { "br-nfe-payment-means": "03" } } }, "totals": { "sum": "20.00", "total": "20.00", "taxes": { "categories": [ { "code": "ICMS", "informative": true, "rates": [ { "ext": { "br-nfe-icms-csosn": "102", "br-nfe-icms-origin": "0" }, "base": "20.00", "percent": "0%", "amount": "0.00" } ], "amount": "0.00" }, { "code": "PIS", "informative": true, "rates": [ { "ext": { "br-nfe-pis-cst": "49" }, "base": "20.00", "percent": "0%", "amount": "0.00" } ], "amount": "0.00" }, { "code": "COFINS", "informative": true, "rates": [ { "ext": { "br-nfe-cofins-cst": "49" }, "base": "20.00", "percent": "0%", "amount": "0.00" } ], "amount": "0.00" } ], "sum": "0.00" }, "tax": "0.00", "total_with_tax": "20.00", "payable": "20.00" }, "notes": [ { "key": "reason", "text": "Venda de mercadoria" } ] } ``` ### Cancel an invoice If you need to cancel a document that has already been sent to the tax authority, you can use the cancel workflows created during setup. Run the appropriate cancel workflow — NFS-e, NF-e, or NFC-e — over the silo entry you want to cancel. On success, the entry will be set to `Void`. NFS-e cancellations are subject to the rules of each municipality. Some require a specific cancellation code. NFC-e cancellations must be requested within the cancellation window set by the originating state. #### Configuration Both cancel actions accept optional parameters that control the cancellation request. They can be set as a default on the workflow step (via the step's configuration page in the Console) or overridden per job by passing them as arguments when [creating the job via the API](/api-ref/transform/jobs/create-a-job-put). | Parameter | Job argument | Applies to | Notes | | ------------------- | ---------------------- | ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | | Cancellation reason | `nfe-br-cancel-reason` | NFS-e, NF-e, and NFC-e | Free-text reason for the cancellation. For NF-e and NFC-e, must be at least 15 characters if provided. Defaults to the system default when omitted. | | Cancellation code | `nfe-br-cancel-code` | NFS-e only | Municipality-specific cancellation code, for example `9` for "Outros" in the National NFS-e system. Defaults to the system default when omitted. | Job arguments take precedence over the step configuration. To pass them when creating a job via the API: ```json theme={"system"} { "workflow_id": "...", "silo_entry_id": "...", "args": { "nfe-br-cancel-reason": "Cancelamento a pedido do Prestador", "nfe-br-cancel-code": "9" } } ``` ## FAQ Invopop supports NF-e, NFS-e and NFC-e documents. Transport documents (MDF-e and CT-e) are not currently supported. For further details on how GOBL prepares data for conversion, see: * The [Brazil Regime GOBL Reference](https://docs.gobl.org/regimes/br). * The [NFS-e Addon GOBL Reference](https://docs.gobl.org/addons/br-nfse-v1). * The [NF-e Addon GOBL Reference](https://docs.gobl.org/addons/br-nfe-v4). More available in our [Brazil FAQ](/faq/brazil) section *** | | | | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Compliance | [Invoicing compliance in Brazil](/compliance/brazil)
[Compliance timeline](/timelines/brazil) | | Apps | [Documentos Fiscais Eletrônicos Brazil](/apps/documentos-fiscais-electronicos-brazil) | | Guides | [Supplier registration](/guides/br-dfe-supplier)
[Issuing invoices](/guides/br-dfe) | | FAQ | [Brazil FAQ](/faq/brazil) | | GOBL | [Brazil Tax Regime](https://docs.gobl.org/regimes/br)
[Brazil NF-e Addon](https://docs.gobl.org/addons/br-nfe-v4)
[Brazil NFS-e Addon](https://docs.gobl.org/addons/br-nfse-v1) |
Ask and answer questions about invoicing in Brazil → # DF-e supplier registration guide Source: https://docs.invopop.com/guides/br-dfe-supplier Register suppliers to issue Documentos Fiscais Eletrônicos in Brazil. ## Introduction Before a supplier can issue electronic fiscal documents in Brazil — service invoices (NFS-e), product invoices (NF-e), or consumer invoices (NFC-e) — they must be registered with Invopop's local partner, PlugNotas, who authenticates the supplier with the corresponding tax authority. In this guide you'll learn how to register a supplier using the [Documentos Fiscais Eletrônicos Brazil app](/apps/documentos-fiscais-electronicos-brazil), and how to unregister them when they should no longer issue documents from your workspace. Once a supplier is registered, continue with the companion guide: [Brazil: Issuing invoices](/guides/br-dfe). | - | Sandbox | Live | | ---------------- | -------------------------------------------------------- | ----------------------------- | | **Supplier** | Registration required, but details don't need to be real | Real company details required | | **Certificates** | Not required to be valid | Must be valid and real | ## Prerequisites To register a supplier in Brazil, you will need: * Supplier details, including: * name, * CNPJ (*Cadastro Nacional da Pessoa Jurídica*), * address, * municipality code (IBGE), * municipal registration number (for NFS-e), * state registration number (for NF-e and NFC-e), * whether the supplier opts into the *Simples Nacional* tax regime, * whether the supplier benefits from a fiscal incentive, and, * optionally, any special tax regime (MEI, estimated, coop…) the supplier is subject to. * A certificate and password accepted by the municipality (for NFS-e) or the state (for NF-e and NFC-e) to send electronic fiscal documents in the name of the supplier. ## Setup There are three key processes to prepare: * connect the **Documentos Fiscais Eletrônicos Brazil** app, * create the supplier registration workflow, and, * configure the supplier post-registration workflow. These instructions apply to both the sandbox and live environments. Please note that the sandbox environment is simulated, and most responses are mocked. You'll still need to register suppliers in the sandbox, but the company details, certificates or passwords don't need to be valid or real. All of the following steps must be carried out from the [Invopop Console](https://console.invopop.com). Enter the **Configuration** section, then tap **Apps**. Tap on the **Connect** button of the **Documentos Fiscais Eletrônicos Brazil** app. DF-e Brazil App Follow one of the methods below and ensure to **Save** and **Publish** the workflow: Add to my workspace → Copy and paste into a new [Empty Party workflow](https://console.invopop.com/redirect/workflows/new?template=empty-party) code view. ```json Example NFC/NFS-e register supplier workflow theme={"system"} { "name": "NFC/NFS-e register supplier", "description": "Register a supplier to issue NFC/NFS-e in Brazil", "schema": "org/party", "steps": [ { "id": "68e5abd0-b64b-11f0-8ddf-b9fd6fa99d97", "name": "Sign envelope", "provider": "silo.close" }, { "id": "6f0a6500-b64b-11f0-8ddf-b9fd6fa99d97", "name": "Register supplier in Brazil", "provider": "nfe-br.register" }, { "id": "71918510-b64b-11f0-8ddf-b9fd6fa99d97", "name": "Set state", "provider": "silo.state", "summary": "Set state to `processing`{.state .processing}", "config": { "state": "processing" } } ], "rescue": [ { "id": "7d127750-b64b-11f0-8ddf-b9fd6fa99d97", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` Follow one of the methods below and ensure to **Save** and **Publish** the workflow: Add to my workspace → Copy and paste into a new [Empty Party workflow](https://console.invopop.com/redirect/workflows/new?template=empty-party) code view. ```json Example Brazil supplier post-registration workflow theme={"system"} { "name": "Brazil supplier post-registration", "description": "Mark a supplier as registered", "schema": "org/party", "steps": [ { "id": "ec727530-b648-11f0-8ddf-b9fd6fa99d97", "name": "Set state", "provider": "silo.state", "summary": "Set state to `registered`{.state .registered}", "config": { "state": "registered" } } ], "rescue": [ { "id": "9a7b3d50-1358-11ef-af96-a18cfb3774fa", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` This workflow will automatically be executed once a supplier completes the registration process. You can customize it to suit your needs (*e.g.*, adding a webhook, or an email notification after a supplier has been registered.) Now you need to go back to **Configuration** > **Apps**, tap the **Configure** button on the **Documentos Fiscais Eletrônicos Brazil** app, choose the "Post-registration workflow" we just created and **Save** the changes. ## Register a supplier All operations described in this section can be performed manually via the Invopop Console, or programmatically via the API. The process is essentially the same in both cases, so we'll demonstrate the manual method for this guide. Find the **Parties** section of the sidebar and click **Suppliers**. Tap the **+ New Supplier** button to be presented with a new editor. Copy and paste the example provided below (for testing purposes only, in production you'll need the details of an actual company). The example includes all the fields required to register a supplier for both NF-e/NFC-e and NFS-e issuance. ```json Brazil supplier example for sandbox expandable theme={"system"} { "$schema": "https://gobl.org/draft-0/org/party", "name": "TechNova Soluções Digitais Ltda.", "tax_id": { "country": "BR", "code": "05229829000184" }, "identities": [ { "key": "br-nfse-municipal-reg", "code": "45678901234567" }, { "key": "br-nfe-state-reg", "code": "66093885154234" } ], "addresses": [ { "num": "101", "street": "Avenida Paulista", "locality": "Bela Vista", "region": "São Paulo", "state": "SP", "code": "01311-000", "country": "BR" } ], "emails": [ { "addr": "contact@technova.test" } ], "ext": { "br-ibge-municipality": "3550308", "br-nfse-simples": "1", "br-nfse-fiscal-incentive": "2", "br-nfse-special-regime": "6", "br-nfe-regime": "1", "br-nfe-fiscal-incentive": "2", "br-nfe-special-regime": "6" } } ``` The `br-nfse-` identities and extensions configure service invoices (NFS-e), while the `br-nfe-` ones configure product and consumer invoices (NF-e/NFC-e) — omit the family the supplier won't issue. See the [`br-nfse-v1`](https://docs.gobl.org/addons/br-nfse-v1) and [`br-nfe-v4`](https://docs.gobl.org/addons/br-nfe-v4) addons for the possible values. Tap **Build**, ensure there are no errors, and click **Save**. We should now see the document. Find and click the **Select Workflow** button. Select the **Register Supplier** workflow created during setup, and click **Run workflow**. The execution should be successful, and the silo entry will now be in the `Processing` state. Tap the **Meta** tab to see the registration link: Supplier Registration Link You can access the registration link via the API by [fetching the silo entry](/api-ref/silo/entries/fetch-an-entry) and reading the `meta` row where the `key` is set to `registration-link`. Tap the registration link. A new browser window will open with a form to upload the supplier's credentials. Note that this form can be shared directly with the supplier, if necessary. Supplier Registration Form The details from this form are sent securely to Invopop's local partner, PlugNotas, who will use them to authenticate the supplier in the corresponding tax authority. The supplier must ensure that the certificate and password are valid and accepted by the municipality or state where they operate. Once the form is submitted, the supplier will be registered, and the post-registration workflow will be executed, changing the supplier's state to `Registered`. From this point on, you can send invoices on behalf of the supplier. Head over to the [DF-e issuing invoices guide](/guides/br-dfe) to continue. ## Unregister a supplier Unregistering a supplier revokes their invoice issuing privileges from your workspace. You might need to unregister an entity because the supplier is no longer your client or because of a change in their Tax ID. To do so, use the following workflow template: Add to my workspace → Copy and paste into a new [Empty Party workflow](https://console.invopop.com/redirect/workflows/new?template=empty-party) code view. ```json Example NFC/NFS-e unregister supplier workflow theme={"system"} { "name": "NFC/NFS-e unregister supplier", "description": "Unregister a supplier from issuing NFC/NFS-e in Brazil", "schema": "org/party", "steps": [ { "id": "1b9bfd47-701c-4834-b219-dc58da8cf51b", "name": "Unregister supplier in Brazil", "provider": "nfe-br.unregister" }, { "id": "710ca93c-7f2e-4999-9209-ae358d5dbad0", "name": "Set state", "provider": "silo.state", "summary": "Set state to `void`{.state .void}", "config": { "state": "void" } } ], "rescue": [ { "id": "2c1f292c-7bd5-4588-971f-8adeb12ade7a", "name": "Set state", "provider": "silo.state", "summary": "Set state to `error`{.state .error}", "config": { "state": "error" } } ] } ``` ## FAQ Upload the supplier's A1 digital certificate (PFX or P12) plus password through the registration workflow. Invopop validates it against the relevant SEFAZ or municipal endpoint and activates the supplier for issuing. A1 certificates (X.509 + private key, exported as PKCS#12) and their passwords are stored encrypted. Invopop uses them to sign documents and authenticate to the relevant SEFAZ or municipal endpoint on the supplier's behalf. More available in our [Brazil FAQ](/faq/brazil) section *** | | | | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Compliance | [Invoicing compliance in Brazil](/compliance/brazil)
[Compliance timeline](/timelines/brazil) | | Apps | [Documentos Fiscais Eletrônicos Brazil](/apps/documentos-fiscais-electronicos-brazil) | | Guides | [Supplier registration](/guides/br-dfe-supplier)
[Issuing invoices](/guides/br-dfe) | | FAQ | [Brazil FAQ](/faq/brazil) | | GOBL | [Brazil Tax Regime](https://docs.gobl.org/regimes/br)
[Brazil NF-e Addon](https://docs.gobl.org/addons/br-nfe-v4)
[Brazil NFS-e Addon](https://docs.gobl.org/addons/br-nfse-v1) |
Ask and answer questions about invoicing in Brazil → # Chargebee in Belgium Source: https://docs.invopop.com/guides/cb-belgium Send compliant Peppol e-invoices from Chargebee to Belgian customers Belgium uses the Peppol network for e-invoicing, which became mandatory in January 2026. The format used is Peppol BIS Billing UBL — the standard Peppol format — with one important Belgian-specific requirement: **customers always expect to receive a PDF alongside the XML**. To handle this, the workflow first downloads the existing Chargebee PDF and attaches it to the UBL document before sending it through Peppol. This guide assumes you have already connected the Chargebee app and completed the general setup — see the [Chargebee overview](/guides/chargebee) first if you haven't. **Required apps:** [Peppol](/apps/peppol), [OASIS UBL](/apps/oasis-ubl) Before processing any invoices, you must register your supplier on the Peppol network through Invopop. See the [Peppol guide](/guides/peppol) for registration steps, and the [Belgium Peppol guide](/guides/be-peppol) for Belgium-specific details.