When Zeppol invoices an order
Not every order is owed an e-invoice, and an app that tried to issue one for all of them would be wrong more often than right. This page is the rule Zeppol actually follows.
Which orders are in scope
Zeppol invoices B2B orders inside the EU VAT area. An order qualifies when the buyer is identifiable as a business, which in practice means a company name and a VAT number on the order or the customer record.
Three kinds of order are deliberately passed over, and are marked as skipped rather than failed:
- Consumer sales. A private individual is owed a receipt, not a structured B2B e-invoice.
- Non-EU exports. Outside the EU VAT area is outside the scope of both Peppol and the mandates.
- Refunds. A refund is a credit note, which this version does not issue automatically.
Skipped and blocked are kept apart on purpose. Skipped means no invoice was owed and nothing is waiting on you. Blocked means one was owed and something stopped it. Those are opposite facts, and an app that renders them the same way is hiding the one that matters.
The three triggers
You choose one, and it applies to every order. The default is paid.
| Trigger | Fires when | Worth knowing |
|---|---|---|
| Created | The order appears in Shopify | Earliest possible invoice. The supply date is usually not known yet. |
| Paid | Shopify marks the order paid | The default, and the right answer for most stores. |
| Fulfilled | The order is fulfilled | The supply date is known, so one class of block disappears entirely. |
German law requires the invoice to carry the date the goods or services were supplied, and Zeppol reads that date from fulfilment. On the created and paid triggers an order that has not shipped yet can therefore stop with a missing supply date. Fulfil the order and re-run it, or move the trigger to fulfilment.
Reviewing before it sends
You can hold invoices for your own approval before anything leaves, either permanently or for the first few while you build confidence. A held invoice has passed the checks and is waiting on you, which is different again from being blocked.
Invoice numbers
The number is one of the two things Zeppol owns outright, the archive being the other, and it is the field a tax auditor reaches for first.
- Continuous, with no annual reset. The year is not part of the key.
- Assigned once, at the moment the invoice is approved, which is after every check has passed and before the document is built. §14(4) Nr. 4 UStG requires exactly that.
- Blocked, held and skipped invoices consume no number. A number parked in an invoice that may never be issued is a gap with no end date.
- Credit notes run their own series, because a credit note is a different document type and mixing the two makes neither continuous.
- Every gap carries a stored reason. German tax authorities accept gaps a taxpayer can explain; they do not accept holes nobody can account for.
The prefix is yours to choose when you set up, and locks once the first number is issued. A sequence you can renumber is not a sequence.
Sending the same invoice twice
Zeppol will not do it by itself. Webhooks and jobs are deduplicated on stable keys, so a Shopify webhook arriving twice produces one invoice. Where that guarantee stops is at the Access Point, and that is covered under how an invoice leaves.
Something missing here?
Write to me. Anything asked more than once ends up on this page.