Home / Blog / Harvest and QuickBooks
How-to · 2026

Combining Harvest and QuickBooks Exports

Your hours are in one system and your invoices in another, and every useful services metric needs both. The join is the whole job, and it fails in five predictable places.

By the Quiriz Team · Published August 18, 2026 · 8 min read

Every metric worth having in a services firm needs both sides of this join. Realization needs hours and invoices. Project margin needs cost and invoices. Effective rate needs both. And the two live in different systems that have never agreed on how to spell a client name.

Getting the two files

Harvest. Reports, then Time, set the date range, then Export and choose the detailed CSV. You get roughly:

Date, Client, Project, Task, Person, Notes, Hours, Billable?, Billable Rate, Billable Amount

The Client column is the important one and it is why Harvest is pleasant to work with here — many time exports carry only a project, which leaves you resolving projects to clients before you can do anything.

QuickBooks. Reports, then Sales by Customer Detail, or the Invoice List, exported to Excel. You want line detail rather than totals, for the reason covered in the realization piece: an invoice total carries neither hours nor rate, so half your metrics die with it.

Save both as CSV in one folder with a consistent naming pattern. harvest-2026-08.csv and qbo-2026-08.csv is enough; what matters is that next month looks the same, because a Power Query refresh points at a path.

The join key

Two candidates, and you usually get the weaker one.

Join on client unless both files genuinely carry the project. If you want project-level answers permanently, the durable fix is in QuickBooks rather than in Excel: put the project code at the front of every invoice item description, or use Customer:Job so the job carries through to the export.

The mapping table, which is the actual work

Harvest says Acme Ltd. QuickBooks says Acme Limited. Somebody typed ACME in 2024. No formula fixes this, so make it explicit:

HarvestClient      QBOCustomer          CanonicalClient
Acme Ltd           Acme Limited         Acme
Bright & Co        Bright and Co.       Bright
Northwind          Northwind Trading    Northwind

Then map both sides to CanonicalClient and join on that. It is twenty to fifty rows for most firms and an afternoon of work, and it is the thing that makes the report survive into next month instead of being rebuilt.

Resist fuzzy matching. It works until it silently merges two clients with similar names, and by then the figures have been in three board packs.

The merge in Power Query

  1. Data, Get Data, From File, From Text/CSV for each of the three files — Harvest, QuickBooks, and your mapping table. Load each as a connection only.
  2. On the Harvest query, Merge Queries with the mapping table on Client to HarvestClient, and expand CanonicalClient. Do the same on the QuickBooks side with QBOCustomer.
  3. Add a month column to each: Add Column, Date, Month, Start of Month.
  4. Group each side to the grain you want — canonical client, month — and sum hours on one side and invoiced amount on the other.
  5. Merge the two summaries on client and month, using a full outer join, then expand.

The full outer join matters. An inner join drops any client that appears on only one side, which is exactly the case you most need to see: hours logged with nothing invoiced. An inner join makes that problem disappear from the report rather than showing it, which is a general hazard when joining files and not specific to these two.

If Power Query is unfamiliar, the merging CSV files walkthrough covers the same mechanics on a simpler example.

Five reasons the totals will not agree

They will not agree, and four of the five reasons are legitimate:

  1. Timing. August work invoiced in September. Real, and the reason hours bucket by work date and invoices by invoice date.
  2. Unbilled hours. Non-billable time, written-off time, and work in progress not yet invoiced. Real, and often the most useful thing in the whole report.
  3. Credit notes. Negative invoice lines that reduce the invoiced side with no hours behind them.
  4. Retainers. An invoice covering work not yet done, so the invoice arrives before the hours.
  5. Name mismatches. The only one that is a genuine defect, and the mapping table is the fix.

Do not force the two sides to agree. Report the difference as a column and label it, because the difference is the finding.

Reconciliation check before anyone sees the output: does total invoiced in your merged table equal the total on the QuickBooks report? If it is short, the join dropped rows — usually an unmapped client name, occasionally an inner join that should have been outer.

Or skip the join

The reason this is fiddly is that you are doing a database join in a spreadsheet, monthly, by hand.

Quiriz takes both exports as separate uploads and resolves the relationship between them when you ask a question, so realization rate by client reads across both files without a merge step. You still need the client names to line up — that is a fact about your data, not about the tool — but the mapping is a dataset you upload once rather than a query you rebuild.

The judgement call: if you do this join once a quarter, Power Query is genuinely fine and free. If you do it every month and other people ask you for slices of it, the joining is not the expensive part — the being asked is.

Ask across both exports without merging them first

Upload your time and invoice exports and ask for realization, effective rate or margin by client in plain English. Free to start.

Try Quiriz free →

Frequently asked questions

How do I combine Harvest time data with QuickBooks invoices?
Export both to CSV, decide on a join key that exists on both sides — usually the client, occasionally the project — and merge them in Power Query. The work is not the merge; it is a mapping table reconciling the names, because the client is almost never spelled identically in a time tracker and an accounting system.
Why do my Harvest and QuickBooks totals not match?
Five usual causes: client names spelled differently, work logged in one month and invoiced in the next, unbilled hours that have no invoice at all, credit notes reducing the invoice side, and retainer invoices covering work not yet done. All five are real business facts rather than data errors, which is why the fix is to report the difference rather than to force the totals to agree.
Should I join on client or on project?
Project is the more precise key and it is often missing on the accounting side, where a whole month for one client goes out as a single invoice. Join on client if that is what both files carry, and treat project-level invoicing as a bonus when your QuickBooks items happen to carry it.
Can Power Query do this without VLOOKUP?
Yes, and it is the better route for anything recurring. Get Data from each CSV, a Merge Queries step on the mapped key, then Close and Load. Next month you replace the files and press Refresh, where the VLOOKUP version needs the formulas dragged down over the new rows.
What if the client names never line up?
Build the mapping table once and maintain it. It is usually twenty to fifty rows and it takes an afternoon. There is no automatic fix, because Acme Ltd and Acme Limited are the same client only in your head, and a fuzzy match will eventually merge two clients whose names are genuinely similar.