Linear action

Create Linear issue from Stripe events

Turn disputes, failed payments, and churn events into triaged Linear issues with the right team, project, labels, and assignee — automatically.

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

The problem

Disputes don't wait. To create Linear issue from Stripe events in time to act on them, you want filing automated, with the right team, the right labels, assigned to whoever owns Trust & Safety this rotation. A chargeback at 11pm Friday is a problem you want triaged before Monday. The standard pattern today is a Zapier zap that calls Linear's API on a stripe webhook event. It works in demos. In production it loses attachments, posts duplicate issues on retries, and gets stuck in someone's inbox under a Linear project that hasn't been used in six months.

The Linear action treats this like the workflow it actually is. You configure team, project, label set, default assignee, priority, and a JSONata-templated title and description. The trigger fires, the issue appears in Linear with full context — dispute reason, customer email, invoice link, amount, evidence due date — and a back-link to the Stripe Dashboard. Idempotent. One stripe event, one Linear issue.

How create linear issue from stripe works

  1. 1

    Connect Linear via OAuth

    Click Connect Linear in the Outbound install. Choose which workspace, which teams to expose. Outbound stores a scoped token and reads your teams, projects, labels, and members for the config UI.
  2. 2

    Configure team, project, labels

    Pick the team to file into, the project (or none), the labels to apply, the priority and default assignee. Each can be a static choice or a JSONata expression that resolves at run time off the Stripe event.
  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 trigger. The issue appears in Linear within seconds of the Stripe event, scoped and assigned correctly. 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 flat$29.99/mo + per-task fees
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?+
Disputes, failed payments after the retry cycle, subscription cancellations with refund requests, and Radar reviews that need manual eyes. Things that need a human, not a bot reply. Wiring routine paid-invoice events to Linear just creates noise.