Skip to main content

Connect a Webhook (A–Z Guide)

With webhooks, Sally can instantly send data to other tools as soon as something happens — for example, sending a meeting summary directly to your automation platform the moment it’s ready.

This guide explains webhooks from scratch and walks you through a complete example.


Quick Navigation

  1. What is a webhook (simple explanation)?
  2. Prerequisites
  3. Create a webhook URL in your tool
  4. Create a webhook in Sally
  5. JSON body & field reference
  6. Check connection & view logs
  7. Execute Webhook manually
  8. FAQ & Troubleshooting

1. What is a webhook (simple explanation)?

A webhook is essentially an internet address (URL) provided to you by another tool or system (e.g., Zapier, Make, n8n, Power Automate, or your own backend).

Whenever something specific happens in Sally — for example, when a summary is created — Sally automatically sends a POST request to that URL.

Comparison:

  • API = you actively request data from another system.
  • Webhook = the system automatically sends you data when something happens.

Typical webhook use cases:

  • Automatically send summaries to an automation platform
  • Create tasks in your workflow tools (Zapier, Make, n8n, Power Automate)
  • Trigger backend actions when a meeting ends

2. Prerequisites

To connect Sally to another tool via webhook, you need:

  • Access to the target tool
    Example: Zapier, Make, n8n, Power Automate, or a custom backend.

    info

    Without an account in the target tool, you cannot create a webhook endpoint.

  • Permission to create or access a webhook URL
    This URL always comes from the target tool.

    • In tools like Zapier, Make, n8n, Power Automate → you find it inside the workflow setup.
    • In custom systems → developers usually provide it.
    info

    Check whether your role (e.g., “Admin” or “Owner”) is allowed to create webhooks.

  • A Sally account with integration permissions

    • Personal webhooks: Always available
    • Organization-wide webhooks: Only with the right permissions
Important

The webhook URL always comes from the target system — never from Sally.
Without it, Sally has nowhere to send data.


3. Create a webhook URL in your tool

The steps differ depending on your system but the principle is always the same:

  1. Open your target tool (e.g., Zapier, Make, n8n, Power Automate, custom system).
  2. Create an incoming webhook (sometimes called “Listener URL”, “Trigger URL”, or “Endpoint”).
  3. Copy the generated Webhook URL.
Tip

If unsure, search your tool’s documentation for “create webhook” + tool name.


4. Create a webhook in Sally

Once your target tool has generated a webhook URL, you can configure it in Sally. The new webhook integration gives you full control over authentication, headers, and the webhook body.

Step-by-step

  1. Open Settings.
Open Sally settings

Open Settings

  1. Go to "Integrations"
  2. Under "Your personal integrations", click "+Add integration".
Add a new integration

Add Integration

  1. Choose Webhook V2 → click Create Webhook
info

Webhook V1 is an older version. Existing V1 webhooks remain active. All new webhooks use V2.

Select Webhook V2

Select Webhook V2

  1. Fill out the Webhook form

Below is a table showing all available form fields and what each one does.


Webhook Form - all Fields Explained:

FieldDescription
Webhook NameA freely selectable display name for the integration. Helps you identify the webhook later (e.g., “Webhook n8n – Leads”, “Zapier – Tasks”).
Webhook URLThe endpoint URL provided by the target system where Sally will send the webhook data. Without this URL, the webhook cannot be triggered.
Cookie (optional)Optional field for systems that use session cookies instead of API tokens. Modern tools like Zapier, Make, or n8n do not require a cookie. Only used for specific internal or legacy systems.
Authentication MethodDefines how Sally authenticates with the target system. Possible options:

None – No Authorization header is sent; ideal for open listeners or test endpoints.
Basic Auth – Sally sends username + password as a Basic Auth header; commonly used in internal APIs.
Raw – You manually provide the full Authorization header (e.g., Bearer xyz123, ApiKey abc123).
Client Certificate (PFX + Password) – Enables mTLS authentication; only required if the target system explicitly demands a client certificate.
Custom HeadersAllows adding any additional headers, such as x-api-key, x-tenant-id, or signature keys. Used to secure requests or control workflows.
HTTP Body VersionDefines the structure of the JSON body. Recommendation: always choose the latest version to receive the most complete and up-to-date data.
LanguageDefines the language in which content is generated. Sally uses BCP-47 based on ISO 639-1. For example, de-DE or en-US will be sent.
HTTP Body CustomizationDefines which content Sally includes in the webhook body. Each category can be enabled or disabled individually. The following elements are available:

