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.
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
More Sage X3 integrations
Other systems that connect to Procurify
Connect Sage X3 and Procurify
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started