Integrations
Connect DealerAI to external CRM systems, automotive platforms, and configure webhook event subscriptions.
The Integrations section lets you connect DealerAI to the external systems your dealership already uses — CRMs, inventory platforms, and scheduling tools — so data flows automatically between them without manual re-entry.
Overview
DealerAI supports two types of integrations:
| Type | Description |
|---|---|
| Integration Agents | Pre-built connections to specific automotive platforms and CRMs |
| Event Subscriptions | Webhooks that notify external systems when specific events happen in DealerAI |
Navigate to Integrations in the sidebar to access both.
Integration Agents

Integration Agents are pre-configured connectors for popular automotive platforms. Enabling an agent activates the two-way data sync between DealerAI and that platform.
Supported Platforms
| Platform | Capabilities |
|---|---|
| VinSolutions | Push leads and appointments into the VinSolutions CRM |
| DealerSocket | Sync lead data and appointment details with DealerSocket |
| Fortellis | Access automotive data services and inventory via the Fortellis network |
| XTime | Sync service appointments with XTime scheduling |
Contact your DealerAI account manager to enable additional integration agents not listed here. Availability may depend on your subscription plan.
Configuring an Integration Agent
Event Subscriptions (Webhooks)
Event Subscriptions let you receive real-time notifications in your own systems whenever something happens in DealerAI. This is useful for building custom integrations or triggering workflows in tools like Zapier or your internal platforms.
Available Events
Lead Events
| Event | Triggered when |
|---|---|
lead.created | A new lead is created |
lead.received | A lead is received |
lead.update.disposition | A lead's disposition is updated |
Appointment Events
| Event | Triggered when |
|---|---|
appointment.created | An appointment is created |
appointment.rescheduled | An appointment is rescheduled |
appointment.cancelled | An appointment is cancelled |
Contact Events
| Event | Triggered when |
|---|---|
contact.created | A new contact is created |
contact.basic.updated | A contact's basic information is updated |
contact.vehicleofinterest.updated | A contact's vehicle of interest is updated |
contact.sequence_enrollment.updated | A contact is enrolled or unenrolled from a sequence |
Conversation Events
| Event | Triggered when |
|---|---|
conversation.started | A conversation is started |
conversation.replied | A conversation is replied to |
conversation.flagged | A conversation is flagged (e.g., marked as priority) |
conversation.takenover | A conversation is taken over by an agent |
Sequence Events
| Event | Triggered when |
|---|---|
sequence.enrollment.created | A contact is enrolled in a sequence |
sequence.enrollment.completed | A contact completes all steps in a sequence |
sequence.enrollment.paused | A sequence enrollment is paused |
sequence.enrollment.unenrolled | A contact is unenrolled from a sequence |
sequence.reply.received | A contact replies to a sequence message |
sequence.step.executing | A sequence step is about to execute |
sequence.step.executed | A sequence step executes successfully |
sequence.step.failed | A sequence step execution fails |
sequence.step.skipped | A sequence step is skipped |
Event Payloads
All webhook events are delivered as an HTTP POST with a JSON body. Every event shares a set
of common base fields, and each event type then adds its own specific fields on top.
Common Fields (all events)
| Field | Type | Description |
|---|---|---|
dealerId | string | The dealer this event belongs to |
leadId | string | The originating lead document ID (Cosmos), when applicable |
timestamp | string (ISO 8601) | UTC timestamp of when the event was fired |
Lead Events
All lead events include the common fields plus:
| Field | Type | Description |
|---|---|---|
conversationId | string | The associated conversation ID |
contactId | string | The contact's ID |
firstName | string | Customer first name |
lastName | string | Customer last name |
email | string | Customer email |
phone | string | Customer phone number |
lead.created adds:
| Field | Type | Description |
|---|---|---|
source | string | Lead source (e.g., AutoTrader, dealer website) |
vehicleYear | string | Vehicle year of interest |
vehicleMake | string | Vehicle make of interest |
vehicleModel | string | Vehicle model of interest |
vehicleVin | string | Vehicle VIN |
comments | string | Additional comments from the lead |
lead.update.disposition adds:
| Field | Type | Description |
|---|---|---|
dispositionCode | string | The disposition code |
dispositionName | string | Human-readable disposition name |
notes | string | Additional notes |
lead.received — no additional fields beyond the base lead fields.
Appointment Events
All appointment events include the common fields plus:
| Field | Type | Description |
|---|---|---|
conversationId | string | The associated conversation ID |
appointmentType | string | Type of appointment (e.g., sales, service, testdrive, tradein, leasereturn) |
contactId | string | The contact's ID |
name | string | Contact full name |
email | string | Contact email |
phone | string | Contact phone number |
appointmentTime | string (ISO 8601) | Scheduled appointment date and time (UTC) |
Sales and test drive appointments (appointment.created with appointmentType: sales or testdrive) add:
| Field | Type | Description |
|---|---|---|
vehicleYear | string | Vehicle year |
vehicleMake | string | Vehicle make |
vehicleModel | string | Vehicle model |
vehicleVin | string | Vehicle VIN |
vehicleStockNumber | string | Stock number (test drive only) |
Service appointments add:
| Field | Type | Description |
|---|---|---|
serviceType | string | Type of service requested |
vehicleVin | string | Vehicle VIN |
vehicleMake | string | Vehicle make |
vehicleModel | string | Vehicle model |
vehicleYear | string | Vehicle year |
Trade-in appointments add:
| Field | Type | Description |
|---|---|---|
tradeInVehicleModel | string | Trade-in vehicle model |
tradeInVehicleYear | string | Trade-in vehicle year |
tradeInVehicleMileage | string | Trade-in vehicle mileage |
tradeInVehicleCondition | string | Trade-in vehicle condition |
tradeForVehicleModel | string | Desired vehicle model |
tradeForVehicleYear | string | Desired vehicle year |
tradeForVehicleVin | string | Desired vehicle VIN |
Contact Events
All contact events include the common fields plus:
| Field | Type | Description |
|---|---|---|
contactId | string | The contact's ID |
name | string | Contact full name |
firstName | string | Contact first name |
lastName | string | Contact last name |
email | string | Contact email |
phone | string | Contact phone number |
contact.created adds:
| Field | Type | Description |
|---|---|---|
createdAtUtc | string (ISO 8601) | When the contact was created |
contact.basic.updated adds:
| Field | Type | Description |
|---|---|---|
updatedAtUtc | string (ISO 8601) | When the contact was updated |
contact.vehicleofinterest.updated adds:
| Field | Type | Description |
|---|---|---|
updatedAtUtc | string (ISO 8601) | When the vehicle of interest was updated |
vehicleInterest.year | string | Vehicle year |
vehicleInterest.make | string | Vehicle make |
vehicleInterest.model | string | Vehicle model |
vehicleInterest.trim | string | Vehicle trim |
vehicleInterest.vin | string | Vehicle VIN |
vehicleInterest.stock | string | Stock number |
vehicleInterest.bodyStyle | string | Body style |
vehicleInterest.interest | string | Interest type (buy, lease, sell, trade-in, test-drive) |
vehicleInterest.status | string | Vehicle status (new, used) |
contact | object | Full updated contact record |
contact.sequence_enrollment.updated adds:
| Field | Type | Description |
|---|---|---|
inSequence | boolean | Whether the contact is currently enrolled in a sequence |
updatedAtUtc | string (ISO 8601) | When the enrollment status changed |
contact | object | Full updated contact record |
Conversation Events
All conversation events include the common fields plus:
| Field | Type | Description |
|---|---|---|
conversationId | string | The conversation ID |
channel | string | The channel (e.g., sms, email, webchat) |
conversation.started adds:
| Field | Type | Description |
|---|---|---|
firstMessage | string | The opening message of the conversation |
name | string | Customer name |
email | string | Customer email |
phone | string | Customer phone number |
conversation.replied adds:
| Field | Type | Description |
|---|---|---|
message | string | The reply message content |
conversation.flagged adds:
| Field | Type | Description |
|---|---|---|
flag | string | The flag label (e.g., Priority) |
contactId | string | The contact's ID |
name | string | Customer name |
email | string | Customer email |
phone | string | Customer phone number |
notes | string | Optional free-form notes |
conversationSummary | string | AI-generated summary of the conversation at the time of flagging |
conversationSummaryGeneratedAtUtc | string (ISO 8601) | When the summary was generated |
flaggedAtUtc | string (ISO 8601) | When the conversation was flagged |
conversation.takenover adds:
| Field | Type | Description |
|---|---|---|
agentUserId | string | User ID of the agent who took over |
agentName | string | Name of the agent who took over |
Sequence Events
All sequence events include the common fields plus:
| Field | Type | Description |
|---|---|---|
sequenceId | string | The sequence ID |
Enrollment events (sequence.enrollment.created, sequence.enrollment.completed, sequence.enrollment.paused, sequence.enrollment.unenrolled, sequence.reply.received) add:
| Field | Type | Description |
|---|---|---|
sequenceName | string | Name of the sequence |
enrollmentCount | number | Number of contacts in this enrollment batch |
channel | string | Channel(s) used by the sequence |
startDate | string (ISO 8601) | Enrollment start date |
fileName | string | CSV filename, if enrolled via file upload |
contactId | string | Contact ID (single-contact enrollments) |
contactEmail | string | Contact email (single-contact enrollments) |
contactPhoneNumber | string | Contact phone (single-contact enrollments) |
contactFirstName | string | Contact first name (single-contact enrollments) |
contactLastName | string | Contact last name (single-contact enrollments) |
conversationId | string | Conversation ID (reply events) |
message | string | Reply message content (reply events) |
Sequence step events (sequence.step.executing, sequence.step.executed, sequence.step.failed, sequence.step.skipped) add:
| Field | Type | Description |
|---|---|---|
sequenceName | string | Name of the sequence |
enrollmentId | string | The enrollment ID |
contactId | string | The contact's ID |
stepOrder | number | The step's position in the sequence |
stepAction | string | Step action type (e.g., StaticMessage, AIMessage, AgentTakeover) |
channel | string | Step delivery channel (sms, email, telephony) |
conversationId | string | Associated conversation ID (when applicable) |
message | string | Message sent for this step (when applicable) |
errorMessage | string | Error details (failed steps only) |
reason | string | Skip reason (skipped steps only) |
Creating a Webhook
Webhook endpoints must be HTTPS and publicly accessible. DealerAI will retry failed deliveries up to three times before marking a delivery as failed.