Skip to content
Browse documentation

Webhook events

Reference for every event the Webhook destination delivers. Setup, signature verification and retries are covered there. This page is generated from the schemas we validate payloads against, so it always matches what we send.

Request body

Every request has the same envelope. Only data differs by event type.

Field Type Description
id string Event id; same as the webhook-id header and stable across retries.
type string The event type, e.g. order_placed.
version 1 Payload version. Changes only on a breaking change.
timestamp string ISO-8601 time the action happened.
data object Event-specific payload; see each event type below.

All amounts are integers in minor units, so 2500 in USD is $25.00. Timestamps are ISO-8601 in UTC.

Versioning

The current payload version is 1. It changes only for a breaking change: a field removed or renamed, or a field's type or meaning changed. Adding a field or a new event type is not breaking and keeps the version, so ignore fields and event types you don't recognize. When a new version ships, your endpoint keeps receiving the version it has until you switch, and the old version stays supported for a deprecation period announced in advance.

Event types

Type Fires when Sent
order_placed Payment for an order was captured. Always (our backend emits it)
order_fulfilled An order was marked fulfilled. Always (our backend emits it)
order_refunded An order was refunded. Always (our backend emits it)
order_cancelled An order was cancelled. Always (our backend emits it)
customer_registered A shopper created an account. Always (our backend emits it)
customer_identified An existing shopper signed in. A storefront can also send it with trackEvent to identify a visitor. Always (our backend emits it)
newsletter_subscribed A shopper submitted a newsletter subscribe form. Always (our backend emits it)
product_viewed A shopper viewed a product. Only when your storefront sends it with trackEvent
product_added_to_cart A shopper added a product to the cart. Only when your storefront sends it with trackEvent
checkout_started A shopper started checkout. Only when your storefront sends it with trackEvent
custom A store-specific event, e.g. a quiz completed. Only when your storefront sends it with trackEvent

The "Send test event" button sends type nanosite_test_event, whose data has only a note.

order_placed

Payment for an order was captured. Sent: Always (our backend emits it).

data fields:

Field Type Description
profile Profile Who the event is about. Any field can be null.
consent Consent Consent the shopper gave with the action. Webhook delivery is not gated on it, so check it before using the data for marketing.
order Order An order as it was when the event fired.

Example request body:

{
  "id": "mevt_01JEXAMPLE0001",
  "type": "order_placed",
  "version": 1,
  "timestamp": "2026-09-30T12:00:00.000Z",
  "data": {
    "profile": {
      "customerId": null,
      "email": "[email protected]",
      "phone": "+15555550100",
      "name": null
    },
    "consent": {
      "marketing": true,
      "analytics": true,
      "region": "US",
      "source": "checkout"
    },
    "order": {
      "id": "order_01JEXAMPLE",
      "status": "paid",
      "email": "[email protected]",
      "currencyCode": "USD",
      "subtotal": 5000,
      "discountCode": "WELCOME10",
      "discountAmount": 500,
      "shippingAmount": 600,
      "taxAmount": 0,
      "total": 5100,
      "shippingAddress": {
        "name": "Sam Shopper",
        "line1": "1 Main St",
        "line2": null,
        "city": "Springfield",
        "region": "IL",
        "postalCode": "62701",
        "country": "US",
        "phone": "+15555550100"
      },
      "items": [
        {
          "productId": "prod_01JEXAMPLE",
          "variantId": "var_01JEXAMPLE",
          "title": "Organic Cotton Tee / M",
          "quantity": 2,
          "unitAmount": 2500
        }
      ],
      "metadata": {
        "giftNote": "Happy birthday!"
      },
      "createdAt": "2026-09-30T11:58:00.000Z"
    }
  }
}

order_fulfilled

An order was marked fulfilled. Sent: Always (our backend emits it).

data fields:

Field Type Description
profile Profile Who the event is about. Any field can be null.
consent Consent Consent the shopper gave with the action. Webhook delivery is not gated on it, so check it before using the data for marketing.
order Order An order as it was when the event fired.

Example request body:

