One snippet, full control
Drop a JS loader or sandboxed iframe into any web app, pick the project token, and decide where campaigns appear. The widget stays a thin client — your backend stays the source of truth.
Branded mini-games, streaks and promo campaigns you embed in an afternoon. Progression, caps and fraud checks run on our servers; the reward decision reaches your backend as a signed webhook.
<!-- Drop in where the anonymous free-play game should appear -->
<div id="playflow-widget"></div>
<script
src="https://rp-api.l2c1.com/v1/widget.js"
data-project-id="proj_live_xxx"
data-target="#playflow-widget"
async
></script>
# Identified users and rewards start server-side
curl -X POST https://rp-api.l2c1.com/v1/server/session-token \
-H "X-RetentionPlay-Server-Key: sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{"project_id":"proj_live_xxx","external_user_id":"user_123"}'
# Reward decisions stay server-side & signed
curl -X POST https://rp-api.l2c1.com/v1/server/events \
-H "X-RetentionPlay-Server-Key: sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{"type":"reward.claim","idempotency_key":"..."}'
# → signed webhook (HMAC) hits your endpoint
# → you validate eligibility, caps & fraud flags
# Legacy alias: X-PlayFlow-Server-Key
Not a badge widget. A compact retention engine for SaaS, e-commerce and communities that need measurable return visits — with anti-fraud, Stripe billing and a React admin included.
Drop a JS loader or sandboxed iframe into any web app, pick the project token, and decide where campaigns appear. The widget stays a thin client — your backend stays the source of truth.
Daily quests, XP, streaks, leaderboards and completion rules — server-authoritative, no game infra to own.
HMAC-signed webhooks for coupons, points, unlocks, CRM events or email triggers — with idempotency keys.
Change colors, copy and campaign visuals so the widget feels native in every client product.
Plays, completions, reward unlocks and return behavior — by campaign and segment.
Rate limits, session fingerprints, a server-side FraudGate and signed events keep rewards from being farmed.
What your team touches is a focused retention widget — campaigns, skins, webhooks and a compact dashboard. What keeps it honest is a Rust backend that stays authoritative about every play, cap and reward.
One shared progression layer sits behind every mode. Moving a campaign from a streak to a quiz is a change of configuration, not a second integration.
A branded match-3 challenge that turns one session into the next return visit.
RetentionPlay is infrastructure — you bring the audience and fulfillment. We ship embeddable games, server-side progression and signed webhooks.
Daily streak in your app dashboard. Measure DAU and feature return rate without building a game team.
Read the SaaS playbook → E‑commerceScratch or wheel after checkout. Reward codes via webhook to your promo engine — fraud limits on the server.
Read the e-commerce playbook → SubsWeekly quiz or memory game in the member area. Track session time and day-N return before renewal date.
Read the subscriptions playbook →RetentionPlay is a working vertical slice, not a pitch deck. The retention engine, admin and integrations are already implemented and tested.
Modular monolith: unified /v1/events ingress, SpecEngine, ProgressionService with hot/cold state (Dragonfly + Postgres) and graceful degradation.
Streak, quiz, scratch, clicker, match-3, memory pairs and wheel — driven by a data-first GameplaySpec, served through one generic play shell.
Server-side fraud rules, caps and cooldowns, score reconciliation, atomic idempotency and HMAC-signed reward webhooks with replay protection.
React admin, JS / PHP / Python SDKs, WordPress & Shopify integrations, Swagger API reference and a full docs site — deployable via Docker Swarm.
Four steps, and the only one that touches your codebase is the first. Everything after it happens in the dashboard.
Add the JS snippet or iframe and connect the project token.
Choose a campaign, reward rule and brand skin in the dashboard.
Users play a small game or complete a quest in the product flow.
Measure completions, reward unlocks and return behavior by segment.
A flat monthly price based on projects and monthly active users. No per-play fees and no revenue share — the reward budget stays yours.
A first streak in one product.
Real reward campaigns with webhooks and A/B.
Several brands, higher volume, tighter fraud limits.
Built developer-first: you stay in control of identity, rewards and data. Here is how the boundaries work.
On the backend. The widget never decides rewards. Eligibility, caps, cooldowns and fraud checks are evaluated server-side, then a signed webhook tells your system to grant the reward.
Rate limits, session fingerprints, score reconciliation and a configurable FraudGate. Reward-bearing outcomes can be required to come from your backend via a server API key.
Anonymous free-play is one snippet. A production identity or reward loop asks your backend to call /v1/server/session-token with a session:issue API key, then adds the returned session token to the widget.
Yes. Colors, copy and campaign visuals are configurable per project, and the widget renders in a sandboxed iframe so it stays isolated from your app.
You keep identity and billing. RetentionPlay uses scoped project/session tokens; secrets never live in the browser, and admin/reward actions are audit-logged.
The widget lives in a sandboxed iframe, so a failure stays inside it and never blocks your page. On the backend, progression degrades from the hot store to Postgres instead of dropping the session, and webhook delivery retries with idempotency keys.
Seven adapters today — streak, quiz, scratch, clicker, match-3, memory pairs and wheel — all driven by the same progression layer, so new surfaces reuse it.
A/B exposure assigns each user a stable cohort and the dashboard reports D1 and D7 return per arm, so the comparison is against a held-out control rather than against last month.
Tell us what you would gamify and on which stack. We come back with a concrete embed plan — not a deck.