All projects
Featured ProjectAug 2026 – Present

Counter: Pricing & Menu Co-Pilot for Singapore Cafés

Most café owners in Singapore price by feel, or by walking down the street to check the shop next door. Counter does that walk for them, then helps decide what to do next. It does four jobs. Compare: your prices next to the cafés you pick, every price from that café's own menu and dated. Test: try a new price and see what it means for your month. Build: menu and offer ideas (sets, bundles, swaps) drawn from your menu and what the street sells. Follow: competitors' new items, offers and price changes, plus a Monday email, The Weekly Bake. Four of us built it for NUS ETP4212 while on NOC, through four versions and 50+ café visits. On 29 Oct we pitched it at the Ahrefs office in Singapore to a panel of Ahrefs' CMO and Prof. Virginia Cha, a serial tech founder who teaches entrepreneurship at NUS, and finished first of eight NOC teams. Arshin built the core app and its original dataset. I shipped the countr.site landing page and v2 of the app, built the Singapore expansion and Toronto data pipelines, instrumented the product with PostHog, and wrote the pitch story the final decks were built on.

→1st of 8 NOC teams · ~6,000 dated prices · 96 cafés · 50+ cafés visited · 22 in-store demos · 10 owners signed up
1st of 8 · NOC Pitch~6,000 Prices · 96 Cafés22 In-Store DemosSG + Toronto Pipelines
Customer DiscoveryPricingPitchingPythonJavaScriptSupabaseVercelPostHogOpenStreetMap · OneMappdf.jsOpenRouter (menu OCR)

A café's own menu comes in three ways (the owner uploads it, a diner snaps it, or Counter re-reads the online ordering page) and is turned into dated prices under fixed rules. From there Counter compares like-for-like, simulates a price change, suggests menu and offer ideas, and flags what changed nearby. The paid tier adds a message the morning a competitor moves.

MenusOwner · diner · webMenu Readerpdf.js · OCR for photosPrice RulesLatest exact · pre-GSTComparisonvs. nearest rivalsPrice TestWhat a new price meansMenu & Offer IdeasSets · bundles · swapsCompetitor WatchChanges · Monday email

Each stage is explained twice, first for the finance reader, then for the engineer.

1. Four Versions to Find the Real Problem

Finance lens

We started with menu-trend reports, then a price newsletter, then a price-and-menu email. Each got polite thanks and no payers. Walk-in interviews kept saying the same thing: owners know their own prices, they just find out last when the street moves. That became the bet. Comparison is free, and S$20 a month buys hearing first.

Engineering lens

Each version was a cheap test with one number to beat. The trend reports got 0 owners willing to pay. The price newsletter got 7 of 10 cafés saying they would use it if it were free. The price-and-menu email got 26 signups, and 9 of 10 respondents found it useful. Two owners then named a price before hearing ours: S$20 and S$40 a month.

2. A Comparison an Owner Will Trust

Finance lens

An owner checks the first price they know. If it's wrong, they never come back. So every price comes from the café's own menu with the date it was checked, and comparisons are dine-in against dine-in, before service charge and GST.

Engineering lens

Only the latest exact price per shop and item counts. Add-ons, merchandise, and prices with an unstated service-charge rate are left out rather than guessed, so 8,715 menu rows on file become ~5,950 counted prices across 96 cafés in 15 areas. AI is used in one place only, reading a photo or scanned menu. Text PDFs are parsed exactly in the browser with pdf.js.

3. Building It Out: v2, Analytics, a Second City

Finance lens

A pricing tool is only worth as much as its coverage, and an owner only trusts it if the first price they check is right. So the work after v1 went into reach and proof: more cafés in the areas owners compete in, a second city to test whether the model travels, and analytics that showed where owners dropped off.

Engineering lens

I shipped the countr.site landing page and v2 of the app (café-name search first, phone layouts, PDF menus parsed exactly with pdf.js, tested on 15 real menus). The Singapore pipeline screened 761 nearby cafés from OpenStreetMap, proving each address with OneMap and each price on the café's own page. Toronto runs off DineSafe inspection data: 54 cafés with verified prices, a city switch in the app, and tests that open every shop page. PostHog tracks one visitor from landing to app, with replays, heatmaps and AI cost per menu read.

4. The Pitch: First of Eight

Finance lens

I wrote the story the team's final decks were built on. It opens with one café, Tiong Bahru Bakery, and a rival 150 m away running a new offer it wouldn't hear about. Then the line we kept coming back to: the owner is the last to know. We presented at the Ahrefs office to Ahrefs' CMO and Prof. Virginia Cha and placed first of eight NOC teams. Outreach ran off the same data: 82 personal links, each opening on that café's prices against its four nearest rivals, and 14 Instagram reels generated in Python from our prices.

Engineering lens

Every number on a slide traced back to one facts file, with sources and capture dates. The parts we hadn't proven stayed labelled that way on stage: zero paying customers, an unbuilt alert, and a pass/fail test set for Chinese New Year 2027 (five of ten cafés still paying).

The honest limits. A page called “honest” with no limitations would be a credibility own-goal.

No payers yet

At the pitch, nobody was paying. Two owners named a price (S$20 and S$40 a month), and the real test is whether ten cafés keep paying through Christmas and Chinese New Year 2027.

Alerts not built

The S$20 tier (a message the morning a nearby café changes a price or starts an offer) was a waitlist at pitch time, not a working product.

Small market

Singapore alone is about S$5.5M a year at S$20 per operator. It only gets interesting if it travels to other cities.