← All Projects

Bairam Grocery Delivery

A grocery delivery app for Derbent and Makhachkala. Shoppers browse a photographic catalogue and order in a few taps; behind it, every customer exists in the retailer's 1C before they can buy anything.

Shop tab with category chips and a two-column grid of products with prices and Add to cart buttons
Product page for pomelo sold by weight, 190 roubles per piece, with an Add to cart button
  • 2

    cities with home delivery

  • 220+

    products in the catalogue

  • 60+

    categories, up to three levels deep

  • 0

    customers without a matching 1C record

Client
Bairam, grocery delivery
Cities
Derbent and Makhachkala
Platforms
Android on Google Play, one Flutter code base
Our part
Design, Flutter app, NestJS backend, 1C integration
Timeline
Since 2025, in production

The brief.

Context

Bairam delivers groceries and household goods in Derbent and Makhachkala. The retailer already keeps its products and customers in 1C, so the app had to sell from that catalogue and treat 1C as the record for every buyer. We designed the app and built it together with its backend.

Challenge

An app that keeps its own customers next to an ERP becomes an accounting problem within weeks. A buyer had to exist in 1C before the first order. And when 1C refused a registration, the shopper had to be told so, instead of ending up with an account that quietly could not order.

Approach

Sign-in is by SMS code. Creating an account calls 1C first and writes the user document only after 1C confirms, marked as initialised. A global guard on the NestJS API rejects user, order and email requests from accounts without that mark and tells the shopper to contact support. The Flutter app is split into core, data, domain and presentation layers.

Aisles first, then the shelf.

The Shop tab opens on the whole catalogue: category chips over a two-column grid. Categories are photographic tiles up to three levels deep, from Fruit, vegetables and greens down to Fruit, with a breadcrumb back to the top. Products and prices come from the retailer's 1C.

Categories as photographic tiles: Kitchen, Fruit, vegetables and greens, Diapers, Laundry and more
Categories
Fruit, vegetables and greens opened to Vegetables, Fruit and Mushrooms, with a breadcrumb back to All
Subcategories
Fruit listing filtered by category chips: pineapple rings, pomelo, red plums and persimmons
Listing

One price, one button, a running total.

A product page leads with the photo, the price per unit and a single Add to cart button. The cart is kept on the server, so it survives a reinstall or a second phone, and the tab bar carries the running total.

Product page for pomelo sold by weight, 190 roubles per piece, with an Add to cart button
Product
Cart with ten items, quantity steppers and a green Checkout button showing 2364 roubles
Cart

No order without a 1C customer.

Registration is where the app meets the retailer's books. The NestJS backend on App Engine registers the shopper in 1C before it writes anything of its own, and every endpoint that touches orders checks that this happened.

  • Product photos sit in Cloud Storage and reach the app as signed URLs that expire, so the bucket is never public.
  • The app picks its environment from a build-time define, so one code base builds both development and production.
  1. SMS sign-in

    Firebase Auth confirms the phone number with a one-time code.

  2. Registration in 1C

    The backend creates the customer in 1C and waits for its answer.

  3. User record

    Only after 1C confirms is the Firestore user written, marked as initialised.

  4. Guarded API

    User, order and email endpoints refuse accounts without the mark; registration and webhooks are opted out.

  5. Order

    Every checkout belongs to a customer the retailer's 1C already knows.

Addresses, alerts and a theme.

Shoppers keep several delivery addresses, switch between light and dark themes and choose which notifications they get. Order status updates arrive as push notifications: the app registers each device with the backend through Firebase Cloud Messaging. Support is one tap away in Settings.

Settings with app theme, order status and promotion notification switches, legal links and support
Settings

Blue for actions, the food for colour.

The interface stays light and calm: rounded white cards, one blue for every action and green only for checkout, so the product photography carries the colour. The dark theme keeps the same layout with a lighter blue on a deep navy.

  • Action
  • Checkout
  • Ink
  • Background
  • Night
  • Night action
The pomelo product page in the dark theme
Dark product
The fruit listing in the dark theme
Dark listing

What we built.

Our part

  • Product design and interface
  • Flutter app for Android
  • NestJS backend on App Engine
  • Customer registration in 1C
  • Catalogue, cart and order API
  • Push notifications for order status
  • Release automation with GitHub Actions and Fastlane

Stack

App
  • Flutter
  • Dart
  • BLoC
  • GoRouter
  • Dio
Backend
  • NestJS
  • Google App Engine
  • Firestore
  • Firebase Auth
  • Cloud Storage
Integrations
  • 1C
  • Firebase Cloud Messaging
Operations
  • Crashlytics
  • GitHub Actions
  • Fastlane

Already running on 1C?
Let's deliver from it.

We build ordering apps on top of the accounting a business already has. Tell us where your stock lives.