Tasks – All detected tasks including assignees and due dates.
Custom Insights – Results from custom insights (e.g., checklists or custom fields).
Objections – Detected objections from the conversation.
Decisions – All decisions made during the meeting.
Key Points – Important core topics or main statements of the meeting.
Meeting-type-specific elements – Content generated from the selected meeting type (e.g., question catalog).
Transcription – Full transcript sections including speakers, timecodes, and emphasis.
Summary – The generated main summary as well as HTML variants.

By enabling/disabling these fields, you can precisely control how detailed the webhook body should be.

  1. Click Create
Create webhook

Save Webhook

Your webhook now appears in the list.

Webhook active

Webhook is active


5. JSON Body & Field Reference

While configuring your webhook, Sally shows you a live preview of the JSON that will be sent.

You can copy the JSON directly using the built-in Copy button - useful for n8n, Make, Zapier, or testing endpoints.

Copy JSON

JSON Body

The payload includes all detected meeting data: attendees, topics, decisions, tasks, objections, meeting-type items, and transcript parts.

Below you find:

  1. A complete copyable JSON example
  2. A full field reference table

5.1 JSON example (copyable)

{
"directoryId": "00000000-0000-0000-0000-000000000001",
"recordingSummaryId": "00000000-0000-0000-0000-000000000001",
"languageCode": "string",
"appointmentDate": "0000-01-01T00:00:00.000Z",
"appointmentSubject": "string",
"attendees": [
{
"name": "string",
"email": "string",
"invitationStatus": 0,
"attendenceStatus": 0
}
],
"meetingUrl": "string",
"meetingPlatform": "webex|msteams|zoom|googlemeet",
"summary": "string",
"combinedFullSummaryHTML": "string",
"topics": [
{
"summary": "string",
"description": "string",
"startTimeStamp": 0.0,
"endTimeStamp": 0.0
}
],
"decisions": [
{
"summary": "string",
"description": "string",
"startTimeStamp": 0.0,
"endTimeStamp": 0.0
}
],
"tasks": [
{
"subject": "string",
"description": "string",
"responsiblePersonName": "string",
"responsiblePersonEmail": "string",
"dueDate": "0000-01-01T00:00:00.000Z"
}
],
"objections": [
{
"objection": "string"
}
],
"customInsights": [
{
"id": "00000000-0000-0000-0000-000000000001",
"name": "string",
"result": "string"
}
],
"meetingTypeItems": [
{
"summary": "string",
"description": "string"
}
],
"transcriptParts": [
{
"id": "00000000-0000-0000-0000-000000000001",
"speakerName": "string",
"startTimeStamp": 0.0,
"endTimeStamp": 0.0,
"text": "string",
"emphases": "string",
"sortOrder": 0
}
]
}

5.2 Explanation of all JSON fields

Field NameTypeFormatDescription
directoryIdstring (GUID)PlainUnique ID of your Sally organization. Used to identify which workspace the webhook originates from.
recordingSummaryIdstring (GUID)PlainUnique ID of the generated summary. Can be used to fetch or match data later.
languageCodestringPlainLanguage in which the summary was generated. Sally uses BCP-47 language codes based on ISO 639-1, e.g., de-DE, en-US, fr-FR.
appointmentDatestring (ISO date)PlainDate and time of the meeting or recording.
appointmentSubjectstringPlainTitle or subject of the meeting (from the calendar or manually provided).
attendeesArrayPlainList of all meeting participants.
attendees[].namestringPlainName of the participant.
attendees[].emailstringPlainEmail address of the participant.
attendees[].invitationStatusnumberPlainNumeric invitation status indicating how the person responded to the calendar invite. Possible values:

10 = Declined – The invitation was explicitly declined.
20 = Accepted – The invitation was confirmed.
30 = Tentatively accepted – The participant selected “Maybe”.
40 = No response – No reaction to the invitation.
50 = Organizer – The person is the meeting organizer.
100 = Unknown – Status could not be determined.
attendees[].attendenceStatusnumberPlainNumeric attendance status indicating whether the person actually attended the meeting. Possible values:

