Case Study

ADOB.hu – B2B Wholesale Product Catalog

Full-stack B2B product catalog for a Hungarian wholesale distributor — built for scale, Excel-driven imports, and zero-friction browsing.

ADOB.hu – B2B Wholesale Product Catalog hero image

Overview

ADOB Kft. is a Hungarian mixed-goods wholesale distributor that needed to replace a legacy product catalog with a modern, performant B2B web application. The goal was a publicly browsable catalog for retail buyers, backed by an admin panel enabling the client to manage thousands of SKUs via Excel imports — without any developer involvement in day-to-day operations.

The project was delivered as a fixed-scope contract with a hard deadline tied to a legal proceeding requiring a demonstrably live and operational web presence.

The Problem

The existing setup gave the client no reliable way to publish or update product data online. The catalog needed to handle a large, irregularly structured product database — multiple brands, deeply nested categories, and an Excel-based workflow that the client's team had no intention of replacing.

Key constraints:

  • Product data lives in Excel. The import pipeline had to be the single source of truth.
  • Categories and brands are implicit in the spreadsheet — they needed to be resolved, normalized, and deduplicated on ingest.
  • The client needed full ownership: the system had to work without a developer on call.

Architecture

The application is split into two independently deployed services:

Frontend (Next.js / Vercel) Server-rendered product and category pages optimized for SEO and fast initial load. Typesense powers instant faceted search on the client side. Tailwind CSS with a custom design system built to the client's brand.

Backend (NestJS / Hetzner VPS) A REST API backed by PostgreSQL via Prisma ORM. BullMQ handles async import jobs — large Excel files are processed in the background with real-time progress tracking surfaced in the admin UI. The media pipeline fetches, resizes, and stores product images from external URLs.

Import processing uses a closure table pattern for category hierarchies, enabling efficient ancestor/descendant queries at any depth without recursive SQL.

Key Engineering Challenges

Excel Import Pipeline The most complex piece. Each import batch resolves brands and categories by name (case-insensitive, with conflict detection), generates URL slugs with a hierarchical deduplication strategy, computes per-product checksums to skip unchanged rows, and queues media fetching separately to avoid blocking product writes.

Category slug generation handles a non-trivial set of cases: root-level conflicts get numeric suffixes; child categories use parent slug as context (e.g. phones-electronics); exact matches are reused across imports to ensure idempotency.

Search Typesense was chosen over Elasticsearch for operational simplicity on a single VPS. Products are indexed incrementally on import completion. Faceted filtering by brand, category, and price range is sub-100ms in production.

Security Hardening Nginx with GeoIP2 geo-blocking, @nestjs/throttler for endpoint-level rate limiting, and Fail2ban on login endpoints — appropriate for a public-facing B2B app with an admin panel exposed on the same domain.

Delivery

The application launched on schedule, satisfying the client's legal deadline. Post-launch, the project transitioned to a managed hosting contract covering server operations, automated daily backups, SSL management, and reactive support.

Next Project

Active-Fitness.sk — One-Page Gym Website

Next →