ClientProduction2024–present

Kleidarakos B2B & Papanikolaou Doors

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.

Results

suppliers feeding one unified catalogue
24
of them with a live price check
15
door designs the customer configures alone
10
ready-made images that build the door on screen
412
Kleidarakos B2B & Papanikolaou Doors

Stack

  • Medusa B2B
  • Next.js 16
  • Express + TypeORM
  • React 19 + TanStack
  • Three.js + R3F
  • BullMQ + browser automation
  • Chrome Manifest v3
  • Google Calendar OAuth

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
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
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
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.
  • 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
Get in touch

Display preferences

Text

Text size
Line spacing
Letter spacing

Color

Contrast

Motion and images

Reading

Reading aid
No changes