Skip to main content
Connectors

Zoho Expense connector

Set up the Zoho Expense connector in Kaivo: authentication, configuration, the 9 BigQuery tables it syncs, and answers to common questions.

Written By Lauri Raivio

Last updated 16 days ago

Kaivo is a fully managed data platform that syncs your Zoho Expense data into a Google BigQuery warehouse and keeps it up to date automatically. There is no pipeline to build and no infrastructure to run, so you can spend your time analysing your payment and finance data instead of moving it.

What is the Zoho Expense connector

Sync your Zoho Expense data into BigQuery with Kaivo to analyse expenses, trips, reimbursements, and spend by project or cost centre.

CategoryFinance & Payments
AuthenticationAPI key
SetupSelf-service

Getting started with the Zoho Expense connector

  1. Sign up for Kaivo and create a workspace.
  2. Connect your Zoho Expense account.
  3. Choose which tables to sync.
  4. Wait for the initial sync to finish.
  5. Query your data in BigQuery or your favourite AI or BI tool.

Authenticating Zoho Expense

Authenticate with your Zoho Expense credentials. You provide:

FieldDescription
OAuth Client Secret

The Client Secret of your Zoho developer application.

OAuth Refresh Token

The refresh token obtained after completing the OAuth authorization flow.

Prerequisites

Zoho Expense only supports OAuth, so you need your own Zoho developer application:

  1. Go to the Zoho API Console, create a Self Client (the simplest option for a data sync), and note your Client ID and Client Secret.
  2. Generate a grant token for the ZohoExpense.fullaccess.all scope, then exchange it for a Refresh Token (see Zoho OAuth docs). Use the accounts URL for your account's data center, e.g. accounts.zoho.com (US) or accounts.zoho.eu (EU).

Then enter those values below.

Need help, or want an easier way to connect? Reach our team via the chat in the bottom-right corner.

Configuring the Zoho Expense connector

When you set up the connector, you provide:

FieldDescription
Data Center

The region where your Zoho Expense account is hosted.

OAuth Client ID

The Client ID of your Zoho developer application.

Tables and columns synced from Zoho Expense

Kaivo syncs 9 tables from Zoho Expense into a dedicated dataset in your BigQuery warehouse. Click any table to see its columns and types.

ColumnTypeDescription
_kaivo_idSTRINGPrimary key that uniquely identifies the row. Auto-generated by Kaivo.
currency_codeSTRING
currency_formatSTRING
currency_idSTRING
currency_nameSTRING
currency_name_formattedSTRING
currency_symbolSTRING
effective_dateSTRING
exchange_rateFLOAT64
is_base_currencyBOOL
price_precisionFLOAT64
rcy_configured_countFLOAT64
_kaivo_extracted_atTIMESTAMPTimestamp that shows when the row was extracted. Auto-generated by Kaivo.
ColumnTypeDescription
_kaivo_idSTRINGPrimary key that uniquely identifies the row. Auto-generated by Kaivo.
ach_supportedBOOL
company_nameSTRING
contact_idSTRING
contact_nameSTRING
contact_typeSTRING
contact_type_formattedSTRING
created_timeSTRING
created_time_formattedSTRING
currency_codeSTRING
currency_idSTRING
customer_nameSTRING
customer_sub_typeSTRING
emailSTRING
facebookSTRING
first_nameSTRING
has_attachmentBOOL
is_linked_with_zohocrmBOOL
language_codeSTRING
language_code_formattedSTRING
last_modified_timeSTRING
last_modified_time_formattedSTRING
last_nameSTRING
mobileSTRING
outstanding_payable_amountFLOAT64
outstanding_payable_amount_bcyFLOAT64
outstanding_receivable_amountFLOAT64
outstanding_receivable_amount_bcyFLOAT64
payment_termsFLOAT64
payment_terms_labelSTRING
phoneSTRING
portal_statusSTRING
primary_contact_idSTRING
sourceSTRING
statusSTRING
twitterSTRING
unused_credits_payable_amountFLOAT64
unused_credits_payable_amount_bcyFLOAT64
unused_credits_receivable_amountFLOAT64
unused_credits_receivable_amount_bcyFLOAT64
vendor_nameSTRING
websiteSTRING
_kaivo_extracted_atTIMESTAMPTimestamp that shows when the row was extracted. Auto-generated by Kaivo.

