Premium GST Invoicing & Compliance Platform for Modern Indian Businesses
"The invoicing system for teams and freelancers — built for India's modern tax framework."
The first impression — a sleek, animated dark mode landing page with live auth detection
Real-time financial health overview with live database stats and an activity feed
Generate fully compliant GST invoices with auto-calculated CGST/SGST/IGST splits and PDF export
Paginated invoice management with instant status updates, search & PDF download
Centralized client CRM with live GSTIN validation and automatic state code detection
GST slab breakdowns, monthly trends, top billed items and client revenue distribution
Configure your GSTIN, bank account details, signature, and compliance preferences
|
|
|
|
|
|
|
|
TaxFlow separates concerns across three clear layers: Client UI, Next.js API Routes, and External Services.
┌─────────────────────────────────────────────────────────────────┐
│ Browser (Client) │
│ │
│ ┌─────────────────┐ ┌──────────────────┐ ┌─────────────┐ │
│ │ Landing Page │ │ Invoice Editor │ │ Dashboard │ │
│ │ (/) │ │ (/invoices/new) │ │ Clients │ │
│ └────────┬────────┘ └────────┬─────────┘ │ Analytics │ │
│ │ │ │ Settings │ │
│ └──────────┬──────────┘ └──────┬──────┘ │
│ │ │ │
│ ┌───────▼───────────────────────────────▼───────┐ │
│ │ Sidebar + Command Palette │ │
│ │ (Navigation / Favorites / Auth Session) │ │
│ └───────────────────────┬───────────────────────┘ │
│ │ │
└──────────────────────────────────────┼──────────────────────────┘
│ HTTP Requests
┌──────────────────────────────────────▼──────────────────────────┐
│ Next.js App Router (Server) │
│ │
│ ┌───────────────┐ ┌───────────────┐ ┌───────────────────┐ │
│ │ /api/invoices │ │ /api/clients │ │ /api/dashboard │ │
│ │ GET POST PUT │ │ GET POST │ │ /api/seller │ │
│ │ PATCH DELETE │ │ DELETE │ │ /api/analytics │ │
│ └───────┬───────┘ └───────┬───────┘ └──────────┬────────┘ │
│ │ │ │ │
│ └──────────────────┼───────────────────────┘ │
│ │ │
│ ┌──────────────▼───────────────┐ │
│ │ Neon PostgreSQL │ │
│ │ (Serverless Connection Pool) │ │
│ └──────────────────────────────┘ │
│ │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ Supabase SSR Auth Middleware │ │
│ │ (JWT Session · OAuth · Row-Level Security) │ │
│ └────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────┘
| Route | Access | Description |
|---|---|---|
/ |
🌍 Public | Marketing landing page with feature showcase |
/invoices/new |
🌍 Public | Invoice Builder Editor (guest + auth) |
/dashboard |
🔐 Auth | Live stats dashboard and activity feed |
/invoices |
🔐 Auth | Invoice Ledger with filtering and actions |
/clients |
🔐 Auth | Client CRM with modal registration |
/analytics |
🔐 Auth | GSTR-1 reporting and trend charts |
/seller |
🔐 Auth | Business profile and bank details setup |
/settings |
🔐 Auth | Account, security, preferences, history |
/login |
🌍 Public | Email / Google authentication |
/api/invoices |
🔐 API | CRUD for invoices (GET, POST, PUT, PATCH, DELETE) |
/api/clients |
🔐 API | CRUD for clients |
/api/dashboard |
🔐 API | Aggregated stats for dashboard |
/api/analytics |
🔐 API | GSTR-1 tax slab aggregation queries |
/auth/callback |
🔄 OAuth | Supabase OAuth token exchange |
The data model is structured around four core entities, all linked to the authenticated Supabase user:
seller_profiles clients
───────────────────────── ────────────────────────────
id UUID (PK) id UUID (PK)
user_id UUID (FK → auth) user_id UUID (FK → auth)
business_name TEXT business_name TEXT
owner_name TEXT email TEXT
address TEXT phone TEXT
state TEXT address TEXT
gstin TEXT state TEXT
pan TEXT gstin TEXT
bank_details JSONB pan TEXT
signature TEXT
created_at TIMESTAMP
invoices invoice_items
───────────────────────────── ─────────────────────────────
id UUID (PK) id UUID (PK)
user_id UUID (FK → auth) invoice_id UUID (FK → invoices)
invoice_number TEXT description TEXT
invoice_date DATE quantity INTEGER
due_date DATE rate DECIMAL
client_id UUID (FK → clients)hsn_code TEXT
status TEXT gst_rate DECIMAL
taxable_amount DECIMAL taxable_amount DECIMAL
tax_amount DECIMAL tax_amount DECIMAL
grand_total DECIMAL amount DECIMAL
seller_data JSONB
buyer_data JSONB
bank_details JSONB
customization JSONB
created_at TIMESTAMP
User fills form fields
│
▼
useInvoiceBuilder hook updates state
│
├──────────────────────────────────────────────┐
│ │
▼ ▼
LocalStorage autosave (draft) Ctrl+S / "Save Invoice" button
│
▼
New invoice? Existing invoice?
│ │
▼ ▼
POST /api/invoices PUT /api/invoices/[id]
│ │
└───────┬───────┘
│
▼
Neon PostgreSQL persists
│
▼
Return { id, invoice_number }
│
▼
URL replaced → /invoices/new?id=UUID
│
▼
✅ Success toast shown
User visits app
│
▼
Middleware checks JWT session (Supabase SSR)
│
├── Public path? (/, /login, /invoices/new)
│ │
│ └── ✅ Allow through
│
├── Protected path? (/dashboard, /invoices, ...)
│ │
│ ├── Authenticated? ──── ✅ Allow through
│ │
│ └── Not authenticated? → Redirect to /login?next=<path>
│
└── /login while authenticated? → Redirect to /dashboard
TaxFlow/
├── public/ # Static assets (images, logo)
│ ├── logo.png
│ ├── landing.png
│ ├── dash.png
│ ├── create.png
│ ├── invoices.png
│ ├── clients.png
│ ├── analytics.png
│ └── business.png
│
├── src/
│ ├── app/ # Next.js App Router pages
│ │ ├── page.js # 🏠 Marketing landing page (/)
│ │ ├── layout.js # Root layout with Toaster
│ │ ├── globals.css # Global styles + custom scrollbar
│ │ │
│ │ ├── invoices/
│ │ │ ├── new/page.js # ✏️ Invoice Builder Editor (/invoices/new)
│ │ │ └── page.js # 📋 Invoice Ledger (/invoices)
│ │ │
│ │ ├── dashboard/page.js # 🖥️ Dashboard (/dashboard)
│ │ ├── clients/page.js # 👥 Clients CRM (/clients)
│ │ ├── analytics/page.js # 📊 GSTR-1 Analytics (/analytics)
│ │ ├── seller/page.js # 🏢 Business Profile (/seller)
│ │ ├── settings/page.js # ⚙️ Account Settings (/settings)
│ │ ├── login/page.js # 🔐 Auth Page (/login)
│ │ │
│ │ ├── api/ # REST API routes
│ │ │ ├── invoices/
│ │ │ │ ├── route.js # GET (list) + POST (create)
│ │ │ │ └── [id]/
│ │ │ │ ├── route.js # GET + PUT + DELETE
│ │ │ │ └── duplicate/route.js # POST (copy invoice)
│ │ │ ├── clients/route.js
│ │ │ ├── dashboard/route.js
│ │ │ ├── seller/route.js
│ │ │ └── auth/
│ │ │ ├── signout/route.js
│ │ │ └── delete-account/route.js
│ │ │
│ │ └── auth/callback/route.js # OAuth token exchange
│ │
│ ├── components/
│ │ ├── Sidebar.js # Navigation, search, favorites, auth footer
│ │ ├── DraftBanner.jsx # Auto-recovery banner
│ │ ├── HistoryDrawer.jsx # Recent invoices slide-over
│ │ ├── forms/ # Invoice form sections
│ │ │ ├── InvoiceMetaForm.js
│ │ │ ├── SellerForm.js
│ │ │ ├── BuyerForm.js
│ │ │ ├── LineItemsTable.js
│ │ │ ├── AdditionalCharges.js
│ │ │ ├── BankDetails.js
│ │ │ └── CustomizationPanel.js
│ │ ├── preview/
│ │ │ └── InvoicePreview.js # A4 pixel-perfect invoice render
│ │ └── ui/
│ │ ├── Button.js
│ │ └── Skeleton.js
│ │
│ ├── hooks/
│ │ └── useInvoiceBuilder.js # Master invoice state manager
│ │
│ ├── utils/
│ │ ├── pdfGenerator.js # html2canvas → jsPDF export
│ │ └── supabase/
│ │ ├── client.js # Browser Supabase client
│ │ └── server.js # SSR Supabase client
│ │
│ ├── constants/
│ │ └── defaultValues.js # Default invoice / seller templates
│ │
│ └── middleware.js # Route protection + session refresh
│
├── .env.local # Environment variables (not committed)
├── next.config.mjs
├── tailwind.config.js
└── package.json
| Layer | Technology | Purpose |
|---|---|---|
| Framework | Next.js 14 (App Router) | SSR, routing, API routes |
| UI Library | React 18 | Component-based rendering |
| Styling | Tailwind CSS | Utility-first dark design system |
| Authentication | Supabase Auth | OAuth + JWT session management |
| Database | Neon PostgreSQL (Serverless) | Invoices, clients, profiles |
| PDF Export | html2canvas + jsPDF | High-fidelity A4 PDF generation |
| Icons | lucide-react | Consistent icon set |
| Toasts | react-hot-toast | Non-blocking notifications |
| Drag & Drop | @hello-pangea/dnd | Line item reordering |
| Deployment | Vercel | Edge-optimized hosting |
git clone https://github.com/your-username/TaxFlow.git
cd TaxFlownpm installCreate a .env.local file in the project root:
# ── Neon PostgreSQL ─────────────────────────────────
DATABASE_URL=postgresql://user:password@ep-xxx.neon.tech/dbname?sslmode=require
# ── Supabase ─────────────────────────────────────────
NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
SUPABASE_SERVICE_ROLE_KEY=your-service-role-keynpm run devOpen http://localhost:3000 in your browser.
npm run buildProduces a fully optimized .next/ output. Zero warnings, zero errors. ✅
TaxFlow is deployed on Vercel with automatic CI/CD from the main branch.
- Push to
main→ Vercel auto-deploys - Set the same
.env.localvariables in Vercel → Settings → Environment Variables - Configure Supabase redirect URLs to include
https://your-app.vercel.app/auth/callback
📑 Invoices API
GET /api/invoices?search=&status=&page=&limit=
POST /api/invoices
PUT /api/invoices/:id
PATCH /api/invoices/:id { status: "paid" | "sent" | "cancelled" }
DELETE /api/invoices/:id
POST /api/invoices/:id/duplicate
GET /api/invoices/:id👥 Clients API
GET /api/clients?search=
POST /api/clients { business_name, gstin, email, ... }
DELETE /api/clients/:id📊 Dashboard & Analytics
GET /api/dashboard → { totalInvoices, totalClients, revenue, pending, recentInvoices }
GET /analytics → Server-rendered GSTR-1 aggregation page🏢 Seller Profile
GET /api/seller
POST /api/seller { business_name, gstin, bank_details, ... }| Feature | Specification |
|---|---|
| Tax Modes | Intra-State (CGST + SGST) & Inter-State (IGST) |
| Tax Slabs | 0%, 5%, 12%, 18%, 28% |
| HSN / SAC Codes | 40+ pre-loaded codes with descriptions |
| GSTIN Validation | 15-character format + checksum verification |
| State Code Mapping | All 37 Indian states and UTs |
| Amount in Words | Indian numbering system (Lakhs / Crores) |
| GSTR-1 Summary | Slab-wise taxable amount + tax collected table |
| Invoice Numbering | Custom prefix + auto-incremented serial |
| Payment Terms | Due on Receipt, Net 7, Net 15, Net 30 |
Contributions are welcome! Please open an issue to discuss changes before submitting a pull request.
- Fork the repository
- Create a feature branch (
git checkout -b feature/my-feature) - Commit your changes (
git commit -m "feat: add my feature") - Push to the branch (
git push origin feature/my-feature) - Open a Pull Request
This project is proprietary software. All rights reserved.
© 2026 TaxFlow Technologies Private Limited






