Loading...
Loading...
Three hard lessons from building revenue attribution for markets where the checkout page doesn't exist.
Short Field Note — Proova
---
Building Proova taught me that attribution is ultimately a trust problem, not a data problem.
When a transaction happens off-platform — WhatsApp, bank transfer, cash — there is no technical source of truth. There is only the business owner's word, the influencer's claim, and the customer's memory. Your system doesn't track the truth; it builds confidence around uncertainty.
Three things I learned the hard way:
1. Confidence scores are more honest than boolean matches.
Early versions of Proova tried to auto-match everything. A bank transfer came in, we found the closest influencer, we attributed it. This felt clean until it wasn't — a ₦100,000 transfer got matched to the wrong influencer because two campaigns ran simultaneously and the time proximity heuristic was too greedy.
We moved to a confidence-weighted system: auto-match above 85%, human review between 60-85%, unmatched below 60%. This slowed the pipeline but saved relationships. Influencers trust the platform more when they know a human eye checked the big numbers.
2. The ledger is the product.
I spent months polishing the dashboard — charts, animations, export buttons. Users cared, but not as much as they cared about the ledger. When an influencer disputes a commission, they don't want to see a chart. They want to see every transaction that contributed to their balance, with timestamps, reference numbers, and the matching logic that connected it to them.
The double-entry ledger we built in month two became the most-used feature in month six. Not because it was flashy, but because it was provable.
3. Real-time is a compromise, not a feature.
Our "real-time" analytics pipeline updates Redis counters within seconds of an event. But the nightly batch job sometimes finds discrepancies — a duplicate webhook, a timezone bug, a race condition in the speed layer. Every time this happens, we have to correct the Redis state and notify users that yesterday's number changed.
Users don't care about real-time. They care about right-time. A number that updates in 5 minutes but is correct is better than a number that updates in 5 seconds but might be wrong. We now lead with batch-layer numbers in official reports and use the speed layer only for internal monitoring.
---
Proova is live at [proova.app](https://proova.app)