ml-connector
Wave AccountingJira

Wave Accounting and Jira integration

Wave Accounting handles invoicing and expense tracking for your business, while Jira keeps your team's work organized. Connecting the two lets you track billing events and customer activity directly in Jira without manual entry. When an invoice is created, sent, or marked paid in Wave, an issue appears in Jira automatically, and your team stays in sync with the business state.

How Wave Accounting works

Wave Accounting is a cloud-based accounting platform that exposes invoices, customers, products, transactions, vendors, and sales taxes through a GraphQL API at https://gql.waveapps.com/graphql/public. Authentication uses OAuth 2.0 with 2-hour access tokens and refresh tokens, and requires an active Wave Pro subscription. Wave sends webhooks for invoice lifecycle events (created, updated, paid), payments, customer changes, transactions, and product updates. Webhook delivery includes HMAC-SHA256 signature verification with a 5-minute replay window, and Wave retries failed deliveries until it receives an HTTP 200 response.

How Jira works

Jira is Atlassian's issue and project tracking platform that exposes issues, projects, worklogs, sprints, and custom fields through a REST API. Authentication supports OAuth 2.0 (recommended) or Basic auth with email and API token. Jira webhooks are registered via REST and fire on issue lifecycle events, comments, worklogs, sprints, and project changes, with events including issue_created, issue_updated, issue_deleted, and 20+ others. Jira webhooks expire after 30 days and must be refreshed to remain active, and signature verification uses HMAC-SHA256 in the X-Hub-Signature header. Jira has no native invoices, purchase orders, or accounting fields, so integration is one-way notification or workflow-driven only.

What moves between them

Data flows from Wave into Jira one direction. When an invoice is created, updated, or marked paid in Wave, ml-connector receives the webhook and creates a new Jira issue or updates an existing one with the invoice number, customer name, amount, and status. Customer creation and update events from Wave can similarly trigger Jira issues for business development or account tracking. Payments received can create Jira worklog entries to track when cash arrives. The sync runs in real time as Wave webhooks fire, and Wave retries failed webhook deliveries until a successful HTTP 200 response is received.

How ml-connector handles it

ml-connector listens for Wave webhook events at a registered endpoint and validates each delivery using the HMAC-SHA256 signature in the x-wave-signature header, rejecting unsigned or expired payloads. For each invoice event, it extracts the invoice number, customer, amount, and status from the Wave GraphQL payload. It then constructs a Jira issue using the REST API, mapping Wave invoice state (created, approved, sent, paid) to Jira issue status transitions, and storing the Wave invoice ID as a custom field so subsequent updates find the right Jira issue to modify. The integration handles Wave's short access token expiry (2 hours) by refreshing the OAuth token whenever a call fails with a 401 response, and it backs off and retries when Wave or Jira rate limits are hit. Because Jira webhooks expire after 30 days, ml-connector runs a periodic refresh job to call PUT /rest/api/3/webhook/refresh before expiry, preventing the webhook from going stale.

A real-world example

A growing consulting firm uses Wave Accounting to manage client invoices and expenses, and Jira to track project work and delivery tasks. Before the integration, the project manager manually created Jira issues when invoices were sent or paid so the team could see cash flow alongside project status. With Wave and Jira connected, each new invoice in Wave automatically creates a Jira issue in the Billing project, the team sees invoices appear in their workflow dashboard, and payment notifications keep everyone aligned on which clients have settled up. Month-end financial review is faster because the billing issues already link project work to the invoices they generated.

What you can do

  • Create Jira issues automatically when Wave invoices are created, updated, or marked paid.
  • Map Wave invoice status changes to Jira issue transitions so billing state flows into your team's workflow.
  • Store Wave invoice numbers and customer details in Jira custom fields for traceability and linking.
  • Handle Wave OAuth token refresh and Jira webhook expiry renewal to keep the sync active.
  • Receive Wave invoice and customer webhooks with signature verification and automatic retry on failure.

Questions

Does the integration send Jira data back to Wave Accounting?
No, the integration is one-way from Wave to Jira. Wave invoices and payments trigger Jira issues, but Jira has no native financial entities, so there is nothing to send back to Wave. The sync is notification and workflow-driven, not bidirectional.
How does ml-connector handle Wave OAuth token expiry and Jira webhook expiry?
Wave access tokens expire after 2 hours, so ml-connector refreshes the token whenever a GraphQL call returns a 401 response. Jira webhooks expire after 30 days from creation or last refresh, so ml-connector runs a periodic job to call PUT /rest/api/3/webhook/refresh before expiry, keeping the webhook active without interruption.
What happens if a Wave invoice webhook delivery fails?
Wave retries failed webhook deliveries automatically until it receives an HTTP 200 response. ml-connector validates the HMAC-SHA256 signature in the x-wave-signature header and returns 200 only after it has successfully created or updated the corresponding Jira issue. If Jira is temporarily unavailable, ml-connector returns a 5xx error and Wave retries the delivery until success.

Related integrations

Connect Wave Accounting and Jira

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

Get started