FreshBooks and BigCommerce integration
FreshBooks runs invoicing, payments, and the chart of accounts. BigCommerce runs the online store, its orders, and the catalog. Connecting the two means a paid order placed in BigCommerce becomes an invoice and a recorded payment in FreshBooks without anyone re-keying it. Store customers line up with FreshBooks clients and catalog products line up with FreshBooks items, so each invoice line ties back to a known product and payer. ml-connector handles the very different auth on each side and moves the records on the schedule you set.
What moves between them
The main flow runs from BigCommerce into FreshBooks. When a store order reaches a paid status, ml-connector reads the order and its v3 transactions and creates a matching FreshBooks invoice with line items, then records the captured payment against that invoice. BigCommerce customers flow the same direction so each invoice is tied to a FreshBooks client, and catalog products map to FreshBooks items so invoice lines reference known goods. BigCommerce refunds are read from the v3 refunds endpoint and reflected against the FreshBooks invoice and payment. The chart of accounts lives only in FreshBooks, so account and tax mapping happen on the FreshBooks side and BigCommerce never receives GL data, which it has no place to store.
How ml-connector handles it
ml-connector stores both credential sets encrypted. On the BigCommerce side it sends the static access token in the X-Auth-Token header on every request, with no Bearer prefix. On the FreshBooks side it runs the OAuth 2.0 authorization-code grant, attaches the bearer access token, and refreshes it when a call returns 401, storing the new refresh token each time because FreshBooks invalidates the previous one. Signed store/order webhooks trigger the work, and because a BigCommerce payload carries only a type and id, the full order is fetched from the v2 endpoint and its v3 transactions before anything posts; a scheduled poll backfills anything a webhook missed, since webhooks auto-deactivate after long inactivity or sustained failures. Only orders at a paid status become invoices, so unpaid and incomplete orders are skipped, and the FreshBooks invoice is created as a Draft then marked Sent so it lands in the accounting reports. Store customers are matched to FreshBooks clients and products to FreshBooks items first, so every invoice line references a record that already exists. Neither API offers an idempotency-key header, so ml-connector reuses the BigCommerce order number as the FreshBooks invoice number, checks for that number before creating, and dedupes on a BullMQ jobId, which keeps a re-read order from invoicing twice; supplying that number also avoids the 409 conflict FreshBooks raises on concurrent invoice creates. Both sides return HTTP 429 when throttled, so ml-connector backs off with jitter, refunds are processed one at a time per order, and every record carries a full audit trail and can be replayed if a downstream call fails.
A real-world example
A direct-to-consumer outdoor gear brand with roughly 40 staff sells through a BigCommerce storefront and keeps its books in FreshBooks. Before the integration, a bookkeeper exported the week's paid orders from BigCommerce and re-keyed each one into FreshBooks as an invoice, then logged the matching payment by hand and chased down which customer and product each line belonged to, which delayed the books and produced mismatched totals at month-end. With FreshBooks and BigCommerce connected, every paid BigCommerce order flows into FreshBooks as an invoice with the payment already recorded, the store customer mapped to a FreshBooks client, and each line tied to a FreshBooks item. The manual export-and-re-key step is gone and the revenue is booked the same day the order is paid.
What you can do
- Create FreshBooks invoices from paid BigCommerce orders, with line items mapped to FreshBooks items.
- Record the captured BigCommerce payment against the matching FreshBooks invoice automatically.
- Keep FreshBooks clients aligned with BigCommerce customers as orders come in.
- Bridge the BigCommerce X-Auth-Token key and the FreshBooks OAuth token, refreshing the FreshBooks token automatically.
- Trigger on signed BigCommerce order webhooks, backfill by scheduled poll, and reuse the order number to avoid duplicate invoices.
Questions
- Which direction does data move between FreshBooks and BigCommerce?
- It runs mainly from BigCommerce into FreshBooks. Paid orders, their transactions, refunds, customers, and products move from BigCommerce and become FreshBooks invoices, recorded payments, clients, and items. The chart of accounts and tax mapping stay on the FreshBooks side, and BigCommerce never receives GL data because it has no accounting objects to hold it.
- How does the integration avoid recording an order twice without an idempotency key?
- Neither FreshBooks nor BigCommerce exposes an idempotency-key header. ml-connector reuses the BigCommerce order number as the FreshBooks invoice number, checks FreshBooks for that number before creating, and dedupes on a BullMQ jobId. Supplying the invoice number also sidesteps the 409 conflict FreshBooks raises when invoices are created concurrently without one.
- Does the integration use BigCommerce webhooks or polling?
- It uses both. Signed store/order webhooks trigger the sync as soon as an order is paid, and because the payload carries only a type and id, ml-connector fetches the full order and its transactions from the REST API before posting. A scheduled poll backfills missed events, which matters because BigCommerce auto-deactivates webhooks after long inactivity or sustained delivery failures.
Related integrations
More FreshBooks integrations
Other systems that connect to BigCommerce
Connect FreshBooks and BigCommerce
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started