Subtable: customers__custom_fields

ColumnTypeDescription
_kaivo_parent_idSTRINGForeign key referencing _kaivo_id in the parent table. Auto-generated by Kaivo.
_kaivo_idSTRINGPrimary key that uniquely identifies the row. Auto-generated by Kaivo.
valueJSON
_kaivo_extracted_atTIMESTAMPTimestamp that shows when the row was extracted. Auto-generated by Kaivo.
ColumnTypeDescription
_kaivo_idSTRINGPrimary key that uniquely identifies the row. Auto-generated by Kaivo.
descriptionSTRING
attachment_file_nameSTRING
can_deleteBOOL
can_override_settingsBOOL
can_showBOOL
category_hintSTRING
category_iconSTRING
category_idSTRING
category_nameSTRING
category_name_with_gl_codeSTRING
category_typeSTRING
child_countSTRING
depthFLOAT64
expense_type_idSTRING
expense_type_nameSTRING
flat_amountFLOAT64
gl_codeSTRING
is_child_presentBOOL
is_customBOOL
is_description_requiredBOOL
is_disabled_masterBOOL
is_enabledBOOL
is_maximum_amount_requiredBOOL
is_mileageBOOL
is_perdiem_accountBOOL
is_receipt_requiredBOOL
is_super_parentBOOL
maximum_allowed_amountFLOAT64
page_layout_idSTRING
page_layout_nameSTRING
parent_account_idSTRING
parent_account_nameSTRING
receipt_required_amountFLOAT64
statusSTRING
_kaivo_extracted_atTIMESTAMPTimestamp that shows when the row was extracted. Auto-generated by Kaivo.
ColumnTypeDescription
_kaivo_idSTRINGPrimary key that uniquely identifies the row. Auto-generated by Kaivo.
descriptionSTRING
accounting_app_nameSTRING
accounting_reference_idSTRING
accounting_sync_timeSTRING
amount_policy_violation_countFLOAT64
amount_to_be_reimbursedFLOAT64
approved_dateSTRING
approver_emailSTRING
approver_employee_noSTRING
approver_idSTRING
approver_nameSTRING
approver_photo_urlSTRING
approver_zuidSTRING
audit_statusSTRING
can_push_to_accounting_appBOOL
claim_type_idSTRING
claim_type_nameSTRING
comments_countFLOAT64
created_by_idSTRING
created_by_nameSTRING
created_by_zuidSTRING
created_dateSTRING
created_timeSTRING
creator_employee_noSTRING
creator_photo_urlSTRING
currency_codeSTRING
currency_idSTRING
custom_policy_violation_countFLOAT64
customer_idSTRING
customer_nameSTRING
department_idSTRING
department_nameSTRING
description_policy_violation_countFLOAT64
due_dateSTRING
due_daysSTRING
employee_numberSTRING
end_dateSTRING
expense_countFLOAT64
imprest_account_idSTRING
imprest_account_nameSTRING
is_ach_reimbursementBOOL
is_archivedBOOL
is_international_tripSTRING
is_shared_reportBOOL
last_modified_dateSTRING
last_modified_timeSTRING
last_submitted_dateSTRING
non_reimbursable_totalFLOAT64
payrun_nameSTRING
policy_display_nameSTRING
policy_idSTRING
policy_nameSTRING
policy_violatedBOOL
project_idSTRING
project_nameSTRING
rcy_currency_codeSTRING
rcy_currency_idSTRING
rcy_currency_symbolSTRING
rcy_exchange_rateFLOAT64
rcy_non_reimbursable_totalFLOAT64
rcy_price_precisionFLOAT64
rcy_reimbursable_totalFLOAT64
rcy_totalFLOAT64
receipt_policy_violation_countFLOAT64
reimbursable_totalFLOAT64
reimbursement_dateSTRING
report_idSTRING
report_nameSTRING
report_numberSTRING
start_dateSTRING
statusSTRING
sub_statusSTRING
submitted_bySTRING
submitted_dateSTRING
submitted_to_emailSTRING
submitted_to_employee_noSTRING
submitted_to_idSTRING
submitted_to_nameSTRING
submitted_to_zuidSTRING
submitter_emailSTRING
submitter_employee_noSTRING
submitter_nameSTRING
submitter_photo_urlSTRING
submitter_zuidSTRING
totalFLOAT64
total_policy_violation_countFLOAT64
trip_budget_amountFLOAT64
trip_budget_amount_currency_codeSTRING
trip_budget_amount_currency_idSTRING
trip_departureSTRING
trip_destination_citySTRING
trip_destination_countrySTRING
trip_end_dateSTRING
trip_idSTRING
trip_nameSTRING
trip_numberSTRING
trip_start_dateSTRING
trip_statusSTRING
uncategorized_expense_countFLOAT64
user_emailSTRING
user_idSTRING
user_nameSTRING
user_photo_urlSTRING
zcrm_potential_idSTRING
zcrm_potential_nameSTRING
_kaivo_extracted_atTIMESTAMPTimestamp that shows when the row was extracted. Auto-generated by Kaivo.

