Harvest

getharvest.comcontributed by Samuele Ongaro

YES

Replaceable in one session with an AI coding agent.

Time tracking for billable work: timers against projects and tasks, budgets that warn before they are exceeded, and invoices generated from the hours recorded.

Promptfree, for everyone, and the only version there is
Build me billable time tracking that replaces Harvest: timers against projects, budgets that warn before they are blown, and invoices out of the hours.

STACK
- Node 20+ with Fastify, server-rendered HTML with a little vanilla JS
- SQLite through better-sqlite3, WAL mode
- Caddy in front

THE DATA MODEL
- clients: id, name, address, currency, payment_terms_days, archived_at
- projects: id, client_id, name, code, billing_kind, budget_kind, budget_amount_cents, budget_hours, budget_is_recurring, notify_at_percent, starts_on, ends_on, archived_at
- tasks: id, name, is_billable_default, default_rate_cents
- project_tasks: project_id, task_id, is_billable, hourly_cents
- rates: id, scope, scope_id, user_id, hourly_cents, currency, effective_from — an entry bills at the rate in force when the work happened, always
- entries: id, user_id, project_id, task_id, notes, started_at, ended_at, duration_seconds, is_billable, is_locked, invoice_id, expense_id, source, created_at
- entry_revisions: id, entry_id, field, old_value, new_value, changed_by, at — append-only
- expenses: id, project_id, user_id, category, amount_cents, currency, incurred_on, receipt_path, is_billable, markup_percent, invoice_id
- invoices, invoice_lines, payments, and a per-year number sequence
- Every instant UTC, every amount integer cents with a currency

BILLING KINDS, WHICH DECIDE EVERYTHING ELSE
- Hourly by person, hourly by task, hourly by project, or a fixed fee
- A fixed-fee project still tracks hours, because the hours are how you learn whether the fee was right. The report shows the effective hourly rate afterwards, which is the most useful number a small studio ever sees
- Non-billable projects exist and are tracked, because internal time is where the margin actually goes

TIME
- An entry is two instants; the duration is derived. Never store a duration alone or a day with a clock change will not reconcile
- One running timer per person, enforced with a partial unique index
- A timer that has run past a threshold is flagged and offered for trimming to the last activity, never trimmed silently
- Weekly timesheet grid alongside the timer, both writing the same rows
- Rounding is a report setting, never a stored change: the raw seconds are kept and rounding is applied when billing. A tracker that rounds on save has destroyed the evidence

BUDGETS AND ALERTS
- Hours or money, one-off or recurring monthly, per project
- Progress visible on every screen where the project appears, not only in a report
- Alerts to the project's manager at configurable percentages, once per threshold per period
- A projection: at the current burn, the budget is exhausted on this date. That warning is the difference between a conversation and an invoice nobody expected
- Over-budget hours still tracked, marked, and reported separately

EXPENSES
- Category, amount, date, receipt photo, billable or not, with an optional markup
- Receipts stored by hash, EXIF stripped, and shown on the invoice as a line
- Expenses in a currency other than the project's are converted at a recorded rate on a recorded date, and both are stored

INVOICING
- Select unbilled, unlocked, billable entries and expenses for a period and generate an invoice from them
- Lines grouped by person, by task or by project, chosen per invoice
- Numbering from a sequence table, per year, allocated inside the transaction that issues the invoice. Gapless, because in most countries that is a legal requirement rather than a preference
- An issued invoice is immutable: a correction is a credit note that references it
- The PDF generated once at issue and stored with its hash
- Marking entries invoiced with the invoice id, so nothing bills twice, ever
- Payments recorded against invoices with the balance derived, and status never typed

REPORTS
- Hours and amounts grouped by client, project, task, person or week, filterable by all of them
- Cost rate against billable rate gives margin, per project and per person
- Uninvoiced work, which is the report that finds the money you forgot to bill
- Everything computed from rows at query time. No stored totals

APPROVAL AND LOCKING
- Submit a period, a reviewer approves, and approved periods lock
- A locked entry cannot be edited without an explicit unlock, which is logged
- Invoiced entries are locked permanently

OPERATIONS
- .env: DATABASE_PATH, STORAGE_PATH, BASE_URL, SESSION_SECRET, SMTP_URL
- Migrations on boot, each once
- Nightly backup off the machine, restore script
- Health endpoint

WHAT MATTERS MOST
The invoice transaction and rates with effective dates. Build gapless numbering and the mark-as-invoiced inside one transaction, then try to double-bill an entry from two browsers at once. Hours are what you get paid for, and the two ways to lose money here are billing twice and not billing at all.

Give me the repository, migrations, .env.example, a seed agency with three clients and a month of work, and a README with deploy steps behind Caddy and a note to check the invoice numbering rules locally.

What you lose

  • Timers on every platform, including apps that keep running when the laptop sleeps
  • Invoicing generated straight from tracked hours, with payment collection attached
  • Budget alerts before a project goes over, not after
  • Integrations that start a timer from inside the tools people already have open
  • Team-wide reporting your finance person already knows how to read

If you would rather not build

  • Toggl Track — paid, better apps, weaker invoicing

What it costs

read from their page 15 Aug 2026

PlanBilled monthlyBilled yearlyLast read
—$13.75/mo—15 Aug 2026

Their pricing page is where these came from. Seeing a different price? Tell us.

The escape hatch

open source · no votes, no paid placement

Kimai

$0

Time tracking with projects, rates, invoices and exports; runs on ordinary PHP hosting.

kimai/kimaifree · open source

Traggo

$0

Tag-based time tracking with a very small footprint.

traggo/serverfree · open source

Why this verdict

our own opinion · changed only by a person

78/100

Verdict yes at 78: entries, effective-dated rates and immutability after billing are the parts that matter, and they fit one session. The apps and the integrations are what make people actually track time, and that is the part you inherit as a problem.

History

tracked since 9 Aug 2026 · nothing is ever overwritten

Interest · last 30 dayspeak 1/day
views0130 Aug4 Sept9 Sept14 Sept19 Sept24 Sept28 Sept
— views— prompt copies none yet— votes none yet

Questions about Harvest

answered from the record above

Is Harvest free?

No — the plan we track is $13.75 a month. Pro at $13.75 per seat per month billed monthly, $10.80 annually; a free tier covers one person and two projects.

Can you replace Harvest by building your own?

YES. Replaceable in one session with an AI coding agent. Replacement score 78 out of 100, build time one session. Read what you lose before you decide.

How much does Harvest cost?

$13.75 a month on Pro — $165 a year. Recorded 9 Aug 2026.

What do you lose by replacing Harvest?

Timers on every platform, including apps that keep running when the laptop sleeps; Invoicing generated straight from tracked hours, with payment collection attached; Budget alerts before a project goes over, not after; Integrations that start a timer from inside the tools people already have open; Team-wide reporting your finance person already knows how to read. If any of those carry weight for you, keep paying.

Is there an open-source alternative to Harvest?

Yes: Kimai, Traggo. The prompt on this page is for when you want it your way instead.

Related entries

same category first, most replaced first

All 18 in Time tracking & invoicing

Not sending yet

Every week, something stops being worth paying for.

New verdicts, prices that moved, entries added. One email a week. Unsubscribe in one click. Nothing is being sent yet — your address is kept here, and the first issue is the first thing it is used for.

free forever · no tracking pixel · stored here, never passed to anyone

Esc