The payment method has expired. Access remains active during the grace period.
Customers and revenue / BLOCK KIT JSON
Make a failed payment actionable with the reason, next retry, and customer follow-up owner.
Blank optional fields are omitted. Fallback text updates with your fields.
Approximate Slack rendering. Buttons are visual previews; no actions are sent.
Local validation checks the supported schema. It does not guarantee Slack API acceptance.
Manual editing and validation run in your browser. Opening Slack’s Builder shares the message with Slack.
Payment failed · Follow-up needed Fieldwork Studio’s renewal could not be collected. The payment method has expired. Access remains active during the grace period. Amount due: USD 240.00 Attempt: 1 of 3 Next retry: 23 Oct 2026 · 09:00 UTC Follow-up owner: Alex Rivera INV-2026-1084 · Check recent outreach before contacting the customer. Review billing: https://example.com/billing/customers/AC-1084
Download the payload or use this command in your own terminal. Replace the placeholder URL with your Slack incoming webhook. Keep the real URL secret. This tool never sends a Slack message.
curl --request POST \
--header 'Content-Type: application/json' \
--data-binary @- \
'https://hooks.slack.com/services/YOUR/WEBHOOK/URL' <<'SLACK_MESSAGE_JSON'
{
"text": "Payment failed · Follow-up needed\nFieldwork Studio’s renewal could not be collected.\nThe payment method has expired. Access remains active during the grace period.\nAmount due: USD 240.00\nAttempt: 1 of 3\nNext retry: 23 Oct 2026 · 09:00 UTC\nFollow-up owner: Alex Rivera\nINV-2026-1084 · Check recent outreach before contacting the customer.\nReview billing: https://example.com/billing/customers/AC-1084",
"blocks": [
{
"type": "header",
"text": {
"type": "plain_text",
"text": "Payment failed · Follow-up needed"
}
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*Fieldwork Studio’s renewal could not be collected.*\nThe payment method has expired. Access remains active during the grace period."
}
},
{
"type": "section",
"fields": [
{
"type": "mrkdwn",
"text": "*Amount due*\nUSD 240.00"
},
{
"type": "mrkdwn",
"text": "*Attempt*\n1 of 3"
},
{
"type": "mrkdwn",
"text": "*Next retry*\n23 Oct 2026 · 09:00 UTC"
},
{
"type": "mrkdwn",
"text": "*Follow-up owner*\nAlex Rivera"
}
]
},
{
"type": "context",
"elements": [
{
"type": "mrkdwn",
"text": "INV-2026-1084 · Check recent outreach before contacting the customer."
}
]
},
{
"type": "divider"
},
{
"type": "actions",
"elements": [
{
"type": "button",
"text": {
"type": "plain_text",
"text": "Review billing"
},
"action_id": "billing",
"url": "https://example.com/billing/customers/AC-1084",
"style": "primary"
}
]
}
]
}
SLACK_MESSAGE_JSONAlert your billing team when a subscription payment needs attention. Clear retry timing helps prevent duplicate outreach, and the summary distinguishes a temporary failure from a terminal payment problem.
Use a customer-safe failure reason from your payment processor. Set the next retry from your actual billing policy; do not invent a date. Remove the retry field if automatic retries are disabled.
Trigger after verifying the payment event. Keep payment recovery links inside your authenticated billing tool. This message neither retries the charge nor contacts the customer.
To post this JSON, create a Slack app with an incoming webhook for your channel, or use chat.postMessage with the appropriate bot token and permissions. Keep credentials on your server.
For buttons, enable Interactivity and handle Slack’s interaction requests, including URL buttons. Acknowledge requests promptly. This preview does not execute actions, authorize users, or save decisions.
Use the top-level fallback text for notifications and accessibility. Test your final payload in Slack; local validation covers the declared subset, and visual details vary by client.
Slack interaction setup ↗