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