Lead Webhook Export
In Dealer Studio, lead exports can POST JSON to a third-party URL. The webhook is configured under dealership notifications (medium: webhook). You can optionally send a Bearer token using the notification’s API token and header key settings.
Three schema versions
Section titled “Three schema versions”The notification’s API schema version (v1, v2, or v3) selects which JSON shape is sent. These are three different payloads, not additive flags on one object: fields are renamed, nested, or removed between versions.
| Version | Status | Summary |
|---|---|---|
| v1 | Deprecated | Legacy flat shape: dealership_id, dealership_name, website_url, top-level status / status_type, item_id, created / modified, assignee_email, subscription, and a broader prospect object (including combined name and fields dropped in later versions). |
| v2 | Recommended baseline for new integrations | Restructured payload: nested dealership, website, lead_status_option, assigned_salesperson, updated_at, streamlined prospect (first_name, opt_in_to_marketing, …), and category-driven blocks such as trade_in_data / offer_data / booking_date / booking_time aligned in one schema. Update webhooks use the same body as create (no extra top-level status merge). |
| v3 | Extends v2 | Everything in v2, plus has_test_drives and appointments (test-drive appointments only). |
Deprecation: v1 is deprecated. Prefer v2 for a stable, documented shape, or v3 if you need test-drive appointment rows and the has_test_drives flag. New integrations should not target v1.
Version differences (high level)
Section titled “Version differences (high level)”- v1 → v2 — Dealership and website move into objects; lead status moves into
lead_status_option; assignee becomesassigned_salesperson; timestamps useupdated_atinstead ofmodifiedfor the cluster-oriented view; several v1-only keys are removed from the root anditem/prospectare trimmed and normalised (see examples below). - v2 → v3 — Adds
appointments(array, always present) andhas_test_drives(boolean).appointmentslists only appointments on the lead cluster with purpose Test Drive, ordered bystarts_atascending (earliest first). Each element describes one appointment row;has_test_drivesistrueif the cluster has at least one TestDrive record (lead_cluster.test_drives), otherwisefalse. That flag is independent ofappointments(you can have test-drive appointments without a linked TestDrive, or TestDrives without matching appointment rows in the payload).
appointments entries (v3 only)
Section titled “appointments entries (v3 only)”Each object can include:
| Field | Description |
|---|---|
id | Appointment id. |
ai_generated | Whether the booking was created by AI. |
user | Object with assigned user id and name, or null values if missing. |
starts_at | Start time in the dealership’s timezone (or Australia/Brisbane if unset), as YYYY-MM-DD HH:MM:SS, or null if not set. |
created_at | Appointment created_at in the same timezone format, or null. |
updated_at | Appointment updated_at in the same timezone format, or null. |
status | Appointment status (for example pending, completed, cancelled, no-show, interest_registered). |
length_in_minutes | Scheduled duration. |
note | Optional note; may be null. |
car_for_test_drive | If the schedulable is a TestDrive with a stock car, the car’s display name. If the test drive uses a generic car (car lead cluster only), the string <car lead cluster name> (generic car). If not linked to a TestDrive schedulable, null. |
Example payloads
Section titled “Example payloads”The JSON below is illustrative (same fictional lead, trimmed where versions match). Use it to compare shapes; real payloads include whatever optional blocks apply to the lead category and data.
v1 uses the legacy root fields and prospect shape. Update webhooks merge extra top-level keys (for example status-related fields from the lead cluster) into this body—behaviour differs from v2.
{ "id": 138559, "item_id": 138559, "dealership_id": 3, "dealership_name": "Orange Motor Group", "lead_cluster_id": 289, "marketing_source": "Unknown", "utm_campaign": null, "website_url": "https://www.orangemotorgroup.com.au", "provider": "Dealer Studio", "source": "Website", "category": "Sell My Car Enquiry", "status": "New", "status_type": "New", "location": { "city": "Fake city", "state": "QLD", "street": "123 fake street", "postcode": 1234, "location_name": "Orange Motor Group" }, "location_id": null, "prospect": { "title": null, "name": "xcvxcvdcz don", "middle_name": null, "last_name": "don", "email": "email@example.com", "postcode": 1234, "home_phone": null, "mobile_phone": "0410000000", "address": { "city": "Browns Plains", "state": "Queensland", "street": "4 Myola Street", "country": "Australia", "postcode": 4118, "state_long": "Queensland" }, "dob": null, "licence_type": null, "employment_type": null, "driver_licence_number": null, "living_situation": null, "residency_status": null }, "subscription": { "newsletter": true }, "comments": "comments here", "budget": null, "purchase_price": null, "created": "2025-09-16T00:30:52.297Z", "modified": "2025-09-16T00:30:52.297Z", "assignee_email": null, "item": { "type": "Car", "car_type": null, "id": null, "vin": null, "status": null, "colour": null, "body_type": null, "stock_number": null, "redbook_code": null, "build_date": null, "transmission": null, "interior_color": null, "deposit": null, "make": "subaru", "model": "Forester", "badge": null, "year": 2018, "rego": "151vev", "price": null, "engine_size": null, "km": null, "series": null, "comments": null, "url": "https://www.orangesubaru.com.au/trade-in", "spin_code": null, "third_party_integrations": [{ "service": "Loopit", "external_id": "12312" }] }, "lead_events": [], "pipeline": { "id": 496, "name": "Sales" }, "additional_details": { "range": 10405608, "additional_data": "test data" }, "trade_in_data": { "kms": 210000, "make": "subaru", "rego": "151vev", "year": 2018, "badge": null, "model": "Forester", "state": null, "title": null, "series": null, "offer_price": null, "trade_price": 60900, "retail_price": null, "offer_accepted": false, "price_adjustment": null }, "subscription_plan": { "name": "Premium", "subscription_id": 4, "daily_price_for_car": 46.9, "weekly_price_for_car": 329, "monthly_price_for_car": 1425.7, "fortnightly_price_for_car": 658 }}v2 does not include appointments or has_test_drives. Update webhooks reuse the same JSON as create (no extra merged status block on the root).
{ "id": 138559, "item": { "id": null, "km": null, "url": "https://www.orangesubaru.com.au/trade-in", "vin": null, "make": "subaru", "rego": "151vev", "type": "Car", "year": 2018, "badge": null, "model": "Forester", "price": null, "colour": null, "series": null, "status": null, "deposit": null, "car_type": null, "comments": null, "body_type": null, "spin_code": null, "build_date": null, "engine_size": null, "stock_number": null, "transmission": null, "interior_color": null, "third_party_integrations": [{ "service": "Loopit", "external_id": "12312" }] }, "source": "Website", "created": "2025-09-16T00:30:52.297Z", "website": { "id": 794, "url": "https://www.orangemotorgroup.com.au", "name": "Orange Motor Group", "slug": "orange-motor-group" }, "category": "Sell My Car Enquiry", "comments": "comments here", "location": { "city": "Fake city", "state": "QLD", "street": "123 fake street", "postcode": 1234, "location_name": "Orange Motor Group" }, "prospect": { "dob": null, "email": "email@example.com", "title": null, "address": { "city": "Browns Plains", "state": "Queensland", "street": "4 Myola Street", "country": "Australia", "postcode": 4118, "state_long": "Queensland" }, "postcode": 1234, "last_name": "don", "first_name": "xcvxcvdcz", "middle_name": null, "mobile_phone": "0410000000", "opt_in_to_marketing": true }, "provider": "Dealer Studio", "dealership": { "id": 3, "name": "Orange Motor Group", "slug": "orange-motor-group" }, "updated_at": "2025-09-16T00:30:52.297Z", "lead_events": [], "utm_campaign": null, "trade_in_data": { "kms": 210000, "make": "subaru", "rego": "151vev", "year": 2018, "badge": null, "model": "Forester", "state": null, "title": null, "series": null, "offer_price": null, "trade_price": 60900, "retail_price": null, "offer_accepted": false, "price_adjustment": null }, "subscription_plan": { "name": "Premium", "subscription_id": 4, "daily_price_for_car": 46.9, "weekly_price_for_car": 329, "monthly_price_for_car": 1425.7, "fortnightly_price_for_car": 658 }, "lead_cluster_id": 289, "marketing_source": "Unknown", "additional_details": { "range": 10405608, "additional_data": "test data" }, "lead_status_option": { "id": 138, "name": "new", "status_type": "new" }, "assigned_salesperson": { "id": null, "name": null, "email": null }, "subcategory": null, "booking_date": null, "booking_time": null, "offer_data": { "manufacturer": null, "offer_name": null }, "pipeline": { "id": 496, "name": "Sales" }, "lost_reason_comment": null, "lost_reason": null}v3 is v2 plus has_test_drives and appointments (see table above).
{ "id": 138559, "item": { "id": null, "km": null, "url": "https://www.orangesubaru.com.au/trade-in", "vin": null, "make": "subaru", "rego": "151vev", "type": "Car", "year": 2018, "badge": null, "model": "Forester", "price": null, "colour": null, "series": null, "status": null, "deposit": null, "car_type": null, "comments": null, "body_type": null, "spin_code": null, "build_date": null, "engine_size": null, "stock_number": null, "transmission": null, "interior_color": null, "third_party_integrations": [{ "service": "Loopit", "external_id": "12312" }] }, "source": "Website", "created": "2025-09-16T00:30:52.297Z", "website": { "id": 794, "url": "https://www.orangemotorgroup.com.au", "name": "Orange Motor Group", "slug": "orange-motor-group" }, "category": "Sell My Car Enquiry", "comments": "comments here", "location": { "city": "Fake city", "state": "QLD", "street": "123 fake street", "postcode": 1234, "location_name": "Orange Motor Group" }, "prospect": { "dob": null, "email": "email@example.com", "title": null, "address": { "city": "Browns Plains", "state": "Queensland", "street": "4 Myola Street", "country": "Australia", "postcode": 4118, "state_long": "Queensland" }, "postcode": 1234, "last_name": "don", "first_name": "xcvxcvdcz", "middle_name": null, "mobile_phone": "0410000000", "opt_in_to_marketing": true }, "provider": "Dealer Studio", "dealership": { "id": 3, "name": "Orange Motor Group", "slug": "orange-motor-group" }, "updated_at": "2025-09-16T00:30:52.297Z", "lead_events": [], "utm_campaign": null, "trade_in_data": { "kms": 210000, "make": "subaru", "rego": "151vev", "year": 2018, "badge": null, "model": "Forester", "state": null, "title": null, "series": null, "offer_price": null, "trade_price": 60900, "retail_price": null, "offer_accepted": false, "price_adjustment": null }, "subscription_plan": { "name": "Premium", "subscription_id": 4, "daily_price_for_car": 46.9, "weekly_price_for_car": 329, "monthly_price_for_car": 1425.7, "fortnightly_price_for_car": 658 }, "lead_cluster_id": 289, "marketing_source": "Unknown", "additional_details": { "range": 10405608, "additional_data": "test data" }, "lead_status_option": { "id": 138, "name": "new", "status_type": "new" }, "assigned_salesperson": { "id": null, "name": null, "email": null }, "subcategory": null, "booking_date": null, "booking_time": null, "offer_data": { "manufacturer": null, "offer_name": null }, "pipeline": { "id": 496, "name": "Sales" }, "has_test_drives": true, "appointments": [ { "id": 9041, "ai_generated": false, "user": { "id": 88, "name": "Alex Demo" }, "starts_at": "2025-09-18 12:00:00", "created_at": "2025-09-16 09:00:00", "updated_at": "2025-09-16 09:00:00", "status": "pending", "length_in_minutes": 30, "note": "Customer requested SUV demo", "car_for_test_drive": "2018 Subaru Forester Sport" }, { "id": 9042, "ai_generated": true, "user": { "id": 88, "name": "Alex Demo" }, "starts_at": "2025-09-20 13:30:00", "created_at": "2025-09-16 10:15:00", "updated_at": "2025-09-17 08:00:00", "status": "completed", "length_in_minutes": 45, "note": null, "car_for_test_drive": "Toyota Corolla Ascent 2022 (generic car)" } ], "lost_reason_comment": null, "lost_reason": null}