Linear action

Create Linear issue from Stripe events

Turn disputes, failed payments, and cancellations into triaged Linear issues. The right team, the right project, the right assignee, filed the moment the Stripe event fires.

Free trial · From $19/mo · No credit card required

The problem

Disputes don't wait. A chargeback at 11pm Friday needs to be sitting in front of whoever owns Trust & Safety on Monday morning, not in someone's inbox. The usual answer is a Zapier zap that calls Linear's API off a Stripe webhook. It looks fine in a demo. In production it loses attachments, posts duplicate issues when something retries, and ends up in a Linear project nobody's opened in six months.

The Linear action treats this as the workflow it actually is. Configure the team, the project, the label set, a default assignee, and JSONata-templated title and description. When the Stripe event fires, the issue appears in Linear with the dispute reason, customer email, invoice link, amount, evidence due date, and a back-link to the Stripe Dashboard. Outbound dedupes on the Stripe invocation id, so one event produces one issue even on retry.

How the Linear action works

  1. 1

    Connect Linear via OAuth

    Click Connect Linear during Outbound install. Choose the workspace and which teams to expose. The token is stored scoped, and Outbound reads your teams, projects, labels, and members so the config UI offers them as dropdowns.
  2. 2

    Configure team, project, labels

    Pick the team to file into, the project (or none), labels to apply, priority, and a default assignee. Each one can be a static choice or a JSONata expression that resolves against the Stripe event at run time.
  3. 3

    Template title and description

    Use JSONata to compose a useful title (e.g., Dispute on {{charge.dispute.amount}} from {{customer.email}}) and a Markdown description with the evidence link, dispute reason, and a back-link to the Stripe Dashboard.
  4. 4

    Publish the workflow

    Drop the Linear action onto any Stripe Workflow. The issue lands in Linear within a few seconds of the Stripe event, already scoped and assigned. The execution log shows the Linear issue identifier so you can jump straight to it.
trigger:
  event: charge.dispute.created
steps:
  - action: outbound.linear
    config:
      team: trust-safety
      project: disputes
      labels: [dispute, urgent]
      priority: 1
      assignee_email: ops-rotation@acme.com
      title: "Dispute ${{charge.dispute.amount / 100}} — {{customer.email}}"
      description: |
        Reason: {{charge.dispute.reason}}
        Evidence due: {{$fromMillis(charge.dispute.evidence_details.due_by * 1000)}}
        Stripe: https://dashboard.stripe.com/disputes/{{charge.dispute.id}}

Example workflow configuration

Screenshot of the Linear action panel inside the Stripe Workflow builder. Shows dropdown selectors for team, project, label chips, a priority selector, an assignee picker showing team member avatars, and JSONata-templated title and description fields with placeholders highlighted in cyan.

Configure team, project, labels, and priority once — every dispute lands in Linear pre-triaged.

Outbound vs Zapier

OutboundZapier
Lives inside the Stripe Dashboard
Pricing modelFrom $19/mo flatPer-task billing
Idempotent on Stripe invocation id
Dynamic team/project/assignee via templatinglimited
Setup time≈3 minutes15–25 minutes
Back-link to Stripe Dashboard built in
Separate vendor account required

Frequently asked questions

Can I assign the issue based on the dispute reason or amount?+
Yes. The assignee field accepts JSONata. A common pattern is a ternary on amount — anything above $1,000 goes to the senior on rotation, smaller ones go to the queue. Same goes for priority, labels, and project.
What happens if the same dispute fires the webhook twice?+
Outbound dedupes on Stripe’s invocation id before calling Linear’s API. So even if Stripe re-fires after a 5xx, you get exactly one Linear issue per dispute. If you need an explicit cross-event dedupe (e.g., per dispute id), set an upsert key in the config.
Can I add comments to an existing issue instead of creating a new one?+
Yes. The action supports an upsert mode keyed by a JSONata expression — say, {{charge.dispute.id}}. If a Linear issue already exists with that key, Outbound posts a comment instead of creating a new issue. Useful for evidence-update events.
Does it support sub-issues or relations?+
Sub-issues yes — set a parent issue id in the config. Generic Linear relations (blocks, blocked-by) aren’t supported in v1 because they need both issue ids to exist, but they’re on the roadmap for a follow-up step type.
Which Stripe events make sense to wire to Linear?+
Anything that needs a human: disputes, failed payments that have exhausted the retry cycle, subscription cancellations with refund requests, Radar reviews. Filing every paid invoice into Linear just creates noise.