Poppy is sales coordination and commission tracking for small commissioned retail teams, built first for prepaid wireless dealers. It is for the rep on the floor who does not find out what they earned until payday, and the manager who does not find out the store missed until the month has closed.

What it does

A rep logs a sale in a few taps, or says it. "Two lines, a protection plan, and forty three in accessories" becomes three itemized lines with the commission each one pays. Nothing is saved until the rep confirms it, and when Poppy is not sure what was meant it asks instead of guessing.

The manager sees the store's day as it happens: the box total against the goal, every rep's pace, and the single product the store is short on. One focus goes out for tomorrow and lands on every rep's phone.

Every commission is frozen to the plan it was sold under. A September sale keeps September's rates and spiffs after October's plan is published, and the app shows which plan version produced the number. That is the hard part, and it is why the commission engine runs on the server and never on the phone.

Things you can check without installing anything

The backend's health endpoint is public and needs no key:

https://ccqdawsruksoaxvixedr.supabase.co/functions/v1/health

It answers with the deployed commission engine version, the migrations head and count, the outbox depth and the live probe states. At the time of writing it reports engine 2.0.0 and 72 migrations applied.

The repository goes public at the submitted commit under AGPL-3.0.

How it is built

Expo and React Native on the front, Supabase and Postgres on the back, with the business rules in the database rather than the client. Four rules the codebase actually enforces:

  1. AI proposes, a person confirms, the backend validates. A spoken sale is a proposal until the rep taps confirm.
  2. Postgres is the source of truth. Commission is never computed on the phone.
  3. RevenueCat proves payment. Poppy decides which team gets the access that payment bought.
  4. History never drifts. A sale keeps the plan version and spiffs it was written under, forever.

Voice is Deepgram Nova-3 streaming behind a short lived token minted by an Edge Function, then a deterministic parser, with one structured model call only as a fallback. Raw audio is never stored.

Monetization

Poppy sells a location allowance rather than seats. A manager buys the number of stores they run and assigns that many teams to the subscription. One store is $15.99 a month and each additional store adds $10, up to five. Reps join free with an invite and never see a paywall.

Seat pricing would punish a manager for hiring, which is the opposite of what a dealer does when a store is doing well. Stores are what actually grows, so the price follows stores.

Ten products in one subscription group with a seven day free trial, one RevenueCat entitlement across all of them, and a server side claim that assigns the allowance to specific teams under a row lock, so an allowance can never cover more stores than it was bought for.

What Poppy deliberately does not do

No GPS and no location. No presence, online status or last seen. No check-in timestamps. No built-in chat. No rep-level leaderboards.

These are not missing features. The people this is built for are hourly and commissioned, and the same data that helps a rep get paid correctly would make an excellent tool for watching them. A tool their manager can use to watch them is a tool they will not open. Visibility is asymmetric on purpose: a rep sees their own numbers, a manager sees their store, and anything above a manager sees aggregates only, so a district read returns stores and never a named rep.

Awards this submission is entering

Grand Prize, RevenueCat Peace Prize, RevenueCat Design Award, HAMM Award, Keep Them Coming Back (OneSignal), The Growth Loop (Layers), #BuildInPublic, and Next Gen.

Built by

Two people. Stephen Sookra on Postgres, row level security, Edge Functions, the commission engine, billing, voice and release engineering. Khadim Drame on the app: every screen, the design tokens, the motion and the paywall.

Built With

Share this project:

Updates