Webhooks
Send sales, leads and bookings to Luria from Zapier, Make, n8n, WooCommerce or your own backend through one private URL (signed if you choose), and see what Luria receives from Shopify.
About 10 minutes
Luria receives webhooks. It does not send them: there is no outbound feed, so to move Luria's data elsewhere use the export at the bottom.
Two kinds come in. On Shopify, the app registers everything for you. Everywhere else, you get one private URL per site that accepts business events (a sale, a lead, a booked call) from any tool that can POST JSON.
What you'll need
- The Luria tag on your site (Install on a custom site)
- A tool that can send an HTTP POST with a JSON body: Zapier, Make, n8n, ClickFunnels, Kajabi or Systeme workflows, WooCommerce, or your own server
- Connections in the Luria dashboard. It is rolling out; if you do not see it, email hello@luriart.com
Steps
Step 1: Get your webhook URL
In luriart.com/app, open Connections → Inbound webhook, choose what will send events (generic, or woocommerce) and save. Luria shows a URL like https://www.luriart.com/api/webhooks/source?k=... and a signing secret. The URL is the password: keep it private. Reconnecting keeps the same URL.
Step 2: Send one event per sale, lead or booking
POST JSON to the URL. The simplest body is Luria's own shape:
{
"name": "purchase",
"dedupe_key": "order-1042",
"occurred_at": "2026-09-30T14:03:00Z",
"value": 129.0,
"currency": "USD",
"sid": "<the visitor's luria_sid>",
"email": "buyer@example.com"
}| Field | Meaning |
|---|---|
name | purchase, lead, booked_call, won_deal, refund, and the other names in JavaScript events |
dedupe_key | Your id for the thing (order, form entry, booking). The same key twice updates one record, so retries never double count. Send showed or no_show with the booking's key to mark attendance on that booking |
occurred_at | ISO time or epoch milliseconds |
value, currency | Optional. Currency is a three-letter code |
sid | Optional but what credits a split test: the visitor's localStorage.getItem("luria_sid"), passed through your form or checkout as a hidden field |
email | Optional. Luria stores only its SHA-256 hash, never the address, and uses it to match the visitor when no sid came through |
order_id | For refund only: the dedupe_key of the purchase it reduces; value is the total refunded so far |
is_test | true for a test event: stored and shown apart from real records (even with a real key), never counted as a conversion |
You can also send an array of up to 50 events, or {"events": [...]}.
Your tool sends its own shape? Add a field map in Connections instead of reshaping, for example {"name":"=purchase","dedupe_key":"order.id","value":"order.total","email":"customer.email"}: a dot path reads from the payload, a leading = is a fixed value.
Step 3: Sign it (recommended)
Add a header x-luria-signature: sha256=<hex HMAC-SHA256 of the raw body, keyed with your signing secret>. Luria rejects any signed body it does not match. Signing is one way: once Luria has received one correctly signed event on a connection, it refuses every unsigned event there with 401 signature required, so the URL alone can no longer send data. Until that first signed event, anyone holding the URL can post, so sign from your very first event. Zapier and Make can compute it with a code step; your backend can with any crypto library.
WooCommerce preset
Choose woocommerce in Step 1, then in WordPress open WooCommerce → Settings → Advanced → Webhooks → Add webhook: Topic Order updated, Delivery URL = your Luria URL, Secret = your signing secret, API version WP REST API Integration v3, Status Active, save. WooCommerce signs every delivery; Luria counts orders once they are processing or completed, and a refund lowers tracked revenue by the refunded amount. To tie orders to split tests, save the visitor's luria_sid to the order as order meta luria_sid (see Install on WooCommerce).
Verify it worked
- Send one event with
"is_test": true. Luria answers200with"received": 1. - Connections → Inbound webhook shows "Last event received" with the time.
- Send one real event with a
sidfrom your own test visit; the Customers count in the Customers section on Overview goes up by one whennamematches your goal.
Full checklist: Verify your install.
What Luria receives from Shopify
Installing the Shopify app registers the order, refund, uninstall, product and privacy (customer data request, customer redact, shop redact) topics for you. Every delivery is signature checked, and a verified delivery always gets an immediate 200. One order counts once even when the pixel reports it too. Billing webhooks for your own Luria plan arrive separately and only change your plan state.
Common failures
404 unknown webhook. Thekin the URL is wrong, or the connection was disconnected. Copy it again from Connections.401 signature required. This connection has received a signed event before, so Luria now refuses unsigned ones. Add the header to every sender.401 bad signature. The signature was computed over a re-serialized body, not the exact bytes sent, or with the wrong secret.400with a sentence. The body is not a business event Luria knows, for examplenameis misspelled. The sentence names the field.- Stored but no test credit. No
sid, and the email never reached Luria before. Pass theluria_sidhidden field. - Counted twice. A thank-you page also calls
window.luria.convertfor the same sale. Keep one of the two.
Export: on Shopify, open "Your data" in the Luria app and choose Export everything (JSON); elsewhere, email hello@luriart.com.
Next steps
Count PayPal payments
Return PayPal buyers to a thank-you page on your own site and count the purchase there, because there is no PayPal connection to set up.
Luria's API surface
The JavaScript calls the Luria tag exposes, the server key for sending conversions from your own backend, and how to test an install without touching your results.