ml-connector
FreshBooksGoogle Sheets

FreshBooks and Google Sheets integration

FreshBooks manages invoices, expenses, bills, and clients for small business accounting. Google Sheets is your data warehouse and reporting canvas. Connecting the two keeps a live, searchable archive of all your FreshBooks financial records in a single sheet you own and control. New invoices, expenses, payments, and bill activity flow into your sheet automatically, ready for analysis, reporting, and integration with other tools.

How FreshBooks works

FreshBooks exposes invoices, expenses, bills, bill vendors, payments, clients, chart of accounts, items, and journal entries through REST APIs hosted at https://api.freshbooks.com with OAuth 2.0 user-delegated authorization. It publishes webhook events for create, update, and delete actions on invoices, expenses, bills, payments, clients, and related entities, delivering event payloads via POST to a customer-supplied endpoint with HMAC-SHA256 signature verification. Webhook delivery is reliable but not real-time; events may take seconds to several minutes to arrive. FreshBooks webhook attempts time out after 10 seconds, and persistent failures disable the callback.

How Google Sheets works

Google Sheets is a general-purpose cloud spreadsheet with a REST API (v4) for reading and writing cell data using OAuth 2.0 (user-delegated or Service Account). The API uses A1 notation ranges to target specific cells or named ranges, and supports both append and batch update operations. Google Sheets has no native ERP entities; customers define their own schema by naming sheet tabs and column headers. Polling is the recommended sync method, with watch channels available but requiring manual re-registration due to hourly expiry.

What moves between them

FreshBooks webhook events trigger the primary flow. When an invoice, expense, bill, or payment is created or updated in FreshBooks, ml-connector receives the event, transforms the FreshBooks fields to your Google Sheets column headers, and appends the row to the matching sheet tab (e.g., Invoices tab, Expenses tab, Bills tab, Payments tab). Each event carries the FreshBooks account ID, business ID, and object ID, which ml-connector records in your sheet for reference and deduplication. Status fields (invoice status, payment status) are computed by FreshBooks and sent read-only; ml-connector does not modify status in FreshBooks. Deletions are logged to your sheet with a delete marker rather than removing rows, so you retain a complete audit trail.

How ml-connector handles it

ml-connector stores your FreshBooks OAuth credentials encrypted and exchanges them for an access token when a webhook event arrives. It verifies the HMAC-SHA256 signature on every FreshBooks webhook payload using your registered webhook secret, rejecting any payload with an invalid signature. For Google Sheets, ml-connector stores your OAuth credentials (or Service Account key) encrypted and requests a fresh token before each append operation. When a FreshBooks event arrives, ml-connector maps FreshBooks field names to your sheet column headers, handles null values by leaving cells blank, and appends the row to the target tab using the Google Sheets append operation. If Google Sheets rejects the append (e.g., the tab does not exist or the header row has moved), ml-connector logs the failure and retries on the next event with exponential backoff. FreshBooks webhook timeout is 10 seconds, so ml-connector acknowledges the webhook immediately (2xx response) and processes the sheet append asynchronously. Your FreshBooks account remains the authoritative copy; ml-connector never writes back to FreshBooks.

A real-world example

A small consulting firm uses FreshBooks for invoicing and expense tracking across multiple projects. The finance team needs a searchable archive of all invoices and expenses in Google Sheets for month-end reconciliation, tax preparation, and ad-hoc reporting. Before the integration, someone exported invoices and expenses manually from FreshBooks each week and pasted them into a Google Sheet. With FreshBooks and Google Sheets connected, every invoice sent and every expense logged appears in the Sheets automatically, complete with client name, amount, date, and project code. The sheet is always current, always sorted, and linked to other reporting and tax documents in Google Drive.

What you can do

  • Sync FreshBooks invoices, expenses, bills, and payments to Google Sheets tabs in real time as events occur.
  • Verify FreshBooks webhook signatures (HMAC-SHA256) so only authentic events enter your data warehouse.
  • Map FreshBooks column names to your custom Google Sheets headers, so the sheet layout matches your reporting needs.
  • Append rows with FreshBooks object IDs for deduplication and audit trail, so no record is duplicated or lost.
  • Log all operations and sync failures to a dedicated audit tab, so you can investigate and replay missed records.

Questions

Does ml-connector modify data in FreshBooks?
No. ml-connector is read-only on FreshBooks. It listens to webhook events, transforms the data, and writes to Google Sheets only. Your FreshBooks account remains the authoritative source; ml-connector never writes back to FreshBooks or changes any invoice, expense, or payment status.
What happens if a Google Sheets append fails?
If Google Sheets rejects an append operation (for example, if the target tab does not exist or the header row has moved), ml-connector logs the failure to an audit tab with the full FreshBooks payload and timestamps. When the issue is fixed (e.g., the tab is recreated), you can replay the failed records in the next sync cycle.
How does ml-connector handle FreshBooks webhook delays and retries?
FreshBooks webhook delivery is reliable but not instantaneous; events may take seconds to several minutes to arrive. ml-connector acknowledges the webhook immediately (2xx response) so FreshBooks does not retry, then processes the append asynchronously. If a Google Sheets write fails, ml-connector retries with exponential backoff. FreshBooks handles its own webhook retries; ml-connector does not retry failed FreshBooks webhook deliveries.

Related integrations

Connect FreshBooks and Google Sheets

Free to use. Add your credentials, ping your real systems, and see if we fit.

Get started