ml-connector
Wave AccountingProcurify

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.

How Wave Accounting works

Wave Accounting exposes businesses, customers, invoices, accounts, transactions, vendors, and sales taxes through GraphQL at https://gql.waveapps.com/graphql/public. Authentication uses OAuth 2.0 with short-lived access tokens (2 hour expiry) and refresh tokens, requiring the connected business to have an active Wave Pro subscription. Wave supports webhooks for invoice.created, invoice.updated, invoice.paid, payment.created, customer.created, customer.updated, transaction.created, product.created, and product.updated events, with HMAC-SHA256 signature verification and a 5 minute replay window. Invoices can only be created, approved, sent, or deleted - there is no patch operation. Bills and accounts payable are not exposed through the GraphQL API.

How Procurify works

Procurify exposes vendors, purchase orders, requisitions, bills, payments, account codes, locations, and departments through a customer-specific REST API (base URL https://<customer-domain>.procurify.com). Authentication uses OAuth 2.0 client credentials grant with 24-hour token lifetime, requiring Authorization Bearer header and X-Procurify-Client header on every request. Procurify API does not support webhooks or push notifications; data changes are read via polling with time-based filters on endpoints like last_modified, po_created_date, and dateModified. Purchase orders are generated from approved requisitions and order items. Order items and payment records are read-only. API access requires contacting Procurify support and is not self-serve on all plans. The API is marked evolving and subject to change.

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

Connect Wave Accounting and Procurify

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

Get started