Skip to main content
Freelancing · Case Study

Ripple NDT Invoicing

Replacing spreadsheet billing with a role-based invoicing system for a nondestructive testing centre in Goa.

Next.jsTypeScriptPrismaSupabaseReact-PDFResend

The problem

Ripple Nondestructive Testing Centre ran job registrations, tax invoices and payment tracking across shared spreadsheets. Every invoice was retyped by hand, job records drifted out of sync with billing, and the directors had no live view of outstanding payments.

A single wrong cell could mean a wrong tax invoice going out to a customer, and there was no trail of who changed what.

How it works

  1. Job registration

    Invoice staff register jobs against the customer database, so details are typed once.

  2. Invoicing

    Accountants raise tax invoices straight from job records, with PDF generation.

  3. Payment tracking

    Payments are logged against invoices, keeping outstanding balances current.

  4. Director dashboard

    Directors get a read-only summary of jobs, invoices and pending payments.

What I built

  • Four roles with their own modules and login redirects: admin, invoice staff, accountant and director.
  • Custom authentication with email, password and a 6-digit OTP over Resend, rate limited, plus a separate PIN gate on settings.
  • Job registration feeding invoicing directly, so numbers are entered once and reused.
  • Payment tracking tied to invoices with running outstanding balances.
  • PDF tax invoice generation with React-PDF.
  • Prisma on Supabase Postgres, hosted on Vercel to keep running costs near zero for the client.

Outcome

The manual spreadsheet workflow is gone. Each role sees only its own module, invoices come from job records instead of retyping, and the directors can check outstanding payments without asking anyone. Delivered as a Phase 1 MVP.

Back to projects