The complete guide to the GA4 + ASC Events connector
A Looker Studio community connector that pulls data from Google Analytics 4 with an automotive layer on top. This guide covers the current release — Connector v1.3.0, built on ASC spec v1.2 (47 events: 41 standard + 6 optional).
1. What this is
- Every GA4 field on your property — all standard dimensions and metrics (traffic sources, devices, geography, pages, sessions, users, ecommerce…) plus any custom dimensions/metrics registered on the property. The field list is built live from your property, so new fields appear automatically.
- The ASC layer — all 47 ASC (Automotive Standards Council) v1.2 events, classified and ready to use: friendly event names, lead channels (Phone / Chat-SMS / Form / Video), conversion classes, department classifications, quality tiers, 18 lead buckets, 15 calculated rate metrics, and 23 pre-declared vehicle parameters.
- Multi-property rollups — combine multiple GA4 properties into a single data source with automatic Property ID and Property tagging.
- Traffic filtering — built-in checkboxes to exclude internal traffic and test/staging hostnames.
- Forward-compatible event architecture — dynamic registry overrides via Script Properties, unclassified-event alerts, and built-in audit tools.
| Term | Meaning |
|---|---|
| Connector | The Apps Script program you install once. |
| Data source | A saved configuration of the connector (one or more GA4 properties + options). |
| Report | A Looker Studio dashboard built on one or more data sources. |
2. Requirements
- A Google account with at least Viewer access to the GA4 property (only the person creating the data source needs this — report viewers don’t, see §8).
- The website must send ASC events (asc_click_to_call, asc_form_submission…) to that GA4 property for the ASC lead fields to have data. All regular GA4 fields work regardless.
- The two connector files: Code.js and appsscript.json.
3. Install (once, ~5 minutes)
3.1 Create the script
- Go to script.google.com (signed in with your GA4-access account) → + New project. Name it GA4 ASC Events.
- Project Settings (gear) → check Show appsscript.json manifest file in editor.
- Editor: in Code.gs delete the contents and paste in all of Code.js; in appsscript.json delete the contents and paste in all of appsscript.json.
- Save (Ctrl+S).
3.2 Enable the Analytics APIs — do not skip
Pasting the manifest lists the services but does not switch the APIs on. In the left sidebar:
- Under Services, if AnalyticsData or AnalyticsAdmin already appear, remove both and Save.
- Click Services (+) → add Google Analytics Data API.
- Click Services (+) again → add Google Analytics Admin API.
- Wait 1–2 minutes for enablement to propagate.
Verify: in the toolbar function dropdown pick test_listProperties → Run (authorize when prompted) → open the execution log. You should see your GA4 properties. A 403 … has not been used in project means the APIs aren’t enabled yet — redo this section and wait another minute.
3.3 Create the deployments (two — they serve different people)
- For yourself (testing): Deploy → Test deployments → copy the Head deployment ID. It always runs the latest saved code, but only works for accounts with access to the script — never share it.
- For everyone else (production): Deploy → New deployment → gear → select Looker Studio Connector → description “v1” → Deploy → copy this Deployment ID. This is the ID you share; it works for any Google account. Two mistakes both produce The linked connectorId was invalid for other users: sharing the head ID, or not link-sharing the script project as Viewer.
Shipping updates: Deploy → Manage deployments → edit → Version: New version → Deploy. The ID never changes, so existing users are unaffected until you choose to ship.
3.4 Share the script — required for anyone else to connect
Unlisted connectors require every user to have read access to the Apps Script project. In the editor click Share → General access: Anyone with the link → Viewer → Done. The script won’t appear in users’ Drives, and your Script Properties (Stripe keys etc.) are never visible. If “Anyone with the link” is unavailable, your Workspace admin has external link-sharing disabled.
4. Connect a data source
- Open (replacing your ID):
https://lookerstudio.google.com/datasources/create?connectorId=YOUR_DEPLOYMENT_ID - Authorize both prompts. On the “Google hasn’t verified this app” screen — normal for a personal script — click Advanced → Go to GA4 ASC Events. It’s your own code, read-only.
- Configure: GA4 Property (dropdown of every property your account can read), Additional GA4 Property IDs (comma-separated, to roll up multiple stores), ASC events only (leave OFF for general use — see §6.2), Exclude internal traffic, Exclude test / staging hostnames, and Allow GA4 Property to be modified in reports for multi-store setups.
- Connect → review the field list → Create report.
5. The fields
The field picker is grouped: ASC fields sit in their own labeled ASC ► sections, separate from GA4’s own categories. Hover any field for a description.
5.1 Connector & multi-property metadata
Connector Version (e.g. 1.3.0) · ASC Spec Version (v1.2) · Property ID · Property (display name) — the last two power multi-store rollups.
5.2 ASC ► Classification (10 dimensions)
| Field | Type | Values / example |
|---|---|---|
| ASC Event | Text | “Form Lead — Sales”, “Click to Call”, “Pageview” |
| ASC Lead Channel | Text | Phone, Chat/SMS, Form, Video, Website, Non-ASC |
| ASC Event Class | Text | Conversion, Derivative Conversion, Engagement, Derivative Engagement, Background |
| ASC Is Conversion | Boolean | true for C and DC events |
| ASC Lead Department | Text | Sales, Service, Parts, Sales Appointment, Service Appointment, Other, Unclassified |
| ASC Is Appointment Lead | Boolean | true for a sales/service appointment lead |
| ASC Is Derivative | Boolean | true for derivative conversions/engagements |
| ASC Is Background | Boolean | true for background events (asc_system_process) |
| ASC Is Lead | Boolean | true for parent lead submissions |
| ASC Lead Quality | Text | Hot (appointments), Warm (sales/service leads), Cold, Non-Lead |
5.3 ASC ► Leads & Engagement (18 bucket metrics)
| Group | Metric | Counts |
|---|---|---|
| Leads | Total Leads | Sum of the 4 parent submission events |
| Leads | Phone Leads | asc_voice_submission |
| Leads | Chat/SMS Leads | asc_comm_submission |
| Leads | Form Leads | asc_form_submission |
| Leads | Video Call Leads | asc_video_call_submission |
| By Department | Sales / Sales Appt / Service / Service Appt / Parts / Unclassified Leads | Sums of the matching derivative events across all 4 channels |
| Engagement | Click-to-Calls | asc_click_to_call |
| Engagement | Form Engagements | asc_form_engagement |
| Engagement | Chat/SMS Engagements | asc_comm_engagement |
| Engagement | Voice Call Engagements | asc_voice_engagement |
| Engagement | Voice Calls ≥ 30s | asc_voice_engagement_30 |
| Engagement | Video Call Engagements | asc_video_call_engagement |
| System | Unclassified ASC | asc_unclassified (forward-compatibility alert) |
No double counting: channel lead metrics count parent submission events only; department metrics count the derivative events, which are mutually exclusive per submission.
5.4 ASC ► Rates (15 calculated metrics)
Calculated in Looker Studio with AUTO aggregation (division by zero safely yields null):
- Form Completion Rate = Form Leads ÷ Form Engagements
- Chat Conversion Rate = Chat Leads ÷ Chat Engagements
- Phone Connect Rate = Voice Calls ≥ 30s ÷ Click-to-Calls
- Phone Lead Rate = Phone Leads ÷ Click-to-Calls
- Phone Connect-to-Lead Rate = Phone Leads ÷ Voice Calls ≥ 30s
- Video Completion Rate = Video Leads ÷ Video Engagements
- Overall Lead Rate = Total Leads ÷ (all engagements)
- Overall Appt Rate = (Sales Appt + Service Appt) ÷ Total Leads
- Appt Rate (Phone / Chat-SMS / Form / Video)
- Appt Rate (Sales) and Appt Rate (Service)
- Unclassified Lead Rate = Unclassified Leads ÷ Total Leads
5.5 GA4 · Vehicle (23 pre-declared dimensions)
These populate automatically from custom event parameters once registered in GA4 Admin → Custom definitions (see §10).
Core vehicle: Item Make, Model, Year, Trim, Price, VIN, Stock Number, Condition, Body Style, Color, Fuel Type, Location, Category, Payment, Inventory Date, Search Result Count.
EV-specific (optional, new in v1.2): Battery Life %, Odometer, Range (miles), Charge L1 (hrs), Charge L2 (hrs), Charge L3 (hrs), Drivetrain.
6. Rules of the road
6.1 Don’t mix session/user metrics with lead metrics in the same chart
A chart mixing Sessions (or Total Users) with Phone Leads forces a hidden per-event breakdown; the session numbers become “sessions containing that event” and re-add wrongly. Same page is fine, same chart is not.
6.2 The “ASC events only” checkbox
OFF (default): all events flow; property-wide metrics (Sessions, Users, Pageviews) are correct, and ASC fields still work. ON: every query is filtered to the 47 asc_* events — perfect for dedicated lead data sources, wrong for Sessions/Users.
6.3 Traffic filters
Check Exclude internal traffic for production reports (filters hits flagged in GA4 Admin). Check Exclude test / staging hostnames to strip out localhost, staging., dev., qa., test.
7. Forward compatibility & audits
7.1 Dynamic event overrides (ASC_EVENTS_OVERRIDE)
If a vendor introduces new ASC events, add them without redeploying. In Apps Script → Project Settings → Script Properties, add ASC_EVENTS_OVERRIDE as a JSON string, e.g. { "asc_voice_sms_submission": ["Voice SMS Lead", "Phone", "C"] }.
7.2 test_auditEvents()
Run test_auditEvents() in the editor to audit all events received by a property in the last 30 days. The log lists known ASC events, unclassified ASC events (start with asc_ but missing from the registry), and top non-ASC events.
7.3 test_listKnownLimitations()
Run test_listKnownLimitations() for a real-time summary of supported features vs GA4/Looker Studio platform boundaries.
8. Multi-store setups
- Rollup data source (built-in): enter multiple property IDs into Additional GA4 Property IDs; use the Property or Property ID dimension to break down or filter by store.
- One data source per store: duplicate the data source, switch the property, duplicate the report page.
- Property override: tick Allow GA4 Property ID to be modified in reports; editors switch the property per report copy.
9. Troubleshooting
| Symptom | Cause → fix |
|---|---|
| Other users get “The linked connectorId was invalid” | Script not link-shared (§3.4), head ID shared instead of the versioned deployment ID, or deployment access left at “Only myself”. |
| Config shows a text input instead of the property dropdown | Analytics APIs not enabled on the script — §3.2. |
| 403 … has not been used in project | Re-add both services via Services (+), wait 2 min. |
| …not registered on this GA4 property | Register the vehicle custom definition in GA4 Admin → Custom definitions. |
| GA4 cannot combine the fields in this chart | GA4-incompatible dimension/metric pair — remove one field. |
| Too many fields for one GA4 query | Over 9 dims / 10 metrics in one chart — remove fields. |
| Unclassified ASC metric is > 0 | Site is sending unknown asc_* events. Run test_auditEvents() and configure ASC_EVENTS_OVERRIDE. |
| Sessions look too low | “ASC events only” is ON, or Sessions mixed into an ASC lead chart — §6.1–6.2. |
| Quota exceeded | Big property + many charts — narrow date ranges; the connector caches 30 min, so bursts settle. |
| Data missing for yesterday/today | GA4 processing latency (24–48 h). |
10. Registering ASC parameters
GA4 only exposes event parameters and user properties to reporting after registration under Custom definitions:
- In GA4: Admin → Data display → Custom definitions → Create custom dimension (or metric).
- Name it (e.g. Item Make), scope Event (or User), Event parameter = the exact ASC parameter name.
- Repeat, then Edit data source → Refresh fields in Looker Studio. New fields appear labeled “(custom)”.
Registration is not retroactive — GA4 collects parameter data from the day of registration forward.
10.1 Key mapped parameters (closed-list)
| Parameter | Example allowed values (v1.2) | Notes |
|---|---|---|
| department | sales, service, parts, trade, credit, body_shop, ev_service, quick_lube, unknown | ev_service & quick_lube new in v1.2 |
| comm_type | chat, sms, voice, video, form, email | Required on asc_click_to_call in v1.2 |
| form_type | consumer_contact, trade, service_appointment, quote, ev_appointment, unknown | ev_appointment new in v1.2 |
| page_type | item, itemlist, contact, service, parts, sitemap, blog, ev, blog_list, unknown | sitemap, blog, ev, blog_list new in v1.2 |
| process_type | popup, element_visible, script_error, phone_number_swap, chat_available, scroll… | New in v1.2 (asc_system_process) |
| user_type | online_customer, instore_customer, client_staff, bot, ai_agent | bot & ai_agent new in v1.2 |
10.2 Dynamic parameters (free-text)
event_owner (vendor sending the event, required on all events), submission_id, item_make / item_model, item_id (VIN), item_price, item_year, item_number (stock #), and — new in v1.2 — page_layout, page_template_style, process_name, plus element_text / element_title.
10.3 Optional EV parameters (new in v1.2)
| Parameter | Format / range | Description |
|---|---|---|
| item_battery_life_percent | 0.00–1.00 | Battery state of health (0.95 = 95%) |
| item_odometer | Miles or km | Odometer reading |
| item_range | Miles (integer) | Estimated range on a full charge |
| item_charge_duration_level1/2/3 | Hours (float) | Level 1 (120V), Level 2 (240V), Level 3 (DC fast) charge time |
| item_drivetrain | FWD, RWD, AWD, 4WD | Drivetrain configuration |
10.4 User properties (user-scoped)
user_id, secondary_id, secondary_id_provider (e.g. vistadash, carnow, marchex — 78 standard vendor slugs), user_type, oem_brand, store_name, oem_code.
11. Subscription licensing (optional, Stripe)
Configured entirely via Apps Script → Project Settings → Script Properties:
| Script property | Value |
|---|---|
| STRIPE_RESTRICTED_KEY | Restricted key (rk_live_…) with Customers: Read and Subscriptions: Read only |
| STRIPE_PAYMENT_LINK | Your Stripe Payment Link URL (shown to unlicensed users) |
| STRIPE_PRICE_ID | (optional) price_… — only subscriptions with this price grant access |
| LICENSE_EXEMPT_EMAILS | (optional) comma-separated emails that always pass |
The data-source creator’s Google email must belong to a Stripe customer with an active or trialing subscription. Report viewers are never checked. Verdicts are cached (6 hours for subscribers, 10 minutes for unlicensed accounts), and a per-email circuit breaker fails open during Stripe outages so paying users are never locked out. Run test_checkLicense() for the full diagnostic.
12. Updating & maintenance
- Connector updates: paste the new Code.js (and manifest if changed) → Save. The head deployment picks it up instantly for testing; ship it to users via Deploy → Manage deployments → edit → Version: New version → Deploy (the production ID never changes).
- Schema: self-refreshes within ~5 min; force with Refresh fields.
- Nothing else to maintain — no keys to rotate, no servers. Access follows GA4 permissions: lose property access and the data source stops.
Questions about the connector? See the connector FAQ or contact VCTRS via vctrs.io.