Subtable: expense_reports__custom_fields

ColumnTypeDescription
_kaivo_parent_idSTRINGForeign key referencing _kaivo_id in the parent table. Auto-generated by Kaivo.
_kaivo_idSTRINGPrimary key that uniquely identifies the row. Auto-generated by Kaivo.
valueJSON
_kaivo_extracted_atTIMESTAMPTimestamp that shows when the row was extracted. Auto-generated by Kaivo.

Subtable: expense_reports__user_custom_fields

ColumnTypeDescription
_kaivo_parent_idSTRINGForeign key referencing _kaivo_id in the parent table. Auto-generated by Kaivo.
_kaivo_idSTRINGPrimary key that uniquely identifies the row. Auto-generated by Kaivo.
valueJSON
_kaivo_extracted_atTIMESTAMPTimestamp that shows when the row was extracted. Auto-generated by Kaivo.
ColumnTypeDescription
_kaivo_idSTRINGPrimary key that uniquely identifies the row. Auto-generated by Kaivo.
versionSTRING
account_created_dateSTRING
account_created_date_formattedSTRING
can_change_timezoneBOOL
can_sign_invoiceBOOL
contact_nameSTRING
countrySTRING
country_codeSTRING
currency_codeSTRING
currency_formatSTRING
currency_idSTRING
currency_symbolSTRING
custom_field_typeFLOAT64
digital_signature_modeSTRING
emailSTRING
field_separatorSTRING
fiscal_year_start_monthFLOAT64
is_org_activeBOOL
is_org_not_supportedBOOL
is_advance_approval_enabledBOOL
is_auto_scan_allowedBOOL
is_default_orgBOOL
is_designated_zoneBOOL
is_dsign_requiredBOOL
is_export_with_payment_enabledBOOL
is_free_zoneBOOL
is_gst_india_versionBOOL
is_hsn_or_sac_enabledBOOL
is_international_trade_enabledBOOL
is_invoice_pmt_tds_allowedBOOL
is_org_activeBOOL
is_quick_setup_completedBOOL
is_registered_for_composite_schemeBOOL
is_registered_for_gstBOOL
is_registered_for_taxBOOL
is_sales_inclusive_tax_enabledBOOL
is_sales_reverse_charge_enabledBOOL
is_search360_enabledSTRING
is_sku_enabledBOOL
is_solo_orgBOOL
is_tax_registeredBOOL
is_trial_expiredBOOL
is_trial_period_extendedBOOL
is_trip_enabledBOOL
is_user_dsign_mandatoryBOOL
is_zieditionBOOL
is_zpayroll_gridBOOL
language_codeSTRING
modeSTRING
nameSTRING
org_actionSTRING
org_created_app_sourceFLOAT64
org_settingsBOOL
org_typeSTRING
organization_idSTRING
partners_domainSTRING
phoneSTRING
plan_nameSTRING
plan_periodSTRING
plan_typeFLOAT64
price_precisionFLOAT64
sales_tax_typeSTRING
sourceFLOAT64
stateSTRING
state_codeSTRING
tax_group_enabledBOOL
time_zoneSTRING
time_zone_formattedSTRING
user_statusFLOAT64
user_status_formattedSTRING
version_formattedSTRING
zi_zb_clientFLOAT64
zi_zb_editionFLOAT64
zoho_one_orgSTRING
_kaivo_extracted_atTIMESTAMPTimestamp that shows when the row was extracted. Auto-generated by Kaivo.