10 = Did not attend – The person was invited but did not join the meeting.
20 = Attended – The person was present in the meeting.
100 = Unknown – Actual attendance could not be determined.
meetingUrlstringPlainLink to the online meeting (Teams, Zoom, Webex, etc.).
meetingPlatformstringPlainPlatform on which the meeting took place (webex, msteams, zoom, googlemeet).
summarystringMarkdownCompact main summary of the meeting.
combinedFullSummaryHTMLstring (HTML)HTMLFull formatted summary in HTML – ideal for CRMs, ticketing systems, or emails.
topicsArrayPlainTopics/sections detected in the conversation.
topics[].summarystringMarkdownShort description of the topic.
topics[].descriptionstringMarkdownMore detailed description of the conversation section.
topics[].startTimeStampnumber (decimal)PlainStart time of the topic in seconds (relative to the recording).
topics[].endTimeStampnumber (decimal)PlainEnd time of the topic in seconds.
decisionsArrayPlainAll decisions made in the meeting.
decisions[].summarystringMarkdownShort description of the decision.
decisions[].descriptionstringMarkdownDetailed description of the decision.
decisions[].startTimeStampnumber (decimal)PlainTimestamp when the decision was mentioned.
decisions[].endTimeStampnumber (decimal)PlainTimestamp when the decision topic ended.
tasksArrayPlainTasks/action items detected by Sally.
tasks[].subjectstringMarkdownTitle of the task.
tasks[].descriptionstringMarkdownDescription or context of the task.
tasks[].responsiblePersonNamestringPlainPerson responsible for the task.
tasks[].responsiblePersonEmailstringPlainEmail of the responsible person.
tasks[].dueDatestring (ISO date)PlainDue date of the task in ISO 8601 format. Only set if Sally detects a date in the conversation.

Example: 2025-03-15T00:00:00.000Z.
objectionsArrayPlainObjections or concerns mentioned during the meeting.
objections[].objectionstringMarkdownThe formulated objection.
customInsightsArrayPlainResults of your custom insights/prompts.
customInsights[].idstring (GUID)PlainUnique ID of the custom insight field.
customInsights[].namestringPlainName of the insight field.
customInsights[].resultstringHTMLResult generated by the prompt.
meetingTypeItemsArrayPlainContent generated by your selected meeting type (e.g., questions, sections, checks).
meetingTypeItems[].summarystringHTMLShort description of the item.
meetingTypeItems[].descriptionstringHTMLDetailed description of the meeting-type element.
transcriptPartsArrayPlainEach recognized transcript segment – structured by speaker and time.
transcriptParts[].idstring (GUID)PlainUnique ID of the transcript segment.
transcriptParts[].speakerNamestringPlainName of the speaker.
transcriptParts[].startTimeStampnumber (decimal)PlainStart time of the segment in seconds.
transcriptParts[].endTimeStampnumber (decimal)PlainEnd time of the segment in seconds.
transcriptParts[].textstringPlainSpoken content.
transcriptParts[].emphasesstringPlainList of detected emphasized words within the segment. This field contains an array of objects, each containing the emphasized word and its start and end timestamps. If no emphasis is detected, the array is empty.

Example:
[{"word":"Yes","startTime":104.89,"endTime":104.89},{"word":"next","startTime":105.09,"endTime":105.09},{"word":"page.","startTime":105.41,"endTime":105.41}]
transcriptParts[].sortOrdernumber (int)PlainSequential number indicating the order of the segment in the full transcript. Values are ascending: lower numbers represent earlier speech, higher numbers later speech.

6. Check connection & view logs

In this section, you will learn:

6.1. Test the connection (the fastest first check)

Before diving into logs, you should first verify that your webhook connection works in general.

To test the connection in Sally:

  1. Go to Integrations.
  2. Open your previously created webhook integration.
  3. Click Test.
Testing a webhook in Sally

Test webhook connection

  1. Now select a meeting that will be used as the basis for testing the connection.
  2. Click Test.
Testing a webhook in Sally

Select a test meeting

Sally sends a test event to the configured webhook URL and immediately shows whether the target system accepted the request.

Note on test mode in the target system

If you are using a test or sandbox URL in your target system (e.g. n8n, Zapier, or custom APIs), make sure that test mode is enabled there.
Many systems ignore or block test webhooks unless the workflow is explicitly set to “Listening” or “Test”.

The connection test is ideal for quickly checking:

  • whether the URL is correct,
  • whether the target system is reachable,
  • and whether basic authentication works.

6.2. Understanding logs: what they show – and why they matter

Sally automatically records every webhook execution.
You can view, analyze, and reexecute these log entries at any time.

In short: Logs show exactly what Sally sent, when it was sent, and how the target system responded.

Logs help you with:

  • verifying that events were triggered correctly,
  • troubleshooting incorrect URLs or missing permissions,
  • inspecting the transmitted data (payload),
  • analyzing response times and performance,
  • maintaining technical traceability (e.g. for audits or support cases).

In addition, you can reexecute individual log entries without triggering a new meeting or event.
This is especially useful for debugging or after making changes in the target system.

6.3. How to find webhook logs in Sally

