Guides · Migrating
Can I import my Harvest history, and what comes across?
Yes. Winnows connects to Harvest's API and imports your clients, projects, tasks, people, project assignments, bill rates and every time entry, then prints a reconciliation report comparing its own totals against Harvest's. There is no CSV to export or clean, and no file-size limit.
What transfers
| What | Comes across | Detail |
|---|---|---|
| Clients | Yes | With the projects that sit under them. |
| Projects | Yes | With their client, code and billable flag. |
| Tasks | Yes | Including per-project billability overrides. |
| People | Yes | As members. Anyone archived in Harvest stays archived here, and archived members are free. |
| Project assignments | Yes | Who was on which project. |
| Bill rates, including historical | Yes | Reconstructed per person per project over time from the entries themselves, not just today's rate. |
| Time entries | Yes | Every entry with its date, hours, notes, task and billability. |
| Negative and correction entries | Yes | Imported with their sign rather than skipped. See the limits below. |
| Invoices | No | Winnows does not generate invoices. It exports invoice-ready lines to QuickBooks or Xero, where the invoicing happens. |
| Expenses and estimates | No | Neither is a feature of Winnows. |
| Uploaded receipts | No | There are no expenses to attach them to. |
| Approval history | No | Imported weeks arrive open, so you approve on your own terms rather than inheriting someone else's lock. |
| Which hours Harvest had invoiced | Yes | Harvest's own invoiced flag and invoice number come across, and those hours arrive already marked as invoiced so they are not billed twice. It is a default, not a verdict: if Harvest was never told about invoices you raised elsewhere, you can mark those yourself in one step, or undo what Harvest claimed. |
How to do it
- Create a Harvest personal access token. In Harvest, open Developers and create a personal access token. Read access is enough. The screen shows your Account ID beside it; you need both.
- Paste the token and Account ID into Winnows. In Winnows, open Import and paste both values. Nothing is read from Harvest until you start a run.
- Run a dry run first. A dry run reads your whole account and writes nothing, and reports the counts it found so you can sanity-check them before anything lands.
- Run the import. It works in phases (clients, tasks, projects, people, assignments, rates, entries, reconcile) and records its position as it goes, so an interrupted run resumes rather than restarting. Re-running never duplicates anything.
- Read the reconciliation report. The last phase recomputes every total and compares it against Harvest's. This is the step that tells you the move worked, and the one to read before cancelling anything.
Limits, and what goes wrong
Negative entries are kept. Harvest accounts carry corrections against locked weeks, a −2h entry that cancels a mistake. One real account held fifteen of them, −52 hours and $3,317 of billable value. An importer that skips “anything under a minute” drops them silently and over-bills the client. These import with their sign.
Notes-only entries are skipped, and counted. An entry with no time has nothing to log, so it is not imported. The reconciliation report counts them rather than leaving you to wonder where they went.
Hundredths of an hour are rounded to whole minutes. Harvest keeps hours to two decimals and Winnows keeps whole minutes, so 0.33h is 19.8 minutes and becomes 20. Where that would change the money, Winnows keeps Harvest’s own amount for the entry, so totals still match to the cent.
Hours Harvest invoiced arrive marked as invoiced; hours you invoiced elsewhere do not. Harvest records which hours it billed and on which invoice, and both come across, so those hours are not offered for billing a second time. It is only right about its own invoices. If you raised invoices from a different tool, Harvest was never told, and that history will arrive looking like unbilled work. One action on the invoicing page marks everything through a date as invoiced elsewhere, with a note, and it can be undone. So can what Harvest claimed.
An entry whose project, person or task did not import is skipped. This is rare and it is deliberate: an entry with nowhere to hang is worse than a missing one. The reconciliation report shows it as a variance rather than absorbing it.
Comparing other tools. Most alternatives import from a CSV you export and clean yourself, and some cap the upload size. Those limits are theirs to change, so check the vendor’s own import documentation rather than taking our word for it. The question worth asking any of them is whether historical bill rates come across, and how you would prove the totals match.
How to verify it worked
The last phase of the import recomputes hours and billable amounts from the data Winnows now holds, using the same pricing its reports use, and compares them against Harvest’s own totals by client, by project, by member and by year. Every row either matches or is itemised down to the entry, with Harvest’s figure beside ours. Money is compared to the cent and computed in integers, so 8.5 hours at $75.07 is $638.10 on both sides, never a floating-point $638.09.
A 32,000-entry account reconciled with 26 rows off
Because the import is idempotent, you can run both tools through a switchover month, re-run the import for the deltas, and read the reconciliation again at the end. The switchover month, step by step covers that sequence. Read the report before you cancel anything, not after.
Questions people ask
- Do I need to export a CSV from Harvest first?
- No. Winnows reads your account through Harvest's API using a personal access token, so there is no export to produce, clean or re-map, and no file-size limit to work around.
- Will my old bill rates come across, or just my current ones?
- Historical rates come across. Winnows reconstructs the rate that applied to each person on each project over time from the entries themselves, so an invoice re-run against last year's hours uses last year's rate.
- Can I run the import more than once?
- Yes. The import is idempotent: every record is matched on its Harvest id, so re-running syncs what changed in Harvest and never duplicates. That is what makes a switchover month safe.
- What if I invoiced from somewhere other than Harvest?
- Then Harvest's own records will say nothing was invoiced, and it is right about its own invoices and wrong about yours. One action on the invoicing page marks everything through a date as invoiced elsewhere, with a note, so your history stops looking like unbilled work. It is reversible.
- Does the import cost anything?
- No. It runs on the free plan, which covers 2 people and 1 active project, and the reconciliation report is visible before anything is billed.
Related guides
Last reviewed 2026-09-12
Verified against the importer's phase list and entry mapping in src/dal/importer.ts, and the reconciliation report in a 32,000-entry account.