Clockify
Productivity
Clockify data, published as Clockify publishes it. Ingest delivers this data to a data warehouse you own as 19 tables, and updates it on the schedule you choose. There is no code to write and nothing to install.
What you get
| Table | Each row is |
|---|---|
workspacesworkspaces | Every workspace the key can see, with its settings, features, currencies, rates and memberships. This is the connector's anchor: every other resource is read from these workspaces, so no workspace id is pasted in anywhere. |
workspaces_clientsworkspaces_clients | Clients of each workspace, archived ones included, with their contact email, cc addresses, address, note and currency, as a transformer child of `workspaces`. |
workspaces_custom_fieldsworkspaces_custom_fields | Custom fields defined on each workspace whose plan has custom fields (CUSTOM_FIELDS), for time entries or for users: name, type, allowed values, default value, whether it is required or only an admin can edit it, and its status. Per-project defaults land in `workspaces_custom_fields__project_default_values`. Values themselves are on the time entries (`customFieldValues`), the users (`customFields`) and the projects (`workspaces_projects__custom_fields`). |
workspaces_expense_categoriesworkspaces_expense_categories | Expense categories of each workspace whose plan has expenses (EXPENSES), archived ones included: name, unit and unit price. |
workspaces_expensesworkspaces_expenses | Every member's expenses in each workspace whose plan has expenses (EXPENSES), from Clockify's expense report over 2000 to 2099: date, amount, quantity, category, project, task, member, billable and locked flags, approval state, receipt file link and invoicing state. Keyed on the report's `_id`, the expense's id. Every run reads the whole range again, so an edited expense is corrected; one deleted in Clockify is not removed. |
workspaces_holidaysworkspaces_holidays | Holidays of each workspace whose plan has time off (TIME_OFF): name, date period, whether it recurs every year, and who it applies to (everyone, or listed users and user groups). |
workspaces_invoice_paymentsworkspaces_invoice_payments | Payments recorded against each invoice: amount, date, note and author, as a transformer child of `workspaces_invoices`. A payment record does not name its invoice, so `_ingest_parent_key` holds the workspace and invoice ids as a JSON array, `["<workspace id>","<invoice id>"]`. |
workspaces_invoicesworkspaces_invoices | Invoices of each workspace whose plan has invoicing (INVOICING), in every status: number, client, currency, amount, balance, amount paid, issue and due dates, and status. The workspace is `_ingest_parent_key`. |
workspaces_projectsworkspaces_projects | Projects of each workspace, archived ones included, with their client, colour, billable and archived flags, estimates and budget, public and template flags, note and per-member rates, as a transformer child of `workspaces`. Each project's tasks land in `workspaces_projects__tasks` (status, assignees, user groups, estimate, linked duration, billable flag and rates; done tasks included), and its custom field values, on a plan with custom fields, in `workspaces_projects__custom_fields`. `expenses` holds at most the project's latest 20 expenses, as Clockify serves them here; the full list is `workspaces_expenses`. |
workspaces_scheduling_assignmentsworkspaces_scheduling_assignments | Scheduled assignments of each workspace whose plan has scheduling (SCHEDULING), over 2000 to 2099: the member, project, task and client, hours per day, start time, period, note and billable flag. |
workspaces_shared_reportsworkspaces_shared_reports | Shared reports of each workspace whose plan has them (SHARED_REPORTS), as the workspace admin sees them: name, type, author, link, whether the link is public, whether the date range is fixed, and which users and user groups can see it. The workspace is `_ingest_parent_key`. |
workspaces_tagsworkspaces_tags | Tags of each workspace, archived ones included, with their archived flag, as a transformer child of `workspaces`. Tags are what time entries refer to in `tagIds`. |
workspaces_time_off_balance_assignmentsworkspaces_time_off_balance_assignments | The balance assignments behind each member's balance in a policy: the amount accrued and the balance for each date range, as a transformer child of `workspaces_time_off_balances`. |
workspaces_time_off_balancesworkspaces_time_off_balances | Each member's balance in each time-off policy: total, used, balance and negative balance, as a transformer child of `workspaces_time_off_policies`, one row per member and policy. |
workspaces_time_off_policiesworkspaces_time_off_policies | Time-off policies of each workspace whose plan has time off (TIME_OFF), archived ones included: name, time unit, approval settings, accrual, negative balance rules, and who the policy applies to. |
workspaces_time_off_requestsworkspaces_time_off_requests | Time-off requests of each workspace whose plan has time off (TIME_OFF), in every status (pending, approved, rejected): the member and policy, the period and half-day settings, the note, the balance change, and the current status with who changed it and when. |
workspaces_user_groupsworkspaces_user_groups | User groups (teams) of each workspace with their member ids and team managers, as a transformer child of `workspaces`. |
workspaces_user_time_entriesworkspaces_user_time_entries | Time entries of each workspace member over the member's whole history, one row per entry, as a transformer child of `workspaces_users` (reading another member's entries needs an admin's key). Fields: description, project, task, billable flag, type, locked flag, rates, and `timeInterval` as JSON carrying start and end (UTC), the same wall-clock values in the entry's own `timeZone`, and the ISO-8601 duration. Clockify filters this endpoint on the entry's START time and has no modified-since filter, and an entry can be edited after it is created, so every run re-reads each member's entries in full and upserts them on `id`; that is how an edited entry is corrected. An entry deleted in Clockify is not removed from the destination. Custom field values are a paid-plan feature and stay empty on a free workspace. |
workspaces_usersworkspaces_users | Members of each workspace with their email, name, status, profile picture and settings (time zone, date and time formats), as a transformer child of `workspaces`. Each member's roles land in `workspaces_users__roles` (workspace owner, admin, team manager, project manager), and what each role covers (the members a team manager manages, the projects a project manager manages) in `workspaces_users__roles__entities`. Time entries are read from these users. One row per workspace and member: a member of several workspaces has a row in each, with that workspace's roles, told apart by `_ingest_parent_key` (the workspace id). |
How it works
- Choose Clockify. Connect your Clockify account once, from Ingest.
- Pick where it goes. BigQuery, Snowflake, Databricks, Redshift and 10 more, in an account you own.
- Pick a schedule. Daily is the default, and weekly and monthly are there too.
- Ingest runs it from then on. If a run fails, your dashboard shows which table and why.
Questions
- Do I need an account with Clockify?
- Yes. You connect your own Clockify account once, from Ingest, and the data comes from what that account can see.
- Which warehouses can Clockify data go to?
- Amazon S3, Google Cloud Storage, Azure Blob Storage, Apache Iceberg, Ingest Managed Lakehouse, MotherDuck, Postgres, Amazon Athena, Databricks, Redshift, BigQuery, ClickHouse, MySQL / generic SQL and Snowflake, in an account you own.
- How fresh is the data?
- As fresh as your schedule: daily by default, or weekly or monthly. Schedules as often as every 15 minutes are on the Enterprise plan.
- Will running it again create duplicate rows?
- No. Each row is stored once, by its key: when a run reads a row that is already there, it replaces that copy instead of adding a second one.
- Do I need to write code?
- No. Ingest builds, runs and maintains the connector. Someone with access to your warehouse connects it once, following a short guide.
For your data team: technical reference
Connector clockify, version 0.1.0, a REST source, status beta, authentication api_key.
Vendor documentation: https://docs.clockify.me/
Configuration
No configuration required.
Resources
| Resource | Status | Plan | Write | Primary key | Overrides |
|---|---|---|---|---|---|
workspacesEvery workspace the key can see, with its settings, features, currencies, rates and memberships. This is the connector's anchor: every other resource is read from these workspaces, so no workspace id is pasted in anywhere. | beta | full | merge | id | - |
workspaces_clientsClients of each workspace, archived ones included, with their contact email, cc addresses, address, note and currency, as a transformer child of `workspaces`. | beta | parent_child | merge | id | - |
workspaces_custom_fieldsCustom fields defined on each workspace whose plan has custom fields (CUSTOM_FIELDS), for time entries or for users: name, type, allowed values, default value, whether it is required or only an admin can edit it, and its status. Per-project defaults land in `workspaces_custom_fields__project_default_values`. Values themselves are on the time entries (`customFieldValues`), the users (`customFields`) and the projects (`workspaces_projects__custom_fields`). | beta | parent_child | merge | id | - |
workspaces_expense_categoriesExpense categories of each workspace whose plan has expenses (EXPENSES), archived ones included: name, unit and unit price. | beta | parent_child | merge | id | - |
workspaces_expensesEvery member's expenses in each workspace whose plan has expenses (EXPENSES), from Clockify's expense report over 2000 to 2099: date, amount, quantity, category, project, task, member, billable and locked flags, approval state, receipt file link and invoicing state. Keyed on the report's `_id`, the expense's id. Every run reads the whole range again, so an edited expense is corrected; one deleted in Clockify is not removed. | beta | parent_child | merge | _id | - |
workspaces_holidaysHolidays of each workspace whose plan has time off (TIME_OFF): name, date period, whether it recurs every year, and who it applies to (everyone, or listed users and user groups). | beta | parent_child | merge | id | - |
workspaces_invoice_paymentsPayments recorded against each invoice: amount, date, note and author, as a transformer child of `workspaces_invoices`. A payment record does not name its invoice, so `_ingest_parent_key` holds the workspace and invoice ids as a JSON array, `["<workspace id>","<invoice id>"]`. | beta | parent_child | merge | id | - |
workspaces_invoicesInvoices of each workspace whose plan has invoicing (INVOICING), in every status: number, client, currency, amount, balance, amount paid, issue and due dates, and status. The workspace is `_ingest_parent_key`. | beta | parent_child | merge | id | - |
workspaces_projectsProjects of each workspace, archived ones included, with their client, colour, billable and archived flags, estimates and budget, public and template flags, note and per-member rates, as a transformer child of `workspaces`. Each project's tasks land in `workspaces_projects__tasks` (status, assignees, user groups, estimate, linked duration, billable flag and rates; done tasks included), and its custom field values, on a plan with custom fields, in `workspaces_projects__custom_fields`. `expenses` holds at most the project's latest 20 expenses, as Clockify serves them here; the full list is `workspaces_expenses`. | beta | parent_child | merge | id | - |
workspaces_scheduling_assignmentsScheduled assignments of each workspace whose plan has scheduling (SCHEDULING), over 2000 to 2099: the member, project, task and client, hours per day, start time, period, note and billable flag. | beta | parent_child | merge | id | - |
workspaces_shared_reportsShared reports of each workspace whose plan has them (SHARED_REPORTS), as the workspace admin sees them: name, type, author, link, whether the link is public, whether the date range is fixed, and which users and user groups can see it. The workspace is `_ingest_parent_key`. | beta | parent_child | merge | id | - |
workspaces_tagsTags of each workspace, archived ones included, with their archived flag, as a transformer child of `workspaces`. Tags are what time entries refer to in `tagIds`. | beta | parent_child | merge | id | - |
workspaces_time_off_balance_assignmentsThe balance assignments behind each member's balance in a policy: the amount accrued and the balance for each date range, as a transformer child of `workspaces_time_off_balances`. | beta | parent_child | merge | id | - |
workspaces_time_off_balancesEach member's balance in each time-off policy: total, used, balance and negative balance, as a transformer child of `workspaces_time_off_policies`, one row per member and policy. | beta | parent_child | merge | id | - |
workspaces_time_off_policiesTime-off policies of each workspace whose plan has time off (TIME_OFF), archived ones included: name, time unit, approval settings, accrual, negative balance rules, and who the policy applies to. | beta | parent_child | merge | id | - |
workspaces_time_off_requestsTime-off requests of each workspace whose plan has time off (TIME_OFF), in every status (pending, approved, rejected): the member and policy, the period and half-day settings, the note, the balance change, and the current status with who changed it and when. | beta | parent_child | merge | id | - |
workspaces_user_groupsUser groups (teams) of each workspace with their member ids and team managers, as a transformer child of `workspaces`. | beta | parent_child | merge | id | - |
workspaces_user_time_entriesTime entries of each workspace member over the member's whole history, one row per entry, as a transformer child of `workspaces_users` (reading another member's entries needs an admin's key). Fields: description, project, task, billable flag, type, locked flag, rates, and `timeInterval` as JSON carrying start and end (UTC), the same wall-clock values in the entry's own `timeZone`, and the ISO-8601 duration. Clockify filters this endpoint on the entry's START time and has no modified-since filter, and an entry can be edited after it is created, so every run re-reads each member's entries in full and upserts them on `id`; that is how an edited entry is corrected. An entry deleted in Clockify is not removed from the destination. Custom field values are a paid-plan feature and stay empty on a free workspace. | beta | parent_child | merge | id | - |
workspaces_usersMembers of each workspace with their email, name, status, profile picture and settings (time zone, date and time formats), as a transformer child of `workspaces`. Each member's roles land in `workspaces_users__roles` (workspace owner, admin, team manager, project manager), and what each role covers (the members a team manager manages, the projects a project manager manages) in `workspaces_users__roles__entities`. Time entries are read from these users. One row per workspace and member: a member of several workspaces has a row in each, with that workspace's roles, told apart by `_ingest_parent_key` (the workspace id). | beta | parent_child | merge | _ingest_parent_key, id | - |
Where this lands, and what else connects
Setting up the destination is its own short guide, one per warehouse or lake: Amazon S3, Google Cloud Storage, Azure Blob Storage, Apache Iceberg, Ingest Managed Lakehouse, MotherDuck, Postgres, Amazon Athena, Databricks, Redshift, BigQuery, ClickHouse, MySQL / generic SQL, Snowflake.
Other sources Ingest connects for SaaS teams: Asana, Jira, Salesforce, Airtable, Facebook Ads, Frankfurter.
- How Ingest reads a REST source
- Ingest for SaaS teams
- The tables Ingest creates
- Every source Ingest connects
Get Clockify data into your warehouse
Last updated .