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

Singer Community

Stitch Plan

Free

Singer GitHub Repository

Harvest 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

  1. Sign into your Stitch account.
  2. On the Stitch Dashboard page, click the Add Integration button.

  3. Click the Harvest icon.

  4. 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.

  5. Enter your Harvest account name in the Account Name field. For example: if your Harvest account URL is stitch.harvestapp.com, you’d enter stitch 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.

  1. Enter your Harvest credentials and click Create Integration.
  2. A screen asking for authorization to Harvest will display. Note that Stitch will only ever read your data.
  3. Click Connect.
  4. After the authorization process successfully completes, you’ll be redirected back to Stitch.
  5. 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.

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

Replication Method :

Key-based Incremental

Replication Key :

updated_at

Primary Key :

id

API endpoint :

getAllClients

The clients table contains info about the clients in your Harvest account.

id
INTEGER

The client ID.

updated_at
DATE-TIME

The last time the client was updated.

name
STRING

The client’s name. Ex: Stitch Data

active
BOOLEAN

Indicates if the client is active or archived.

currency
STRING

The currency denomination used by the client.

highrise_id
BOOLEAN

The optional Highrise ID for the client, if using Harvest’s legacy integration.

cache_version
INTEGER

The cache version for the client.

created_at
DATE-TIME

The time the client was updated.

currency_symbol
STRING

The symbol associated with the client’s selected currency denomination.

details
STRING

Additional details about the client, usually address information.

default_invoice_timeframe
STRING

The default invoice timeframe for the client.

last_invoice_kind
STRING

The type of the last invoice.


Replication Method :

Key-based Incremental

Replication Key :

updated_at

Primary Key :

id

API endpoint :

getAllContacts

The contacts table contains info about the client contacts in your Harvest account.

id
INTEGER

The contact ID.

updated_at
DATE-TIME

The last time the contact was updated.

client_id
INTEGER

The ID of the client the contact is a part of.

first_name
STRING

The contact’s first name.

last_name
STRING

The contact’s last name.

email
STRING

The email address for the contact.

phone_office
STRING

The phone number for the contact.

phone_mobile
STRING

The mobile phone for the contact.

fax
STRING

The fax number for the contact.

title
STRING

The contact’s title. Ex: Mrs

created_at
DATE-TIME

The time the contact was created.


expense_categories

Replication Method :

Key-based Incremental

Replication Key :

updated_at

Primary Key :

id

API endpoint :

showAllCategories

The expense_categories table contains info about the expense categories in your Harvest account.

id
INTEGER

The expense category ID.

updated_at
DATE-TIME

The last time the expense category was updated.

name
STRING

The name of the expense category.

unit_name
STRING

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
NUMBER

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
DATE-TIME

The time the expense category was created.

deactivated
BOOLEAN

Indicates if the expense category has been deactivated.


Replication Method :

Key-based Incremental

Replication Key :

updated_at

Primary Key :

id

API endpoint :

showAnExpense

The expenses table contains info about the expenses recorded in your Harvest account.

id
INTEGER

The expense ID.

updated_at
DATE-TIME

The last time the expense was updated.

total_cost
NUMBER

The total cost of the expense.

units
NUMBER

The number of units contained in the expense, if calculated by unit price. Ex: 40 (miles)

created_at
DATE-TIME

The time the expense was created.

project_id
INTEGER

The ID of the project associated with the expense.

expense_category_id
INTEGER

The ID of the expense category associated with the expense.

user_id
INTEGER

The ID of the user associated with the expense.

spent_at
STRING

The date when the expense was entered.

is_closed
BOOLEAN

Indicates if the expense has been closed.

notes
STRING

Expense entry notes.

invoice_id
INTEGER

The ID of the invoice associated with the expense. Note: only billable expenses can be invoiced.

billable
BOOLEAN

Indicates if the expense is billable.

company_id
INTEGER

The ID of the company associated with the expense.

has_receipt
BOOLEAN

Indicates if the expense has a receipt.

receipt_url
STRING

If has_receipt is true, this field will contain the URL of the receipt.

