Integration BlueprintUse case: payment notificationsUpdated 2026-10-19

Integrating Stripe Webhooks into Slack for Payment Alerts

Integrating Stripe's payment lifecycle webhooks directly into Slack enables engineering, support, and finance teams to receive immediate transaction alerts without manual dashboard reconciliation. By capturing checkout.session.completed events and mapping them via Node.js or serverless middleware into Slack's chat.postMessage API using Block Kit, organizations eliminate notification lag and catch payment failures in real time.

Explore: Payments · Team Communication

Comparison matrix

FeatureStripeSlackEdge
Entry Pricing$0/month platform fee (2.9% + 30¢ per transaction)$0/month (Free Tier) or $8.75/user/month (Pro)Tie
API Rate Limits100 read / 100 write operations per secondTiered by method (Tier 3: 50 req/min, Tier 4: 100+ req/min)Stripe
Authentication MechanismBearer token with Secret Key (sk_live_...)Bearer token with Bot User OAuth Token (xoxb-...)Tie
Self-Hosting CapabilityNo (Fully managed PCI-compliant cloud API)No (Fully managed multi-tenant SaaS)Tie
Webhook Payload Delivery & RetriesAutomatic exponential backoff retries over 72 hours3 retries over 30 minutes for failed Event SubscriptionsStripe
Payload Signature VerificationHMAC-SHA256 signatures via Stripe-Signature headerHMAC-SHA256 signatures via X-Slack-Signature headerTie
App Ecosystem Directory700+ apps in Stripe App Marketplace2,600+ apps in Slack App DirectorySlack
Message/Event Payload CustomizationFixed JSON event metadata objects (max 50 keys, 500 chars)Rich JSON visual layout via Slack Block Kit UI frameworkSlack
Start freeTry Stripe →Try Slack →

ROI metrics

Hours saved / mo

25

Stripe / mo

$0

Slack / mo

$88

Break-even

1.2 wks

Annual savings

$16,950

Automating Stripe notifications into Slack eliminates 30 daily minutes of manual dashboard lookups for a 10-person team, delivering full break-even in 9 days.

Step-by-step setup guide

  1. 1.Create an Incoming Webhook in Slack

    Navigate to api.slack.com/apps, create an app called 'Payment Bot', enable 'Incoming Webhooks', click 'Add New Webhook to Workspace', and choose the destination channel like #sales-alerts to obtain the webhook URL.

    https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX
  2. 2.Configure Stripe Webhook Endpoint

    In the Stripe Dashboard, go to Developers > Webhooks > Add destination. Enter your intermediary middleware HTTPS URL and subscribe explicitly to the checkout.session.completed event.

    stripe webhook_endpoints create --url="https://api.yourdomain.com/stripe-webhook" --enabled-events="checkout.session.completed"
  3. 3.Verify Stripe HMAC Signature

    Extract the Stripe-Signature header and raw request body in your receiver endpoint to prevent replay attacks using the webhook signing secret (whsec_...).

    const event = stripe.webhooks.constructEvent(request.rawBody, request.headers['stripe-signature'], process.env.STRIPE_WEBHOOK_SECRET);
  4. 4.Format and Post Message to Slack

    Construct an HTTP POST request to Slack's webhook URL or chat.postMessage API using Block Kit formatting to include transaction amounts, customer email, and direct Stripe dashboard links.

    curl -X POST -H 'Content-type: application/json' --data '{"blocks":[{"type":"section","text":{"type":"mrkdwn","text":"*New Payment Received*\n*Amount:* $149.00 USD\n*Customer:* customer@example.com"}}]}' https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX
  5. 5.Test Integration with Stripe CLI

    Trigger a mock event locally via Stripe CLI to confirm that the payload forwards successfully to the designated Slack channel and returns an HTTP 200 status code.

    stripe trigger checkout.session.completed

Webhook payload example

POST https://api.yourdomain.com/webhooks/stripe-to-slack · event: checkout.session.completed

{
  "id": "evt_1O8qj2LkdIwHu7ixA3B1aB9C",
  "object": "event",
  "api_version": "2023-10-16",
  "created": 1698748800,
  "type": "checkout.session.completed",
  "data": {
    "object": {
      "id": "cs_live_a1b2c3d4e5f6g7",
      "object": "checkout.session",
      "amount_total": 14900,
      "currency": "usd",
      "customer_details": {
        "email": "alex.smith@example.com",
        "name": "Alex Smith"
      },
      "payment_status": "paid",
      "status": "complete"
    }
  }
}

Stripe: pros & cons

  • ✅ Reliable automated retries for up to 72 hours for dropped endpoints
  • ✅ Deterministic JSON schemas across all API versions and webhook types
  • ✅ Built-in CLI utility allows local tunneling without third-party tools like ngrok
  • ⚠️ 2.9% + 30¢ per-transaction processing fee reduces margins on microtransactions
  • ⚠️ You operate as the merchant of record, leaving localized VAT and sales tax management to your team

Slack: pros & cons

  • ✅ Block Kit UI provides structured, actionable alerts with buttons and overflow menus
  • ✅ Simple incoming webhook URLs allow quick prototyping without full OAuth implementations
  • ✅ Native thread support keeps transaction conversations grouped under a single alert
  • ⚠️ Free tier limits channel history to 90 days, purging historical transaction alerts
  • ⚠️ Per-seat billing cost ($8.75/user/month minimum) scales quickly across large teams

FAQ

How do I secure the endpoint against forged Stripe notifications?

Verify the Stripe-Signature header using stripe.webhooks.constructEvent() with your endpoint's specific whsec_ secret and the raw, unparsed request payload before executing any logic.

Can I post payment notifications without running an intermediary server?

No. Slack webhooks require a specific Block Kit JSON format, whereas Stripe dispatches a raw Stripe event object. You must deploy lightweight middleware (such as AWS Lambda or Cloudflare Workers) to transform the schema.

What happens if Slack returns an HTTP 429 rate limit error?

Slack incoming webhooks allow roughly 1 message per second. To prevent drops during sales spikes, return an HTTP 200 to Stripe immediately upon queuing the event to Redis, SQS, or RabbitMQ, then throttle outgoing Slack requests.

How do I route high-value payments to a separate Slack channel?

Inspect the event.data.object.amount_total property in your webhook handler. If the integer exceeds your threshold (e.g., 100000 for $1,000 USD), dispatch the payload to a VIP Slack webhook URL instead of the default channel.

Related integrations & comparisons