Integrations Guide
Connect SiteAnswerAI to your favorite tools. Choose between direct OAuth connections for seamless integration with Google Calendar, HubSpot, and Microsoft, or use webhooks with automation platforms like Zapier and Make for maximum flexibility.
Direct OAuth — One-click connection to Google Calendar, HubSpot, and Microsoft 365. Go to Settings → Integrations → Connected Apps.
Webhooks — Send events to Zapier, Make, GoHighLevel, or your own server for custom workflows.
Available Integrations
Direct OAuth Connections
Webhook Integrations
Direct OAuth Connections
Connect your accounts with one click. Direct OAuth connections allow SiteAnswerAI to interact with your calendar and CRM directly, without requiring Zapier or Make as an intermediary.
Google Calendar (Direct)
Connect your Google Calendar to automatically create, update, and cancel appointments booked through your chatbot.
- Go to Settings → Integrations
- Under "Connected Apps", find Google Calendar
- Click Connect
- Sign in with your Google account and approve the permissions
- Done! Appointments will now sync automatically.
Permissions Requested
calendar.events— View and edit events on your calendarsuserinfo.email— See your email address (for account identification)
HubSpot CRM (Direct)
Connect your HubSpot CRM to automatically create and update contacts when leads are captured through your chatbot.
- Go to Settings → Integrations
- Under "Connected Apps", find HubSpot
- Click Connect
- Sign in with your HubSpot account and approve the permissions
- Done! Leads will now sync to HubSpot automatically.
Permissions Requested
crm.objects.contacts.read/write— Read and create contactscrm.objects.companies.read— Read company datacrm.objects.deals.read/write— Read and create deals
Microsoft 365 (Direct)
Connect your Microsoft 365 account to sync appointments with Outlook Calendar.
- Go to Settings → Integrations
- Under "Connected Apps", find Microsoft
- Click Connect
- Sign in with your Microsoft account and approve the permissions
- Done! Appointments will now sync to Outlook Calendar.
Permissions Requested
User.Read— Read your profileCalendars.ReadWrite— Read and write calendar events
Webhook Integrations
For maximum flexibility, send events to automation platforms like Zapier and Make. This approach lets you build complex workflows and connect to thousands of apps.
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)
Alternatively, connect to HubSpot through Zapier or Make for more complex workflows or custom data mapping.
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 (via Zapier/Make)
For complex workflows or custom data mapping, use Zapier or Make to handle Google Calendar events.
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');
});