is_locked
BOOLEAN

Indicates if the expense has been locked.

locked_reason
STRING

If is_locked is true, this field will contain the reason the expense has been locked.


invoice_item_categories

Replication Method :

Key-based Incremental

Replication Key :

updated_at

Primary Key :

id

API endpoint :

showAllCategories

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
INTEGER

The ID of the invoice item category.

updated_at
DATE-TIME

The last time the invoice item category was updated.

name
STRING

The name of the invoice item category.

created_at
DATE-TIME

The time the invoice item category was created.

use_as_service
BOOLEAN

Indicates if the invoice item category is used as a service.

use_as_expense
BOOLEAN

Indicates if the invoice item category is used as an expense.


Replication Method :

Key-based Incremental

Replication Key :

updated_at

Primary Key :

id

API endpoint :

showInvoiceMessages

The invoice_messages table contains info about invoice messages, or emails sent to clients about invoices.

id
INTEGER

The ID of the invoice message.

updated_at
DATE-TIME

The time the invoice message was last updated.

invoice_id
INTEGER

The ID of the invoice associated with the invoice message.

send_me_a_copy
BOOLEAN

Indicates if a copy should be sent to the current user.

body
STRING

The body of the invoice message.

created_at
DATE-TIME

The time the invoice message was created.

sent_by
STRING

The name of the user who created the invoice message.

sent_by_email
STRING

The email address of the user who created the invoice message.

thank_you
BOOLEAN

Indicates if this is a thank you message.

subject
STRING

The subject of the invoice message.

include_pay_pal_link
BOOLEAN

Indicates if a PayPal link should be included with the invoice message.

sent_from_email
STRING

The email address the invoice message was sent from.

sent_from
STRING

The name of the user who sent the invoice message.

send_reminder_on
DATE-TIME

The date that a reminder should be sent.

full_recipient_list
STRING

The list of recipients who should receive the invoice message.


Replication Method :

Key-based Incremental

Replication Key :

updated_at

Primary Key :

id

API endpoint :

showPaymentsForAnInvoice

The invoice_payments table contains info about the payments applied to invoices in your Harvest account.

id
INTEGER

The invoice payment ID.

updated_at
DATE-TIME

The last time the invoice payment was updated.

invoice_id
INTEGER

The ID of the invoice associated with the payment.

amount
NUMBER

The amount of the invoice payment.

paid_at
DATE-TIME

The date the invoice payment was made.

created_at
DATE-TIME

The time the invoice payment was created.

notes
STRING

Any notes entered about the invoice payment.

recorded_by
STRING

The name of the user who recorded the invoice payment.

recorded_by_email
STRING

The email address of the user who recorded the payment.

paypal_transaction_id
INTEGER

If paid via PayPal, this field will contain the PayPal transaction ID associated with the invoice payment.

authorization
STRING

If applicable, this field will contain information about the authorization associated with the invoice payment.

payment_gateway_id
INTEGER

If paid via the payment gateway, this field will contain the ID of the payment gateway used to make the invoice payment.


Replication Method :

Key-based Incremental

Replication Key :

updated_at

Primary Key :

id

Official docs :

Official Docs

The invoices table contains info about the invoices in your Harvest account.

id
INTEGER

The invoice ID.

updated_at
DATE-TIME

The last time the invoice was updated.

client_id
INTEGER

The ID of the client associated with the invoice.

client_name
STRING

The name of the client associated with the invoice.

period_start
STRING

The start date of the period associated with the invoice.

period_end
STRING

The end date of the period associated with the invoice.

number
STRING

The invoice number. If no value is set, Harvest will automatically generate a value.

issued_at
STRING

The date the invoice was issued.

due_at
STRING

The date that payment of the invoice is due by.

amount
NUMBER

The total amount of the invoice.

currency
STRING

The currency denomination of the invoice.

state
STRING

The state of the invoice. Possible values:

  • open - May apply for unpaid, sent invoices (either current or past due)
  • partial - Applicable to invoices with partial payments
  • draft
  • paid - Applicable to invoices paid in full
  • unpaid
  • pastdue
  • closed - Applicable to written off invoices

