Webhooks

Maroo can send webhook notifications to your server when events happen in your account. You configure webhook destinations via the Webhooks API, specifying a URL and optionally filtering by event type.

Each delivery is an HTTP POST request with a JSON body. The request includes signature headers so you can verify authenticity.

Envelope

Every webhook delivery has the same top-level structure:

{
  "id": "evt_d4f5a8b0-1c2e-4a6f-b8d0-3e5f7a9c1b2d",
  "type": "invoice.created",
  "apiVersion": "2026-05-01",
  "livemode": true,
  "createdAt": "2026-05-07T14:30:00.000Z",
  "data": { ... }
}
FieldTypeDescription
idstringUnique event identifier, prefixed with evt_.
typestringThe event type that triggered this delivery.
apiVersionstringThe API version used to render the payload.
livemodebooleantrue for production, false for sandbox.
createdAtstringISO 8601 timestamp of when the event was created.
dataobjectEvent-specific payload. Structure depends on type.

Event types

Invoice events

These events include the full invoice object in data.invoice.

Event typeDescription
invoice.createdA new invoice was created.
invoice.updatedAn invoice was updated (e.g. amount, payment methods, due dates).
invoice.sentAn invoice was sent to the recipient.
invoice.paidAll payments on an invoice are paid.
invoice.reopenedA previously paid invoice was reopened.

Invoice deleted event

Event typeDescription
invoice.deletedAn invoice was deleted. Only the invoice id is included.

Payment events

These events fire when an individual payment within an invoice changes status. The payload includes data.invoiceId and data.payment.

Event typeDescription
invoice.payment.processingA payment started processing.
invoice.payment.completedA payment completed successfully.
invoice.payment.failedA payment failed.
invoice.payment.marked_as_paidA payment was manually marked as paid.
invoice.payment.unmarked_as_paidA "marked as paid" status was removed from a payment.

Payloads

Invoice events

Events invoice.created, invoice.updated, invoice.sent, invoice.paid, and invoice.reopened share this payload shape:

{
  "invoice": {
    "id": "d4f5a8b0-1c2e-4a6f-b8d0-3e5f7a9c1b2d",
    "contactId": "a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d",
    "status": "Active",
    "deliveryMethod": "Email",
    "paymentLink": "https://pay.maroo.us/acme/abc123",
    "enableAutoreminders": true,
    "note": "First milestone payment",
    "ccEmails": ["[email protected]"],
    "paymentMethods": ["BankAccount", "CreditCard"],
    "paymentSchedule": [
      {
        "id": "f1e2d3c4-b5a6-9788-7c6d-5e4f3a2b1c0d",
        "dueDate": "2026-06-01",
        "name": "Deposit",
        "amount": 50000,
        "status": "Scheduled",
        "paymentDate": null,
        "fee": null
      }
    ],
    "totalAmount": 50000
  }
}
FieldTypeDescription
invoice.idstringInvoice ID.
invoice.contactIdstring | nullClient contact ID, if linked.
invoice.statusstringDraft or Active.
invoice.deliveryMethodstringEmail or PaymentLink.
invoice.paymentLinkstring | nullPayment link URL. Null for draft invoices.
invoice.enableAutoremindersbooleanWhether automatic reminders are enabled.
invoice.notestring | nullNote attached to the invoice.
invoice.ccEmailsstring[]CC email addresses.
invoice.paymentMethodsstring[]Accepted payment methods: DebitCard, CreditCard, BankAccount, Check.
invoice.paymentScheduleobject[]List of payments in the invoice.
invoice.paymentSchedule[].idstringPayment ID.
invoice.paymentSchedule[].dueDatestringDue date (YYYY-MM-DD).
invoice.paymentSchedule[].namestring | nullPayment name (e.g. "Deposit").
invoice.paymentSchedule[].amountintegerAmount in minor currency units.
invoice.paymentSchedule[].statusstringPayment status (see Payment statuses).
invoice.paymentSchedule[].paymentDatestring | nullISO 8601 date when paid, or null.
invoice.paymentSchedule[].feeinteger | nullProcessing fee in minor units, or null.
invoice.totalAmountintegerSum of all payment amounts in minor currency units.

Invoice deleted event

The invoice.deleted event contains only the invoice ID:

{
  "invoice": {
    "id": "d4f5a8b0-1c2e-4a6f-b8d0-3e5f7a9c1b2d"
  }
}

Payment events

Events invoice.payment.processing, invoice.payment.completed, invoice.payment.failed, invoice.payment.marked_as_paid, and invoice.payment.unmarked_as_paid share this payload shape:

{
  "invoiceId": "d4f5a8b0-1c2e-4a6f-b8d0-3e5f7a9c1b2d",
  "payment": {
    "id": "f1e2d3c4-b5a6-9788-7c6d-5e4f3a2b1c0d",
    "dueDate": "2026-06-01",
    "name": "Deposit",
    "amount": 50000,
    "status": "Processing",
    "paymentDate": null,
    "fee": null
  }
}
FieldTypeDescription
invoiceIdstringID of the invoice this payment belongs to.
payment.idstringPayment ID.
payment.dueDatestringDue date (YYYY-MM-DD).
payment.namestring | nullPayment name.
payment.amountintegerAmount in minor currency units.
payment.statusstringPayment status (see Payment statuses).
payment.paymentDatestring | nullISO 8601 date when paid, or null.
payment.feeinteger | nullProcessing fee in minor units, or null.

Payment statuses

StatusDescription
DraftInvoice is in draft; payment not yet active.
ScheduledPayment is scheduled for a future due date.
DuePayment is due today.
PastDuePayment is past its due date.
ProcessingPayment is being processed.
PaidPayment completed successfully.
FailedPayment processing failed.
MarkedAsPaidPayment was manually marked as paid.
BlockedPayment is blocked.
AuthorizationPayment authorization is in progress.
PendingPayment is pending.
AcceptedPayment was accepted.
DeclinedPayment was declined.
PaidByGuestPayment was made by a guest (not the primary contact).
ExpiredPayment has expired.
SubmittedA refund has been submitted for this payment.
RefundedPayment was refunded.