Subtable: organizations__app_list

ColumnTypeDescription
_kaivo_parent_idSTRINGForeign key referencing _kaivo_id in the parent table. Auto-generated by Kaivo.
_kaivo_idSTRINGPrimary key that uniquely identifies the row. Auto-generated by Kaivo.
valueSTRING
_kaivo_extracted_atTIMESTAMPTimestamp that shows when the row was extracted. Auto-generated by Kaivo.

Subtable: organizations__custom_fields

ColumnTypeDescription
_kaivo_parent_idSTRINGForeign key referencing _kaivo_id in the parent table. Auto-generated by Kaivo.
_kaivo_idSTRINGPrimary key that uniquely identifies the row. Auto-generated by Kaivo.
indexFLOAT64
labelSTRING
valueSTRING
_kaivo_extracted_atTIMESTAMPTimestamp that shows when the row was extracted. Auto-generated by Kaivo.

Subtable: organizations__org_joined_app_list

ColumnTypeDescription
_kaivo_parent_idSTRINGForeign key referencing _kaivo_id in the parent table. Auto-generated by Kaivo.
_kaivo_idSTRINGPrimary key that uniquely identifies the row. Auto-generated by Kaivo.
valueSTRING
_kaivo_extracted_atTIMESTAMPTimestamp that shows when the row was extracted. Auto-generated by Kaivo.
ColumnTypeDescription
_kaivo_idSTRINGPrimary key that uniquely identifies the row. Auto-generated by Kaivo.
codeFLOAT64
messageSTRING
page_context__applied_filterSTRING
page_context__has_more_pageBOOL
page_context__pageFLOAT64
page_context__per_pageFLOAT64
page_context__report_nameSTRING
page_context__sort_columnSTRING
page_context__sort_orderSTRING
_kaivo_extracted_atTIMESTAMPTimestamp that shows when the row was extracted. Auto-generated by Kaivo.

Subtable: projects__page_context__custom_fields

ColumnTypeDescription
_kaivo_parent_idSTRINGForeign key referencing _kaivo_id in the parent table. Auto-generated by Kaivo.
_kaivo_idSTRINGPrimary key that uniquely identifies the row. Auto-generated by Kaivo.
valueJSON
_kaivo_extracted_atTIMESTAMPTimestamp that shows when the row was extracted. Auto-generated by Kaivo.

Subtable: projects__projects

