Challenge
POSI hosts dozens of science olympiad competitions across Indonesia — online and offline, free and paid. Registration windows are short, and parents frequently abandon Midtrans checkout before payment completes.
The ops team already supported families on WhatsApp through POSI Informasi. The bottleneck was operational: exporting lists, matching incomplete payments, and broadcasting reminders by hand before every deadline.
Approach
POSI’s engineers instrumented the Remix app with @zerohuman/zod before launching any campaigns. Server-side events cover the full registration funnel:
CompleteRegistrationwhen a student account is createdInitiateCheckoutwhen a competition fee or POSI Store order opens MidtransPurchasewithamountin IDR on successful paymentcompetitionId,province, andlevel(SD / SMP / SMA) on every event for segmentation
Marketing pages send PageView and call identify() after login so anonymous sessions merge onto the parent record.
Solution
Rather than a large campaign rollout, POSI shipped three flows in sequence:
| Flow | Trigger | Channel |
|---|---|---|
| Payment reminder | InitiateCheckout without Purchase in window | |
| Event reminder | Upcoming competitionId / exam date | |
| Competition card | Successful Purchase |
Payment reminder recovered the most abandoned checkouts — competition name, fee, and a deep link back to Midtrans. Event reminder replaced spreadsheet broadcasts before registration closed. Competition card delivered the student’s card (name, event, schedule) immediately after payment, cutting “where is my card?” volume on POSI Informasi.
Templates read variables from the trigger event. For new competition seasons, the team drafts flow branches in Cursor via MCP instead of rebuilding copy from scratch.
Results
Within ten days of going live:
- 11% revenue increase, attributed primarily to recovered Midtrans checkouts
- Fewer repeat admin questions on competition cards and exam dates
- Parent replies land in the same inbox thread as the original reminder
What’s next
Students often register for multiple competitions in the same month. POSI is moving reminders to entity scope per competitionId so parallel registrations do not overwrite each other.
