---
title: Kleidarakos B2B & Papanikolaou Doors
description: >-
  A B2B marketplace replacing the spreadsheet-and-phone process for a Greek locksmith network. Quote workflows,
  multi-supplier catalog imports, and a 3D door configurator that lets customers visualise before ordering.
lang: en
source: https://jimrarras.com/en/projects/kleidarakos-papanikolaou/
fetched: '2026-09-19T05:53:17.576Z'
---

Lead Developer

A B2B marketplace replacing the spreadsheet-and-phone process for a Greek locksmith network. Quote workflows, multi-supplier catalog imports, and a 3D door configurator that lets customers visualise before ordering.

- **24** suppliers feeding one unified catalogue

- **15** of them with a live price check

- **10** door designs the customer configures alone

- **412** ready-made images that build the door on screen

## Stack
## The situation

Kleidarakos and Papanikolaou Doors run a Greek locksmith network. Their trade customers ordered by phone and spreadsheet, and every supplier kept its own price list in its own format. They needed one unified catalogue, quotes approved without a phone call, and a way to show a customer a door before they order it. I took the project on as the only developer.

## One catalogue instead of twenty-four

Products from 24 suppliers now sit in one catalogue, with one price per code and one filter per supplier. The catalogue refreshes itself on a schedule, and duplicates are caught before they reach a customer.

![Pixel art illustration of a catalogue screen: a multi-supplier filter on the left, a product table with code, name, quantity and supplier in the middle, and an encrypted-credentials icon at the top right](https://jimrarras.com/images/projects/kleidarakos-papanikolaou/pim-admin.webp)

One table for every supplier, with a filter per supplier

How it works

- **Backend:** Express 5 with TypeORM and PostgreSQL, 58 controllers, 68 entities and 411 API endpoints, covering the bookkeeping side as well as the catalogue.
- **Imports:** one adapter per supplier, because every platform has its own HTML and its own quirks; jobs run on BullMQ queues with a per-supplier rate limit, and credentials are stored encrypted with AES-256-GCM.
- **Matching:** a matching engine on EAN, MPN and brand proposes duplicates; a merge goes through approval, keeps a snapshot for undo, and never deletes a product row.
- **Search:** Meilisearch, alongside fuzzy database search for Greek product names.
- **Beyond the catalogue:** bookkeeping with Greek VAT applied at catalogue level, appointments synced with Google Calendar every 15 minutes, and real-time notifications over Socket.IO.

## Ordering without a phone call

Trade customers sign in with their company account, ask for a quote, see it approved and place the order themselves. Hierarchies and approval limits are part of the store, not something somebody remembers on the phone.

![Pixel art illustration of a B2B store in a browser window: a banner with a key and a quote-workflow button, above cards showing padlocks, doors and keys](https://jimrarras.com/images/projects/kleidarakos-papanikolaou/storefront.webp)

The B2B store: company sign-in and the quote flow from the homepage

How it works

- **Store:** Medusa 2.14.2 with the B2B modules for companies, employees, quotes and approvals, and a Next.js 16 storefront.
- **Our own modules:** brands, newsletter and notifications through Resend, on the same core.
- **Payments:** Stripe and PayPal.
- **Catalogue admin:** React 19 with Vite and TanStack Router, Query and Table, refreshing the token before it expires so nobody gets logged out mid-task.

## The door before the door

The customer picks a design, a finish, dimensions, a handle and a lock, and watches the door change straight away. The configuration is shareable as a link and comes out as a PDF quote.

![Pixel art illustration of a door configurator: an armoured door with a handle and bolts on the left, and a side panel of swatches for colour, material and pattern on the right](https://jimrarras.com/images/projects/kleidarakos-papanikolaou/door-configurator.webp)

The configurator: the door on the left, the options on the right

How it works

- **Options:** 10 door designs, 8 finishes, 6 handles and 3 locks, with an indicative price on every selection.
- **Imagery:** 412 ready-made WebP files, rendered once in headless Blender and committed to the repo; the browser simply stacks them with a cross-fade.
- **Why that way:** with no 3D in the browser, the configurator runs on whatever laptop the buyer has with them, graphics card or not.
- **Check:** the build fails if any combination of options points at an image file that does not exist.

The most “three-dimensional” part of the job runs no 3D in the browser at all: the doors were rendered once in Blender, and the browser composites ready-made images.

## Links

## Related work

- Production deployment internal (no public storefront URL).
- Configurator repo: `jimrarras/papanikolaou-doors` (private)

- Heartbeat Pharmacy Platform: another Medusa build, but B2C pharma instead of B2B locksmith
