Get real-time Slack alerts when invoices are viewed, paid, or overdue. Keep your team in the loop without checking the Workify dashboard constantly.
A Slack notification system that posts messages to a channel whenever key invoice events happen in Workify — invoice viewed by client, payment received, invoice overdue, or new invoice created.
Knowing the moment a client opens your invoice changes how you follow up. Instead of chasing after 7 days of silence, you can reach out with "Just checking you received my invoice" the same afternoon they open it. And when payments land, your whole team knows instantly — no need to log in to check.
#invoicing or #payments)https://hooks.slack.com/services/T.../B.../...In Workify:
invoice.viewed — client opened the invoice emailinvoice.paid — payment recordedinvoice.overdue — invoice passed due dateinvoice.created — new invoice createdWorkify's webhook payload needs to be formatted as a Slack message before forwarding. Use one of these approaches:
{
"text": "{{if(trigger.event == 'invoice.paid'; '💰 Payment received'; if(trigger.event == 'invoice.viewed'; '👀 Invoice opened'; if(trigger.event == 'invoice.overdue'; '⚠️ Invoice overdue'; '📄 New invoice')))}}: *{{trigger.data.invoice_number}}* — {{trigger.data.client_name}} — {{trigger.data.total}}",
"unfurl_links": false
}
For zero latency and no third-party dependency, deploy a tiny worker that receives Workify webhooks and formats them for Slack:
const EVENT_LABELS: Record<string, string> = {
'invoice.paid': '💰 Payment received',
'invoice.viewed': '👀 Invoice opened by client',
'invoice.overdue': '⚠️ Invoice overdue',
'invoice.created': '📄 New invoice created',
}
export default {
async fetch(request: Request, env: any): Promise<Response> {
const body = await request.json() as any
const label = EVENT_LABELS[body.event] ?? body.event
const inv = body.data
const message = {
blocks: [
{
type: 'section',
text: {
type: 'mrkdwn',
text: `*${label}*\n*Invoice:* ${inv.invoice_number}\n*Client:* ${inv.client_name}\n*Amount:* ${inv.total}`,
},
},
],
}
await fetch(env.SLACK_WEBHOOK_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(message),
})
return new Response('ok')
},
}
Set SLACK_WEBHOOK_URL as a secret in your worker environment.
In Workify, go to Settings → Webhooks, find your webhook, and click Send test. A test message should appear in your Slack channel within a few seconds.
Slack's Block Kit lets you create rich, interactive messages. Here's a more detailed format for payment notifications:
{
"blocks": [
{
"type": "header",
"text": { "type": "plain_text", "text": "💰 Payment received" }
},
{
"type": "section",
"fields": [
{ "type": "mrkdwn", "text": "*Client:*\n{{client_name}}" },
{ "type": "mrkdwn", "text": "*Amount:*\n{{total}}" },
{ "type": "mrkdwn", "text": "*Invoice:*\n{{invoice_number}}" },
{ "type": "mrkdwn", "text": "*Paid on:*\n{{paid_at}}" }
]
}
]
}
You can create multiple Workify webhooks pointing to different Slack channels:
| Workify Event | Slack Channel |
|---|---|
invoice.paid | #payments |
invoice.overdue | #chasing |
invoice.viewed | #sales |
invoice.created | #invoicing |
Each webhook in Workify can subscribe to specific events, so you only get relevant messages in each channel.
<!subteam^ID>) in overdue notifications to ping the right account managerinvoice.viewed channel overnight — knowing a client opened your invoice at 11pm can wait until morningGet your Workify API key and start building in minutes. Pro plan includes full API and webhook access.