Skip to Content

Shopify

Shopify fires an event for practically every state change on a checkout or order. Splashify wires three:

EventBest use
checkouts/createAbandoned cart recovery — send 30 min later
orders/paidOrder 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_marketing

2. 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:

FieldValue
EventChoose Checkout creation, Order payment, or Order cancellation
FormatJSON
URLThe URL from step 1 (same URL for all three)
Version2024-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:

  1. checkouts/create — abandoned cart recovery

    • Phone field: phone (Shopify puts contact phone on the root)

    • Variables:

      VarField pathSample
      {{1}}customer.first_namePriya
      {{2}}total_price1299.00
      {{3}}abandoned_checkout_urlShopify-hosted recovery link
  2. orders/paid — order confirmation

    • Phone field: phone or customer.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)
  3. orders/cancelled — refund notice

    • Phone field: same as above
    • Variables: name, total_price, cancel_reason
  4. Toggle EnabledSave.

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, token
  • email, phone
  • customer.first_name, customer.last_name, customer.phone
  • total_price, currency
  • abandoned_checkout_url — use this for recovery; Shopify hosts the page
  • line_items[] — array of products (array indexing not yet supported in field paths)

On an order:

  • name — e.g. #1042
  • order_status_url, order_number
  • financial_statuspaid / pending / refunded
  • fulfillments[] — 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_url expires 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.