Integrations Guide
Connect SiteAnswerAI to your favorite tools using webhooks. SiteAnswerAI sends events to automation platforms like Zapier and Make, which then connect to your CRM, calendar, and other apps.
Available Integrations
Quick Start
- 1. Go to Settings → Integrations in your dashboard
- 2. Click Add Integration
- 3. Choose a preset (e.g., "Zapier Catch Hook") or configure manually
- 4. Paste your webhook URL from Zapier/Make/GoHighLevel
- 5. Select the events you want to receive
- 6. Click Create Integration
ZZapier Integration
Zapier connects SiteAnswerAI to 5,000+ apps. Use the "Webhooks by Zapier" trigger to receive events.
Setup Steps
Go to zapier.com and click "Create Zap"
- Search for "Webhooks by Zapier"
- Select Catch Hook as the trigger event
- Click Continue (leave "Pick off a Child Key" empty)
- Copy the webhook URL (looks like:
https://hooks.zapier.com/hooks/catch/...)
- Go to Settings → Integrations in SiteAnswerAI
- Click "Add Integration"
- Select preset: Zapier Catch Hook
- Paste the webhook URL from Zapier
- Select your desired events
- Click "Create Integration"
- In Zapier, click "Test trigger"
- Send a test message to your chatbot
- Zapier should receive the event data
- Add an action (e.g., Google Sheets, HubSpot, Slack, Gmail)
- Map the fields from the webhook data to your action
- Publish your Zap
MMake.com Integration
Make (formerly Integromat) offers powerful visual automation with complex logic and data transformations.
Setup Steps
Go to make.com and click "Create a new scenario"
- Click the "+" button to add a module
- Search for "Webhooks"
- Select Custom webhook
- Click "Add" to create a new webhook
- Give it a name (e.g., "SiteAnswerAI Events")
- Copy the webhook URL (looks like:
https://hook.us1.make.com/...)
- Go to Settings → Integrations in SiteAnswerAI
- Click "Add Integration"
- Select preset: Make.com Webhook
- Paste the webhook URL from Make
- Select your desired events
- Click "Create Integration"
- In Make, click "Run once" on your scenario
- Send a test message to your chatbot
- Make will learn the data structure automatically
- Add modules for your destination apps (Google Sheets, HubSpot, etc.)
- Use a Router module if you need different actions per event type
- Turn on scheduling and activate your scenario
GGoHighLevel Integration
Send leads and conversation events directly to GoHighLevel workflows using inbound webhooks.
Setup Steps
- Go to Automation → Workflows
- Create a new workflow
- Select Inbound Webhook as the trigger
- Click on the Inbound Webhook trigger
- Copy the webhook URL (looks like:
https://services.leadconnectorhq.com/hooks/...)
- Go to Settings → Integrations in SiteAnswerAI
- Select preset: GoHighLevel Inbound Webhook
- Paste the webhook URL
- Select events: lead.created, bot.response, conversation.started
- Click "Create Integration"
- Add workflow actions (Create/Update Contact, Add Note, etc.)
- Map webhook fields to contact fields:
data.lead.name→ Contact Namedata.lead.email→ Emaildata.lead.phone→ Phone
HHubSpot Integration (via Zapier/Make)
SiteAnswerAI connects to HubSpot through Zapier or Make. This approach requires no OAuth setup in SiteAnswerAI.
Option A: HubSpot via Zapier
- Create a new Zap in Zapier
- Trigger: Webhooks by Zapier → Catch Hook
- Copy the webhook URL
- Select preset: HubSpot via Zapier
- Paste the Zapier webhook URL
- Select events: lead.created, bot.response
- Add action: HubSpot → Create Contact
- Connect your HubSpot account (Zapier handles OAuth)
- Map fields:
- Email →
data.lead.email - First Name →
data.lead.name - Phone →
data.lead.phone
Option B: HubSpot via Make
- Create a new scenario in Make
- Trigger: Webhooks → Custom webhook
- Copy the webhook URL
- Select preset: HubSpot via Make
- Paste the Make webhook URL
- Select events: lead.created, bot.response
- Add module: HubSpot CRM → Create a Contact
- Connect your HubSpot account
- Map the fields from the webhook data
Google Calendar Integration
Automatically create Google Calendar events when appointments are booked through your chatbot. Zapier/Make handles the Google Calendar connection.
appointmentId and googleEventId. Zapier Storage or Make Data Stores work well for this.Option A: Google Calendar via Zapier
- Trigger: Webhooks by Zapier → Catch Hook
- Copy the webhook URL
- Select preset: Google Calendar via Zapier (No OAuth)
- Paste the webhook URL
- Events are pre-selected: appointment.requested, appointment.created, appointment.updated, appointment.cancelled
- Add: Filter by Zapier
- Only continue if eventType contains "appointment"
- Add: Storage by Zapier → Get Value
- Key:
googleEventId:{{data__appointment__appointmentId}} - This retrieves the Google event ID if one exists
- Add: Paths by Zapier
- Path A (Created): eventType = appointment.created
- Google Calendar → Create Detailed Event
- Then: Storage by Zapier → Set Value (store the returned event ID)
- Path B (Updated): eventType = appointment.updated
- If Storage has value: Google Calendar → Update Event
- Else: Create event + store ID
- Path C (Cancelled): eventType = appointment.cancelled
- If Storage has value: Google Calendar → Delete Event
| Summary | data.appointment.title |
| Start Date/Time | data.appointment.startAt |
| End Date/Time | data.appointment.endAt |
| Location | data.appointment.location |
| Description | data.appointment.notes + lead info |
| Attendee Email | data.lead.email |
Option B: Google Calendar via Make
- Go to Make → Data Stores
- Create new store:
appointment_google_event_map - Add key field:
appointmentId(text) - Add value field:
googleEventId(text)
- Trigger: Webhooks → Custom webhook
- Copy the webhook URL
- Select preset: Google Calendar via Make (No OAuth)
- Paste the webhook URL
- Add: Router module
- Route 1: Filter: eventType = appointment.created
- Google Calendar → Create an Event
- Data Store → Add/Update record (store appointmentId → googleEventId)
- Route 2: Filter: eventType = appointment.updated
- Data Store → Get a record
- If found: Google Calendar → Update an Event
- If not: Create + Store
- Route 3: Filter: eventType = appointment.cancelled
- Data Store → Get a record
- If found: Google Calendar → Delete an Event
{}Custom Webhook & API
Send events to your own server or any HTTP endpoint. Full control over the integration.
Custom Webhook
For receiving events on your own server. Events are POSTed as JSON.
Custom API Endpoint
For APIs that require custom authentication headers. You can specify your own headers including Authorization tokens, API keys, etc.
Headers:
{
"Content-Type": "application/json",
"Authorization": "Bearer your_api_key_here"
}Event Types & Payload Schema
Available Events
| Event | Description |
|---|---|
| conversation.started | A visitor opened the chat widget |
| message.received | A visitor sent a message |
| bot.response | The bot sent a reply |
| lead.created | New lead captured (email/phone collected) |
| lead.updated | Lead information updated |
| appointment.requested | User requested a booking (not yet confirmed) |
| appointment.created | Appointment confirmed/scheduled |
| appointment.updated | Appointment time/details changed |
| appointment.cancelled | Appointment was cancelled |
HTTP Headers
| Header | Description |
|---|---|
| Content-Type | application/json |
| X-Voquii-Event | The event type (e.g., appointment.created) |
| X-Voquii-Timestamp | Unix timestamp in milliseconds |
| X-Voquii-Delivery-Id | Unique delivery ID for this request |
| X-Voquii-Signature | HMAC signature (if secret is configured) |
Sample Payload (appointment.created)
{
"specVersion": "siteanswerai.integration.v1",
"eventId": "evt_7f3a2e0c2c1a4d6a",
"eventType": "appointment.created",
"occurredAt": "2026-01-26T23:45:10.120Z",
"tenantId": "tnt_abc123",
"botId": "bot_xyz789",
"environment": "production",
"idempotencyKey": "appointment.created:apt_55c1d9:2026-01-26T23:45:10.120Z",
"data": {
"lead": {
"leadId": "lead_10293",
"name": "Jordan Smith",
"email": "jordan@example.com",
"phone": "+15551234567"
},
"appointment": {
"appointmentId": "apt_55c1d9",
"status": "created",
"title": "Consultation - Jordan Smith",
"timezone": "America/New_York",
"startAt": "2026-01-27T15:00:00.000Z",
"endAt": "2026-01-27T15:30:00.000Z",
"location": "Phone",
"notes": "Requested via SiteAnswerAI chat widget.",
"attendees": [
{ "email": "jordan@example.com", "name": "Jordan Smith" }
],
"updatedAt": "2026-01-26T23:45:10.120Z"
},
"conversation": {
"conversationId": "conv_88aa10",
"channel": "widget"
}
}
}Signature Verification
If you configure a signing secret, every webhook includes an HMAC-SHA256 signature so you can verify it came from SiteAnswerAI.
Signature Format
Header: X-Voquii-Signature: sha256=<hex_signature>
Signature = HMAC-SHA256(secret, "${timestamp}.${rawBody}")
Where:
- timestamp = value of X-Voquii-Timestamp header
- rawBody = the raw JSON request body (as string)Verification Example (Node.js)
const crypto = require('crypto');
function verifySignature(secret, timestamp, rawBody, signature) {
const expected = crypto
.createHmac('sha256', secret)
.update(`${timestamp}.${rawBody}`)
.digest('hex');
return `sha256=${expected}` === signature;
}
// In your webhook handler:
app.post('/webhook', (req, res) => {
const timestamp = req.headers['x-voquii-timestamp'];
const signature = req.headers['x-voquii-signature'];
const rawBody = JSON.stringify(req.body);
if (!verifySignature(process.env.WEBHOOK_SECRET, timestamp, rawBody, signature)) {
return res.status(401).send('Invalid signature');
}
// Process the webhook...
console.log('Event:', req.body.eventType);
res.status(200).send('OK');
});