Events
Events are named <module>.<record>.<what happened>. An endpoint subscribes to names from this list, or to * for all of them, including ones added later. Each delivery’s data is the record as it is after the change; the examples below show its fields. A module can add fields to its records over time, so ignore fields you don’t use rather than refusing them.
This list is made from the App Worker’s own list of events when these docs are built.
| Event | When it's sent | Reading it needs |
|---|---|---|
commerce.order.paid | When a store order is paid. | commerce:read |
commerce.order.refunded | When some or all of a store order is refunded. | commerce:read |
commerce.order.fulfilled | When a store order ships or is handed over. | commerce:read |
commerce.order.cancelled | When a store order is cancelled. | commerce:read |
commerce.order.disputed | When a customer disputes a store order's payment with their bank. | commerce:read |
commerce.product.created | When a product is added to the store. | commerce:read |
commerce.product.updated | When a product's details, prices or variants change. | commerce:read |
commerce.product.deleted | When a product is deleted from the store. | commerce:read |
crm.appointment.created | When an appointment is booked, online or by the team. | crm:read |
crm.appointment.rescheduled | When an appointment moves to another time. | crm:read |
crm.appointment.cancelled | When an appointment is cancelled. | crm:read |
crm.appointment.updated | When an appointment's status changes, such as completed or a no-show, or its deposit is paid. | crm:read |
crm.invoice.created | When an invoice is drafted. | crm:read |
crm.invoice.sent | When an invoice is sent for the first time. | crm:read |
crm.invoice.paid | When an invoice is paid online or marked paid. | crm:read |
crm.invoice.voided | When an invoice is voided. | crm:read |
crm.payment.succeeded | When a payment comes in: an invoice, a booking deposit, a payment link or a subscription's charge. | crm:read |
crm.payment.failed | When a charge fails, such as a subscription's card being declined. | crm:read |
crm.payment.refunded | When some or all of a payment is refunded. | crm:read |
crm.payment.disputed | When a customer disputes a payment with their bank. | crm:read |
crm.subscription.created | When a customer starts a subscription through a payment link. | crm:read |
crm.subscription.updated | When a subscription is paused, falls past due or is cancelled. | crm:read |
crm.message.received | When a customer texts or emails the workspace. | crm:read |
crm.mailing.sent | When a Click2Mail mailing is placed and goes to print. | crm:read |
crm.mailing.delivered | When a mailing's pieces have all been delivered or returned. | crm:read |
crm.lead_list.ready | When a LeadsPlease list, or a standing order's new week, is ready. | crm:read |
settings.webhook.ping | Sent to one endpoint when it's pinged, to check deliveries reach it, whatever events the endpoint chose. | settings:write |
Commerce
commerce.order.paid
When a store order is paid.
{ "id": "ord_01JD7QK2X8V5N3M4P6R9T0W1YZ", "number": 1042, "status": "paid", "currency": "USD", "total": 4850, "refunded": 0, "email": "maya@example.com", "name": "Maya Chen", "contact_id": "ctc_01JD7QJ9M2N4P6R8T0V2X4Z6AB", "lines": [ { "name": "Ethiopia Guji", "variant": "12 oz · Whole bean", "quantity": 2, "price": 1900 }, { "name": "Brightwave mug", "variant": "", "quantity": 1, "price": 1050 } ], "placed_at": "2026-10-26T15:04:05.000Z"}commerce.order.refunded
When some or all of a store order is refunded.
{ "id": "ord_01JD7QK2X8V5N3M4P6R9T0W1YZ", "number": 1042, "status": "partially_refunded", "currency": "USD", "total": 4850, "refunded": 1050, "email": "maya@example.com", "name": "Maya Chen", "contact_id": "ctc_01JD7QJ9M2N4P6R8T0V2X4Z6AB", "lines": [ { "name": "Ethiopia Guji", "variant": "12 oz · Whole bean", "quantity": 2, "price": 1900 }, { "name": "Brightwave mug", "variant": "", "quantity": 1, "price": 1050 } ], "placed_at": "2026-10-26T15:04:05.000Z", "amount": 1050}commerce.order.fulfilled
When a store order ships or is handed over.
{ "id": "ord_01JD7QK2X8V5N3M4P6R9T0W1YZ", "number": 1042, "status": "paid", "currency": "USD", "total": 4850, "refunded": 0, "email": "maya@example.com", "name": "Maya Chen", "contact_id": "ctc_01JD7QJ9M2N4P6R8T0V2X4Z6AB", "lines": [], "placed_at": "2026-10-26T15:04:05.000Z", "carrier": "USPS", "tracking_number": "9400111899223197428490", "tracking_url": "https://tools.usps.com/go/TrackConfirmAction?tLabels=9400111899223197428490"}commerce.order.cancelled
When a store order is cancelled.
{ "id": "ord_01JD7QK2X8V5N3M4P6R9T0W1YZ", "number": 1042, "status": "refunded", "currency": "USD", "total": 4850, "refunded": 4850, "email": "maya@example.com", "name": "Maya Chen", "contact_id": "ctc_01JD7QJ9M2N4P6R8T0V2X4Z6AB", "lines": [], "placed_at": "2026-10-26T15:04:05.000Z"}commerce.order.disputed
When a customer disputes a store order's payment with their bank.
{ "id": "ord_01JD7QK2X8V5N3M4P6R9T0W1YZ", "number": 1042, "status": "disputed", "currency": "USD", "total": 4850, "refunded": 0, "email": "maya@example.com", "name": "Maya Chen", "contact_id": "ctc_01JD7QJ9M2N4P6R8T0V2X4Z6AB", "lines": [], "placed_at": "2026-10-26T15:04:05.000Z"}commerce.product.created
When a product is added to the store.
{ "id": "prd_01JD7QM4P6R8T0V2X4Z6AB8CDE", "slug": "ethiopia-guji", "name": "Ethiopia Guji", "status": "active", "type": "physical", "variants": [ { "id": "var_01JD7QM5Q7S9U1W3Y5A7C9E1GH", "sku": "GUJI-12-WB", "label": "12 oz · Whole bean", "price": 1900 } ]}commerce.product.updated
When a product's details, prices or variants change.
{ "id": "prd_01JD7QM4P6R8T0V2X4Z6AB8CDE", "slug": "ethiopia-guji", "name": "Ethiopia Guji", "status": "active", "type": "physical", "variants": [ { "id": "var_01JD7QM5Q7S9U1W3Y5A7C9E1GH", "sku": "GUJI-12-WB", "label": "12 oz · Whole bean", "price": 1900 } ]}commerce.product.deleted
When a product is deleted from the store.
{ "id": "prd_01JD7QM4P6R8T0V2X4Z6AB8CDE", "slug": "ethiopia-guji", "name": "Ethiopia Guji"}CRM
crm.appointment.created
When an appointment is booked, online or by the team.
{ "id": "apt_01JD7QN6R8T0V2X4Z6AB8CDEF0", "calendar_id": "cal_01JD7QN1M3P5R7T9V1X3Z5B7D9", "service": "Cupping class", "contact_id": "ctc_01JD7QJ9M2N4P6R8T0V2X4Z6AB", "staff_id": "usr_01JB8X4Q2M7KTW9C3N5RVHZ1DE", "status": "confirmed", "party_size": 2, "starts_at": "2026-11-02T17:00:00.000Z", "ends_at": "2026-11-02T18:30:00.000Z", "total": 9000, "deposit": 2000, "deposit_paid": true, "booked_via": "site"}crm.appointment.rescheduled
When an appointment moves to another time.
{ "id": "apt_01JD7QN6R8T0V2X4Z6AB8CDEF0", "calendar_id": "cal_01JD7QN1M3P5R7T9V1X3Z5B7D9", "service": "Cupping class", "contact_id": "ctc_01JD7QJ9M2N4P6R8T0V2X4Z6AB", "staff_id": "usr_01JB8X4Q2M7KTW9C3N5RVHZ1DE", "status": "confirmed", "party_size": 2, "starts_at": "2026-11-02T17:00:00.000Z", "ends_at": "2026-11-02T18:30:00.000Z", "total": 9000, "deposit": 2000, "deposit_paid": true, "booked_via": "site"}crm.appointment.cancelled
When an appointment is cancelled.
{ "id": "apt_01JD7QN6R8T0V2X4Z6AB8CDEF0", "calendar_id": "cal_01JD7QN1M3P5R7T9V1X3Z5B7D9", "service": "Cupping class", "contact_id": "ctc_01JD7QJ9M2N4P6R8T0V2X4Z6AB", "staff_id": "usr_01JB8X4Q2M7KTW9C3N5RVHZ1DE", "status": "cancelled", "party_size": 2, "starts_at": "2026-11-02T17:00:00.000Z", "ends_at": "2026-11-02T18:30:00.000Z", "total": 9000, "deposit": 2000, "deposit_paid": true, "booked_via": "site"}crm.appointment.updated
When an appointment's status changes, such as completed or a no-show, or its deposit is paid.
{ "id": "apt_01JD7QN6R8T0V2X4Z6AB8CDEF0", "calendar_id": "cal_01JD7QN1M3P5R7T9V1X3Z5B7D9", "service": "Cupping class", "contact_id": "ctc_01JD7QJ9M2N4P6R8T0V2X4Z6AB", "staff_id": "usr_01JB8X4Q2M7KTW9C3N5RVHZ1DE", "status": "completed", "party_size": 2, "starts_at": "2026-11-02T17:00:00.000Z", "ends_at": "2026-11-02T18:30:00.000Z", "total": 9000, "deposit": 2000, "deposit_paid": true, "booked_via": "site"}crm.invoice.created
When an invoice is drafted.
{ "id": "inv_01JD7QP8T0V2X4Z6AB8CDEF0GH", "number": "INV-0042", "contact_id": "ctc_01JD7QJ9M2N4P6R8T0V2X4Z6AB", "status": "draft", "currency": "USD", "total": 32400, "issued_at": "2026-10-20T15:00:00.000Z", "due_at": "2026-11-19T05:59:59.999Z", "paid_at": null}crm.invoice.sent
When an invoice is sent for the first time.
{ "id": "inv_01JD7QP8T0V2X4Z6AB8CDEF0GH", "number": "INV-0042", "contact_id": "ctc_01JD7QJ9M2N4P6R8T0V2X4Z6AB", "status": "sent", "currency": "USD", "total": 32400, "issued_at": "2026-10-20T15:00:00.000Z", "due_at": "2026-11-19T05:59:59.999Z", "paid_at": null}crm.invoice.paid
When an invoice is paid online or marked paid.
{ "id": "inv_01JD7QP8T0V2X4Z6AB8CDEF0GH", "number": "INV-0042", "contact_id": "ctc_01JD7QJ9M2N4P6R8T0V2X4Z6AB", "status": "paid", "currency": "USD", "total": 32400, "issued_at": "2026-10-20T15:00:00.000Z", "due_at": "2026-11-19T05:59:59.999Z", "paid_at": "2026-10-26T16:12:00.000Z"}crm.invoice.voided
When an invoice is voided.
{ "id": "inv_01JD7QP8T0V2X4Z6AB8CDEF0GH", "number": "INV-0042", "contact_id": "ctc_01JD7QJ9M2N4P6R8T0V2X4Z6AB", "status": "void", "currency": "USD", "total": 32400, "issued_at": "2026-10-20T15:00:00.000Z", "due_at": "2026-11-19T05:59:59.999Z", "paid_at": null}crm.payment.succeeded
When a payment comes in: an invoice, a booking deposit, a payment link or a subscription's charge.
{ "id": "pay_01JD7QQ9V2X4Z6AB8CDEF0GHJK", "source": "invoice", "contact_id": "ctc_01JD7QJ9M2N4P6R8T0V2X4Z6AB", "description": "Invoice INV-0042", "amount": 32400, "refunded": 0, "currency": "USD", "status": "succeeded", "stripe_payment_intent": "pi_3QFh2kLm9Np4Qr7S", "invoice_id": "inv_01JD7QP8T0V2X4Z6AB8CDEF0GH", "appointment_id": null, "payment_link_id": null, "subscription_id": null, "created_at": "2026-10-26T16:12:00.000Z"}crm.payment.failed
When a charge fails, such as a subscription's card being declined.
{ "id": "pay_01JD7QQ9V2X4Z6AB8CDEF0GHJK", "source": "subscription", "contact_id": "ctc_01JD7QJ9M2N4P6R8T0V2X4Z6AB", "description": "Coffee club, 2 bags", "amount": 32400, "refunded": 0, "currency": "USD", "status": "failed", "stripe_payment_intent": "pi_3QFh2kLm9Np4Qr7S", "invoice_id": null, "appointment_id": null, "payment_link_id": null, "subscription_id": "sub_01JD7QRAW4Z6AB8CDEF0GHJKMN", "created_at": "2026-10-26T16:12:00.000Z"}crm.payment.refunded
When some or all of a payment is refunded.
{ "id": "pay_01JD7QQ9V2X4Z6AB8CDEF0GHJK", "source": "invoice", "contact_id": "ctc_01JD7QJ9M2N4P6R8T0V2X4Z6AB", "description": "Invoice INV-0042", "amount": 32400, "refunded": 5000, "currency": "USD", "status": "partially_refunded", "stripe_payment_intent": "pi_3QFh2kLm9Np4Qr7S", "invoice_id": "inv_01JD7QP8T0V2X4Z6AB8CDEF0GH", "appointment_id": null, "payment_link_id": null, "subscription_id": null, "created_at": "2026-10-26T16:12:00.000Z", "refund": { "id": "rfd_01JD7QSBX6AB8CDEF0GHJKMNPQ", "amount": 5000, "reason": "requested_by_customer" }}crm.payment.disputed
When a customer disputes a payment with their bank.
{ "id": "pay_01JD7QQ9V2X4Z6AB8CDEF0GHJK", "source": "invoice", "contact_id": "ctc_01JD7QJ9M2N4P6R8T0V2X4Z6AB", "description": "Invoice INV-0042", "amount": 32400, "refunded": 0, "currency": "USD", "status": "disputed", "stripe_payment_intent": "pi_3QFh2kLm9Np4Qr7S", "invoice_id": "inv_01JD7QP8T0V2X4Z6AB8CDEF0GH", "appointment_id": null, "payment_link_id": null, "subscription_id": null, "created_at": "2026-10-26T16:12:00.000Z"}crm.subscription.created
When a customer starts a subscription through a payment link.
{ "id": "sub_01JD7QRAW4Z6AB8CDEF0GHJKMN", "stripe_id": "sub_1QFh3kLm9Np4Qr7S", "contact_id": "ctc_01JD7QJ9M2N4P6R8T0V2X4Z6AB", "plan": "Coffee club, 2 bags", "status": "active", "amount": 3600, "currency": "USD", "interval_days": 30, "next_charge_at": "2026-11-26T16:00:00.000Z"}crm.subscription.updated
When a subscription is paused, falls past due or is cancelled.
{ "id": "sub_01JD7QRAW4Z6AB8CDEF0GHJKMN", "stripe_id": "sub_1QFh3kLm9Np4Qr7S", "contact_id": "ctc_01JD7QJ9M2N4P6R8T0V2X4Z6AB", "plan": "Coffee club, 2 bags", "status": "past_due", "amount": 3600, "currency": "USD", "interval_days": 30, "next_charge_at": "2026-11-26T16:00:00.000Z"}crm.message.received
When a customer texts or emails the workspace.
{ "conversation_id": "cnv_01JD7QTCY8CDEF0GHJKMNPQRST", "message_id": "msg_01JD7QTDZ9DEF0GHJKMNPQRSTV", "contact_id": "ctc_01JD7QJ9M2N4P6R8T0V2X4Z6AB", "channel": "sms", "from": "+15125550142", "to": "+15125550100", "body": "Do you have the Guji in stock this week?", "received_at": "2026-10-26T17:30:00.000Z"}crm.mailing.sent
When a Click2Mail mailing is placed and goes to print.
{ "mailingId": "mlg_01JD7QVEA0EF0GHJKMNPQRSTVW", "name": "Welcome postcard, week 43", "listId": "lst_01JD7QVFB1F0GHJKMNPQRSTVWX", "pieces": 214, "cost": 18190, "mailDate": "2026-10-28T00:00:00.000Z"}crm.mailing.delivered
When a mailing's pieces have all been delivered or returned.
{ "mailingId": "mlg_01JD7QVEA0EF0GHJKMNPQRSTVW", "name": "Welcome postcard, week 43", "pieces": 214}crm.lead_list.ready
When a LeadsPlease list, or a standing order's new week, is ready.
{ "listId": "lst_01JD7QVFB1F0GHJKMNPQRSTVWX", "name": "New homeowners near Austin", "type": "new_homeowners", "delivery": 3, "records": 214}Settings
settings.webhook.ping
Sent to one endpoint when it's pinged, to check deliveries reach it, whatever events the endpoint chose.
{ "endpoint_id": "whe_01JD7QX3E5G7J9K1M3P5R7T9V1"}