Skip to content

Webhook events

The catalog below lists every event type your registered webhook endpoints can subscribe to. Subscribe by including the event-type string in the eventTypes array when you create or update the endpoint. The platform’s live catalog is also available at GET /api/tenants/{tenantId}/webhooks/event-types — that endpoint is the source of truth and will reflect any catalog growth before this page does.

Every event fires when the underlying entity transitions through one of three actions:

  • <entity>.created — a new row was inserted.
  • <entity>.updated — at least one tracked column changed.
  • <entity>.deleted — the row was soft-deleted (the platform never physically deletes domain entities).
Event typeFires when…
contact.createdA Contact is created (manually, via import, via API).
contact.updatedA Contact’s identity, primary address, or other tracked field changes.
contact.deletedA Contact is soft-deleted.
order.createdAn order is committed (cash, card, donation-only — all paths).
order.updatedOrder status, totals, or fulfillment state change.
order.deletedAn order is soft-deleted.
order_donation.createdA donation line is added to an order.
order_donation.updatedA donation line’s amount or fund changes.
order_donation.deletedA donation line is voided / removed.
order_payment.createdA payment row is attached to an order (charge, cash receipt, etc.).
order_payment.updatedA payment’s status changes (Authorized → Captured, refund recorded, …).
order_payment.deletedA payment is voided.
batch.createdAn accounting batch is opened (auto-batch or manual).
batch.updatedA batch’s counts, totals, or close state change.
batch.deletedA batch is soft-deleted.
fund.createdA fund is added to the tenant’s catalog.
fund.updatedA fund’s name, processing-fee percent, or tax-deductible flag changes.
fund.deletedA fund is soft-deleted.
donor_task.createdA task is created against a contact.
donor_task.updatedA task’s status, assignee, or due date changes.
donor_task.deletedA task is soft-deleted.
recurring_donation_schedule.createdA recurring donation is set up.
recurring_donation_schedule.updatedFrequency, amount, payment method, or status changes.
recurring_donation_schedule.deletedA recurring schedule is soft-deleted.
inventory_item.createdA new inventory item is added.
inventory_item.updatedPricing, weight, bundle config, or other tracked fields change.
inventory_item.deletedAn inventory item is soft-deleted.
refund.createdA refund is processed against an order payment.
refund.updatedA refund’s status moves Pending → Processed / Failed.
refund.deletedA refund record is soft-deleted.
shipment.createdA shipment is created (full or partial fulfillment).
shipment.updatedA shipment’s status, tracking, or carrier info changes.
shipment.deletedA shipment is soft-deleted.

There is no separate order.shipped or order.refunded event. Status transitions surface as order.updated (or order_payment.updated / shipment.updated) with the changed columns described in the body’s data.changes block. A receiver that only cares about a specific transition reads the changes:

import json
def handle(body: dict):
if body["event"] != "order.updated":
return
changes = json.loads(body["data"]["changes"]) if body["data"]["changes"] else {}
if changes.get("OrderStatus", {}).get("New") == "Shipped":
# ...
pass

The data.user_id field carries the authoring identity:

  • "<guid>" for tenant users (Identity user id).
  • "api-key:<guid>" for events caused by API key calls.
  • "system" (or empty) for background-service writes (recurring donation charges, ShipStation sync, scheduled report sends, etc.).

Use this when your replication layer needs to suppress events that your own integration caused.

The catalog grows when new entity types become webhookable. When that happens, the live event-types endpoint surfaces the new strings the moment the API redeploys; this page lags. The breaking-change changelog gate does not trigger on catalog additions because they’re additive — but a coupled-path advisory prompts the docs to catch up.

  • No restored action in the catalog. Soft-delete restores generate audit-log rows but aren’t surfaced as a webhook event today.
  • No row-level filters. You can’t subscribe to “only orders > $1000” or “only contacts in Seattle.” Filter on the receiver.
  • No backfill / historical replay. A new subscription only sees events from registration time forward.
  • No payload-shape variations per event type. The wire shape is uniform; receivers switch on event and follow up with a read.