Collett’s central system for inventory, VAT, lifecycle and allocation. Shopify is only the sales channel; every physical pair is its own record with purchase price, VAT profile, supplier, location and status.

The brief
Collett sells new and pre-owned in two stores, online, B2B and on consignment. Shopify counts per variant, the books per item: margin scheme or not, whose pair, and what margin per sale.
What we did
A platform with the item as the source of truth: a 26-screen admin app, a B2B portal and a consignment portal on one design system. A Fastify API with OpenAPI, PostgreSQL and BullMQ queues; business rules live in the state machine, not in a manual.
What we built
Collett CoreItems and review
Product groups, variants and physical items in three views. A six-step review wizard records purchase price, VAT profile and condition. Review never changes status; activation is a separate approval.
VAT and finance
A VAT worklist with blockers, profiles for the margin scheme, standard and zero rate, and an export pack per period for the bookkeeper. Everything per item, never summed per variant.
Shopify Control Center
Shopify sits downstream. Every sync runs as a dry-run with a readable log first; writes only happen after explicit confirmation, from this one screen.
Allocation and rebalancing
Orders are allocated per item (FIFO or maximum margin). Rebalancing suggests transfers based on days of cover, with reason and confidence. Stock never moves automatically.
Purchasing, transfers and returns
Purchase orders through a wizard with a printable declaration, transfers between locations and returns with inspection: restock, hold or deny.
B2B and consignment
Partners request, Collett approves per line; nothing is reserved before approval. Consignors only see their own items and payouts, with the sum: €200 sale, 30% commission, €140 payout.
In pictures
Scroll to browse








The hardest part
Enforcing rules in the interface instead of a manual. ‘Review is not approve’, ‘UNKNOWN_REVIEW_REQUIRED always blocks’ and ‘stock never moves on its own’ are fixed statuses and fixed copy in the system. Misuse is impossible, even on a busy Saturday.
Under the hood
Languages, frameworks and integrations- Languages
- TypeScript, SQL
- Monorepo
- pnpm workspaces, Turborepo
- API
- Fastify 5 on Node.js 22, OpenAPI
- Frontend
- Next.js 15 App Router, React
- Data
- PostgreSQL 16, Drizzle ORM
- Background jobs
- Redis, BullMQ
- Integrations
- Shopify GraphQL Admin API and webhooks, StockX enrichment
- Infra
- Docker Compose on its own VPS, JWT in an httpOnly cookie
