Back

Case study

Deskon

Local Business Discovery Platform

deskon.in

Visit live site

Product preview

Screenshots

Overview

Architected Deskon — a subscription-gated local business platform with a NestJS API, dual Next.js apps for discovery and operations, PostgreSQL, Redis caching and background queues, cloud media storage, and a listing eligibility engine with profile scoring, government verification workflows, and city-scoped role-based access.

Problem & goal

The Challenge

Local consumers struggle to discover verified nearby businesses with comparable services and products. Shop owners need a single portal to publish listings, manage catalogs, handle enquiries, and stay visible only while subscribed — without building separate websites or ad-hoc directories.

Deskon operates a three-sided marketplace: consumers browse, search, compare, and enquire; shop owners manage businesses, services, products, verifications, and subscriptions; platform admins and field operations staff govern catalog quality, plans, and city-scoped access.

Target users

Who It's For

  • Consumers — search and browse by location or category, compare products, save favourites, submit enquiries, and leave reviews

  • Shop owners — business profiles, media, services and products, verifications, analytics, and call-to-action tracking

  • Admins — user management, plans, subscriptions, verifications, roles and permissions, and platform analytics

  • Managers and staff — city- or allocation-scoped oversight of shop owners and listings

Core capabilities

Platform Modules

Auth & access control

Secure login with Google OAuth, role-based permissions, and granular access for admins, managers, staff, and shop owners.

Business profiles

Rich business listings with media, scoring, status workflows, and owner-managed catalog content.

Catalog

Services, products, brands, and hierarchical categories with side-by-side product comparison.

Discovery

Search with geo and category filters, backed by database queries and in-memory caching for repeat lookups.

Subscriptions

Plan management and active-subscription gating so only paying businesses appear in the public catalog.

Verifications

GST, MSME, and FSSAI verification workflow with admin review and background processing.

Enquiries & reviews

Lead capture for consumers, review moderation, and owner-facing enquiry management.

Analytics & notifications

Event tracking, call-to-action click analytics, business dashboards, and multi-channel notifications via email, SMS, and push.

Allocations

City-scoped manager access and staff-to-shop-owner mapping for regional operations.

Control panel

Dedicated admin console for platform operations, separate from the customer-facing discovery app.

High-level design

System Architecture

The platform ships as three deployable applications sharing one backend contract: a Next.js customer app for public discovery and shop-owner portals, a Next.js control panel for admin and field operations, and a NestJS API on a high-performance HTTP adapter handling versioned REST endpoints, validation, and role guards. PostgreSQL stores relational business data with TypeORM. Redis powers search caching and background job queues for email and verification processing.

External integrations include object storage for photos and videos, transactional email, Firebase push notifications, and SMS delivery. Subscription-gated listing rules and contact privacy for anonymous users are enforced server-side on every public query. Role-based admin controls and encrypted credential storage protect sensitive operations.

Production stack

Technology Stack

Frontend

  • Next.js
  • React.js
  • TypeScript
  • Tailwind CSS
  • Radix UI

Backend

  • NestJS
  • Fastify
  • TypeORM
  • Swagger

Data & messaging

  • PostgreSQL
  • Redis

Infrastructure

  • Docker
  • Nginx
  • DigitalOcean
  • Firebase

Find businesses locally

Discovery & Search

Consumers filter by query text, city, geo radius, category, and rating. Search runs against PostgreSQL with subscription eligibility applied on every public result so expired listings never surface. Identical filter combinations are served from an in-memory cache with versioned namespaces for safe invalidation when listing rules change. Contact details such as phone numbers, messaging links, and coordinates are withheld from anonymous users until they authenticate.

Trust and visibility

Listing Quality

Profile scoring

Weighted scoring across profile completeness, verification status, reviews, and recent activity to surface higher-quality listings.

Subscription gate

A single eligibility rule reused across businesses, services, and products ensures only active subscribers appear in consumer search.

Product comparison

Side-by-side property matrices let consumers compare products before submitting an enquiry.

Session-aware analytics

View and search events tracked with throttling to power business dashboards without duplicate noise.

City-scoped access

Multi-Role Operations

Admins have full platform access. Managers see shop owners and listings only in their assigned cities. Staff support explicitly allocated shop owners without visibility into national data. Shop owners manage their own businesses. Consumers and anonymous visitors see the public catalog with contact privacy applied. Regional managers can approve verifications and monitor listings within their territory without exposing data from other cities.

External services

Integrations

Object storage

Cloud object storage with optional CDN delivery for business photos and video uploads.

Email

Transactional email queued through background workers for verification, subscription, and enquiry events.

Push notifications

Firebase-powered mobile push for time-sensitive owner and admin alerts.

SMS

Configurable SMS delivery for key notification events alongside email and push.

Challenges solved

Engineering Highlights

01

Listings visible after subscription lapses

Central subscription eligibility checks injected into all public search and catalog queries.

02

Contact scraping by anonymous users

Server-side contact masking on public API responses until the user authenticates.

03

Heavy search load on the database

In-memory cache keyed by filter parameters with versioned namespaces for safe rule updates.

04

Multi-city ops without data leaks

City-scoped allocations so managers and staff only see businesses in their assigned regions.

05

Large photo and video uploads

High-throughput multipart handling with cloud object storage offloading media from app servers.

06

Verification processing latency

Background job queues and scheduled renewal checks for GST, MSME, and FSSAI workflows.

07

Inconsistent listing quality

Weighted profile scoring that incentivizes complete profiles, verifications, and active engagement.

Built for production load

Performance & Scale

  • In-memory search cache avoids repeated heavy database joins for identical filters

  • Cache namespace versioning enables safe invalidation when listing rules change

  • Pagination on admin lists, search results, and enquiries

  • Analytics view throttling reduces duplicate tracking events per session

  • Background workers scale email and verification jobs independently of the API

  • Stateless API supports horizontal scaling behind a reverse proxy

  • Selective relation loading keeps detail pages efficient

Operations

Deployment

The production stack runs in Docker containers — database, cache, API, customer app, control panel, and reverse proxy — with automated TLS certificates. Scheduled database backups and structured log rotation support ongoing operations. Health checks on core services ensure reliable uptime for the discovery platform.

Roadmap

What's Next

  • Self-serve subscription payments and auto-renew

  • Live government API integration for GST, MSME, and FSSAI verification

  • Campaigns backend for featured placement and promotional budgets

  • Advanced search engine if catalog scale outgrows database full-text search

  • WhatsApp enquiry notifications for shop owners

  • Consumer mobile app consuming the same versioned API