Post every successful Stripe payment to Hash.
This workflow receives Stripe webhooks through window.genmb.webhooks.handler, verifies the signature before acting, extracts the customer name and amount, then posts a clear Hash message for your revenue channel.
Stripe event
Maya Chen paid $284.00
payment_intent.succeeded · 2026-06-10 14:32 UTC
Hash message to #payments
Stripe payment received
Customer: Maya Chen
Amount: $284.00
Receipt: rcpt_acme_studio_4821
Workflow setup
Configure the verified Stripe trigger and Hash destination
Point Stripe at the generated function endpoint. The production handler uses GenMB Webhooks to verify the Stripe signature before posting to Hash.
1. Stripe trigger
Signature-verified payment success event
2. Message fields
Customer and amount
Webhook endpoint
Connect Stripe to GenMB Webhooks
In production, add SLACK_WEBHOOK_URL as an environment variable. Stripe signatures are verified by the GenMB Webhooks SDK before the Hash request is sent.
Verified deliveries
Incoming Stripe events
No verified deliveries yet
Once Stripe sends a signed payment webhook to the endpoint, the function verifies it and posts the customer name and amount to Hash.
Generated Hash payload
Review before connecting production
{
"channel": "#payments",
"text": "New Stripe payment received: Maya Chen paid $284.00. Receipt rcpt_acme_studio_4821.",
"blocks": [
{
"type": "header",
"text": {
"type": "plain_text",
"text": "Stripe payment received"
}
},
{
"type": "section",
"fields": [
{
"type": "mrkdwn",
"text": "*Customer*\nMaya Chen"
},
{
"type": "mrkdwn",
"text": "*Amount*\n$284.00"
},
{
"type": "mrkdwn",
"text": "*Event*\npayment_intent.succeeded"
},
{
"type": "mrkdwn",
"text": "*Receipt*\nrcpt_acme_studio_4821"
}
]
}
]
}Function handler
Webhook SDK integration
export async function POST(request) {
return window.genmb.webhooks.handler('stripe', request, async ({ event }) => {
if (event.type === 'payment_intent.succeeded') {
const payment = event.data.object;
const customer = payment.billing_details?.name || payment.metadata?.customer_name || 'Unknown customer';
const amount = new Intl.NumberFormat('en-US', { style: 'currency', currency: payment.currency.toUpperCase() }).format(payment.amount_received / 100);
await fetch(globalThis.SLACK_WEBHOOK_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ text: `New Stripe payment received: ${customer} paid ${amount}.` })
});
}
return Response.json({ ok: true });
});
}