Bairam Grocery Delivery
A grocery delivery app built on clean architecture, with a NestJS API that registers every customer in the retailer's 1C system before their first order.
The impact:
What this product is.
Bairam is a grocery delivery service. The app covers the whole customer journey — shop, cart, orders, account — in four localized tabs, and the backend keeps every one of those orders reconcilable against the retailer's existing 1C accounting system.
What needed solving.
A grocery business already runs on an ERP, and an app that creates its own parallel universe of customers and orders becomes an accounting problem within a week. Customer records had to exist in 1C before anything could be sold to them, and the failure case — 1C rejecting a registration — had to be visible to the customer rather than producing a ghost account.
How we approached it.
Account creation calls 1C first and only writes the Firestore user document once 1C confirms, marking it with an explicit “isInitialized” flag. A global guard rejects every user, order and email endpoint for accounts missing that flag, with a message telling the customer to contact support rather than failing silently. The Flutter client is split into core, data, domain and presentation layers, and resolves its environment from a build-time define so one codebase covers development and production.
What's inside?
A customer record is written locally only after the ERP confirms registration, so no order can exist without an accounting counterpart.
A global initialization guard protects user, order and email endpoints, with explicit opt-outs for registration and webhooks.
Shop, cart with a live subtotal in the tab label, orders and account, all localized and driven by a single navigation shell.
Transactional Firestore helpers guarantee exactly one default delivery address per customer, however many are added or removed.
Device tokens are stored per user and Cloud Messaging fires on order creation and cancellation.
A media layer converts Cloud Storage object paths into signed HTTPS URLs at response time, so product imagery is never publicly enumerable.
Tools change. Standards don’t.
We choose the stack around the product — not the other way around.
- Flutter
- Dart
- NestJS 10
- Firebase Auth
- Firestore
- Firebase Cloud Storage
- Firebase Cloud Messaging
- Google App Engine
- 1C Integration
- Swagger / OpenAPI
- GitHub Actions
- Fastlane
Flutter, Dart, NestJS 10, Firebase Auth, Firestore, Firebase Cloud Storage, Firebase Cloud Messaging, Google App Engine, 1C Integration, Swagger / OpenAPI, GitHub Actions, Fastlane
What we handled.
We worked on the product development and implementation, focusing on building a polished, functional and user-friendly experience aligned with the goals of the product.
