Stripe
Stripe fires dozens of event types; Splashify wires the two that matter for customer messaging out of the box: payment_intent.succeeded and payment_intent.payment_failed. Signatures use Stripe’s standard t=…,v1=… scheme.
What you get
| Event | Typical template |
|---|---|
payment_intent.succeeded | Order confirmation with total + id |
payment_intent.payment_failed | Payment failure + retry nudge |
Prerequisites
- Stripe account (dashboard.stripe.com )
- Approved WhatsApp templates in Splashify
Setup
1. Copy the Splashify webhook URL
Integrations → Stripe in Splashify → copy URL:
https://apis.splashifypro.com/api/v1/webhooks/integrations/<your-user-id>/stripe2. Add the endpoint in Stripe
Stripe dashboard → Developers → Webhooks → + Add endpoint.
| Field | Value |
|---|---|
| Endpoint URL | URL from step 1 |
| Description | Splashify Pro WhatsApp templates |
| Events to send | payment_intent.succeeded, payment_intent.payment_failed |
Click Add endpoint. On the next screen, click Reveal under Signing secret — it looks like whsec_XXXXXXX.... Copy it.
3. Paste the signing secret in Splashify
Configuration tab → Webhook Secret → paste the whsec_… value. Save.
From now on, any unsigned or wrongly-signed POST to your Stripe webhook URL is rejected with 401. Stripe retries its own webhook for up to 3 days on 5xx; it will stop retrying on a persistent 401.
4. Pick templates + map variables
For each event you care about, in Event Automations:
- Pick the approved template.
- Set Phone Field — where on the
payment_intentis the customer phone?- If you collect phone via Stripe Checkout:
receipt_emailworks for email but phone lives onshipping.phoneorcharges.data[0].billing_details.phone. Splashify only supports simple dot paths — the cleanest pattern is to store the phone in metadata when you create the PaymentIntent:Then set Phone Field →await stripe.paymentIntents.create({ amount: 5000, currency: 'usd', metadata: { phone: '919876543210', order_id: 'ORD-123' }, })metadata.phone.
- If you collect phone via Stripe Checkout:
- Variable Mappings:
| Template var | Field path | Sample |
|---|---|---|
{{1}} | amount | 5000 (in cents) |
{{2}} | currency | usd |
{{3}} | id | pi_3N1abc... |
{{4}} | metadata.order_id | ORD-123 |
{{5}} | last_payment_error.message | (failed events) |
- Toggle Enabled and Save.
5. Test
Stripe CLI:
stripe trigger payment_intent.succeededOr in the dashboard, on the webhook endpoint, click Send test webhook → pick the event.
Then check Integrations → Stripe → Logs in Splashify.
Payload reference
Stripe wraps the event in data.object — Splashify unwraps this so you address the inner fields directly (id, amount, metadata.xxx, etc.).
Key fields on a payment_intent:
id—pi_...amount— smallest currency unit (cents / paise)currency— lowercase ISO code (usd,inr)status—succeeded/requires_payment_method/ etc.metadata.*— whatever you stored at creationreceipt_emaillast_payment_error.{code,message,decline_code}— on failures
Full reference: Stripe PaymentIntent object .
Common gotchas
- Amounts are in the smallest unit.
amount=5000in USD means $50.00; in INR it means ₹50.00. Put currency formatting in the template text. - Phone field is rarely on the root. Use
metadata.phoneand attach it at PaymentIntent creation — the cleanest long-term pattern. - Test-mode webhooks have placeholder data. Use
stripe triggerwith real metadata, or run an end-to-end real charge in test mode. - Signature check fails on 1-char mismatch. Copy the secret with no whitespace. If you rotate the secret in Stripe, update it here too.