You finish work Friday. You need to invoice.
You open a Google Doc, copy INV-12, type INV-13, fix dates, calculate 18% GST, split 9+9 CGST/SGST or 18 IGST — hope state is right — export PDF, open Gmail, attach, type client email, remember bank details, send, then update a sheet Status: Sent, then set a phone reminder to follow up in 10 days.
25 minutes. For one invoice. You do 8 a month. That's 3.5 hours of admin that doesn't bill.
Freelancers don't lose money on rates. They lose it on time-to-cash.
Why Sheets + Docs Make You Wait 19 Days
Average freelance invoice is paid in 19-45 days. Every manual step adds friction that delays Sent and hides Overdue:
- Copy-paste numbering:
INV-12→INV-13breaks when you deleteINV-9. FY sequentialGOS/25-26/001src/templates/freelance-invoice-templatefails. CA rejects it. - GST math:
taxRate 18taxType:cgst_sgstvsigstsrc/app/api/invoices/route.ts:60— intra-state9+9vs inter-state18src/lib/blog/posts.ts:14007-simplifying...You calculate manually, you err, client disputes, payment slips 7 days. - Status amnesia: Sheet cell
SentstaysSentafter due date passes. Nosent→overdueflipsrc/app/api/cron/daily/route.ts:69— you forget to follow up until client is 22 days late. - No portal: Client loses PDF in inbox, asks "resend invoice?" — you dig Drive, resend, 2 days lost.
Manual invoicing is not cheap. It's pre-tax work with post-tax risk.
The Automated Graph: Draft → Sent → Paid in One System
In RunoSO tenant_${id}, invoices src/lib/db/schema.ts:60 is not a doc — it's a row linked to clients + projects + transactions:
Draft in 60 seconds POST /api/invoices/route.ts:84:
- Pick
clientId→ auto-fillsGSTIN,state,addressfromsettingssrc/app/(dashboard)/settings/page.tsx - Add
items: {description, quantity, rate, amount}[]jsonbsrc/lib/db/schema.ts:70— no line calc - Server recomputes
total = subtotal - discount + taxsrc/app/api/invoices/route.ts:118— prevents tampering, ensurestaxTypegated byplan:gstsrc/lib/plans/gate.ts:31 invoiceNumberautoFY sequential,recurringInterval:none|monthly|quarterly|yearlysrc/lib/utils/recurring.ts:5→recurringNextDate2026-09-01→2026-10-01
Sent in one click POST /api/invoices/[id]/send:
- Generates
PDF jsPDF+html2canvasREADME.md:42, emailssendInvoiceEmailsrc/lib/emails/send.ts:347withitems table + portalUrl + bank/IFSC— no Gmail tab - Flips
status draft→sent, createsnotificationsrowtype:invoice_overdueif later overdue
Paid without touching sheet POST /api/transactions/route.ts:131:
- When client pays,
syncInvoicePaidStatussrc/app/api/transactions/route.ts:21checksInvoice Paymenttransaction → auto flipsinvoices.status sent→paid+ updatesFinanceOverviewClientRechartslive Cron dailysrc/app/api/cron/daily/route.ts:69flipssent→overduewheredueDate < now, createsnotifications+ digestsendReminderDigestEmailsrc/lib/emails/send.ts:469— you get ping, not silent cell
Portal closes the loop: portalTokens src/lib/db/schema-public.ts:169 → GET /portal/[id] lets client view/download invoice without login — revoke revokedAt anytime. No "resend PDF".
Mistakes That Delay Cash
1. Numbering in sheets. INV-12 free text breaks FY audit. Use invoices.invoiceNumber unique src/lib/db/schema.ts:62 sequential filtered createdAt >= startOfMonth src/app/api/invoices/route.ts:92 + plan limit invoices_per_month 5 free → ∞ solo src/lib/plans/limits.ts:28.
2. Tax as text. Typing IGST 18% manually ignores client.state vs yours. Let taxType drive CGST+SGST vs IGST split — compliance, not calculation.
3. Recurring as reminder. Setting phone reminder Monthly retainer Jan 5 misses Feb if sick. Use recurringInterval:monthly → cron clones due invoice preserving due gap src/app/api/cron/daily/route.ts:190 + incrementUsageCounter src/lib/plans/limits.ts:193 atomic tx.
4. No portal. Emailing PDFs loses them. Portal link in sendInvoiceEmail survives inbox search forever.
60-Second Invoice Workflow
- New → Client → items
Homepage: 40h × ₹1500→ discount10%→taxType igst 18→ preview total auto₹64,800. - Save draft →
invoiceNumber GOS/26-27/015FY auto,status draftlinkedprojectId. - Send →
status sent→ email with PDF + portal linkhttps://www.runoso.in/portal/<token>→ client opens without login. - Track →
Finance → InvoicesInvoicesListClientshowsSent 2 Overdue 1+TransactionsListClientsync — no sheet.
That's 25 min → 60 sec × 8 invoices = 3 hrs back to bill.
Sheets vs RunoSO Invoicing
| Sheets + Docs | RunoSO src/app/api/invoices/route.ts:181 |
|---|---|
Copy INV-12 manual, breaks FY | invoiceNumber unique FY sequential auto |
Calc 9+9 manual | Server subtotal-discount+tax recompute + checkPlanLimit |
Status cell Sent stale | cron sent→overdue + notifications |
| Attach Gmail, lose PDF | jsPDF + portalTokens share link |
| Recurring = phone reminder | recurringNextDate + cron clone tx |
You are not buying an invoice tool. You are buying 19 days → 7 days time-to-cash.
RunoSO automates your freelance finance graph — invoices draft→sent→paid linked to clients, projects, transactions, portal, cron — in one dashboard. Stop copy-pasting. Start getting paid.
→ Generate 5 Free Invoices — GST Ready
By Gautam Parmar src/app/(marketing)/about/page.tsx:44 — solo founder, Next.js 16 Razorpay Resend, building 26-table Drizzle OS in public on X.
Keep Reading
- GST deep dive: simplifying gst invoicing indian freelancers.
- Track profit: track income without spreadsheets.
- Ops hub: freelance operations hub single dashboard.



