Skip to main content

Webhooks

Get a message in your own system when customers join or earn.

Written by Berke Atik

Webhooks let Loyaltify tell your other systems straight away when something happens, such as a new customer joining or a customer earning points. Loyaltify sends a short message to an address you choose, and your system can act on it.

They're useful for keeping a CRM up to date, triggering emails in your own tools or building reports. This guide covers how to set one up, what each message contains and how to check that messages are arriving.

💡 Good to know: This is part of the Advanced plan. It stops working if you move to a lower plan.

Set up a webhook

Step 1: Open the webhook setup

Go to Integrations and click Connect on the Webhook card.


​

Step 2: Fill in the details

In the Webhook Setup window:

  • Endpoint URL: the https address in your system that should receive the messages.

  • Authorization: choose Bearer and type a token of your own, or choose None.

  • Events: tick the ones you want. You need at least one.

Then save, and your webhook is live.

💡 Tip: Choose Bearer and a long, random token. Every message then includes the header Authorization: Bearer followed by your token, so your system can check that the message really came from Loyaltify. This token is separate from your API key.

Change it later

You can change the endpoint, authorisation and events at any time on the Webhook Configuration page. Click Save when you're done.


Events you can choose

  • Customer created (customer.created): a new customer joins.

  • Customer updated (customer.updated): a customer's details are edited.

  • Transaction is created (transaction.created): a customer gets their starting balance, earns, redeems, gets a referral reward or has points expire.

  • Existing customer signup attempt (customer.signup_attempt): someone who already has the card fills in your form again. Their saved details aren't changed by the new submission.


What each message contains

Loyaltify sends each message as JSON, with the headers Content-Type: application/json and User-Agent: Loyaltify-Webhook/1.0. Every message has three parts:

  • event: which event it is, such as customer.created.

  • timestamp: when it happened, in UTC (for example 2026-10-16T16:38:46Z).

  • data: the details, which depend on the event.

Numbers such as point and balance_after are sent as text, for example "1.0", and empty values are null.

Customer created and Customer updated

  • name, email, phone and birthday

  • uuid: the customer's ID (the same one that's in their card's QR code)

  • point: their balance (on Customer created, the starting balance)

  • custom_fields: answers to your custom questions, including hidden values from the form link, such as click_id

  • is_marketing_opted_in: whether they agreed to marketing

  • created_at, updated_at and store_uuid

Customer updated carries the same fields, with the new values. Here's an example of Customer created:

{
"data": {
"name": "Alex",
"uuid": "7f3e9a21",
"email": "[email protected]",
"phone": null,
"point": "1.0",
"birthday": null,
"created_at": "2026-10-16T16:38:41.704Z",
"store_uuid": "a1b2c3d4",
"updated_at": "2026-10-16T16:38:46.790Z",
"custom_fields": {},
"is_marketing_opted_in": true
},
"event": "customer.created",
"timestamp": "2026-10-16T16:38:46Z"
}

Transaction is created

  • kind: the type of transaction, for example initial (the starting balance at sign-up), manual, redeem, expired, referee or referrer

  • point and amount: the values of the transaction. On expiries, point is negative.

  • balance_after: the customer's balance after the transaction

  • campaign: on redemptions, the campaign that was redeemed

  • user: the team member who scanned (name, ID and email), or null for automatic events such as expiries

  • customer_uuid, customer_email and customer_phone

  • referred_by_uuid: on referral rewards, who referred the customer

  • uuid: the transaction's own ID

  • created_at and store_uuid

Here's an example of a team member adding a point:

{
"data": {
"kind": "manual",
"user": {
"name": "Sam Taylor",
"uuid": "0b8e7d4c-1f2a-4c3b-9d5e-6a7b8c9d0e1f",
"email": "[email protected]"
},
"uuid": "5c9d2e7a-3b4f-4a1c-8e6d-2f7a9b0c1d3e",
"point": "1.0",
"amount": null,
"campaign": null,
"created_at": "2026-10-16T16:45:10.375Z",
"store_uuid": "a1b2c3d4",
"balance_after": "2.0",
"customer_uuid": "7f3e9a21",
"customer_email": "[email protected]",
"customer_phone": null,
"referred_by_uuid": null
},
"event": "transaction.created",
"timestamp": "2026-10-16T16:45:10Z"
}

A referral reward sends two transactions at the same moment: referee for the new customer, with referred_by_uuid set to the referrer's ID, and referrer for the customer who referred them.

Existing customer signup attempt

  • customer: who the existing customer is, with their uuid and custom_fields

  • matched_on: how they were recognised, for example by email

  • submission: what they just entered in the form

  • form: which form they used

To see a complete message, open any delivery in Recent Events (see below).


Check your deliveries

The Webhook Configuration page lists your Recent Events with their status, response code, number of attempts and date. Click the eye icon to see exactly what was sent, the headers and your system's reply.

Messages aren't arriving?

  • Check that your Endpoint URL is a valid https address. Browsers sometimes autofill an email address into it.

  • Check that the event is ticked on the Webhook Configuration page.

  • Check that you're on the Advanced plan.

  • Look at the event in Recent Events. If the response code shows an error, your system received the message but rejected it, and the eye icon shows its reply.

Still stuck? Contact support through live chat.


Good to know

  • Messages may not arrive in order, so use the timestamp if order matters.

  • Build your system to handle the same event twice, just in case. For transactions, the uuid in data is unique to each one.

  • Working with the API? Webhooks send the customer's short ID. Some API requests need the customer's internal number instead, and the API documentation shows how to look one up from the other.

  • Using Omnisend? Omnisend's own guide uses a webhook to connect to Loyaltify. See the Integrations overview for the link.
    ​


Need a hand?

We're here to help!

If you have any questions about webhooks, reach out to us via live chat inside Loyaltify, or use the chat button at the bottom right of this page. Our team will be happy to help.

Did this answer your question?