Two building blocks
- Ozvi → your tool: add the tool's webhook URL in Ozvi (admin → Integrácie → Webhooky, format JSON). Every event arrives as one JSON body:
event,item,actor… (payload). - Your tool → Ozvi: an HTTP request to
https://ozvi.io/acme/api/v1with the headerAuthorization: Bearer ozvi_pat_…. Create the token on a dedicated team account with the smallest scope that works, and keep it in the tool's credentials, not in a plain field.
Text from your users
item.author.trust.n8n
Trigger on an Ozvi event
- Add a Webhook node, HTTP method
POST, and copy its Production URL. - In Ozvi, add a webhook with that URL, format JSON, and pick the events (for example
item.created). - Branch with an If or Switch node on
{{ $json.body.event }}, e.g. bugs:{{ $json.body.item.kind }}equalsbug. - To verify the signature, turn on Raw body in the Webhook node options and use a Code node with the Node.js check.
Vote from your CRM
When a deal is won, record the customer's vote on the idea it depended on. Create a Header Auth credential with name Authorization and value Bearer ozvi_pat_… (a team member's token with the triage scope), then paste this workflow into the n8n canvas (Ctrl/Cmd+V):
{
"name": "Ozvi: deal won → customer's vote",
"nodes": [
{
"parameters": {
"httpMethod": "POST",
"path": "deal-won",
"options": {}
},
"name": "CRM webhook",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [
0,
0
]
},
{
"parameters": {
"method": "POST",
"url": "=https://ozvi.io/acme/api/v1/items/{{ $json.body.ozviIdea }}/votes",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Idempotency-Key",
"value": "=deal-{{ $json.body.dealId }}"
}
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={{ JSON.stringify({ email: $json.body.contactEmail, company: $json.body.company }) }}",
"options": {}
},
"name": "Ozvi: vote",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
260,
0
]
}
],
"connections": {
"CRM webhook": {
"main": [
[
{
"node": "Ozvi: vote",
"type": "main",
"index": 0
}
]
]
}
}
}The Idempotency-Key makes a retried run harmless; an existing vote is kept as it is, and the answer says why a vote was not added (reason).
Make
Ozvi → Make: start a scenario with Webhooks → Custom webhook, copy its address into Ozvi (format JSON) and use Redetermine data structure + the test button in Ozvi so Make learns the fields.
Make → Ozvi: the HTTP → Make a request module, for example to file a bug from a support ticket:
URL: https://ozvi.io/acme/api/v1/items
Method: POST
Headers: Authorization = Bearer ozvi_pat_…
Idempotency-Key = ticket-{{1.id}}
Body type: Raw
Content type: JSON (application/json)
Request content:
{
"kind": "bug",
"title": "{{1.subject}}",
"body": "Reported in ticket {{1.url}}\n\n{{1.description}}"
}
Parse response: YesMake stops on a non-2xx answer; Ozvi's error body has code and detail (errors). Add an error handler route with Resume or Break for rate_limited (wait Retry-After seconds).
Zapier
Ozvi → Zapier: trigger Webhooks by Zapier → Catch Hook, put its URL into Ozvi, send a test from Ozvi, and use event, item__title, item__url… in later steps. Add a Filter step on event when the hook receives several events.
Zapier → Ozvi: action Webhooks by Zapier → Custom Request (it sends a raw JSON body):
Method: POST
URL: https://ozvi.io/acme/api/v1/items/{{item_number}}/comments
Data: {"body": "Customer replied in Help Scout: {{preview}}", "internal": true}
Headers: Authorization | Bearer ozvi_pat_…
Content-Type | application/jsonReading lists works the same with GET, e.g. https://ozvi.io/acme/api/v1/items?kind=idea&sort=top&limit=10 for a weekly digest.
More recipes
- New bug → Slack thread with the team: Ozvi has Slack, Teams and Discord formats built in (no automation needed); use a tool when you need routing rules.
- Shipped → tell the customer success team: trigger on
changelog.published, loop overentry.ideas, and for each callGET /items/{number}/votesto see which accounts asked for it. - Sync tags from your CRM:
PATCH /items/{number}with{"tags": {"add": ["enterprise"]}}(existing tags only; seeGET /tags). - Nightly export to a spreadsheet:
GET /export?what=ideas&format=jsongives{columns, rows}, ready for Google Sheets “append rows”.