Example of Customer JSON Data Sent via Webhook

Created by support team, Modified on Fri, 11 Sep at 1:21 PM by Emily Campbell

Below is an example of the JSON payload BRM sends to your endpoint for a customer.create or customer.update event — both share the same shape. (Merging two customer records fires a separate customer.merged event with a different, smaller shape — see the bottom of this article.)

Envelope

{
  "event": "customer.update",
  "event_id": "1c2d9a7e-55b3-4f10-8e21-7a6f9c0d4e32",
  "event_ts": "2026-08-14T09:12:03.557Z",
  "namespace": "yourstore",
  "reference": "123",
  "data": { ... the customer record, shown below ... }
}

As with reservation events, use event_id to de-duplicate and event_ts to order — not updated_ts inside data.

The customer object (data)

{
  "id": 123,
  "email": "customer@domain.com",
  "first_name": "John",
  "last_name": "Doe",
  "country": "USA",
  "address_line_1": "123 House",
  "address_line_2": "123 Street",
  "address_city": "Home City",
  "address_state": "NY",
  "postal_code": "12345",
  "phone_number": "+12345678901",
  "other_phone": "+10987654321",
  "language": "en",
  "notes": "",
  "waiver": {
    "signed_waiver_id": 9,
    "signed_version_id": 21,
    "signed_version_ts": 1755162723418,
    "latest_waiver_id": 9,
    "latest_version_id": 22,
    "latest_version_ts": 1755162723418,
    "up_to_date": false,
    "lang": "en"
  },
  "custom_fields": [],
  "documents": [],
  "source_channel": null,
  "home_location": "",
  "stripe_customer_id": "cus_JdI8KtdOPagCPX",
  "lightspeed_customer_id": "",
  "firebase_uid": null,
  "integrationDetails": null,
  "missing_required_fields": [],
  "marketing_opt_in": "on",
  "delivery_address_ids": [],
  "default_delivery_address_id": null,
  "created_ts": 1623145381944,
  "updated_ts": 1628164750655
}

(Trimmed — DIN/ski-setting fields and a few other rarely-used fields are also present on the real payload.)

Things worth knowing before you build against this

  • The waiver field is a full object, not a flag. It tells you which waiver version the customer signed and when, and separately what the store's current/latest waiver version is — compare signed_version_id to latest_version_id (or just check up_to_date) to know if they need to re-sign.
  • Almost every field is snake_case, except one. integrationDetails is camelCase — worth double-checking your parser handles it if you're strict about key casing.
  • No currency or locale field — the closest equivalent here is language.

customer.merged — a different shape

When two duplicate customer records are merged, BRM fires a customer.merged event instead of customer.update. Its data object is much smaller and doesn't contain a full customer record:

{
  "event": "customer.merged",
  "reference": "123",
  "data": {
    "merged_customer_id": 456,
    "surviving_customer_id": 123
  }
}

reference and surviving_customer_id are the same id — the record that remains. merged_customer_id is the id that was merged away and should now be treated as gone on your side. If a merge is later undone, BRM does not send an "unmerge" event — you'll instead see ordinary customer.update events for the records involved.

See also

Webhooks Overview
Webhook Event Reference — what triggers each event
Example of Reservation JSON Data Sent by Webhook

Was this article helpful?

That’s Great!

Thank you for your feedback

Sorry! We couldn't be helpful

Thank you for your feedback

Let us know how can we improve this article!

Select at least one of the reasons
CAPTCHA verification is required.

Feedback sent

We appreciate your effort and will try to fix the article