# Harvest Forecast

Harvest Forecast is a web-based project management and resource scheduling tool that helps teams plan, track, and allocate their people and time efficiently across multiple projects.

Harvest Forecast integration replicates data using the [Harvest Forecast Experimental API](https://help.getharvest.com/forecast/faqs/faq-list/api/).

See the [Schema](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#Schema) section for a list of objects available for replication.

## Preparing for authentication

To access your data, you need to authenticate the connection with your account credentials.

Information noteMake sure that the account you use has read access to the tables you want to fetch.

You must have administrative privileges to create an OAuth2 App in your Harvest account.

To create your client ID and secret:

1. Log into your [Harvest](https://id.getharvest.com/sessions/new?go_back=%2Faccounts) account.
2. Go to the Developers tab.
3. In the new OAuth2 application section, specify the following requirements:
   * Name: Enter a name.
   * Redirect URL: Set it to https://connector.qlik.com/auth/oauth/v3.htm.
   * Access: Select the account from which you want to replicate data.
   * Products: Select the Harvest and Forecast products.
4. Click Create application.
5. Copy and paste your client ID and secret into a secured file.

To retrieve your account ID:

1. Log into your [Harvest](https://id.getharvest.com/sessions/new?go_back=%2Faccounts) account.
2. Go to the Developers tab.
3. Click Create new personal access token.
4. Enter a name for the token.
5. Copy and paste your account ID into a secured file.

## Creating the connection

For more information, see [Connecting to SaaS applications](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/Landing/connecting-web-applications.htm).

1. Click Authenticate when you have filled in the required connection settings.

   You may be asked to log in to the source application.

   A window is displayed with an authentication code.

2. Copy the code to the clipboard and return to the connection dialog.

3. Paste the code in Complete authentication with the code provided by the source and click Verify.

   Tip noteYou may need to scroll down to see this field.

   When status is Verified, the authentication is verified.

4. Provide a name for the connection in Connection name.

5. Select Open connection metadata to define metadata for the connection when it has been created.

Connection settings

| Setting | Description |
| --- | --- |
| Data gateway | Select a Data Movement gateway if required by your use case.<br><br>Information note<br><br>This field is not available with the Qlik Talend Cloud Starter subscription, as it does not support Data Movement gateway. If you have another subscription tier and do not want to use Data Movement gateway, select None.<br><br>For information on the benefits of Data Movement gateway and use cases that require it, see [Qlik Data Gateway - Data Movement](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/Gateways/replication-gateway.htm). |
| Start Date | Enter the date, in the format `MM/DD/YYYY`, from which the data must be replicated from your source to your target. |
| Account ID | Account ID. |
| Client ID | Client ID. |
| Client Secret | Client secret. |

## Schema

Information note

Schemas and naming conventions can change from version to version. It is recommended to verify your version before continuing.

Depending on your destination, table and column names may not appear as they are outlined below.

### assignments

The `assignments` table contains info about the assignments assigned to the people in your Harvest Forecast account.

| **Replication Method** | Full Table |
| --- | --- |
| **Primary Key** | id |
| **Useful links** | Harvest Forecast documentation |

assignments table foreign keys

| Join assignments with | on |
| --- | --- |
| [clients](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#clients) | ```<br>assignments.person_id = clients.updated_by_id<br>```<br><br>```<br>assignments.updated_by_id = clients.updated_by_id<br>``` |
| [milestones](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#milestones) | ```<br>assignments.person_id = milestones.updated_by_id<br>```<br><br>```<br>assignments.updated_by_id = milestones.updated_by_id<br>```<br><br>```<br>assignments.project_id = milestones.project_id<br>``` |
| [people](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#people) | ```<br>assignments.person_id = people.id<br>```<br><br>```<br>assignments.updated_by_id = people.id<br>```<br><br>```<br>assignments.person_id = people.updated_by_id<br>```<br><br>```<br>assignments.updated_by_id = people.updated_by_id<br>``` |
| [projects](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#projects) | ```<br>assignments.person_id = projects.updated_by_id<br>```<br><br>```<br>assignments.updated_by_id = projects.updated_by_id<br>```<br><br>```<br>assignments.project_id = projects.id<br>``` |
| [placeholders](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#placeholders) | ```<br>assignments.person_id = placeholders.updated_by_id<br>```<br><br>```<br>assignments.updated_by_id = placeholders.updated_by_id<br>```<br><br>```<br>assignments.placeholder_id = placeholders.id<br>``` |
| [roles](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#roles) | ```<br>assignments.person_id = roles.updated_by_id<br>```<br><br>```<br>assignments.updated_by_id = roles.updated_by_id<br>```<br><br>```<br>assignments.placeholder_id = roles.placeholder_ids<br>``` |

assignments table schema

| **active\_on\_days\_off**<br><br><br>BOOLEAN |
| --- |
| **allocation**<br><br><br>INTEGER |
| **end\_date**<br><br><br>DATE-TIME |
| **id**<br><br><br>INTEGER |
| **notes**<br><br><br>STRING |
| **person\_id**<br><br><br>INTEGER |
| **placeholder\_id**<br><br><br>INTEGER |
| **project\_id**<br><br><br>INTEGER |
| **repeated\_assignment\_set\_id**<br><br><br>INTEGER |
| **start\_date**<br><br><br>DATE-TIME |
| **updated\_at**<br><br><br>DATE-TIME |
| **updated\_by\_id**<br><br><br>INTEGER |

### clients

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

| **Replication Method** | CDC |
| --- | --- |
| **Primary Key** | id |
| **Replication Key** | updated\_at |
| **Useful links** | Harvest Forecast documentation |

clients table foreign keys

| Join clients with | on |
| --- | --- |
| [projects](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#projects) | ```<br>clients.id = projects.client_id<br>```<br><br>```<br>clients.updated_by_id = projects.updated_by_id<br>``` |
| [assignments](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#assignments) | ```<br>clients.updated_by_id = assignments.person_id<br>```<br><br>```<br>clients.updated_by_id = assignments.updated_by_id<br>``` |
| [milestones](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#milestones) | ```<br>clients.updated_by_id = milestones.updated_by_id<br>``` |
| [people](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#people) | ```<br>clients.updated_by_id = people.id<br>```<br><br>```<br>clients.updated_by_id = people.updated_by_id<br>``` |
| [placeholders](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#placeholders) | ```<br>clients.updated_by_id = placeholders.updated_by_id<br>``` |
| [roles](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#roles) | ```<br>clients.updated_by_id = roles.updated_by_id<br>``` |

clients table schema

| **archived**<br><br><br>BOOLEAN |
| --- |
| **harvest\_id**<br><br><br>INTEGER |
| **id**<br><br><br>INTEGER |
| **name**<br><br><br>STRING |
| **updated\_at**<br><br><br>DATE-TIME |
| **updated\_by\_id**<br><br><br>INTEGER |

### milestones

The `milestones` table contains info about the project milestones in your Harvest Forecast account.

| **Replication Method** | CDC |
| --- | --- |
| **Primary Key** | id |
| **Replication Key** | updated\_at |
| **Useful links** | Harvest Forecast documentation |

milestones table foreign keys

| Join milestones with | on |
| --- | --- |
| [assignments](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#assignments) | ```<br>milestones.updated_by_id = assignments.person_id<br>```<br><br>```<br>milestones.updated_by_id = assignments.updated_by_id<br>```<br><br>```<br>milestones.project_id = assignments.project_id<br>``` |
| [clients](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#clients) | ```<br>milestones.updated_by_id = clients.updated_by_id<br>``` |
| [people](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#people) | ```<br>milestones.updated_by_id = people.id<br>```<br><br>```<br>milestones.updated_by_id = people.updated_by_id<br>``` |
| [projects](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#projects) | ```<br>milestones.updated_by_id = projects.updated_by_id<br>```<br><br>```<br>milestones.project_id = projects.id<br>``` |
| [placeholders](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#placeholders) | ```<br>milestones.updated_by_id = placeholders.updated_by_id<br>``` |
| [roles](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#roles) | ```<br>milestones.updated_by_id = roles.updated_by_id<br>``` |

milestones table schema

| **date**<br><br><br>DATE-TIME |
| --- |
| **id**<br><br><br>INTEGER |
| **name**<br><br><br>STRING |
| **project\_id**<br><br><br>INTEGER |
| **updated\_at**<br><br><br>DATE-TIME |
| **updated\_by\_id**<br><br><br>INTEGER |

### people

The `people` table contains info about the people in your Harvest Forecast account.

| **Replication Method** | CDC |
| --- | --- |
| **Primary Key** | id |
| **Replication Key** | updated\_at |
| **Useful links** | Harvest Forecast documentation |

people table foreign keys

| Join people with | on |
| --- | --- |
| [assignments](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#assignments) | ```<br>people.id = assignments.person_id<br>```<br><br>```<br>people.updated_by_id = assignments.person_id<br>```<br><br>```<br>people.id = assignments.updated_by_id<br>```<br><br>```<br>people.updated_by_id = assignments.updated_by_id<br>``` |
| [clients](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#clients) | ```<br>people.id = clients.updated_by_id<br>```<br><br>```<br>people.updated_by_id = clients.updated_by_id<br>``` |
| [milestones](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#milestones) | ```<br>people.id = milestones.updated_by_id<br>```<br><br>```<br>people.updated_by_id = milestones.updated_by_id<br>``` |
| [projects](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#projects) | ```<br>people.id = projects.updated_by_id<br>```<br><br>```<br>people.updated_by_id = projects.updated_by_id<br>``` |
| [placeholders](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#placeholders) | ```<br>people.id = placeholders.updated_by_id<br>```<br><br>```<br>people.updated_by_id = placeholders.updated_by_id<br>```<br><br>```<br>people.roles = placeholders.roles<br>``` |
| [roles](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#roles) | ```<br>people.id = roles.updated_by_id<br>```<br><br>```<br>people.updated_by_id = roles.updated_by_id<br>```<br><br>```<br>people.roles = roles.id<br>``` |

people table schema

| **admin**<br><br><br>BOOLEAN |
| --- |
| **archived**<br><br><br>BOOLEAN |
| **avatar\_url**<br><br><br>STRING |
| **color\_blind**<br><br><br>STRING |
| **email**<br><br><br>STRING |
| **first\_name**<br><br><br>STRING |
| **harvest\_user\_id**<br><br><br>INTEGER |
| **id**<br><br><br>INTEGER |
| **last\_name**<br><br><br>STRING |
| **login**<br><br><br>STRING |
| **personal\_feed\_token\_id**<br><br><br>INTEGER |
| **roles**<br><br><br>ARRAY<br><br>This is a nested data structure. |
| **subscribed**<br><br><br>BOOLEAN |
| **updated\_at**<br><br><br>DATE-TIME |
| **updated\_by\_id**<br><br><br>STRING |
| **weekly\_capacity**<br><br><br>INTEGER |
| **working\_days**<br><br><br>OBJECT<br><br>This is a nested data structure:<br><br><ul><li>friday: BOOLEAN</li><li>monday: BOOLEAN</li><li>saturday: BOOLEAN</li><li>sunday: BOOLEAN</li><li>thursday: BOOLEAN</li><li>tuesday: BOOLEAN</li><li>wednesday: BOOLEAN</li></ul> |

### placeholders

The `placeholders` table contains info about the placeholders in your Harvest Forecast account.

| **Replication Method** | CDC |
| --- | --- |
| **Primary Key** | id |
| **Replication Key** | updated\_at |

placeholders table foreign keys

| Join placeholders with | on |
| --- | --- |
| [assignments](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#assignments) | ```<br>placeholders.updated_by_id = assignments.person_id<br>```<br><br>```<br>placeholders.updated_by_id = assignments.updated_by_id<br>```<br><br>```<br>placeholders.id = assignments.placeholder_id<br>``` |
| [clients](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#clients) | ```<br>placeholders.updated_by_id = clients.updated_by_id<br>``` |
| [milestones](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#milestones) | ```<br>placeholders.updated_by_id = milestones.updated_by_id<br>``` |
| [people](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#people) | ```<br>placeholders.updated_by_id = people.id<br>```<br><br>```<br>placeholders.updated_by_id = people.updated_by_id<br>```<br><br>```<br>placeholders.roles = people.roles<br>``` |
| [projects](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#projects) | ```<br>placeholders.updated_by_id = projects.updated_by_id<br>``` |
| [roles](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#roles) | ```<br>placeholders.updated_by_id = roles.updated_by_id<br>```<br><br>```<br>placeholders.id = roles.placeholder_ids<br>```<br><br>```<br>placeholders.roles = roles.id<br>``` |

placeholders table schema

| **archived**<br><br><br>BOOLEAN |
| --- |
| **id**<br><br><br>INTEGER |
| **name**<br><br><br>STRING |
| **roles**<br><br><br>ARRAY<br><br>This is a nested data structure. |
| **updated\_at**<br><br><br>DATE-TIME |
| **updated\_by\_id**<br><br><br>INTEGER |

### projects

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

| **Replication Method** | CDC |
| --- | --- |
| **Primary Key** | id |
| **Replication Key** | updated\_at |
| **Useful links** | Harvest Forecast documentation |

projects table foreign keys

| Join projects with | on |
| --- | --- |
| [clients](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#clients) | ```<br>projects.client_id = clients.id<br>```<br><br>```<br>projects.updated_by_id = clients.updated_by_id<br>``` |
| [assignments](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#assignments) | ```<br>projects.updated_by_id = assignments.person_id<br>```<br><br>```<br>projects.updated_by_id = assignments.updated_by_id<br>```<br><br>```<br>projects.id = assignments.project_id<br>``` |
| [milestones](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#milestones) | ```<br>projects.updated_by_id = milestones.updated_by_id<br>```<br><br>```<br>projects.id = milestones.project_id<br>``` |
| [people](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#people) | ```<br>projects.updated_by_id = people.id<br>```<br><br>```<br>projects.updated_by_id = people.updated_by_id<br>``` |
| [placeholders](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#placeholders) | ```<br>projects.updated_by_id = placeholders.updated_by_id<br>``` |
| [roles](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#roles) | ```<br>projects.updated_by_id = roles.updated_by_id<br>``` |

projects table schema

| **archived**<br><br><br>BOOLEAN |
| --- |
| **client\_id**<br><br><br>INTEGER |
| **code**<br><br><br>STRING |
| **color**<br><br><br>STRING |
| **end\_date**<br><br><br>DATE-TIME |
| **harvest\_id**<br><br><br>INTEGER |
| **id**<br><br><br>INTEGER |
| **name**<br><br><br>STRING |
| **notes**<br><br><br>STRING |
| **start\_date**<br><br><br>DATE-TIME |
| **tags**<br><br><br>ARRAY<br><br>This is a nested data structure. |
| **updated\_at**<br><br><br>DATE-TIME |
| **updated\_by\_id**<br><br><br>INTEGER |

### roles

The `roles` table contains info about the roles in your Harvest Forecast account.

| **Replication Method** | Full Table |
| --- | --- |
| **Primary Key** | id |

roles table foreign keys

| Join roles with | on |
| --- | --- |
| [assignments](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#assignments) | ```<br>roles.updated_by_id = assignments.person_id<br>```<br><br>```<br>roles.updated_by_id = assignments.updated_by_id<br>```<br><br>```<br>roles.placeholder_ids = assignments.placeholder_id<br>``` |
| [clients](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#clients) | ```<br>roles.updated_by_id = clients.updated_by_id<br>``` |
| [milestones](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#milestones) | ```<br>roles.updated_by_id = milestones.updated_by_id<br>``` |
| [people](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#people) | ```<br>roles.updated_by_id = people.id<br>```<br><br>```<br>roles.updated_by_id = people.updated_by_id<br>```<br><br>```<br>roles.id = people.roles<br>``` |
| [projects](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#projects) | ```<br>roles.updated_by_id = projects.updated_by_id<br>``` |
| [placeholders](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/WebApplications/Connecting-Harvest-Forecast.htm#placeholders) | ```<br>roles.updated_by_id = placeholders.updated_by_id<br>```<br><br>```<br>roles.placeholder_ids = placeholders.id<br>```<br><br>```<br>roles.id = placeholders.roles<br>``` |

roles table schema

| **harvest\_role\_id**<br><br><br>INTEGER |
| --- |
| **id**<br><br><br>INTEGER |
| **name**<br><br><br>STRING |
| **person\_ids**<br><br><br>ARRAY<br><br>This is a nested data structure. |
| **placeholder\_ids**<br><br><br>ARRAY<br><br>This is a nested data structure. |
| **updated\_at**<br><br><br>DATE-TIME |
| **updated\_by\_id**<br><br><br>INTEGER |