From “ugh” to green checkmark

Vibe coding · 3 min read
From “ugh” to green checkmark

I just wanted to link invoices (and then I built a system)

Why I built my own credit card invoicing system (and why it made me very happy)

Tuesday.
After a long time, entering invoices with Bir in SnelStart again.
Using our admin system via the account (not a fan). A pleasant prospect, right?

In theory, no. In practice, definitely not:
– credit card payments – CSV files – PDF invoices everywhere – no decent import – everything matched manually, really awful... How do they charge 35 euros a month for this......

Ugh.

Almost all my current business expenses now go through our credit card. Lots of software, lots of AI, many subscriptions, often in USD. But SnelStart (and honestly, most accounting systems) don't handle that well. No automatic linking, no clear matching, no overview. So you're still comparing amounts, searching for invoices, and correcting errors.

And then I thought:
I'll just build this part myself.

The problem I wanted to solve

You have two worlds:

  1. The credit card CSV
    An export from ING with:

    • date
      amount (in EUR)
      description
      currency

  2. The invoices
    PDFs from suppliers. In various formats. EUR, USD, sometimes with VAT, sometimes without. Sometimes clear, sometimes hidden in small print.

What you want:
➡️ automatically know which invoice belongs to which transaction
➡️ and immediately see what is still missing

Not halfway, not approximately — but accounting accurate.

The solution (and yes, I went a bit too far)

I already had a subscriptions dashboard running, so I built a credit card module onto it. Two afternoons. About seven hours. A bit back and forth.

Started with Claude Opus 3 to sharpen the logic, and Aura for PB design.
Then Claude Cowork, which literally tracked down all invoices (that was magical).
And finally back to Replit, because that had all my existing foundation.

And then it became fun.

What the system does

1. Smart PDF reading (without AI poetry)

Invoices are chaos. So I built a parser that recognises what really matters:

  • Amounts
    Recognises variants like:

    • Amount due $12.99
      Invoice Total: €34,50
      Total USD $99.00

  • VAT
    Needed for refunds. Automatically extracted from the PDF.

  • Invoice numbers
    In all the strange formats suppliers invent.

No guessing. Just pattern matching.

2. Exact matching (deliberately no fuzzy stuff)

The system matches only on exact amount.

Why?

  • No incorrect links
    No “almost the same” nonsense
    Complete certainty for the accounting

USD invoice?
→ converted → matched to the EUR amount on the credit card

No match = visible. Done.

3. Multiple currencies, neatly stored

For USD invoices, the system stores:

  • original amount + currency
    converted EUR amount
    used rate (implicitly via statement)

So everything remains verifiable.

4. See where you stand at a glance

In the dashboard, you immediately see:

  • 🟢 everything linked
    🟠 invoices still missing

Per supplier you see:

  • what is correct
    what is outstanding
    what needs attention

No searching. No doubt.

The workflow (simple, as it should be)

  1. Upload the ING credit card CSV
    Drag PDF invoices alongside
    The system matches automatically
    You only check what is incorrect
    Export for the accountant, including VAT overview

What it brings me

What used to take hours, now takes minutes.
But more importantly: peace of mind.

You know:

  • what is correct
    what is missing
    how much VAT you can reclaim

No vague assumptions anymore. No manual comparisons.

It runs on a modern stack (React, TypeScript, PostgreSQL), but that's secondary.
This is not a tech project. This is a getting-your-life-back project.

The Stack

  • Frontend: React 18 + TypeScript + Tailwind CSS
    Backend: Node.js + Express
    Database: PostgreSQL with Drizzle ORM
    PDF Parsing: pdf-parse library with custom regex extractors

And because I am visually oriented, it automatically loads company logos from Google's Favicon Service.

I build these kinds of systems because I need them myself.
And if they work for me, they usually work for others too.

V2.0 then I will....
Additionally, I think I will make a Gmail integration so that the invoices are found by the system and ready to load when the ING CSV arrives, and there is a Subscriptions component that I already had which is now included (so all AI and software subscriptions, which can automatically be cancelled or renewed in the future with Claude.

Onwards.
Peter.