Professional services
Time tracking and invoicing for freelancers
A freelancer logs hours against a client and a project from the browser or the phone, marks which hours are billable, and turns a month of unbilled hours into an invoice with one click. The client gets a link to view and pay it.
Automatically generated draft
Written by machine against our own engineering playbook. The company is invented; the decisions are the ones we would make on a real build. A reviewed blueprint goes further — nine sections, agreed line by line, and it is what the build is tested against.
Section 01 · What has to work
The product succeeds if a freelancer can reliably turn a month of tracked, unbilled hours into a single, client-payable invoice with one click.
Section 03 · Screens
Every screen, and what it is for.
- ›Timer & Log — Freelancer logs hours. Starting a timer must be instant.
- ›Timesheet — Freelancer reviews/edits logged hours. Filtering entries by client must be instant.
- ›Invoice Generation — Freelancer creates an invoice. Previewing the line items must be instant.
- ›Invoice List — Freelancer views invoice statuses (sent, paid). Seeing the list must be instant.
- ›Public Invoice View — Client views an invoice via a unique link. Loading the page must be instant.
Anything not on this list is not in version one. That is what keeps a fixed price fixed.
Section 04 · The data model
What it stores, and who can read a row.
User
id uuid, email text, name text, timezone text, created_at timestamptz
Access · User can read/write their own row.
Client
id uuid, user_id uuid, name text, email text, default_rate numeric(10,2)
Access · User can read/write clients linked to their user_id.
TimeEntry
id uuid, user_id uuid, project_id uuid, start_time timestamptz, end_time timestamptz, notes text, billable boolean, invoice_id uuid
Access · User can read/write their own time entries.
Invoice
id uuid, user_id uuid, client_id uuid, public_link_token uuid, number text, status enum(draft, sent, paid, void), issue_date date, total_cents int
Access · User reads own invoices; anyone reads via valid public_link_token.
Those access rules belong in the database, not in the screens. Someone who edits the address bar still cannot read a row that is not theirs — and the test that proves it blocks delivery if it fails.
Section 05 · States
Invoice: draft → sent → paid | void
Most scope arguments three weeks into a build are really arguments about a state nobody named at the start.
Section 06 · Where this breaks
What bites products like this one.
Time logged on the 31st of a month can be the 1st for the client, breaking 'monthly' invoicing logic.
Store all times in UTC (timestamptz); all date boundaries are calculated using the freelancer's configured timezone.
Payment webhook from processor fails; client has paid but the invoice is not marked as 'paid'.
Build a reconciliation job that periodically queries payment statuses directly from the payment processor for all 'sent' invoices.
Freelancer edits a time entry while an invoice containing it is being generated, leading to incorrect totals.
Use a database transaction to lock the relevant time entries during invoice creation and calculation.
Section 08 · Deliberately left out
What version one does not do.
- ×Native mobile applications — we will build a responsive web app that works well on a phone browser. — A responsive web app meets the 'use on phone' requirement for logging hours without the cost of two separate codebases., When user data shows significant demand for offline tracking or push notifications for timers.
- ×Automated payment reminders for overdue invoices — freelancers will have to follow up manually. — The core value is generating and accepting payment, not collections management. This reduces initial complexity with background jobs., When feedback suggests freelancers are managing enough invoices that manual follow-up becomes a primary pain point.
This is the section that protects the date, and the only place in the document where somebody says no. It is also why clients trust the rest of it.
Still open
What we would ask before quoting.
- How will clients pay the invoice — via Stripe, PayPal, or are we just showing bank transfer details?
- Does a freelancer set one hourly rate, or does the rate vary per client, project, or even specific task?
- Besides the hours, what specific fields must the final invoice contain, such as tax ID, address, or payment terms?
Your product, not this one
Get this written for what you are actually building.
Describe it in a sentence and the generator returns the same sections for your own product. Free, no email, nothing saved to a list.
Next step
Find out if your idea fits in 10 working days.
Tell us what you want to build. We reply the same day with a straight yes, no, or here is what we would cut.