Wave Accounting and Procurify integration
Wave Accounting manages invoicing, chart of accounts, and transaction records for small businesses. Procurify handles procurement, purchase orders, and vendor payments for mid-market teams. Connecting the two keeps your procurement and accounting systems in sync without manual re-entry. Purchase orders created in Procurify automatically flow into Wave as vendor transactions, and your vendor master data stays consistent across both platforms.
What moves between them
Purchase orders, requisitions, and approved order items flow from Procurify into Wave Accounting. Vendor records and their payment methods are synced bidirectionally to keep both platforms consistent. Transaction records representing bill payments created in Procurify appear in Wave's transaction ledger, mapped to matching vendor accounts. The sync runs on a schedule you control since Procurify does not push updates; ml-connector polls Procurify for new and modified records using date-range filters and processes them in batches.
How ml-connector handles it
ml-connector stores both credential sets encrypted and uses the Wave GraphQL endpoint to query the customer's chart of accounts and vendor list on first sync to establish the mapping. It then polls Procurify's REST API using the OAuth client credentials flow, filtering for purchase orders and bills modified since the last successful run. Each Procurify vendor is matched or created in Wave's vendor master, and each purchase order is converted to a Wave transaction record allocated to the matching vendor account. Wave webhook events (invoice.paid, payment.created) are listened for and update the Procurify bill status if the invoice originated from a synchronized PO. Procurify enforces rate limiting on excessive requests, so ml-connector backs off when timeouts occur. The integration validates that requisitions are approved before pulling them, and it handles the fact that Wave has no native accounts payable module by creating transaction records in the appropriate liability and expense accounts from your chart of accounts. Every record carries a timestamp and audit trail so successful syncs do not re-process the same data.
A real-world example
A mid-sized wholesale distributor uses Wave Accounting for invoicing and general ledger, and Procurify for purchase order and vendor payment management across multiple warehouse locations. Before the integration, the purchasing team printed approved purchase orders from Procurify and handed them to accounting, who manually created matching transaction records in Wave and reconciled vendor payments monthly. With Procurify and Wave connected, each approved purchase order automatically creates a transaction in Wave allocated to the correct vendor and expense account, payment records sync back into Wave's transaction ledger, and the accounts payable balance reconciles automatically. The accounting team eliminates manual PO entry and spends month-end close reconciling actual payments rather than chasing data re-keying errors.
What you can do
- Sync approved purchase orders and requisitions from Procurify into Wave as transaction records allocated to vendor accounts.
- Keep vendor master data consistent between Procurify and Wave by creating or updating vendor records bidirectionally.
- Map Procurify bill payments into Wave transaction records so accounts payable stays in sync with actual cash outflow.
- Handle Wave's GraphQL endpoint and Procurify's REST API with OAuth credentials for each, validating Wave webhook signatures and polling Procurify on your schedule.
- Audit every synced record with timestamps and replay capability if a downstream transaction creation fails.
Questions
- How does the integration handle Wave's GraphQL API and Procurify's REST API?
- ml-connector translates between the two API shapes. It queries Wave's GraphQL endpoint to fetch the chart of accounts and vendors, and polls Procurify's REST API using client credentials OAuth with date-range filters to find new and modified purchase orders. Purchase orders are then converted to Wave transaction records and posted via GraphQL mutation.
- Does the integration sync in both directions?
- Vendors sync bidirectionally to keep both platforms consistent. Purchase orders flow from Procurify into Wave. Payment records from Procurify appear as transactions in Wave. Wave webhook events for invoice.paid and payment.created can update the Procurify bill status if the invoice came from a synchronized PO.
- What happens since Wave has no native accounts payable module?
- ml-connector creates transaction records in your Wave chart of accounts using liability accounts (accounts payable) and expense accounts you specify during setup. Each purchase order creates a transaction record allocated to the matching vendor and expense code, so your general ledger stays current even though Wave's native module is invoicing-focused.
Related integrations
More Wave Accounting integrations
Other systems that connect to Procurify
Connect Wave Accounting and Procurify
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started