- Home
- Resources
- Integrations
- Harvest
Harvest n8n integrationAutomate Harvest with n8n.
How much of Harvest can n8n actually drive? The Harvest n8n integration exposes 51 operations across 10 resources, clients, contacts, estimates, expenses and time entries included. No Harvest trigger node exists, so a Schedule Trigger or another app opens the workflow.
Verified Trustpilot reviews · AI, automation & growth agency
What can the Harvest n8n integration actually automate?
The Harvest node ships inside n8n and turns the Harvest API into ready made steps: pick a resource, pick an operation, fill the fields the node asks for. It covers 51 operations across 10 resources, so clients, contacts, projects, tasks, estimates, invoices, expenses, users and time entries are all reachable from a workflow, without writing a single API call by hand.
The first scenario is the end of month billing run. A Schedule Trigger fires on the first working day, Get Many time entries pulls everything logged since the last cutoff, and the workflow groups the hours per client before creating the invoice. The same run can drop a copy of the hours into Google Sheets so finance keeps a readable audit trail next to the accounting export.
The second one is client onboarding. A signed deal creates the client in Harvest, then the contact attached to it, then the project the team will log time against. Because every step returns the record it created, the client ID flows straight into the next node as an expression. A short message in Slack tells the team the project is open, and the account details land in the Notion page the delivery team already uses.
The third one watches margin. Get Many expenses with the Is Billed filter set to false lists what has been spent and never re-invoiced, project by project. Run it weekly and the gap between what a project costs and what the client pays stops being a surprise discovered three months later.
Two limits are worth knowing before building. Harvest has no trigger node in n8n, so nothing pushes events into a workflow: a Schedule Trigger at a fixed interval, an n8n Webhook called by another service, or the trigger of another tool has to open the run. And the node covers 10 resources, not the whole Harvest API. Anything missing, such as a resource the node does not expose, goes through the HTTP Request node, which calls any Harvest endpoint while reusing the same credential through predefined authentication.
If n8n itself is the new part, the n8n review covers what the tool does well and where it hurts, and the n8n training walks through building a first workflow end to end.
How do you connect Harvest to n8n?
- 01
Create the Harvest credential
In n8n, open the Credentials menu and add a Harvest credential. A credential is the stored login n8n reuses on your behalf, created once and available in every workflow from the node dropdown. Harvest supports two methods: an API access token and OAuth2. Pick the access token for a workflow that runs under one account, and OAuth2 when the connection has to follow a specific Harvest user.
- 02
Generate a personal access token
For the token method, create a personal access token in your Harvest account and paste it into the Access Token field of the credential. Harvest documents the exact path in its Personal Access Token authentication page. A Harvest account is the only prerequisite. Save the credential, and n8n keeps it encrypted for every later workflow, on n8n Cloud or on a self-hosted instance alike.
- 03
Select the account in the node
Drop the Harvest node on the canvas, select the credential, then set Account Name or ID. Every one of the 51 operations asks for it, because a Harvest login can belong to several accounts and the API needs to know which one. The field reads the list from your credential, so pick the account by name instead of typing an ID. An expression works too when the account comes from an earlier node.
Every Harvest operation the node exposes
The Harvest node exposes 51 operations across 10 resources. For each one: the node as you configure it in n8n, the required fields, and our field notes.
| Resource | Create | Get | Get Many | Update | Delete | Create via Duration | Create via Start and End Time | Delete External Reference | Me | Restart | Stop |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Client | ✓ | ✓ | ✓ | ✓ | ✓ | ||||||
| Company | ✓ | ||||||||||
| Contact | ✓ | ✓ | ✓ | ✓ | ✓ | ||||||
| Estimate | ✓ | ✓ | ✓ | ✓ | ✓ | ||||||
| Expense | ✓ | ✓ | ✓ | ✓ | ✓ | ||||||
| Invoice | ✓ | ✓ | ✓ | ✓ | ✓ | ||||||
| Project | ✓ | ✓ | ✓ | ✓ | ✓ | ||||||
| Task | ✓ | ✓ | ✓ | ✓ | ✓ | ||||||
| Time Entry | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||
| User | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
Operations index
Client
5 operationsCreate a client
client.createWhat you see in n8n
Notes & use cases
A new client record lands in Harvest and comes back with its ID, which the rest of the workflow reuses to attach contacts, projects or invoices.
Key parameters
- Account Name or ID: the Harvest account the client belongs to, picked from the list the credential loads.
- Name: the name of the client, the only content the node truly requires.
- Currency: sets the currency used for that client, which later estimates inherit when they leave it empty.
- Address: a textual address that accepts line breaks, useful for the block printed on documents.
Delete a client
client.deleteWhat you see in n8n
Notes & use cases
The node sends a deletion for the client whose ID you pass, and the record leaves the account.
Key parameters
- Client ID: the ID of the client you want to delete, usually
{{ $json.id }}from the node that listed or created it. - Account Name or ID: the account holding that client, since an ID only makes sense inside one account.
Get data of a client
client.getWhat you see in n8n
Notes & use cases
One ID in, the full client record out: name, address, currency and active flag, ready to be read by the following nodes.
Key parameters
- Client ID: the ID of the client you are retrieving, not its name, which the API does not accept here.
- Account Name or ID: the Harvest account to read from.
Get data of all clients
client.getAllWhat you see in n8n
Notes & use cases
Listing the client book is where Return All changes everything: enabled, n8n walks through the API pages and returns every client; disabled, it stops at the number set in Limit.
Key parameters
- Return All: on for a complete export, off when a preview of the first few clients is enough.
- Limit: the maximum number of clients returned when Return All stays off.
- Is Active: true keeps active clients only, false returns the archived ones.
- Updated Since: only clients modified after that date and time, which turns a full export into an incremental sync.
Update a client
client.updateWhat you see in n8n
Notes & use cases
Changing a client that already exists means passing its ID and only the fields that move, since anything left empty in Update Fields stays as it was.
Key parameters
- Client ID: the ID of the client to update, the pivot of the whole operation.
- Is Active: false archives the client instead of deleting it, true brings it back.
- Name: the client name, for a rebrand or a legal entity change.
- Address: the postal address, including line breaks.
Company
1 operationRetrieve the company for the currently authenticated user
company.getWhat you see in n8n
Notes & use cases
No ID to hunt for here. The operation returns the Harvest company behind the credential, which is the quickest way to confirm that the connection works and that it points at the right account.
Key parameters
- Account Name or ID: the only field to fill, and the one that decides which company is read when the login covers several accounts.
Contact
5 operationsCreate a contact
contact.createWhat you see in n8n
Notes & use cases
Contacts hang off a client in Harvest, so this operation always attaches the person to an existing company record.
Key parameters
- First Name: required, even when the rest of the identity comes later.
- Client ID: the ID of the client this contact belongs to, typically
{{ $json.id }}from the client created just before. - Email: the contact address, the field that matters for anything you plan to send.
- Title: the role of the person, handy when several people share one client.
Delete a contact
contact.deleteWhat you see in n8n
Notes & use cases
When someone leaves a client's team, this removes the person from the account without touching the client itself.
Key parameters
- Contact ID: the ID of the contact you want to delete, which a list step usually provides.
- Account Name or ID: the account where that contact lives.
Get data of a contact
contact.getWhat you see in n8n
Notes & use cases
Pulling one contact back is the cheapest way to get an email address and a title without loading the whole list.
Key parameters
- Contact ID: the ID of the contact you are retrieving.
- Account Name or ID: the Harvest account to query.
Get data of all contacts
contact.getAllWhat you see in n8n
Notes & use cases
The contact list comes back page by page, and the two filters decide how much of it the workflow has to read.
Key parameters
- Return All: enabled, every page is fetched; disabled, the run stops at Limit.
- Limit: the ceiling on returned contacts when Return All is off.
- Updated Since: restricts the answer to records changed after a date and time.
- Is Active: keeps active records, or returns the inactive ones when set to false.
Update a contact
contact.updateWhat you see in n8n
Notes & use cases
Phone numbers, titles and even the client a person belongs to change more often than the contact itself, and Update Fields carries exactly what moved.
Key parameters
- Contact ID: identifies the record to modify.
- Client ID: moves the contact to another client, for a person who changed company.
- Email: the new address, in the
name@email.comform the field expects. - Phone Office and Phone Mobile: the two numbers stored separately, so updating one leaves the other alone.
Estimate
5 operationsCreate an estimate
estimate.createWhat you see in n8n
Notes & use cases
An estimate starts life attached to a client, and Harvest numbers it on its own unless the workflow imposes a number.
Key parameters
- Client ID: the ID of the client this estimate belongs to, the only required content beyond the account.
- Subject: the estimate subject, the line the client reads first.
- Number: left empty, the number is generated automatically; filled, it follows your own numbering.
- Tax: a percentage applied to the subtotal, written as
10.0for ten percent. - Issue Date: defaults to today when the workflow leaves it out.
Delete an estimate
estimate.deleteWhat you see in n8n
Notes & use cases
Draft clean-up is the usual reason to call this one: the estimate matching the ID disappears from the account.
Key parameters
- Estimate ID: the ID of the estimate you want to delete, which comes from a list step or from the creation that produced it.
- Account Name or ID: the account the estimate belongs to.
Get data of an estimate
estimate.getWhat you see in n8n
Notes & use cases
Before anything is sent to a customer, reading the estimate back gives its current state, amounts and subject as Harvest stores them.
Key parameters
- Estimate ID: the ID of the estimate you are retrieving.
- Account Name or ID: the Harvest account holding it.
Get data of all estimates
estimate.getAllWhat you see in n8n
Notes & use cases
Filtering by state is what makes this operation useful: the query can target only what is waiting for an answer.
Key parameters
- State: draft, sent, accepted or declined, one value per query.
- From and To: bound the period read.
- Client ID: narrows the answer to one client.
- Return All: on to page through everything, off to stop at Limit.
- Page: the page number in pagination, starting at 1, for a manual walk through a long list.
Update an estimate
estimate.updateWhat you see in n8n
Notes & use cases
Amounts move between a first draft and a signature, and this operation rewrites only what the workflow provides.
Key parameters
- Invoice ID: the label the node uses for the ID of the document to update, so the value to pass is the estimate ID returned by the creation or the list.
- Discount: a percentage subtracted from the subtotal,
10.0for ten percent. - Notes: additional notes printed on the estimate.
- Purchase Order: the purchase order number the client asked to see.
Expense
5 operationsCreate an expense
expense.createWhat you see in n8n
Notes & use cases
Four fields are non negotiable here, because Harvest books an expense against a project, a category and a date.
Key parameters
- Project ID: the project the expense is charged to.
- Expense Category ID: the category it is tracked against, an ID rather than a label.
- Spent Date: the date the expense occurred, not the date the workflow runs.
- Total Cost: the total amount, or Units when the cost is computed from a quantity.
- Billable: true by default, so an internal cost has to set it to false explicitly.
Delete an expense
expense.deleteWhat you see in n8n
Notes & use cases
Duplicate receipts are the common case: two imports of the same card statement, one line too many, and this operation removes it.
Key parameters
- Expense ID: the ID of the expense you want to delete.
- Account Name or ID: the account it was booked in.
Get data of an expense
expense.getWhat you see in n8n
Notes & use cases
Reading a single expense back returns its amount, project, category and billable flag, which is often what a validation step needs.
Key parameters
- Expense ID: the ID of the expense you are retrieving.
- Account Name or ID: the Harvest account to read.
Get data of all expenses
expense.getAllWhat you see in n8n
Notes & use cases
Eight filters make this the widest query of the resource, and combining them is what keeps the run short.
Key parameters
- Is Billed: false lists what has not been invoiced yet, true what already has.
- Project ID and Client ID: restrict the answer to one project or one client.
- From and To: the period covered.
- User ID: the person who logged the expenses.
- Return All: on to collect every page, off to cap the result with Limit.
Update an expense
expense.updateWhat you see in n8n
Notes & use cases
An expense is usually corrected after the fact, once someone notices the wrong project or a missing amount.
Key parameters
- Invoice ID: the label the node gives to the ID of the record to update, so pass the expense ID here.
- Project ID: rebooks the expense on another project.
- Expense Category ID: changes the category it is tracked against.
- Billable: flips a cost between billable and internal.
- Spent Date: fixes a date typed wrong at capture.
Invoice
5 operationsCreate an invoice
invoice.createWhat you see in n8n
Notes & use cases
Billing starts here. The node opens a new invoice in Harvest for a client and returns the created record with its identifier, ready for the next node.
Key parameters
- Account Name or ID: the Harvest account to bill from, picked in the dropdown or passed as an ID with an expression, the n8n syntax that reads a field from the incoming item.
- Client ID: the client the invoice belongs to.
- Number: leave it empty in Additional Fields and Harvest generates the invoice number itself.
- Payment Term: upon receipt, net 15, net 30, net 45 or net 60.
Delete an invoice
invoice.deleteWhat you see in n8n
Notes & use cases
Deletion is final on the Harvest side, so this operation usually sits at the end of a cleanup branch guarded by an IF node.
Key parameters
- Invoice ID: the invoice to remove, most often
{{ $json.id }}coming from a Get Many step upstream. - Account Name or ID: the account that holds the invoice, since an ID from one Harvest account will not resolve in another.
Get data of an invoice
invoice.getWhat you see in n8n
Notes & use cases
One invoice, one call. The node reads a single invoice and hands the full record to the rest of the workflow.
Key parameters
- Invoice ID: the invoice you are retrieving, typically stored in the CRM record or carried by the item that triggered the run.
- Account Name or ID: the Harvest account the lookup runs against.
Get data of all invoices
invoice.getAllWhat you see in n8n
Notes & use cases
This is the reporting workhorse of the Invoice resource. It lists invoices and pushes one item per invoice into the workflow.
Key parameters
- Return All: on, n8n walks the pages of the Harvest API until every invoice is in; off, Limit caps how many come back.
- State: a filter that keeps only draft, open, paid or closed invoices.
- From and To: bound the period; Updated Since narrows a run to what changed since the last execution.
Update an invoice
invoice.updateWhat you see in n8n
Notes & use cases
An invoice that already exists can still move. This operation edits it in place and returns the updated version.
Key parameters
- Invoice ID: the invoice to modify. Everything else lives in Update Fields, so only what you fill gets touched.
- Due Date: pushes the deadline; left alone, Harvest keeps the date it computed from the issue date.
- Subject and Notes: the text a client reads on the document.
- Tax and Tax2: percentages applied to the subtotal, written as 10.0 for ten percent.
Project
5 operationsCreate a project
project.createWhat you see in n8n
Notes & use cases
Time entries attach to projects, which makes this operation the first step of most client onboarding flows.
Key parameters
- Name and Client ID: what the project is called and who it belongs to.
- Is Billable: whether the hours logged on it can end up on an invoice.
- Bill By: none, People, Project or Tasks, the method Harvest uses to invoice the work.
- Budget By: the email of the user, or the literal value none.
Delete a project
project.deleteWhat you see in n8n
Notes & use cases
Removing a project is the hard version of archiving it. Reach for it only when the project should leave Harvest for good.
Key parameters
- Project ID: the project to delete.
- Account Name or ID: the account it lives in.
Get data of a project
project.getWhat you see in n8n
Notes & use cases
Reading a project gives the workflow its settings, from the client it belongs to down to the budget fields, before anything else happens.
Key parameters
- Project ID: the project you are retrieving, often
{{ $json.projectId }}taken from a time entry handled earlier. - Account Name or ID: the Harvest account to query.
Get data of all projects
project.getAllWhat you see in n8n
Notes & use cases
Pull the project list once and loop over it. Every project comes back as its own item.
Key parameters
- Return All: on, every project comes back page after page; off, Limit decides how many.
- Is Active: true keeps the live projects, false returns the archived ones.
- Client ID: restricts the list to one client.
- Updated Since: only projects touched after the date you pass.
Update a project
project.updateWhat you see in n8n
Notes & use cases
Budgets and rates change during a client relationship. This operation applies those changes to an existing project.
Key parameters
- Project ID: the project to update; fields left empty in Update Fields stay as they are.
- Budget and Budget Is Monthly: the hours allowed, and whether that allowance resets every month.
- Hourly Rate: used when the project is billed by project hourly rate.
- Is Active: set it to false to archive the project instead of deleting it.
Task
5 operationsCreate a task
task.createWhat you see in n8n
Notes & use cases
Tasks are the activity labels a person picks when logging time, such as design or support. This operation adds one to the account.
Key parameters
- Name: the only required field beyond the account, so the node stays short.
- Default Hourly Rate: the rate applied when the task is added to a project, 0 unless you set it.
- Is Default: on, the task is added automatically to future projects.
- Billable By Default: whether the hours logged on it count as billable.
Delete a task
task.deleteWhat you see in n8n
Notes & use cases
Harvest drops the task from the account when this runs, which also removes it from the picker people use when tracking time.
Key parameters
- Task ID: the task you want to delete.
- Account Name or ID: the account it belongs to.
Get data of a task
task.getWhat you see in n8n
Notes & use cases
Use it to confirm what a task ID actually points to before another node writes anything.
Key parameters
- Task ID: the task you are retrieving.
- Account Name or ID: the account to read from.
Get data of all tasks
task.getAllWhat you see in n8n
Notes & use cases
The task list is short in most accounts, which makes it a good source for dropdowns and lookups built elsewhere.
Key parameters
- Return All: on, the node collects the whole list; off, Limit stops it earlier.
- Is Active: true for the tasks people can still pick, false for the archived ones.
- Page: moves through the pages by hand when Return All stays off.
Update a task
task.updateWhat you see in n8n
Notes & use cases
Renaming or repricing a task keeps every past time entry intact, unlike a delete.
Key parameters
- Task ID: the task to update.
- Name: the new label, visible immediately to the people tracking time.
- Default Hourly Rate: the rate future projects will inherit.
- Is Active: false archives the task without erasing its history.
Time Entry
9 operationsCreate a time entry via duration
timeEntry.createByDurationWhat you see in n8n
Notes & use cases
When the workflow already knows how long something took, this is the operation that writes it to Harvest.
Key parameters
- Project ID and Task ID: what the hours are charged to. Both are required, so keep a lookup in front of this node.
- Spent Date: the date the time was spent, in ISO 8601 format.
- Hours: the amount of time tracked.
- User ID: defaults to the authenticated user, so set it when the entry belongs to someone else.
Create a time entry via start and end time
timeEntry.createByStartEndWhat you see in n8n
Notes & use cases
Same result, different input. Here Harvest gets two clock times and works out the duration itself.
Key parameters
- Started Time and Ended Time: clock values such as
8:00amand3:00pm. Left empty, the start defaults to the current time. - Spent Date: the ISO 8601 date the entry belongs to, which can differ from the day the workflow runs.
- Notes: free text that explains the entry to whoever reviews it.
Delete a time entry
timeEntry.deleteWhat you see in n8n
Notes & use cases
Hours logged on the wrong project are worse than no hours at all. This operation takes the entry out of Harvest.
Key parameters
- Time Entry ID: the entry you are deleting.
- Account Name or ID: the account it was logged in.
Delete a time entry’s external reference
timeEntry.deleteExternalWhat you see in n8n
Notes & use cases
Narrower than it first looks. The entry stays in Harvest with its hours and notes; only the link to the outside record it came from is cut.
Key parameters
- Time Entry ID: the entry whose external reference you are deleting.
- Account Name or ID: the account holding the entry.
Get data of a time entry
timeEntry.getWhat you see in n8n
Notes & use cases
Reading a single entry gives the workflow the detail behind a line in a report.
Key parameters
- Time Entry ID: the entry you are retrieving.
- Account Name or ID: the account to read from.
Get data of all time entries
timeEntry.getAllWhat you see in n8n
Notes & use cases
Everything invoicing and reporting needs comes out of this operation. Filters decide how much of the history comes with it.
Key parameters
- Return All: on, n8n pages through the full history, which can be long on an old account; off, Limit keeps the run small.
- From and To: the period the entries were spent in.
- Is Billed: false isolates the hours not yet invoiced.
- Is Running: true returns only timers still counting.
- User ID and Client ID: narrow the list to one person or one client.
Restart a time entry
timeEntry.restartTimeWhat you see in n8n
Notes & use cases
Harvest picks the timer back up on an entry that was stopped earlier, instead of creating a second one for the same work.
Key parameters
- Time Entry ID: the stopped entry to restart. Harvest refuses the call if that entry is already running, so branch on the state before you send it.
- Account Name or ID: the account the timer lives in.
Stop a time entry
timeEntry.stopTimeWhat you see in n8n
Notes & use cases
The opposite move, and the one that saves the most hours at the end of a month. It closes a timer that is still counting.
Key parameters
- Time Entry ID: the running entry to stop. The call only works while it is running, so pair it with a Get Many filtered on Is Running.
- Account Name or ID: the Harvest account concerned.
Update a time entry
timeEntry.updateWhat you see in n8n
Notes & use cases
Corrections belong here rather than in a delete followed by a fresh entry, because the entry keeps its place in the timeline.
Key parameters
- Time Entry ID: the entry to fix.
- Hours: the corrected amount of time tracked.
- Started Time and Ended Time: the clock values, when the entry was created from a start and end pair.
- Notes: the place to record why the line changed.
User
6 operationsCreate a user
user.createWhat you see in n8n
Notes & use cases
Adds a person to the Harvest account and returns the new user record, identifier included.
Key parameters
- Account Name or ID: the Harvest account the user lands in, picked from the dropdown or passed through an expression, meaning a value borrowed from a previous node, such as
{{ $json.accountId }}. - First Name, Last Name and Email: the three identity fields Harvest asks for, the email box showing
name@email.comas its example format. - Additional Fields: 13 optional settings, among them Is Admin, Default Hourly Rate and Weekly Capacity, counted in seconds and set to
126000by default, which is 35 hours a week.
Delete a user
user.deleteWhat you see in n8n
Notes & use cases
Deletion here is final, so this operation belongs at the end of an offboarding run, once everything that had to be billed has been billed.
Key parameters
- Account Name or ID: tells the node which Harvest account holds the person, from the list or from an expression.
- User ID: the ID of the user you want to delete. Harvest expects that identifier, not an email address or a display name, so read it from an earlier step with
{{ $json.id }}.
Get data of a user
user.getWhat you see in n8n
Notes & use cases
Fetches one user record from its identifier and passes the full profile down the workflow, which saves a manual lookup when only an ID has been travelling between nodes.
Key parameters
- Account Name or ID: the Harvest account to query, selected in the node or resolved by expression.
- User ID: the ID of the user you are retrieving, most often
{{ $json.id }}when the value comes from a list step earlier in the run.
Get data of all users
user.getAllWhat you see in n8n
Notes & use cases
Returns the people attached to an account, one item per user, which is the usual starting point for anything that loops over a team.
Key parameters
- Account Name or ID: the account whose roster gets listed.
- Return All: enabled, n8n follows every page of the Harvest API until the roster is complete; disabled, Limit caps how many users come back.
- Filters: 3 options, Is Active to separate current people from archived ones, Updated Since to keep only records touched after a date, and Page to target a specific page of results.
Get data of authenticated user
user.meWhat you see in n8n
Notes & use cases
Reads back the profile tied to the credential itself, which is the shortest way to confirm that the token or the OAuth2 connection really reaches Harvest.
Key parameters
- Account Name or ID: the only field to fill, and it doubles as a check that the credential can actually see that account.
Update a user
user.updateWhat you see in n8n
Notes & use cases
Changes what Harvest stores about someone already in the account, so rates, permissions and capacity move without creating a second record for the same person.
Key parameters
- Account Name or ID: the account holding the record to edit.
- Time Entry ID: the node labels the required identifier this way for this operation, and its description reads "The ID of the time entry to update".
- Update Fields: 16 editable settings, including Email, First Name, Last Name, Is Active, Is Project Manager and Cost Rate.
Need help automating Harvest with n8n?
A person reads every message.