To access the logs of a webhook integration:

  1. Open Integrations.
  2. Locate your webhook integration under "Your personal integrations".
  3. Click Logs.
Opening webhook logs in Sally

Open logs for a webhook integration

You will then see an overview of all webhook executions:

Webhook log overview in Sally

Overview of all webhook requests

Each entry represents a single webhook execution attempt sent by Sally to your target system.

6.4. How to read a log entry correctly

A single log entry contains multiple pieces of information that together provide the full context:

LabelDescriptionExample
Execution timeThe moment when Sally triggered and sent the webhook to the target system. Useful for correlating events with meetings or workflow steps.Jan 12, 2026, 10:01
Target endpoint (URL)The exact URL the webhook was sent to. Important when working with test, staging, and production environments.https://example.com/webhook
HTTP statusResponse code returned by the target system. Indicates whether the request was accepted, rejected, or failed.202 Accepted
Latency / durationTime between sending the request and receiving the response. High values may indicate performance or network issues.850 ms
EventThe specific Sally event that triggered the webhook, e.g. after a meeting ended or a summary was created.Meeting completed
RetriesIndicates whether and how often Sally retried sending the webhook after a failure. Relevant for temporary errors or timeouts.2
Request & response detailsFull technical details including headers, payload, and response body. Essential for in-depth debugging.
Common HTTP status codes
  • 2xx (Success) → The target system accepted the request
  • 4xx (Client error) → Usually a configuration issue (e.g. 401 Unauthorized, 404 Not Found)
  • 5xx (Server error) → The target system was temporarily unavailable; Sally will retry automatically

6.5. Reexecute logs (targeted testing & debugging)

Reexecuting a log entry is especially useful if:

  • You changed the webhook URL
  • Updated authentication or headers
  • The target system was temporarily unavailable
What happens when you reexecute a log?

When you reexecute a log, the exact same webhook payload is sent again that was originally used for this log entry. No new meeting is started and no new event is triggered in Sally — it is purely a resend of the existing data.

This allows you to specifically test whether changes in the target system (for example, the webhook URL, authentication, or data processing) now work correctly, without triggering the entire process again.

To reexecute a log entry:

  1. Open the log overview of your webhook integration.
  2. Locate the desired log entry.
  3. Click Reexecute.
Reexecuting a webhook log entry

Reexecute a single log entry

This allows you to test changes in the target system immediately — quickly, precisely, and reproducibly.

6.6. Common issues & quick fixes

IssueTypical symptomsQuick fix
Incorrect URLRequests fail or hit the wrong endpointCompare the target URL in the logs with the expected endpoint. Watch out for typos, missing paths, or outdated test URLs.
Missing or incorrect authentication401 Unauthorized or 403 ForbiddenVerify API keys, tokens, and required headers in the target system.
Payload does not match the target systemErrors despite successful deliveryInspect the payload in the log details. The target system may expect a different format, field names, or version.
Rate limiting429 Too Many RequestsReduce the number of webhook events or introduce queues/delays in the target system.
Target system unavailable5xx server errorsCheck the availability or status of the target system. Sally automatically retries these requests.
Test mode not enabledNo reaction in tools like n8nEnsure the workflow in the target system is actively listening when using test URLs.

7. Execute Webhook manually

In addition to automatic execution after a meeting, you can also trigger webhooks manually for a specific appointment in Sally.
This is especially useful if you want to resend a webhook intentionally without waiting for a new event.

To execute a webhook manually:

  1. Open the desired appointment.
Execute webhook manually from an appointment

Execute webhook manually from an appointment

  1. Click the Integrations button at the top.
  2. Select "Execute Webhook manually".
Log entry after executing a webhook manually

Manually executed webhook shown as a log entry

What happens when you execute a webhook manually?

When executing a webhook manually, Sally sends the webhook again for this exact appointment to the configured target system.

Important to know:

  • No new meeting is created.
  • No automatic event is required or triggered.
  • The same payload structure is used as with the automatic webhook execution.

The manually executed webhook then appears as a separate entry in the logs, including:

  • execution time,
  • target endpoint,
  • HTTP status,
  • and full request and response details.

This allows you to:

  • test changes in the target system,
  • retry failed transmissions,
  • or resynchronize data without having to run the meeting again.

8. FAQ & Troubleshooting

My webhook isn't sending anything.

  • Check whether the triggering event actually occurred
  • Ensure the webhook is active
  • Review the logs

Where do I get the webhook URL?

  • Always from the target system (Zapier, Make, etc.)

Which version should I choose?

  • Always Version 3 (Latest) unless using a legacy workflow

How long are logs stored?

  • Logs are stored for 90 days and then deleted automatically.