AI-native invoicing SaaS
An EU tax-compliance invoicing SaaS I built on my own. Claude agents wrote most of the code. I set the direction, reviewed every change and merged it.
Anonymised on purpose: no name, link or screenshots.
- 100%of pull requests reviewed and merged by me. Nothing merges itself
- 100%of CI gates seen failing on purpose before they count
- ~90%fewer failing dependency audits once the audit gate was in place


The product
What it is
An invoicing product for freelancers and small businesses, built to comply with a European country's mandatory real-time invoice reporting regime: invoices are reported to the tax authority as they are issued, and the records can't be changed afterwards.
Claude agents wrote most of the code, in every layer: database, API, web apps, infrastructure and tests. It runs as a private beta on a staging environment. Nobody pays for it yet, and it has never been promoted to production.
What it covers
- Invoices, corrective and simplified invoices, quotes and delivery notes
- Customers, a product catalogue and expenses
- AI-assisted document capture (OCR + LLM)
- Tax calculation and periodic tax reports
- PDF templates and email delivery
- Bank reconciliation through open banking (simulated on staging)
- Subscription plans and billing
- Several tenants on one platform, each isolated from the others
- Real-time reporting to the tax authority, with tamper-evident, append-only records
Scale
The size of it
This is a big product, and that is the point: one person directing agents covered all of it, in every layer.
Apps
The product, an admin console, a landing site and the API, plus background workers and a tax-authority mock.
API
Hundreds of endpoints behind the web apps.
Screens
Product, admin and landing, each a full app with its own flows.
Database
A large relational schema in PostgreSQL.
Row-level security
Hundreds of policies keep each tenant's data apart.
Background work
Workers and scheduled jobs outside the request path.
Triggers
Many of them guard records that must never change.
Tests
Tens of thousands, across backend, frontend and end to end.
Integration categories
- Payments
- Open banking
- Tax authority
- EU VAT number validation
- Object storage
- Authentication
- Caching and queues
- AI document capture
- Bot protection
- Observability
- DNS, CDN, VPN and TLS
The work behind it
What it actually took
Claude wrote most of the code. Getting to code I was willing to merge was the hard part, and that part was mine.
01Many rounds with Claude
Work often took several rounds. I pushed back on output that looked right but wasn't, and kept going until it met the bar. Code that compiles is where review starts.
02Designing the pipeline as a product
I designed the multi-agent, multi-session setup and kept improving it as it failed in new ways: how work is split, how agents stay out of each other's way, and what has to pass before anything merges.
03Owning the domain
Tax-compliant invoicing has rules an agent can't guess. Understanding them and deciding how the product handles them was my job. The compliance subagent checks the work. It doesn't make the calls.
04Owning the architecture
Tenant isolation, records that can't change, how money is rounded, how releases reach staging. I made those decisions, and the agents worked inside them.
05Being the quality bar
Nothing merged without my review. Every pull request went through me, one at a time.
Who does what
One developer, a team of Claude agents
I set the direction and made every product call. Claude sessions wrote most of the code in parallel, and nothing reached the main branch without passing the gates and my review.
Me
Direction, product decisions, final review and every merge.
Claude as orchestrator
Works as the project manager. It plans and hands out the work and keeps an eye on everything that runs.
- Continuous loop
- Shared memory
- Plans and assigns
Writers
Several Claude sessions at once, each in its own git worktree. A cap on how many run together keeps the machine stable.
Gates
84Seen redThen greenExecutable checks in CI. A gate only counts once I have seen it fail.
Review
- Reviewer
- Compliance expert
A read-only Claude reviewer checks every pull request before I do. A compliance specialist joins when a change touches money or tax.
Merge
MeI merge one pull request at a time. Nothing merges itself.
Staging and QA
StagingA failed deploy rolls itself back. A Claude QA session tests staging in a real browser.
- Rules and memoryWhat the agents must know and must never do, versioned with the code.
- SkillsSkills for the work that keeps coming back.
- The orchestration loopClaude keeps the work moving and checks the plan against what actually happened.
- GatesExecutable checks. A check only counts once it has been seen red, and every bug fix must come with a test that fails on main.
Evidence
How I measured whether it worked
Agents produce a lot of code quickly, so the question I kept asking was how I would know it was correct. The answer became four rules.
Three proofs per gate
A check doesn't count until it has passed three proofs. One of them is breaking the code on purpose and watching it go red.
Mutation before trusting green
A passing suite says little until mutations show it can fail.
Predictions before measurements
I write down what I expect before I measure, so the result can prove me wrong.
A regression test for every fix
It has to fail against main. If it passes on the broken code, it doesn't prove the fix.
Mutation testing on the tax calculator
After I fixed which tests the run selected, most of the surviving mutants were gone. The run got a little slower.
The pipeline, before and after moving to an orchestrated multi-agent workflow
- Before
- a sample of pull requests from a window before the change
- After
- every pull request merged in a window of the same length after it
| Measure | Change | Verdict |
|---|---|---|
| Merge throughput | Higherbetter | better |
| Size of the largest pull requests (90th percentile) | 36% smallerbetter | better |
| Median pull request size | About the samea little larger | a little larger |
| Time from opening to merge, median | Longer, merges were serializedworse | worse |
After moving to an orchestrated multi-agent workflow, more pull requests merged and the largest ones got 36% smaller, while the median time to merge went up because merges were serialized. That row is there because it's true.
The comparison is observational, not controlled. The two windows count different populations, other things changed at the same time, and the later window was dominated by a run of bug fixes merged one after another.
I don't quote test coverage. I haven't measured it, and I have seen a green check that tested nothing.
Pace
The pace
How the work moved along.
Merge activity
In parallel
Several Claude sessions at once, each in its own git worktree and on its own piece of work.
One reviewer
Every pull request went through me, and I merged them one at a time.
Steady
Merges landed often. The work moved forward one pull request at a time.
Tools
Stack
Backend
- Python
- FastAPI
- Pydantic v2 (strict)
- async SQLAlchemy
- Decimal money
Frontend
- TypeScript (strict)
- React
- Vite
- Tailwind
- shadcn/ui
- TanStack
- Zustand
- Zod
Data
- PostgreSQL
- Tenant isolation in the database
- Immutable records
Infrastructure
- Terraform
- Kubernetes (K3s)
- CDN and DNS
- Private network (VPN)
- Metrics, logs and alerting dashboards
Delivery
- CI pipelines
- Self-hosted runners
- Staging with auto-rollback
- Promotion workflow
Testing
- pytest
- Real-database tests
- pgTAP
- Vitest
- Playwright
- mutmut
Payments
- Card payments and subscriptions
AI in the product
- Document capture with OCR and an LLM
AI tooling
- Claude Code: orchestrator, writers, reviewer, compliance, QA
Where it stands
Private beta
A small, invite-limited private beta on staging. No paying customers, no real submission to the tax authority yet, and no production release.
What's missing for production
- Registration with the tax authority to submit invoices on behalf of users
- Refunds and payment disputes for subscriptions
- Production infrastructure and the first promoted release
Want to hear more about how it was built?
If you're hiring for AI-native product engineering, I'm happy to walk you through the architecture, the agent setup and the trade-offs in a call.
Why it has no name here
I keep the product anonymous on this site, so there's no name, link or screenshot. I'm glad to go into the details in a conversation.
Chispi's noteEvery gate on this page had to fail on purpose before it counted.