Finance

GST invoice generator (India)

An Indian GST tax invoice with GSTINs, HSN/SAC codes, CGST + SGST or IGST, amount in words and bank details.

Just need one? Fill it in and download it free

Create GST tax invoices in the familiar Indian format: supplier and recipient GSTINs and state codes, place of supply, HSN/SAC codes, taxable value, CGST and SGST for intra-state supplies (or IGST for inter-state), the grand total in figures and words, and your bank details.

Amounts use Indian digit grouping (₹1,20,000.00). Switch between intra-state and inter-state tax with one field, and render invoices in bulk from your billing system.

Generate a GST Tax Invoice (India) PDF via the API

POST your data to /api/v1/generate and get a PDF back. Copy-paste an example, swap in your API key, and loop over a list to render thousands — one gst tax invoice (india) per record.

curl -X POST https://pdfgen.com/api/v1/generate \
-H "Authorization: Bearer pdfg_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"data": {
"supplier": {
"name": "Nimbus Technologies Pvt. Ltd.",
"address": "4th Floor, Prestige Tower, MG Road\nBengaluru, Karnataka 560001",
"gstin": "29ABCDE1234F1Z5",
"state": "Karnataka",
"stateCode": "29"
},
"buyer": {
"name": "Saffron Retail LLP",
"address": "22, 80 Feet Road, Koramangala\nBengaluru, Karnataka 560034",
"gstin": "29AAKFS1234K1Z2",
"state": "Karnataka",
"stateCode": "29"
},
"invoiceNumber": "NT/2026-27/0458",
"invoiceDate": "2026-10-27",
"placeOfSupply": "Karnataka (29)",
"reverseCharge": "No",
"interState": false,
"currency": "INR",
"locale": "en-IN",
"items": [
{
"sl": 1,
"description": "Retail POS software, annual subscription (10 outlets)",
"hsn": "997331",
"quantity": 1,
"rate": 120000,
"taxableValue": 120000,
"cgstRate": 9,
"cgst": 10800,
"sgstRate": 9,
"sgst": 10800,
"igstRate": 18,
"igst": 21600,
"total": 141600
},
{
"sl": 2,
"description": "On-site setup and staff training (days)",
"hsn": "998313",
"quantity": 2,
"rate": 15000,
"taxableValue": 30000,
"cgstRate": 9,
"cgst": 2700,
"sgstRate": 9,
"sgst": 2700,
"igstRate": 18,
"igst": 5400,
"total": 35400
}
],
"totals": {
"taxableValue": 150000,
"cgst": 13500,
"sgst": 13500,
"igst": 27000,
"grandTotal": 177000
},
"amountInWords": "Indian Rupees One Lakh Seventy-Seven Thousand Only",
"bank": {
"name": "HDFC Bank",
"accountNumber": "50200012345678",
"ifsc": "HDFC0001234",
"branch": "MG Road, Bengaluru"
},
"declaration": "We declare that this invoice shows the actual price of the goods and services described and that all particulars are true and correct."
},
"format": "A4",
"engine": "handlebars",
"html": "<link href=\"https://fonts.googleapis.com/css2?family=Noto+Sans:wght@400;600;700;800&display=swap\" rel=\"stylesheet\">\n<div style=\"max-width:780px;margin:0 auto;padding:40px;font-family:'\''Noto Sans'\'',-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;color:#111827;font-size:12.5px;\">\n <div style=\"text-align:center;margin-bottom:16px;\">\n <h1 style=\"font-size:22px;font-weight:800;letter-spacing:3px;margin:0;\">TAX INVOICE</h1>\n <p style=\"margin:2px 0 0;font-size:11px;color:#6b7280;\">Original for recipient</p>\n </div>\n <table style=\"width:100%;border-collapse:collapse;font-size:inherit;line-height:inherit;\">\n <tr>\n <td style=\"width:58%;vertical-align:top;padding:12px;border:1px solid #d1d5db;\">\n {{#if logo}}<img src=\"{{logo}}\" alt=\"\" style=\"display:block;max-width:200px;max-height:56px;margin:0 0 10px;\">{{/if}}\n <p style=\"margin:0;font-size:16px;font-weight:800;\">{{supplier.name}}</p>\n <p style=\"margin:2px 0 0;color:#4b5563;white-space:pre-line;\">{{supplier.address}}</p>\n <p style=\"margin:6px 0 0;\">GSTIN: <strong>{{supplier.gstin}}</strong></p>\n <p style=\"margin:2px 0 0;\">State: {{supplier.state}} (Code {{supplier.stateCode}})</p>\n </td>\n <td style=\"vertical-align:top;padding:12px;border:1px solid #d1d5db;line-height:1.8;\">\n Invoice no. <strong>{{invoiceNumber}}</strong><br>\n Invoice date <strong>{{formatDate invoiceDate locale}}</strong><br>\n Place of supply <strong>{{placeOfSupply}}</strong><br>\n Reverse charge <strong>{{reverseCharge}}</strong>\n </td>\n </tr>\n <tr>\n <td colspan=\"2\" style=\"padding:12px;border:1px solid #d1d5db;\">\n <p style=\"margin:0 0 4px;font-size:11px;color:#6b7280;font-weight:700;text-transform:uppercase;letter-spacing:1px;\">Bill to</p>\n <p style=\"margin:0;font-weight:700;\">{{buyer.name}}</p>\n <p style=\"margin:2px 0 0;color:#4b5563;white-space:pre-line;\">{{buyer.address}}</p>\n <p style=\"margin:4px 0 0;\">{{#if buyer.gstin}}GSTIN: <strong>{{buyer.gstin}}</strong> &middot; {{/if}}State: {{buyer.state}} (Code {{buyer.stateCode}})</p>\n </td>\n </tr>\n </table>\n <table style=\"width:100%;border-collapse:collapse;margin-top:14px;font-size:11.5px;line-height:inherit;\">\n <thead>\n <tr style=\"background:#f3f4f6;\">\n <th style=\"padding:7px;border:1px solid #d1d5db;\">#</th>\n <th style=\"padding:7px;border:1px solid #d1d5db;text-align:left;\">Description</th>\n <th style=\"padding:7px;border:1px solid #d1d5db;\">HSN/SAC</th>\n <th style=\"padding:7px;border:1px solid #d1d5db;\">Qty</th>\n <th style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">Rate</th>\n <th style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">Taxable value</th>\n {{#if interState}}\n <th style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">IGST</th>\n {{else}}\n <th style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">CGST</th>\n <th style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">SGST</th>\n {{/if}}\n <th style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">Total</th>\n </tr>\n </thead>\n <tbody>\n {{#each items}}\n <tr>\n <td style=\"padding:7px;border:1px solid #d1d5db;text-align:center;\">{{sl}}</td>\n <td style=\"padding:7px;border:1px solid #d1d5db;\">{{description}}</td>\n <td style=\"padding:7px;border:1px solid #d1d5db;text-align:center;\">{{hsn}}</td>\n <td style=\"padding:7px;border:1px solid #d1d5db;text-align:center;\">{{quantity}}</td>\n <td style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">{{formatCurrency rate ../currency ../locale}}</td>\n <td style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">{{formatCurrency taxableValue ../currency ../locale}}</td>\n {{#if ../interState}}\n <td style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">{{igstRate}}%<br>{{formatCurrency igst ../currency ../locale}}</td>\n {{else}}\n <td style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">{{cgstRate}}%<br>{{formatCurrency cgst ../currency ../locale}}</td>\n <td style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">{{sgstRate}}%<br>{{formatCurrency sgst ../currency ../locale}}</td>\n {{/if}}\n <td style=\"padding:7px;border:1px solid #d1d5db;text-align:right;font-weight:700;\">{{formatCurrency total ../currency ../locale}}</td>\n </tr>\n {{/each}}\n </tbody>\n </table>\n <div style=\"display:flex;justify-content:space-between;gap:24px;margin-top:14px;\">\n <div style=\"flex:1;\">\n <p style=\"margin:0;font-size:11px;color:#6b7280;\">Amount chargeable (in words)</p>\n <p style=\"margin:2px 0 14px;font-weight:700;\">{{amountInWords}}</p>\n {{#if bank.name}}\n <p style=\"margin:0;font-size:11px;color:#6b7280;\">Bank details</p>\n <p style=\"margin:2px 0 0;line-height:1.6;\">{{bank.name}} &middot; A/c {{bank.accountNumber}}<br>IFSC {{bank.ifsc}} &middot; {{bank.branch}}</p>\n {{/if}}\n </div>\n <table style=\"min-width:250px;border-collapse:collapse;font-size:inherit;line-height:inherit;\">\n <tr><td style=\"padding:4px 0;color:#6b7280;\">Taxable value</td><td style=\"padding:4px 0;text-align:right;\">{{formatCurrency totals.taxableValue currency locale}}</td></tr>\n {{#if interState}}\n <tr><td style=\"padding:4px 0;color:#6b7280;\">IGST</td><td style=\"padding:4px 0;text-align:right;\">{{formatCurrency totals.igst currency locale}}</td></tr>\n {{else}}\n <tr><td style=\"padding:4px 0;color:#6b7280;\">CGST</td><td style=\"padding:4px 0;text-align:right;\">{{formatCurrency totals.cgst currency locale}}</td></tr>\n <tr><td style=\"padding:4px 0;color:#6b7280;\">SGST</td><td style=\"padding:4px 0;text-align:right;\">{{formatCurrency totals.sgst currency locale}}</td></tr>\n {{/if}}\n <tr style=\"border-top:2px solid #111827;\"><td style=\"padding:8px 0 0;font-weight:800;font-size:14px;\">Grand total</td><td style=\"padding:8px 0 0;text-align:right;font-weight:800;font-size:14px;\">{{formatCurrency totals.grandTotal currency locale}}</td></tr>\n </table>\n </div>\n <div style=\"display:flex;justify-content:space-between;align-items:flex-end;margin-top:32px;border-top:1px solid #e5e7eb;padding-top:12px;\">\n <p style=\"margin:0;max-width:400px;font-size:11px;color:#6b7280;\">{{declaration}}</p>\n <div style=\"text-align:right;font-size:12px;\">\n <p style=\"margin:0;\">For <strong>{{supplier.name}}</strong></p>\n <p style=\"margin:36px 0 0;color:#6b7280;\">Authorised signatory</p>\n </div>\n </div>\n</div>"
}' --output gst-invoice.pdf

Working in another language? Follow a full guide for your stack:

What you can build

  • Small businesses and freelancers billing GST-registered clients
  • SaaS and services companies invoicing Indian customers
  • Distributors raising invoices for many retailers
  • Billing tools adding GST invoice PDFs

Frequently asked questions

Does it handle CGST, SGST and IGST?
Yes — set interState to false to show CGST and SGST columns, or true to show IGST instead. Rates and amounts come from your data.
Is this an e-invoice with an IRN?
No. Businesses above the e-invoicing threshold must register invoices on the Invoice Registration Portal to get an IRN and QR code. This template produces the invoice PDF; add the IRN and QR from the portal if you are required to.
Can I show the amount in words?
Yes — pass the amount in words (for example "Indian Rupees One Lakh Seventy-Seven Thousand Only") and it is printed under the items.

Related templates

Ship your gst tax invoice (india) PDF endpoint today

Generate this template with AI, tweak it to match your brand, then render at scale with a single API call — no headless browsers to babysit.