ColumnTypeDescription
_kaivo_parent_idSTRINGForeign key referencing _kaivo_id in the parent table. Auto-generated by Kaivo.
_kaivo_idSTRINGPrimary key that uniquely identifies the row. Auto-generated by Kaivo.
valueJSON
_kaivo_extracted_atTIMESTAMPTimestamp that shows when the row was extracted. Auto-generated by Kaivo.
ColumnTypeDescription
_kaivo_idSTRINGPrimary key that uniquely identifies the row. Auto-generated by Kaivo.
accounting_app_nameSTRING
accounting_reference_idSTRING
diff_rate_reasonSTRING
end_dateSTRING
is_editableBOOL
is_inactiveBOOL
is_value_addedFLOAT64
last_modified_timeSTRING
output_tax_account_nameSTRING
start_dateSTRING
statusSTRING
tax_account_idSTRING
tax_idSTRING
tax_nameSTRING
tax_percentageFLOAT64
tax_typeSTRING
_kaivo_extracted_atTIMESTAMPTimestamp that shows when the row was extracted. Auto-generated by Kaivo.
ColumnTypeDescription
_kaivo_idSTRINGPrimary key that uniquely identifies the row. Auto-generated by Kaivo.
descriptionSTRING
approved_dateSTRING
approver_emailSTRING
approver_employee_noSTRING
approver_idSTRING
approver_nameSTRING
approver_photo_urlSTRING
approver_zuidSTRING
bcy_budget_amountFLOAT64
budget_amountFLOAT64
business_purposeSTRING
can_other_travelers_associate_reportBOOL
created_by_emailSTRING
created_by_idSTRING
created_by_nameSTRING
created_dateSTRING
created_timeSTRING
creator_employee_noSTRING
creator_photo_urlSTRING
currency_codeSTRING
currency_idSTRING
customer_idSTRING
customer_nameSTRING
department_idSTRING
department_nameSTRING
departureSTRING
destination_citySTRING
destination_countrySTRING
destination_stateSTRING
employee_numberSTRING
end_dateSTRING
exchange_rateFLOAT64
from_sourceSTRING
is_archivedBOOL
is_billableBOOL
is_internationalBOOL
is_round_tripBOOL
is_visa_requiredBOOL
last_modified_timeSTRING
last_submitted_dateSTRING
meal_preferenceSTRING
notesSTRING
policy_display_nameSTRING
policy_idSTRING
policy_nameSTRING
price_precisionFLOAT64
project_idSTRING
project_nameSTRING
reports_countFLOAT64
seat_preferenceSTRING
start_dateSTRING
statusSTRING
sub_statusSTRING
submitted_byFLOAT64
submitted_dateSTRING
submitted_to_department_nameSTRING
submitted_to_emailSTRING
submitted_to_employee_noSTRING
submitted_to_idSTRING
submitted_to_nameSTRING
submitter_department_nameSTRING
submitter_emailSTRING
submitter_employee_noSTRING
submitter_nameSTRING
submitter_photo_urlSTRING
submitter_zuidSTRING
trip_idSTRING
trip_nameSTRING
trip_numberSTRING
user_emailSTRING
user_idSTRING
user_nameSTRING
_kaivo_extracted_atTIMESTAMPTimestamp that shows when the row was extracted. Auto-generated by Kaivo.

Subtable: trips__booking_summary

ColumnTypeDescription
_kaivo_parent_idSTRINGForeign key referencing _kaivo_id in the parent table. Auto-generated by Kaivo.
_kaivo_idSTRINGPrimary key that uniquely identifies the row. Auto-generated by Kaivo.
valueJSON
_kaivo_extracted_atTIMESTAMPTimestamp that shows when the row was extracted. Auto-generated by Kaivo.

Subtable: trips__custom_fields

ColumnTypeDescription
_kaivo_parent_idSTRINGForeign key referencing _kaivo_id in the parent table. Auto-generated by Kaivo.
_kaivo_idSTRINGPrimary key that uniquely identifies the row. Auto-generated by Kaivo.
valueJSON
_kaivo_extracted_atTIMESTAMPTimestamp that shows when the row was extracted. Auto-generated by Kaivo.

Subtable: trips__user_custom_fields

