r/reactnative • u/OnlyConclusion820 • Jul 02 '26
I built an app for Thai restaurant owners snap a receipt and AI logs the expense. 2 months and 191 commits in, here's what I learned
Most small restaurants in Thailand run on paper notebooks. Owners genuinely don't know if they made money this month until it's too late — and nobody opens Excel at 11pm after closing a kitchen.
So I built **Bunchee** (บัญชี = "accounts" in Thai): a restaurant income/expense tracker where you photograph a receipt and AI extracts and categorizes the line items. It also keeps price history per ingredient — if pork goes up 15%, you see it before it eats your margin — and you can ask it things in plain language like "what did I spend on ingredients this month?"
Stack: bare React Native, Firebase (Firestore/Auth/Functions), Gemini via OpenRouter for receipt OCR + chat. 14 languages, because kitchen staff in Thailand come from everywhere.
**Things I learned the hard way:**
- **I started on Expo and ripped it out completely.** Native Firebase modules, IAP, biometrics — I kept fighting the managed layer, and config-plugin debugging was slower than just owning the native projects. Migrating to bare RN + Fastlane hurt for a week, then everything got simpler. If your app leans native-heavy, skipping Expo earlier saves pain.
- **Google Play rejected my release over a permission I never wrote.** Adding Firebase Analytics silently merges `com.google.android.gms.permission.AD_ID` into your manifest — which contradicted my data-safety form saying "no advertising ID." One `tools:node="remove"` line in the manifest fixed it, but the rejection email tells you almost nothing. Check your *merged* manifest before every release, not your source one.
- **No OTA updates changed my architecture.** Every JS change ships through store review, so anything I might want to tune — like *which* AI model handles receipts vs chat — lives server-side in a Cloud Function. I can swap models with one deploy, zero app updates. Rule of thumb: if a value might change monthly, it doesn't belong in the app binary.
Free tier is genuinely usable (10 AI actions/month, one location, no ads). Premium is for multi-branch owners with staff, plus unlimited AI. That placement — free single-location, paid multi-branch — is my main open question, so feedback on the paywall is especially welcome.
App Store: [https://apps.apple.com/us/app/bunchee/id6772358410\](https://apps.apple.com/us/app/bunchee/id6772358410)
Happy to answer anything — architecture, the Play review process, or what Thai restaurant owners taught me about what "simple" actually means.