notes
STRING

Any notes entered about the invoice.

purchase_order
STRING

If applicable, the purchase order associated with the invoice.

due_amount
NUMBER

The due amount of the invoice.

due_at_human_format
STRING

The human-readable format of the invoice due date.

created_at
DATE-TIME

The time the invoice was created.

tax
STRING, NUMBER

The tax percentage applied to the subtotal, including line items and discounts.

tax_amount
NUMBER

The first amount of tax included, calculated from tax. If tax is undefined, this value will be null.

subject
STRING

The subject of the invoice.

recurring_invoice_id
INTEGER

If a recurring invoice, this field will contain the ID of the recurring invoice.

tax2
STRING, NUMBER

The tax percentage applied to the subtotal, including line items and discounts.

tax2_amount
NUMBER

The amount calculated from tax2.

client_key
STRING

A string used to build a URL to the public web invoice for the associated client.

estimate_id
INTEGER

If applicable, the ID of the estimate associated with the invoice.

discount
STRING, NUMBER

If applicable, the percentage to be subtracted from the subtotal.

discount_amount
NUMBER

If applicable, the amount calculated from discount.

retainer_id
INTEGER

If applicable, the ID of the retainer associated with the invoice.

created_by_id
INTEGER

The ID of the user who created the invoice.


Replication Method :

Key-based Incremental

Replication Key :

updated_at

Primary Key :

id

API endpoint :

showAllUsers

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
INTEGER

The ID of the Harvest user.

updated_at
DATE-TIME

The last time the user was updated.

email
STRING

The email address of the user.

created_at
DATE-TIME

The time the user was created.

is_admin
BOOLEAN

Indicates if the user is an Admin in your Harvest account.

first_name
STRING

The first name of the user.

last_name
STRING

The last name of the user.

timezone
STRING

If the user doesn’t reside in the default timezone for your Harvest account, this field will contain their timezone.

is_contractor
BOOLEAN

Indicates if the user is a contractor.

telephone
STRING

The telephone number of the user.

is_active
BOOLEAN

Indicates if the user is active or archived.

has_access_to_all_future_projects
BOOLEAN

Indicates if the user will automatically be assigned to all new projects.

default_hourly_rate
NUMBER

The default hourly rate of the user in new projects, if no rate is specified.

department
STRING

The department the user is a part of.

wants_newsletter
BOOLEAN

Indicates if the user should receive the newsletter.

cost_rate
NUMBER

The cost (internal) rate of the user.

identity_account_id
INTEGER

The identity account ID associated with the user.

indentity_user_id
INTEGER

The identity user ID associated with the user.


Replication Method :

Key-based Incremental

Replication Key :

updated_at

Primary Key :

id

API endpoint :

allAssignedTasksToProject

The project_tasks table contains info about the tasks assigned to projects.

id
INTEGER

The project task ID.

updated_at
DATE-TIME

The last time the project task was updated.

project_id
INTEGER

The ID of the project the task is associated with.

task_id
INTEGER

The task ID.

billable
BOOLEAN

Indicates if the task is billable.

deactivated
BOOLEAN

Indicates if the project task has been deactivated.

hourly_rate
NUMBER

The hourly rate of the project task.

budget
NUMBER

The budget associated with the project task.

created_at
DATE-TIME

The time the project task was created.

estimate
NUMBER

The estimate associated with the project task.


Replication Method :

Key-based Incremental

Replication Key :

updated_at

Primary Key :

id

API endpoint :

getUsersAssignedToProjects

The project_users table contains info about the users assigned to projects.

id
INTEGER

The project user ID.

updated_at
DATE-TIME

The last time the project user was updated.

user_id
INTEGER

The user ID of the project user.

This is a foreign key for the people table (people.id) and can be used to retrieve other information about the user.

project_id
INTEGER

The ID of the project the user is assigned to.

is_project_manager
BOOLEAN

Indicates if the project user is a project manager.