ColumnTypeDescription
_kaivo_parent_idSTRINGForeign key referencing _kaivo_id in the parent table. Auto-generated by Kaivo.
_kaivo_idSTRINGPrimary key that uniquely identifies the row. Auto-generated by Kaivo.
valueJSON
_kaivo_extracted_atTIMESTAMPTimestamp that shows when the row was extracted. Auto-generated by Kaivo.
ColumnTypeDescription
_kaivo_idSTRINGPrimary key that uniquely identifies the row. Auto-generated by Kaivo.
accounting_app_nameSTRING
accounting_reference_idSTRING
accounting_vendor_reference_idSTRING
approval_amount_limitFLOAT64
approver_photo_urlSTRING
approves_to_emailSTRING
approves_to_idSTRING
approves_to_nameSTRING
bank_nameSTRING
can_approveBOOL
created_timeSTRING
default_approver_emailSTRING
default_approver_idSTRING
default_approver_nameSTRING
department_idSTRING
department_nameSTRING
display_nameSTRING
emailSTRING
employee_numberSTRING
getthere_accessSTRING
getthere_profile_createdBOOL
hr_urlSTRING
invitation_typeSTRING
is_current_userBOOL
is_from_crmBOOL
is_from_zoho_peopleBOOL
is_super_adminBOOL
last_four_digitsSTRING
last_modified_timeSTRING
mobileSTRING
nameSTRING
photo_urlSTRING
policy_idSTRING
policy_nameSTRING
role_idSTRING
statusSTRING
submission_amount_limitFLOAT64
travel_policy_display_nameSTRING
travel_policy_idSTRING
travel_policy_nameSTRING
user_idSTRING
user_mail_in_idSTRING
user_roleSTRING
user_typeSTRING
_kaivo_extracted_atTIMESTAMPTimestamp that shows when the row was extracted. Auto-generated by Kaivo.

How the Zoho Expense sync works

After the first load, Kaivo keeps your BigQuery warehouse up to date for you. Where Zoho Expense supports it, each sync pulls only new and changed records so it stays fast; otherwise it refreshes the whole table. Every record keeps its original ID, so you won't get duplicate rows.

Frequently asked questions

How long does the initial sync take for Zoho Expense?

It depends on how much history is in your Zoho Expense account. Most initial syncs finish within minutes, while large accounts can take a few hours. After that, syncs only fetch new and changed records, so they're much faster.

Can I sync only some tables or columns?

Yes. You pick which tables to sync when you set up the connection and can change the selection later. Tables you don't select are never copied to your warehouse.

What happens when Zoho Expense's schema changes?

New fields are never added automatically. You choose which fields to sync, so data you haven't selected (sensitive personal data, for example) never lands in your warehouse. When a new field appears, it becomes available for you to add. What happens to removed or renamed fields depends on a table's sync mode: full-refresh tables always match what's currently in Zoho Expense, so dropped fields disappear, while incremental tables keep their existing columns and history, so an old field stays and newly added fields fill in over time.

How do I handle GDPR or data deletion requests?

Your data lives in your own Kaivo-managed BigQuery warehouse, so the most direct option is to delete or anonymise specific records right in BigQuery. If you delete data in Zoho Expense instead, full-refresh tables drop it on the next sync, while incremental tables keep it, so you would remove the row in BigQuery or ask us to run a full refresh. To remove everything, delete the Zoho Expense connector in Kaivo and all of its synced data is deleted with it.

Common use cases for Zoho Expense data

Spend analysis

Use expense_reports and expense_categories to track spend by category over time.

Travel view

Join trips with expense_reports to analyse travel spend.

Project context

Use projects and customers to attribute expenses to work.

Use Zoho Expense data in your AI and BI tools

Once Zoho Expense data lands in your Kaivo-managed BigQuery warehouse, you can explore it with AI tools or any BI tool that connects to BigQuery. Here's how the most common destinations work with Zoho Expense data.

Claude

Use Kaivo's MCP server to give Claude secure, workspace-scoped access to your data. Setup guide →

Power BI

Microsoft's BI tool with a native BigQuery connector. Supports direct query and scheduled refresh. Setup guide →

Data Studio

Free Google BI tool with native BigQuery support. One-click connection to your Kaivo warehouse; great for SMB teams on Google Workspace. Setup guide →

Tableau

The premium analytics standard, with native BigQuery integration. Setup guide →

Google Sheets

Use Connected Sheets to query BigQuery directly from a spreadsheet, with no SQL. Setup guide →

Excel

Connect via Power Query's BigQuery connector. Setup guide →

Metabase

Open-source BI tool with strong BigQuery support. Setup guide →

See our pricing page for Zoho Expense connector pricing and plan details.

Was this helpful?

Still need help? Share an idea