ml-connector
Sage X3Procurify

Sage X3 and Procurify integration

Sage X3 manages your finance, procurement, and inventory. Procurify streamlines purchase requests and approval workflows. When they are connected, new purchase orders and requisitions from Procurify flow into Sage X3 automatically, keeping your procurement records in sync without manual re-entry. ml-connector bridges the two systems and handles their different authentication methods and polling requirements.

How Sage X3 works

Sage X3 is an on-premise and cloud ERP serving mid-market manufacturers, distributors, and services companies. It exposes purchase orders, suppliers, sales and supplier invoices, products, GL accounts, and GL entries through REST (api1 with HTTP Basic auth or legacy paths) and GraphQL (Xtrem, requiring OAuth2 client credentials and V12 or later). Access tokens expire in 5 minutes and refresh tokens last 30 days. Sage X3 has no native webhooks or push notifications, so procurement records are discovered through polling with delta detection using updatedDate and modifiedDateTime fields. The server URL, port, and folder name are customer-specific, and analytical dimensions on GL entries vary by customer configuration.

How Procurify works

Procurify is a cloud procurement platform managing purchase requests, orders, requisitions, bills, and payments. It exposes vendors, purchase orders, requisitions, order items, payments, and account codes through REST APIs (v3 preferred, v2 still active) with OAuth2 client credentials. Tokens last 24 hours and every request requires an Authorization bearer token plus the X-Procurify-Client header. Procurify has no webhooks or push notifications, so ml-connector polls using time-based filters such as last_modified and po_created_date. The API is marked evolving and subject to change. Order items and payments are read-only. Purchase orders are generated from approved requisitions and order items, not created directly.

What moves between them

Purchase orders and requisitions flow from Procurify into Sage X3. ml-connector polls Procurify for new and updated purchase orders and requisitions since the last sync, maps Procurify vendors to Sage X3 suppliers, and creates corresponding purchase order records in X3. Requisitions and order-item records sync at the cadence you set, typically daily or on-demand. GL account mappings and cost-code allocations are configured per customer to land spending on the correct Sage X3 dimensions.

How ml-connector handles it

ml-connector stores both OAuth2 credential sets encrypted and alternates between Sage X3's GraphQL and REST paths depending on your X3 version and auth setup (Basic auth for REST api1, JWT bearer for GraphQL). Because Sage X3 access tokens expire in 5 minutes, ml-connector proactively refreshes before expiry using the 30-day refresh token, avoiding token-timeout failures mid-sync. On the Procurify side it manages the 24-hour token lifecycle and includes the required X-Procurify-Client header on every call. Vendors and cost codes are mapped first so purchase orders land on valid X3 suppliers and dimensions. Since both systems are pull-only, ml-connector polls on your schedule and tracks the last sync timestamp to detect changes via Procurify's last_modified and Sage X3's updatedDate fields. Requisitions that cannot be converted to purchase orders (missing vendor match, invalid cost code, data incomplete) are logged with the record ID and reason so you can review and reprocess.

A real-world example

A mid-sized distributor runs Sage X3 on-premise for finance and inventory, and uses Procurify as a self-service procurement portal for department requisitions. Before the integration, when a requisition was approved in Procurify, the procurement team exported it and manually created a matching purchase order in Sage X3, a process that was error-prone and delayed orders by a day. With Sage X3 and Procurify connected, approved requisitions flow into X3 automatically each hour as purchase orders, mapped to the correct supplier and cost center. The procurement team spends 3 hours per week less on data entry, and orders reach suppliers the same day they are approved.

What you can do

  • Sync approved purchase orders and requisitions from Procurify into Sage X3 purchase order records on your schedule.
  • Map Procurify vendors to Sage X3 suppliers and allocate spending to the correct cost codes and GL dimensions.
  • Handle Procurify's OAuth2 token lifecycle (24-hour expiry) and Sage X3's dual auth paths (GraphQL and REST api1) with automatic token refresh.
  • Log requisitions that cannot be converted to purchase orders with the reason so they can be reviewed and reprocessed.
  • Poll both systems using time-based change detection (Procurify last_modified, Sage X3 updatedDate) to detect changes since the last sync.

Questions

Which direction does data move between Sage X3 and Procurify?
Purchase orders and requisitions flow from Procurify into Sage X3. ml-connector polls Procurify for new and updated orders, maps vendors and cost codes to X3 dimensions, and creates matching purchase order records in Sage X3. GL accounts and cost codes are aligned in both directions so spending lands on the correct dimensions, but sourcing and approval remain in Procurify.
How does ml-connector handle Sage X3's 5-minute access token expiry?
ml-connector proactively refreshes Sage X3 access tokens before they expire, using the 30-day refresh token to obtain a new bearer token or session. This prevents mid-sync failures if a request takes longer than expected or if polling takes multiple API calls. Token refresh is silent and requires no manual intervention.
What happens when a requisition in Procurify cannot be converted to a Sage X3 purchase order?
If a requisition is missing a vendor match in Sage X3, has an invalid cost code, or contains incomplete data, ml-connector logs the record ID and the specific reason (e.g. 'Vendor not found in Sage X3 supplier master'). You can then review the issue, correct the requisition or add the missing dimension, and ml-connector will reprocess it on the next sync run.

Related integrations

Connect Sage X3 and Procurify

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

Get started