deactivated
BOOLEAN

Indicates if the project user has been deactivated.

hourly_rate
NUMBER

The hourly rate of the project user.

budget
NUMBER

If applicable, the budget of the project user.

created_at
DATE-TIME

The time the project user was created.

estimate
NUMBER

If applicable, the estimate associated with the project user.


Replication Method :

Key-based Incremental

Replication Key :

updated_at

Primary Key :

id

API endpoint :

showAllProjects

The projects table contains info about the projects in your Harvest account.

id
INTEGER

The project ID.

updated_at
DATE-TIME

The time the project was last updated.

client_id
INTEGER

The ID of the client associated with the project.

name
STRING

The name of the project.

code
STRING

The code applied to the project.

active
BOOLEAN

Indicates if the project is active or archived.

billable
BOOLEAN

Indicates if the project is billable.

bill_by
STRING

The method by which the project is invoiced. Possible values:

  • Project
  • Tasks
  • People
  • None

hourly_rate
NUMBER

If billed by Project Hourly rate, this is the hourly rate the project will be billed at.

budget
NUMBER

The budget for the project.

budget_by
STRING

The method by which the project is budgeted. Possible values:

  • Project - hours per project
  • Project_Cost - total project fees
  • Task - hours per task
  • Person - hours per person
  • None - no budget

notify_when_over_budget
BOOLEAN

Indicates if notification emails should be sent when a project reaches the budget threshold set in over_budget_notification_percentage.

over_budget_notification_percetange
INTEGER

The percentage value to trigger over budget email alerts.

over_budget_notified_at
STRING

The date of the last over budget notification. This will be nil if no notifications have been sent.

show_budget_to_all
BOOLEAN

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 budget_by value of Project_Cost.

created_at
DATE-TIME

The time the project was created.

starts_on
STRING

The start date of the project.

ends_on
STRING

The end date of the project.

estimate
NUMBER

The estimate for the project.

estimate_by
STRING

The method by which the project is estimated.

hint_earliest_record_at
STRING

The date of the earliest record for the project.

hint_latest_record_at
STRING

The date of the most recent record for the project.

notes
STRING

Any notes entered about the project.

cost_budget
NUMBER

The budget value for Total Project Fees projects, or projects that have a budget_by value of Project_Cost.

cost_budget_include_expenses
BOOLEAN

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 :

showAllTasks

The tasks table contains info about the tasks in your Harvest account.

id
INTEGER

The task ID.

updated_at
DATE-TIME

The time the task was last updated.

name
STRING

The name of the task.

billable_by_default
BOOLEAN

Indicates whether default tasks should be marked as billable when creating a new project.

created_at
DATE-TIME

The time the task was created.

is_default
BOOLEAN

Indicates if the task should be automatically added to new projects.

default_hourly_rate
NUMBER

The hourly rate to use for the task when it is added to a project.

deactivated
BOOLEAN

Indicates if the task is active or archived.


Replication Method :

Key-based Incremental

Replication Key :

updated_at

Primary Key :

id

Official docs :

Official Docs

The time_entries table contains info about the time entries in your Harvest account.

id
INTEGER

The time entry ID.

updated_at
DATE-TIME

The time the time entry was last updated.

notes
STRING

Notes entered about the time entry.

spent_at
STRING

The date of the time entry.

hours
NUMBER

The number of hours tracked in the time entry.

user_id
INTEGER

The ID of the user associated with the time entry.

project_id
INTEGER

The ID of the project associated with the time entry.

task_id
INTEGER

The ID of the task associated with the time entry.

created_at
DATE-TIME

The time the time entry was created.

adjustment_record
BOOLEAN

Indicates if there is an adjustment record associated with the time entry.

timer_started_at
DATE-TIME

The date and time the timer was started, if tracked by duration.

is_closed
BOOLEAN

The time the time entry was ended, if tracking by start/end times.

is_billed
BOOLEAN

Indicates if the time entry has been marked as invoiced.

hours_with_timer
NUMBER

If a timer is running, this will contain the currently tracked value.



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.