{
  "id": "mevt_01JEXAMPLE0002",
  "type": "order_fulfilled",
  "version": 1,
  "timestamp": "2026-09-30T12:00:00.000Z",
  "data": {
    "profile": {
      "customerId": null,
      "email": "[email protected]",
      "phone": "+15555550100",
      "name": null
    },
    "consent": {
      "marketing": true,
      "analytics": true,
      "region": "US",
      "source": "checkout"
    },
    "order": {
      "id": "order_01JEXAMPLE",
      "status": "fulfilled",
      "email": "[email protected]",
      "currencyCode": "USD",
      "subtotal": 5000,
      "discountCode": "WELCOME10",
      "discountAmount": 500,
      "shippingAmount": 600,
      "taxAmount": 0,
      "total": 5100,
      "shippingAddress": {
        "name": "Sam Shopper",
        "line1": "1 Main St",
        "line2": null,
        "city": "Springfield",
        "region": "IL",
        "postalCode": "62701",
        "country": "US",
        "phone": "+15555550100"
      },
      "items": [
        {
          "productId": "prod_01JEXAMPLE",
          "variantId": "var_01JEXAMPLE",
          "title": "Organic Cotton Tee / M",
          "quantity": 2,
          "unitAmount": 2500
        }
      ],
      "metadata": {
        "giftNote": "Happy birthday!"
      },
      "createdAt": "2026-09-30T11:58:00.000Z"
    }
  }
}

order_refunded

An order was refunded. Sent: Always (our backend emits it).

data fields:

Field Type Description
profile Profile Who the event is about. Any field can be null.
consent Consent Consent the shopper gave with the action. Webhook delivery is not gated on it, so check it before using the data for marketing.
order Order An order as it was when the event fired.

Example request body:

{
  "id": "mevt_01JEXAMPLE0003",
  "type": "order_refunded",
  "version": 1,
  "timestamp": "2026-09-30T12:00:00.000Z",
  "data": {
    "profile": {
      "customerId": null,
      "email": "[email protected]",
      "phone": "+15555550100",
      "name": null
    },
    "consent": {
      "marketing": true,
      "analytics": true,
      "region": "US",
      "source": "checkout"
    },
    "order": {
      "id": "order_01JEXAMPLE",
      "status": "refunded",
      "email": "[email protected]",
      "currencyCode": "USD",
      "subtotal": 5000,
      "discountCode": "WELCOME10",
      "discountAmount": 500,
      "shippingAmount": 600,
      "taxAmount": 0,
      "total": 5100,
      "shippingAddress": {
        "name": "Sam Shopper",
        "line1": "1 Main St",
        "line2": null,
        "city": "Springfield",
        "region": "IL",
        "postalCode": "62701",
        "country": "US",
        "phone": "+15555550100"
      },
      "items": [
        {
          "productId": "prod_01JEXAMPLE",
          "variantId": "var_01JEXAMPLE",
          "title": "Organic Cotton Tee / M",
          "quantity": 2,
          "unitAmount": 2500
        }
      ],
      "metadata": {
        "giftNote": "Happy birthday!"
      },
      "createdAt": "2026-09-30T11:58:00.000Z"
    }
  }
}

order_cancelled

An order was cancelled. Sent: Always (our backend emits it).

data fields:

Field Type Description
profile Profile Who the event is about. Any field can be null.
consent Consent Consent the shopper gave with the action. Webhook delivery is not gated on it, so check it before using the data for marketing.
order Order An order as it was when the event fired.

Example request body:

{
  "id": "mevt_01JEXAMPLE0004",
  "type": "order_cancelled",
  "version": 1,
  "timestamp": "2026-09-30T12:00:00.000Z",
  "data": {
    "profile": {
      "customerId": null,
      "email": "[email protected]",
      "phone": "+15555550100",
      "name": null
    },
    "consent": {
      "marketing": true,
      "analytics": true,
      "region": "US",
      "source": "checkout"
    },
    "order": {
      "id": "order_01JEXAMPLE",
      "status": "cancelled",
      "email": "[email protected]",
      "currencyCode": "USD",
      "subtotal": 5000,
      "discountCode": "WELCOME10",
      "discountAmount": 500,
      "shippingAmount": 600,
      "taxAmount": 0,
      "total": 5100,
      "shippingAddress": {
        "name": "Sam Shopper",
        "line1": "1 Main St",
        "line2": null,
        "city": "Springfield",
        "region": "IL",
        "postalCode": "62701",
        "country": "US",
        "phone": "+15555550100"
      },
      "items": [
        {
          "productId": "prod_01JEXAMPLE",
          "variantId": "var_01JEXAMPLE",
          "title": "Organic Cotton Tee / M",
          "quantity": 2,
          "unitAmount": 2500
        }
      ],
      "metadata": {
        "giftNote": "Happy birthday!"
      },
      "createdAt": "2026-09-30T11:58:00.000Z"
    }
  }
}

customer_registered

A shopper created an account. Sent: Always (our backend emits it).

data fields:

Field Type Description
profile Profile Who the event is about. Any field can be null.
consent Consent Consent the shopper gave with the action. Webhook delivery is not gated on it, so check it before using the data for marketing.
method "password", "google", "magic_link", "otp" How the account was created.

Example request body:

