Why it exists
My invoicing tool’s price went from about $100 to about $2,000 a year, so I built a replacement, and then turned it into a product for other freelancers and small consultancies.
The platform
- Time and billing: weekly timesheet, projects and clients across multiple businesses, a four-step invoice wizard that pulls only uninvoiced time and billable expenses, PDF invoices by email, estimates, recurring invoices, prepaid-hour retainers, late fees, automatic past-due reminders, client statement links and a profitability report.
- Getting paid: online card payments through Stripe Connect, where each business connects its own Stripe account, and opt-in card-fee surcharging that follows the US rules: credit cards only (never debit), at most 3%, and blocked in the states that don’t allow it. Invoice mail can go out from the business’s own domain.
- Fits the rest of the business: QuickBooks and Xero exports, a self-serve import from Harvest, and public API keys plus an MCP server, so AI assistants can work with the account.
- Multi-tenant SaaS foundation: workspaces with owner, admin, member and accountant roles; email, Google and Apple sign-in, with two-step verification on email sign-in; invitations bound to the invited address; and a time zone and week start per workspace, so scheduled jobs decide “today” for each workspace rather than for the server.
- Installable web app, with a timer that keeps running offline.
- Money handled as integer cents everywhere, converted in exactly one place, with server-side total recalculation, because invoicing bugs are the ones customers notice.
The mobile app
A companion iOS and Android app built with Expo and React Native on the same API, now in internal TestFlight testing on iOS:
- Email, Google and Apple sign-in, with two-step verification for email sign-in.
- Home, invoices, projects, expenses, clients and reports, plus account, security and workspace-member settings.
- Invoice from the phone: pick a client with unbilled work, create the draft and send it.
- Estimates: follow up, share the accept link, and turn accepted estimates into invoices.
- Push notifications when an invoice is opened, an estimate is accepted or a payment arrives; tapping one opens the item.
- Offline: the last-loaded data stays available without a connection.
Security as a feature
An audit of the first version found forgeable sessions from a placeholder secret and publicly reachable uploads with a stored-XSS path. Both were fixed and verified from outside the network, and the app now refuses to start with a weak secret. That review habit is part of every engagement.
Hosting other businesses’ data raised the bar again:
- Abuse and race protection: rate limits, an origin check on every state-changing request, and plan and seat limits that can’t be raced, enforced under Postgres advisory locks.
- An audit log: history on every invoice and estimate and an Activity page, on the web and the phone. Entries name the fields that changed, never their values.
- Production-ready hosting: uploads in private object storage, served through 5-minute signed links after an ownership check, and error reporting with personal data scrubbed before it leaves the server.
- Tested where it matters: about 300 automated tests, 176 of them against a real Postgres database, plus an end-to-end suite that tries to reach one workspace’s data from another. The interface has also had a dedicated accessibility pass.
Status
The single-user version runs my own invoicing every day. The hosted service runs on a private staging server and the iOS app is in internal TestFlight; neither is publicly launched yet.
Client names, projects and amounts in the phone screenshots have been changed to protect client confidentiality.




