Shopify
Shopify fires an event for practically every state change on a checkout or order. Splashify wires three:
| Event | Best use |
|---|---|
checkouts/create | Abandoned cart recovery — send 30 min later |
orders/paid | Order confirmation with tracking link |
orders/cancelled | ”Order cancelled” notice with refund ETA |
Each event gets its own template + variable mapping.
Prerequisites
- Shopify store on any plan
- Shop admin access to create webhooks
- Approved WhatsApp templates in Splashify
Setup
1. Copy the Splashify webhook URL
Integrations → Shopify in Splashify → copy URL:
https://apis.splashifypro.com/api/v1/webhooks/integrations/<your-user-id>/shopify_marketing2. Generate a webhook secret
Shopify lets you sign webhooks with a shared secret. Use any random 40+ character string — we recommend a UUID or openssl rand -hex 32. Keep it safe.
Paste the secret into Splashify’s Webhook Secret field first — otherwise any signed requests will be rejected (signature mismatch) until you do.
3. Add webhooks in Shopify
Shopify admin → Settings → Notifications → Webhooks (or Settings → Developer → Webhooks on newer UIs) → scroll to the Webhooks section at the bottom.
For each event:
| Field | Value |
|---|---|
| Event | Choose Checkout creation, Order payment, or Order cancellation |
| Format | JSON |
| URL | The URL from step 1 (same URL for all three) |
| Version | 2024-01 or later |
Click Save webhook.
Set the shared secret: at the bottom of the webhooks section there’s a webhook signature key. Shopify doesn’t let you set this — it shows you a key that’s auto-generated per shop. Copy this value and paste it into Splashify’s Webhook Secret field instead of generating your own.
Splashify validates the signature as HMAC-SHA256(rawBody, webhook_secret) → base64 → compared to X-Shopify-Hmac-Sha256.
4. Pick templates per event in Splashify
Configuration → Event Automations:
-
checkouts/create— abandoned cart recovery-
Phone field:
phone(Shopify puts contact phone on the root) -
Variables:
Var Field path Sample {{1}}customer.first_namePriya{{2}}total_price1299.00{{3}}abandoned_checkout_urlShopify-hosted recovery link
-
-
orders/paid— order confirmation- Phone field:
phoneorcustomer.phone - Variables: order name (
name), total (total_price), tracking URL (fulfillments[0].tracking_url— note: array indexing not supported yet, use metadata or a flat field)
- Phone field:
-
orders/cancelled— refund notice- Phone field: same as above
- Variables:
name,total_price,cancel_reason
-
Toggle Enabled → Save.
5. Test
Easiest: add a product to your cart on the store, go to checkout, fill in name + email + phone, then abandon the checkout (close the tab). Shopify fires checkouts/create within seconds.
Check Integrations → Shopify → Logs.
For orders/paid and orders/cancelled, place a real test order with a test payment gateway.
Payload reference
Shopify sends the full checkout/order object directly (no wrapper) — Splashify passes it through unchanged.
Key fields on a checkout:
id,tokenemail,phonecustomer.first_name,customer.last_name,customer.phonetotal_price,currencyabandoned_checkout_url— use this for recovery; Shopify hosts the pageline_items[]— array of products (array indexing not yet supported in field paths)
On an order:
name— e.g.#1042order_status_url,order_numberfinancial_status—paid/pending/refundedfulfillments[]— tracking numbers, carrier
Common gotchas
- Phone required. Shopify checkouts don’t require a phone — if the customer skipped it, we log
phone_missing. Require phone at checkout in Settings → Customer accounts to ensure coverage. abandoned_checkout_urlexpires after ~2 hours. Don’t schedule recovery messages more than 90 minutes out.- Test orders count toward retries. Each test places a real webhook — if the template isn’t ready, deliverability still counts (but won’t send since integration is disabled).
- Shopify’s signature key is per-shop, not per-webhook. One secret covers all three webhooks.
- Array fields don’t work in variable paths. Use
line_items.0.title? No — only simple dot paths. Capture array summaries in Shopify’s order metadata or in your fulfillment app.