Changelog
Unreleasedβ
π Premiumβ
- BigQuery utilities module
- Google Search Console module
π§° Coreβ
- nothing planned
π€ Communityβ
- nothing planned
Releasedβ
π [Premium v2.2.8]β
2026-06-22
π Addedβ
- GA4 Attribution Modeling module - multi-touch attribution from raw GA4 events: a touchpoint stream (session or source_change mode) is grouped into user journeys, conversion credit is apportioned across touches by fractional models (first-touch, last-touch, linear, position-based, time-decay) plus an opt-in participation model, and six additive, date-partitioned reports cover channel chains, journey summaries, channel assists, channel transitions (Sankey), conversion lag, and micro-conversion lift. Opt-in (
enabled: false); define your conversions andjourney.closing_conversionsto populate it. See GA4 Attribution Modeling GA4_DATASET_PROJECT- read the GA4 export from a different GCP project than the one your outputs are written to (e.g. a dev/test project reading the production export). Setvars.GA4_DATASET_PROJECTinworkflow_settings.yaml; defaults to the output project when unset. The Dataform service account needs BigQuery Data Viewer on the source dataset. See Cross-Project Setup
π οΈ [Installer v2.2.8]β
2026-06-16
π Fixedβ
- Preserve customer GitHub connection on Dataform repo updates - repo updates no longer reconcile away a customer's out-of-band GitHub connection. The Dataform repository's externally-managed
git_remote_settings(and workspace compilation overrides) are now left untouched on refresh, so the GitHub remote stays connected and workspaces no longer end up in a conflicted git state
π [Premium v2.2.7]β
2026-06-15
π Fixedβ
- Custom lineage views skipped when the step is disabled - the custom GA4 lineage actions (
ga4_events_custom,int_ga4_sessions_custom,ga4_sessions_custom) are no longer materialized as orphan pass-through views whenCUSTOM_LINEAGE.<table>isfalse; downstream tables already read the core tables directly in that case is_finaltimezone fix - the data-finality flag now computesCURRENT_DATE()in the install'sLOCAL_TIMEZONEinstead of timezone-naive UTC, so the 72-hour late-data window flips on the correct day boundary for the data
π [Premium v2.2.6]β
2026-06-11
π Addedβ
- Export to Google Cloud Storage - opt-in cross-cloud export that writes your output tables to a GCS bucket as partitioned Parquet, ready to load into Snowflake, Databricks, BigLake, or any Parquet-aware engine. Off by default; enable it globally with the
GCS_EXPORT_*settings inworkflow_settings.yamlor per-module with aGCS_EXPORToverride. Partitioned tables are written as hive-partitioned folders (one file set per date), incremental tables export only the current load window, and the export runs as a best-effort step that never fails the table build. See Export to Google Cloud Storage - Open-text SQL filter (
sql) forCUSTOM_SESSION_PARAMS_ARRAYandCUSTOM_SESSION_TOTALSin the GA4 module - a raw SQL boolean predicate as an escape hatch wheneventFilter/paramFiltercan't express the condition (e.g. matching onpage.path). Mutually exclusive witheventFilter/paramFilter; foreventsToCountasqlentry must also setrenameTo fallbackFieldfor custom channel grouping in the GA4 module - choose which default field unmatched traffic falls back to whenuseDefaultChannelGroupingAsFallback: true(defaults todefault_channel_grouping)
Changedβ
- Empty default
conversion_action_namesin the Google Ads module - the default config now ships an empty list instead of thePurchase/Add to Cart/30s on pageplaceholders; define your own conversion actions in the custom config. Existing installs keep their configured values - Empty default
listAttributiondimensions in the Item Funnel module -dimsToStoreandpickDimsFromTheseEventsnow ship empty by default; populate them in the custom config to enable item list attribution
π οΈ [Installer v2.2.7]β
2026-06-07
π Addedβ
- VPC Service Controls warning - the installer now detects when VPC Service Controls are active on the project and surfaces a warning during setup, so you can resolve access restrictions before they cause silent failures
- Billing warning - the installer now surfaces a warning when billing configuration may affect the deployment, reducing ambiguity during first-time setups
π [Premium v2.2.5]β
2026-06-07
π Addedβ
- Brave classified as a search engine in source categories β sessions originating from Brave Search are now correctly attributed to Organic Search in the default channel grouping
- Improved AI referrer classification β ChatGPT and Perplexity are now classified more accurately in the default channel grouping, reducing misattribution to direct or referral
π Fixedβ
fixed_traffic_sourceattribution fix β the GA4 BigQuery export can deliver hits out of order: a hit with an earlier timestamp may arrive in a later batch and therefore lackcollected_traffic_source. The previous logic selected the earliest hit, which could be one of those under-informed hits, causing sessions to show incorrect or missing traffic source data. Source derivation now selects the hit with the most information, and cases where timestamp and batch ordering disagree are handled correctly. Multi-source sessions now derive the last source only from hits that havecollected_traffic_sourceset. This resolves incorrect Referral classification for some Organic sources, including gclid traffic without a campaign appearing as Google Referral.
π [Premium v2.2.4]β
2026-04-28
π Addedβ
all_conversionsandall_conversions_valuein the Google Ads module - aggregate ofmetrics_conversionsandmetrics_conversions_valueacross all configuredconversion_action_names, added togoogle_ads_campaign_report,google_ads_ad_group_report,google_ads_ad_report, andgoogle_ads_keyword_report. Provides a stable column name for downstream dashboards regardless of which individual conversion actions are configuredaddDefaultflag forCUSTOM_SESSION_TOTALSin the GA4 module - whentrue, merges a curated baseline ofeventsToCount,uniqueFields, andsumFields(page_view, session_start, ecommerce events, transaction_id, user_id, device.category, page hostname/path, engagement_time_msec, purchase_revenue) with your custom entries (your entries win onrenameTo/namecollision). Defaults totruefor new installs; existing installs without the flag continue to see only their explicitly configured entriesonSchemaChange: EXTENDongoogle_ads_dim_ad_groups,google_ads_dim_ads,google_ads_dim_keywords, andgoogle_ads_gclids- column additions in future releases no longer require a rebuild
π Fixedβ
- Apostrophes and other special characters in Google Ads
conversion_action_names(e.g.Client's Call) now work - conversion action names are wrapped in BigQuery triple-quoted string literals so escaping no longer breaks Dataform's compile pipeline - Clearer error messages for Google Ads misconfigurations - separate, actionable errors when
enabled: truebutgads_sourcesis missing/empty/malformed, whenconversion_action_namesis missing/empty/malformed, and whenenabled: falsebutgads_sourcescontains entries - Generic config merge now concatenates and dedupes arrays (by
renameTo/name/value, custom wins) instead of replacing whole arrays - lets core ship baseline arrays users can extend without redeclaring
Schema Changesβ
This release introduces new columns on Google Ads report tables (all_conversions, all_conversions_value). Thanks to onSchemaChange: EXTEND no rebuild is required, but historical values for these columns will only populate from this version forward. Run a reprocessing job over the desired date range if you need them backfilled.
For CUSTOM_SESSION_TOTALS, existing installs see no schema change unless they explicitly opt in by setting addDefault: true in includes/custom/modules/ga4/config.js.
π οΈ [Installer v2.2.2]β
2026-04-08
π Addedβ
- Automated GA4 Export Trigger - automatically update your GA4 output tables the moment the GA4 daily events export lands in BigQuery (Premium π)
- Email Alerts for Dataform Errors - get notified by email when a Dataform workflow invocation fails (Premium π)
π [Premium v2.2.3]β
2026-04-08
π Addedβ
- Custom Lineage (
ga4_events_custom,int_ga4_sessions_custom,ga4_sessions_custom) in the GA4 module - inject custom transformation layers between core pipeline tables as views or incremental tables, with automatic routing for all downstream modules - Reprocessing & Batching - reprocess specific date ranges without rebuilding entire history, with a batch script (
scripts/batch-reprocess.sh) for large backfills that avoids BigQuery's 6-hour timeout - PII Detection in the Parameter Detection module - automatically detects personally identifiable information in parameter names and values, with 19 configurable value patterns and a pattern tester view
- Multi-property support in the Parameter Detection module -
property_idandproperty_namecolumns in all output tables for per-property parameter auditing paramFilterfor Session Totals -eventsToCount,uniqueFields, andsumFieldsinCUSTOM_SESSION_TOTALSnow support the sameparamFiltersyntax asCUSTOM_SESSION_PARAMS_ARRAYfor conditional aggregation
π Fixedβ
ignore_referrercase sensitivity - now correctly matches GA4's lowercase"true"value- Medium attribution
CASEreordering to prevent misclassification - Module dependency resolution when a module config is disabled
ref()resolution for disabled modules
Schema Changesβ
Updating to this version adds property_id and property_name columns to ga4_parameter_detection_report_daily via onSchemaChange: EXTEND. No full rebuild is required, but if you need historical values for these fields you will need to rebuild the table.
π [Premium v2.1.2]β
2026-03-09
π Addedβ
- Item list attribution report (
ga4_item_list_attribution_report) in the Item Funnel module - attributes e-commerce funnel metrics to the item list where an item was first or last seen in a session (e.g. "Related Products", "Homepage Carousel"), with first-touch (metrics_first) and last-touch (metrics_last) attribution models
π οΈ [Installer v2.2.0]β
2026-03-07
Changedβ
Strict Act As mode update
We have updated the installer to align with the Strict Act-As design pattern for Dataform execution, improving security, isolation of responsibilities, and auditability. Previously, all permissions were assigned to the Dataform Default Service Account, combining orchestration and BigQuery data access. With this update, permissions are now explicitly split between two service accounts.
- Dataform Default Service Account
- Dataform Service Agent
- Secret Manager Secret Accessor
- Service Account Token Creator
- Service Account User
This service account is now limited to orchestration, scheduling, metadata access, and impersonation only.
It no longer has direct access to BigQuery data.
- Custom Service Account
- BigQuery Data Editor
- BigQuery Data Viewer
- BigQuery Job User
This service account is used exclusively for query execution in BigQuery and is accessed only via impersonation during Dataform runs.
This change brings the installer in line with Google Cloud security best practices and Dataform Strict Act-As mode requirements.
π [Premium v2.1.1]β
2026-02-17
Schema Changesβ
Updating to this version will add property_name to all output tables. No full rebuild required thanks to onSchemaChange: EXTEND.
π Addedβ
- Cross-project multi-property:
EXTRA_GA4_DATASETS_ARRAYnow supports datasets in different GCP projects and custom property names (string, dot-notation, or object format) property_namecolumn acrossga4_events,ga4_sessions, andga4_transactionsβ companion toproperty_id, shows the custom name if configuredCLUSTER_BYconfig (Premium): prepend custom clustering columns before fixed trailing columns onga4_eventsandga4_sessionsonSchemaChange: EXTENDon all intermediate and output tables for automatic schema evolution
Changedβ
- Removed "same GCP project" requirement for multi-property setups
π [Premium v2.0.5]β
2025-12-18
Schema Changesβ
Updating to this version will require some tables to be fully rebuild because of a addition of new columns
int_ga4_sessionsandga4_sessionswith newfirst_user_idcolumnint_ga4_transactionsandga4_transactionswith newproperty_idcolumnga4_eventswith new records in event_params
π Addedβ
unique_search term,gad_campaingid,gad_sourceas standard event paramsgclsrcas param to check to classify as Googlefirst_user_idinint_ga4_sessionsandga4_sessionsproperty_idas column inint_ga4_transactionsandga4_transactionsis_multiday_sessioncolumn : Flag indicating if the session has events across more than one day
π Fixedβ
- Add missing column documentation fields
Changedβ
- Standardized SQL style
- Renaming modules and tables
- Changed directory structure and main config file moved
π§° π€ [Core v1.19.0]β
2025-12-18
Schema Changesβ
Updating to this version will require some tables to be fully rebuild because of a addition of new columns
int_ga4_sessionsandga4_sessionswith newfirst_user_idcolumnint_ga4_transactionsandga4_transactionswith newproperty_idcolumnga4_eventswith new records in event_params
π Addedβ
unique_search term,gad_campaingid,gad_sourceas standard event paramsgclsrcas param to check to classify as Googlefirst_user_idinint_ga4_sessionsandga4_sessionsproperty_idas column inint_ga4_transactionsandga4_transactionsis_multiday_sessioncolumn : Flag indicating if the session has events across more than one day
π Fixedβ
- Add missing column documentation fields
Changedβ
- Standardized SQL style
- Renaming modules and tables
- Changed directory structure and main config file moved
π [Premium v2.0.4]β
2025-11-11