{
  "id": "mevt_01JEXAMPLE0005",
  "type": "customer_registered",
  "version": 1,
  "timestamp": "2026-09-30T12:00:00.000Z",
  "data": {
    "profile": {
      "customerId": "cus_01JEXAMPLE",
      "email": "[email protected]",
      "phone": "+15555550100",
      "name": "Sam Shopper"
    },
    "consent": {
      "marketing": true,
      "analytics": true,
      "region": "US",
      "source": "signup"
    },
    "method": "google"
  }
}

customer_identified

An existing shopper signed in. A storefront can also send it with trackEvent to identify a visitor. Sent: Always (our backend emits it).

data fields:

Field Type Description
profile Profile Who the event is about. Any field can be null.
consent Consent Consent the shopper gave with the action. Webhook delivery is not gated on it, so check it before using the data for marketing.

Example request body:

{
  "id": "mevt_01JEXAMPLE0006",
  "type": "customer_identified",
  "version": 1,
  "timestamp": "2026-09-30T12:00:00.000Z",
  "data": {
    "profile": {
      "customerId": "cus_01JEXAMPLE",
      "email": "[email protected]",
      "phone": "+15555550100",
      "name": "Sam Shopper"
    },
    "consent": {
      "marketing": true,
      "analytics": true,
      "region": "US",
      "source": "checkout"
    }
  }
}

newsletter_subscribed

A shopper submitted a newsletter subscribe form. Sent: Always (our backend emits it).

data fields:

Field Type Description
profile Profile Who the event is about. Any field can be null.
consent Consent Consent the shopper gave with the action. Webhook delivery is not gated on it, so check it before using the data for marketing.
list string or null The list they joined, if named.

Example request body:

{
  "id": "mevt_01JEXAMPLE0007",
  "type": "newsletter_subscribed",
  "version": 1,
  "timestamp": "2026-09-30T12:00:00.000Z",
  "data": {
    "profile": {
      "customerId": null,
      "email": "[email protected]",
      "phone": null,
      "name": null
    },
    "consent": {
      "marketing": true,
      "analytics": true,
      "region": "US",
      "source": "subscribe-form"
    },
    "list": "newsletter"
  }
}

product_viewed

A shopper viewed a product. Sent: Only when your storefront sends it with trackEvent.

data fields:

Field Type Description
profile Profile Who the event is about. Any field can be null.
consent Consent Consent the shopper gave with the action. Webhook delivery is not gated on it, so check it before using the data for marketing.
line Line A product line on a browsing or cart event.

Example request body:

{
  "id": "mevt_01JEXAMPLE0008",
  "type": "product_viewed",
  "version": 1,
  "timestamp": "2026-09-30T12:00:00.000Z",
  "data": {
    "profile": {
      "customerId": "cus_01JEXAMPLE",
      "email": "[email protected]",
      "phone": "+15555550100",
      "name": "Sam Shopper"
    },
    "consent": {
      "marketing": true,
      "analytics": true,
      "region": "US",
      "source": "checkout"
    },
    "line": {
      "productId": "prod_01JEXAMPLE",
      "variantId": "var_01JEXAMPLE",
      "title": "Organic Cotton Tee / M",
      "image": "https://cdn.example.com/tee.jpg",
      "quantity": 1,
      "unitAmount": 2500,
      "currencyCode": "USD"
    }
  }
}

product_added_to_cart

A shopper added a product to the cart. Sent: Only when your storefront sends it with trackEvent.

data fields:

Field Type Description
profile Profile Who the event is about. Any field can be null.
consent Consent Consent the shopper gave with the action. Webhook delivery is not gated on it, so check it before using the data for marketing.
line Line A product line on a browsing or cart event.

Example request body:

{
  "id": "mevt_01JEXAMPLE0009",
  "type": "product_added_to_cart",
  "version": 1,
  "timestamp": "2026-09-30T12:00:00.000Z",
  "data": {
    "profile": {
      "customerId": "cus_01JEXAMPLE",
      "email": "[email protected]",
      "phone": "+15555550100",
      "name": "Sam Shopper"
    },
    "consent": {
      "marketing": true,
      "analytics": true,
      "region": "US",
      "source": "checkout"
    },
    "line": {
      "productId": "prod_01JEXAMPLE",
      "variantId": "var_01JEXAMPLE",
      "title": "Organic Cotton Tee / M",
      "image": "https://cdn.example.com/tee.jpg",
      "quantity": 2,
      "unitAmount": 2500,
      "currencyCode": "USD"
    }
  }
}

checkout_started

A shopper started checkout. Sent: Only when your storefront sends it with trackEvent.

data fields:

