Discord action

Send Stripe events to Discord without Zapier

Drop a Discord step into any Stripe Workflow. Templated messages, channel routing, retries that won't double-post. One flat monthly fee.

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

The problem

Every Stripe team eventually wants a channel where each paid invoice pings. The usual setup is a Zapier zap from a Stripe webhook into a Discord webhook, billed per task. It works fine until something retries: you get duplicate pings, the formatter step you forgot you wrote starts dropping fields, and the Zapier bill keeps scaling with revenue instead of headcount.

The Discord action puts this inside the Stripe Dashboard. Add it as a step in a Stripe Workflow, paste a channel webhook URL, write a JSONata message body, and you're done. Outbound dedupes on Stripe's invocation id, so a 5xx retry only posts once. Pricing is a flat monthly fee — same number whether you do ten paid invoices a month or ten thousand.

How the Discord action works

  1. 1

    Install Outbound from the Marketplace

    One click from the Stripe App Marketplace. The Discord action shows up as a step type in the Workflow builder the next time you open it. There is no separate account to set up and no API keys to shuffle around.
  2. 2

    Add a Discord webhook URL

    Create a webhook in your Discord server settings, paste the URL into the action config. Outbound stores it encrypted at rest. You can configure one webhook per workflow or share across many.
  3. 3

    Template the message with JSONata

    Reference any field on the triggering Stripe event: {{customer.email}}, {{invoice.amount_paid}}, {{charge.dispute.reason}}. JSONata gives you conditionals, arithmetic, and currency formatting without leaving the field.
  4. 4

    Publish the workflow

    Stripe Workflows handles the trigger side. Outbound takes care of delivery, retry on 5xx, and dedup on the Stripe invocation id. The execution log records every Discord post with its status code and the matching Stripe event.
trigger:
  event: invoice.paid
steps:
  - action: outbound.discord
    config:
      webhook_url: ${DISCORD_WEBHOOK}
      content: |
        ka-ching — {{customer.email}} just paid
        amount: ${{invoice.amount_paid / 100}}
        plan: {{invoice.lines.data[0].description}}
        link: https://dashboard.stripe.com/invoices/{{invoice.id}}
      username: stripe-bot

Example workflow configuration

Screenshot of the Stripe Workflow builder showing a Discord action step. The right-hand config panel shows fields for webhook URL, message content with JSONata template placeholders like customer.email and invoice.amount_paid, and a username override. A small Outbound logo sits in the step header.

The Discord action sits next to Stripe's native Slack step in the Workflow builder.

Outbound vs Zapier

OutboundZapier
Lives inside the Stripe Dashboard
Pricing modelFrom $19/mo flatPer-task billing
Idempotent on Stripe invocation id
Setup time≈2 minutes10–20 minutes
Templating languageJSONataZapier formatter steps
Execution log scoped to one Stripe account
Separate vendor account required

Frequently asked questions

Does this support Discord threads or just channels?+
Channels are first-class via the webhook URL. To post into a specific thread, append ?thread_id= to the webhook URL — Discord supports it natively and Outbound passes it through. We do not currently create threads for you, but that’s on the roadmap.
What happens if Discord rate-limits us?+
Discord returns a 429 with a retry-after header. Outbound respects it, queues the message, and retries after the indicated delay. The execution log shows the rate-limit event so you can see if you’re consistently hitting the ceiling.
Can I send rich embeds, not just plain content?+
Yes. The action accepts the full Discord webhook payload schema — content, embeds, username, avatar_url, allowed_mentions. Everything is JSONata-templated, so an embed title can pull from {{invoice.id}} and a color can be conditional on amount.
How do I avoid duplicate pings on retry?+
Stripe Workflows re-fires the whole invocation on a 5xx. Outbound dedupes on the Stripe invocation id before posting to Discord, so even if your workflow re-runs, the Discord message goes out exactly once.
Can I route different events to different channels?+
Yes. Either build separate workflows per channel, or use one workflow with a conditional step before the Discord action. The webhook_url field is itself JSONata-templated, so it can resolve based on event type or amount thresholds.