Skip to main content

Webhook Events

faktoora sends HTTP POST requests to your registered endpoint whenever various document events occur. Below is the official event specification, detailing each event name (action or status) and its trigger.

EventTrigger
invoiceCreateOutgoing invoice created (backend-worker event)
invoiceOverdueCron job marks invoice as overdue
invoiceSentInvoice sent via email
invoiceIncomingCreateIncoming invoice first created or validated (email/API)
invoiceIncomingSentIncoming invoice forwarded via email
offerCreateQuotation (offer) created (backend-worker event)
offerSentQuotation sent via email
letterCreateLetter document created (backend-worker event)
letterSentLetter sent via email
reminderCreateReminder (dunning notice) created (backend-worker event)
reminderSentReminder sent via email
orderConfirmationCreateOrder confirmation created (backend-worker event)
orderConfirmationSentOrder confirmation sent
customerCreateCustomer created
productCreateProduct created

Managing Webhooks

Register, update, and delete webhook subscriptions via the /webhooks management API.

All webhook management endpoints require apiKeyAuth.

EndpointMethodDescription
GET /webhooksGETList all registered webhook subscriptions.
POST /webhooksPOSTRegister a new webhook subscription.
PATCH /webhooks/{id}PATCHUpdate an existing webhook subscription. {id} is a UUID.
DELETE /webhooks/{id}DELETERemove a webhook subscription. Returns { "succeed": true }.

Note on action naming: When registering a subscription, use the past-tense value invoiceCreated in the action field. The events that faktoora actually fires to your endpoint use present tense (e.g., invoiceCreate, invoiceSent). These are different strings — do not confuse them.

Example: Register a webhook
curl -X POST \
-H "X-API-KEY: your-api-token" \
-H "Content-Type: application/json" \
-d '{
"action": "invoiceCreated",
"target": "https://your-endpoint.example.com/hook"
}' \
https://api.faktoora.com/api/v1/webhooks

Response (200 OK)

{
"id": "550e8400-e29b-41d4-a716-446655440000",
"action": "invoiceCreated",
"target": "https://your-endpoint.example.com/hook"
}

The id field is a UUID. Use it in PATCH and DELETE requests.

Example: Update a webhook
curl -X PATCH \
-H "X-API-KEY: your-api-token" \
-H "Content-Type: application/json" \
-d '{
"action": "invoiceCreated",
"target": "https://new-endpoint.example.com/hook"
}' \
https://api.faktoora.com/api/v1/webhooks/550e8400-e29b-41d4-a716-446655440000
Example: Delete a webhook
curl -X DELETE \
-H "X-API-KEY: your-api-token" \
https://api.faktoora.com/api/v1/webhooks/550e8400-e29b-41d4-a716-446655440000

Response (200 OK)

{ "succeed": true }

Event Details

invoiceCreate

{
"faktooraId": "<string>",
"action": "invoiceCreate",
"payload": {
"faktooraId": "<string>",
"amount": "<number>",
"outstandingBalance": "<number>",
"currency": "<string>",
"invoiceNumber": "<string>",
"invoiceTypeCode": "<number>",
"status": "<string>",
"format": "<string>",
"issueDate": "<string>",
"dueDate": "<string>",
"deliveryDate": "<string>",
"orderNumber": "<string>",
"shippingOrderNumber": "<string>",
"contractNumber": "<string>",
"assignmentNumber": "<string>",
"orderReferenceId": "<string>",
"buyerReferenceId": "<string>",
"mandateReference": "<string>",
"projectName": "<string>",
"totalCosts": "<number>",
"createdAt": "<string>",
"detailsPage": "<string>"
}
}

invoiceOverdue

{
"trigger": {
"outputFields": {
"invoice": { /* full invoice object */ },
"detailsPage": "<string>"
}
}
}

invoiceSent

{
"action": "invoiceSent",
"faktooraId": "<string>",
"payload": {
"id": "<invoiceId>",
"faktooraId": "<string>",
"detailsPage": "<string>"
}
}

invoiceIncomingCreate

{
"action": "invoiceIncomingCreate",
"payload": {
"id": "<invoiceIncomingId>",
"importId": "<string>",
"amount": "<number>",
"taxAmount": "<number>",
"outstandingBalance": "<number>",
"invoiceCurrencyCode": "<string>",
"invoiceNumber": "<string>",
"issueDate": "<string>",
"dueDate": "<string>",
"paymentDate": "<string>",
"sellerName": "<string>",
"type": "<string>",
"inputType": "<string>",
"buyerReference": "<string>",
"isValid": "<boolean>",
"createdAt": "<string>",
"detailsPage": "<string>"
}
}

invoiceIncomingSent

{
"action": "invoiceIncomingSent",
"payload": {
"id": "<invoiceIncomingId>",
"detailsPage": "<string>"
}
}

offerCreate

{
"action": "offerCreate",
"faktooraId": "<string>",
"payload": {
"id": "<offerId>",
"faktooraId": "<string>",
"detailsPage": "<string>"
}
}

offerSent

{
"action": "offerSent",
"faktooraId": "<string>",
"payload": {
"id": "<offerId>",
"faktooraId": "<string>",
"detailsPage": "<string>"
}
}

letterCreate

{
"action": "letterCreate",
"faktooraId": "<string>",
"payload": {
"id": "<letterId>",
"faktooraId": "<string>",
"detailsPage": "<string>"
}
}

letterSent

{
"action": "letterSent",
"faktooraId": "<string>",
"payload": {
"id": "<letterId>",
"faktooraId": "<string>",
"detailsPage": "<string>"
}
}

reminderCreate

{
"action": "reminderCreate",
"faktooraId": "<string>",
"payload": {
"id": "<reminderId>",
"faktooraId": "<string>",
"detailsPage": "<string>"
}
}

reminderSent

{
"action": "reminderSent",
"faktooraId": "<string>",
"payload": {
"id": "<reminderId>",
"faktooraId": "<string>",
"detailsPage": "<string>"
}
}

orderConfirmationCreate

{
"action": "orderConfirmationCreate",
"faktooraId": "<string>",
"payload": {
"id": "<orderConfirmationId>",
"faktooraId": "<string>",
"detailsPage": "<string>"
}
}

orderConfirmationSent

{
"action": "orderConfirmationSent",
"faktooraId": "<string>",
"payload": {
"id": "<orderConfirmationId>",
"faktooraId": "<string>",
"detailsPage": "<string>"
}
}

customerCreate

{
"action": "customerCreate",
"faktooraId": "<string>",
"payload": {
"id": "<customerId>",
"faktooraId": "<string>"
}
}

productCreate

{
"action": "productCreate",
"payload": {
"id": "<productId>"
}
}

Event Flow Diagram

A high-level sequence for outgoing invoice events: