ml-connector
QADProcore

QAD and Procore integration

QAD runs manufacturing and finance. Procore runs construction project management, costs, and commitments. Connecting the two keeps jobsite spend and the general ledger in agreement. Approved subcontractor invoices, direct costs, and payments captured in Procore post into QAD as supplier invoices and AP entries without re-keying, and QAD suppliers stay aligned with Procore vendors. ml-connector handles the different APIs on each side and moves the data on a schedule you control.

How QAD works

QAD Adaptive ERP exposes suppliers, purchase orders, supplier invoices, GL accounts, cost centers, items, goods receipts, and AP payments through REST business document APIs, documented in Swagger inside each customer instance. The cloud product authenticates with a JWT session or OAuth2 bearer token against a tenant-specific URL, so there is no shared hostname. Older on-premise sites run QAD Enterprise Edition with the QXtend SOAP framework instead. QAD has no public webhook system for cloud connectors, so finance records are read by polling, and supplier invoices three-way match against posted purchase order receipts.

How Procore works

Procore exposes vendors, purchase order contracts, subcontractor invoices (requisitions), direct costs, commitment and prime contract payments, budget line items, change orders, and cost codes through its REST API at api.procore.com. Authentication uses OAuth 2.0 client credentials through a Developer Managed Service Account, with bearer tokens that expire after 5400 seconds and no refresh token. Almost every call is scoped to a company_id and most financial data is scoped to a project_id. Procore has no standalone GL accounts endpoint; cost codes plus cost types serve as the accounting dimensions. Procore can push create, update, and delete webhook events, secured by a shared-secret header rather than a cryptographic signature.

What moves between them

The main flow runs from Procore into QAD. ml-connector reads approved Procore subcontractor invoices, direct costs, and contract payments per active project and posts them into QAD as supplier invoices and AP entries, mapped to the matching QAD GL accounts and cost centers. Supplier and vendor master data flows from QAD into Procore so both systems share one vendor list, matched on natural keys such as name and registration number. Procore cost codes are aligned to QAD GL accounts and cost centers so every cost line references a dimension that already exists in QAD. Procore is the system of record for project commitments, so ml-connector reads those costs rather than writing budgets back.

How ml-connector handles it

ml-connector stores both credential sets encrypted. On the Procore side it requests a client-credentials bearer token and refreshes it before the 5400-second expiry, and attaches company_id on every call and project_id on project-scoped reads. On the QAD side it accepts the full tenant URL per customer, since QAD publishes no shared base URL, and validates entity paths against that instance. Procore can push webhook events, but because they carry only a shared-secret header and QAD cloud is pull-only, ml-connector validates that header and still runs scheduled reconciliation polls so a missed event is caught. Procore cost codes are mapped to QAD GL accounts and cost centers first, so each invoice line lands on a valid dimension. Procore enforces two rate-limit windows, an hourly budget and a 10-second spike cap, returning HTTP 429; ml-connector reads the rate-limit headers, backs off, and retries. Because QAD supplier invoices three-way match against posted receipts, ml-connector lets receipts settle before posting matched invoices. Every record carries a full audit trail and can be replayed if a downstream call fails.

A real-world example

A general contractor with roughly 300 staff runs QAD Adaptive ERP for finance and procurement, and runs Procore on the field side for project costs, subcontractor invoices, and change orders across dozens of active jobsites. Before the integration, project accountants exported subcontractor invoice registers and direct costs from each Procore project and re-entered the totals into QAD as supplier invoices, then chased differences between project cost codes and the general ledger at month end. With QAD and Procore connected, approved Procore costs flow into QAD as supplier invoices automatically, allocated to the cost center and GL account behind each cost code, and the vendor list stays consistent on both sides. Month-end close starts with jobsite costs already reconciled, and the manual re-keying step is gone.

What you can do

  • Post approved Procore subcontractor invoices, direct costs, and payments into QAD as supplier invoices and AP entries.
  • Keep QAD suppliers aligned with Procore vendors so both systems share one master list.
  • Map Procore cost codes and cost types to QAD GL accounts and cost centers so costs land on valid dimensions.
  • Authenticate Procore with OAuth 2.0 client credentials and refresh tokens before the 5400-second expiry, and QAD with its tenant-specific token.
  • Validate Procore webhook headers and run scheduled reconciliation polls, with rate-limit backoff, retries, and a full audit trail.

Questions

Which direction does data move between QAD and Procore?
The main flow is Procore into QAD. Approved subcontractor invoices, direct costs, and payments move from Procore into QAD as supplier invoices and AP entries, while supplier and vendor master data flows from QAD into Procore so both share one list. Cost codes are mapped to QAD GL accounts and cost centers so every line references a valid dimension.
Does ml-connector use Procore webhooks or polling?
It uses both. Procore can push create, update, and delete events, but those payloads carry only a shared-secret header rather than a cryptographic signature, so ml-connector validates that header on receipt. Because QAD cloud is pull-only and Procore does not document a webhook retry schedule, it also runs scheduled reconciliation polls per project so a missed event is caught.
How does the integration handle Procore cost codes when QAD expects GL accounts and cost centers?
Procore has no standalone GL accounts endpoint, so cost codes plus cost types serve as its accounting dimensions. ml-connector maps each Procore cost code to a QAD GL account and cost center before posting, so every supplier invoice line lands on a dimension that already exists in QAD. Because QAD supplier invoices three-way match against posted receipts, it also lets receipts settle before posting matched invoices.

Related integrations

Connect QAD and Procore

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

Get started