Set up and test a webhook
Send board activity to Make, n8n, Zapier, or your own server.
- Create a webhook trigger in the receiving tool and copy its public
https://URL. - In featurevote, open Settings → Integrations and click Set up next to Webhooks.
- Paste the URL, select the events you want, and click Save webhook.
- Choose an event next to Send test and send a test for every event you use so your tool can learn its fields.
The Webhooks row shows the last delivery and its status code.
Connect your receiving tool
Make → Google Sheets
Create a scenario with Webhooks → Custom webhook and copy its address. Save it in featurevote with New request selected, then send a test. In Make, choose Redetermine data structure if prompted and add Google Sheets → Add a row. Map columns to fields such as data.request.title and data.request.url.
n8n
Start with a Webhook node using POST and its production URL. Send a featurevote test while the node is listening.
Zapier
Use Webhooks by Zapier → Catch Hook and paste its link into featurevote. This requires a paid Zapier plan.
Your own server
Accept a JSON POST, verify its signature, and return any 2xx status within 10 seconds.
Available events
| Event | When it is sent |
|---|---|
request.created | A request is posted on the board or in Discord, added in featurevote, or created from a message. Requests awaiting approval are included with status pending_approval. |
comment.created | A visitor or team member comments on a request in featurevote. |
request.vote_milestone | A request reaches 5, 10, 25, 50, or 100 voters. |
request.shipped | You mark a request done and choose to notify its voters. |
message.received | Someone sends your team a private message from the board. |
Changes made through an AI client (MCP) do not generate webhook events yet.
Understand message fields
Messages share an envelope with id, type, timestamp, and data. Request events share the same request object, so mappings can be reused.
Additional event fields in data are:
comment.created:comment, containingid,text,internal, andauthor.request.vote_milestone:milestone, the vote count reached.message.received:message, containingid,text, andauthor, instead ofrequest.
votes counts people rather than weighted votes. Missing author names and emails are null. Text fields are truncated at 5,000 characters. Messages can include submitted names and email addresses, so send them only to a tool you trust with that information.
Verify webhook signatures
Messages use Standard Webhooks signatures. Use one of its libraries to verify incoming messages.
Each request includes:
webhook-id: the message ID; use it to skip messages already handled.webhook-timestamp: a timestamp in seconds.webhook-signature: a signature in the formv1,<signature>.
Retrieve your signing secret with Copy signing secret on the webhook card. Removing the webhook and adding it again generates a new secret.
Delivery limits and failures
Each event is sent once. Failed messages are not retried; check the webhook card for the failure reason. The receiving tool must answer within 10 seconds. Redirects are not followed, and the destination must be a public https:// URL.