RReTestimonial
Sign inStart free
Smart Invite Webhooks · CollectionPREMIUM+

Every sale becomes atestimonial request.

Point Stripe, Shopify, or any source at one signed URL. The moment a customer checks out, they're enrolled in a personalized three-email invite sequence — mapped, filtered, routed, and deduplicated before a single message goes out.

① Source fires
Stripe logo
Stripe
Checkout completed
Shopify logo
Shopify
Order paid
{}
Generic
Any source, any payload
POST
② Webhook receives
POST /webhooks/invites/wh_8fa2…VERIFIED
{
"type": "checkout.session.completed",
"data": {
"customer_details": {
"email": "sara@northbeam.io",email
"name": "Sara Sheikh"name
} }
}
enroll
③ 3-email sequence
01+0
The ask
Sent after your delay
02+3d
Gentle nudge
If no response
03+7d
Last call
Final reminder
7
native sources
Stripe, Shopify, Paddle + generic
0
lines of code
map fields with JSON paths
First-match
routing rules
send the right form, every time
Signed
& deduplicated
HMAC-verified, idempotent
§01Sources

One URL. Any source that can POST.

Pick your platform and we pre-fill the field mapping for its payload shape. Or choose Generic and wire up anything that speaks JSON — a CRM, a form tool, your own backend.

YOUR ENDPOINT · UNIQUE PER WEBHOOKCopy
https://app.retestimonial.com/api/webhooks/invites/wh_8fa2c1/sk_live_9d…e4
The path holds a secretguessing it is computationally hopeless
Rotate anytimeold URL dies, sequences keep running
Stripe logo
Stripe
Checkout completed
Shopify logo
Shopify
Order paid
WooCommerce logo
WooCommerce
Order processing
Gumroad logo
Gumroad
Sale completed
Lemon Squeezy logo
Lemon Squeezy
Subscription created
Paddle logo
Paddle
Transaction completed
{}
Generic
Any source, any payload
Each source ships with a signature scheme we know how to verify — more on that in Safe by default.
§02Field mapping

Pluck the fields you need with JSON paths.

Every payload is different, so you tell us where things live. Dot notation walks nested objects; items[0].name indexes arrays. Only email is required — name, company, and any extra metadata are yours to grab.

incoming payload · StripeMAPPED 4
{
"id": "evt_1Q2x8aLk…",
"type": "checkout.session.completed",
"data": {
"object": {
"amount_total": 24900,
"currency": "usd",
"customer_details": {
"email": "sara@northbeam.io",email *
"name": "Sara Sheikh"name
},
"metadata": {
"plan": "business",meta.plan
"company": "Northbeam"company
}
} }
}
FIELD MAPPINGcontact ← payload
emailREQUIREDsara@northbeam.io
data.object.customer_details.email
nameSara Sheikh
data.object.customer_details.name
companyNorthbeam
data.object.metadata.company
metadata.planbusiness
data.object.metadata.plan
Extra metadata rides along with the contact and shows up as merge tags in your emails and as routing inputs below.
FILTER GATEonly matching events create invites
typeequalscheckout.session.completed
checkout.session.completedenrolls the customer
checkout.session.expiredignored — no invite
payment_intent.createdignored — no invite
§03Smart filters

Invite the right moments — skip the noise.

Platforms fire dozens of event types at one URL. A filter condition gates the webhook so only the events you care about — a completed checkout, an order over a threshold — ever turn into an invite.

8 operators
equalsnot equalscontainsexists><
Numeric compares
Gate on amount_total ≥ 5000 to invite only meaningful purchases.
Field presence
Use exists to require a field be there at all before enrolling.
§04Conditional routing

Send each customer to the story that fits.

Ordered rules, evaluated top to bottom — first match wins. Read straight from the payload or from extracted metadata, then route to a different form and email template. Anything that matches nothing falls through to your default.

Business plan · up to 5 rules
1
Enterprise dealsIF
amount_total ≥ 100000
ROUTE TOWhite-glove story
2
Annual / businessIF
meta.plan equals "business"
ROUTE TODetailed case study
Everyone else
default fallback
ROUTE TOQuick win
▲ evaluated top to bottom · first match wins
INCOMING CONTACT
diego@lattice.io
amount: 120000plan: business
Enterprise deals120000 ≥ 100000
Annual / businessnot reached
Everyone elsenot reached
RESULT →
“White-glove story” form
with the enterprise email template
§05Safe by default

Automated, never reckless.

Firing emails from third-party events is risky if you do it naively. Six guardrails run on every single delivery — so customers aren't double-emailed, suppressed addresses stay quiet, and forged payloads never get through.

Idempotent
Duplicate deliveries are claimed by event key — the same checkout never enrolls a contact twice, even on platform retries.
Suppression-aware
Anyone who unsubscribed or bounced is checked against your suppression list and silently skipped.
90-day cooldown
A customer who was recently invited won't be pestered again until the cooldown window clears.
Email-validated
Malformed addresses are rejected before they ever cost a credit or hit the queue.
One credit per contact
You're charged once when the contact is created. All three follow-up emails are free.
Signature-verified
Stripe and Shopify payloads are HMAC-SHA256 verified with a 5-minute timestamp window. Forgeries bounce.
SIGNATURE CHECKStripeShopify
Stripe-Signature: t=1781902800,
  v1=3f8a…d41c
→ HMAC-SHA256( t + "." + body )
✓ match · within 5-min window
Rate-limitedPer-endpoint throughput caps absorb bursts and shrug off floods.
Logs auto-expireRaw payloads and headers are retained for debugging, then purged on a schedule.
§06Logs & testing

See every event. Test before you trust.

A live log records each delivery with the extracted fields, which rule matched, and exactly why anything was skipped. And a dry-run tester lets you paste a real payload to preview the outcome — no contact created, no credit spent.

DELIVERY LOG
812 received · 794 processed · 18 skipped
ContactMatched / reasonStatusWhen
sara@northbeam.ioAnnual / businessPROCESSED2m
diego@lattice.ioEnterprise dealsPROCESSED11m
filter mismatchSKIPPED18m
ben@riverbed.coEveryone elsePROCESSED26m
robin@atrium.devcooldown activeSKIPPED40m
bad@@addrinvalid emailERROR1h
DRY RUNpaste a payload · no side effects
{ "type": "order.paid",
  "customer": { "email": "mira@lumen.co" } }
Filterpassed
Email extractedmira@lumen.co
Matched ruleEveryone else
Would create1 contact · Quick win
nothing was sent · no credit consumed
PREMIUM+ · COLLECT → SMART INVITES

Stop asking for testimonials by hand.

Connect a source, map a payload, and let every happy customer roll straight into a sequence. Set it up once in the builder — it runs forever.