My first invoice as a freelancer took longer to figure out than the work
it billed.
I didn't know what a SAC code was. I didn't know if I needed to register
for GST. And when the payment finally came in, it was smaller than the
number on my invoice — nobody had told me about TDS.
I looked for a tool to help. Every invoice generator I found was built for
the US or UK market, with a generic "tax" field that had nothing to do
with how GST actually works. None of them let you skip GST if you're not
registered. None of them understood CGST versus IGST. None of them knew
what an export invoice under LUT even is.
So I built one. This is what I learned doing it, on both the tax side and
the engineering side.
The tax rules, in short
A few things surprised me enough that I wrote up a full research page on
them (cited to CBIC, the GST Council, and the GST portal), but the
short version:
- You don't need a GSTIN below ₹20 lakh turnover (₹10 lakh in special category states). Below that, you shouldn't be charging GST at all — and a lot of tools quietly assume otherwise.
- CGST+SGST vs IGST depends on whether you and your client are in the same state. Same state: split the 18% into 9% CGST + 9% SGST. Different state: 18% IGST. This is mandatory under Rule 46 of the CGST Rules once you're registered.
- Exporting services to a foreign client can be zero-rated under an LUT (Letter of Undertaking), but the invoice needs a specific declaration sentence on it, or it's not valid.
- TDS under Section 194J means a client can legally deduct ~10% before paying you. Nobody tells freelancers this upfront, so the first payment always feels like it's missing money.
The build
It's a client-side Next.js app. No backend, no database — everything is
stored in the browser's localStorage. That was a deliberate choice: an
invoice generator doesn't need to see your data to work, and "your data
never leaves your browser" is a real privacy property, not marketing copy.
PDF generation was the part I underestimated. I used
@react-pdf/renderer to produce real vector PDFs (selectable text, not a
screenshot rendered to an image) — and ran straight into a bug I didn't
expect: the ₹ symbol wasn't added to Unicode until 2010, which means
the standard PDF fonts (Helvetica, Courier — decades older than that)
don't have a glyph for it at all. Every amount on every invoice was
rendering with a broken character instead of ₹. Fixed it by embedding
Noto Sans, a font that actually covers the glyph, instead of relying on
PDF defaults.
What it does now
- Works whether you have a GSTIN or not
- Automatic CGST/SGST vs IGST split based on state
- Export invoices under LUT, with the correct declaration text
- An estimated TDS note so your payout isn't a surprise
- Real PDF and PNG export
- No sign-up, no watermark, no account
It's free, and it'll stay free. It's also open source if you want to see
how any of the GST logic works, or send a PR if I've gotten an edge case
wrong.
Try it: invoice.karanchoudhary.dev
Code: github.com/karan5772/InvoiceGenerator
The full tax research: invoice.karanchoudhary.dev/research
If you're a freelancer in India, I'd genuinely like to know what I missed.
Top comments (0)