Engineering
Why a Freelancer Invoice Should Be a Document, Not a Dashboard Widget
An invoice from time has a boring job: a client’s AP person must be able to open a file, match line items to a purchase order, and pay you. A dashboard widget cannot do that. A live chart cannot do that. A screenshot of hours also cannot do that — and it looks like you do not have a system.
That is why MinuteShark treats invoicing as document generation sitting on top of a report, not as a second product you log into on Friday. The engineering constraint is honest: consultants need a PDF they can send, a DOCX they can tweak, and a CSV their bookkeeper can import. They do not need a general ledger.
The design bet: if the report is wrong, the invoice will be wrong, and no prettier template will save you. Generate the document from the same What × Who × When answer you already trust — then stop pretending a time tracker is QuickBooks.
Why dashboards fail the AP test
Dashboards are for the person who did the work. Documents are for the person who pays. Those two humans have different constraints:
- AP wants a file. PDF is the default. Some clients still ask for Word. Your accountant often wants rows.
- Line items need names a stranger understands. “Task 14” is not a line item. “Homepage mockups — week of Sep 1” is.
- Taxes are named percentages, not a vibe. GST, QST, VAT — or none — must look like last month, not like a Friday improvisation.
- Extras are not time. A stock license or a rush fee should be an extra line, not a fake 2.0h on Implementation.
If your “invoice” only exists inside an app, you have a status page. You do not have billing. ElementPragma, Inc. builds MinuteShark in Montreal for independents who already lost an afternoon to that distinction.
The pipeline: report first, document second
The product sequence is deliberate. You do not start in an invoice editor and hunt for hours. You start in Reports:
What × Who × When
What clients or projects, optional tasks
Who you — or a teammate / team, if you have one
When a date range you can defend
After generate: a grand total, and if rounding is on, a BILLABLE rounded total. A chart (Chart.js in the Ionic + Angular 16 web app) plus a table. Pivot by date, client, project, task, user, or team. Inline edit if a row is wrong. Then Generate Invoice from that same report — pick a cost profile or enter rates once.
That order is the product philosophy in code: time lives on tasks, tasks sit under projects and clients, and money is a projection of that tree — not a parallel spreadsheet.
What the document actually contains
The invoice is generated, not magically “synced” to an accounting suite. The payload is small on purpose:
- Invoice number hint in YYYYMMDD form so you stop inventing sequences at 4:55 p.m.
- Grouping by date, client, project, task, user, or team — same axes as the report.
- Logo, company block, client block.
- Line items from time, plus additional flat or hourly lines you can reorder.
- Named tax percentages with optional cumulative stacking (GST then QST, or VAT).
- Notes and footer for payment terms you already agreed.
- Export: PDF, DOCX, or CSV.
This is invoice generation from time, not accounts receivable. MinuteShark does not mark invoices paid in QuickBooks, and we do not currently market a catalog of native QuickBooks, Slack, or Jira integrations. Honest trade-off: fewer integrations than enterprise tools. If your consulting workflow is genuinely specialized, we build custom solutions for specialized needs — that is not a public self-serve API on Standard.
Why three export formats instead of “just PDF”
Different readers of the same week want different artifacts. Shipping one format would be simpler. It would also dump the conversion work back on the freelancer — which is the failure mode we were trying to delete.
- PDF (jsPDF) — the sendable object. Printable, hard to “accidentally edit” in a way that looks unofficial, what most AP portals accept.
- DOCX (docx) — the negotiation object. A sentence in the notes, a reordered extra line, a client-legal entity tweak — without regenerating from scratch in a tool they do not live in.
- CSV — the bookkeeper object. Rows, not layout. Same numbers, fewer opinions about fonts.
Reports themselves export CSV, Excel (XLSX via the xlsx library), and JSON. That is a different surface: analysis and archives, not the customer-facing invoice. Mixing those jobs in one “Export” button is how you get a 40-column spreadsheet that nobody pays.
Libraries, not a billing platform
On the engineering side this is unglamorous and that is the point. The Ionic app already has the report. Chart.js already drew the week. jsPDF writes the PDF. The docx library writes Word. xlsx writes the spreadsheet export of the report. We did not stand up a miniature ERP so a solo consultant could bill 12.4 hours to Contoso.
Capacitor 7 is how the same workspace shows up on iOS and Android; subscription management stays on the web. The invoice is still a document you generate when the week is closed — not a live widget on a phone lock screen. (The lock screen is for a running timer. Different job.)
What we refused to build
Every skipped feature is a sentence we do not have to support:
- No “mark paid in QuickBooks” story. That is accounting. We generate the file; you (or your bookkeeper) record the payment where payments live.
- No marketplace of native PM and finance integrations as the product. Independents should not need Jira keys as invoice line items.
- No silent mutation of time on the way to PDF. Rounding, when you turn it on, is explicit: original duration is stored; BILLABLE is the rounded-up value that can flow into the invoice. Off by default.
- No employee surveillance packaging. Screenshots and idle spying are the opposite of this product. A document of tasks you chose to track is enough.
If you already close the week before Friday panic — see the invoice hygiene post — this pipeline is the export half of that habit. Hygiene is the human loop. jsPDF is the last mile.
What MinuteShark will generate — and what it will not
From a report plus a cost profile: line items from tracked time, extra lines, named taxes, logo, notes, and PDF / DOCX / CSV. Starter includes basic reports; Standard adds advanced reporting, unlimited clients and projects, and 300 AI messages per user per month. AI can open Reports with filters in plain English — it still does not write an invoice until you generate one from numbers you can see.
It will not replace your accountant, your GST/QST registration decision, or a full AR aging report. Nina S., Freelance Strategist, put the bar where it belongs: “Billing clients is finally straightforward.” Straightforward is a document with the right week in it — not a second SaaS login.
A Friday checklist that matches the code
- Fix History while you still remember (wrong task, timer that outlived the call).
- Generate What × Who × When. Glance at grand total and BILLABLE if rounding is on.
- Pivot by task if this client will ask what the week was for.
- Generate Invoice. Cost profile first. Extra lines for licenses. Named taxes your accountant specified.
- Export the format AP asked for. Keep the CSV for yourself.
That is the whole architecture, told from the file that leaves the building: time on tasks, a report you can defend, a document someone else can pay. The dashboard can stay pretty. AP does not care.