Field Type Description
profile Profile Who the event is about. Any field can be null.
consent Consent Consent the shopper gave with the action. Webhook delivery is not gated on it, so check it before using the data for marketing.
checkout Checkout The cart when checkout started.

Example request body:

{
  "id": "mevt_01JEXAMPLE0010",
  "type": "checkout_started",
  "version": 1,
  "timestamp": "2026-09-30T12:00:00.000Z",
  "data": {
    "profile": {
      "customerId": "cus_01JEXAMPLE",
      "email": "[email protected]",
      "phone": "+15555550100",
      "name": "Sam Shopper"
    },
    "consent": {
      "marketing": true,
      "analytics": true,
      "region": "US",
      "source": "checkout"
    },
    "checkout": {
      "cartId": "cart_01JEXAMPLE",
      "currencyCode": "USD",
      "value": 5000,
      "items": [
        {
          "productId": "prod_01JEXAMPLE",
          "variantId": "var_01JEXAMPLE",
          "title": "Organic Cotton Tee / M",
          "image": "https://cdn.example.com/tee.jpg",
          "quantity": 2,
          "unitAmount": 2500,
          "currencyCode": "USD"
        }
      ]
    }
  }
}

custom

A store-specific event, e.g. a quiz completed. Sent: Only when your storefront sends it with trackEvent.

data fields:

Field Type Description
profile Profile Who the event is about. Any field can be null.
consent Consent Consent the shopper gave with the action. Webhook delivery is not gated on it, so check it before using the data for marketing.
name string The custom event name, e.g. "quiz_completed".
props object Flat properties sent with the event.

Example request body:

{
  "id": "mevt_01JEXAMPLE0011",
  "type": "custom",
  "version": 1,
  "timestamp": "2026-09-30T12:00:00.000Z",
  "data": {
    "profile": {
      "customerId": "cus_01JEXAMPLE",
      "email": "[email protected]",
      "phone": "+15555550100",
      "name": "Sam Shopper"
    },
    "consent": {
      "marketing": true,
      "analytics": true,
      "region": "US",
      "source": "checkout"
    },
    "name": "quiz_completed",
    "props": {
      "quiz": "skin-type",
      "result": "dry"
    }
  }
}

Profile object

Who the event is about. Any field can be null.

Field Type Description
customerId string or null The shopper's customer id, when they have an account.
email string or null The shopper's email.
phone string or null The shopper's phone, from the shipping address when given.
name string or null The shopper's name.

Consent the shopper gave with the action. Webhook delivery is not gated on it, so check it before using the data for marketing.

Field Type Description
marketing boolean The shopper agreed to marketing messages.
analytics boolean The shopper agreed to analytics tracking.
region string or null Region the consent applies to, when known.
source string or null Where consent was captured, e.g. "checkout" or "signup".

Order object

An order as it was when the event fired.

Field Type Description
id string Order id.
status "pending", "paid", "fulfilled", "cancelled", "refunded" Order status when the event fired.
email string Email given at checkout.
currencyCode string ISO 4217 currency code, e.g. USD.
subtotal integer Sum of the lines before discounts, shipping and tax, in minor units (2500 = 25.00).
discountCode string or null Discount code applied, if any.
discountAmount integer Total discount, in minor units (2500 = 25.00).
shippingAmount integer Shipping charge, in minor units (2500 = 25.00).
taxAmount integer Tax, in minor units (2500 = 25.00).
total integer Amount charged, in minor units (2500 = 25.00).
shippingAddress Address or null Where the order ships, if an address was given.
items array of OrderItem The order lines.
metadata object Custom order fields set at checkout, e.g. a gift note.
createdAt string ISO-8601 time the order was created.

OrderItem object

One line of an order.

Field Type Description
productId string Product id.
variantId string Variant id.
title string Product title at the time of purchase, including the variant.
quantity integer Units ordered.
unitAmount integer Price of one unit, in minor units (2500 = 25.00).

Address object

A shipping address.

Field Type Description
name string Recipient name.
line1 string Street address.
line2 string or null Apartment, suite or unit.
city string City.
region string or null State, province or region.
postalCode string Postal or ZIP code.
country string Country, as entered at checkout.
phone string or null Contact phone.

Line object

A product line on a browsing or cart event.

Field Type Description
productId string or null Product id.
variantId string or null Variant id.
title string Product title, including the variant.
image string or null Product image URL.
quantity integer Units.
unitAmount integer Price of one unit, in minor units (2500 = 25.00).
currencyCode string ISO 4217 currency code.

Checkout object

The cart when checkout started.

Field Type Description
cartId string Cart id.
currencyCode string ISO 4217 currency code.
value integer Cart subtotal when checkout started, in minor units (2500 = 25.00).
items array of Line The cart lines.