Overview
Theinvoice.created event is sent every time an invoice document is issued in BookingShake. This covers all invoice document types: standard invoices, deposit invoices, balance invoices, and credit notes.
The legal invoice is immutable once issued - its amounts, lines, and seller / account / contact snapshots are frozen - so there is no invoice.updated or invoice.deleted event. A legal correction is always materialized by a new document (typically a credit note), which triggers its own invoice.created event. The only writable part of an invoice is its free-form metadata (integration key/value pairs); updating it is a silent side-channel write that emits no webhook.
Quotes do not trigger this event. Global invoices (issued across multiple bookings at once) are also excluded.
- Sync invoices to your accounting software or ERP
- Archive legal documents in your own document management system
- Track revenue in real-time across venues
- Feed e-invoicing pipelines (the payload is aligned with EN 16931 semantics)
Conventions
The invoice payload follows strict conventions, shared with payment events:| Convention | Rule |
|---|---|
| Amounts | Always integer cents (e.g., 150000 = €1,500.00) |
| Dates | YYYY-MM-DD strings, in the Europe/Paris timezone |
| Timestamps | Unix milliseconds |
| Missing values | Explicit null, never omitted |
Invoice Types
Thetype field identifies the document type. type_code carries the corresponding UNTDID 1001 code used in e-invoicing standards:
type | type_code | Description |
|---|---|---|
invoice | 380 | Standard invoice |
deposit_invoice | 386 | Deposit (down payment) invoice |
balance_invoice | 380 | Balance invoice, issued after one or more deposits |
credit_note | 381 | Credit note on a standard invoice |
deposit_credit_note | 503 | Credit note on a deposit invoice |
balance_credit_note | 381 | Credit note on a balance invoice |
type_code follows UNTDID 1001 (BT-3 in EN 16931, the basis of the French e-invoicing reform). This coding is broader than our internal types, so several type values legitimately share the same code. Only the deposit invoice has a dedicated code (386); a balance invoice is a standard invoice (380) that references the deposits, consistent with the B4/S4/M4 framework. Credit notes use 381, except a credit note on a deposit invoice which uses 503.Payload Example
Data Fields
General
| Field | Type | Description |
|---|---|---|
id | string | Unique invoice document ID |
number | string | Invoice number as printed on the PDF |
type | string | Document type (see Invoice Types) |
type_code | number | UNTDID 1001 document type code (380, 386, 381, or 503) |
status | string | null | ongoing, paid, or canceled |
title | string | null | Title of the related booking |
language | string | null | Language the document was issued in (e.g., fr, en). null when no language was frozen on the document; in that case line labels fall back to French |
currency | string | Always EUR |
created_at | number | null | Issue timestamp, Unix milliseconds |
due_date | string | null | Payment due date, YYYY-MM-DD |
service_start_date | string | null | Start of the service period, YYYY-MM-DD |
service_end_date | string | null | End of the service period, YYYY-MM-DD |
purchase_order_number | string | null | Buyer’s purchase order reference, if provided |
pdf_url | string | null | URL of the generated PDF document |
Amounts
All amounts are integer cents, and are always the amounts of the document itself: a balance invoice carries the balance amount, not the total of the full service.| Field | Type | Description |
|---|---|---|
amount_excl_tax | number | Total excluding tax of this document |
amount_incl_tax | number | Total including tax of this document |
taxable_breakdown | object | Taxable base per VAT rate for this document: { "20": 175000 } (key = rate in %, value = cents) |
tax_breakdown | object | Tax amount per VAT rate, same shape |
global_discount_excl_tax | number | Global discount excluding tax applied to the document (0 if none). It is not distributed into the lines |
On a balance invoice, the total of the full service can be recomposed as
amount_incl_tax + sum(deposit_invoices[].amount_incl_tax). The deposits deducted from the balance are itemized in deposit_invoices and appear as negative deduction lines in lines.Lines
lines contains the invoice line items as printed on the PDF, self-consistent with the document totals: sum(lines[].total_excl_tax) - global_discount_excl_tax = amount_excl_tax (within rounding).
Per document type:
- Deposit invoice: the deposit lines (one per VAT rate), not the lines of the underlying quote.
- Balance invoice: the full service lines, followed by one negative deduction line per deposit invoice and VAT rate (e.g.,
Déduction acompte FAC-2026-0021 (TVA 20%)with a negativetotal_excl_tax). - Credit notes: same line structure as the document type they cancel.
| Field | Type | Description |
|---|---|---|
name | string | null | Line label (EN16931 BT-153). Product title; for accommodation, the categories/occupancies label; for deposit and deduction lines, a generated label. Localized to the invoice language (falls back to French). null only if no label can be resolved |
description | string | null | Free-text line description as entered on the product/room and printed on the PDF (EN16931 BT-154). Localized to the invoice language (falls back to French). null when the line has none, and for aggregated and deduction lines |
accounting_code | string | null | Accounting code of the line, inherited from the product’s accounting tag at generation time. null for aggregated and deposit-deduction lines |
quantity | string | Decimal string (e.g., "25.00") |
unit | string | null | Unit of measure, when applicable (e.g., day for accommodation lines) |
unit_price_excl_tax | number | Unit price excluding tax, in cents, before discount |
discount | number | Total line discount, in cents (0 if none) |
tax_rate | string | VAT rate as decimal string (e.g., "20.00") |
total_excl_tax | number | Line net amount in cents: quantity × unit_price_excl_tax − discount |
Relations
| Field | Type | Description |
|---|---|---|
booking_id | string | null | Opaque correlation key of the booking: all invoices and payments of the same booking share the same value |
quote_id | string | null | ID of the quote this invoice was generated from |
linked_invoice_id | string | null | For credit notes: ID of the corrected invoice |
deposit_invoices | array | For balance invoices: prior deposit invoices, each with id, number, date, amount_incl_tax |
account_id | string | null | ID of the buyer account (company) |
contact_id | string | null | ID of the buyer contact |
Seller, Account, and Contact Blocks
seller (your venue), account (the buyer company), and contact (the buyer contact) are frozen snapshots captured when the invoice was issued. They reflect the legal mentions printed on the PDF and will not change if the live account or contact is later edited.
Field names are aligned with the account.* and contact.* events: a consumer sees the same account format across all event types.
Fields specific to these blocks:
| Field | Block | Description |
|---|---|---|
country_code | all | Country normalized to ISO 3166-1 alpha-2 (e.g., FR), or null when it cannot be resolved. country stays verbatim as entered. |
billing_country_code | account | Same normalization for the billing country |
iban | seller | Bank account printed on the invoice |
share_capital | seller | Share capital legal mention, verbatim |
peppol_id | account | Peppol participant ID for e-invoicing routing. Unlike the rest of the block, this is always read live (routing data, not a frozen legal mention). |
Any of the three blocks can be
null if the corresponding entity was not set on the booking (e.g., account is null for an individual customer without a company).Next Steps
Payment Events
Track payments with the payment.created, updated, and deleted events
Security & Verification
Verify webhook signatures before processing
