External audit of Italy's second-largest rail operator. Reverse-engineered the existing digital funnel across web and app, identified tracking gaps, and designed a full GA4 measurement architecture — account structure, event taxonomy, conversion framework, and BigQuery integration rationale.
Every tracking decision maps back to a measurable business objective. No event was defined without a clear owner in the funnel.
Single account → single property → three data streams. Standard multi-platform architecture for unified cross-device tracking without data fragmentation.
Splitting web and app into separate properties breaks cross-platform conversion paths. A user searching on mobile and completing checkout on desktop would appear as two non-converting users. One property preserves the full journey.
The property and stream configuration is fully compatible with a GA4 360 upgrade. Advanced governance, enterprise SLAs, and higher hit limits can be added without touching the base architecture.
28 events across automatic measurement, GA4 recommended, and custom — each mapped to a business objective. Filter by type.
| Event Name | Type | Description | Custom Params | Conv. |
|---|---|---|---|---|
| view_search_results | Automatic | Internal site search — fires with term and results_count. Zero-result searches derived via results_count=0, no separate event needed. | search_termresults_count | — |
| scroll | Automatic | 90% scroll depth — used on blog/editorial pages to measure content consumption quality. | — | — |
| click | Automatic | Outbound clicks to external domains (e.g. MSC, GNV, SNAV). Native enhanced measurement event. | link_urllink_domain | — |
| view_item_list | Recommended | User views a list of available travel solutions — routes, departure times, classes. | item_list_name | — |
| view_item | Recommended | User views details of a specific travel option — route, class, price, availability. | items | — |
| add_to_cart | Recommended | User adds a ticket or service to cart. Key drop-off measurement point before checkout. | itemsvalue | — |
| begin_checkout | Recommended | User initiates the ticket purchase process. | itemsvalue | — |
| add_payment_info | Recommended | User enters payment details — last measurable step before confirmed purchase. | — | — |
| purchase | Recommended | Ticket purchase confirmed. Primary revenue conversion event. | travel_classtransaction_idvalue | ✓ Revenue |
| view_promotion | Recommended | User views a promotional offer or additional service during checkout flow. | — | — |
| select_promotion | Recommended | User interacts with a promotional offer or upgrade proposal. | — | — |
| generate_lead | Recommended | High-intent contact captured — email from pop-up or newsletter. Feeds CRM and remarketing audiences. | lead_source | ✓ Lead gen |
| sign_up | Recommended | User creates an Italo account — entry point to loyalty programme tracking. | — | ✓ Lead gen |
| login | Recommended | User authenticates — triggers User-ID assignment for cross-device stitching. | loyalty_tier | — |
| exception | Recommended | Technical errors — checkout failures, payment errors, app crashes. GA4 native error tracking. | descriptionfatal | — |
| upsell_purchase | Custom | Purchase of additional services that increase order value — upgrade, lounge, premium extras. | upsell_typevalue | ✓ Revenue |
| newsletter_subscription | Custom | Newsletter opt-in — differentiated by type (promotional, blog, travel alerts). | newsletter_type | ✓ Lead gen |
| select_upgrade | Custom | User selects a class or service upgrade during booking flow. | upgrade_type | — |
| add_lounge_access | Custom | User adds lounge access to cart — high-value add-on signal. | — | — |
| remove_upgrade | Custom | User removes a previously selected add-on — friction signal for upsell flow optimisation. | — | — |
| abandoned_checkout_popup_view | Custom | User sees the cart recovery pop-up — exposure measurement for abandonment flow. | — | — |
| abandoned_checkout_email_submit | Custom | User submits email via recovery pop-up — high-intent lead, feeds remarketing audiences. | — | — |
| price_alert_subscription | Custom | User activates a price drop alert — declared purchase intent, valuable for segmentation. | — | — |
| blog_to_booking_click | Custom | Click from blog article toward booking area — measures editorial content's contribution to funnel entry. | article_titledestination | — |
| loyalty_points_earned | Custom | Points credited after qualifying purchase — loyalty programme engagement signal. | — | — |
| spend_virtual_currency | Custom | User spends loyalty points — programme utilisation metric. | — | — |
| redeem_loyalty_points | Custom | User redeems a reward or benefit — highest loyalty engagement signal. | — | — |
| view_loyalty_benefits | Custom | User consults loyalty programme benefit page — consideration signal before sign-up or redemption. | — | — |
The event taxonomy is structured around three strategic priorities — not a flat list of trackable actions.
Click to expand ↓
The full e-commerce sequence — view_item_list → view_item → add_to_cart → begin_checkout → add_payment_info → purchase — is measured end to end. Every drop-off point is visible and actionable.
Upsell events (upsell_purchase, select_upgrade, add_lounge_access) sit alongside the core funnel. This allows the team to optimise average order value separately from acquisition volume — two different levers, both measurable.
Italo Blog generates organic traffic — but traffic alone doesn't justify editorial investment. Standard GA4 reports can't connect a blog session to a booking made days later without a dedicated event.
This custom event fires when a user clicks toward the booking area from an article. Combined with scroll depth, it creates a measurable link between content consumption and funnel entry — making editorial ROI quantifiable.
Users who abandon the funnel but submit their email via pop-up are among the highest-intent users on the platform. abandoned_checkout_email_submit + generate_lead feed directly into CRM segmentation and Google Ads remarketing lists.
price_alert_subscription identifies users with declared purchase intent and a specific price threshold. This is a high-value audience segment for remarketing automation — they've told you exactly when they want to buy.
GA4's standard interface has hard limits: sampled data above thresholds, 14-month retention, no raw event-level querying. At Italo's scale, these constraints limit the depth of analysis that's actually possible.
The architecture was designed with BigQuery export in mind from the start. Custom dimensions exist precisely because they need to be queryable at row level — not just aggregated in the GA4 interface.
Query raw event sequences per user session — identify exactly where users exit between add_to_cart and begin_checkout without sampling distortion.
Cross-join login (loyalty_tier param) with purchase events to measure whether higher-tier members convert at different rates or AOVs — not possible in the standard UI.
Reconstruct paths where a blog session precedes a booking session across different days — quantifying editorial content's true contribution to revenue beyond last-click.
Map the event sequence around select_upgrade → remove_upgrade → upsell_purchase to identify friction points in the add-on flow at session granularity.
This architecture transforms GA4 from a traffic counter into a decision tool — connecting content, acquisition, conversion, loyalty, and recovery into a single measurable system.