ml-connector
FreshBooksProcore

FreshBooks and Procore integration

FreshBooks manages your accounting and invoicing. Procore manages your project costs and commitments. Connecting the two keeps your project ledger and your general books in sync. Invoices from FreshBooks vendors flow into Procore as payment applications allocated to the right cost codes and projects. Project change orders and cost updates from Procore feed back into FreshBooks expense categories so your profit margin stays accurate. ml-connector handles the different OAuth models on each side and moves the records on the schedule you set.

How FreshBooks works

FreshBooks exposes invoices, bills, expenses, clients, bill vendors, payments, journal entries, and chart of accounts through REST APIs under the /accounting and /timetracking namespaces. Authentication is OAuth 2.0 user-delegated (Authorization Code grant), not Client Credentials, so access is tied to an individual FreshBooks user and their scope permissions. FreshBooks pushes real-time events via webhook POST to a customer-supplied endpoint, covering invoice, bill, payment, expense, client, and line-item changes. Webhook payloads are HMAC-SHA256 signed. FreshBooks does not expose purchase orders or a standalone employee API.

How Procore works

Procore exposes vendors, purchase order contracts, requisitions, payment applications, budget line items, cost codes, change orders, and project commitments through REST endpoints at https://api.procore.com/rest/v1.0/ and v2.x/. Authentication is OAuth 2.0 Client Credentials via a Developer Managed Service Account (DMSA), with tokens expiring after 90 minutes. Procore supports webhooks for real-time push on commitments, requisitions, direct costs, and change orders, secured via custom headers rather than HMAC. Most endpoints require company_id and many require project_id as path parameters. Procore has no standalone GL account endpoint; cost codes and cost types serve as the financial dimension.

What moves between them

The primary flow is FreshBooks into Procore. New invoices and bill vendors in FreshBooks trigger the creation of payment applications in Procore, matched to the correct project via a mapping table and allocated to cost codes based on line-item GL account. Cost updates and change orders in Procore flow back to FreshBooks as updates to expense categories and project-tracking entries so FreshBooks charts and profit margins stay current. Reference data such as vendors and cost codes is aligned in both directions on the first sync and then maintained through webhook events.

How ml-connector handles it

ml-connector stores the FreshBooks user token and Procore service account credentials encrypted, and requests a new Procore token every 90 minutes before expiry to avoid outages. FreshBooks webhooks arrive at the ml-connector endpoint, are verified against the HMAC-SHA256 header, and trigger lookups in the customer's vendor and project map tables. Each FreshBooks vendor is matched to a Procore vendor by external ID; if no match exists, ml-connector flags the record and does not post. Invoice lines are allocated to Procore cost codes via the FreshBooks GL account linked on each line. Procore all endpoints require both company_id and project_id for project-scoped resources, so ml-connector validates both before each call. Webhook delivery latency in FreshBooks can range from seconds to several minutes, so ml-connector also polls at a configurable interval as a fallback. Procore webhooks return 2xx within 5 seconds or Procore stops trying, so ml-connector is strict about response time and queues long operations.

A real-world example

A mid-sized construction contractor uses FreshBooks for accounting and invoicing, and Procore for project tracking and cost management. Before integration, the accounting team received FreshBooks invoices, manually looked up which Procore project they belonged to, and entered them as payment applications in Procore by hand. The same person then had to update FreshBooks expense categories if a change order landed in Procore, or a budget adjustment happened mid-project. With FreshBooks and Procore connected, invoices from the contractor's material vendors flow straight into Procore payment applications, already allocated to cost codes, and project change orders feed back to FreshBooks to keep the invoice GL in step with actual project costs. Month-end reconciliation between the two systems is automatic.

What you can do

  • Receive FreshBooks invoice and payment events via webhook and post them to Procore payment applications on the matching projects.
  • Map FreshBooks bill vendors to Procore vendors using a lookup table, and flag unmapped vendors for review before posting.
  • Allocate invoice lines to Procore cost codes based on the GL account attached to each FreshBooks line item.
  • Authenticate FreshBooks via user-delegated OAuth and Procore via Client Credentials, and refresh Procore tokens before expiry.
  • Sync Procore change orders and cost updates back to FreshBooks as expense category adjustments and project-tracking entries.

Questions

How does ml-connector handle FreshBooks user-delegated OAuth and Procore Client Credentials?
ml-connector stores both credential sets encrypted. FreshBooks uses the user's token directly on API calls. Procore uses the service account credentials to request a bearer token, and refreshes the token every 90 minutes before it expires so outages are prevented.
What happens if a FreshBooks invoice has no matching Procore vendor or project?
ml-connector looks up the vendor and project via external ID in the customer's mapping table. If no match is found, the invoice is flagged in the audit log but not posted to Procore, allowing the customer to review unmapped records before they reach the project ledger.
Do webhooks alone keep FreshBooks and Procore in sync, or is there a polling fallback?
FreshBooks webhook delivery can range from seconds to several minutes, and Procore webhooks require a 2xx response within 5 seconds. ml-connector receives both webhook events and polls at a configurable interval, so neither system is blocked if webhook delivery is slow or a response times out.

Related integrations

Connect FreshBooks and Procore

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

Get started