Car Dealer Example
In an Automotive Retail (Car Dealer) setup, BPP unifies CRM leads, test drive bookings, web interactions, and sales transactions to power:
- Action Prediction: likelihood a lead will convert into a car sale, request a test drive, or sign a financing plan.
- pcLTV: expected lifetime value (vehicle + accessories + aftersales).
- RFM Segmentation: recency, frequency, and monetary of purchases or service visits.
- Interest Analysis: affinity for brands, car models, or categories.
- Signals & Audiences: activating CRM leads or website visitors into ad platforms.
IDs & identity resolution
Car dealers often work with multiple IDs across CRM, website, and offline systems. BPP reconciles these into a single Bytek ID.
Recommended identifiers
- CRM Lead ID (primary in lead-management system).
- Hashed email (Google-style normalization + SHA-256).
- Hashed phone (E.164 + SHA-256).
- First-party cookie / GA4 user_pseudo_id from web analytics.
- Dealer Management System (DMS) Customer ID for aftersales.
See Identifiers & Hashing for normalization rules.
Core tables
1. User table — Leads / Customers
CREATE TABLE my_dataset.crm_contacts (
crm_contact_id STRING, -- CRM lead/customer ID
hem STRING, -- hashed email
hphone STRING, -- hashed phone
fp_cookie_id STRING, -- GA4 user_pseudo_id if available
first_name STRING, -- optional cleartext (hashed by BPP if flagged)
last_name STRING, -- optional cleartext
job_role STRING, -- if B2B fleet lead
company_name STRING, -- if fleet lead
acquisition_channel STRING, -- website, referral, campaign
lead_source STRING, -- UTM or CRM source
lead_medium STRING, -- UTM medium
lead_campaign STRING, -- campaign name
preferred_brand STRING, -- declared interest (BMW, Audi...)
preferred_model STRING, -- declared model interest
budget_range STRING, -- declared price range
financing_interest BOOL, -- interested in financing/leasing
service_customer BOOL, -- true if also aftersales customer
consent_marketing BOOL,
consent_timestamp DATETIME,
created_at DATETIME,
updated_at DATETIME
);
2. Event table — Deal Stage History
Tracks how a lead moves across pipeline stages: New Lead → Contacted → Test Drive → Negotiation → Closed Won/Lost.
CREATE TABLE my_dataset.deal_stage_history (
row_id STRING,
event_timestamp DATETIME, -- UTC
crm_contact_id STRING,
deal_id STRING,
old_stage STRING,
new_stage STRING, -- e.g. Test Drive, Proposal Sent, Closed Won
car_model STRING, -- model linked to the deal
car_category STRING, -- SUV, Sedan, EV...
deal_value FLOAT64, -- quoted car value
currency STRING,
financing_type STRING, -- lease, financing, cash
dealer_location STRING,
created_at DATETIME
);
3. Event table — Test Drive Bookings
CREATE TABLE my_dataset.test_drive_events (
booking_id STRING,
event_timestamp DATETIME, -- booking time
crm_contact_id STRING,
hem STRING,
car_model STRING,
car_category STRING,
dealer_location STRING,
booking_status STRING, -- booked, attended, no_show, cancelled
created_at DATETIME
);
4. Event table — Website Behavioural Data
CREATE TABLE my_dataset.web_events (
event_id STRING,
event_timestamp DATETIME,
fp_cookie_id STRING,
hem STRING,
crm_contact_id STRING,
event_type STRING, -- pageview, brochure_download, form_submit
page_url STRING, -- absolute URL
utm_source STRING,
utm_medium STRING,
utm_campaign STRING,
gclid STRING,
gbraid STRING,
wbraid STRING,
device_class STRING,
browser STRING,
country STRING,
created_at DATETIME
);
5. Event table — Aftersales Transactions (optional)
CREATE TABLE my_dataset.service_transactions (
transaction_id STRING,
event_timestamp DATETIME,
crm_contact_id STRING,
hem STRING,
service_type STRING, -- maintenance, repair, parts
service_value FLOAT64,
currency STRING,
dealer_location STRING,
created_at DATETIME
);
Do & don't summary
| ✅ Do | ❌ Don't |
|---|---|
| Store pipeline as history (deal_stage_history) | Overwrite a single deal_stage field |
| Track test drive bookings as events | Just log "last_test_drive_date" in CRM |
| Keep absolute URLs and attribution fields in web events | Truncate URLs or drop query params |
| Store transaction_id in sales/aftersales | Rely only on mutable revenue fields |
| Hash PII consistently (SHA-256) | Hash without trimming/lowering/normalizing |
How BPP uses these tables
- Action Prediction — Positive = Closed Won deal; Negative = Closed Lost. Features from CRM (budget, brand, financing interest) + web behaviours (brochure downloads, test-drive booking).
- pcLTV — Transaction sources = car sales + aftersales service. Product hierarchy =
car_category||car_model. - RFM — Recency = last purchase or service. Frequency = number of purchases + services. Monetary = sum of sales + service values.
- Interest — From web browsing (
page_url) → IAB/Custom Interest; from declaredpreferred_brand/preferred_model.
Why this design works
- Deal history supports precise target derivation for Action Prediction.
- Test drive events improve early-stage behavioural features.
- Web behavioural data enables attribution, Interest, and better ad match rates.
- Aftersales transactions extend pcLTV to the full customer lifecycle.
- Multiple IDs (hem, hphone, cookie, CRM ID) maximize identity resolution & ad activation.