Skip to content

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.

EventWhen it's sentReading it needs
commerce.order.paidWhen a store order is paid.commerce:read
commerce.order.refundedWhen some or all of a store order is refunded.commerce:read
commerce.order.fulfilledWhen a store order ships or is handed over.commerce:read
commerce.order.cancelledWhen a store order is cancelled.commerce:read
commerce.order.disputedWhen a customer disputes a store order's payment with their bank.commerce:read
commerce.product.createdWhen a product is added to the store.commerce:read
commerce.product.updatedWhen a product's details, prices or variants change.commerce:read
commerce.product.deletedWhen a product is deleted from the store.commerce:read
crm.appointment.createdWhen an appointment is booked, online or by the team.crm:read
crm.appointment.rescheduledWhen an appointment moves to another time.crm:read
crm.appointment.cancelledWhen an appointment is cancelled.crm:read
crm.appointment.updatedWhen an appointment's status changes, such as completed or a no-show, or its deposit is paid.crm:read
crm.invoice.createdWhen an invoice is drafted.crm:read
crm.invoice.sentWhen an invoice is sent for the first time.crm:read
crm.invoice.paidWhen an invoice is paid online or marked paid.crm:read
crm.invoice.voidedWhen an invoice is voided.crm:read
crm.payment.succeededWhen a payment comes in: an invoice, a booking deposit, a payment link or a subscription's charge.crm:read
crm.payment.failedWhen a charge fails, such as a subscription's card being declined.crm:read
crm.payment.refundedWhen some or all of a payment is refunded.crm:read
crm.payment.disputedWhen a customer disputes a payment with their bank.crm:read
crm.subscription.createdWhen a customer starts a subscription through a payment link.crm:read
crm.subscription.updatedWhen a subscription is paused, falls past due or is cancelled.crm:read
crm.message.receivedWhen a customer texts or emails the workspace.crm:read
crm.mailing.sentWhen a Click2Mail mailing is placed and goes to print.crm:read
crm.mailing.deliveredWhen a mailing's pieces have all been delivered or returned.crm:read
crm.lead_list.readyWhen a LeadsPlease list, or a standing order's new week, is ready.crm:read
settings.webhook.pingSent 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.

data
{
"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.

data
{
"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.

data
{
"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.

data
{
"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.

data
{
"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.

data
{
"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.

data
{
"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.

data
{
"id": "prd_01JD7QM4P6R8T0V2X4Z6AB8CDE",
"slug": "ethiopia-guji",
"name": "Ethiopia Guji"
}

CRM

crm.appointment.created

When an appointment is booked, online or by the team.

data
{
"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.

data
{
"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.

data
{
"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.

data
{
"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.

data
{
"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.

data
{
"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.

data
{
"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.

data
{
"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.

data
{
"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.

data
{
"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.

data
{
"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.

data
{
"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.

data
{
"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.

data
{
"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.

data
{
"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.

data
{
"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.

data
{
"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.

data
{
"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.

data
{
"endpoint_id": "whe_01JD7QX3E5G7J9K1M3P5R7T9V1"
}