INTEGRATION · DISCORD
PostKnock in Discord
Stream postcard deliveries, QR scans and call outcomes into a Discord channel with a channel webhook. No bot, no OAuth scopes.
Connect Discord
No developer required — this is all point and click.
-
1
Open your server settings
In Discord, select the server name, then Server Settings. You need Manage Webhooks permission — server owners and admins have it by default.
-
2
Go to Integrations › Webhooks
Choose Integrations in the sidebar, then Webhooks.
-
3
Create the webhook
Select New Webhook. Give it a name your team will recognise, such as “PostKnock”, and choose the channel it should post to. You can set an avatar here too.
-
4
Copy the webhook URL
Select Copy Webhook URL. It starts
https://discord.com/api/webhooks/. Anyone with this URL can post to the channel, so keep it out of shared documents. -
5
Add it to PostKnock
In PostKnock open Admin › Webhooks › New webhook, set the format to Discord, and paste the URL. PostKnock validates that it is a genuine Discord webhook address before saving.
-
6
Choose events and send a test
Tick the events you want, save, then select Test. A formatted embed should appear in the channel within a few seconds.
Every event you can subscribe to
Pick the ones you want per webhook, or subscribe to all of them with *. Each event carries the fields listed here inside data.
| Event | Fires when | data fields |
|---|---|---|
| postcard.sent | A postcard was handed to the print partner and mailed. | campaign_id, contact_id, wave_number, lob_id |
| postcard.in_transit | The postal service scanned the piece in transit. | campaign_id, contact_id, wave_number, lob_id |
| postcard.delivered | Delivery confirmed. Never presumed — only a real carrier confirmation fires this. | campaign_id, contact_id, wave_number, lob_id, delivered_date |
| postcard.failed | The piece failed or came back as return-to-sender. | campaign_id, contact_id, wave_number, lob_id, reason |
| call.scheduled | A follow-up call was queued for a contact. | campaign_id, contact_id, wave_number, scheduled_for |
| call.completed | A call was completed and its outcome recorded. | campaign_id, contact_id, wave_number, call_result, contact_type, duration_seconds |
| call.no_answer | A call rang out or the line was unavailable. | campaign_id, contact_id, wave_number |
| contact.responded | A contact scanned the QR code on their postcard. | contact_id, campaign_id, method, tracked_url_id |
| contact.unsubscribed | A contact was marked do-not-contact. | contact_id, reason |
| campaign.activated | A campaign started sending. | campaign_id, name, total_contacts |
| campaign.completed | Every wave finished, or someone marked the campaign complete. | campaign_id, name |
| campaign.paused | A campaign paused — by request, or automatically on a low wallet balance. | campaign_id, name, reason |
| touchpoint.failed | An individual postcard or email touchpoint failed. | campaign_id, contact_id, touchpoint_type, reason |
IDs in data are the same per-account IDs you see in the PostKnock URL bar, so campaign_id: 7 is the campaign at /campaigns/7.
Want the raw JSON instead?
The Discord format posts a message written for humans reading a channel. If you would rather receive the signed JSON envelope and handle it in your own code, use a Generic webhook — same events, full payload, HMAC signature included.
Questions
Do I need a bot or OAuth scopes? +
What does the message look like? +
Can I use one webhook for several channels? +
Messages stopped arriving. +
Direct mail your other tools can see
Send postcards and follow-up calls from PostKnock, and stream every delivery, scan and call outcome straight into the tools your team already watches.
Start freeOutbound webhooks are included with PostKnock Pro.