Papu Studio
← All work
Operations + commerce platformin production with first customers

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
Locksmith working on a car key blank at a workshop bench

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 breaks
    Migration-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, payment
    Relational 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 office
    TV-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 primary
    Staff 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 one
    Hit. 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 customer
    Standing 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 + React
    App 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 ORM
    Data 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 Auth
    Sign-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 Entra
    Staff 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.

  • Resend
    Transactional email

    Ready emails, owner notifications, review-request flow, B2B order confirmations. Clean Finnish-domain deliverability without enterprise pricing.

  • Twilio
    SMS (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 + CDN
    Media storage and delivery

    Product photos, work-order documents, and brand assets. Egress is free, which matters when the catalog grows.

  • Procountor
    Accounting 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.5
    Code 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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

Tier reference

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

Want one of these for your team?

Start a project