The subscription remains active until the end of the billing period.
Customers and revenue / BLOCK KIT JSON
Record a cancellation with effective date, revenue impact, and a concise customer reason.
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.
Cancellation scheduled · Fieldwork Studio We are consolidating our internal tools this quarter. The subscription remains active until the end of the billing period. Access ends: 19 Nov 2026 · 23:59 UTC Monthly recurring revenue: −USD 240.00 Customer since: March 2025 Account owner: Alex Rivera Customer-initiated · No refund requested Review account: https://example.com/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": "Cancellation scheduled · Fieldwork Studio\nWe are consolidating our internal tools this quarter.\n\nThe subscription remains active until the end of the billing period.\nAccess ends: 19 Nov 2026 · 23:59 UTC\nMonthly recurring revenue: −USD 240.00\nCustomer since: March 2025\nAccount owner: Alex Rivera\nCustomer-initiated · No refund requested\nReview account: https://example.com/customers/AC-1084",
"blocks": [
{
"type": "header",
"text": {
"type": "plain_text",
"text": "Cancellation scheduled · Fieldwork Studio"
}
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "> We are consolidating our internal tools this quarter.\n\nThe subscription remains active until the end of the billing period."
}
},
{
"type": "section",
"fields": [
{
"type": "mrkdwn",
"text": "*Access ends*\n19 Nov 2026 · 23:59 UTC"
},
{
"type": "mrkdwn",
"text": "*Monthly recurring revenue*\n−USD 240.00"
},
{
"type": "mrkdwn",
"text": "*Customer since*\nMarch 2025"
},
{
"type": "mrkdwn",
"text": "*Account owner*\nAlex Rivera"
}
]
},
{
"type": "context",
"elements": [
{
"type": "mrkdwn",
"text": "Customer-initiated · No refund requested"
}
]
},
{
"type": "divider"
},
{
"type": "actions",
"elements": [
{
"type": "button",
"text": {
"type": "plain_text",
"text": "Review account"
},
"action_id": "customer",
"url": "https://example.com/customers/AC-1084"
}
]
}
]
}
SLACK_MESSAGE_JSONInform your retention team when a customer schedules or completes a cancellation. Separating the request date from the end of access helps the team respond without implying that service has already stopped.
Use the effective cancellation date from your subscription system. Quote the customer’s reason briefly and neutrally, and omit it if unavailable. Distinguish recurring revenue impact from an immediate refund.
Included variants: scheduled, ended. Switch variants in the editor; all versions stay on this page.
Post from your subscription lifecycle event. The account link does not reactivate a subscription, issue a refund, or contact the customer; those actions need your billing workflow.
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 ↗