2026-08-26 · updated 2026-09-18: Winnows now creates the invoice in QuickBooks or Xero itself, unsent

Bill by the hour, invoice from your books

Every time-tracking tool eventually grows an invoicing module, and every one of them is a worse invoicing tool than the accounting system you already pay for. We stop at the unsent invoice: it is created in your accounting system, and everything after that happens there.

The workflow

  1. People log time against a client, a project and a task. Rates are set per member and per project, with the date each rate took effect, so a rate change never rewrites last quarter.
  2. Weeks are submitted and approved, if you use approvals. A payroll lock date keeps closed periods closed.
  3. On Reports → Invoicing, approved hours become invoices in QuickBooks Online or Xero, created unsent: a line per person, task and rate, numbered from your own pattern, carrying the tax code you chose. Or the same lines download as a CSV in plain headers QuickBooks and Xero accept. Either way the run records which entries went out, so the next one starts where the last one stopped.
  4. Your bookkeeper reviews them in the accounting system, which computes the tax and applies the terms the way the books need them, and sends.

Why not invoice here

Tax handling, payment terms, reminders, credit notes, currency, and the audit trail all live in the accounting system, and the accountant wants exactly one place for them. A second invoicing surface means two sets of numbers to reconcile. The Reddit threads about switching from Harvest are full of people discovering that a time tool’s Xero sync calculates tax differently from Xero. Winnows attaches the tax code you chose and computes no tax itself, so the tax on the invoice is the accounting system’s own. Creating the invoice where it will live, and leaving it unsent, sidesteps the whole problem.

See the export

The CSV is on every plan, the free one included; creating invoices in QuickBooks or Xero is on the paid plan.

What we do check

That the amounts are right. Reports and the export price every entry at query time from the rate history, never from a number stored on the entry, so a corrected rate corrects every report. After a Harvest import the reconciliation report proves the totals match the source before the first export goes out.