← All Projects

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.

IndustryGrocery Retail
Product TypeDelivery App
PlatformiOS & Android
BackendNestJS on App Engine
ResultEvery order reconciles against the retailer's ERP
Bairam Grocery Delivery project hero image

The impact:

2
Environments from one build
4
Architecture layers
0
Orders without a 1C record
100%
API documentation

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.

PROJECT FACTS
IndustryGrocery Retail
Product TypeDelivery App
PlatformiOS & Android
BackendNestJS on App Engine
ResultEvery order reconciles against the retailer's ERP

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?

1C-first account creation

A customer record is written locally only after the ERP confirms registration, so no order can exist without an accounting counterpart.

Guarded by default

A global initialization guard protects user, order and email endpoints, with explicit opt-outs for registration and webhooks.

Complete shopping journey

Shop, cart with a live subtotal in the tab label, orders and account, all localized and driven by a single navigation shell.

Address book with default handling

Transactional Firestore helpers guarantee exactly one default delivery address per customer, however many are added or removed.

Order lifecycle push notifications

Device tokens are stored per user and Cloud Messaging fires on order creation and cancellation.

Signed media URLs

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.

Mobile architecture and delivery
Backend API design
1C account and catalogue integration
Push notification infrastructure
Release automation