ThuTlai
Every Cambodian discount in one app, kept current by automated collection.
- Engagement
- Cambotix product
- Industry
- Consumer & Retail
- Year
- 2026
The challenge
Promotions in Cambodia are scattered across Foodpanda, Grab, Wownow, bank apps and individual retailers, announced in Facebook posts and expired without notice. Shoppers spent real time hunting codes, and most of what they found no longer worked.
Our approach
Freshness was the whole product. An aggregator with stale data is worse than no aggregator, so we invested in the collection layer first: scheduled scrapers with a validation pass that retires offers rather than trusting a listed end date. A merchant dashboard then let partners bypass scraping entirely and publish authoritative offers.
What it had to achieve
- One place to find current discounts across major local platforms
- Expired offers removed automatically, not reported by users
- Give merchants a way to publish offers directly
- Reward repeat use so the app becomes habit
Architecture
The decisions that made the rest possible.
Two-source ingestion: scraped and merchant-published
Merchant-published offers are authoritative and override scraped equivalents, so partnerships directly improve data quality instead of duplicating it.
Playwright for rendered pages, Scrapy for static
Each source is collected with the cheapest tool that works, keeping the pipeline's running cost proportional to actual difficulty.
Validation pass that retires offers
Offers are re-checked on a schedule and withdrawn when they stop resolving, rather than lingering until their stated expiry.
Redis-cached feeds
The browse feed is served from cache and invalidated on ingestion, so the app stays responsive regardless of pipeline activity.
What we delivered
- Flutter app: browse, search, filter and save offers across platforms
- Loyalty points system rewarding repeat engagement
- Python collection pipeline (Scrapy + Playwright) with scheduled runs
- Offer validation and automatic retirement
- Next.js merchant dashboard for direct offer publishing
- Admin dashboard for source health and moderation
Outcomes
What changed once it was live.
- Shoppers check one app instead of five and a Facebook feed
- Dead offers drop out without user reports
- Merchant partnerships upgrade data quality rather than adding duplicates
What we would do differently
Every project teaches something. Publishing it is how you tell whether a team is reflecting or just selling.
- For an aggregator, the collection pipeline is the product and the app is the shopfront. Under-investing in freshness would have made the UI irrelevant.
- Letting merchant data override scraped data gave partnerships an obvious value story, which made them easier to sign.
Let's find out if this is worth building.
A 45-minute discovery call, free. You describe the problem, we tell you honestly what it takes, what it costs, and whether you should build it at all.