ml-connector
Wave AccountingDeel

Wave Accounting and Deel integration

Wave Accounting tracks your invoicing and expenses. Deel manages your global payroll, contractors, and workforce across 150+ countries. Connecting them keeps your financial records in Wave synchronized with your payroll and contractor management in Deel. Invoice data flows from Wave to Deel for record-keeping, while employee and contractor costs can feed back into Wave to give you a complete view of labor spend by cost center or project.

How Wave Accounting works

Wave Accounting is a cloud-based accounting platform offering invoicing, expense tracking, chart of accounts, and transaction management. It exposes business records, customers, invoices, products, accounts, transactions, vendors, and sales taxes through a GraphQL API at https://gql.waveapps.com/graphql/public. Authentication uses OAuth2 Authorization Code Flow with 2-hour access tokens and refresh tokens (requires offline_access scope). Wave requires an active Pro subscription to access third-party APIs. Invoices emit webhooks on creation, update, payment, and deletion; customers, products, and transactions also trigger webhook events. Every webhook includes an HMAC-SHA256 signature that must be verified with a 5-minute replay window, and Wave retries failed deliveries until it receives HTTP 200.

How Deel works

Deel is a global workforce platform covering employer-of-record (EOR), contractor management, payroll, and HRIS across 150+ countries. It exposes contracts, people, invoices, worker invoices, payslips, onboarding records, and payroll inputs through REST APIs at https://api.letsdeel.com/rest/v2 (production) or the sandbox endpoint. Authentication uses bearer tokens (API tokens with no expiry or fine-grained scopes) or OAuth2 with 30-day access tokens and 90-day refresh tokens. Deel requires the x-client-id header on OAuth2 calls. Webhooks cover contract, employee, and payroll events with HMAC-SHA256 signature verification on the raw request body. Idempotency-Key headers (UUID v4, 24-hour TTL) are supported for POST and PATCH operations. Deel enforces rate limits and returns HTTP 429 with a Retry-After header.

What moves between them

Invoices and payments flow from Wave to Deel for centralized payment tracking and contractor billing reconciliation. Wave invoice webhooks trigger ml-connector to write invoice records into Deel's accounting system. Employee cost data, payslips, and payroll inputs from Deel can be queried to populate Wave's expense accounts and cost allocations, linking payroll spend to the chart of accounts on a scheduled basis. The direction and cadence depend on your workflow: Wave-to-Deel for invoice ingestion, Deel-to-Wave for payroll cost rollup.

How ml-connector handles it

ml-connector stores Wave OAuth2 credentials and refreshes the 2-hour access token before each request. It validates incoming Wave webhook signatures using HMAC-SHA256 with a 5-minute replay window to prevent replay attacks. On the Deel side, ml-connector presents either a bearer token or OAuth2 credentials with the required x-client-id header, refreshes tokens before expiry, and includes an Idempotency-Key on POST and PATCH operations to prevent duplicate contractor invoices or payroll adjustments. Wave invoices are translated to Deel's invoice schema, mapping customer names and invoice amounts to Deel's contract and worker-invoice entities. Deel employee and contract records are mapped back to Wave transaction records and expense accounts. Because Wave and Deel use different rate-limiting schemes, ml-connector respects both Deel's 429 Retry-After header and Wave's implicit rate limits, implementing exponential backoff. Every record carries a full audit trail so failed payroll syncs or invoice mismatches can be replayed.

A real-world example

A small services firm uses Wave Accounting for invoicing clients and tracking operating expenses, and hires contractors worldwide through Deel for project-based work. Previously, the finance team manually tracked Deel contractor invoices in a spreadsheet and reconciled them against Wave's expense accounts once a month, a process that often surfaced discrepancies and delayed payment approvals. With Wave and Deel connected, contractor invoices automatically flow from Deel into Wave's accounts payable, mapped to the correct cost center or project code. Payroll and contractor costs roll up automatically into Wave's chart of accounts on a weekly basis, so the finance team always sees current labor spend without manual re-entry.

What you can do

  • Sync Wave invoices into Deel for centralized contractor invoice tracking and payment reconciliation.
  • Map Wave customers to Deel contracts so invoice amounts are allocated to the correct contractor or cost center.
  • Flow Deel payslips and payroll inputs back into Wave to populate expense accounts and automate labor cost allocation.
  • Refresh Wave OAuth2 access tokens (2-hour expiry) and Deel bearer or OAuth2 tokens automatically before each request.
  • Verify webhook signatures from both systems (HMAC-SHA256) and implement exponential backoff on rate limits from Deel and Wave.

Questions

Which direction does data move between Wave Accounting and Deel?
Invoices and payments flow from Wave to Deel for contractor billing and payment tracking. Employee cost data, payslips, and payroll inputs flow from Deel back to Wave to automate expense account updates and labor cost allocation. The two directions work independently so you can enable either flow based on your workflow.
How does ml-connector handle Wave's 2-hour OAuth2 token expiry and Deel's refresh token rotation?
ml-connector refreshes Wave access tokens before each GraphQL call and caches the token until expiry is near. For Deel, it refreshes OAuth2 tokens before each REST call and tracks 90-day refresh token expiry. API tokens (if used) do not expire, so token refresh is skipped. Both systems are kept current without manual intervention.
What happens if an invoice fails to sync from Wave to Deel?
Every invoice and payroll record carries a full audit trail. ml-connector logs the failure with the Wave invoice ID, Deel error response, and timestamp. You can replay the sync once the issue is resolved, and the Idempotency-Key header on Deel ensures the retry does not create a duplicate invoice. Rate-limit errors (HTTP 429) trigger automatic exponential backoff.

Related integrations

Connect Wave Accounting and Deel

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

Get started