Attribution System
PromoStack uses a two-phase attribution system: early mapping (metacode redemption) and confirmation (RevenueCat webhook).Attribution Phases
Phase 1: Early Mapping (Metacode Redemption)
When a referee redeems a metacode in your app:- Maps
codes.redeemed_by_uid = "user_123" - Links code to referrer via
codes.referrer_id - Creates referral event with status
code_assigned
Phase 2: Confirmation (RevenueCat Webhook)
When the referee subscribes, RevenueCat sends webhook:- Finds code by
codes.redeemed_by_uid = "user_123" - Updates
codes.status = 'redeemed_confirmed' - Updates
referral_events.status = 'redeemed' - Checks if referrer reached threshold → creates reward
Why Two Phases?
Early Attribution
Know who referred whom immediately, before payment
Payment Confirmation
Only count confirmed subscriptions toward rewards
Anti-Fraud
Prevent duplicate redemptions at metacode phase
Flexibility
Works with any payment provider, not just RevenueCat
Referral Event Lifecycle
| Status | Trigger | Meaning |
|---|---|---|
clicked | Landing page visit | User clicked referral link |
code_assigned | /referee-redeem | Metacode redeemed, code issued |
redeemed | RevenueCat webhook | Subscription confirmed |
qualified | Threshold check | Counted toward referrer’s reward |
Anti-Fraud Measures
Duplicate Prevention
The/referee-redeem endpoint checks if referee_uid already redeemed a code for this campaign:
409 ALREADY_REDEEMED error.
One Code Per Campaign
Each referee can only redeem one code per campaign, preventing:- Multiple redemptions by same user
- Gaming the system with multiple accounts (requires unique app_user_id)
Matching Logic
Primary Match (Metacode Flow)
Fallback Match (Legacy)
If primary match fails, try matching by code value:Best Practices
Use Unique User IDs
Use Unique User IDs
Ensure
referee_uid is unique per user. Use your app’s internal user ID or RevenueCat’s app_user_id.Handle Webhook Retries
Handle Webhook Retries
RevenueCat may send duplicate webhooks. PromoStack handles this with idempotent updates (only updates if
status = 'issued').Monitor Attribution Rate
Monitor Attribution Rate
Track ratio of
code_assigned → redeemed events to identify drop-off points.
