All case studies
Mobile App

ThuTlai

Every Cambodian discount in one app, kept current by automated collection.

Engagement
Cambotix product
Industry
Consumer & Retail
Year
2026
Our responsibility
Product architectureFlutter appCollection pipelineMerchant dashboard

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.

01

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.

02

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.

03

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.

04

Redis-cached feeds

The browse feed is served from cache and invalidated on ingestion, so the app stays responsive regardless of pipeline activity.

Built with
FlutterNode.jsPostgreSQLRedisPythonScrapy

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.