Case study: building the ERP for an 11-person door and trim distributor

Spencer Brimley · Baserow + n8n + Python + QuickBooks Online · Aug 2022 – Oct 2026

At a glance

The problem

The business ran on paper and QuickBooks. QuickBooks held the money, but nothing tracked the work between a quote and a delivery, so three things kept going wrong:

The catalog had no SKUs either. The same door was written a dozen ways ("2-6 6-8 2-Panel Monroe HC"), so prices, reorders and vendor matching all depended on someone's memory.

How I built it

  1. I started small. The first version (August 2022) was a task board on Vikunja, an open-source task manager, to track orders that used to live on paper. At that stage it was mostly a CRM and project tracker. Once the process was clear I rebuilt it as a proper database on Baserow.
  2. Discovery and requirements. I mapped the work before building anything. I followed an order from estimate to invoice, purchase order, receiving, production, delivery or will-call, and payment, and noted who touched it at each step.
  3. Data model and configuration. I designed the data model around that flow, in two databases: Operations (17 tables: Estimates, Worksheet Lines, Invoices, Purchase Orders, Hardware Orders, Production, Deliveries, Will Calls, Installs, Customers, Vendors, Notes, Call Log, Bill Discrepancies, Cost Edit Log, and two support tables) and Catalog (14 tables: Doors, Door Styles, Door Types, Mouldings, Parts, Services, Vendors, Vendor Item Codes, and an inventory module).
  4. SKUs and data migration. I gave the catalog SKUs. Every item got one, and each vendor's own part numbers map to it (1,428 cross-references). I wrote a Python resolver that reads a shop-floor description and returns the SKU, and flags anything ambiguous for a person to review instead of guessing.
  5. QuickBooks stayed the book of record. I didn't replace accounting. Baserow ran operations, and n8n kept the two in sync through QuickBooks webhooks and API calls, so staff never typed the same thing into both. There was no automation until May 2025, when I added n8n.
  6. Screens built around each person's job. Each role had its own views (61 grids, 2 calendars, 1 kanban board): the shop saw production, the driver saw deliveries, the office saw what still needed ordering.
Diagram of how the ERP fit together: staff worked in Baserow tables, n8n ran workflow groups between Baserow and QuickBooks Online, phone events popped the caller's account on staff screens, and worksheet PDFs and vendor bills reached Baserow through two small programs
How the pieces fit together. Baserow held the work, QuickBooks held the books, and n8n and two small Python programs moved data between them.
Baserow grid view of the door catalog: SKU, style, type, purchase and sales price, preferred vendor
The catalog, with SKUs. Every row cross-referenced the vendors' own part numbers.

The automation layer (29 n8n workflows)

AreaWorkflowsWhat they do
Accounting sync8QuickBooks webhooks, customer sync into Baserow, price sync, routing estimate worksheets into QuickBooks estimates and invoices, review and total checks
Shop floor8Create production and delivery lines from invoices, batch status updates, a weekly production calendar, will-call and invoice status updates
Purchasing & pricing6PO updates, "no acknowledgement" and "not ordered" alerts, bill-intake alerts, price lookup and cost edits (with an audit log)
Customer contact5Pop up the caller's account on screen when the phone rang, phone events from Podium, alerts for estimates missing a customer, quick notes
Operations2Heartbeats for scheduled jobs, plus an MCP endpoint that let an AI assistant query the ERP

Two Python components sat beside n8n: accounts payable (read vendor bills as PDFs, matched each line to our PO, recorded price and quantity differences in a Bill Discrepancies table for review, and entered approved bills into QuickBooks Online) and the SKU resolver (SKUs step above).

n8n canvas of the QBO Webhooks workflow, dozens of connected nodes
The QuickBooks webhook workflow: customer, price and estimate sync, with review gates.
Kanban board of invoices in stages: Uncategorized, Awaiting Deposit, Not Ordered, Awaiting Materials, Awaiting Production
The invoice kanban: each column was something a person had to act on.
Saved view of purchase orders pending acknowledgement
A purchasing view: POs that vendors never acknowledged, before they became a shortage.
Bill Discrepancies table
The accounts-payable checks: every price or quantity difference where a vendor bill disagreed with our PO, logged for review.
Production calendar view
The weekly production calendar the shop floor worked from.

Integrations and endpoints

Beyond the n8n workflows, four pieces connected the ERP to the rest of the office.

Rollout and training

The SOP binder

The training material became a printed binder of company procedures. It has 24 procedures in 8 role chapters: Everyone, Sales, Office, Purchasing, Production, Loading, Deliveries and Management. Each procedure is one page, written for the person doing the job, with numbered steps. If a procedure grew past one page, I split it into two.

Each page has a version block at the top: ID, version, effective date, who it applies to, and an owner. The same ID and version repeat at the bottom of the page, and the Contents page is built from the same fields. To check a page is current, you compare it with the Contents. When a procedure changed, I reprinted that one page and swapped it in, and no other page shifted.

The pages are plain markdown files. A script renders them into one HTML book and prints it to PDF with headless Chrome, so nothing is typed twice. As of November 2026 all 24 pages were still marked draft, waiting for sign-off.

Results

What happened next, and what I'd do differently

After the 2026 acquisition, the new owner decided to run the business on paper again, so the system was retired. That was the owner's call. It taught me two things I now plan for from day one:

"Our distributor ran on paper and QuickBooks. Backorders weren't passed on to customers, items didn't get ordered, and customers weren't told when orders were ready. I started with a simple task board in 2022, then built the full system on Baserow: 31 tables, a catalog with SKUs, POs, production and delivery. I connected it to QuickBooks with 29 n8n workflows, and customers got texts about backorders and ready orders. Every employee used it. It saved more than 10 hours a week and caught orders that used to slip. After we were acquired, the new owner chose to go back to paper. That's their decision, and the lesson I took is to bring the decision-maker in early and build every system so it can be handed over."

Screenshots are from a demo copy of the system with fake names, contacts and prices; SKUs and product descriptions are real. No customer records are shown anywhere.