Important: Version 1.0 deprecation
This version of the Harvest integration will be deprecated on November 28, 2018 and no longer be formally supported by the Stitch Support Team.
Connections created from January 9, 2018 to August 29, 2018 use this version. Upgrade to the latest version (2.0) to take advantage of the new enhancements.
Harvest integration summary
Stitch’s Harvest integration replicates data using the Harvest REST API V1. Refer to the Schema section for a list of objects available for replication.
Harvest feature snapshot
A high-level look at Stitch's Harvest (v1.0) integration, including release status, useful links, and the features supported in Stitch.
STITCH | |||
Release Status |
Deprecated |
Supported By | |
Stitch Plan |
Free |
Singer GitHub Repository | |
DATA SELECTION | |||
Table Selection |
Unsupported |
Column Selection |
Unsupported |
REPLICATION SETTINGS | |||
Anchor Scheduling |
Supported |
Advanced Scheduling |
Unsupported |
Table-level Reset |
Unsupported |
Configurable Replication Methods |
Unsupported |
TRANSPARENCY | |||
Extraction Logs |
Supported |
Loading Reports |
Supported |
Connecting Harvest
Harvest setup requirements
To set up Harvest in Stitch, you need:
-
Verify your Harvest user’s access. Stitch will have the same permissions as the user setting up the integration. This means Stitch will only be able to access the same objects and data as the authorizing user.
For example: if you’re unable to access expenses in Harvest, Stitch will be unable to replicate expense data.
Before diving into the setup process, verify that the user setting up the integration has access to all the objects - such as expenses - that you want to replicate.
Read more about Harvest permissions in their documentation.
Step 1: Add Harvest as a Stitch data source
- Sign into your Stitch account.
-
On the Stitch Dashboard page, click the Add Integration button.
-
Click the Harvest icon.
-
Enter a name for the integration. This is the name that will display on the Stitch Dashboard for the integration; it’ll also be used to create the schema in your destination.
For example, the name “Stitch Harvest” would create a schema called
stitch_harvest
in the destination. Note: Schema names cannot be changed after you save the integration. - Enter your Harvest account name in the Account Name field. For example: if your Harvest account URL is
stitch.harvestapp.com
, you’d enterstitch
in this field.
Step 2: Define the historical sync
The Sync Historical Data setting will define the starting date for your Harvest integration. This means that data equal to or newer than this date will be replicated to your data warehouse.
Change this setting if you want to replicate data beyond Harvest’s default setting of 1 year. For a detailed look at historical replication jobs, check out the Syncing Historical SaaS Data guide.
Step 3: Create a replication schedule
In the Replication Frequency section, you’ll create the integration’s replication schedule. An integration’s replication schedule determines how often Stitch runs a replication job, and the time that job begins.
Harvest integrations support the following replication scheduling methods:
To keep your row usage low, consider setting the integration to replicate less frequently. See the Understanding and Reducing Your Row Usage guide for tips on reducing your usage.
Step 4: Authorize Stitch to Access Harvest
Lastly, you’ll be directed to Harvest’s website to complete the setup.
- Enter your Harvest credentials and click Create Integration.
- A screen asking for authorization to Harvest will display. Note that Stitch will only ever read your data.
- Click Connect.
- After the authorization process successfully completes, you’ll be redirected back to Stitch.
- Click All Done.
Initial and historical replication jobs
After you finish setting up Harvest, its Sync Status may show as Pending on either the Stitch Dashboard or in the Integration Details page.
For a new integration, a Pending status indicates that Stitch is in the process of scheduling the initial replication job for the integration. This may take some time to complete.
Initial replication jobs with Anchor Scheduling
If using Anchor Scheduling, an initial replication job may not kick off immediately. This depends on the selected Replication Frequency and Anchor Time. Refer to the Anchor Scheduling documentation for more information.
Free historical data loads
The first seven days of replication, beginning when data is first replicated, are free. Rows replicated from the new integration during this time won’t count towards your quota. Stitch offers this as a way of testing new integrations, measuring usage, and ensuring historical data volumes don’t quickly consume your quota.
Harvest table schemas
Schemas and versioning
Schemas and naming conventions can change from version to version, so we recommend verifying your integration’s version before continuing.
The schema and info displayed below is for version 1.0 of this integration.
Table and column names in your destination
Depending on your destination, table and column names may not appear as they are outlined below.
For example: Object names are lowercased in Redshift (CusTomERs
> customers
), while case is maintained in PostgreSQL destinations (CusTomERs
> CusTomERs
). Refer to the Loading Guide for your destination for more info.
clients
Replication Method : |
Key-based Incremental |
Replication Key : |
updated_at |
Primary Key : |
id |
API endpoint : |
The clients
table contains info about the clients in your Harvest account.
id
The client ID. |
updated_at
The last time the client was updated. |
name
The client’s name. Ex: |
active
Indicates if the client is active or archived. |
currency
The currency denomination used by the client. |
highrise_id
The optional Highrise ID for the client, if using Harvest’s legacy integration. |
cache_version
The cache version for the client. |
created_at
The time the client was updated. |
currency_symbol
The symbol associated with the client’s selected currency denomination. |
details
Additional details about the client, usually address information. |
default_invoice_timeframe
The default invoice timeframe for the client. |
last_invoice_kind
The type of the last invoice. |
contacts
Replication Method : |
Key-based Incremental |
Replication Key : |
updated_at |
Primary Key : |
id |
API endpoint : |
The contacts
table contains info about the client contacts in your Harvest account.
id
The contact ID. |
updated_at
The last time the contact was updated. |
client_id
The ID of the client the contact is a part of. |
first_name
The contact’s first name. |
last_name
The contact’s last name. |
email
The email address for the contact. |
phone_office
The phone number for the contact. |
phone_mobile
The mobile phone for the contact. |
fax
The fax number for the contact. |
title
The contact’s title. Ex: |
created_at
The time the contact was created. |
expense_categories
Replication Method : |
Key-based Incremental |
Replication Key : |
updated_at |
Primary Key : |
id |
API endpoint : |
The expense_categories
table contains info about the expense categories in your Harvest account.
id
The expense category ID. |
updated_at
The last time the expense category was updated. |
name
The name of the expense category. |
unit_name
The name of the unit associated with the expense category. This column will only contain values for expense categories based on unit values. |
unit_price
The price of the unit associated with the expense category. This column will only contain values for expense categories based on unit values. |
created_at
The time the expense category was created. |
deactivated
Indicates if the expense category has been deactivated. |
expenses
Replication Method : |
Key-based Incremental |
Replication Key : |
updated_at |
Primary Key : |
id |
API endpoint : |
The expenses
table contains info about the expenses recorded in your Harvest account.
id
The expense ID. |
updated_at
The last time the expense was updated. |
total_cost
The total cost of the expense. |
units
The number of units contained in the expense, if calculated by unit price. Ex: |
created_at
The time the expense was created. |
project_id
The ID of the project associated with the expense. |
expense_category_id
The ID of the expense category associated with the expense. |
user_id
The ID of the user associated with the expense. |
spent_at
The date when the expense was entered. |
is_closed
Indicates if the expense has been closed. |
notes
Expense entry notes. |
invoice_id
The ID of the invoice associated with the expense. Note: only billable expenses can be invoiced. |
billable
Indicates if the expense is billable. |
company_id
The ID of the company associated with the expense. |
has_receipt
Indicates if the expense has a receipt. |
receipt_url
If |
is_locked
Indicates if the expense has been locked. |
locked_reason
If |
invoice_item_categories
Replication Method : |
Key-based Incremental |
Replication Key : |
updated_at |
Primary Key : |
id |
API endpoint : |
The invoice_item_categories
table contains info about the various categories that can be applied to invoice line items.
Note: Harvest includes two non-removable categories by default for the hours and expenses you bill.
id
The ID of the invoice item category. |
updated_at
The last time the invoice item category was updated. |
name
The name of the invoice item category. |
created_at
The time the invoice item category was created. |
use_as_service
Indicates if the invoice item category is used as a service. |
use_as_expense
Indicates if the invoice item category is used as an expense. |
invoice_messages
Replication Method : |
Key-based Incremental |
Replication Key : |
updated_at |
Primary Key : |
id |
API endpoint : |
The invoice_messages
table contains info about invoice messages, or emails sent to clients about invoices.
id
The ID of the invoice message. |
updated_at
The time the invoice message was last updated. |
invoice_id
The ID of the invoice associated with the invoice message. |
send_me_a_copy
Indicates if a copy should be sent to the current user. |
body
The body of the invoice message. |
created_at
The time the invoice message was created. |
sent_by
The name of the user who created the invoice message. |
sent_by_email
The email address of the user who created the invoice message. |
thank_you
Indicates if this is a |
subject
The subject of the invoice message. |
include_pay_pal_link
Indicates if a PayPal link should be included with the invoice message. |
sent_from_email
The email address the invoice message was sent from. |
sent_from
The name of the user who sent the invoice message. |
send_reminder_on
The date that a reminder should be sent. |
full_recipient_list
The list of recipients who should receive the invoice message. |
invoice_payments
Replication Method : |
Key-based Incremental |
Replication Key : |
updated_at |
Primary Key : |
id |
API endpoint : |
The invoice_payments
table contains info about the payments applied to invoices in your Harvest account.
id
The invoice payment ID. |
updated_at
The last time the invoice payment was updated. |
invoice_id
The ID of the invoice associated with the payment. |
amount
The amount of the invoice payment. |
paid_at
The date the invoice payment was made. |
created_at
The time the invoice payment was created. |
notes
Any notes entered about the invoice payment. |
recorded_by
The name of the user who recorded the invoice payment. |
recorded_by_email
The email address of the user who recorded the payment. |
paypal_transaction_id
If paid via PayPal, this field will contain the PayPal transaction ID associated with the invoice payment. |
authorization
If applicable, this field will contain information about the authorization associated with the invoice payment. |
payment_gateway_id
If paid via the payment gateway, this field will contain the ID of the payment gateway used to make the invoice payment. |
invoices
Replication Method : |
Key-based Incremental |
Replication Key : |
updated_at |
Primary Key : |
id |
Official docs : |
The invoices
table contains info about the invoices in your Harvest account.
id
The invoice ID. |
updated_at
The last time the invoice was updated. |
client_id
The ID of the client associated with the invoice. |
client_name
The name of the client associated with the invoice. |
period_start
The start date of the period associated with the invoice. |
period_end
The end date of the period associated with the invoice. |
number
The invoice number. If no value is set, Harvest will automatically generate a value. |
issued_at
The date the invoice was issued. |
due_at
The date that payment of the invoice is due by. |
amount
The total amount of the invoice. |
currency
The currency denomination of the invoice. |
state
The state of the invoice. Possible values:
|
notes
Any notes entered about the invoice. |
purchase_order
If applicable, the purchase order associated with the invoice. |
due_amount
The due amount of the invoice. |
due_at_human_format
The human-readable format of the invoice due date. |
created_at
The time the invoice was created. |
tax
The tax percentage applied to the subtotal, including line items and discounts. |
tax_amount
The first amount of tax included, calculated from |
subject
The subject of the invoice. |
recurring_invoice_id
If a recurring invoice, this field will contain the ID of the recurring invoice. |
tax2
The tax percentage applied to the subtotal, including line items and discounts. |
tax2_amount
The amount calculated from |
client_key
A string used to build a URL to the public web invoice for the associated client. |
estimate_id
If applicable, the ID of the estimate associated with the invoice. |
discount
If applicable, the percentage to be subtracted from the subtotal. |
discount_amount
If applicable, the amount calculated from |
retainer_id
If applicable, the ID of the retainer associated with the invoice. |
created_by_id
The ID of the user who created the invoice. |
people
Replication Method : |
Key-based Incremental |
Replication Key : |
updated_at |
Primary Key : |
id |
API endpoint : |
The people
table contains info about the people - or users - in your Harvest account.
Note: These are internal users. Info about external users, or clients, is in the clients
table.
id
The ID of the Harvest user. |
updated_at
The last time the user was updated. |
email
The email address of the user. |
created_at
The time the user was created. |
is_admin
Indicates if the user is an Admin in your Harvest account. |
first_name
The first name of the user. |
last_name
The last name of the user. |
timezone
If the user doesn’t reside in the default timezone for your Harvest account, this field will contain their timezone. |
is_contractor
Indicates if the user is a contractor. |
telephone
The telephone number of the user. |
is_active
Indicates if the user is active or archived. |
has_access_to_all_future_projects
Indicates if the user will automatically be assigned to all new projects. |
default_hourly_rate
The default hourly rate of the user in new projects, if no rate is specified. |
department
The department the user is a part of. |
wants_newsletter
Indicates if the user should receive the newsletter. |
cost_rate
The cost (internal) rate of the user. |
identity_account_id
The identity account ID associated with the user. |
indentity_user_id
The identity user ID associated with the user. |
project_tasks
Replication Method : |
Key-based Incremental |
Replication Key : |
updated_at |
Primary Key : |
id |
API endpoint : |
The project_tasks
table contains info about the tasks assigned to projects.
id
The project task ID. |
updated_at
The last time the project task was updated. |
project_id
The ID of the project the task is associated with. |
task_id
The task ID. |
billable
Indicates if the task is billable. |
deactivated
Indicates if the project task has been deactivated. |
hourly_rate
The hourly rate of the project task. |
budget
The budget associated with the project task. |
created_at
The time the project task was created. |
estimate
The estimate associated with the project task. |
project_users
Replication Method : |
Key-based Incremental |
Replication Key : |
updated_at |
Primary Key : |
id |
API endpoint : |
The project_users
table contains info about the users assigned to projects.
id
The project user ID. |
updated_at
The last time the project user was updated. |
user_id
The user ID of the project user. This is a foreign key for the |
project_id
The ID of the project the user is assigned to. |
is_project_manager
Indicates if the project user is a project manager. |
deactivated
Indicates if the project user has been deactivated. |
hourly_rate
The hourly rate of the project user. |
budget
If applicable, the budget of the project user. |
created_at
The time the project user was created. |
estimate
If applicable, the estimate associated with the project user. |
projects
Replication Method : |
Key-based Incremental |
Replication Key : |
updated_at |
Primary Key : |
id |
API endpoint : |
The projects
table contains info about the projects in your Harvest account.
id
The project ID. |
updated_at
The time the project was last updated. |
client_id
The ID of the client associated with the project. |
name
The name of the project. |
code
The code applied to the project. |
active
Indicates if the project is active or archived. |
billable
Indicates if the project is billable. |
bill_by
The method by which the project is invoiced. Possible values:
|
hourly_rate
If billed by Project Hourly rate, this is the hourly rate the project will be billed at. |
budget
The budget for the project. |
budget_by
The method by which the project is budgeted. Possible values:
|
notify_when_over_budget
Indicates if notification emails should be sent when a project reaches the budget threshold set in |
over_budget_notification_percetange
The percentage value to trigger over budget email alerts. |
over_budget_notified_at
The date of the last over budget notification. This will be |
show_budget_to_all
Indicates if the project budget should be shown to all employees. Note: This doesn’t apply to Total Fee Projects, or projects that have a |
created_at
The time the project was created. |
starts_on
The start date of the project. |
ends_on
The end date of the project. |
estimate
The estimate for the project. |
estimate_by
The method by which the project is estimated. |
hint_earliest_record_at
The date of the earliest record for the project. |
hint_latest_record_at
The date of the most recent record for the project. |
notes
Any notes entered about the project. |
cost_budget
The budget value for Total Project Fees projects, or projects that have a |
cost_budget_include_expenses
Indicates if the budgets of Total Project Fees projects should include tracked expenses. |
Replication Method : |
Key-based Incremental |
Replication Key : |
updated_at |
Primary Key : |
id |
API endpoint : |
The tasks
table contains info about the tasks in your Harvest account.
id
The task ID. |
updated_at
The time the task was last updated. |
name
The name of the task. |
billable_by_default
Indicates whether default tasks should be marked as billable when creating a new project. |
created_at
The time the task was created. |
is_default
Indicates if the task should be automatically added to new projects. |
default_hourly_rate
The hourly rate to use for the task when it is added to a project. |
deactivated
Indicates if the task is active or archived. |
time_entries
Replication Method : |
Key-based Incremental |
Replication Key : |
updated_at |
Primary Key : |
id |
Official docs : |
The time_entries
table contains info about the time entries in your Harvest account.
id
The time entry ID. |
updated_at
The time the time entry was last updated. |
notes
Notes entered about the time entry. |
spent_at
The date of the time entry. |
hours
The number of hours tracked in the time entry. |
user_id
The ID of the user associated with the time entry. |
project_id
The ID of the project associated with the time entry. |
task_id
The ID of the task associated with the time entry. |
created_at
The time the time entry was created. |
adjustment_record
Indicates if there is an adjustment record associated with the time entry. |
timer_started_at
The date and time the timer was started, if tracked by duration. |
is_closed
The time the time entry was ended, if tracking by start/end times. |
is_billed
Indicates if the time entry has been marked as invoiced. |
hours_with_timer
If a timer is running, this will contain the currently tracked value. |
Related | Troubleshooting |
Questions? Feedback?
Did this article help? If you have questions or feedback, feel free to submit a pull request with your suggestions, open an issue on GitHub, or reach out to us.