Skip to main content

Flagship build

The operating system I run my freelance business on.

Leads, contracts, e-signatures, invoicing and a client portal — one platform I designed, built, secured, and use every day. Not a concept. Not a demo. Production software running a real business.

The invoice you'd receive from me is generated by it. The portal you'd log into is it.

12
integrated modules
3 roles
Postgres RLS-enforced
Gapless
immutable invoicing
Reviewed
passed a security pass

Why I built it

Freelancers don't lose to bad code. They lose to bad operations.

Quotes live in email. Contracts live in a Google Doc. Invoices live in a spreadsheet. Payments get chased over WhatsApp. The client has no idea where anything stands — and neither do you.

So I stopped stitching tools together and built one system that runs the entire engagement lifecycle end to end — the same back office a small studio would pay for, tailored to exactly how I work.

What I built

One platform, twelve modules, working together.

Not a landing page with a login. A complete back office where every part knows about the others.

  • Leads & CRM

    Capture inbound enquiries, qualify them, and track each one through the pipeline.

  • Engagements

    The spine of the system — every project is a record linking its client, documents, invoices and messages.

  • Documents & e-sign

    Proposals and agreements go out as secure links clients sign in the browser — no account required.

  • Invoicing

    Branded PDF invoices with gapless per-year numbering, live statuses and reminders.

  • Client portal

    Clients log in to see their project, documents, invoices and messages in one calm place.

  • Payments

    Stripe checkout with webhook-driven payment status that stays correct even when events retry.

  • Messaging

    Threaded, per-engagement communication so nothing important is buried in an inbox.

  • Access & roles

    Admin, member and client roles with invitations and one-click revocation.

  • Feedback & testimonials

    Tokenised feedback requests flow straight into curated, published testimonials.

  • Packages & services

    Productised offerings that seed proposals and keep pricing consistent.

  • Live theming

    The public site's brand colours are database-driven and editable from the admin — no redeploy.

  • Content CMS

    Projects and the blog on this very site are managed from the same admin.

The lifecycle

From first enquiry to final delivery — one continuous thread.

  1. 01

    Lead

    Enquiry captured & qualified

  2. 02

    Engagement

    Project record created

  3. 03

    Agreement

    Proposal e-signed in-browser

  4. 04

    Invoice

    Branded PDF issued

  5. 05

    Payment

    Stripe checkout & status

  6. 06

    Portal

    Delivery & ongoing access

The hard parts

The engineering a client never sees — and every serious one asks about.

Anyone can build the screens. This is the part that makes the system trustworthy enough to run a business on.

Gapless, immutable invoice numbers

The problemInvoice numbering is a legal and accounting requirement: no gaps, no reuse, and no editing a number once it's issued — even under concurrent requests.

How I solved itA per-year sequence (AD-2026-0001…) allocated atomically in Postgres, so two invoices can never collide. Issued invoices are immutable — you void, never delete — so the financial record stays trustworthy.

Three-role security with Postgres RLS

The problemAn admin, a team member and a client must see completely different slices of the same database — and a bug that leaks one client's data to another is unacceptable.

How I solved itEvery table is protected by row-level security policies, not app-layer checks that can be forgotten. The privileged service key never reaches the browser. I ran a security review and closed the findings, including tightening storage-bucket write rules.

Login-free client actions via signed links

The problemClients hate creating accounts just to sign a document or pay an invoice — but the data behind those links still has to be locked down.

How I solved itDocuments, invoices and feedback are reachable through unguessable tokenised links that scope access to exactly one record. Clients sign, pay and respond with zero friction; everything else stays private.

Idempotent payment webhooks

The problemStripe can deliver the same event twice, or out of order. A naive handler double-counts a payment or corrupts an invoice's status.

How I solved itWebhook handlers are idempotent — processing the same event twice is a no-op — so a payment is recorded exactly once and status transitions stay consistent no matter how the events arrive.

Email that degrades gracefully

The problemInvites, invoices and notifications depend on email — but a mail-provider hiccup shouldn't block the actual business action.

How I solved itTransactional mail runs through the app's own mailer, decoupled from any single provider's SMTP, so sending is best-effort: the core action completes and the message follows.

Server-rendered branded PDFs

The problemAn invoice has to look identical and on-brand for every client, regardless of their browser or device.

How I solved itInvoices render to PDF on the server, so the document a client downloads is pixel-consistent and branded every time — never dependent on client-side rendering.

A look inside

The system, in the flesh.

Admin dashboard
Admin dashboard — the command centre
Branded invoice PDF
A generated, branded invoice PDF
Client portal
The client portal
E-sign document
In-browser document signing
Leads pipeline
Leads pipeline
Engagement detail
An engagement, end to end

Built with

A modern, boring-in-the-best-way stack.

Chosen for correctness and longevity, not novelty.

  • Next.js 15 (App Router)
  • React 19
  • TypeScript (strict)
  • Supabase — Postgres · Auth · Storage
  • Row-Level Security
  • Stripe
  • nodemailer
  • TipTap
  • react-pdf
  • Tailwind v4
  • Zod
  • Vercel

This is the part most portfolios can't show.

Anyone can say they build software. Very few can hand you the live system that runs their own business and say: this is real, and it's mine. The professionalism you feel as my client — the branded invoice, the portal, the e-signed agreement — is this platform, working.

Available for work

Let's create your next big idea.