Marketing

The Marketing section covers three related surfaces: pixels (so ad platforms and analytics know your storefront exists), abandoned-cart recovery (so a missed checkout gets a follow-up), and broadcasts (so you can fan out a one-shot send to a contact list).
This page is a kickoff — each of the three sub-surfaces has its own dashboard page; we cover the highlights here and link out to source-of-truth API references.
Looking for “campaigns”? The top-level umbrella that groups discounts + creator briefs + affiliators + cart recovery + broadcasts is the Campaigns hub. The old “Marketing campaigns” (one-shot blast sends) was renamed Broadcasts in May 2026 to free the name up for the hub. The on-disk table is still called
MarketingCampaign; the Prisma symbol and dashboard label are bothBroadcast.
Pixels
Merchant pixels are the tracking IDs your storefront fires into ad platforms and analytics. Ripllo holds one row per workspace covering the common ones:
| Pixel | Where it lives | Required? |
|---|---|---|
| Meta (Facebook) pixel ID | metaPixelId |
Only if you run Meta ads |
| Meta CAPI access token | metaCapiAccessToken |
Only if you want server-side conversion API |
| GA4 measurement ID | ga4MeasurementId |
Recommended for everyone |
| Google Ads conversion ID | googleAdsConversionId |
Only if you run Google Ads |
| TikTok pixel ID | tiktokPixelId |
Only if you run TikTok ads |
Configuring pixels
Navigate to Dashboard → Pixels. The form takes each ID as a plain string. Save calls PATCH /api/v1/pixels.
The CAPI access token is the only secret in the bunch — Ripllo encrypts it at rest and never returns it through the public storefront read endpoint (only through the merchant-authenticated read).
Storefront access
Your storefront fetches the public pixel set via:
GET /api/v1/pixels/public/:accountId
This returns only public IDs (no CAPI token), is unauthenticated, and is the endpoint your Storlaunch (or other) storefront calls to inject pixel tags into the page.
Abandoned-cart recovery
When a customer adds something to their cart but doesn't check out, Ripllo can send them a reminder email (with an optional discount code attached) and recover some of those sales.
Configuring the recovery flow
Navigate to Dashboard → Abandoned cart. The settings page takes:
enabled— master switch.delayMinutes— how long the cart has to be idle before the first reminder fires.discountCodeId— optional. Pick an existing code from the dropdown; it's attached to every reminder.- Sender — the from-name/from-email the email uses.
- Subject + body templates — markdown with
{{customer.name}},{{cart.value}},{{cart.items}}interpolations.
Save calls PATCH /api/v1/abandoned-cart/config.
Recording reminders
When your storefront detects an abandoned cart and decides to send (typically after the delayMinutes window), it calls:
POST /api/v1/abandoned-cart/reminders
{
"accountId": "...",
"customerId": "cust_...",
"cartId": "cart_...", // becomes externalRef
"email": "alice@example.com",
"cartSnapshot": [...],
"valueAtSend": 250000,
"currencyAtSend": "IDR",
"discountCodeId": "disc_..."
}
Ripllo first checks the customer's BuyerEmailPreference opt-out list — suppressed addresses are silently skipped (you get created: false, reason: 'opted_out' back). Otherwise it stamps a acr_* reminder row.
The reminder row carries an optional marketingCampaignId. When the linked discount code itself belongs to a Campaign, the reminder inherits that tag at send time so cart-recovery activity rolls up to the campaign's performance counter. There is no per-send campaign override — the source of truth is the discount code.
Marking recovered
When the same customer completes checkout shortly after a reminder, your payment-success handler calls:
POST /api/v1/abandoned-cart/recover
{
"accountId": "...",
"customerId": "cust_...",
"checkoutSessionId": "...",
"completedAt": "..."
}
Ripllo finds the most recent unrecovered reminder for that customer and stamps recovered: true on it. This drives your recovery-rate stat on the dashboard.
Opt-out
The unsubscribe link in every reminder email points at GET /api/v1/abandoned-cart/unsubscribe?token=.... Hitting it adds the email to BuyerEmailPreference for the workspace; subsequent reminder attempts to the same address skip silently.
Broadcasts (one-shot blast sends)
A broadcast is a one-shot email (or WhatsApp, or push) send to a contact list. Use it for: newsletter blasts, product launches, seasonal promotions.
Creating a broadcast
Navigate to Dashboard → Compose (the working name for the broadcast composer). The form covers:
- Audience — pick a contact list or audience segment.
- Channel — pick a connected email/WhatsApp integration.
- Template — either reuse a saved template or compose inline. Templates use Mustache-style
{{contact.firstName}}interpolation. - Schedule — send now or pick a future timestamp.
Save calls POST /api/v1/broadcasts — the broadcast sits in draft state until you trigger send.
Sending
Click Send test first — this triggers POST /api/v1/broadcasts/:id/send-test which delivers a single email to the address you specify, with the compiled template. Verify it looks right.
Click Send to fire POST /api/v1/broadcasts/:id/send. The broadcast flips through scheduled → sending → sent (or failed). The send is enqueued; the response returns immediately.
Templates
Reusable templates live under /compose-templates. Each template has a name, channel-specific subject/body, and Mustache variables. The compile endpoint renders a template against sample data — useful for previewing.
Tying broadcasts to a campaign (planned)
Broadcasts do not yet carry a marketingCampaignId — the link from the Campaigns hub to a Broadcast is on the backlog. The campaign performance counter shows 0 for "broadcasts sent / messages sent" today and a tooltip explaining why. Until the link ships, attribution is one-way: a broadcast that points users at a discount code will roll up via the discount code's campaign tag, but the broadcast itself stays unlinked.
Next
- Campaigns — the central hub that groups discounts, briefs, affiliators, and cart recovery.
- Discount codes — attach a code to abandoned-cart reminders.
- Referrals — another distribution lever.
- API reference — full endpoint set including broadcasts, pixels, abandoned-cart.