Autonavaimet
One Next.js app where there were four legacy vendors.
Garage Corporation Oy runs the autonavaimet.fi key, lock, and auto-electrics workshop and the autelsuomi.eu B2B parts catalog. The legacy stack was Magento 2 (bleeding security updates), Tehden POS at the till, Paytrail for online payments, and a separate scheduling tool the workshop staff could not reach. We collapsed it into one Next.js app: public booking calendar, in-shop status board on a TV, kassa with sequential receipts, B2B catalog with credit gates, inventory ledger, performance dashboards, Finnish bank-holiday awareness, and the migration off Magento on its own schedule.
What it does
- Public booking calendar with per-location capacity, opening hours, and Finnish bank holidays
- Seven-step workshop status flow on a TV board, mandatory reasons for stopped jobs
- Kassa with sequential receipts, VAT 25.5%, daily totals, Procountor CSV export
- B2B catalog with credit-gated invoice ordering and approval queue
- Microsoft Entra + Google + Better Auth across staff and customer surfaces

Garage Corporation Oy runs Autonavaimet (key, lock, and auto-electrics workshop) and Autel Suomi (B2B parts catalog for the trade). The legacy stack was Magento 2 for the webshop, Tehden POS at the till, Paytrail for online payments, and a separate scheduling tool none of the staff could reach from inside the workshop view. Four vendors, four logins, customer data in three places. The Magento side was the trigger: security updates lagging, the upgrade path effectively a rewrite. They came to us to collapse it all into one Next.js app: public bookings, in-shop status board, kassa, B2B catalog, inventory, CRM, performance, and the migration off Magento before it broke. First production deploy went out the same week we started.
Why it was developed
Garage Corporation runs Autonavaimet (the key, lock, and auto-electrics workshop) and Autel Suomi (B2B parts for the trade). The webshop was Magento 2, the till was Tehden POS, the online payments were Paytrail, and the scheduling lived in a separate tool the workshop staff could not see. Each had its own login, its own customer model, its own idea of what a job was. The work to keep them roughly in sync ate the supervisor's day.
Magento 2 was the actual trigger. The platform's upgrade path is effectively a rewrite, security patches were running behind, and the existing theme had drift the original implementer was no longer maintaining. Replacing Magento alone would have been a project. Replacing Magento and rebuilding the rest of the stack alongside it, on one set of customer and product tables, was a bigger project but the only one that solved the operator problem instead of moving it.
Autonavaimet is that build: one Next.js app serving both domains, owning bookings, the workshop status board, the kassa, the B2B catalog, inventory, CRM, performance dashboards, and the migration off Magento on its own schedule. The supervisor opens one app to see the day, take a payment, approve a B2B customer, or check the month's numbers.
What it solves
Roughly in the order the day unfolds, from a customer booking online to the till closing at end of day.
- Customer booking a key job online
- Before
- Pick up the phone and call the shop. The Magento side had no booking surface; the scheduling tool was internal only.
- After
- Public month calendar at /varaa greys out past, closed, and full days using real capacity. Customer picks a time, work order opens in the supervisor's queue with the booking attached.
- Knowing what is happening on the workshop floor
- Before
- Tehden POS, the scheduling tool, and the supervisor's head. No shared view. Mechanics interrupted constantly.
- After
- Seven-step status flow (Awaiting, Arrived, In progress, Stopped, Add-on order, Ready, Delivered) on a TV per location. Mechanics drive their own jobs; the supervisor watches the board.
- A stopped job nobody decides on
- Before
- The mechanic flags an issue verbally or in WhatsApp. Sometimes the supervisor sees it, sometimes not.
- After
- Stopped status requires a reason and a note. Alarms after thirty minutes without a supervisor decision at the kassa. Nothing falls through.
- Inventory drifting from reality
- Before
- Parts decremented by hand at end of day from Tehden's report, with the usual gaps.
- After
- Work-order completion writes to an append-only stock movement ledger. Reorder costs are backfilled so the Tilattavat (to-order) view shows true cost without a fresh supplier feed.
- Taking payment at the till
- Before
- Tehden POS for the till, Paytrail for cards online, no shared receipt numbering, manual VAT reconciliation against the booking.
- After
- Kassa inside the same app, sequential receipt numbers across both branches, VAT 25.5% applied per line, daily totals on the dashboard, Procountor CSV export for the bookkeeper.
- Bank holidays and staff off
- Before
- Mark each year's holidays by hand. Easter movable holidays got missed at least once.
- After
- Per-location 'Fetch Finnish holidays' button computes Easter-derived dates for any year. Each holiday has an opt-in 'staff off' tickbox that drops billable hours and revenue targets for that day, never assumed.
- B2B customers ordering parts
- Before
- Email, phone, a Google Sheet of prices for trade buyers. Approval lived in the supervisor's head.
- After
- B2B account signup, approval queue, gated catalog, invoice-only ordering with credit terms. Order history visible to both sides. Approval status is part of the customer record.
- Knowing whether the month is on track
- Before
- Open Tehden, mental math, repeat.
- After
- Management dashboard shows sales today, sales month vs target, open and ready jobs, inventory value, stock alerts, per-mechanic billable hours and utilization, CSAT averages from public 1-5 review pages.
What the goals were
Set at kick-off with the architecture decisions locked in nine ADRs. The build is held to these.
- Replace Magento before it breaksMigration-first build sequence (ADR 0002). The new schema landed and the importer ran against the Magento export before any other surface went live. Cutover is incremental, one product family at a time, no flag-day risk.
- One source of truth for customer, vehicle, job, inventory, paymentRelational core plus targeted append-only ledgers (ADR 0003), not full CQRS. Customer 360 page surfaces lifetime spend, receipts, B2B status, and vehicle history from one schema.
- Workshop runs on the floor, not in the officeTV-per-location board shows the live status flow. Mechanics drive their own jobs from a phone or a kiosk. The supervisor's view is read-mostly until a stopped job needs a decision.
- Bilingual, Finnish primaryStaff and customer surfaces ship in Finnish first, English where it matters. The CONTEXT glossary anchors the domain terms so Työnjohto means the same thing in code, in the UI, and in conversation.
- First production deploy inside week oneHit. The first public booking and the first internal work order both went through the real app within the first week, before any legacy surface was retired.
- Ship daily, verify in the browser, never block on the customerStanding rule: every deploy runs typecheck, lint, tests, and build, then verifies live with Chrome before moving on. The customer reads a changelog page (/admin/changelog) listing what shipped and what needs them, owner-tagged.
How we reached the goals
Short loops with the customer in the room. Daily deploys, often several. Each batch ends with a browser verification pass against the live URL and a one-line changelog entry the supervisor reads in the morning. No requirements document, no Jira, no estimating poker.
The ratio is the same as on every Papu Studio build: Anthropic Claude does most of the typing, an experienced operator does the thinking. The model is fast at scaffolding, schema, server actions, the boring glue. The human stays on the architecture (nine ADRs locked early), the safety calls (B2B credit gates, sequential receipts, audit-logged staff impersonation), and the decisions that need taste (when a Stopped job alarms, what shows up on the TV, when to push a feature behind a flag).
Sequence mattered. Migration before flair. Schema before surface. Status flow before notifications. By the time the kassa, the booking calendar, the B2B catalog, and the management dashboard all landed, the schema underneath had been carrying real work for weeks and the shape was stable.
Tech we used
Named so any SME owner can search and verify.
- Next.js + ReactApp framework
One Next.js app serves both autonavaimet.fi and autelsuomi.eu (ADR 0004). Server actions keep mutations close to the database, no separate API layer.
- PostgreSQL + Drizzle ORMData layer
Type-safe schema, migrations as plain SQL files, append-only ledgers for inventory and status history. Chosen over Prisma explicitly (ADR 0001).
- Railway (EU)Hosting and managed Postgres
Single dashboard for the web service, the database, the public proxy for one-off SQL, and env vars. EU region keeps customer data inside the bloc.
- Better AuthSign-in for staff and customers
Credentials, Google, and Microsoft Entra all linked to the same account by email. B2B customer auth lives on a separate route surface from staff /login.
- Microsoft EntraStaff SSO
Henrik delivered tenant credentials; staff sign in with their work Microsoft account, roles preserved by email match on first login.
- Stripe (Payments, Terminal, Tax)Payments
Online card payments via Stripe Checkout, in-shop card payments via Stripe Terminal hardware paired on site, Finnish VAT handled by Stripe Tax.
- ResendTransactional email
Ready emails, owner notifications, review-request flow, B2B order confirmations. Clean Finnish-domain deliverability without enterprise pricing.
- TwilioSMS (planned)
Reserved for status-change notifications to customers (job ready, work pausing for parts). Wired but not yet enabled, customer holds the credentials.
- Cloudflare R2 + CDNMedia storage and delivery
Product photos, work-order documents, and brand assets. Egress is free, which matters when the catalog grows.
- ProcountorAccounting integration
Receipts and invoices export to Procountor via CSV (semicolon, BOM) on a daily schedule, sized for the bookkeeper's import flow.
- Anthropic Claude Sonnet 4.5Code generation
Drafts schema, server actions, page wiring, tests, and Finnish copy from English. The operator stays on architecture and safety calls.
The process
What working with Papu Studio looks like, from first message to the day you own the code.
- Discovery
A grilling session, one to three hours, structured. We map the actual workflow, name the domain terms, and lock the early architecture decisions as ADRs. You leave with a written project context document, a glossary, and a fixed price and date for the first surface.
- Scoped MVP
First production deploy inside week one. Real schema, real auth, real data. From there every change ships behind your sign-in within hours and you verify it live the same day.
- Continuous delivery
Multiple deploys a day at peak. Every batch ends with a browser verification pass and a changelog entry. The supervisor sees what shipped and what needs them, tagged by owner.
- Ownership transfer
The code lives in your GitHub from day one. Railway and Cloudflare are your accounts. The Stripe keys are yours. If Papu Studio vanishes tomorrow, any competent engineer can take the next ticket from the changelog. No lock-in to us, no per-seat fees, no platform tie.
Run a workshop with a webshop and a B2B side? You can buy this same system.
Autonavaimet is in production, used daily by the supervisor and the mechanics, with Magento running alongside it during the migration. If you operate a key, lock, auto-electrics, or similar workshop that also sells parts to consumers and to the trade, the shape of what you need is close enough to this build that most of the work is a re-skin and a data migration.
A similar build runs at roughly half the standard Complex tier price because the schema, the status flow, the booking and kassa contracts, the bank-holiday awareness, the B2B credit gates, and the migration tooling are already in place. What remains is the operator-specific work: your locations, your product taxonomy, your accounting export shape, your staff roles. If you want to see the production app running before deciding, that's a thirty-minute call.
Complex
€10,000+A back-office or commercial product big enough that the integrations and edge cases are the hard part.
What this tier includes →Want one like this for your workshop?
The hard part, working out the right shape for a mechanic-led workshop that also runs a webshop and a B2B catalog, is solved. A similar build for another key, lock, or auto-electrics shop runs at roughly half the standard Complex tier price, because the schema, the seven-step status flow, the booking calendar, the kassa contract, and the bank-holiday handling are already proven in production.
Start a project