{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/whose-stack-is-it-anyway/#article",
      "headline": "Whose stack is it anyway?",
      "description": "Google's running two in parallel - Marketing and Cloud. You'll likely still be using both for the next few years. So here's how to work with them and make them your own.\n\nThree Google announcement events recently - Cloud Next in April, I/O on May 19-20, Google Marketing Live on May 20. The Marketing Live keynote actually overlapped with the second day of I/O, which struck me as not accidental - Gemini is running under all of it. And, in doing so, rebuilding your measurement stack.\n\n\nWhat Google ",
      "url": "https://www.measurelab.co.uk/insights/blog/whose-stack-is-it-anyway/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/whose-stack-is-it-anyway/#webpage"
      },
      "datePublished": "2026-05-22T12:30:17.000+00:00",
      "dateModified": "2026-05-22T14:17:00.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2026/05/gml-2026-blog-featured-v3.svg",
      "author": {
        "@type": "Person",
        "name": "Mark Rochefort",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "articleBody": "Google's running two in parallel - Marketing and Cloud. You'll likely still be using both for the next few years. So here's how to work with them and make them your own.\n\nThree Google announcement events recently - Cloud Next in April, I/O on May 19-20, Google Marketing Live on May 20. The Marketing Live keynote actually overlapped with the second day of I/O, which struck me as not accidental - Gemini is running under all of it. And, in doing so, rebuilding your measurement stack.\n\n\nWhat Google announced at Marketing Live\n\nSix pieces from Marketing Live are worth knowing about:\n\n * Tag Gateway. Serves Google tags from your own domain via a CDN reverse proxy (Cloudflare, Akamai, Fastly, GCP). Google quotes a 14% signal uplift. Worth flagging: Tag Gateway is not server-side tagging. Different architecture, different problem. The two get conflated, partly because Google's positioning makes that easy to do. (We've written about the common misconceptions before.)\n * Data Manager. One ingestion path for first-party data into Google Ads, GA4 and Display & Video 360.\n * Meridian in GA360 + GeoX. Google's open-source MMM gets embedded in paid GA. The geo-experiment piece (GeoX) connects Conversion Lift to MMM calibration. Currently alpha, rolling out next year. There's also Meridian Studio — the Google Cloud-based enterprise version for teams running heavier Meridian models. Same MMM, two stacks. (We've talked through the broader trajectory of MMM, MTA and the future of marketing measurement with János Moldvay on The Measure Pod if you want the longer view.)\n * Qualified Future Conversions. A Gemini-powered metric that predicts longer-horizon conversions from signals like branded search.\n * Cross-channel connectors. TikTok, Snap, Pinterest, Meta and Reddit cost data direct into Google Analytics, with Meridian-powered budgeting on top.\n * Ask Advisor. A Gemini agent across Google Ads, Analytics, Merchant Center and Google Marketing Platform. Natural-language interface.\n\nAnd these things aren't wholly new. Tag Gateway has been shipping with Cloudflare for about a year now. Data Manager API went live back in 2024. The Google Tag Manager and Google Tag unification I wrote about a couple of weeks back is rolling out properly now. Enhanced Conversions, Attributed Brand Searches, Lead Intent Scores - there's a long tail of incremental updates covered in Simo Ahava's round-up if you want the surface-area read. What's new is mostly the framing - Google is now telling all of this as a single coherent story, with Gemini behind it all.\n\n\nThe \"measurement command centre\"\n\nGoogle is now positioning itself as a \"measurement command centre\" - all built on their stack. Their tagging. Their analytics. Their MMM. Their reporting. Their agents on top.\n\nFor some, that's a clear win. If you couldn't justify a separate MMM, Meridian-in-GA is going to bring value (albeit once it's out of alpha, sometime next year). If you didn't have an attribution model, the new stack hands you one. All much quicker than building from scratch.\n\nThe trade-off: as you adopt more of the stack, Google quietly becomes the answer; to infrastructure, to everything.\n\n\nElsewhere, in a parallel universe\n\nElsewhere, vendors are making equal and opposite architecture choices for data and marketing teams. Anthropic are saying pay us for the AI, but your data infrastructure stays yours and so does the work the agent does on it. Snowflake had said something similar a fortnight earlier with their multi-tenant Cortex agents.\n\nGoogle's running both bets in parallel. Three weeks before Marketing Live, at Cloud Next, they (re)launched Gemini Enterprise (formerly Vertex AI). Same architectural bet as Anthropic, opposite to Marketing Live. Your data lives in BigQuery, in your tenancy. You pick the model - 200+ in Model Garden, including Anthropic's Claude alongside Gemini. You build agents on your own data, with your own definitions. Google's Agentic Data Cloud gives those agents governed access. Google supplies the reasoning platform; you keep the meaning.\n\nSo there's a clear direction emerging - including from Google itself. Your data stays put. The vendor sells reasoning. You keep the meaning, the audit trail and the right to walk away with your definitions intact.\n\nGoogle's Marketing stack is looking like the inverse bet. Bring your data into Google's tooling and Google will be both the reasoning and the place the answer lives. For teams already running inside Google Ads, that bet wins on convenience. It wins less well for anyone whose marketing has to cross over with the rest of the organisation - comms, finance, ops, the places where data and decisions flow across teams. And anywhere there are legal or governance questions to answer, or questions about leaning on a single vendor.Most teams will land somewhere in the middle, and that middle is itself a Google architecture - Google Cloud underneath, BigQuery for your data, Gemini Enterprise as the agent platform, your own definitions and reasoning on top. Use the marketing conveniences where they fit. Keep your ground truth in the stack you (probably already) run. The architecture decision gets made either way, deliberately or not.\n\n\nWhat to do about it\n\nMany marketing teams will still want to use most of Google's marketing stack over the next few years. It'll be quicker and more capable than what you'd build from scratch.\n\nWhat I'd want alongside it: a way to reconcile Google's numbers against Meta's, against the CRM, against finance, and your own definitions of customer, conversion, margin, campaign that survive whichever AI agent happens to be querying the data this quarter.\n\nHere's what we see happen, over and over. Marketing teams want to do more with their data than the traditional Google Marketing stack provides - and a clear way in is via BigQuery. Once the data's there, you can be doing all sorts - but you're also standing next to Gemini Enterprise and the agentic stuff on top of it. As soon as you start with that, you want to be connecting to other systems - your CRM, your ad platforms, your financial reporting, the bits sitting in Slack or Drive - and those need federating in, increasingly via MCPs. And then you're running away with semantics and governance. What does \"revenue\" actually mean? Which join produces the right answer? Who's allowed to see what? The question of meaning stops being a side concern and becomes the actual job.\n\nThere are two architectures that solve for this, and they often sit in parallel rather than one replacing the other. A centralised warehouse on BigQuery is the right call for long-term historical aggregation, machine learning, and the multi-year trend work that needs scale. A federated layer is the right call for cross-source reporting, attribution, dashboards, and ad-hoc questions in plain English over the sources you already have. Different jobs. Different time-to-value. Most of our Google Cloud Partner work sits on top of BigQuery these days, with the meaning layer running over it - and that meaning layer is the conversation we're having most often with clients right now.\n\nThe federated side is what we've been building at Measurelab. We're calling it SEAM, an independent layer that sits between your data and whichever agent is asking, without forcing you to move the data first. The principles behind the layer are written up in full if you want them. The audit log doubles as a feedback loop. Every ungoverned query becomes a candidate for governance, and the organisation builds a living map of where its data gaps actually are.\n\nYou don't need SEAM specifically. You do need an answer to where the meaning of your data lives when it's no longer just you reading the dashboard.\n\nIf your analytics partner isn't already walking you through this, it's a useful conversation to have. If you don't have one and want to think it through, then please get in touch and book a discovery session.\n\n\nA few questions we keep getting asked\n\nIs Tag Gateway the same as server-side tagging?\n\nNo. Tag Gateway is a CDN-level reverse proxy that rewrites Google tag requests so they originate from your own domain. It only works for Google tags. Server-side Google Tag Manager (sGTM) is a full processing layer running in your infrastructure that can route data to non-Google destinations like Meta, TikTok, and LinkedIn. The two are complementary - you can run Tag Gateway for your Google tags while running sGTM for everything else. We've written more on the distinction if you want it.\n\nShould we centralise our data in a warehouse before adopting something like SEAM?\n\nIt depends on the job. A warehouse on BigQuery is the right call for long-term historical aggregation, machine learning and multi-year trend work. SEAM is the right call for cross-source reporting, attribution, dashboards and ad-hoc questions in plain English. Most clients we work with end up running both - the two sit in parallel, each doing the job they're best at. If you can't realistically build a warehouse in the next 12-18 months, SEAM lets you give AI governed access to the sources you already have without forcing centralisation first.\n\nWill Ask Advisor be useful for our team?\n\nProbably, for first-pass triage and routine diagnostics. Less so as the single source of truth on what your campaigns are doing. Use it as one input alongside whatever independent attribution and reporting work you already have. Plan to QA the outputs - natural-language interfaces over uncertain data can produce confident-wrong answers."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/siloed-data-central-intelligence/#article",
      "headline": "Siloed data, central intelligence",
      "description": "Someone in your organisation has already connected an AI agent to a live data source. Probably several people have. They've pointed Claude at HubSpot, asked it to pull numbers from Google Analytics, had it read a Jira board or reconcile figures across two systems. The data never moved. Nobody waited for a pipeline. Nobody asked the data team.\n\nThey did this because it was easy. And people will always go where the friction is least.\n\nThis is happening everywhere, across every function, in organis",
      "url": "https://www.measurelab.co.uk/insights/blog/siloed-data-central-intelligence/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/siloed-data-central-intelligence/#webpage"
      },
      "datePublished": "2026-04-09T12:05:24.000+00:00",
      "dateModified": "2026-04-09T12:05:24.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2026/04/seam-featured.svg",
      "author": {
        "@type": "Person",
        "name": "Matthew Hooson",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "articleBody": "Someone in your organisation has already connected an AI agent to a live data source. Probably several people have. They've pointed Claude at HubSpot, asked it to pull numbers from Google Analytics, had it read a Jira board or reconcile figures across two systems. The data never moved. Nobody waited for a pipeline. Nobody asked the data team.\n\nThey did this because it was easy. And people will always go where the friction is least.\n\nThis is happening everywhere, across every function, in organisations of every size. AI agents can now query data wherever it lives. CRMs, finance tools, project trackers, spreadsheets, communication platforms, document stores. All in a single interaction. The protocols for connecting an agent to a live system are maturing fast. What used to be an engineering project is now a configuration step.\n\nThe result is the fastest adoption of a new data access pattern the industry has ever seen. It is also completely ungoverned.\n\n\nThe governance gap\n\n\n\nWhen most questions went through the warehouse, semantic governance came bundled in. \"Revenue\" meant one thing because there was one place it was calculated. \"Active customer\" had a single definition because there was a single model that defined it. The governance worked because it sat on top of the only query path most people used.\n\nWhen agents query sources directly, that coupling breaks.\n\nA marketing manager connects an AI to HubSpot and asks: \"How many active customers do we have?\" A finance director connects the same model to Xero and asks the same question. They get different numbers. Not because either source is wrong, but because \"active customer\" means something different in each system. HubSpot counts anyone with an open deal. Xero counts anyone invoiced in the last 90 days. Both are reasonable interpretations. Neither is the company's actual definition.\n\nMultiply this across dozens of data sources and hundreds of people asking questions. Conflicting numbers in the same meeting. No audit trail for how an answer was derived. Entity resolution failures where the same customer appears as three different records. Business logic applied inconsistently depending on which tool the AI happened to query. And a growing, corrosive distrust of AI-generated insights. Not because the AI is wrong, but because nobody can agree on what \"right\" looks like.\n\n\nThe wrong side of the door\n\n\n\nThe natural response is to expose your existing semantic layer to agents. Make it available as a tool the agent can call. Job done.\n\nExcept the agent doesn't have to use it.\n\nAn AI agent with access to multiple tools will choose the path that answers the question fastest. If the governed semantic layer is one tool among ten, there is nothing stopping the agent from calling the CRM directly, or querying a spreadsheet, or hitting an API that returns the same data without the governance. The semantic layer is available. It is not unavoidable.\n\nThis is the fundamental architectural problem. A semantic layer sitting on the other end of a tool call is something the agent can use. A governance layer sitting in front of the agent is something it cannot bypass. Every request passes through it. Every tool call is mediated by it. The governance is not one option among many. It is the only path to the data.\n\nThe difference is not cosmetic. It is the difference between a security guard standing inside one of ten unlocked buildings and a security guard standing at the only gate.\n\n\nCentralise the intelligence, not the data\n\n\n\nThe insight is simple: decouple the governance layer from any single data source and make it the agent's interface to all of them.\n\nEvery source becomes an endpoint. The warehouse, the CRM, the finance system, the project tracker, the communication tools, the document stores. The governance layer sits in front of the agent and mediates access to all of them. It defines what things mean, which source to trust for which question and how entities relate across systems.\n\nYou don't need to centralise the data. You centralise the intelligence.\n\nThis means you can govern data that lives in twenty different systems without moving it. The warehouse remains an important endpoint for heavy aggregation, historical analysis and workloads that need physical co-location. But it's one source among many, not the place where meaning is defined. Meaning is defined in the intelligence layer. Once, centrally and applied everywhere.\n\n\nIntroducing SEAM\n\n\n\nThat's what we built.\n\nSEAM (Semantic Engine for Agent Mediation) is an intelligence layer that sits in front of the AI agent, mediating every query across every connected source. It knows what your terms mean, which source to trust, how entities map across systems and which definition applies in which context.\n\nThe user asks a question in natural language. They get a governed answer. They never see the plumbing.\n\nTake that \"active customer\" problem. With SEAM, the definition is codified once:\n\n * When Sales asks, the agent knows to use the pipeline definition from HubSpot.\n * When Finance asks, it uses the invoicing definition from Xero.\n * When the CEO asks without specifying context, it defaults to the canonical company definition from the operations hub.\n\nEvery answer carries an audit trail: which source was queried, which definition was applied, which hierarchy rule resolved the conflict. An analyst can inspect it. A compliance officer can verify it. The governance is invisible to the end user but fully transparent to anyone who needs to see the reasoning.\n\nAnd this goes well beyond structured data. An LLM pointed at a GTM container without context will see a wall of tags, triggers and variables with no idea which ones matter, which are legacy and which are misconfigured. SEAM bakes in the domain context that makes unstructured and semi-structured sources useful: what each resource is, who owns it, how it relates to the rest of the data landscape and what the agent should know before it tries to interpret what it finds. Slack channels, meeting notes, GTM containers, document stores. The intelligence layer makes the agent literate in your organisation's data, not just connected to it.\n\nThis isn't a glossary bolted onto a chatbot. SEAM carries the full reasoning context an AI agent needs to give correct, consistent answers: metric definitions, source hierarchies, entity resolution logic, business context and temporal versioning. It governs every data source your agents can reach, on equal terms.\n\n\nWhere we are\n\n\n\nSEAM is live. We've been running it internally at Measurelab across 11 connected systems: BigQuery, Google Analytics, Google Tag Manager, HubSpot, Jira, Slack, Harvest, Fathom, Gmail, Google Calendar and our internal operations hub. It governs how our own AI agents query our own data. Every definition version-controlled. Every query audited. Every answer consistent.\n\n\nThe technology is only half the problem\n\n\n\nBuilding the intelligence layer is an engineering challenge. Deciding what goes into it is a human one.\n\nBefore a single definition is codified, someone has to sit with people across the business and make decisions that no software can make for them. What does \"active customer\" actually mean here? When two systems disagree on revenue, which one wins and why? How does a customer in the CRM map to a customer in the finance system? These are judgement calls. They require cross-functional conversation, not just configuration.\n\nWe've built a methodology for this alongside the technology. The SEAM Canvas is a structured workshop framework that takes a team from \"we have fifteen data sources and no shared definitions\" to a codified intelligence layer. It maps your sources, surfaces the definitional conflicts that already exist (whether or not anyone has noticed them yet) and produces the decisions that SEAM needs to enforce governance.\n\nThe hardest part of this work is not technical. It is getting the right people in the room and making the decisions they've been deferring for years. The Canvas is designed to make that process structured, finite and actionable.\n\n\nData democratisation is finally possible. So is data chaos.\n\n\n\nFor years, \"data-driven decision making\" has been the aspiration. AI has removed the barriers overnight. Any person in your organisation can now ask a question of their data and get an answer in seconds. Not through a dashboard someone built six months ago. Not through a request to the analytics team that takes two weeks. Directly. In natural language. From the systems they already use.\n\nThat is data democratisation. It is here. It is happening with or without your permission.\n\nThe question is whether it scales to brilliance or to chaos.\n\nWithout a governance layer, it scales to chaos. A hundred people asking questions of a dozen systems with no shared definitions. Every answer technically defensible. None of them consistent. Trust in data eroding faster than it ever built up.\n\nWith an intelligence layer, it scales to something organisations have never had before. Genuine, consistent, governed intelligence available to every person at every level. Available now. To everyone.\n\nOne of these two futures is coming for your organisation. The only variable is whether you act to determine which one.\n\nIf your organisation is adopting AI faster than your governance can keep up, SEAM was built for you. Register your interest to learn more and get early access, or book a conversation if you'd like to talk through what an intelligence layer looks like for your data."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/what-we-learned-building-ai-agents-for-clients-and-ourselves/#article",
      "headline": "What we learned building AI agents for clients (and ourselves)",
      "description": "From internal experiments to client-facing data products\n\nEighteen months ago, we started building AI agents internally. Not as a product play - as a way to stop doing repetitive work. Documentation, QA checklists, data validation. The kind of tasks that every analytics consultancy does hundreds of times a year and nobody enjoys.\n\nThat experiment became our first internal AI assistant. And what we learned building it changed how we think about data products for clients.\n\nHere's what we know now ",
      "url": "https://www.measurelab.co.uk/insights/blog/what-we-learned-building-ai-agents-for-clients-and-ourselves/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/what-we-learned-building-ai-agents-for-clients-and-ourselves/#webpage"
      },
      "datePublished": "2026-04-08T08:20:17.000+00:00",
      "dateModified": "2026-04-08T08:20:17.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2026/04/building-agents-featured.svg",
      "author": {
        "@type": "Person",
        "name": "Mark Rochefort",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "articleBody": "From internal experiments to client-facing data products\n\nEighteen months ago, we started building AI agents internally. Not as a product play - as a way to stop doing repetitive work. Documentation, QA checklists, data validation. The kind of tasks that every analytics consultancy does hundreds of times a year and nobody enjoys.\n\nThat experiment became our first internal AI assistant. And what we learned building it changed how we think about data products for clients.\n\nHere's what we know now that we didn't know then.\n\n\nThe agent is the easy part\n\n\n\nBuilding an agent that can query BigQuery and return an answer takes a weekend. Building an agent that returns the right answer, consistently, across different users and contexts - that takes months.\n\nThe gap isn't technical capability. It's governance. Our first version was impressively fluent and regularly wrong. It would generate SQL that was syntactically correct and logically plausible but based on assumptions about table structures, metric definitions, and business logic that it had no way to verify.\n\nThis is the problem every organisation will hit when they move from \"let's try ChatGPT on our data\" to \"let's deploy agents in production.\" The model is powerful. The data is there. The missing layer is the one that tells the agent what things mean. (We covered this in depth in our post on semantic layers.)\n\n\nWhat we built for Sanderson Design Group\n\n\n\nSanderson Design Group had a concrete problem: their commercial team needed answers from complex BigQuery datasets, and every question required an analyst to write SQL. The bottleneck wasn't data - it was access.\n\nWe built a GenAI data assistant that lets non-technical staff query their data in natural language. Ask a question, get an answer. No SQL required.\n\nBut the interesting part wasn't the natural language interface. It was what we had to build around it:\n\nSchema documentation. The agent needs to know what's in each table, what each field means, and how tables relate to each other. This isn't optional metadata - it's the difference between a useful answer and a plausible hallucination.\n\nQuery validation. Before executing generated SQL, the system checks it against known patterns. Does the WHERE clause make sense for this metric? Is the date range reasonable? Are the joins correct?\n\nGoverned definitions. When the agent calculates \"conversion rate,\" it uses the same definition the dashboards use. Not its own interpretation. This is where SEAM comes in - encoding metric definitions as infrastructure so every agent resolves them consistently.\n\nAudit trails. Every query the agent runs is logged: what was asked, what SQL was generated, what was returned. If a number looks wrong, you can trace exactly how it was produced.\n\nThe result: the commercial team gets answers in seconds instead of days, and the analysts are freed up for higher-value work. Call volumes dropped 20% because the friction points the data revealed could finally be acted on quickly.\n\n\nThe governance lesson\n\n\n\nThe pattern we see across every agent deployment is the same:\n\n 1. Week 1-2: excitement. The agent works. People ask questions. Answers appear.\n 2. Week 3-4: doubt. Someone gets a number that doesn't match their dashboard. Someone else gets a different answer to the same question phrased differently. Trust erodes.\n 3. Week 5+: either you solve governance or you abandon the agent.\n\nMost organisations hit step 3 and retreat to dashboards. The ones that push through are the ones that invest in the definitions layer - the governed, machine-readable business logic that sits between the agent and the data.\n\nThis is why we built SEAM. Not because agents are hard to build, but because agents are hard to trust. SEAM mediates every tool call - resolving metrics against governed definitions, validating outputs against golden questions, and maintaining a full audit trail. The agent doesn't get to make assumptions about what \"revenue\" means. The definition is in YAML, it's version-controlled, and it's the same everywhere.\n\n\nWhat we use internally now\n\n\n\nOur internal tooling has evolved significantly since those early experiments. We've embedded MCP (Model Context Protocol) tools directly into our delivery process. Today, our agents:\n\n * Generate technical documentation from GTM container exports and BigQuery schemas. What used to take a consultant two hours takes the agent two minutes. The consultant reviews and refines rather than writing from scratch.\n * Run QA checks against implementation specifications. The agent compares what was specified with what was implemented and flags discrepancies.\n * Monitor data pipelines and alert on anomalies. For EDF, we deployed BigQuery ML ARIMA models that run hourly and push alerts to Slack when data patterns break.\n * Prepare client reports by pulling data, generating narrative summaries, and formatting outputs. The consultant adds judgement and context. The agent handles the assembly.\n\nThe throughput gain is real. But the bigger win is consistency - agents don't forget steps, don't skip checks, and don't have off days.\n\n\nFive things we'd tell you before you start\n\n\n\n1. Start with a single, well-scoped use case. \"Put AI on our data\" is not a use case. \"Let the sales team ask questions about pipeline without waiting for an analyst\" is. The narrower the scope, the faster you'll learn what governance you need.\n\n2. Your data documentation is the bottleneck. If your tables don't have descriptions, your fields aren't documented, and your metric definitions live in someone's head, the agent will hallucinate. Fix the documentation first. The agent deployment will follow naturally.\n\n3. Don't skip the golden questions. Before deploying any agent, define 20-30 questions where you know the correct answer. Run the agent against them. If it can't pass this test consistently, it's not ready for production.\n\n4. Log everything. Every query, every response, every piece of generated SQL. You will need the audit trail. Not just for governance - for debugging, for improvement, and for building trust with stakeholders who are (rightly) sceptical.\n\n5. Governance is not a phase - it's a layer. You don't \"do governance\" during implementation and then move on. It's infrastructure that runs continuously, evolves with your definitions, and mediates every interaction. Build it as a layer, not a checklist.\n\n\nWhere this is going\n\n\n\nThe organisations that will get the most from AI agents are the ones that treat governance as a first-class concern - not a constraint on innovation, but the thing that makes innovation trustworthy.\n\nWe're seeing this play out already. Clients who invested in governed data platforms (BigQuery + Dataform + semantic layer) are deploying agents in weeks. Clients who jumped straight to agents without that foundation are hitting the trust wall and retreating.\n\nThe path is: trusted data → governed definitions → reliable agents → organisational intelligence. Skip a step and you'll end up back at the beginning.\n\nIf you're thinking about deploying AI agents on your data, our agent readiness assessment is a good place to start. And if you want to understand how SEAM governs the agent layer specifically, see the product page.\n\nYou can also see our AI journey on the about page for the full timeline, or join Swarm - the community where practitioners are figuring out AI governance together."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/what-is-a-semantic-layer-and-why-your-ai-agents-need-one/#article",
      "headline": "What is a semantic layer and why your AI agents need one",
      "description": "Companion piece to Measure Pod #139 with Colin Zima and #98 with David Jayatillake\n\nYour warehouse is full of tables. Your agents can query them. The question is whether they'll get the same answer.\n\nAsk three different agents \"what's our monthly revenue?\" and you'll get three different numbers. Not because the data is wrong - because nobody defined what \"revenue\" means in a way machines can consistently resolve. Is it gross or net? Recognised or invoiced? Including refunds or not? Each agent ma",
      "url": "https://www.measurelab.co.uk/insights/blog/what-is-a-semantic-layer-and-why-your-ai-agents-need-one/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/what-is-a-semantic-layer-and-why-your-ai-agents-need-one/#webpage"
      },
      "datePublished": "2026-04-07T11:23:20.000+00:00",
      "dateModified": "2026-04-10T11:02:06.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2026/04/semantic-layer-featured.svg",
      "author": {
        "@type": "Person",
        "name": "Mark Rochefort",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "articleBody": "Companion piece to Measure Pod #139 with Colin Zima and #98 with David Jayatillake\n\nYour warehouse is full of tables. Your agents can query them. The question is whether they'll get the same answer.\n\nAsk three different agents \"what's our monthly revenue?\" and you'll get three different numbers. Not because the data is wrong - because nobody defined what \"revenue\" means in a way machines can consistently resolve. Is it gross or net? Recognised or invoiced? Including refunds or not? Each agent makes its own assumption, and none of them tell you which one they picked.\n\nThis is the problem a semantic layer solves.\n\n\nA semantic layer is a definitions layer\n\n\n\nAt its simplest, a semantic layer sits between your data warehouse and the things that query it - dashboards, models, agents, analysts. It defines:\n\n * What your metrics mean. Revenue is net of refunds, recognised at invoice date, excluding internal transfers. Written once, resolved everywhere.\n * Where the data comes from. When two sources disagree, which one wins? The semantic layer encodes that hierarchy.\n * How entities relate. A \"customer\" in your CRM isn't the same grain as a \"user\" in GA4. The semantic layer maps between them.\n * What business logic applies. Fiscal year boundaries, currency conversion rules, regional definitions. The stuff that lives in someone's head until they leave.\n\nNone of this is new. Good analytics teams have always maintained metric definitions somewhere - a spreadsheet, a wiki, a Dataform model with comments. The difference is that a semantic layer makes those definitions machine-readable and enforceable.\n\n\nWhy this matters now more than it did two years ago\n\n\n\nTwo years ago, the path from data to decision ran through a human. An analyst wrote a query, checked the output, and built a dashboard. The definitions lived in their head, and that was fine - they'd catch inconsistencies before anyone saw them.\n\nThat path has collapsed. AI agents now query your warehouse directly. They generate SQL, execute it, and return answers in seconds. The analyst isn't in the loop. And the definitions that lived in their head? The agent doesn't have them.\n\nThis is what David Jayatillake described on the podcast as \"the governance gap.\" The warehouse was never designed to be self-describing. It stores data, not meaning. When the access layer was a human analyst, that didn't matter. When the access layer is an autonomous agent, it matters enormously.\n\n\nWhat goes wrong without one\n\n\n\nThe failure modes are predictable:\n\nConflicting numbers. We worked with Springer Nature where Marketing, Product and Finance each produced different revenue figures from the same underlying data. Different query logic, different filters, different assumptions. It took a unified Dataform architecture to get them within 2% of each other. Now imagine three agents with the same problem - except nobody notices the discrepancy because the numbers arrive instantly and confidently.\n\nInvisible errors. An agent that hallucinates is obvious. An agent that returns a plausible but subtly wrong number is dangerous. Without governed definitions, there's no way to distinguish a correct answer from a confident one.\n\nUngovernable access. As organisations deploy more agents across more data sources, the question isn't \"can the agent access the data?\" - it's \"should it, and does it know what it's looking at?\" A semantic layer provides the guardrails.\n\n\nWhat a semantic layer actually looks like\n\n\n\nIn practice, it's a set of definition files - typically YAML or SQL - that encode your business logic as infrastructure. At Measurelab, we've built SEAM (Semantic Engine for Agent Mediation) to do this specifically for AI agents. The architecture is:\n\n 1. Definition files - YAML-based metric definitions, source hierarchies, entity resolution rules, temporal context\n 2. A compiler/validator - checks definitions for consistency before deployment\n 3. A context resolver - translates agent queries into governed SQL at runtime\n 4. Agent middleware - sits in the tool-call path (via MCP) so every agent query passes through governance\n 5. Audit logging - records what was queried, how it was resolved, and what was returned\n\nThe key principle: definitions are infrastructure, not documentation. They're version-controlled, tested, and deployed like code. When someone changes the definition of \"active user,\" that change is reviewed, approved, and propagated to every agent and dashboard simultaneously.\n\n\nThe unstructured data problem\n\n\n\nHere's where it gets interesting. Traditional semantic layers only govern structured data - warehouse tables with defined schemas. But agents increasingly query unstructured sources: Slack messages, meeting transcripts, email threads, support tickets, internal documents.\n\nNo warehouse has ever governed this kind of data. SEAM does - by extending the same definition-and-resolution pattern to unstructured sources. The agent's access to a Slack channel is mediated through the same governance layer as its access to your revenue table. Same audit trail, same validation, same control.\n\n\n\n\nWhere to start\n\n\n\nYou don't need to boil the ocean. Start with your five most-queried metrics - the ones that show up in every board deck and every campaign report. Define them precisely. Encode the definitions. Route your most-used dashboard through them.\n\nOnce those five metrics are governed, extending to ten, then fifty, then to agent access becomes incremental. The hard part isn't the technology - it's getting agreement on what the metrics mean in the first place. If you're not sure where your organisation stands, our agent readiness assessment is designed to help you figure that out.\n\nIf you want to hear more, Colin Zima from Omni joins us on Measure Pod #139 to talk about AI and semantic layers in modern BI, and David Jayatillake on #98 covers the foundational thinking. And if you want to see how SEAM applies this to AI agents specifically, take a look at the product page."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/derelict-data-warehouse-revisited/#article",
      "headline": "The derelict data warehouse, revisited: why this problem just became existential",
      "description": "AI doesn't fix bad data; it scales it. In 2026, a derelict data warehouse isn't just a nuisance, it’s an existential risk. ",
      "url": "https://www.measurelab.co.uk/insights/blog/derelict-data-warehouse-revisited/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/derelict-data-warehouse-revisited/#webpage"
      },
      "datePublished": "2026-03-10T17:18:19.000+00:00",
      "dateModified": "2026-03-17T13:14:27.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2026/03/Blog-post---April-25.png",
      "author": {
        "@type": "Person",
        "name": "Matthew Hooson",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "AI & ML"
      ],
      "articleBody": "You spend Monday morning trying to reconcile two dashboards that should agree but don't. By Tuesday, you're explaining to a stakeholder why last month's numbers shifted, not because anything changed, but because someone updated a transformation you didn't know existed. Wednesday, a colleague asks you to pull data for an AI pilot, and you realise you can't confidently explain half the tables in your warehouse. Thursday, the person who built most of it hands in their notice.\n\nThat's the derelict data warehouse showing up in your calendar.\n\nIn 2025, I wrote about The Derelict Data Warehouse: the phenomenon of analytics infrastructure built with good intentions that slowly drifts into disrepair. Abandoned projects, duct-taped spreadsheets, over-engineered mazes, untamed data lakes. We catalogued the failure modes and offered an audit checklist.\n\nAt the time, it felt like practical advice for organisations wrestling with their analytics foundations. I had no idea how urgent that advice would become.\n\n\nThree reasons your derelict warehouse is now an existential risk\n\nWhen I wrote the original blog, a broken data warehouse was an inconvenience. Your reports were out of date. Your dashboards were slow. Your team wasted time wrestling with bad data.\n\nIn 2026, it is an existential risk. Three things have converged to make it so.\n\n\n1. AI amplifies broken foundations instantly\n\nAI does not fix bad data. It amplifies it.\n\nIf your warehouse has inconsistent schemas, missing documentation, outdated transformations, unknown data lineage, or unclear ownership, then any AI system trained on that data will produce confidently wrong answers at scale. LLMs do not know when your data is stale. They do not pause to question inconsistent metrics. They will hallucinate insights from garbage with the same certainty they apply to gold.\n\nBad data + AI = automated incompetence.\n\n\n2. The speed of change demands clean foundations\n\nNew AI capabilities emerge weekly. Businesses that can move fast (experiment, adopt, iterate) have a structural advantage.\n\nBut you cannot move fast if your data foundations are brittle. Every new AI initiative, every predictive model, every agent system requires access to clean, well-structured, trustworthy data. If that data is trapped in a derelict warehouse, scattered across abandoned projects, locked in someone's head, buried in undocumented tables, then every AI experiment becomes a six-week data archaeology project first.\n\nThe market expectation has shifted. A functioning data pipeline, from collection through transformation to reporting, is no longer seen as the deliverable. It is the prerequisite. Clients increasingly expect that infrastructure to be in place before the real work begins. If your team is still rebuilding similar pipelines from scratch each time, the cost is not just the hours spent. It is the strategic work that never gets started.\n\nYou cannot innovate at the speed of 2026 on the infrastructure of 2019.\n\n\n3. Knowledge decays faster than you can document it\n\nData warehouses were always living systems, but the rate of decay has accelerated. The global datasphere is growing at over 20% year on year, with data now spread across internal data centres, cloud repositories, edge locations, and third-party platforms. Business requirements shift weekly, not quarterly. Team members rotate faster. Tools and platforms evolve constantly. Compliance requirements tighten. There is simply more data, in more places, changing faster than any manual process can track.\n\nInstitutional knowledge that used to persist for years now decays in months. The person who built the warehouse has moved on. The documentation was never written. The assumptions that informed the design are lost. This is not a people problem. It is a structural reality of the pace of change in 2026.\n\nThe good news is that AI agents can maintain data warehouses: monitor pipelines, detect schema drift, update documentation, optimise queries. But only if the warehouse is in a maintainable state to begin with. An AI cannot rescue an abandoned project it does not know exists. It cannot document a duct-taped spreadsheet workflow it has no access to.\n\nYou have to clean the foundation first. Then AI can keep it clean.\n\n\nFix the foundation, then everything else becomes possible\n\nIf your team is spending more time maintaining existing infrastructure than building new insights, you have a derelict warehouse, even if it technically works. In 2026, standing still is falling behind.\n\nYour competitors are deploying AI agents. They are automating their pipelines. They are building knowledge systems that do not decay. If your team is stuck maintaining infrastructure manually, you are not competing. You are treading water.\n\nThe good news: once the foundation is clean, everything else accelerates. Pipelines that used to take weeks can be automated. Knowledge that used to decay can self-heal. Teams that used to drown in maintenance can focus on strategic work.\n\nBut you have to fix the foundation first.\n\n\nFAQs\n\n\n\n\n\n\n\n\n\n\nWhat are the primary signs of a derelict data warehouse?\n\n\n\nKey indicators include \"dashboard divergence\" (conflicting numbers on different reports), high turnover of data engineers, and \"data archaeology\" sessions taking longer than actual analysis.\n\n\n\n\n\n\n\nHow does a derelict warehouse affect LLM and RAG deployments?\n\n\n\n\nIt introduces \"Data Poisoning by Neglect,\" where the RAG (Retrieval-Augmented Generation) system retrieves outdated or \"duct-taped\" spreadsheet data, leading to confident but incorrect business insights.\n\n\n\n\n\n\n\nHow long does it take to audit and repair a data foundation?\n\n\n\nWhile full modernisation is ongoing, a high-impact \"Warehouse Audit\" typically identifies critical repair points within 2–4 weeks, preventing immediate AI failure risks.\n\n\n\n\n"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/your-analytics-stack-is-dying-heres-whats-replacing-it/#article",
      "headline": "Your analytics stack is dying. Here's what's going to replace it",
      "description": "The monolithic martech stack is collapsing. An open source, warehouse-first intelligence platform is cheaper, more honest, and actually yours.",
      "url": "https://www.measurelab.co.uk/insights/blog/your-analytics-stack-is-dying-heres-whats-replacing-it/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/your-analytics-stack-is-dying-heres-whats-replacing-it/#webpage"
      },
      "datePublished": "2026-03-10T11:57:49.000+00:00",
      "dateModified": "2026-03-10T12:00:56.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2026/03/New-website-2.png",
      "author": {
        "@type": "Person",
        "name": "Steven Elliott",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "MarTech",
        "Google Cloud"
      ],
      "articleBody": "If you caught our Stop the Martech Madness webinar, you'll know we've had questions over the future of the modern marketing technology stack for a while. The last two months have seen some clearer answers to those questions emerge.\n\ntl;dr: the monolithic SaaS model for marketing analytics is creaking. What's going to replace it is faster, better, cheaper, and more honest. But it needs engineering properly.\n\n\nYou already know your stack is bloated\n\nTally up your tools. There's an analytics platform, a tag manager, a BI tool - or three, data pipelines, probably an attribution product, possibly a CDP, and almost certainly a handful of point solutions someone signed up for back in 2022 that nobody dares cancel in case something breaks.\n\nEach tool works fine on its own. Easy-to-use interface. But together, they don't work without significant effort. Every integration is a project. Every project is a cost. Any non-renewal represents a risk.\n\nThe SaaS vendors know this. They're banking on low barriers to entry and high switching costs to keep you locked in.\n\nMeanwhile, they're all rushing to add features that overlap with the neighbouring piece of the jigsaw. Your CRM system wants to do analytics. Your analytics platform wants to do activation. Your BI tool wants to do data prep.\n\nIt's like maintaining subscriptions to Netflix, Amazon Prime, Disney+, Discovery. They each have one great series you couldn't live without. But you end up paying for a catalogue of duplicated dross you know you're never going to watch.\n\nAnd for all the ease-of-use promises, life doesn't get any easier. You spend more time on data prep than analysis. More time hacking tools than using them. More time explaining why the numbers don't match than actually interpreting what they mean.\n\nIt's not your fault (honest!). And you're not alone.\n\n\nThe stack you're paying for\n\nLet's name some names.\n\nThe ads team can't operate without Google Analytics. The product team is hooked on Amplitude. Marketing ops is running Funnel to pull spend data from every platform under the sun. Fivetran is pushing some of that data to the enterprise data warehouse on Snowflake. Someone signed an enterprise Tableau deal three years ago and now nobody can quite remember why. And sitting on top you've got Tealium as a CDP providing identity resolution you're not entirely sure you trust.\n\nEach of these tools has a legitimate use. That's not the problem. The issue is what they cost together, what they don't do together, and what happens to all that fragmented data when you stop paying your dues.\n\nFunnel's pricing is opaque by design. It looks reasonable until your data volumes grow, and then it doesn't. Fivetran's pricing is just going up - despite the fact you're ingesting less data. Tableau Enterprise is the kind of line item that makes CFOs ask questions at board meetings. CDPs like Tealium promise a unified view of your customer but deliver it inside a platform you rent, with matching logic you can't audit, sitting on data you don't truly own.\n\nAnd critically: none of these platforms talk to each other without effort. The data sits in silos, each platform looking inward at its own slice of truth. And aligning on answers to the critical questions takes ages.\n\nYour analysts aren't slow. Your stack is.\n\n\nWhat replaces it\n\nThe alternative isn't a shinier set of SaaS tools. It's a fundamentally different model. Warehouse-first, code-native and agent-ready.\n\nRaw event data collected via server-side GTM or Snowplow, pushed straight into BigQuery. No sampling. No obfuscation. No black box between you and what actually happened. Ad spend data, CRM data, product data - all of it flowing into the same warehouse via open source connectors.\n\nTransformation and business logic defined in dbt or Dataform. Version controlled. Tested. Documented. BigQuery as your zero-copy single source of truth. Terms and metrics defined once and for all in Dataplex. Identity resolution handled in SQL, not inside a CDP. Code-first BI tools like Lightdash, Evidence or Rill sitting on top - dashboards built on your models, not disconnected from them.\n\nIn this new analytics stack, agents aren't stuck inside individual platforms looking at siloed data. BigQuery's native data agents can query and act on your warehouse autonomously. Pipelines monitored. Anomalies surfaced before the Monday morning meeting. Questions answered in plain English. Decisions informed by the full picture, not whichever tool someone happens to log into.\n\nYour data never leaves your environment. The intelligence layer sits on top of a unified data set, not fragmented subscriptions. And when you stop paying, you keep everything. Because it was all yours from the start.\n\n\nThis is viable now. It's happening.\n\nLet's not make out this is a simple swap. Inertia is real. Known brands feel safe. Nobody gets fired for renewing the Tableau licence. And it's just not realistic or feasible to throw everything out all at once.\n\nBut the emerging toolset is mature and production-tested. Once the target architecture is established, it should be possible and practical to build and test in parallel, cancel licences as they come up for renewal and bring the new tools online. The more you shift, the more costs are saved and the more upside is unlocked.\n\nIf you move decisively and early, you'll not only save a fortune, you'll have first-mover advantage over everyone still paying rent to access their own data.\n\nIn my next blog, we'll tackle the trickier question: what does it take to build and maintain this properly? A clue for you: engineering discipline, agentic practices, and encoded expertise are what separates a platform that compounds in value from a side project at risk of collapse.\n\n\nFAQs\n\n\n\n\n\n\n\n\n\n\nWhat is the benefit of a warehouse-first analytics stack?\n\n\n\nThe primary benefits include total data ownership, significantly lower long-term licensing costs, and a \"single source of truth\" where business logic is defined in code (SQL/dbt) rather than hidden inside proprietary UI settings.\n\n\n\n\n\n\n\nCan I migrate from Google Analytics to a warehouse-first model?\n\n\n\nYes. By using server-side tagging or Snowplow to stream raw event data directly into BigQuery, you bypass the sampling and data-sharing limitations of standard GA4 implementations while maintaining full control over your raw datasets.\n\n\n\n\n\n\n\nIs a code-native BI tool better than Tableau or Power BI?\n\n\n\nCode-native tools (like Lightdash or Evidence) are better for teams seeking version control and \"logic-as-code.\" While Tableau is powerful for visualization, code-native tools ensure your metrics are defined once in the warehouse, preventing different dashboards from showing conflicting numbers.\n\n\n\n\n"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/what-70-more-data-actually-means-for-your-ad-performance/#article",
      "headline": "What 70% more data actually means for your ad performance",
      "description": "Server-side GTM is usually sold on technical grounds. Better data quality. Reduced client-side load. Privacy compliance. All true, all important, and all completely abstract to the person signing off the budget.\n\nHere's what they actually want to know: what does it do for my numbers?\n\nWe can answer that. When we deployed server-side GTM for Unily, they recovered 70% of previously lost session data. That's not a rounding error. That's a step change in what you can see, what you can attribute, and",
      "url": "https://www.measurelab.co.uk/insights/blog/what-70-more-data-actually-means-for-your-ad-performance/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/what-70-more-data-actually-means-for-your-ad-performance/#webpage"
      },
      "datePublished": "2026-03-07T15:30:00.000+00:00",
      "dateModified": "2026-04-07T15:34:50.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2026/04/sgtm-data-recovery-featured.svg",
      "author": {
        "@type": "Person",
        "name": "Mark Rochefort",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "articleBody": "Server-side GTM is usually sold on technical grounds. Better data quality. Reduced client-side load. Privacy compliance. All true, all important, and all completely abstract to the person signing off the budget.\n\nHere's what they actually want to know: what does it do for my numbers?\n\nWe can answer that. When we deployed server-side GTM for Unily, they recovered 70% of previously lost session data. That's not a rounding error. That's a step change in what you can see, what you can attribute, and what you can optimise.\n\nLet's unpack what that actually means for ad performance.\n\n\nWhere the data goes missing\n\n\n\nBefore we get to what you gain, it's worth understanding what you're losing right now. Browser-side tracking loses data in three ways:\n\nAd blockers. Roughly 30-40% of desktop users run some form of ad blocker. Many of these also block analytics scripts. Your GA4 tag simply doesn't fire for these users. They visit, they browse, they convert - and your analytics sees none of it.\n\nIntelligent Tracking Prevention (ITP). Safari and Firefox aggressively limit cookie lifetimes. First-party cookies set by JavaScript are capped at 7 days (sometimes 24 hours). A user who visits on Monday and converts on Thursday may show up as two separate sessions - or the conversion may not be attributed to the original source at all.\n\nConsent rejection. Under GDPR and ePrivacy, users who reject analytics cookies generate no data at all. In markets with strong consent enforcement, this can be 30-50% of traffic. These users still cost you ad spend. They still convert. You just can't see them.\n\nThe cumulative effect is that your analytics is working with a fraction of reality. Not a representative sample - a biased one. Users who accept cookies, don't use ad blockers, and visit frequently enough to stay within ITP windows are over-represented. Everyone else is invisible.\n\n\nWhat happens when you recover that data\n\n\n\nServer-side GTM shifts tag execution from the browser to your own server infrastructure. The practical effect:\n\nCookies become first-party and server-set. ITP doesn't apply to server-set cookies the same way. Cookie lifetimes extend from days to months. Returning users are recognised correctly. Attribution windows actually work.\n\nAd blockers can't block what they can't see. Because the data flows server-to-server (your server to Google's, or Meta's, or whoever's), browser-based blockers don't intercept it. You're not circumventing consent - users who reject cookies are still excluded. But users who accept cookies and happen to run ad blockers are no longer invisible.\n\nConsent Mode works properly. With server-side GTM, you can implement Consent Mode v2 with full fidelity. Consented users generate complete data. Unconsented users still contribute to behavioural modelling without storing personal data. The signal improves for everyone.\n\n\nThe cascade effect on ad platforms\n\n\n\nHere's where it compounds. Ad platforms - Google Ads, Meta, TikTok - rely on conversion data to optimise bidding. The more conversions you feed back, the better the algorithm performs. This creates a cascade:\n\n 1. More observed conversions → the algorithm has more signal to learn from\n 2. Better attribution → conversions are attributed to the right campaigns and keywords\n 3. Smarter bidding → automated strategies (tROAS, tCPA) make better decisions\n 4. Lower cost per acquisition → you stop overspending on channels that look good because alternatives are under-measured\n 5. Better audience building → remarketing lists and lookalike audiences are built from a more complete picture\n\nUnily's 70% data recovery didn't just fix their dashboards. It restored executive confidence in reporting - which sounds soft until you realise that \"we don't trust the numbers\" is usually followed by \"so we'll just keep doing what we've always done.\"\n\n\nThe maths on your media spend\n\n\n\nLet's make this concrete. Suppose you spend £100k/month on paid media and your current analytics captures 60% of conversions (a conservative estimate given ad blocker and ITP losses).\n\nYour observed CPA is £50. Your actual CPA is probably closer to £30 - but you can't prove it, and neither can the algorithm.\n\nAfter sGTM deployment, you recover most of that missing signal. The algorithm now sees the real conversion volume. Three things happen:\n\n * Campaigns that were being over-credited lose budget to campaigns that were being under-credited. This reallocation alone can improve ROAS by 10-20%.\n * Automated bidding strategies converge faster because they have more signal. Less wasted spend during learning periods.\n * Remarketing audiences grow, because you're now building them from a more complete user base.\n\nThe exact numbers vary by vertical, consent rates, and ad blocker penetration. But the direction is always the same: more data in, better decisions out.\n\n\nHow we do it\n\n\n\nWe use our UPDATE framework to migrate clients to server-side GTM as part of our tracking solutions. Six steps:\n\n 1. Understand - audit your current setup, quantify data loss, identify what you'd recover\n 2. Plan - design the server-side architecture (Cloud Run, load balancing, failover)\n 3. Deploy - spin up the server container, configure clients, tags, triggers and variables\n 4. Audit - validate data parity between client-side and server-side\n 5. Transition - shift live traffic, monitor, resolve discrepancies\n 6. Evaluate - measure the uplift in data volume, attribution accuracy, and ad platform performance\n\nThe whole process typically takes 4-8 weeks depending on complexity. The infrastructure cost is modest - Cloud Run pricing scales with traffic, and for most sites it's a few hundred pounds per month.\n\n\nThe question isn't whether - it's when\n\n\n\nEvery month you run browser-side-only tracking, you're making decisions on incomplete data. The gap isn't getting smaller. Safari's restrictions are tightening. Chrome's Privacy Sandbox is evolving. Ad blocker adoption is growing.\n\nServer-side GTM isn't a nice-to-have for next year's roadmap. It's a data quality issue that's costing you money right now.\n\nIf you want to know what you'd recover, talk to us about an sGTM readiness assessment. We'll quantify the gap and show you what comes back.\n\nClean data in is the foundation for everything else. Once your tracking is solid, the next step is unifying it in an intelligence platform - and from there, building the governed agents and data products that turn data into decisions."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/new-website-platform-not-patch/#article",
      "headline": "We've stopped patching. And started building.",
      "description": "Measurelab has a new website. It reflects a shift toward building intelligence platforms, not just solving technical problems. Here's what's changed.",
      "url": "https://www.measurelab.co.uk/insights/blog/new-website-platform-not-patch/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/new-website-platform-not-patch/#webpage"
      },
      "datePublished": "2026-02-10T17:06:56.000+00:00",
      "dateModified": "2026-02-11T15:06:12.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2026/02/New-website.png",
      "author": {
        "@type": "Person",
        "name": "Steven Elliott",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Measurelab"
      ],
      "articleBody": "We've made ourselves a new website. Honestly, it's one of the less interesting things we've built this quarter, but the process itself has been a fitting metaphor for where Measurelab is heading.\n\n\nWhy the change?\n\nWe've a long history supporting clients in their implementation and use of Google Analytics, GTM and Looker Studio. We've earned a reputation for great work. And that work's not going anywhere - although through a combination of augmentation and automation, how we do it evolves by the day.\n\nBut for some time we've done much much more. Since its introduction, we've seen and embraced the potential of BigQuery and the wider Google Cloud toolset. That commitment culminated in us earning the Google Cloud Marketing Analytics specialisation last year (recently re-labelled the Data & Analytics Competency in Google Cloud - more on that another time).\n\nIt's a bet that's paid dividends, with at least half our work now being cloud-focused - with BigQuery the unified data and AI platform at the centre. While Google continues to invest untold billions to build capacity and capability in cloud and Gemini.\n\nBut the real story isn't where the work is happening, it's what the work is enabling. We've gone from sometimes feeling like we're perpetually patching problems, to building platforms that are unlocking huge efficiencies and growth opportunities for clients. We still retain our expertise in the tools, but we're now using them to build intelligent systems that can deliver reliable answers to the critical questions clients are asking.\n\nOur old website presented us as friendly neighbourhood analytics geeks. And we still are, deep down. But we've come to realise we're now operating at the sharp end of something that's radically changing how businesses operate. The look and language of the new site is intended to reflect that.\n\n\nA thoroughly modern stack\n\nOur old site was a bloated WordPress install. Loads of features we didn't use. A handful of things we desperately wanted to do but couldn't. WP Engine hosting costs that made us wince every month. And a myriad of plugins that continually needed updating.\n\nAt the risk of forcing an analogy, it's remarkably similar to the story we hear from clients about their martech infrastructure every day. Too many tools. Too much spend. Not enough control. The nagging feeling you're renting a liability rather than investing in an asset.\n\nWe wanted something slick and blazing fast. A static site with clean HTML and minimal bloat. So we chose to build (ourselves, with some AI assistance). The process was so addictive, before we knew it, we'd built ourselves an internal operations hub and a new client-facing portal too.\n\nFor the site measurement, we've got Google Analytics in place, obviously. Also Posthog, because it's fun and full-featured, and Plausible for privacy-friendly traffic stats. Server side GTM via Stape. All feeding into BigQuery. We're not going to be short of data to play with.\n\n\nThe content conundrum\n\nOver ten years of Measurelab means a breadth and depth and range of content that ensures we rank well in the SERPs. But what we do today is very different to what we were doing ten years ago (we miss you, UA). A website replatform was an unmissable opportunity for a pre-spring clean. Out with the old, doubling down on the new. Not to mention an opportunity to integrate it all - blog, podcast and video content - into a single new insights hub.\n\nIn the last quarter, our number one source of inbound leads has been people finding us as a result of a chatting with their preferred LLM advisor (mostly ChatGPT for what it's worth). So we're thinking harder about GEO (generative engine optimisation) too - conscious we've got to cater for our new robot friends, as well as our cherished human readers.\n\n\nWhere to stop?\n\nThrough the project, we've rediscovered a passion for coding, creating, experimenting, and being hands-on. Measurelab has always been about building and delivering things - more than the docs and decks favoured by other consultancies.\n\nWe'll be sharing more about what we're building and the value it's delivering. The question we keep coming back to: what would you build if you weren't spending all your time maintaining the legacy you inherited? If you're curious how a new intelligence platform might unlock growth for your business, let's have a chat.\n\n\n"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/clearing-uk-universities-student-recruitment-intelligence/#article",
      "headline": "Clearing 2026: why UK universities need recruitment intelligence",
      "description": "UK universities face a deficit crisis. Student Recruitment Intelligence can transform Clearing from chaos to precision.",
      "url": "https://www.measurelab.co.uk/insights/blog/clearing-uk-universities-student-recruitment-intelligence/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/clearing-uk-universities-student-recruitment-intelligence/#webpage"
      },
      "datePublished": "2026-02-06T13:24:49.000+00:00",
      "dateModified": "2026-02-10T16:05:19.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2026/02/student-recruitment-image.png",
      "author": {
        "@type": "Person",
        "name": "Steven Elliott",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "BigQuery",
        "Data Analysis",
        "Marketing"
      ],
      "articleBody": "I've been through Clearing twice. It's stressful enough as a parent. But I never stopped to think about the temperature on the other end of the hotline.\n\nUK universities are feeling the heat. They're not just underfunded. Many are fighting for solvency. And what they need is an injection of intelligence.\n\n\nThe student squeeze is real\n\nThe latest forecasts are stark: 45% of English higher education providers are expected to report a deficit in 2025-26. But the pain isn't evenly spread. The elite can lean on research funding, huge endowments and global brand power. The rest have no such cushion.\n\nThe golden age of international recruitment has abruptly ended. The ban on dependents for postgraduate students has collapsed key markets like Nigeria and India.\n\nFacing their own funding gaps, the Russell Group has responded by opening their doors wider. Bradley Cooper just turned up at the local singles night and all of a sudden your old lines aren't landing.\n\nThis leaves universities fighting a fierce, zero-sum battle for domestic applicants. Clearing isn't a tactical mop-up exercise any more. It's become a mission critical operation with institutional survival at stake.\n\nFor a deeper look at the market shifts facing the sector and the solution we prescribe, see our Student Recruitment Intelligence Platform solution overview.\n\n\nThe economics of the \"marginal\" student\n\nBy August, a university's cost base is largely fixed. Lecture theatres have been given a lick of paint. Academic staff contracted. The heating bills are budgeted. All costs are sunk. And at best the income from the regular student intake might cover them.\n\nEvery additional Clearing student recruited can make a high marginal contribution to the university's budget surplus (or help chip away at the deficit). A successful Clearing campaign can make the difference between a manageable shortfall and a full-blown crisis.\n\nDemand for high-value international students is such that agent commissions have surged in recent years, with some now exceeding £4,000 per student (a tear-inducing 25% of first-year fees).\n\n\nThe data disconnect between marketing and admissions\n\nDespite the high stakes, most universities lack the infrastructure and insights to operate effectively. Clearing can be chaotic, reactive, and inefficient.\n\nMarketing are optimising for enquiries (inbound phone calls, website forms). Admissions has to deal with the reality of ineligible applications and tyre-kickers, with only a fraction of marketing-sourced applicants going on to enrol. Two teams working towards the same goal, but operating with disconnected data.\n\nFewer than half of university marketing teams (43%) are able to close the loop and track Cost Per Enrolment, the metric that actually determines financial viability.\n\nCampaigns lack real-time awareness. Google and Meta don't get sight of who actually enrols, so the algorithm keeps chasing the wrong people and wasting budget at scale. BSc Chemistry filled up days ago, but ads are still running. While that undersubscribed BA in History isn't being promoted.\n\nCritical decisions (which courses to push, when to pivot budget, which applications are worth nurturing) are being made without vital information. Student recruitment teams are flying blind.\n\n\nThe fix: Student Recruitment Intelligence\n\nThe universities that survive 2026 will stop playing the volume game and start playing the value game. That means building a Student Recruitment Intelligence Platform that unifies data sources to connect marketing activities and the students sat in the lecture hall on day one of term.\n\n\nClosing the loop with offline conversion tracking\n\nLink the unique tracking ID from a web visitor to their final status in your CRM or student information system (something like SITS). This lets you tell Google exactly which ads resulted in a confirmed enrolment. The algorithm stops hunting for leads and starts hunting for the students likely to enrol.\n\n\nBidding on value, not volume\n\nNot all students are equal. Someone who drops out in week one is a cost. Machine learning models can now predict dropout risk with over 90% accuracy, meaning you can identify high-retention profiles before they even apply. Bid £5 on a standard lead, but up to £20 on someone with strong grades and a high probability of completing the course.\n\n\nMaking campaigns inventory-aware\n\nThe platform can integrate with your student record system to monitor course capacity in real time. When one course hits 95% capacity, the system automatically pauses broad-match ads and reallocates that budget to another with 20 seats to fill. Every pound of marketing spend goes toward actual gaps in inventory.\n\nWant to see what this looks like? Explore our demo recruitment intelligence dashboards to visualise Clearing intelligence in practice.\n\n\nAn illustration of the impact\n\nTake a typical mid-sized university spending £300k on Clearing ads to recruit 200 students. That's a cost per enrolment (CPE) of £1,500, resulting in about £6m in fee revenue over three years. In this scenario, the university is flying blind. Spending on leads that don't convert. Nurturing time wasters. Aggressively promoting courses that are already at capacity.\n\nWith recruitment intelligence in place, a 20% efficiency gain is a reasonable expectation. The same £300k spend invested with precision could result in CPE dropping from £1,500 to £1,200 and your clearing intake rising from 200 to 250 students.\n\n50 extra students. £1.5m in additional income. No extra budget. Just smarter allocation. In a year where 45% of universities face a deficit, a £1.5 million swing isn't just a marketing win. It could be a financial lifeline.\n\nCurious about your own numbers? Use our ROI Calculator to calculate the potential return on Clearing intelligence\n\n\nThe only question left\n\nThe headwinds facing UK higher education aren't going away. Demographic shifts. Visa restrictions. Funding gaps. These are structural realities.\n\nBut the deficit crisis is a solvable problem for institutions willing to adapt. The technology exists. The data is available. The only question is who deploys it fast enough to win the game in 2026.\n\nAt Measurelab, we build Student Recruitment Intelligence Platforms and the data products built on top of them. If you'd like to join the universities applying real-time intelligence to their Clearing campaigns, get in touch to book a discovery call. and we can explore what's possible.\n\n\nFAQs\n\n\n\n\n\n\n\n\n\n\nHow can universities track Cost Per Enrolment (CPE) accurately?\n\n\n\nUniversities must link web-based tracking IDs (like GCLID) to their Student Information System (SIS). By importing \"Offline Conversions\" back into ad platforms, teams can see which specific campaigns resulted in a \"Confirmed\" or \"Enrolled\" status.\n\n\n\n\n\n\n\nCan AI predict which Clearing students are most likely to drop out?\n\n\n\nYes. Modern machine learning models can analyze historical enrollment data to identify \"high-retention\" profiles with over 90% accuracy, allowing marketing teams to bid more aggressively for students likely to complete their degrees.\n\n\n\n\n\n\n\nWhat is \"Inventory-Aware\" marketing for higher education?\n\n\n\nIt is an automated system that connects ad platforms to real-time course capacity data. When a course (e.g., BSc Chemistry) hits a specific fill percentage, the system reallocates the ad budget to under-filled courses (e.g., BA History) instantly.\n\n\n\n\n"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/the-ai-revolution-already-happened/#article",
      "headline": "The AI revolution already happened",
      "description": "AI's revolution is already here. We're too busy debating its future to harness the transformational power of today's models.",
      "url": "https://www.measurelab.co.uk/insights/blog/the-ai-revolution-already-happened/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/the-ai-revolution-already-happened/#webpage"
      },
      "datePublished": "2026-01-28T11:50:06.000+00:00",
      "dateModified": "2026-01-28T13:42:12.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2026/01/Opinion-piece--2.png",
      "author": {
        "@type": "Person",
        "name": "Matthew Hooson",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "AI & ML"
      ],
      "articleBody": "We are living through a technological revolution and spending most of our energy arguing about whether it's really happening. \n\nThe discourse around AI is a cacophony, apocalypse warnings, dismissals, denial, and hype cycling through our feeds with dizzying regularity. But while we debate what AI might become, we're ignoring what it already is.\n\n\nWhat are the four main perspectives on AI?\n\nIn my observation, people tend to fall into four main camps:\n\n * The apocalypse camp: The end is nigh, and the robots are coming for us.\n * The \"AI is naff\" camp: It hallucinates, it's a parlour trick, and it's a bubble waiting to pop.\n * The denial camp: It's a fad that won't impact my job or life significantly. I will just carry on as normal.\n * The augmentation camp: This is a tool that extends human capability.\n\nI'll admit, depending on the day (and perhaps how much sci-fi I've recently consumed), I tend to flit between the Apocalypse camp and the Augmentation camp myself.\n\nThe news cycle tends to orbit these camps with dizzying regularity, often driven, cynically speaking, by whatever generates the most engagement on any given week. I want to cut through this noise and challenge the extremes of the debate. But to do that, we first need to look inward, at a human trait that is both a gift and a curse.\n\n\nWhy do we fail to see the complexity of AI tools?\n\nEver since we first picked up a bone club, our species has been defined by a symbiotic relationship with our tools. But there is a nuance here that we often miss: we don't just adapt to technology; we force technology to adapt to us.\n\nIf that bone club had required a PhD to operate, we would have remained a bright but stationary primate. We thrive because we build systems that hide their own difficulty.\n\nThe modern smartphone is the perfect example. It is a device of infinite complexity, yet we have engineered the friction out of it so effectively that a two-year-old can master it in seconds. This seamlessness is a triumph of design, but it creates a dangerous psychological side effect: because the complexity is hidden, buried under sleek glass and intuitive UIs, we mistake the tool's ease of use for simplicity of function. We stop respecting engineering and start expecting magic.\n\nI saw this in myself when I bought my first smart home setup. Speaking a command, having it processed by a server farm halfway across the world, and instantly triggering a physical switch in my living room was nothing short of sorcery. Cut to three months later, and I found myself swearing like a sailor at the speaker because it failed to understand a command while I was chewing toast. I had stopped seeing the millions of lines of code and the miracle of connectivity. I just saw a light switch that didn't work.\n\nAnd this is precisely the cycle now playing out with Large Language Models, but at a velocity we've never experienced before.\n\n\nThe narrative whiplash\n\nWhen GPT-3 first appeared, it was remarkable. I remember reading AI attempts at a Harry Potter chapter only a year prior that were laughable; suddenly, the machine could output something coherent and passable. It could write code, not reliably, but the mere fact that it was a possibility was staggering.\n\nThen came the inevitable narrative whiplash. The headlines shifted from \"AI will replace all writers\" to \"AI is getting lazy\" or \"AI is hitting a wall.\" We moved from awe to criticism in record time. We are judging the technology based on its current, fleeting limitations rather than its fundamental power. We look at a tool that can summarise a 500-page document in 30 seconds and complain that the prose is a little \"dry.\"\n\nWe are missing the forest for the trees because we are waiting for the next hit of dopamine, the next \"magic trick\" (like Sora's video generation or GPT-5). But this focus on the next leap creates a blind spot for the current reality.\n\n\nWhat is the \"Frozen AI Hypothesis\"?\n\nHere is the argument I really want to make: If all AI development stopped today, if we froze the models exactly where they are right now, the outcome would still be transformational.\n\nWe are currently so obsessed with the foundation models getting smarter that we are ignoring the utilisation gap. I would estimate we are utilising a fraction of the potential utility of the current models, largely because our internal data is often too messy or unstructured to be useful. We haven't even begun to fully integrate the \"old\" tech (like GPT-4) into our supply chains, our education systems, or our creative workflows. While high-stakes fields like clinical healthcare may rightly demand the higher reliability of future models, the administrative and logistical sides of these industries could still be revolutionised by what we have today.\n\nThe narrative shouldn't be about whether AI will achieve AGI next year (a concept that I believe has become more of a marketing term than anything actually definable), or whether it's a bubble. The narrative should be about the fact that we have a miraculous tool right now that we have barely unboxed.\n\nIf the \"AI is naff\" camp is right and the models never get better than they are today, we still have a tool that allows a junior coder to work like a senior, a writer to brainstorm at 10x speed, and a researcher to synthesise data in moments. That isn't a flash in the pan; that is a fundamental shift in how human beings process information.\n\nSo if the models aren't the bottleneck, what is?\n\n\nWhat is the \"Infrastructure of Intelligence\" in AI?\n\nThis utilisation gap isn't about the models lacking IQ; it's about us lacking the infrastructure to harness them. The real innovation happening right now isn't just in making the \"brain\" bigger, but in building the nervous system around it.\n\nWe are seeing this with platforms that shift the focus from \"what can the model say?\" to \"what can the model do with my data?\" The magic happens when you stop treating the AI as a chatbot and start treating it as a reasoning engine grounded in company-specific truth. It is no coincidence that Google has repositioned BigQuery from a data warehouse, to a ‘autonomous data and AI platform.\n\nHowever, this infrastructure relies on more than just software; it relies on data maturity. You cannot simply dump a swamp of unstructured files into BigQuery and expect precision. This is where the unsexy but vital work of data semantics and metadata labelling comes into play. To get the most out of these models, we need to structure our data in a way that establishes trust. If the model doesn't understand the semantic difference between a 'lead' and a 'sale' because the metadata is missing, that isn't an AI failure, that is a data modelling failure.\n\nBeyond the data itself, there are three massive architectural challenges we need to solve to unlock this utility. These have nothing to do with raw compute, but everything to do with how we build the systems wrapping the models.\n\nBetter interfaces. We are currently interacting with remarkably advanced intelligence through interfaces that are often little more than a text box. While chat has its place, this is a failure of imagination for many use cases. We need adaptive front-end technology that can render data, visualise trends, and allow for manipulation of outputs, not just reading text. Perhaps a new interface altogether is on the cards…\n\nLong-term memory. We need to solve the 'goldfish' problem. A model resets every time you hit refresh. By building external memory architecture, systems that remember your past projects, your tone of voice, and your specific constraints, we make the model feel infinitely smarter without adding a single parameter. Think of it as giving the AI a notebook it can refer back to. \n\nNote: things have moved forward on this point since I originally wrote it, memory is now a feature of all the frontier models, although it is certainly not a solved problem\n\nEvolving knowledge. The 'Frozen' hypothesis works only if the system around the model isn't frozen. We need architectures that allow knowledge to update, not by retraining the model itself (which is expensive), but by updating the knowledge base the model retrieves from. The model stays the same, but what it knows evolves daily. It's the difference between a static encyclopaedia and a living library.\n\nWe don't need a smarter model to check stock levels or summarise a legal contract; we need better application layers, memory systems, and interfaces that connect the current models to our reality.\n\n\nThe nature of the bubble\n\nThis leads me to the lingering fear that we are in a bubble waiting to pop. I tend to agree that there is a bubble, but I believe we are looking at the wrong historical analogy. People fear a Housing Crisis style crash, where the underlying assets were toxic and value evaporated overnight.\n\nI see this climate as far more akin to the Dot-com bubble of the early 2000s. Yes, valuations are currently insane. Yes, countless startups will likely vanish into the ether, and perhaps even some of the major players will face corrections. But we must remember that while the Dot-com bubble burst, the internet did not go away.\n\nThe underlying technology was not toxic; it was merely over-speculated. It didn't stop being useful. In fact, it was only after the hype died down and the bubble burst that the internet truly integrated into the fabric of our lives. If the AI industry pops and investment is lost, the intelligence we have bottled isn't going back on the shelf. The ability to synthesise information, code, and create is here to stay, just as the fibre-optic cables laid during the .com boom remained to power the internet age long after the Nasdaq crash.\n\n\nMoving to the augmentation camp\n\nUltimately, the doom-mongering and the hype-cycling are distractions. We need to stop looking at AI as a replacement for humanity or a failed experiment. We need to treat it like the bone club, the smartphone, or the smart speaker: a tool that is…"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/success-stories/unifying-student-data-for-university-of-exeter/#article",
      "headline": "Unifying student data to drive smarter recruitment for The University of Exeter",
      "description": "How we helped the University of Exeter connect student data end-to-end to measure marketing ROI and optimise recruitment.",
      "url": "https://www.measurelab.co.uk/insights/success-stories/unifying-student-data-for-university-of-exeter/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/success-stories/unifying-student-data-for-university-of-exeter/#webpage"
      },
      "datePublished": "2025-12-11T15:00:00.000+00:00",
      "dateModified": "2026-03-19T08:53:30.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/12/exeter-cover-image.png",
      "author": {
        "@type": "Person",
        "name": "Will Hayes",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Privacy",
        "Looker Studio",
        "Marketing"
      ],
      "articleBody": "The University of Exeter is a leading UK institution committed to improving its understanding of student interactions and return on investment (ROI) in marketing and recruitment. As part of this mission, they sought to establish a unified student data framework that would allow them to track engagement across multiple platforms and systems used throughout the student journey.\n\n\nThe Challenge\n\nExeter had previously tried and failed to connect marketing activity with student enrolment. They faced several challenges:\n\n• Technical Limitations: A unique user ID could not easily be maintained across all systems, particularly their core student database. Any new approach also had to work with existing digital tools already in use.\n• Data Privacy & Compliance: Evolving regulations (GDPR, cookie deprecation) made traditional tracking methods less viable.\n• Fragmented User Journeys: Prospective students interacted across multiple devices, browsers, and communication channels, making it difficult to create a unified view.\n• Cost Barriers: Extracting and integrating data from existing systems using standard third-party tools was prohibitively expensive.\n• Limited Internal Resources: The university lacked the in-house technical capacity and expertise to deliver such a solution without significant external support.\n\n\nThe Solution\n\nIn close collaboration with Exeter University’s teams, Measurelab developed a scalable, compliant, and cost-effective data integration approach that connects new and existing marketing and recruitment tools while maintaining a consistent user identity across platforms. This ‘student recruitment intelligence platform’, provides a comprehensive view of the user journey.\n\nThe approach centred around securely linking user interactions across systems to enable end-to-end tracking of marketing influence on student applications. Data, including the Student information system (SITs), was consolidated within the intelligence platform, where it could be matched with application and enrolment records. This enabled visibility into the full student journey from initial engagement to conversion.\n\nThe resulting dataset was visualised in a custom reporting dashboard, aligned with Exeter’s branding and built to be easily used by marketing and recruitment teams. A clear measurement framework and a set of agreed KPIs were also established to ensure ongoing focus on the most actionable insights.\n\n\nThe Results\n\nWith this solution in place, Exeter University now has significantly improved visibility into which marketing activities drive applications and enrolments, enabling accurate cost-per-enrolment tracking. The integration supports data-driven decision-making, ensuring marketing budgets are directed toward the most effective channels. By linking applicant data across multiple systems into a scalable student recruitment intelligence platform, the university can now measure marketing ROI with confidence and continually optimise future campaigns for better performance."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/the-promise-and-reality-of-natural-language-to-sql/#article",
      "headline": "Ask your data a question: the promise (and reality) of natural language to SQL",
      "description": "NL-SQL tools can transform how you query data - but only if your foundations are solid. Here's an honest look at what works and what doesn't.",
      "url": "https://www.measurelab.co.uk/insights/blog/the-promise-and-reality-of-natural-language-to-sql/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/the-promise-and-reality-of-natural-language-to-sql/#webpage"
      },
      "datePublished": "2025-11-28T16:37:00.000+00:00",
      "dateModified": "2026-03-06T16:13:05.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2026/03/New-website-1.png",
      "author": {
        "@type": "Person",
        "name": "Matthew Hooson",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "SQL",
        "AI & ML"
      ],
      "articleBody": "Unless you've spent the last year in a particularly deep cave, you've probably heard the phrase \"just ask your data a question\" thrown around with wild abandon. The dream is seductive: instead of bothering your already overwhelmed data team with yet another ad hoc query, you simply type \"How many users spent more than 20 minutes on site yesterday?\" and watch the magic happen. SQL appears, results flow, insights materialise.\n\nI'll be honest, I've been one of the people promising this future. But having spent considerable time poking, prodding, and occasionally pleading with these tools, I think it's time for a more nuanced conversation about where we actually are. Because here's the thing: Natural Language to SQL is genuinely impressive. It's also genuinely limited. And understanding the gap between those two truths is crucial if you want to get real value from these technologies.\n\n\nWhat are we actually talking about?\n\nAt its core, Natural Language to SQL (NL-SQL) does exactly what it says on the tin. You write a question in normal human language, and an AI model translates that into SQL that queries your specific data set/project/table. In the BigQuery world, this means turning on the Gemini API, clicking \"generate SQL with Gemini,\" and watching your question transform into a fully working query within seconds.\n\nThis isn't some distant future technology, it's available right now in BigQuery. And it works. Sort of.\n\nMarch 2026 update\n\nSince our webinar in December 2025, Google has introduced Data Agents in BigQuery - a formalised way to define data context, instructions, and knowledge sources for NL-SQL. Crucially, Data Agents now support custom glossary terms (Preview) and can import business glossary terms from Dataplex Universal Catalog (GA since June 2025), giving the model structured business context rather than relying on schema names alone. BigQuery has also launched Data Canvas, a visual workspace where you can explore, query, and visualise data using natural language prompts powered by Gemini.\n\n\nThe metadata problem\n\nHere's where things get interesting. We recently ran a webinar where we put these tools through their paces using the Google Analytics 4 data for the Google Store. For those who've worked with GA4 data in BigQuery, you'll understand the pain, the event-based schema with its nested parameters is one of the most challenging structures to query correctly.\n\nWe asked a simple question: \"How many sessions came from Google?\"\n\nThe NL-SQL produced a query that, on first inspection, looked perfect. It counted distinct combinations of user pseudo ID and session ID, filtered by source. Textbook stuff. But look closer and you'll spot two problems. First, it used traffic_source.source instead of the session-scoped source from event parameters or the newer session_traffic_source_last_click.manual_campaign.source field, a subtle but important distinction in attribution. Second, it filtered for \"Google\" with a capital G, while the actual data uses lowercase.    \n\nMarch 2026 update\n\nSince December 2025, BigQuery Data Agents have added support for verified queries (previously called \"golden queries\") — pre-validated SQL that the agent references when it encounters specific question types. For a case like ours, you could create a verified query that correctly handles session-scoped attribution via session_traffic_source_last_click, and the agent would use that as a template rather than guessing. This doesn't eliminate the need for human validation, but it gives you a mechanism to lock in correct logic for your most common questions.\n\n\nThis isn't a failure of the AI. It's a failure of context.\n\nThe model doesn't know your data. It doesn't know that your organisation uses lowercase values, or that session attribution lives in a different place than first-user attribution. It's making educated guesses based on schema names and general knowledge of analytics concepts. Sometimes those guesses are right. Often, they're plausibly wrong, which is arguably worse than being obviously wrong.\n\n\nThe semantic layer is everything\n\nIn our second example, we simply asked NL2SQL to show how many bots were on site. The immediate output was nonsensical - the SQL generated counts the number of unique user_pseudo_ids where user_pseudo_ids is NULL…\n\nThe problem here is that this information is held under event_params - a nested column that NL2SQL cannot read information about just from looking at column names.\n\nSo how do you fix this? Metadata. Lots of it.\n\nWhen we added table and column descriptions explaining that bot detection flags could be found in event parameters, the model correctly started pulling from the right place. When we pre-unnested the data with clearly named columns like session_source, the attribution problem disappeared.\n\nThis is the uncomfortable truth about conversational analytics: the more effort you put into describing your data, the better results you get out. There's no magic shortcut. If you want these tools to understand that \"conversions\" means your specific purchase event, or that \"engaged users\" follows your particular definition, you need to tell them. Explicitly. Repeatedly.\n\nThink of it like onboarding a new analyst. You wouldn't expect them to intuitively understand your attribution model, your naming conventions, or your business-specific metrics on day one. The AI is no different, except it forgets everything between prompts unless you've baked that knowledge into the system instructions.\n\nMarch 2026 update\n\nGoogle has since formalised much of what we were doing manually here. BigQuery Data Agents now let you define custom glossary terms that map business language to specific fields and logic — so \"bot traffic\" can be formally defined as a term linked to the relevant event parameter. Combined with Dataplex Universal Catalog's business glossary (GA since June 2025), you can maintain a single vocabulary across your organisation that both humans and AI reference. The broader industry trend toward formal semantic layers (LookML, dbt Semantic Layer) as the grounding layer for AI-driven analytics reinforces the same principle: don't expose raw data to AI in the first place.\n\n\nThe tool landscape\n\nCurrently, there are several ways to access NL-SQL capabilities in the Google Cloud ecosystem, each with different trade-offs.\n\nBigQuery's built-in Gemini integration is the most accessible starting point. It's quick, free (beyond standard Gemini token costs), and genuinely useful for analysts who have enough SQL knowledge to critique and refine the output. This is the key point: it's a productivity accelerator for people who already understand SQL, not a replacement for SQL knowledge.\n\nLooker Studio Pro's Conversational Analytics promises a more user-friendly interface. You create agents, connect them to data sources, and let stakeholders ask questions directly. In theory, this is exactly what data teams have been crying out for, a way to handle ad hoc questions without becoming a permanent bottleneck.\n\nIn practice? It's frustratingly inconsistent. We had an agent working perfectly one day, returning session-attributed traffic correctly. The next day, same agent, same question, different answer, it was arguing with us about whether it was doing session-level attribution (it wasn't). By day 3 everything fell apart, it refused to talk to us entirely, complaining about access which was unchanged. Add to all of this a level of obscurity between questions asked and BQ costs, which could get away from you if not properly managed. The technology will get there, the potential is obvious, but right now it's not something I'd put in front of stakeholders expecting reliable, trustworthy results. \n\nThe Conversational Analytics API and Agent Development Kit (ADK) represent the more powerful end of the spectrum. These let you build custom applications with multiple data sources, sophisticated prompting, and the ability to embed conversational interfaces wherever your users already work, Slack, Looker Studio dashboards, and internal tools.\n\nThe trade-off is complexity. You're now in the territory of Python development, cloud infrastructure, and understanding concepts like MCP toolboxes. But you also get far more control over the \"semantic layer\", those crucial descriptions, glossaries, and relationship mappings that make the difference between useful and useless responses.\n\nMarch 2026 update\n\nThe tool landscape has shifted meaningfully since December 2025. BigQuery now offers Data Agents with glossary terms, verified queries, and curated knowledge sources — effectively productising the \"semantic layer\" we were building by hand. Looker Studio Pro's Conversational Analytics has continued to mature, adding a Code Interpreter (Preview) that translates natural language into Python for more advanced analysis beyond what SQL alone can do. On the custom development side, Google has launched a fully managed BigQuery remote MCP server (Preview, auto-enabled for new projects after March 17, 2026), which lets LLM agents connect directly to BigQuery using the open Model Context Protocol. The ADK now includes a BigQuery Agent Analytics plugin for streaming agent interaction data into BigQuery for performance monitoring. The build-your-own path is becoming considerably more accessible.\n\n\nThe pattern that emerges\n\nIf there's one insight I'd want you to take away, it's this: there's a direct relationship between effort invested and value extracted.\n\nNL-SQL in BigQuery is low effort but only useful for analysts. Looker Studio Pro is moderate effort but currently too buggy for production use. The API and ADK approaches require significant investment but unlock genuine democratisation of data across an organisation.\n\nThe deciding factor isn't the technology, it's the semantic layer you build around your data. The descriptions, the glossaries, the example queries, the business context. Without that investment, even the most sophisticated…"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/success-stories/integrating-web-analytics-with-crm-charles-stanley/#article",
      "headline": "Integrating web analytics with CRM for Charles Stanley",
      "description": "How Charles Stanley unified customer data with a Google Cloud solution, improving journey visibility, data reliability, and personalised marketing.",
      "url": "https://www.measurelab.co.uk/insights/success-stories/integrating-web-analytics-with-crm-charles-stanley/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/success-stories/integrating-web-analytics-with-crm-charles-stanley/#webpage"
      },
      "datePublished": "2025-11-27T14:50:00.000+00:00",
      "dateModified": "2026-01-23T18:14:28.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/12/charles-stanley-image--new-.png",
      "author": {
        "@type": "Person",
        "name": "Nasima Khatun",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "BigQuery",
        "Google Cloud",
        "Privacy"
      ],
      "articleBody": "Charles Stanley is a UK-based wealth management firm, founded in 1792, that provides investment management and financial planning services to private clients, charities, trusts, and professional advisers.\n\n\nThe challenge\n\nCharles Stanley’s marketing teams struggled with fragmented customer data. Web analytics in GA4 and BigQuery remained disconnected from their CRM database, preventing a complete view of customer journeys. The existing email-based user identification was unreliable, as email addresses could change or be shared, creating data quality issues and limiting personalised marketing capabilities.\n\n\nThe Solution\n\nWe designed a custom Google Cloud architecture using GA4 with BigQuery export, Cloud Functions, and secure SFTP protocols. We implemented a hybrid user ID strategy combining pre-registration SHA-256 hashed emails with post-registration PIDs. BigQuery reporting tables prioritised PIDs and retrospectively updated historical sessions. Cloud Functions automated data extraction and secure scheduled transfers.\n\n\nThe Results\n\nThe solution unified Charles Stanley’s customer data, providing complete visibility into customer journeys from first visit through post-registration activity. The hybrid ID approach maintained privacy compliance while improving data reliability. Automated daily transfers eliminated manual handling, ensuring the CRM database reflected the latest web insights for personalised marketing strategies.\n\nBy implementing a hybrid ID strategy with automated Cloud Functions, we achieved seamless, privacy-compliant data integration between web analytics and CRM systems.\n\n"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/measurelab-google-cloud-marketing-analytics-specialisation/#article",
      "headline": "Measurelab awarded Google Cloud Marketing Analytics Specialisation",
      "description": "At the start of the year, if you’d asked us whether Measurelab would be standing shoulder to shoulder with Europe’s biggest consultancies by September, we would've been surprised. Not because we don't believe in ourselves, but because these things feel so distant - until suddenly, they’re not.\n\nSo, here it is: we’ve been awarded the Marketing Analytics Services Partner Specialisation in Google Cloud Partner Advantage.\n\n\nWhat’s the big deal?\n\nIn Google’s own words (with the obligatory Zs):\n\n“Spec",
      "url": "https://www.measurelab.co.uk/insights/blog/measurelab-google-cloud-marketing-analytics-specialisation/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/measurelab-google-cloud-marketing-analytics-specialisation/#webpage"
      },
      "datePublished": "2025-09-11T14:18:14.000+00:00",
      "dateModified": "2026-01-23T18:04:47.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/09/Marketing-Analytics-Specialisation.png",
      "author": {
        "@type": "Person",
        "name": "Will Hayes",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Cloud",
        "Measurelab",
        "Google Analytics",
        "BigQuery",
        "Privacy",
        "Testing",
        "AI & ML"
      ],
      "articleBody": "At the start of the year, if you’d asked us whether Measurelab would be standing shoulder to shoulder with Europe’s biggest consultancies by September, we would've been surprised. Not because we don't believe in ourselves, but because these things feel so distant - until suddenly, they’re not.\n\nSo, here it is: we’ve been awarded the Marketing Analytics Services Partner Specialisation in Google Cloud Partner Advantage.\n\n\nWhat’s the big deal?\n\nIn Google’s own words (with the obligatory Zs):\n\n“Specialization is the highest technical designation a partner can earn. Partners who have achieved a Specialization in a solution area have an established Google Cloud services practice, consistent customer success, and proven technical capabilities, vetted by Google and a third-party assessor.”\n\nIn other words: we’ve been tested, grilled, and audited within an inch of our lives - and we passed.\n\nTo get here, we needed at least two certified Cloud Data Engineers and two certified Machine Learning Engineers, case studies that showed we can actually walk the talk, documented processes (lots of them), and finally, a four-hour interview with a very polite but uncompromising assessor.\n\nTough? Absolutely. Worth it? Definitely.\n\n\nNot just another badge 🏅\n\nWe’re not going to pretend the badge isn’t nice, it is. But this isn’t just a vanity project. Only 12 agencies and consultancies in Europe hold this specialisation. Most of them are huge global players. And then there’s us, proudly proving you don’t have to be massive to make a massive impact.\n\nWhat makes us stand out? We’re not just a Google Cloud partner, we’re also a certified Google Marketing Platform partner. That combination means we can connect the dots across analytics, cloud, and media in ways very few others can.\n\n\nCredit where it’s due 👏\n\nMassive congratulations to Matthew Hooson, who led the charge, and to every single person at Measurelab who makes the work we do possible. This recognition is as much theirs as it is the company’s.\n\n\nWhat it means for our clients\n\nFor our clients, this specialisation is more than a new logo on our website. It’s proof of what we’ve always set out to do: build solutions that connect Google Analytics, BigQuery, and the wider Google Cloud ecosystem in ways that drive real business results.\n\nIt’s validation that when you trust us with your data, you’re working with a team that’s proven, tested, and officially recognised at the highest level.\n\n\nLooking ahead ✨\n\nThis isn’t the finish line. It’s another milestone in our mission to bring the magic of Google Cloud and AI into marketing analytics. The challenges aren’t getting any simpler - data privacy shifts, new tools, more AI everywhere - but we’re ready.\n\nWe’re punching above our weight, and we plan to keep swinging. 🚀"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/bigquery-ai-generate-tutorial/#article",
      "headline": "BigQuery AI.GENERATE tutorial: turn SQL queries into AI-powered insights",
      "description": "BigQuery just got a major upgrade, you can now plug directly into Vertex AI using the new AI.GENERATE function. Translation: your analytics data and generative AI are now best friends, and they’re hanging out right inside SQL.\n\nThat opens up a whole world of new analysis options for GA4 data, but it also raises some questions:\n\n * How do you actually set it up?\n * What’s it good for (and when should you avoid it)?\n * Why would you batch the query?\n\nLet’s walk through it step by step.\n\n\nStep 1: H",
      "url": "https://www.measurelab.co.uk/insights/blog/bigquery-ai-generate-tutorial/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/bigquery-ai-generate-tutorial/#webpage"
      },
      "datePublished": "2025-09-03T13:09:00.000+00:00",
      "dateModified": "2026-01-27T11:24:02.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2026/01/ai-sql.png",
      "author": {
        "@type": "Person",
        "name": "Katie Kaczmarek",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "BigQuery",
        "Google Cloud",
        "AI & ML",
        "Marketing",
        "How-to"
      ],
      "articleBody": "BigQuery just got a major upgrade, you can now plug directly into Vertex AI using the new AI.GENERATE function. Translation: your analytics data and generative AI are now best friends, and they’re hanging out right inside SQL.\n\nThat opens up a whole world of new analysis options for GA4 data, but it also raises some questions:\n\n * How do you actually set it up?\n * What’s it good for (and when should you avoid it)?\n * Why would you batch the query?\n\nLet’s walk through it step by step.\n\n\nStep 1: How to Set Up AI.GENERATE in BigQuery (Vertex AI connection)\n\nBefore you can start prompting Gemini from SQL, you’ll need to connect BigQuery ↔ Vertex AI. The process is a little fiddly, but once it’s done you’re good to go.\n\n * Enable APIs: BigQuery Connection API + Vertex AI API.\n   \n * Create a Cloud Resource Connection in the GCP console (look for “Vertex AI” → “BigQuery Federation”).\n   * Go to + add data\n   * Search for vertex ai\n   * Click BigQuery federation\n   * Choose Vertex AI remote models, remote functions and BigLake\n   * Give it a connection_id (e.g. vertex_gemini_bigquery_link) and make sure the region matches your dataset.\n     \n * Copy the service account email from the new external connection.\n   \n * Grant IAM roles: add the Vertex AI User role to that service account.\n   \n\nPicking the right endpoint in your code: check which Gemini endpoints are available in your region (e.g. gemini-1.5-pro-002 in europe-west2). https://cloud.google.com/vertex-ai/generative-ai/docs/learn/locations#europe\n\n\nStep 2: Best use cases for AI.GENERATE in BigQuery (and what to avoid)\n\nThink of it like this: SQL is your calculator, AI.GENERATE is your interpreter.\n\n✅ Great for:\n\n * Insights: “What does this referrer + landing page say about intent?”\n * Classification: e.g. group queries into high vs low purchase intent.\n * Summarisation: turn 1000 rows into 5 takeaways.\n * Unstructured parameters: analyse feedback, search queries, chat logs.\n\n❌ Not great for:\n\n * Factual lookups (populations, exchange rates).\n * Crunching metrics (conversion, bounce rate).\n\nAI isn’t faster or more accurate than SQL for maths. Use it for context, not for sums.\n\n\nStep 3: AI.GENERATE example in BigQuery (referrer + landing page analysis)\n\nSay you want to quickly understand why users are landing on certain pages from different sources. We could ask AI to make its best guesstimate!\n\nWITH session_referrers AS (\n  SELECT\n    (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'link_domain') AS ld,\n    (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_title') AS pt\n  FROM `myproject.analytics_123456789.events_*`\n  WHERE _table_suffix BETWEEN '20240101' AND '20250101'\n    AND event_name = 'session_start'\n    AND (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'link_domain') IS NOT NULL\n)\nSELECT\n  ld,\n  pt,\n  AI.GENERATE(\n    CONCAT(\n      'You are a digital marketing analyst. ',\n    'I will give you two pieces of information about a new session on a website: ',\n    '1) The referring domain where the visitor came from: ', ld, '. ',\n    '2) The landing page the visitor viewed: ', pt, '. ',\n    'Based on these two fields, provide a short marketing insight. ',\n    'Explain what this might suggest about the visitors intent or acquisition opportunity. ',\n    'Keep the answer to 2 sentences, focused on actionable insight.'\n    ),\n    connection_id => 'projects/myproject/locations/europe-west2/connections/__default_cloudresource_connection__',\n    endpoint => 'gemini-1.5-pro-002'\n  ).result AS insight\nFROM session_referrers;\n\n * “Visitors from LinkedIn landing on the Careers page are likely job seekers. Emphasise employer branding.”\n * “Users from Google landing on Pricing show strong intent. Ensure CTAs are clear.”\n\n\nStep 4: Batch queries in AI.GENERATE for faster performance\n\nCalling AI row by row = slow and clunky.\n\nExample: 1,500 rows = 1,500 separate model calls. You’ll be waiting a while.\n\nBetter way:\n\n * Use STRING_AGG to group ~10 rows per prompt.\n * Ask Gemini to return insights as a bulleted list.\n\nNow 1,500 rows = 150 calls. That’s not cheaper (same total data processed), but it’s much faster and easier to work with.\n\nSo the above code could be written into batches like this:\n\n-- 1) Pull referrer + landing page pairs from GA4 session_start events\nWITH session_referrers AS (\n  SELECT\n    (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'link_domain') AS ld,\n    (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_title') AS pt\n  FROM `myproject.analytics_123456789.events_*`\n  WHERE _table_suffix BETWEEN '20240101' AND '20250901'\n    AND event_name = 'session_start'\n    AND (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'link_domain') IS NOT NULL\n),\n\n-- 2) Give each row a number so we can batch\nnumbered AS (\n  SELECT\n    ld,\n    pt,\n    ROW_NUMBER() OVER () AS rn\n  FROM session_referrers\n  WHERE ld IS NOT NULL\n),\n\n-- 3) Group into batches of 10 rows and build a prompt-friendly text block\nbatched AS (\n  SELECT\n    DIV(rn, 10) AS batch_id,\n    STRING_AGG(CONCAT('- Domain: ', ld, ', Landing page: ', pt), '\\n') AS batch_text\n  FROM numbered\n  GROUP BY batch_id\n)\n\n-- 4) Call AI.GENERATE once per batch to reduce total model calls (faster; not cheaper)\nSELECT\n  batch_id,\n  AI.GENERATE(\n    CONCAT(\n      'You are a digital marketing analyst. ',\n      'I will give you several referrer domain + landing page pairs. ',\n      'For each pair, provide 2 sentences of actionable insight. ',\n      'Format your output as a bulleted list. ',\n      '\\n\\nHere are the pairs:\\n',\n      batch_text\n    ),\n    connection_id => 'projects/myproject/locations/europe-west2/connections/__default_cloudresource_connection__',\n    endpoint => 'gemini-1.5-pro-002'\n  ).result AS insights\nFROM batched\nORDER BY batch_id;\n\n\nStep 5: Advanced AI.GENERATE examples in BigQuery (sentiment, classification, summaries)\n\nGA4’s event and item parameters are a goldmine for unstructured data. With AI.GENERATE you can:\n\n * Classify search queries as navigational / informational / transactional.\n * Run sentiment analysis on feedback or chat logs.\n * Summarise product descriptions into categories or value props.\n\nExample: feedback sentiment analysis:\n\nWITH feedback_events AS (\n  SELECT\n    (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'feedback') AS feedback_text\n  FROM `myproject.analytics_123456789.events_*`\n  WHERE event_name = 'feedback_submitted'\n)\nSELECT\n  feedback_text,\n  AI.GENERATE(\n    CONCAT(\n      'Analyse the sentiment of this customer feedback: \"', feedback_text, '\". ',\n      'Return only \"Positive\", \"Neutral\", or \"Negative\".'\n    ),\n    connection_id => 'projects/myproject/locations/europe-west2/connections/__default_cloudresource_connection__',\n    endpoint => 'gemini-1.5-pro-002'\n  ).result AS sentiment\nFROM feedback_events\nWHERE feedback_text IS NOT NULL\n\n\nFinal thoughts\n\nAI.GENERATE isn’t replacing SQL,  it’s layering on top of it.\n\n * Use SQL for facts.\n * Use AI.GENERATE for interpretation.\n * Combine them (smartly, with batching) and GA4 data turns into actionable insights.\n\nIf you’ve been meaning to try generative AI in a real analytics workflow, BigQuery just made it dead simple. You can write whatever prompt you’d like, the only limitation is your imagination.\n\nFor full details, check the BigQuery AI.GENERATE documentation.\n\nCheck out our other blog on AI.FORECAST\n\n👉 The possibilities are endless, what’s the first BigQuery use case you’d try with AI.GENERATE?"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/success-stories/streamlining-analytics-for-springer-nature-with-dataform/#article",
      "headline": "GA4 Dataform integration: how Springer Nature modernised analytics with Measurelab",
      "description": "The Springer Nature Group is an academic publishing company, with brands dating back to 1842, that advances scientific discovery by publishing robust and insightful research, supporting the development of new areas of knowledge, making ideas and information accessible around the world, and leading the way on open access.\n\n\nThe challenge\n\nSpringer Nature needed to migrate their Universal Analytics dashboards to GA4 data. Their reporting relied on multiple stacked scheduled queries in BigQuery tha",
      "url": "https://www.measurelab.co.uk/insights/success-stories/streamlining-analytics-for-springer-nature-with-dataform/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/success-stories/streamlining-analytics-for-springer-nature-with-dataform/#webpage"
      },
      "datePublished": "2025-08-28T19:48:24.000+00:00",
      "dateModified": "2025-12-10T01:32:08.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/08/6-1.png",
      "author": {
        "@type": "Person",
        "name": "Steven Elliott",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Dataform",
        "Looker Studio",
        "BigQuery",
        "Debugging"
      ],
      "articleBody": "The Springer Nature Group is an academic publishing company, with brands dating back to 1842, that advances scientific discovery by publishing robust and insightful research, supporting the development of new areas of knowledge, making ideas and information accessible around the world, and leading the way on open access.\n\n\nThe challenge\n\nSpringer Nature needed to migrate their Universal Analytics dashboards to GA4 data. Their reporting relied on multiple stacked scheduled queries in BigQuery that had become difficult to maintain and scale. They saw this migration as an opportunity to update their data practices and engaged Measurelab to implement a more efficient solution using Dataform.\n\n\nThe solution\n\nMeasurelab redesigned Springer Nature’s data architecture using Dataform, implementing modularised, documented data models based on software engineering best practices. The solution created clear modelling patterns, improved documentation, and established transparent data lineage, allowing for better version control, testing, and collaboration.\n\n\nThe results\n\nImplementing Dataform significantly improved Springer Nature’s data operations, reducing maintenance overhead and accelerating delivery time. The modular solution made it easier for the team to maintain existing models and add new ones. This modernised approach created a foundation for more efficient data operations moving forward.\n\n\nWhat’s next?\n\nModernising with Dataform transformed Springer Nature’s data operations from difficult-to-maintain scheduled queries, to a scalable, maintainable system. The team now spends less time troubleshooting complex dependency issues and more time delivering valuable insights, positioning them for continued analytics success beyond the GA4 migration."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/how-to-start-forecasting-in-bigquery-with-zero-training/#article",
      "headline": "How to start forecasting in BigQuery with zero training",
      "description": "If you’d told me five years ago that I’d be forecasting product demand using a model trained on 100 billion time points… without writing a single line of ML code… I probably would’ve asked how many coffees you’d had that day ☕️\n\nBut its a brand new world. And it’s possible. Let me explain\n\n\nWhat is TimesFM?\n\nTimesFM is a new foundation model from Google, built specifically for time-series forecasting. Think of it like GPT for time, instead of predicting the next word in a sentence, it predicts t",
      "url": "https://www.measurelab.co.uk/insights/blog/how-to-start-forecasting-in-bigquery-with-zero-training/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/how-to-start-forecasting-in-bigquery-with-zero-training/#webpage"
      },
      "datePublished": "2025-07-14T14:34:02.000+00:00",
      "dateModified": "2025-07-31T20:42:48.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/forecasting-in-bq.png",
      "author": {
        "@type": "Person",
        "name": "Katie Kaczmarek",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "BigQuery",
        "Google Analytics",
        "Looker Studio",
        "SQL",
        "Ecommerce",
        "AI & ML",
        "How-to"
      ],
      "articleBody": "If you’d told me five years ago that I’d be forecasting product demand using a model trained on 100 billion time points… without writing a single line of ML code… I probably would’ve asked how many coffees you’d had that day ☕️\n\nBut its a brand new world. And it’s possible. Let me explain\n\n\nWhat is TimesFM?\n\nTimesFM is a new foundation model from Google, built specifically for time-series forecasting. Think of it like GPT for time, instead of predicting the next word in a sentence, it predicts the next block of future time-points based on patterns in the past.\n\nIt’s been trained on a massive dataset (we’re talking 100 billion real-world time-points from sources like Google Trends and Wikipedia views). So it’s picked up all sorts of general behaviours you’d expect in time-based data like trends, seasonality, and sudden spikes or drops.\n\n\nBut how can one model work across everything?\n\nThat was my first question too.\n\nI assumed forecasting sales for a jumper would be wildly different from predicting hospital admissions or traffic volumes. And in many ways, it is. But the magic here is that most time-series, no matter the industry, follow common patterns:\n\n * Peaks and troughs over weeks or months (seasonality)\n * Gradual changes over time (trends)\n * The fact that yesterday often affects today (autocorrelation)\n\nTimesFM has learned to spot these behaviours from its pretraining. So when you give it new data, it already knows how to look for them.\n\nThat’s why it can do zero-shot forecasting, meaning it can predict for new datasets it’s never seen before, without any fine-tuning or custom training.\n\n\nWait, can I add business-specific info (like promotions or holidays)?\n\nThis was one of my follow-up questions, and I want to be super clear:\n\nWith AI.FORECAST() in BigQuery, you can’t directly feed in extra business context like holiday flags, promotion periods, or price changes. The model only sees your chosen timestamp, value, and ID columns.\n\nSo while the model can pick up things like seasonal spikes (say, from previous Black Fridays), it won’t know what’s coming next unless your historical data already shows a pattern.\n\nYou can absolutely interpret forecasts with business context in mind, or manually adjust afterwards, but it’s not part of the model input right now.\n\n\nHow AI.FORECAST() Decides Whether to Forecast by Day, Week or Month\n\nThis is something that caught me out at first, so worth knowing before you run the code.\n\nWhen you use AI.FORECAST() in BigQuery, you don’t explicitly set the forecast frequency. Instead, it looks at the gaps between your timestamps and makes an educated guess about what granularity to use.\n\nHere’s what that usually looks like:\n\nSpacing Between DatesForecast Granularity1 day apartDaily forecast7 days apartWeekly forecast30 days apartMonthly forecast1 year apartYearly forecast\n\nSounds handy (and it is), but if your data is a bit patchy or has gaps (which GA4 often does), the model might misinterpret the granularity and give you a weird result (like 30 weeks instead of 30 days).\n\n\nHow to Take Control of the Granularity\n\nIf you want to be sure the model knows it’s working with daily data, you can fill in the gaps yourself before forecasting.\n\nIn the example below, we use GENERATE_DATE_ARRAY() to build a full daily calendar, then join that to our real data, filling missing days with zeros. This gives us a nice, regular dataset that makes it clear we want a daily forecast.\n\nOnce your data is consistent, AI.FORECAST() will honour that pattern and give you 30 days of output (rather than 30 weeks or 30 months).\n\nAlternatively if we want weekly, or monthly data we might adjust the code to aggregate the data up to week, month or year. This will help AI.FORECAST() to understand what you are trying to do.\n\n\nCreating Your First Forecast in BigQuery\n\nHere’s how to run a TimesFM-powered forecast using your GA4 data. In this example, we’re forecasting daily purchase quantities per product using the public GA4 ecommerce dataset.\n\nWe even filled in missing dates (because if your data doesn’t show up every day, BigQuery might decide it’s weekly or monthly instead which can throw off your forecast!).\n\nHere’s the code:\n\n-- STEP 1: Generate all calendar dates in the range\n-- this will ensure you have data for every day even if its 0\nWITH calendar AS (\n  SELECT day AS event_date\n  --to_do change the date range to the date range of data you are extracting in the next step\n  FROM UNNEST(GENERATE_DATE_ARRAY('2020-11-01', '2020-12-31')) AS day\n),\n\n-- STEP 2: Summarise daily quantity by item\n-- to_do this is where you define the data you are interested in forecasting\nqty_by_name AS (\n  SELECT\n    PARSE_DATE('%Y%m%d', _TABLE_SUFFIX) AS event_date,\n    items.item_name,\n    SUM(items.quantity) AS daily_qty\n  FROM `bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_*`,\n       UNNEST(items) AS items\n  WHERE _TABLE_SUFFIX BETWEEN '20201101' AND '20201231'\n    AND event_name = 'purchase'\n  GROUP BY event_date, item_name\n),\n\n-- STEP 3: Join to calendar to fill in missing dates (assumes zero sales)\nqty_filled AS (\n  SELECT\n    c.event_date,\n    i.item_name,\n    IFNULL(q.daily_qty, 0) AS daily_qty\n  FROM (SELECT DISTINCT item_name FROM qty_by_name) i\n  CROSS JOIN calendar c\n  LEFT JOIN qty_by_name q\n    ON q.item_name = i.item_name AND q.event_date = c.event_date\n),\n\n-- STEP 4: Forecast next 30 daily values using AI.FORECAST()\nforecast_results AS (\n  SELECT \n    'forecast' AS data_type,\n    item_name,\n    CAST(forecast_timestamp AS DATE) AS event_date,\n    forecast_value AS value,\n    confidence_level,\n    prediction_interval_lower_bound,\n    prediction_interval_upper_bound,\n    ai_forecast_status\n  FROM AI.FORECAST(\n    (SELECT * FROM qty_filled),\n    data_col      => 'daily_qty',\n    timestamp_col => 'event_date',\n    id_cols       => ['item_name'],\n    #this might relate to 30 days, weeks, months, year depending on the data that is ingested\n    horizon       => 30\n  )\n),\n\n-- STEP 5: Append historical actuals\nactuals AS (\n  SELECT \n    'actual' AS data_type,\n    item_name,\n    event_date,\n    daily_qty AS value,\n    1 AS confidence_level,\n    CAST(NULL AS FLOAT64) AS prediction_interval_lower_bound,\n    CAST(NULL AS FLOAT64) AS prediction_interval_upper_bound,\n    CAST(NULL AS STRING) AS ai_forecast_status\n  FROM qty_filled\n)\n\n-- FINAL OUTPUT: forecast + actuals combined\nSELECT * FROM forecast_results\nUNION ALL\nSELECT * FROM actuals\nORDER BY item_name, event_date;\n\n\nThis gives you a tidy table of past data and forecasted values, ready to plot or join into a dashboard. You're welcome!\n\n\nKey Takeaways\n\n * TimesFM can forecast new datasets without training, by learning general time-series behaviours.\n * It works across industries because many time-based patterns (like seasonality and trends) are universal.\n * BigQuery’s AI.FORECAST() uses TimesFM under the hood — no setup or model training required.\n * The model infers whether to forecast daily, weekly, or monthly based on your input timestamp spacing.\n * You can’t add extra context directly into the model, but you can still interpret your results with that in mind.\n\nWant the official documents? Here you go...https://cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-syntax-ai-forecast\n\nIf you're working with GA4 in BigQuery and want to get forecasting fast, give this a go. It’s oddly satisfying to see a model pick up on patterns you didn’t even spot yourself!\n\nIf you have any questions, feel free to reach out to Measurelab here."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/measurelab-makes-the-ipa-beacon-list-2025/#article",
      "headline": "Measurelab makes the IPA Beacon List 2025",
      "description": "Given in recognition of how we are “Shaping growth, innovation and competition in the modern agency world” - along with 24 other companies in the UK; shaking it up, doing it that little bit better every time.\n\nWe are honoured to be part of this initiative at the IPA (Institute of Practitioners in Advertising) to recognise the efforts of smaller UK independents - who are redefining what it means to be an agency in today’s fast-evolving media and technology environment. ",
      "url": "https://www.measurelab.co.uk/insights/blog/measurelab-makes-the-ipa-beacon-list-2025/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/measurelab-makes-the-ipa-beacon-list-2025/#webpage"
      },
      "datePublished": "2025-06-14T08:35:45.000+00:00",
      "dateModified": "2026-01-23T14:45:02.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/06/IPA-Beacon-List-Measurelab.png",
      "author": {
        "@type": "Person",
        "name": "Steven Elliott",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Measurelab"
      ],
      "articleBody": "Given in recognition of how we are “Shaping growth, innovation and competition in the modern agency world” - along with 24 other companies in the UK; shaking it up, doing it that little bit better every time.\n\nWe are honoured to be part of this initiative at the IPA (Institute of Practitioners in Advertising) to recognise the efforts of smaller UK independents - who are redefining what it means to be an agency in today’s fast-evolving media and technology environment. "
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/prepare-your-bigquery-warehouse-for-ai/#article",
      "headline": "Easy ways to prepare your BigQuery warehouse for AI",
      "description": "You’ve probably heard that AI is coming to make our lives easier, especially in tools like BigQuery. But here’s the thing: AI isn't magic. If you want it to be accurate and useful, you need to set it up for success.\n\nOne of the best ways to do that? Improve the metadata in your BigQuery warehouse.\n\nMetadata is like the index or contents page in a book, it quickly tells you exactly what’s inside and where to find it. Creating clear metadata means AI can more easily understand your data warehouse ",
      "url": "https://www.measurelab.co.uk/insights/blog/prepare-your-bigquery-warehouse-for-ai/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/prepare-your-bigquery-warehouse-for-ai/#webpage"
      },
      "datePublished": "2025-04-23T12:56:58.000+00:00",
      "dateModified": "2025-07-31T20:35:14.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/blog-image-3-1.png",
      "author": {
        "@type": "Person",
        "name": "Katie Kaczmarek",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "BigQuery",
        "Google Analytics",
        "Looker Studio",
        "Data Analysis",
        "SQL"
      ],
      "articleBody": "You’ve probably heard that AI is coming to make our lives easier, especially in tools like BigQuery. But here’s the thing: AI isn't magic. If you want it to be accurate and useful, you need to set it up for success.\n\nOne of the best ways to do that? Improve the metadata in your BigQuery warehouse.\n\nMetadata is like the index or contents page in a book, it quickly tells you exactly what’s inside and where to find it. Creating clear metadata means AI can more easily understand your data warehouse and give you more accurate, relevant results.\n\nHere’s how you can easily start improving your warehouse metadata today:\n\n 1. Clearly describe your tables and fields (what they contain and why they're useful).\n 2. Link related tables together (like connecting dots) so it's obvious how they're related.\n 3. Tag your tables with keywords to help you and AI find them quickly.\n 4. Keep everything neat and consistent, using the same approach everywhere.\n\n\n1. Add descriptions to your tables and fields\n\nCurrently you either have to do this manually (yes, typing away) or use an open source tool, like the one we developed here at Measurelab. There's good news however: BigQuery's new Data Insights feature should be able to automatically generate table and column descriptions, simplifying the documentation process.\n\nWhy bother?\n\nImagine AI trying to figure out what \"cust_id\" or \"rev_tot\" stands for. Field and table descriptions are like name tags at a party; the clearer they are, the smoother the introductions go. Good descriptions mean AI spends less time guessing and more time providing accurate insights.\n\nQuick wins (A term I hate in SQL requests):\n\n * Add simple, clear field and table descriptions\n * Include example values where it helps\n * Use Data Insights to scale it across your warehouse\n * Link related tables clearly\n\nThink of your datasets like a family tree, everything is connected. Clearly defining relationships between your tables makes it easier for AI (and your team!) to understand how everything fits together.\n\nSimple steps:\n\n * Clearly document relationships in your table descriptions.\n * Identify joining keys in your field descriptions\n\n\n3. Tag your tables for quick discovery\n\nTags are your shortcut for finding data fast, think of them like labels on folders or bookmarks in your browser. They’re great for quick filtering and navigation, helping you (and AI) pinpoint exactly what you need without wasting time.\n\nMy advice?\n\n * Think practically. Tags should reflect actual usage, like \"finance\", \"marketing\", or \"PII\".\n * Be strategic and consistent in tagging, making it easy to sort and access your tables quickly.\n\n\n4. Use clear, consistent naming conventions\n\nGood naming conventions aren’t just nice, they're essential. Clear names prevent future confusion, save time, and make your warehouse easier to navigate for everyone, especially AI.\n\nImagine naming your files \"final_final_3.csv\" in your Google Drive. Finding anything later would be a nightmare! Clear, consistent names like \"sales_data_jan2025\" help AI understand exactly what’s in each table.\n\n\nBonus Tip: Create report-specific tables\n\nIf you want to go one step further, consider building core reporting tables designed to make analysis easier.\n\nThink of these as simplified, centralised “AI-friendly” versions of your data. They can also act as your single source of truth for dashboards and recurring reports.\n\nExamples of useful AI-ready tables:\n\n * core_metrics_summary: daily or weekly KPI snapshots\n * user_engagement_core: simplified GA4-style user data\n * product_performance: clean sales data by product\n * customer_lifetime_value: key user value metrics\n * data_dictionary_ai: a table AI can refer to for definitions and aliases\n\nThese tables make it easier for AI tools to produce reliable outputs and for people to report from the same base data.\n\n\nQuick recap (because we love simplicity):\n\n * Add clear field and table descriptions using BigQuery's Data Insights.\n * Clearly link related tables together.\n * Use strategic tags for easy navigation.\n * Implement consistent and understandable naming conventions.\n * Consider creating core reporting tables to support AI and your team.\n\nSmall efforts now will make AI a more helpful, accurate assistant for everyone in your team, coders and non-coders alike.\n\nWhat are you doing today to get ready for AI in BigQuery?"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/optimising-data-pipelines-google-cloud-and-dataform/#article",
      "headline": "Data pipeline optimisation with Google Cloud and Dataform",
      "description": "In our recent engagement with a client, we went on a journey to transform their data pipelines, tackling inefficiencies in performance and cost within their Google Cloud BigQuery environment. Our efforts culminated in a comprehensive optimisation strategy that used Dataform, improved SQL practices, and implemented tailored solutions for significant performance gains and cost savings. Here’s a deep dive into the highlights of our project.\n\n\nIdentifying inefficiencies in BigQuery workflows\n\nWe beg",
      "url": "https://www.measurelab.co.uk/insights/blog/optimising-data-pipelines-google-cloud-and-dataform/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/optimising-data-pipelines-google-cloud-and-dataform/#webpage"
      },
      "datePublished": "2025-04-22T16:24:33.000+00:00",
      "dateModified": "2026-01-27T11:24:03.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/blog-post-april-25.png",
      "author": {
        "@type": "Person",
        "name": "Prasanna Venkatesan",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Cloud",
        "Dataform",
        "Looker Studio",
        "BigQuery",
        "Data Analysis",
        "Debugging",
        "How-to"
      ],
      "articleBody": "In our recent engagement with a client, we went on a journey to transform their data pipelines, tackling inefficiencies in performance and cost within their Google Cloud BigQuery environment. Our efforts culminated in a comprehensive optimisation strategy that used Dataform, improved SQL practices, and implemented tailored solutions for significant performance gains and cost savings. Here’s a deep dive into the highlights of our project.\n\n\nIdentifying inefficiencies in BigQuery workflows\n\nWe began by analysing the existing data architecture, identifying key areas of inefficiency:\n\n 1. Long view chains: Multiple layers of views increased complexity and degraded performance.\n 2. Lack of incremental logic: Transformations processed entire datasets unnecessarily, increasing costs.\n 3. Unoptimised tables: Absence of partitioning and clustering led to full table scans.\n\n\nTransitioning to Dataform\n\nTo address these challenges, we transitioned from BigQuery Scheduled Queries to Dataform, unlocking the following benefits:\n\n * Improved maintainability: Modular SQL scripts made workflows easier to debug and maintain.\n * Version control: Seamless integration with Git allowed better collaboration and change tracking.\n * Automated dependency management: Dependencies were automatically managed, minimising manual intervention and errors.\n * Incremental processing capabilities: Focused data processing only on updated data, enhancing efficiency.\n * Assertions for data quality: Automated checks ensured consistency and reliability throughout the pipeline.\n\n\n\n\n\n\n\n\n\n\n30-minute consultation\n\n\n\n\n\n\n\n\n\nBook your free Dataform consultation\n\n\n\n\n\n\n\n✓\nInfrastructure audit\n\n\n✓\nTransformation plan\n\n\n✓\nEfficiency analysis\n\n\n\n\n\nGet started →\n\n\n\n\n\n\n\n\n\n\nKey optimisation strategies\n\n * Query structure improvements: Refactored subqueries into Common Table Expressions (CTEs), improving readability and debugging efficiency.\n * Consolidation of intermediate tables: Combined redundant views into fewer tables, reducing complexity and redundant operations.\n * Implementation of incremental tables: Processed only new or updated data, significantly reducing data scanned and associated costs.\n * Partitioning of tables: Partitioned tables based on relevant date fields, improving query performance.\n * Eliminating full table scans: Restructured incremental tables to prevent full table scans, ensuring more targeted data processing.\n\n\nCost savings analysis\n\nOur optimisation efforts translated into substantial cost savings:\n\n\n\n    \n 1. Data processed for key tables:\n    \n      \n    * BigQuery costs were reduced by over 40% annually due to a 92% reduction in data processed for some large output tables.\n      \n    \n    \n    \n 2. Dashboard optimisation:\n    \n      \n    * Dashboard redesigns also contributed to query optimisation. By separating lightweight and heavy charts onto different pages and consolidating scorecards, redundant queries and unnecessary filters were eliminated. This resulted in a substantial reduction -  hundreds of GBs per dashboard load -  from the final output tables.\n      \n    \n    \n    \n 3. Operational efficiencies:\n    \n      \n    * Reduced manual dependency management, debugging, and new model setup, saving approximately 32 engineer hours monthly, saving close to 20% in cost per month.\n      \n    \n    \n\n\n\n\nConclusion\n\nThis project demonstrates how targeted optimisations can transform data pipelines, improving performance while dramatically reducing costs. Leveraging tools like Dataform and best practices in SQL and BigQuery, we delivered a smarter, more efficient solution tailored to the client’s needs.\n\n\nResources\n\n * Read our blog post on Dataform for BigQuery: A basic end-to-end guide.\n * Watch our Behind the Cloud series on YouTube."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/dataform-for-bigquery-basic-end-to-end-guide/#article",
      "headline": "Dataform for BigQuery: A basic end-to-end guide",
      "description": "Dataform is a powerful tool for managing your data workflows in a structured, version-controlled, and automated way. Whether you're a beginner or an experienced data engineer, Dataform simplifies SQL-based transformations while integrating seamlessly with Google BigQuery.\n\nAlthough this blog offers a basic introduction to Dataform's functionality, users can achieve significantly more with Dataform. From advanced scheduling, parameterised queries, and dependency management to complex data modelli",
      "url": "https://www.measurelab.co.uk/insights/blog/dataform-for-bigquery-basic-end-to-end-guide/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/dataform-for-bigquery-basic-end-to-end-guide/#webpage"
      },
      "datePublished": "2025-03-18T14:48:20.000+00:00",
      "dateModified": "2025-09-03T14:30:53.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/dataform-guide-1.png",
      "author": {
        "@type": "Person",
        "name": "Prasanna Venkatesan",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "BigQuery",
        "Dataform",
        "Google Cloud",
        "SQL",
        "How-to"
      ],
      "articleBody": "Dataform is a powerful tool for managing your data workflows in a structured, version-controlled, and automated way. Whether you're a beginner or an experienced data engineer, Dataform simplifies SQL-based transformations while integrating seamlessly with Google BigQuery.\n\nAlthough this blog offers a basic introduction to Dataform's functionality, users can achieve significantly more with Dataform. From advanced scheduling, parameterised queries, and dependency management to complex data modelling, the possibilities are vast.\n\nWe will be releasing more blogs diving deeper into various aspects of Dataform, covering best practices, optimisation techniques, and real-world use cases. This blog will also serve as a live blog, where we will continue adding new features, updates, and linking to detailed Dataform-related articles as they become available.\n\nMake sure to bookmark this blog and stay tuned for upcoming posts that will help you leverage Dataform to its full potential!\n\nNow, we'll take you through an end-to-end setup of Dataform, starting from creating a workspace to building target tables, while exploring all its key features along the way.\n\n\nSetting up your Dataform workspace\n\nBefore we dive into defining sources and building tables, let’s set up our Dataform workspace.\n\n\n1: Create a Google Cloud project\n\n 1. Go to Google Cloud Console.\n 2. Create a new project or select an existing one.\n 3. Enable the BigQuery API.\n\n\n2: Enable Dataform in Google Cloud\n\n 1. Navigate to Google Cloud Dataform.\n 2. Click Create Repository and give it a name.\n 3. Choose a location (typically the same as your BigQuery dataset).\n 4. Initialise the repository with a new workspace.\n\n\n3: Configure Dataform\n\nAfter setting up your Dataform workspace, it's important to configure the workflow_settings.yaml file. This file defines the default project, location, datasets, and Dataform core version for your workspace.\n\nExample workflow_settings.yaml configuration:\n\ndefaultProject: dataform-64568\n\ndefaultLocation: EU\n\ndefaultDataset: dataform\n\ndefaultAssertionDataset: dataform_assertions\n\ndataformCoreVersion: 3.0.0\n\nThis configuration lets you execute all transformations and assertions within the specified project and datasets, streamlining your workflow management.\n\n\n\n\n\n\n\n\n\n\n30-minute consultation\n\n\n\n\n\n\n\n\n\nBook your free Dataform consultation\n\n\n\n\n\n\n\n✓\nInfrastructure audit\n\n\n✓\nTransformation plan\n\n\n✓\nEfficiency analysis\n\n\n\n\n\nGet started →\n\n\n\n\n\n\n\n\n\n\nDefining your data sources\n\nNow that your workspace is set up, let’s define the source dataset and tables. We’ll use a free BigQuery dataset for demonstration.\n\n\n1: Choose a public dataset\n\nGoogle provides a variety of public datasets. Let’s use bigquery-public-data.london_bicycles.cycle_hire.\n\n\n2: Define the source in Dataform\n\n * Delete all other folders and files except the definitions/ folder and workflow_settings.yaml file.\n * Create a new directory called source/ under definitions/.\n * Define the source tables under the definitions/source/ directory.\n\n1. Bike Hire Source Data - cycle_hire.sqlx\n\nconfig {\n\n  type: \"declaration\",\n\n  database: \"bigquery-public-data\",\n\n  schema: \"london_bicycles\",\n\n  name: \"cycle_hire\",\n\n  description: \"Cycle Hire Data\"\n\n}\n\n\n2. Bike stations source data - cycle_stations.sqlx\n\nconfig {\n\n  type: \"declaration\",\n\n  database: \"bigquery-public-data\",\n\n  schema: \"london_bicycles\",\n\n  name: \"cycle_stations\",\n\n  description: \"Cycle Stations Data\"\n\n}\n\n\nCreating transformations\n\nLet’s create transformations that will process and refine our London bicycle hire dataset. We will build intermediate tables, apply multiple transformations, and finalise the results into target tables.\n\n\nStep 1: Create intermediate tables\n\nIntermediate tables help us clean and enrich the raw data before final aggregation. These should be placed under the definitions/intermediate/ directory.\n\n1. Normalise Bike Ride Durations\n\nconfig {\n\n  type: \"table\",\n\n  schema: \"intermediate\",\n\n  name: \"normalized_cycle_rides\"\n\n}\n\n-- In the above config, if schema is not mentioned the table will be created under default dataset mentioned in the workflow_settings.yml.\n\n-- If the name is not mentioned then the table will be created as same as the file name. It is good practice to keep the tables names same as your file names.\n\nSELECT\n\n  rental_id,\n\n  bike_id,\n\n  start_station_id,\n\n  end_station_id,\n\n  TIMESTAMP_DIFF(end_date, start_date, SECOND) AS ride_duration_seconds,\n\n  start_date,\n\n  end_date\n\nFROM ${ref(\"cycle_hire\")}\n\n\nStep 2. Aggregate Daily Bike Usage\n\nconfig {\n\n  type: \"table\",\n\n  schema: \"intermediate\",\n\n  name: \"daily_cycle_usage\"\n\n}\n\nSELECT\n\n  DATE(start_time) AS ride_date,\n\n  bike_id,\n\n  COUNT(*) AS total_rides\n\nFROM ${ref(\"normalized_cycle_rides\")}\n\nGROUP BY 1, 2\n\n\nStep 3: Define final output tables\n\nFinal tables consolidate the transformed data for reporting and analysis. These should be placed under the definitions/output/ directory.\n\n1. Summary Report\n\nconfig {\n\n  type: \"table\",\n\n  schema: \"output\",\n\n  name: \"summary_report\"\n\n}\n\nSELECT\n\n  d.ride_date,\n\n  d.bike_id,\n\n  d.total_rides,\n\n  s.station_name AS start_station,\n\n  e.station_name AS end_station\n\nFROM ${ref(\"daily_cycle_usage\")} d\n\nLEFT JOIN ${ref(\"cycle_stations\")} s ON d.start_station_id = s.station_id\n\nLEFT JOIN ${ref(\"cycle_stations\")} e ON d.end_station_id = e.station_id\n\n2. Peak Ride Hours\n\nconfig {\n\n  type: \"view\",\n\n  schema: \"output\",\n\n  name: \"peak_ride_hours\"\n\n}\n\nSELECT\n\n  EXTRACT(HOUR FROM start_date) AS hour_of_day,\n\n  COUNT(*) AS ride_count\n\nFROM ${ref(\"normalized_cycle_rides\")}\n\nGROUP BY 1\n\nORDER BY ride_count DESC\n\nInstead of storing the data physically, we can create views for flexible and cost-efficient querying.\n\nIncremental tables are another type of table that can be defined in Dataform. To learn more about these tables and their uses, please refer to this blog.\n\nThe \"Not found: Dataset <project_id>: intermediate was not found in location\" error message appears in the Dataform UI only when the underlying tables have not yet been created. The error will disappear once the pipeline has been executed and the tables have been created.\n\n\n4. Partitioning and clustering in Dataform\n\nBoth of these help optimise query performance and reduce costs in BigQuery by improving how data is stored and accessed.\n\nPartitioning\n\nPartitioning divides a table into segments based on a specific column (e.g., ride_date). Queries that filter by this column will scan only the relevant partitions, improving efficiency.\n\nClustering\n\nClustering organises data within partitions based on certain columns (e.g., bike_id and start_station). This speeds up queries that filter or group by these columns.\n\nBy implementing partitioning and clustering in our summary_report table, we can ensure efficient storage and faster query execution. This is particularly beneficial for queries that filter on a specific date, as it reduces the amount of data scanned in BigQuery, leading to cost savings. Let's implement partitioning and clustering in the summary_report table as shown below.\n\nconfig {\n\n  type: \"table\",\n\n  schema: \"output\",\n\n  name: \"summary_report\",\n\n  bigquery: {\n\n    partitionBy: \"ride_date\",\n\n    clusterBy: [\"bike_id\", \"start_station\"]\n\n  }\n\n}\n\nSELECT\n\n  d.ride_date,\n\n  d.bike_id,\n\n  d.total_rides,\n\n  s.station_id AS start_station,\n\n  e.station_id AS end_station\n\nFROM ${ref(\"daily_cycle_usage\")} d\n\nLEFT JOIN ${ref(\"station_usage\")} s ON d.bike_id = s.station_id\n\nLEFT JOIN ${ref(\"station_usage\")} e ON d.bike_id = e.station_id\n\n\n5. Compile and run transformations\n\nNow that we have defined our transformations and output tables, we need to execute them in Dataform to create the required tables and views in BigQuery.\n\nExecuting Multiple Actions\n\n\n\n   \n * Click Start Execution to validate your SQL code and check for errors.\n   \n   \n * Navigate to the Actions section in Dataform.\n   \n   \n * Click on Multiple Actions… to selectively run the required transformations.\n   \n   \n * Choose the following actions to be executed:\n   \n     \n   * bike_usage_summary\n     \n     \n   * popular_routes\n     \n   \n   \n   \n * Select option Include Dependencies\n   \n   \n * Click Run Selected Actions to execute and create these tables in your BigQuery dataset.\n   \n\n\n\nBy selecting multiple actions, we ensure that both tables are created efficiently while adhering to dependencies between intermediate and output tables.\n\n\n6. Customising Dataform structure\n\nThis blog uses a sample structure to simplify how Dataform works. You can adapt Dataform's structure to your project's specific needs after grasping the fundamentals. Depending on the complexity of data workflows, teams may choose to organise their Dataform repository differently, optimise queries for efficiency, or integrate additional features like parameterised datasets and advanced scheduling mechanisms. You can tailor Dataform's flexibility to meet various data engineering requirements."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/extract-ga4-event-sequencing-bigquery-batch-fields/#article",
      "headline": "How to extract GA4's event sequencing in BigQuery using the new batch fields",
      "description": "Google Analytics 4 (GA4) exports event data to BigQuery, enabling detailed user behavior analysis. However, GA4 batches events before sending them, making GA4 event sequencing in BigQuery more complex. Fortunately, three fields—batch_event_index, batch_ordering_id, and batch_page_id—help provide precise sequencing information.\n\nFor a full schema of the GA4 export, head over to google documentation.\n\nThis article breaks down these fields in a clear, practical way and shows how to use them togethe",
      "url": "https://www.measurelab.co.uk/insights/blog/extract-ga4-event-sequencing-bigquery-batch-fields/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/extract-ga4-event-sequencing-bigquery-batch-fields/#webpage"
      },
      "datePublished": "2025-02-24T08:30:00.000+00:00",
      "dateModified": "2025-07-31T20:35:15.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/uploading.png",
      "author": {
        "@type": "Person",
        "name": "Katie Kaczmarek",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "BigQuery",
        "SQL",
        "Google Analytics",
        "Debugging",
        "Ecommerce",
        "How-to"
      ],
      "articleBody": "Google Analytics 4 (GA4) exports event data to BigQuery, enabling detailed user behavior analysis. However, GA4 batches events before sending them, making GA4 event sequencing in BigQuery more complex. Fortunately, three fields—batch_event_index, batch_ordering_id, and batch_page_id—help provide precise sequencing information.\n\nFor a full schema of the GA4 export, head over to google documentation.\n\nThis article breaks down these fields in a clear, practical way and shows how to use them together to reconstruct a user's journey in GA4 BigQuery exports.\n\n\nbatch_event_index: The Order of Events Within a Batch\n\nEver wondered if GA4 sends events in real time? Spoiler alert: it doesn’t! GA4 often groups multiple events together in a batch before sending them to improve efficiency. This means that events can arrive at the same time even if they actually happened in a specific order.\n\n\nWhat is batch_event_index?\n\n * Shows the order of events within a batch, based on when they actually happened on the user’s device.\n * Makes sure that even if events are sent together, we can still analyse them in their true sequence.\n\n\nExample: Events in a batch\n\nPicture this: A user interacts with a webpage and does the following:\n\n\n\n    \n 1. Clicks a button\n    \n    \n 2. Scrolls down\n    \n    \n 3. Views a product\n    \n\n\n\nIf GA4 sends these events as a batch, they might appear in BigQuery like this:\n\n\n\nevent_namebatch_event_indexbutton_click0scroll1view_product2\n\n\n\nEven though they were transmitted together, batch_event_index keeps the correct event order intact.\n\n\nWhy this matters\n\n * Prevents misleading event sequences\n * Helps analyse multi-step interactions correctly\n * Useful for debugging when actions happen close together\n\n\nbatch_ordering_id: How GA4 sends batches\n\nWhile batch_event_index helps us analyse event order within a batch, batch_ordering_id tells us the order of different batches sent from a page.\n\n\nWhat is batch_ordering_id?\n\n * A steadily increasing number that increments every time GA4 sends a new batch of events.\n * Helps separate events that were sent in different network requests.\n\n\nExample: Two separate batches\n\nA user browses a website and interacts with multiple elements. Due to network optimisation, their browser sends two batches of events instead of one.\n\n\n\nevent_namebatch_ordering_idbatch_event_indexbutton_click10scroll11view_product20add_to_cart21\n\n\n\nWhat this tells us:\n\n * The first two events (button_click, scroll) were sent in batch 1.\n * The next two events (view_product, add_to_cart) were sent in batch 2.\n * Within each batch, batch_event_index keeps track of the order.\n\n\nWhy this matters\n\n * Helps track how events are grouped before being sent\n * Avoids misinterpreting event order due to delayed network requests\n * Useful for debugging and optimising event tracking\n\n\nbatch_page_id: Tracking Events Across Pages\n\nWe’ve talked about tracking event order on a single page, but what about users navigating across multiple pages in one session? That’s where batch_page_id comes in.\n\n\nWhat is batch_page_id?\n\n * A sequential number assigned to each page a user visits.\n * Increases each time the user navigates to a new page.\n * Ensures that all events from the same page share the same batch_page_id.\n\n\nExample: Multi-Page Journey\n\nLet’s say a user moves through a website:\n\n\n\n    \n 1. Homepage (batch_page_id = 1)\n    \n    \n 2. Product Page (batch_page_id = 2)\n    \n    \n 3. Checkout Page (batch_page_id = 3)\n    \n\n\n\n\n\nevent_namebatch_page_idpage_view (home)1button_click (home)1page_view (product)2add_to_cart (product)2page_view (checkout)3\n\n\n\n\nWhy this matters\n\n * Makes multi-page journey analysis much easier\n * Helps group events by where they happened\n * Avoids confusion when users navigate quickly between pages\n\n\nHow to use these fields together for customer journey analysis\n\nTo accurately reconstruct a user’s journey, we need to use all three fields together.\n\n\nExample Query: Rebuilding a customer journey in BigQuery\n\nSELECT \n  user_pseudo_id, \n  event_name, \n  event_timestamp, \n  batch_page_id, \n  batch_ordering_id, \n  batch_event_index\nFROM `project.dataset.events_*`\nWHERE _TABLE_SUFFIX = FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))\nORDER BY user_pseudo_id, batch_page_id, batch_ordering_id, batch_event_index;\n\n\nHow this works\n\n * Groups user interactions by page (batch_page_id)\n * Orders batches of events sent together (batch_ordering_id)\n * Preserves the order of events within each batch (batch_event_index)\n\nThis lets us accurately rebuild a user’s journey step-by-step, even when GA4 sends events in batches.\n\n\nFinal thoughts\n\nGA4’s batching system improves efficiency, but it also adds complexity. By using batch_event_index, batch_ordering_id, and batch_page_id, we can reconstruct user interactions with confidence. These fields are essential for:\n\n * Tracking user behaviour across multiple pages\n * Ensuring event order integrity within batches\n * Analysing engagement patterns without guesswork\n\nUsing these fields in BigQuery unlocks deeper insights into customer journeys, helping you make better, data-driven decisions.\n\nHave you started using these fields in your GA4 analysis? What challenges have you faced in reconstructing user journeys? Let’s discuss!"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/automate-bigquery-workflows-conditional-logic-data-checks/#article",
      "headline": "Automating BigQuery workflows with conditional logic and data readiness checks",
      "description": "BigQuery offers powerful scripting capabilities that can simplify complex workflows. In this post, we’ll explore two essential techniques: using IF...THEN...END IF for procedural control and leveraging the metadata in project.dataset.__TABLES__ to ensure your Google Analytics 4 (GA4) data is ready before running queries. These strategies help you avoid unnecessary processing, reduce costs, and improve efficiency in your data pipelines.\n\n\n1. Leveraging IF...THEN...END IF for procedural logic\n\nWhi",
      "url": "https://www.measurelab.co.uk/insights/blog/automate-bigquery-workflows-conditional-logic-data-checks/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/automate-bigquery-workflows-conditional-logic-data-checks/#webpage"
      },
      "datePublished": "2025-02-20T11:58:40.000+00:00",
      "dateModified": "2025-07-31T20:35:15.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/automating-1.png",
      "author": {
        "@type": "Person",
        "name": "Katie Kaczmarek",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "BigQuery",
        "Google Analytics",
        "How-to"
      ],
      "articleBody": "BigQuery offers powerful scripting capabilities that can simplify complex workflows. In this post, we’ll explore two essential techniques: using IF...THEN...END IF for procedural control and leveraging the metadata in project.dataset.__TABLES__ to ensure your Google Analytics 4 (GA4) data is ready before running queries. These strategies help you avoid unnecessary processing, reduce costs, and improve efficiency in your data pipelines.\n\n\n1. Leveraging IF...THEN...END IF for procedural logic\n\nWhile many SQL developers rely on the CASE WHEN expression for conditional logic within a SELECT statement, BigQuery’s scripting environment allows for more dynamic control with IF...THEN...END IF. This control-flow statement is especially useful in stored procedures and scripts where you need to:\n\n * Define and use variables\n * Dynamically set values\n * Control the execution flow based on complex conditions\n\n\nExample: Running code on weekdays\n\nThe following example demonstrates how to execute a block of code only on weekdays:\n\nDECLARE current_day STRING;\n\nBEGIN\n  -- Get today's day of the week\n  SET current_day = FORMAT_TIMESTAMP('%A', CURRENT_TIMESTAMP());\n\n  -- Only run the query if it's a weekday\n  IF current_day NOT IN ('Saturday', 'Sunday') THEN\n    SELECT 'Running weekday report...' AS status;\n  ELSE\n    SELECT 'Skipping execution. It is the weekend.' AS status;\n  END IF;\nEND;\n\n\nBenefits of Using IF...THEN...END IF:\n\n * Procedural Logic: Unlike CASE WHEN, this syntax allows for multi-step procedural operations.\n * Dynamic Execution: It lets you perform different actions based on variable conditions.\n * Improved Control: Ideal for scenarios such as dynamic table updates, looping constructs, or exception handling.\n\n\n2. Ensuring GA4 Data readiness with modified time checks\n\nWhen working with GA4 exports in BigQuery, timing is critical. GA4 tables (like events_YYYYMMDD) may not arrive at a predictable time each day, and rerunning the same transformation repeatedly is not only inefficient but can also lead to duplicate processing.\n\n\nThe challenge\n\n * Uncertain Arrival Times: GA4 data can be delayed, so a table might not be complete when your query runs.\n * Avoiding Redundancy: You want to process data only once per day, preventing unnecessary cost and load.\n\n\nThe Solution: Querying table metadata\n\nBigQuery provides a system view (project.dataset.__TABLES__) that contains metadata for each table, including the last_modified_time. By querying this view, you can determine whether a table has been updated recently and decide if your processing should run.\n\n\nStep-by-Step implementation\n\n\nStep 1: Check if the Destination Table Was Updated Today\n\nBefore running your main query, check if the destination table has already been refreshed:\n\nDECLARE alreadyRanToday BOOL;SET alreadyRanToday = (  SELECT COUNT(*) > 0   FROM `project.dataset.__TABLES__`   WHERE table_id = 'table_you_are_creating'    AND DATE(TIMESTAMP_MILLIS(last_modified_time)) = DATE(CURRENT_DATE()));\n\n * Purpose: This condition prevents the query from running multiple times in one day.\n\n\nStep 2: Verify the GA4 table's readiness\n\nNext, ensure that yesterday’s GA4 table exists and was modified recently. This step protects against processing incomplete or missing data.\n\nDECLARE ga4TableExist BOOL;SET ga4TableExist = (  SELECT COUNT(*) > 0   FROM `project.dataset.__TABLES__`  WHERE table_id = CONCAT('events_', FORMAT_DATE('%Y%m%d', DATE_SUB(DATE(CURRENT_DATE()), INTERVAL 1 DAY)))    AND TIMESTAMP_DIFF(          TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 60 MINUTE),           TIMESTAMP_ADD(TIMESTAMP_MILLIS(last_modified_time), INTERVAL 60 MINUTE),           MINUTE        ) > 10);\n\n * Explanation: By ensuring that the table was modified within the last 10 minutes, you safeguard against querying an incomplete dataset.\n\n\nStep 3: Execute the main query conditionally\n\nFinally, combine these checks to run your query only when both conditions are met:\n\nIF NOT alreadyRanToday THEN  IF ga4TableExist THEN    SELECT *     FROM `project.dataset.events_*`    WHERE _TABLE_SUFFIX = DATE_SUB(DATE(CURRENT_DATE()), INTERVAL 1 DAY);  END IF;END IF;\n\nKey Advantages:\n\n * Prevents Unnecessary Processing: The script only executes when needed.\n * Ensures Data Accuracy: Queries run only when the GA4 data is confirmed to be complete.\n * Cost Efficiency: Scheduled checks (e.g., every 60 minutes) incur no cost if the conditions aren’t met.\n\n\nUnderstanding project.dataset.__TABLES__ for metadata queries\n\nThe project.dataset.__TABLES__ view is an invaluable resource for managing your BigQuery workflows. Here’s why:\n\n * Table Metadata Access: This view stores important information such as table_id and last_modified_time.\n * Dynamic Decision-Making: By querying this view, you can build logic into your scripts that adapts to the state of your data.\n * Automation Friendly: It allows you to programmatically check the status of your tables and conditionally execute further processing, a critical aspect of automated data pipelines.\n\n\nUse cases:\n\n * Verifying Data Freshness: Ensure that your queries run only after the data has been fully updated.\n * Avoiding Redundancy: Prevent reprocessing of data that has already been handled within the same day.\n * Optimizing Resource Usage: Reduce unnecessary query executions, saving both time and money.\n\nFor other types of information_schema that are available in BigQuery, you can have a look at this google documentation.\n\n\nConclusion\n\nCombining the procedural flexibility of IF...THEN...END IF with the strategic use of metadata from project.dataset.__TABLES__ provides a robust framework for automating BigQuery workflows. This approach not only streamlines your operations but also ensures data accuracy and cost efficiency.\n\nBy integrating these advanced techniques, you can optimise your data pipelines and stay ahead in your data processing tasks. Let's discuss!"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/dataform-truncate-load-append-or-insert-incremental-tables-and-more/#article",
      "headline": "Mastering data loading in BigQuery using Dataform",
      "description": "Efficient data loading is crucial for managing and updating tables in Dataform. Various strategies exist to handle different use cases, including truncate and load, appending data, and leveraging incremental tables with unique keys. This blog explores these primary methods and more:\n\n\nTruncate and Load\n\nIn this method, all existing records in the target table are deleted and replaced with a fresh table. This approach works well when a full table refresh is necessary or if managing slowly changin",
      "url": "https://www.measurelab.co.uk/insights/blog/dataform-truncate-load-append-or-insert-incremental-tables-and-more/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/dataform-truncate-load-append-or-insert-incremental-tables-and-more/#webpage"
      },
      "datePublished": "2025-02-07T11:23:52.000+00:00",
      "dateModified": "2025-09-03T14:32:03.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/hero-services-whentocall2-1.svg",
      "author": {
        "@type": "Person",
        "name": "Prasanna Venkatesan",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "BigQuery",
        "Dataform"
      ],
      "articleBody": "Efficient data loading is crucial for managing and updating tables in Dataform. Various strategies exist to handle different use cases, including truncate and load, appending data, and leveraging incremental tables with unique keys. This blog explores these primary methods and more:\n\n\nTruncate and Load\n\nIn this method, all existing records in the target table are deleted and replaced with a fresh table. This approach works well when a full table refresh is necessary or if managing slowly changing data.\n\nImplementation in Dataform:\n\n * Set the table type to table.\n\nExample:\n\nconfig {\n  type: \"table\"\n}\n\nSELECT\n  id,\n  name,\n  timestamp\nFROM\n  ${ref(\"source_table\")}\n\n\nBy defining the table type as table, Dataform ensures that each run recreates the table, effectively performing a truncate and load operation.\n\n\nAppend or Insert-Only Loads\n\nThis method appends new data to an existing table while preserving historical records. It is ideal for use cases where past data must remain unchanged, and only new records are added.\n\nImplementation in Dataform:\n\n * Set the table type to incremental.\n * Define an incremental condition to capture only new records.\n\nExample:\n\nconfig {\n  type: \"incremental\"\n}\n\nSELECT\n  id,\n  name,\n  timestamp\nFROM\n  ${ref(\"source_table\")}\nWHERE\n  timestamp = CURRENT_DATE() - 2\n\nThis ensures that only records from two days ago, based on CURRENT_DATE() - 2, are appended to the target table.\n\n\nIncremental Loads with Unique Keys\n\nThis method ensures that only one row per unique key is retained and updates existing records if changes occur. This is useful for deduplicating or updating records efficiently.\n\n\n\n\n\n\n\n\n\n\n30-minute consultation\n\n\n\n\n\n\n\n\n\nBook your free Dataform consultation\n\n\n\n\n\n\n\n✓\nInfrastructure audit\n\n\n✓\nTransformation plan\n\n\n✓\nEfficiency analysis\n\n\n\n\n\nGet started →\n\n\n\n\n\n\n\n\n\nImplementation in Dataform:\n\n * Set the table type to incremental.\n * Define an uniqueKey to update existing records with new data instead of inserting duplicates.\n\nExample:\n\nconfig {\n  type: \"incremental\",\n  uniqueKey: \"id\"\n}\n\nSELECT\n  id,\n  name,\n  position,\n  timestamp\nFROM\n  ${ref(\"source_table\")}\nWHERE\n  timestamp = CURRENT_DATE() - 2\n\nDataform automatically handles the merge process—if a record with the same id already exists, it gets updated. If a new id appears, it is inserted as a new row.\n\n\nIncremental Load with Rolling Delete\n\nThis method ensures that before inserting new data incrementally, the system deletes records from the last two days to accommodate any late-arriving updates. This is useful for ensuring data freshness while still maintaining an incremental approach.\n\nImplementation in Dataform:\n\n * Set the table type to incremental.\n * Use a pre-operation delete step to remove data from the last two days before inserting new records.\n\nExample:\n\nconfig {\n  type: \"incremental\"\n}\n\npre_operations {\n  DELETE \n  FROM \n    ${self()} \n  WHERE \n    timestamp >= CURRENT_DATE() - 2;\n  }\n\n  SELECT\n    id,\n    name,\n    position,\n    timestamp\n  FROM\n    ${ref(\"source_table\")}\n  WHERE\n    timestamp >= CURRENT_DATE() - 2\n\n\nThis ensures that any late-arriving updates from the last two days are reflected correctly while keeping the rest of the data intact.\n\n\nChoosing the Right Method in Dataform\n\n\n\nMethodBest Use CaseTruncate and LoadWhen a full table refresh is needed.Append or Insert-Only When historical records must be preserved.Incremental Load with Unique KeysWhen deduplication and updates are required.Incremental Load with Rolling DeleteWhen handling late-arriving updates for the last n number of days.\n\n\n\nUnderstanding these approaches in Dataform allows you to optimise your ETL/ELT workflows and effectively manage data changes for various use cases in BigQuery and other Data Warehouses.\n\nHave you used any of these methods in Dataform? Reach out to let us know, and contact us if we can help you with anything Dataform/BigQuery related! 🚀"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/2024-measurelabs-year-in-review/#article",
      "headline": "2024: Measurelab's year in review",
      "description": "Same same but different\n\nAt the beginning of the year, I wasn't quite sure what Measurelab would look like by the end of 2024. Altman's assistants had just been unleashed. The robots were on the march. Would the analytics arena be conquered by AI? Would we all be replaced by intelligent agents?\n\nAs it turns out, no. Things are pretty much the same - on the surface at least. And that's no bad thing. After the tumultuous ups and downs of a rollercoaster 2023, I'll take steady, deliberate progress ",
      "url": "https://www.measurelab.co.uk/insights/blog/2024-measurelabs-year-in-review/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/2024-measurelabs-year-in-review/#webpage"
      },
      "datePublished": "2024-12-27T16:00:00.000+00:00",
      "dateModified": "2025-07-31T20:35:15.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/eoy-blog-post-2024.png",
      "author": {
        "@type": "Person",
        "name": "Steven Elliott",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Looker Studio",
        "Privacy",
        "Google Cloud",
        "Server-side Tagging",
        "AI & ML"
      ],
      "articleBody": "Same same but different\n\nAt the beginning of the year, I wasn't quite sure what Measurelab would look like by the end of 2024. Altman's assistants had just been unleashed. The robots were on the march. Would the analytics arena be conquered by AI? Would we all be replaced by intelligent agents?\n\nAs it turns out, no. Things are pretty much the same - on the surface at least. And that's no bad thing. After the tumultuous ups and downs of a rollercoaster 2023, I'll take steady, deliberate progress any day.\n\n\nEstablishing a new normal\n\nIf 2023 was the year of the GA4 migration, then 2024 has been about establishing a new normal. A lot of that has involved rebuilding trust. Resolving issues with data discrepancies, explaining gaps and dealing with the vagaries of modelled data - helping clients come to terms with the loss of absolute certainty in web analytics. There was also the curveball of Consent Mode v2 and another about-turn on third party cookie deprecation - thanks again, Google, you certainly keep us on our toes.\n\nBut we weren't just focused on today's challenges - we helped clients build for tomorrow. For those with aspirations of implementing AI models and applications, which is errr... everyone, the quality of the underlying data is paramount. So no surprise we've seen an uptick in server-side tracking implementations and Google Cloud data integration and transformation projects, with an emphasis on observability and governance.\n\nWith that foundation (re-)established, it's still remarkable to see the impact a well-designed dashboard can make. And we should know. A welcome reminder there's plenty of situations where AI isn't necessary - many companies just need better analysis and the confidence to act or automate.\n\nThat said, we've also been busy building some exciting AI applications, including an LLM-driven chat interface for one client with the potential to transform how business stakeholders interact with their confidential data. Exciting times.\n\n\nNew names, new faces\n\nWhile we've been dealing with many of the same old problems, how we get to the solutions is certainly changing, with AI-assisted programming and a number of automations now fully embedded in our ways of working. All spearheaded by Brian, our friendly but feisty internal AI assistant and agent of change.\n\nAlong with Brian, we've welcomed the distinctly more human Hugo, Mac and Prasanna to the team - extending our strategic and data engineering capabilities, not to mention a fine head of flaxen hair, a magnificent tache and a mean mushroom curry.\n\nWith the work becoming more connected and complex, we've reorganised into multi-skilled squads, comprising consultants, analysts, engineers and implementation specialists. Not a dramatic transformation, just a deliberate shift toward how work gets done best - through shared context and combined expertise.\n\nNew clients benefiting from this move include (in alphabetical order), Autodata, CSL Vifor, Exeter University, Leightons Opticians, New Era, Riverford, and Unit4 - and we've been delivering some chunky projects for and through some new agency partners too. But none were more welcome than the renewals of our perennial partnerships with the BFI, CIPD, EDF, Euro Car Parts, Google, Springer Nature and others.\n\n\nThe gatherings\n\nBut it's not all work work work. We switched up our social calendar this year, focusing our organisational efforts on four quarterly all-company in-person gatherings, interspersed with some virtual meet-ups and socialising.\n\nThe spring saw us take a break in Manchester. A Spring Break of sorts - just with umbrellas and anoraks, rather than board shorts and bikinis. We sacked off the formal presentations and held our very own two-day unconference, MeasureCamp-style. Something we'll be doing again, for sure.\n\nFor the summer party, we gathered in a Peckham pottery studio to demonstrate our creative talents - or in some cases, the distinct lack of them (is it a bird? is it a plane?) - before savouring some rooftop cocktails in the evening sunshine.\n\nIn the autumn there was a visit to the fantastic Judges Lodgings in Gloucester for our Oktoberfest overnighter. More unconferencing, a magnificent home-cooked mexican feast and a game of traitors that put our team bonds to the test. Congrats to Magda, Matthew and Dan for scooping this year's company values awards.\n\nAnd finally a Christmas party in Soho with a visit to Ronnie Scott's for some swing, soul, jazz and carols at their All-Stars christmas lunch (and we all know who the real stars of the show were).\n\nInbetween there was an AI hackathon where we built custom assistants and an automation-focused Zapathon (OK, that one could have gone better), a couple of poker nights, plus a smattering of Skribbling, Geoguessring, Mario Karting and quizzing.\n\n\nLooking forward to 2025\n\nMaybe next year will be the year everything changes beyond recognition. I suspect not, but the truth is, nobody knows - least of all those who know the most about all this AI stuff.\n\nYou can keep your trumped-up transformations, we're getting our heads down to focus on more pragmatic progress. On behalf of Measurelab, I'd like to wish you a year of incremental improvement and many many marginal gains."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/guide-migrating-scheduled-queries-dataform/#article",
      "headline": "A step-by-step guide to migrating scheduled queries to Dataform",
      "description": "Managing scheduled queries in BigQuery often feels limiting — there’s no version control, no easy collaboration, and scaling can be difficult.\n\nIf you’ve ever wondered how to make SQL workflows smoother, Dataform is your answer. In this post, I’ll show you how I migrated a BigQuery scheduled query to Dataform and how it transformed the way I manage my data pipelines.\n\nAfter all, we all want to know who’s been touching our queries, don’t we?\n\n\nGetting started in Dataform\n\nFirst thing you need to ",
      "url": "https://www.measurelab.co.uk/insights/blog/guide-migrating-scheduled-queries-dataform/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/guide-migrating-scheduled-queries-dataform/#webpage"
      },
      "datePublished": "2024-11-27T12:30:38.000+00:00",
      "dateModified": "2026-01-27T11:24:08.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/solution-1.png",
      "author": {
        "@type": "Person",
        "name": "Katie Kaczmarek",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "BigQuery",
        "SQL",
        "Google Cloud",
        "Dataform",
        "How-to"
      ],
      "articleBody": "Managing scheduled queries in BigQuery often feels limiting — there’s no version control, no easy collaboration, and scaling can be difficult.\n\nIf you’ve ever wondered how to make SQL workflows smoother, Dataform is your answer. In this post, I’ll show you how I migrated a BigQuery scheduled query to Dataform and how it transformed the way I manage my data pipelines.\n\nAfter all, we all want to know who’s been touching our queries, don’t we?\n\n\nGetting started in Dataform\n\nFirst thing you need to do is set up a repository and link Dataform to GitHub. If you’re unfamiliar with setting up a Dataform repository, check out my detailed guide on how to set up a Dataform repository with GitHub & Google Cloud integration.\n\nWhen it comes to moving an existing query to Dataform we want to focus on separating out any large bits of SQL into their own views. This way we can track errors easily if they occur and control the full data pipeline.\n\n\nBreaking down your queries: How to structure your SQL in Dataform\n\nOnce you have your workspace in Dataform, clear out any example .sqlx files to start with a blank slate. A good structure for any project includes three directories: sources, intermediate, and output.\n\nTo create these directories:\n\n 1. Click the three dots next to Definitions.\n 2. Choose Create Directory.\n 3. Create a directory for sources, intermediate, and output. You do this by adding the name to the end of the directory path.\n\n\nSources\n\nIn this directory we want to declare each of the tables that we will reference in our SQL. Each time you create a new directory or file, click the three dots next to the relevant section (e.g., Definitions, Sources) and choose create file. Give the source a name, add this to the end of the file path followed by “.sqlx”. Add code to your new file that looks something like this:\n\nconfig {\ntype: \"declaration\",\ndatabase: \"[name of project]\",\nschema: \"[name of dataset]\",\nname: \"[name of table]\",\ndescription: \"[a brief description of what this table is]\"\n}\n\nYou will need to repeat the above for each data source you need for your SQL code.\n\n\nIntermediate\n\nIn this directory we want to create views for any WITH statements or subqueries that exist in our code. Once again, create a file, give the intermediate view a name, and add this to the end of the file path followed by “.sqlx”. The config for this section of code will look something like this:\n\nconfig {\ntype: \"view\",\nschema: \"[name of dataset you want the view stored in\",\ntags: [\"[any words that might be associated with the table]\"],\ndescription: \"[brief description of what this code is doing]\"\n}\n\nThe schema refers to the dataset that will be created in BigQuery when the code runs. We create views because they don’t incur storage costs in BigQuery. This means you can manage your data efficiently without worrying about additional charges.\n\nAfter the config you can add you SQL query as it appears in BigQuery and it will be executed in a similar way. The only difference you want to make to your query is to reference the declaration we created in the source directory within the FROM statement. It should look something like this:\n\n#referencing a source\nFROM ${ref('[name given to the source config]')}\n\n#referenceing a intermediate view\nFROM ${ctx.ref('[name given to the intermediate view]')}\n\nYou can check what the code will look like in BigQuery by clicking on the compiled queries tab. This will show you what the SQL will look like once it is executed. It will also highlight any errors and what the run GB will be.\n\nTo execute your query and create the view in BigQuery, make sure you are in the intermediate code you want to execute, click on start execution in the top bar, choose actions and choose the code you just created. Click start execution and the view will be created.\n\nYou want to repeat the above Intermediate steps for any with statements or subqueries within your code. The ${ref you use in the FROM statement can refer to sources or other intermediate files, this is how we build up the code in BigQuery.\n\n\nOutput\n\nOnce we are satisfied that all sources and intermediate tables have been created, we can move on to creating our output files. These will be the final SQL that creates tables in BigQuery. So essentially the final bit of code in our scheduled query. Create a file and give the output table a name, add this to the end of the file path followed by “.sqlx”.\n\nThere are a few options you can use for config type here. The main ones are table and incremental. Table is for complete refreshes (just like a CREATE OR REPLACE TABLE), while incremental is for adding new data without touching existing records (like an INSERT INTO or a MERGE (include unique key)).\n\nconfig {\ntype: \"table\",\nschema: \"[name of dataset]\",\ntags: [\"[any words that might be associated with the table]\"],\nbigquery: {\npartitionBy: \"[date field you want to partition by]\",\nclusterBy: [\"[fields you want to cluster by]\"]\n},\ndescription: \"[a brief description of what this table is]\"\n}\n\nUse the above config to create a new table each time the code is run. Add you final SQL code after the config. To execute your query and create the table in BigQuery, make sure you are in the output code you want to execute, click on start execution in the top bar, choose actions and choose the code you just created. Click start execution and the table will be created.\n\n\n\n\n\n\n\n\n\n\n30-minute consultation\n\n\n\n\n\n\n\n\n\nBook your free Dataform consultation\n\n\n\n\n\n\n\n✓\nInfrastructure audit\n\n\n✓\nTransformation plan\n\n\n✓\nEfficiency analysis\n\n\n\n\n\nGet started →\n\n\n\n\n\n\n\n\n\n\nSchedule your Dataform pipeline\n\nOnce everything has been created in Dataform you will need to schedule the pipeline. Google’s guide on scheduling Dataform executions can help you automate your workflows.\n\nHopefully this will help to get you started on Dataform, and when you are ready you can move on to move complexities with things like assertions, pre and post operations, dependencies and I’m sure a load more that I’m not aware of yet! All of these refer to additional things you can do within the config. But if you are writing SQL already you are half way there."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/dataform-github-google-cloud-setup/#article",
      "headline": "How to set up a Dataform repository with GitHub & Google Cloud integration",
      "description": "Setting up a Dataform repository can be challenging without the right steps. Whether you’re new to Dataform or want to optimise your workflow, this guide will show you how to seamlessly connect it with GitHub and Google Cloud (GC).\n\n\nWhat is Dataform and why use it?\n\nDataform is a powerful tool for managing version-controlled SQL workflows in a collaborative way. GC incorporates BigQuery and GitHub integration, providing an efficient way to organise and maintain complex data pipelines. Let’s bre",
      "url": "https://www.measurelab.co.uk/insights/blog/dataform-github-google-cloud-setup/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/dataform-github-google-cloud-setup/#webpage"
      },
      "datePublished": "2024-11-27T12:16:13.000+00:00",
      "dateModified": "2025-09-03T14:29:51.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/image-1.png",
      "author": {
        "@type": "Person",
        "name": "Katie Kaczmarek",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Data Analysis",
        "Google Cloud",
        "BigQuery",
        "SQL",
        "Dataform",
        "How-to"
      ],
      "articleBody": "Setting up a Dataform repository can be challenging without the right steps. Whether you’re new to Dataform or want to optimise your workflow, this guide will show you how to seamlessly connect it with GitHub and Google Cloud (GC).\n\n\nWhat is Dataform and why use it?\n\nDataform is a powerful tool for managing version-controlled SQL workflows in a collaborative way. GC incorporates BigQuery and GitHub integration, providing an efficient way to organise and maintain complex data pipelines. Let’s break down the setup process.\n\n\nPermissions for users of Dataform\n\nAnybody who will be using dataform will need the following granted in Google Cloud IAM permissions:\n\n * Dataform Admin: Provides full control over the Dataform service, important during the early stages of development.\n * BigQuery Admin: Grants access to BigQuery for data exploration and setup of datasets.\n * Secret Manager Secret Version Adder: Allows adding new secrets to the GC project, essential for connecting Dataform to GitHub.\n * Secret Manager Secret Accessor: Provides access to existing secrets to update or manage them as needed.\n\n\nConnecting Dataform to GitHub\n\nOne of the main benefits of using Dataform is the version control via GitHub integration. To leverage this, you need to connect Dataform to a GitHub repository. Here’s how you can do that:\n\n\nOption 1: Use your own GitHub repository\n\nYou can set up a GitHub repository within your organisation and then generate a fine-grained access token for it.\n\n\nOption 2: Create a new GitHub repository for a client\n\nAlternatively, you can create a new GitHub repository and set up the necessary access tokens in the first instance. Once the project is complete, you can transfer ownership.\n\n\n\n\n\n\n\n\n\n\n30-minute consultation\n\n\n\n\n\n\n\n\n\nBook your free Dataform consultation\n\n\n\n\n\n\n\n✓\nInfrastructure audit\n\n\n✓\nTransformation plan\n\n\n✓\nEfficiency analysis\n\n\n\n\n\nGet started →\n\n\n\n\n\n\n\n\n\n\nStep-by-Step: How to connect Dataform with GitHub and Google Cloud\n\n\nStep 1: Set up a GitHub repository\n\nCreate a new repository on GitHub within your organisation. Make a note of the repository URL for later use.\n\n\nStep 2: Generate a GitHub access token\n\nTo securely connect Dataform to GitHub, generate a fine-grained access token in GitHub:\n\n 1. Go to GitHub, click on your profile picture (top right), then go to Settings > Developer Settings > Personal Access Tokens > Fine-grained Tokens.\n 2. Set the token’s permissions depending on where the project will live. Make a note of the token and your repository URL.\n    Example permissions:\n\n * Administration: Read and write\n * Commit Statuses: Read-only\n * Contents: Read and write\n * Deployments: Read-only\n * Metadata: Read-only\n\n\nStep 3: Create a secret in GC\n\n 1. In GC, search for Secret Manager. Enable it if it’s not already active in the project.\n 2. Click Create Secret, name it (e.g. dataform_github_token), and paste the GitHub token into the secret value field.\n\n\nStep 4: Create the Dataform repository in GC\n\n 1. In GC, go to BigQuery and select Dataform from the sub-menu.\n 2. Click Create Repository, give it a unique name and choose a region that matches the location of your tables.\n 3. You will be given a service account, ensure this service account has the correct permissions:\n\n * bigquery.user\n * secretmanager.secretAccessor\n\nNote- make sure you are creating the repository in the region that your tables are in otherwise you will run into issues with incompatible region errors\n\n\nStep 5: Connect Dataform to GitHub\n\n 1. Open your newly created Dataform repository in GC.\n 2. Click Settings and select Connect with Git.\n 3. Enter the GitHub repository URL, default branch (e.g. master or main), and the secret you just created in Secret Manager. Click Link.\n\n\nStep 6: Set up a development workspace\n\nNow that the repository is connected, set up a Development Workspace. Each workspace corresponds to a Git branch. For collaborative teams, using individual names for workspace IDs is a common practice. After creating your workspace, click Pull from Main Branch to get the latest version of the code.\n\n\nFinal thoughts\n\nSetting up Dataform with GitHub integration streamlines your workflow by allowing efficient version control and collaboration. By ensuring the correct permissions and configurations, you can confidently manage data workflows, deploy scripts, and build out infrastructure smoothly.\n\nThis guide should help you navigate the process of setting up Dataform, whether you’re new to the tool or simply looking to refine your version-controlled SQL workflows. Happy coding!\n"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/offline-event-data-import-in-ga4/#article",
      "headline": "What is offline event data import in GA4?",
      "description": "Offline event data import in Google Analytics 4 allows you to upload event data that was acquired outside of your website or app, such as in-store purchases, contact centre interactions, or CRM data. This can be critical for businesses seeking to bridge the gap between online and offline user actions, resulting in a more complete picture of customer behaviour.\n\n\nHow to import offline event data into GA4\n\nYou can upload event data into GA4 through a process called Data Import. This can be done ma",
      "url": "https://www.measurelab.co.uk/insights/blog/offline-event-data-import-in-ga4/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/offline-event-data-import-in-ga4/#webpage"
      },
      "datePublished": "2024-11-22T13:27:14.000+00:00",
      "dateModified": "2026-01-27T11:24:08.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/blog_image_3-1-1.png",
      "author": {
        "@type": "Person",
        "name": "Nasima Khatun",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Data Analysis",
        "Google Analytics",
        "Conversion Tracking",
        "Marketing",
        "How-to"
      ],
      "articleBody": "Offline event data import in Google Analytics 4 allows you to upload event data that was acquired outside of your website or app, such as in-store purchases, contact centre interactions, or CRM data. This can be critical for businesses seeking to bridge the gap between online and offline user actions, resulting in a more complete picture of customer behaviour.\n\n\nHow to import offline event data into GA4\n\nYou can upload event data into GA4 through a process called Data Import. This can be done manually via CSV files or automatically using SFTP or through the Salesforce Connector.\n\nStart by preparing your offline data for import. Download the GA4 data import template, which provides the required format for your data.\n\nOnce your CSV file is prepared, you can then upload your data using the process shown below.\n\nOnce uploaded, your data will be matched with existing online user interactions using unique identifiers like User ID, Client ID, or other custom parameters. The imported data is processed in batch mode, which may take up to 24 hours to be reflected in your GA4 reports.\n\n\nHow can offline data in GA4 be used?\n\n * Linking online browsing behaviour with in-store purchases to understand the full sales funnel.\n * Combining data from customer service calls with online activity to improve customer support and retention strategies.\n * Enriching your GA4 data with CRM information from a platform like Salesforce to personalise marketing efforts and better segment your audience.\n\n\nBenefits of offline event data import\n\n * Combining online and offline data, you get a more complete picture of your customers’ journeys.\n * Offline data can help you understand the impact of offline touchpoints on conversions, enabling you to attribute the value of your digital marketing efforts to offline actions.\n * Use enriched data to create more personalised marketing campaigns, boosting engagement and conversion rates.\n\n\nLimitations of offline event data import\n\nWhile offline data import in GA4 offers significant benefits, it comes with some limitations that you should be aware of:\n\n 1. Data source size: Each data source you upload is limited to 1GB in size. This means that large datasets may need to be split across multiple files or uploads, adding complexity to the process.\n 2. Daily upload limits: You can upload up to 120 files per property per day. For organisations dealing with high volumes of offline data, this could become a bottleneck.\n 3. Reserved names and prefixes: GA4 has several reserved names and prefixes that cannot be used in your data schema. This limitation may require adjustments to your data structure to ensure compatibility with GA4.\n 4. Data refresh delays: After uploading your data, it can take up to 24 hours for the imported data to be reflected in your GA4 reports. This delay means you won’t see the impact of your data import immediately.\n 5. No Real-time processing: Unlike some other data in GA4, offline event data imports are processed in batch mode. This means you won’t get real-time updates, which could be a drawback for time-sensitive data analysis.\n 6. No historical data integration: Imported data only affects new data collected after the import. It does not retroactively apply to historical data in your GA4 property, so the import won’t enhance past data reports.\n\n\nIn summary\n\nOffline event Data Import in GA4 is a powerful feature that allows you to integrate offline interactions with your online analytics. By implementing this, you strengthen your current data and gain a deeper understanding of your audience, clients and leads. It gives you the ability to make smart choices and create more successful marketing strategies. While Measurement Protocol can be used to send offline data directly to GA4, offline event data imports allow you to have more control over the data that is being imported."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/the-complexity-paradox-why-your-spreadsheet-is-complex-and-bigquery-is-simple/#article",
      "headline": "The complexity paradox: why your spreadsheet is complex and BigQuery is simple",
      "description": "Discover 'The Complexity Paradox': why seemingly simple tools like spreadsheets can lead to hidden complexity, while learning powerful tools like BigQuery and SQL can bring true simplicity and scalability to your data workflows.",
      "url": "https://www.measurelab.co.uk/insights/blog/the-complexity-paradox-why-your-spreadsheet-is-complex-and-bigquery-is-simple/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/the-complexity-paradox-why-your-spreadsheet-is-complex-and-bigquery-is-simple/#webpage"
      },
      "datePublished": "2024-10-29T09:51:14.000+00:00",
      "dateModified": "2026-03-20T13:11:16.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/untitled-1.png",
      "author": {
        "@type": "Person",
        "name": "Matthew Hooson",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "BigQuery",
        "Google Analytics",
        "Looker Studio",
        "Dataform",
        "How-to"
      ],
      "articleBody": "Understanding complexity\n\nEverything is complex until you understand it. And yet, not all complexities are created equal. This is the crux of what I like to call 'The Complexity Paradox.' Sometimes, the simplest solution is deceptively the most complicated, not because it lacks elegance, but because it lacks scalability, robustness, or the ability to evolve as our needs grow.\n\nComplexity often depends on perspective. What feels simple to one person can be overwhelming to another. Our familiarity with a tool or system can create an illusion of simplicity, masking the intricate web of dependencies and limitations beneath the surface. This paradox of complexity is something we must navigate carefully, especially when working with data and technology.\n\n\nThe hidden complexity of spreadsheets\n\nConsider the humble spreadsheet—an ever-reliable tool that we turn to time and again. Picture yourself in a situation where you need to centralise data. You know Google Sheets well; it's easy for you to connect a sheet, automate data ingestion, and build a few dashboards on top. To you, it's a simple, familiar solution.\n\nBut step back for a moment. Imagine someone else looking at that Google Sheet. To them, it's not a simple tool—it's an opaque maze of formulas, references, and inconsistent data. They see a fragile structure, prone to breaking when the amount of data grows or when the dependencies become too tangled to manage—one of those dependencies being you yourself. What feels comfortable to you is a complex mess to them, bound to crack under pressure.\n\nThe more you build on top of a spreadsheet, the more intricate and brittle it becomes. A simple error in a formula can ripple through the entire structure, causing confusion and requiring extensive troubleshooting. The inherent lack of scalability and the manual effort needed to maintain spreadsheets make them vulnerable as data needs grow. While spreadsheets are great for quick solutions and prototyping, they are not well-suited for long-term, scalable data management.\n\n\nBigQuery: a scalable solution\n\nNow, let's shift our perspective to something else—SQL and BigQuery, for example. The mention of these tools may make some people nervous. Perhaps you've always thought that SQL is for “serious” data folks, while Google Sheets is approachable and intuitive. BigQuery? That's something only data engineers and analysts should touch.\n\nBut here's the thing: getting data into BigQuery can be surprisingly simple, especially in the early stages. You can use tools like BigQuery Data Transfer Service, direct connections from GA4, ETL tools, or even simple API calls using a Cloud Function. These methods make it easy to centralise your data without needing advanced engineering skills. And once your data is there, SQL and BigQuery offer an infinitely scalable foundation.\n\nBigQuery is designed to manage complexity in a structured, sustainable way. Once you learn it, the tool isn't complex—it’s liberating. Suddenly, centralising data is no longer about delicate spreadsheets that could break at any moment. It's about robust queries that can handle thousands, even millions, of records. It's about a scalable model that is ready to adapt and grow.\n\nBy using SQL, you can create repeatable and consistent processes for data management. Queries can be documented, versioned, and shared across the team, making it easier to track changes and ensure data integrity. Unlike spreadsheets, where changes can be made without oversight, SQL-based solutions provide a level of transparency and control that reduces the risk of errors and inconsistencies. This shift from ad-hoc data management to a structured approach is a key step towards building resilient data systems.\n\n\nTools for collaboration: Dataform and beyond\n\nDataform (now built into BigQuery), is a tool we really love here at Measurelab. It empowers collaboration and the democratisation of data, enabling shared queries and team-based workflows that allow multiple users to contribute and build on each other's work. Dataform allows users to create modular, reusable SQL-based transformations, making it easier for teams to collaborate and maintain data pipelines.\n\nDataform’s ability to break down complex transformations into smaller, reusable components allows teams to work more efficiently. Instead of reinventing the wheel for every new data project, team members can build on existing work, creating a library of transformations that can be reused and adapted as needed. This approach not only saves time but also improves the quality and consistency of the data transformations, as well-tested components are reused across different projects.\n\nAll of the above helps reduce overall complexity by creating consistent, reusable processes and fostering collaboration. By making data workflows accessible, transparent, and easy to build upon, these tools simplify what would otherwise be a tangled web of individual efforts, ensuring that data management becomes more efficient and less error-prone.\n\n\nThe complexity paradox\n\nSo in summary, the paradox lies in this: what appears simple can sometimes lead to hidden complexity. A comfortable solution today can be tomorrow's source of frustration. Conversely, embracing something that feels complex at first can pave the way to simplicity, scalability, and resilience in the long run.\n\nThis paradox is especially evident in the world of data. The tools that feel easy and intuitive at first—like spreadsheets—often become unwieldy and fragile as needs grow. On the other hand, tools that may seem intimidating initially—like SQL and BigQuery—offer a level of robustness and scalability that makes them simpler to manage over time. The challenge is to recognise when it’s time to move beyond what feels comfortable and invest in learning the tools that will serve you better in the long term.\n\nIf you are ready to take that journey from the complex to the simple, Measurelab can help! Our expertise in data management and analytics can guide you through the transition, helping you adopt tools and practices that will set you up for success. Whether you need help migrating from spreadsheets to scalable databases or building collaborative workflows that empower your team, we're here to support you every step of the way.\n\nEmbrace the paradox, and discover how the right kind of complexity can lead to true simplicity."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/youre-sitting-on-a-sql-time-bomb-defuse-it-with-dataform/#article",
      "headline": "You’re sitting on a SQL time bomb: defuse it with Dataform",
      "description": "Learn how Dataform can solve the challenges of outdated SQL, improving data reliability, scalability, and efficiency for marketing teams.",
      "url": "https://www.measurelab.co.uk/insights/blog/youre-sitting-on-a-sql-time-bomb-defuse-it-with-dataform/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/youre-sitting-on-a-sql-time-bomb-defuse-it-with-dataform/#webpage"
      },
      "datePublished": "2024-10-23T08:04:57.000+00:00",
      "dateModified": "2025-09-03T14:28:54.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/hero-services-domorewithdata2.svg",
      "author": {
        "@type": "Person",
        "name": "Matthew Hooson",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Data Analysis",
        "Google Cloud",
        "SQL",
        "BigQuery",
        "Debugging",
        "Testing",
        "Dataform",
        "Marketing",
        "How-to"
      ],
      "articleBody": "As a marketing team's maturity evolves, disparate data sources centralise, increasingly sophisticated SQL queries begin to pull together insights and the stars align. In time data becomes central to all they do and they rely heavily on accurate and timely data to make informed decisions that drive campaign success and maximise customer engagement. All is well until…BOOM, something breaks, critical reporting is not functioning as expected, stakeholders across the business are beginning to lose the trust in the data you worked so hard to instil. The culprit? Outdated SQL operations and stacked scheduled queries.\n\nBottlenecks in knowledge, a lack of any sort of dev/prod workflow and no versioning unfortunately meant this was only a matter of time, it was a ticking time bomb...\n\n\nThe fragile foundation of stacked scheduled queries\n\nStacked scheduled queries involve a series of dependent SQL queries that run on a set schedule, each building on the results of the previous one. Any updates or edits are often made directly on live 'data products,' adding to the risk of failure. On top of this, these workflows often lack robust version control (with maybe some good eggs manually backing up SQL in a git repo). This makes it challenging to track changes or allow multiple team members to work concurrently without conflicts. To be clear here this approach is fine, up until a point. If you have one or two data sources and a couple of data models built on top, unpicking that basic tapestry should not be too much of a challenge should things go wrong. I will add a caveat to my caveat here though, if you can build your processes using Dataform from the off, definitely do so as it saves you a rebuild down the line.\n\nTo summarise, some of the main issues with basic SQL approaches:\n\n * Single Points of Failure: If one query in the chain fails, it can disrupt the entire data pipeline, leading to incomplete or inaccurate data.\n * Lack of Transparency: As the number of queries grows, understanding the data flow becomes increasingly complex, making it harder to troubleshoot issues.\n * Scalability Challenges: Stacked queries are not built to efficiently handle large data volumes or adapt to changing business needs.\n * Manual Intervention: These systems often need manual oversight to ensure they run properly, increasing the risk of human error.\n\n\nThe hidden costs of outdated practices\n\nYou might think, so what. If it breaks I know where the problem will be, I built this masterpiece! But there are costs that you may not initially consider.\n\nIt may take time to fix issues, delaying decisions and potentially having big impacts on how agile you can be as a business. What if an error in reporting is not obvious, something somewhere in the stack has gone wrong but it has not broken the downstream reporting. You may well be taking those errors into account in budgeting, forecasting, spending and compliance decisions.\n\nAnyone who has worked with stakeholders and data knows how hard fought buy-in and trust is when it comes to data. One undetected issue or misinterpreted value could well undo all the work undertaken to instill that trust.\n\nShould an problem arise there is the sticky issue of fixing it. Digging through long complex SQL statements chained together is a lengthy and difficult process, especially if you did not originally put that SQL together. Over the lifetime of a solution many many hours will be dedicated to trying to understand the SQL before a fix can even be undertaken. This is to not even mention all the repeated pieces of SQL being written over and over by individuals working in a silos.\n\n * Delayed Decision-Making: Inaccurate or incomplete data can delay decision-making processes, reducing business agility.\n * Financial Losses: Errors in reporting can lead to financial inaccuracies, affecting budgeting, forecasting, and compliance.\n * Eroded Trust: Stakeholders may lose confidence in the data, undermining the credibility of the marketing analytics team and the organisation as a whole.\n * Loss of Time: Both analysts and engineers often spend excessive time trying to understand complex query structures and rewriting code that has already been created many times before, leading to inefficiencies and wasted resources.\n\n\n\n\n\n\n\n\n\n\n30-minute consultation\n\n\n\n\n\n\n\n\n\nBook your free Dataform consultation\n\n\n\n\n\n\n\n✓\nInfrastructure audit\n\n\n✓\nTransformation plan\n\n\n✓\nEfficiency analysis\n\n\n\n\n\nGet started →\n\n\n\n\n\n\n\n\n\n\nEmbracing modern data engineering with Dataform\n\nTo prevent these issues, organisations need to adopt modern data engineering platforms like Dataform or its older brother dbt (I think this small blog by dbt does the best job of explaining why these tools were created), both of which are particularly suited to managing marketing data operations. The choice of tool can depend on your current data location. Dataform is tightly integrated with BigQuery and is free, making it an ideal choice if most of your data is already centralised there. Being Google Cloud partners, Dataform is where we spend a lot of our time.\n\nSo how does the adoption of Dataform help with the fragility and the costs of outdated SQL processes?\n\n1. Automated dependency management\n\nDataform automatically manages dependencies between datasets and queries. This ensures that if one dataset changes, all dependent datasets are updated accordingly, eliminating single points of failure. Additions like compiled graphs make it super easy to see and manage dependencies.\n\n2. Version control integration\n\nBy integrating with version control systems like Git, Dataform allows teams to track changes, collaborate effectively, and roll back to previous versions if necessary. It also allows the team to work on development versions of code bases without fear of breaking production level data products.\n\n3. Testing and validation\n\nDataform enables teams to include tests within the data workflow. This ensures data quality by validating datasets at each stage of the pipeline. These are called assertions and can be configured to inform you of issues, or stop a pipeline altogether.\n\n4. Scalability and performance\n\nDesigned to handle large-scale data operations, Dataform optimises query execution and resource usage, allowing your data infrastructure to grow with your marketing data needs.\n\n5. Improved transparency\n\nWith a clear visual representation of data workflows, Dataform makes it easier to understand and troubleshoot the data pipeline, reducing downtime and increasing efficiency. Dataform also moves you to a modular approach to SQL, making it much simpler to understand and update when necessary.\n\n6. JavaScript for flexibility\n\nDataform supports the use of JavaScript (JS), providing additional flexibility to transform data beyond the capabilities of standard SQL. The ability to use JS variables and functions for repeated operations makes it easier to create reusable code, reducing redundancy and saving time. This utility allows for more dynamic transformations and custom logic, giving teams greater power to tailor their data workflows to specific requirements. If you so wished you could write your entire data modelling processes in JS!\n\n\nThe road to a resilient SQL data infrastructure\n\nTransitioning to a modern data engineering platform might seem challenging, but the long-term benefits are well worth the effort. Here are a few things to consider to get you started\n\n * Assess your current infrastructure: Identify the pain points and vulnerabilities in your existing SQL operations.\n * Educate your team: Invest in training to ensure your team is proficient in modern data engineering tools and practices.\n * Plan the migration: Develop a step-by-step plan to transition from stacked scheduled queries to a platform like Dataform.\n * Iterate and improve: Use Dataform's features to continuously test, monitor, and optimise your data workflows.\n\n\nConclusion\n\nThe risks of relying on outdated SQL operations are too big to ignore. Continuing to use stacked scheduled queries means taking unnecessary risks with your data integrity and marketing success. Adopting modern data engineering platforms like Dataform is not just a technical upgrade—it's a strategic move that can protect your organisation's future.\n\nMeasurelab's advice? Take action now to modernise your SQL operations and build a strong, reliable data infrastructure that supports your marketing success. Reach out to Measurelab who can help with any Dataform questions or projects you may have in mind!\n"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/success-stories/integrating-siloed-data-springer-nature/#article",
      "headline": "Integrating siloed data: Springer Nature marketing and sales case study",
      "description": "The Springer Nature Group is an academic publishing company, with brands dating back to 1842, that advances scientific discovery by publishing robust and insightful research, supporting the development of new areas of knowledge, making ideas and information accessible around the world, and leading the way on open access.\n\n\nThe challenge\n\nThe sales and marketing teams depended on incomplete data, which didn’t capture the entire customer journey due to different systems in use. Transactions and re",
      "url": "https://www.measurelab.co.uk/insights/success-stories/integrating-siloed-data-springer-nature/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/success-stories/integrating-siloed-data-springer-nature/#webpage"
      },
      "datePublished": "2024-08-07T11:01:00.000+00:00",
      "dateModified": "2025-12-10T01:31:15.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/08/6.png",
      "author": {
        "@type": "Person",
        "name": "Mark Rochefort",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "BigQuery",
        "Looker Studio",
        "Google Cloud",
        "Data Analysis",
        "Dataform",
        "SQL"
      ],
      "articleBody": "The Springer Nature Group is an academic publishing company, with brands dating back to 1842, that advances scientific discovery by publishing robust and insightful research, supporting the development of new areas of knowledge, making ideas and information accessible around the world, and leading the way on open access.\n\n\nThe challenge\n\nThe sales and marketing teams depended on incomplete data, which didn’t capture the entire customer journey due to different systems in use. Transactions and revenue data were in another platform, unavailable for marketing or user behaviour analysis. There were no ready-made connectors to extract this data for use in BigQuery.\n\n\nThe solution\n\nGiven the need for API extraction, BigQuery load and then low-level transformation and table join, we decided on a custom architecture in the Google Cloud that included the following services: Cloud functions; Cloud Workflow; Dataform; BigQuery; Cloud Scheduler; Secret Manager and Looker Studio.\n\n\nThe results\n\nThe solution effectively resolved the client’s issue by merging acquisition and behavioural data with completely accurate transaction and revenue details, providing a clearer revenue view across all channels. This also enhanced detailed reporting, trend analysis, and improved marketing and sales with better bidding strategies and channel targeting.\n\n\nWhat’s next?\n\nThe client is now able to do more detailed reporting and analysis, identify trends and patterns in data, and has improved marketing and sales performance with more accurate bidding strategies and channel targeting."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/remote-feedback-m3t/#article",
      "headline": "Firing up some remote feedback with My Three Things",
      "description": "Most people want more of it (even if they don’t always like it). Few would claim to be very good at it: asking for it, giving it, receiving it, or applying it. Yes, we're talking about remote feedback.",
      "url": "https://www.measurelab.co.uk/insights/blog/remote-feedback-m3t/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/remote-feedback-m3t/#webpage"
      },
      "datePublished": "2024-07-30T12:54:16.000+00:00",
      "dateModified": "2026-01-27T15:44:25.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/measurelab-blog-co-values_1200x400-blog-1.png",
      "author": {
        "@type": "Person",
        "name": "Steven Elliott",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Measurelab"
      ],
      "articleBody": "Finding the time to give remote feedback - outside of formal one-to-ones - is challenging when you're part of a distributed team. It can be tricky to find the ‘right moment’ in a day dominated by deep work, meetings and slack exchanges.\n\nSo we decided to experiment with consciously creating that moment - a mass moment - where feedback could flow freely in all directions simultaneously.\n\n\nIntroducing My Three Things (M3T)\n\nThanks to Lizzie for the inspo. Here’s how it’s supposed to go down.\n\n 1. You nominate five people you work with closely day-to-day (could be any number)\n 2. Those people provide remote feedback by answering questions along the lines of: What have you really noticed? and What would you like to see more of?\n 3. The feedback is collated, lightly anonymised (by a discreet HR-type) and shared with you\n 4. You read and reflect on it all and come up with three things you’re going to work on moving forward\n 5. You share those with the team for accountability - and because sharing is nice\n\n\nHow did it go?\n\nFirst up, it was universally well-received - the concept at least. Everyone was happy to get involved.\n\nThere were more than five people I wanted feedback from, which then made it tricky to leave people out - what signal might that send? In the end I opted to omit the people I thought would be most comfortable providing feedback directly, if asked.\n\nThe nomination process was revealing in itself. Visualised, the nominations provide a useful map of the organisation's nexus points. Who the ‘connectors’ are that work with lots of people - and who might be at risk of feeling isolated.\n\nThinking about people and providing considered remote feedback takes a lot longer than we maybe anticipated. We'd guessed at maybe minutes per person, but I'd say it was closer to 15. Everyone wanted to do the right thing by their colleagues - and some had up to nine requests for feedback. It’s a big time commitment requiring concentration. With hindsight we’d perhaps have limited the number of questions asked, which were a little duplicative.\n\nCoordinating the collection, assimilation and distribution of feedback was a headache with around 20 people. For a bigger company, it could get totally out of hand - although there must be a tool somewhere that does this for a $5/person/month subscription. Thankfully, Lizzie came up with a genius Google Sheets > ChatGPT > Canva automation that crafted beautifully designed, personalised PDFs with a minimum of fuss (but a fair bit of fanfare).\n\nThe all-company sharing session was a really positive, wholesome experience. It was fascinating to see what people had taken from their feedback, and interesting to see company-wide patterns emerge. People committing to share more of what they’re working on, and asking for help to spread the load were two themes I noticed.\n\nWe now need to think about how we activate the data - isn’t that always the challenge? How to remind people of their pledges, hold them accountable (with a suitably light touch) and encourage them to take positive action.\n\n\nAnd My Three Things?\n\nFeedback tends to flow downwards, rather than upwards within an organisation, so I don’t tend to get much (conscious I should probably ask for it more).\n\nThe congruence was a real surprise - it was almost as if it was a coordinated effort to point me in the right direction. The nice stuff made me blush, the 'developmental' feedback was nowhere near as harsh as my self-talk.\n\nAnd in the spirit of working in public, I guess I should share my three things:\n\n 1. To be clearer on specific requests, actions, owners and deadlines - apparently I have a tendency to be vague and leave things open to interpretation\n 2. To facilitate more collaborative sessions with junior team members - because facilitating is something I’m apparently good at 😊\n 3. To share more of my thinking around strategy and initiatives - too much of my company communications currently relate to commercials\n\nNot sure how much progress I’ve made so far, but it’s out there now, so I guess I need to up my game. Thanks for the remote feedback, folks."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/modern-marketing-analytics/#article",
      "headline": "The modernisation of marketing and the role of marketing analytics",
      "description": "Navigating the ever-evolving landscape of marketing technology, I've come to terms with a key realisation: marketing analytics\n\nis\n\nmarketing. This acknowledgment hasn't always been easy. Years ago, as a humble web analyst, the lines weren't as blurred. However, with the advent of tools like Google Analytics 4 (GA4), stringent privacy laws such as GDPR, and changing browser policies like those of Safari, the role of a web analyst has transformed significantly.\n\nIn the old world - us web analysts",
      "url": "https://www.measurelab.co.uk/insights/blog/modern-marketing-analytics/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/modern-marketing-analytics/#webpage"
      },
      "datePublished": "2024-07-19T10:59:31.000+00:00",
      "dateModified": "2026-01-27T11:24:11.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/dall-e-2024-07-19-11-26-58-a-humorous-cartoon-style-scene-featuring-a-diverse-group-of-people-looking-confused-in-front-of-a-whiteboard--the-whiteboard-has-icons-of-clouds-shie-1.png",
      "author": {
        "@type": "Person",
        "name": "Daniel Perry-Reed",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Privacy",
        "Marketing",
        "MarTech",
        "Google Analytics",
        "Testing",
        "AI & ML"
      ],
      "articleBody": "Navigating the ever-evolving landscape of marketing technology, I've come to terms with a key realisation: marketing analytics\n\nis\n\nmarketing. This acknowledgment hasn't always been easy. Years ago, as a humble web analyst, the lines weren't as blurred. However, with the advent of tools like Google Analytics 4 (GA4), stringent privacy laws such as GDPR, and changing browser policies like those of Safari, the role of a web analyst has transformed significantly.\n\nIn the old world - us web analysts badgered everyone to get tracking in place and then reported on campaigns after they'd run. We were more of an afterthought (i.e. fighting for dev time in a sprint for data layer updates anyone?) and doing purely descriptive analytics. Marketers focused on the strategy, targeting, creative, and budgets, and as such, could sit as a separate team.\n\nThese days - in the era of modern marketing - us marketing analysts (now often called 'technical marketers') are involved throughout the process. Advising on data governance, privacy and consent, audience segmentation, structuring AI-ready data, optimising in real-time, etc. And thus, we're (finally) a more intrinsic player in any marketing team.\n\nAs such, the roles are blurring - where does marketing analytics stop and marketing start?\n\n\nModern Marketing\n\nRecently, I had the privilege of discussing these developments with Ken Williams in an episode of The Measure Pod, where we explored the concepts of modern marketing as highlighted in their DiveTeam blog series. This conversation has significantly influenced my approach in what I do at Measurelab, reinforcing my thoughts around the pivotal role of analytics within modern marketing teams.\n\nToday, modern marketing strategies demand a fundamental shift in mindset. The paradigm shift is driven primarily by two forces -\n\nprivacy regulations\n\nand\n\ncloud computing\n\n. These have not only redefined best practices but also required marketing professionals to develop new skills and approaches. Here are some key aspects shaping the future and modernising marketing, and thus marketing analytics:\n\n\nData-driven decision making\n\nIn the current digital age, data is more accessible and crucial than ever. Using analytics and data science allows us to understand consumer behaviour, identify trends, and measure the effectiveness of marketing efforts meticulously. This data-centric approach ensures marketing campaigns are tailored to specific audiences, optimising budget allocation and messaging. This is the essence of data-driven marketing analytics.\n\n\nEmbracing new, advanced technologies\n\nTechnological advancements have become indispensable in modern marketing. Tools like marketing automation platforms (MAPs), artificial intelligence (specifically gen AI and machine learning), and customer data platforms (CDPs) enable the creation of personalised and targeted campaigns. With the ever-increasing landscape of marketing channels, our capacity to connect with audiences has never been greater. Provided we integrate these technologies strategically.\n\n\nContinuous learning and adaptation\n\nIn a landscape where even three-year-old advice may no longer apply, staying updated with the latest trends and developments in marketing technology (MarTech) is crucial. Continuous learning and a willingness to adapt are now imperatives for maintaining a competitive edge in marketing and analytics.\n\n\nPrivacy and ethics\n\nThe growing consumer demand for data privacy (i.e. respecting their preferences) necessitates a shift towards privacy-focused marketing strategies. Techniques that emphasise privacy not only build customer trust but also enhance the overall effectiveness of marketing efforts. We must understand the intricacies of privacy legislation and its impact on what can be achieved, not just from a legal perspective (what can we do), but also ethically (what should we do).\n\n\nAccessibility of cloud computing\n\nThe role of cloud computing in marketing analytics cannot be overstated. Proficiency in cloud technologies is essential for processing large datasets efficiently and conducting advanced analysis to uncover valuable insights. This expertise facilitates effective decision-making and drives business growth, helping to bridge traditional marketing and modern solutions.\n\n\nHolistic measurement strategies\n\nA comprehensive approach to measurement that goes beyond traditional metrics is required to truly gauge marketing success. Leveraging various marketing effectiveness methodologies such as media mix modelling (MMM), attribution modelling (MTA) and incrementality experiments helps in precisely understanding the unique impact of various campaigns, making measurement a cornerstone of modern marketing.\n\nThe marketing profession now requires an expanded skill set. To be an effective marketer, we must now become adept data engineers and analysts who understand the intricacies of privacy legislation. That is on top of everything else we have to do!\n\nAs I delve deeper into the realms of modern marketing, I've become comfortable with the notion that... marketing analytics\n\nis\n\nmarketing. It's an evolution that reflects the broader shift in our industry - one that I'm excited to be a part of. At Measurelab, we’ve successfully navigated these changes, helping numerous teams and companies adapt and thrive in this new environment.\n\nBy embracing these changes, we can craft more precise and impactful marketing strategies, ensuring we stay ahead in a perpetually evolving digital world. If you’re grappling with these challenges or seeking insights on how to leverage modern marketing techniques effectively, let’s connect. Message me on LinkedIn or get in touch through Measurelab to explore how we can help your team."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/elevate-data-analytics-bigquery/#article",
      "headline": "Elevate your data analytics game with BigQuery",
      "description": "There’s a lot of advice right now on why you should adopt and use Google BigQuery for data analytics. But what is SQL? Is it for you? And how can you convince budget holders that it is a good idea?",
      "url": "https://www.measurelab.co.uk/insights/blog/elevate-data-analytics-bigquery/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/elevate-data-analytics-bigquery/#webpage"
      },
      "datePublished": "2024-07-16T11:20:00.000+00:00",
      "dateModified": "2026-01-27T11:24:11.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/analytical_training_banner_-1.png",
      "author": {
        "@type": "Person",
        "name": "Hugo Jones",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "BigQuery",
        "SQL",
        "Google Analytics",
        "Looker Studio",
        "Debugging",
        "Google Cloud",
        "AI & ML",
        "How-to"
      ],
      "articleBody": "What is BigQuery?\n\nWhat is BigQuery? BigQuery is a powerful data warehousing tool within the Google Cloud Platform designed to store, manage and analyse large datasets using SQL.\n\nBigQuery is Google’s data warehouse. You feed it tables of data, any data, all the data you have. These can be uploaded manually, accessed through built in connectors or served via APIs and scheduled services.\n\nIt uses a language called Structured Query Language (SQL) to work with the data, to merge tables, to select only bits of tables, to transform data from one table to another. As long as there is a common unique identifier to the tables, SQL can do the job.\n\nAs a Google product it works really well for connecting to Google Analytics 4 (GA4), Looker Studio and Google Workspace. It has experienced a boom in awareness and popularity recently as the GA4 raw data exports to BigQuery are now available for free.\n\nPreviously with Universal Analytics you needed a paid account (GA360) to do so. Now everyone can store and use their data in a data warehouse. But BigQuery can do so much more than store your GA4 data.\n\n\nWho should use BigQuery for data analytics?\n\nBigQuery is an enterprise-level data analytics platform for businesses and teams who have outgrown the analytics constraints of Excel, Sheets, or GA4’s user interface. See why you should start importing GA4 to Bigquery.\n\nIf you use complex formulas in Excel to speed up repetitive reporting tasks, if you’ve ever spent 2 hours trying to get something to work because you know it will save you time in the long run. If you’re the person that people come to with questions about data. If you like to plan ahead, and know in advance which fields and which datasets you’re going to need for reporting then BigQuery might be for you.\n\nEven if you don't directly work with marketing analytics data, BigQuery could help you automate any task where you have to transform data to report on it.\n\n\nIs BigQuery Expensive?\n\nLike any enterprise-level software, there are costs involved. Google will charge you on the amount of data you store and the size of the queries you process. The interesting thing though is that it doesn’t have to be expensive, Google has a threshold of storage and processing, if your work falls under that, you won't be charged.\n\nThis is where the skill and the art of a SQL analyst that knows BigQuery really comes to the fore. Knowing exactly what data you need in the output, and writing a SQL query that picks up and combines the tables to extract only that data, will reduce processing time and reduce storage for the output. Our experts share their tips for keeping the costs down.\n\n\nHow to master working in BigQuery\n\nSQL queries, if grammatically correct, will run, but may output more than you expect. There is no sense check other than your own eyeballs for what a query will output. The only error that will flag is if something is wrong in the syntax of the query itself, not with what the query might create.\n\nOne way to work in BigQuery, especially if you are just getting started, is to work with datasets where you already have a manually derived end point. This way, as you write your SQL, you have something to check against to make sure you are generating exactly what you expect to see.\n\nThink about starting with the endpoint, try to visualise what the result should look like. Choose only the data that you need to get there and try to be as accurate and concise in the arguments to get to that point.\n\nAlways review the output, sense checking results can be daunting - especially if the data sets are big - but it is worth it. Knowing what data is in the result, and how you came to that point gives confidence in the data, and confidence in any reporting or analysis built from it.\n\nYou can follow this guide from Matthew Hooson on how to start your own BigQuery project:\n\n\nDifferences between BigQuery SQL and other SQL dialects\n\nMuch like in GA4 or Looker Studio, where the syntax of regular expression (regex) is different to other instances of regex. BigQuery has its own dialect of the SQL language - GoogleSQL.\n\nLike the regex example, the similarities outweigh the differences, knowing one form of SQL will definitely be an advantage, even if it isn’t the exact form that BigQuery uses.\n\n\nUsing BigQuery without mastering SQL\n\nAI tools and internet resources are a good start. Sites like GA4 SQL do a really good job of helping you build the basic SQL queries you’ll need to get over the most common pitfalls in querying GA4 data in BigQuery.\n\nGenerative AI tools can take natural language input and deliver SQL queries (NL2SQL) that will run. ChatGPT will not create perfect queries, and there are idiosyncrasies in data sets that blog resources and code generation tools just cannot account for.\n\nA good starting place for AI SQL sidekicks is this guide from Google on prompting best practices NL2SQL in BigQuery (via BigQuery data canvas) to get the best results. Within the Google Cloud Platform there is a service called Vertex AI, based on Google’s Gemini model.\n\nOtherwise in the OpenAI ChatGPT space, there are various GPTs such as BigQuery SQL Copilot from Widenex that promises “precise and highly efficient GA4 BigQuery SQL queries with this assistant”.\n\nOr for a more bespoke approach, contact the team here at Measurelab to see if our in-house bespoke generative AI assistant Brian is a good fit for you.\n\nBut in both cases it is really important that you as the user sense check the SQL, understand what the query is doing, where it is getting the data from and what it is doing to the data. AI especially is prone to hallucinations, and you will need to check if you are providing the tools with sensitive or confidential data. See how to debug your queries.\n\n\nVisualising BigQuery data\n\nSince BigQuery is part of the Google stack, generating data visualisations in Looker Studio is really easy, equally you can ask it to push the results into a Google Sheet through Connected Sheets. BigQuery also supports APIs for most of the major players in visualisation. And if there isn’t a native connector then the tables can be exported to a cloud storage “bucket” and accessed from there.\n\nOnce you’re happy with the results of your SQL, and your visualisations of the data, you can then schedule the query so that your reports stay up to date. Scheduling is one of the powerful tools you can use to automate your data transformation and exporting work.\n\nBe wary of giving report users too many options or parameters for updating reports, as each parameter change or update will take from your processing and storage budget, especially if you have multiple report users.\n\n\nSecuring managerial buy-in\n\nThe cost is minimal. You are getting enterprise-level tools for non-enterprise prices, and for small or medium sized businesses, chances are you wont be exceeding the free budget threshold that Google has set.\n\nDemonstrate the workload opportunity savings. If you are someone who doesn’t know SQL, but does use Excel, then the leap is not massive. SQL as a language says exactly what it is going to do, it will take time to learn, and focus to use well but the logic and the language is familiar.\n\nA good starting point is from Google’s own training platform, where you can work through modules using pre-existing BigQuery projects. The argument for investing in the upfront learning time delivering time savings down the line is compelling.\n\nShow how BigQuery is an efficiency multiplier. Once you master the learning curve, BigQuery and SQL can take repetitive tasks and automate them, freeing yourself and team members to focus on producing analysis and insights that directly impact business decisions.\n\nShow how BigQuery can answer questions that no other platform can. SQL has the flexibility to let you create top-level highlights, interrogate granular user behaviour, and stitch together data from different sources to unify your business data for a level of analysis that cannot be performed in Excel alone.\n\n\nConclusion\n\nBigQuery is a versatile tool that can transform your data analytics capabilities. Whether you’re an analyst or a marketer, the efficiencies gained from using BigQuery are substantial.\n\nIf you still have some question about BigQuery, or if you have a problem that you think BigQuery can help with but don't know where to start, then see if us here at Measurelab can help. Feel free to get in touch for a no strings attached call with one of our consultants who can help!"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/the-life-of-brian-measurelabs-generative-ai-journey/#article",
      "headline": "The life of Brian: Measurelab's generative AI journey",
      "description": "How Measurelab put our structures and policies in place around generative AI and how our exploration of the technology led us to the create Brian, our very own generative AI assistant",
      "url": "https://www.measurelab.co.uk/insights/blog/the-life-of-brian-measurelabs-generative-ai-journey/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/the-life-of-brian-measurelabs-generative-ai-journey/#webpage"
      },
      "datePublished": "2024-07-09T18:56:47.000+00:00",
      "dateModified": "2026-01-27T11:24:11.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/screenshot-2024-07-09-at-17-06-30.png",
      "author": {
        "@type": "Person",
        "name": "Matthew Hooson",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "AI & ML",
        "Measurelab",
        "Testing",
        "Google Cloud",
        "How-to"
      ],
      "articleBody": "I recently had the pleasure of attending the AI Summit London 24 which was chock full of fascinating talks, opinions and demos around AI. I heard from lots of companies in lots of industries who were all facing the same issues, “ok it ain’t going anywhere, how do we keep pace and adapt?”. It had me reminiscing about how we put our structures and policies in place around generative AI, and how our exploration of the technology led us to the create Brian, our very own generative AI assistant!\n\n\nA realisation\n\nLet's take a trip back to the distant, distant past of November 2022 when GPT 3.5 began to appear on the scene and captured public imagination. We of course had a play, commented on how impressive it all was and got on with our lives. Little did we know that was just a jab, the right hook was heading our way March 2023 when GPT-4 appeared and really blew us away. It could produce usable code, more compelling writing, hallucinated much less frequently and started to steal away a few questions from our precious Google.\n\nWhen, a few months later, the burgeoning sign of simple ‘agents’ surfaced with the introduction of GPTs, we really descended into a full on existential crisis. It wasn’t just what the models could do, it was the pace of change. In less than a year we had gone from technologically impressive novelty to the threat of autonomous AI ‘agents’ .\n\nHow, we thought, do you safely keep up with all this, and more importantly, how does Measurelab? We all have a plate full of impactful work we are delivering for clients, are we also supposed to be learning everything that is being fired at us point blank from the proverbial AI cannon? Can we ignore it? Can we afford not to be gobbling up every bit of information on the subject?\n\n\nThe genesis of Brian\n\nAll of these questions led us to write what I would describe as a bit of an internal ‘call to arms’ entitled ‘The AI Revolution & Measurelab’ (I have a flair for the dramatic). This was an honest and frank look at what we do, how we do it and how all of that could be affected by generative AI. There was a fair amount of crystal ball gazing but the conclusion was, not only could everything we do be touched by generative AI, it almost certainly would be in time. If we allowed ourselves to shut out the ‘noise’ because of overwhelm, we would almost certainly be left behind. The age of the pre-generative AI consultancy was waning.\n\nSo we began to think, what does consultancy with AI at its core look like?\n\n * It will have clear guidelines on generative AI and its use\n * It would have an understanding of the nuts and bolts of the technology\n * Its employees would be empowered to augment themselves with new solutions\n * It would have buy-in from everyone involved.\n\nSimple as that eh?\n\nIn the pursuit of our ambitious goals, we decided an internal platform for generative AI use, rules, automations, prompts and assistants was a good approach. It would not only give us a single hymn sheet from which we could all sing, but the building of it would force exploration and learning in the ever advancing field. It would provide a central place for new ideas and automations, and most importantly, it would be cute as a button.\n\nEnter Measurebot…\n\nLater renamed Measurebrain…\n\nFrequently misspelled by my dyslexia as Measurebrian\n\nFinally and thankfully renamed Brian\n\n\nDevelopment Journey\n\nBrian has made his way through a number of different iterations, each stage reflecting new knowledge and understanding and each stage unlocking more power and potential. As stated above our aim here is not to stand still once we have a v 1.0. We wanted to use the platform as a catalyst for learning and adoption, so it needed to stay up to date with the latest advances. We must never rest on our laurels.\n\nVersion 1: one model Brian\n\nThe very first version of Brian was built using Python, Flask and interacted directly with the OpenAI API. It was more complex in its structure but lighter on its features than future versions, but that is learning for you!\n\nVersion 1 had a single model (gpt-4) and a single assistant (prompted flavour of the generative AI model).\n\nVery quickly it allowed us to centralise the use of generative AI models. This was critical if we wanted to move at pace but be sure of governance and security. It also acted at an introduction to the technology for many within the company.\n\nVersion 2: automation and generative AI one stop shop\n\nAs our use of the technology and knowledge of its inner workings grew, so did the platform. Spaces were created for users to upload and share prompts, resources and to set ‘quests’ for processes to be automated or augmented with generative AI.\n\nThe number of models grew, with gpt-3.5, gpt-4 and DALL-E making appearances. We also saw the birth of new assistants, pre prompted flavours of Brian that help solve specific problems or work in specific ways (think GPTs).\n\nHere we hit our stride with what it could and could not do, unlocked new levels of collaboration and set out our ‘AI Redlines’. These redlines where guardrails designed to ensure governance and fair use while maintaining freedoms to explore.\n\nVersion 3: rip it up and start again\n\nBy this time we had begun to really explore and deliver on some generative AI based projects that had given us new knowledge and insight. To that end, barely 6 months since Brian came to be, he was rebuilt from the ground up. Gone was Flask, in came Streamlit, a lightweight python framework primarily used for data visualisation. Gone was the direct communication with OpenAI in was a framework for interaction with generative AI that opened up mountains of new opportunities, Langchain.\n\nAll of this meant we now had access to models from multiple companies; Anthropic, OpenAI and Google. It meant we could build our own tools and access a wealth of community built tools, giving Brian new and exciting capabilities (search, visualisation, API connections). In came streaming of responses for the first time, making interaction with Brian much more conversational and satisfying.\n\nThrough all of this development we flexed our GCP muscles, using the platform to manage much of the infrastructure. To name a few of these services:\n\n * Host the application (App engine),\n * Manage CI/CD (Cloud build),\n * Handle conversation history (Firestore)\n * Handle secure secret storage (Secret Manager)\n\n\nBeyond Brian\n\nAside from internal adoption and augmentation, Brian has helped us realise our goal of understanding the application of the core technology. This has allowed us to deliver on a number of projects both internally and externally. These project leveraged Brian itself and the underlying technology to solve problems in other ways. We have developed automated communication updates, connections to databases for analysis, visualisation generation engines, schema generation solutions, internal workflow automations, drafting assistants, transformation processes… I could go on and on.\n\nOne point I want to stress is that I am not advocating for wholesale automation without thought. While it is true that most things can and will be touched by the technology, it is up to you how you wield it. Decide what to augment, what to automate and what to leave alone. It’s crucial to remember that technology is a tool to complement human intelligence, not replace it. While Brian and its successors can handle a lot of heavy lifting, the strategic thinking, empathy, and ingenuity of our team remain irreplaceable.\n\nIt is also important to state this has also not been a flawless experiment. To say we have 100% adoption and augmentation would be a falsehood, but that is part of an ongoing, fast paced journey and there is still lots to learn. We are of course excited to pass all of our learnings onto our clients and the community at large.\n\nSo, as we look beyond Brian, the journey is as much about evolving our understanding and capabilities as it is about the technology itself. We are excited for what the future holds and are confident that by embracing AI, we will continue to pioneer innovative solutions, stay ahead of the curve, and deliver unparalleled value to our clients.\n\nIf you have any questions around generative AI, its adoption, or anything else, please get in touch.\n\nWritten by Matthew, approved by Brian"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/data-road-trip-journey-mindset/#article",
      "headline": "The data road trip: enjoying the journey",
      "description": "Data is a journey, not a destination. Learn how to navigate the complexities of data work by embracing flexibility and continuous improvement. Dive into practical insights on leveraging existing tools, investing in people, and appreciating partial data.",
      "url": "https://www.measurelab.co.uk/insights/blog/data-road-trip-journey-mindset/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/data-road-trip-journey-mindset/#webpage"
      },
      "datePublished": "2024-07-05T11:06:50.000+00:00",
      "dateModified": "2026-01-27T11:24:12.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/data-road-trip-enjoy-journey-1.png",
      "author": {
        "@type": "Person",
        "name": "Daniel Perry-Reed",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "BigQuery",
        "AI & ML"
      ],
      "articleBody": "In the dynamic world of analytics, it's easy for us to get caught up in the chase for the next big thing. However, it’s crucial to remember that data is not a destination but a journey. A journey mindset allows for greater flexibility and continuous improvement, which are essential in our ever-evolving field.\n\nThis post explores my thoughts on the subject, but the concept and analogy were seeded by my good friend Bhavik Patel in their post titled Data is a Road Trip… not a Destination.\n\n\nThe road trip analogy\n\n...think of Data as a Road Trip. The brain is no longer fixed on “what’s the final destination?” or “when do we need to get there?”. It even accepts that it’s a longer journey. It’s focussed on the planning of the trip. The places we are going to stop and see, the budget we have…\n\nBhavik Patel - Data is a Road Trip… not a Destination\n\nViewing data work as a road trip rather than a fixed endpoint helps us appreciate the milestones we achieve along the way. This approach allows us to adapt and evolve, ensuring that we are always moving forward, even if the ultimate destination isn't clearly defined. It’s about the journey and the insights we gather along the way.\n\n\nThe pitfalls of a destination mindset\n\n...to start with, only a handful of people know where we’re going and they haven’t really told anyone. Or they might not even know know themselves, they’ve just been told that we all have to go! They don’t really know how long it’s going to take to get there, maybe they’ve never even been before. And the time they need to arrive is fuzzy at best. This means… everyone waits until the last minute to leave. Most people don’t know why they’re going in the first place. No one plans for any disruptions to the journey and they’re view is that the length of the trip is some finite amount of time. And finally, everyone thinks that once we’re there, the journey is over.\n\nBhavik Patel - Data is a Road Trip… not a Destination\n\nA rigid, destination-focused mindset can lead to significant challenges. Organisations that fixate on a specific endpoint often overlook valuable insights that emerge during the process. This can result in frustration, especially when the anticipated \"end goal\" takes longer to achieve than expected.\n\nFor example, you may not need a perfect data warehouse to start using the GA4 data in BigQuery. Or you may not need machine learning or AI to do attribution and media mix modelling (MMM) to start optimising your marketing spend.\n\n\nEmbracing the journey\n\nIt's essential to appreciate where we are on our data journey. Organisations too often get caught up in the pursuit of advanced technologies and higher levels of data and analytics maturity, forgetting to make the most of their current tools and capabilities.\n\nI can't mention analytics maturity without plugging Mark McKenzie's book Your Data is F**Ked: For Marketers. It has been a great asset in helping me shape my thoughts on this.\n\nI also have to refer to Avinash Kaushik's 90-10 rule, which suggests that 90% of your analytics budget should be spent on people and processes. Fully leveraging existing technology and ensuring that the team can extract maximum value from it before moving on to something new is crucial. And also a large part of why analytics/data teams are too often classed as a cost center and not a profit center!\n\n\nShifting to a journey mindset\n\nHere are some practical tips to help you shift from a destination mindset to a journey mindset:\n\n 1. Ask the Right Questions: Before investing in new technology, ask yourself \"what are we going to do differently with this new tool?\". This encourages a thoughtful approach to technology investment, ensuring that any new tools genuinely add value.\n 2. Leverage Existing Tools: Make sure you are fully utilising the capabilities of your current technology. Often, organisations jump to new tools without fully exploring the potential of what they already have.\n 3. Focus on People and Processes: Invest in your team and processes. Technology is only as good as the people using it and the processes supporting it.\n 4. Adaptability: Stay flexible and open to change. The ability to pivot and adapt to new information is crucial in the fast-paced world of analytics. Especially considering the speed of change due to generative AI.\n 5. Cultural Shift: Encourage a cultural shift towards appreciating partial data. Make informed decisions based on the data at hand, rather than waiting for the \"perfect\" data set. This can lead to more timely, effective outcomes.\n\n\nFinal (for now) thoughts\n\nBy embracing the journey, we can better navigate the complexities of data work and achieve meaningful value along the way. This approach not only helps in making the most of current resources but also prepares us for future advancements.\n\nFor a deeper dive into this topic, I recommend listening/watching our episode of The Measure Pod titled #102 Data is a Road Trip, Not a Destination. Myself and Bhav discuss additional insights and real-world examples that illustrate the importance of this mindset in analytics. You can find it on Spotify and YouTube, and anywhere you get your podcasts.\n\nRemember - in the world of data, it's not just about reaching the destination but about making the most of the journey. And sometimes, someone else's destination is not where you need to be, and that's okay."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/madchester-spring-break-unconference/#article",
      "headline": "Measurelab's Madchester Spring Break Unconference",
      "description": "What connects Alexander von Humboldt, a tech stack originally called Urchin, and a TV show first aired in 2009? Obviously, the answer is the Measurelab Madchester Spring Break Unconference.",
      "url": "https://www.measurelab.co.uk/insights/blog/madchester-spring-break-unconference/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/madchester-spring-break-unconference/#webpage"
      },
      "datePublished": "2024-05-08T15:54:17.000+00:00",
      "dateModified": "2026-01-27T11:24:12.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/img_1791-scaled-e1715181543157-1.jpg",
      "author": {
        "@type": "Person",
        "name": "Hugo Jones",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Measurelab"
      ],
      "articleBody": "There are certain things that a business should measure, there’s the obvious things - money in, money out, client retention, new business leads, staffing levels and so on. Then there are the less obvious things, culture adoption, staff buy in, current capabilities, technical knowledge.\n\nIt’s all very well working, but answering the questions of what are we working for, and what are we working towards, generate insight and pathways that might have been unclear before.\n\nThe Measurelab Madchester Unconference '24 was designed to measure the less obvious things and provide data to analyse answers to the questions.\n\n\nThe Measurement Framework\n\nThe unconference takes the structure of a conference but does away with the formalised, preset sessions. Handing over the reins to employees to come up with sessions, talks and workshops. Inviting people to explore things they know, but crucially things they don't know as well.\n\nWith the framework in place, we (the Measurelab team) created ideas for sessions, topics for discussion, mini hackathons, and demonstrations.\n\nTagging up each idea with an interest score created a flexible schedule for the two days. Striking a balance between top down organisation to ensure efficient use of time, and free-form team level activity from which new ideas and ways of thinking can develop, is tricky but can be done when leadership trusts responsibility to team members.\n\n\nKey Events\n\nAs analysts we know that success can be measured. We take quantitative data, apply benchmarks and performance indicators and measure our efforts against the defined criteria.\n\nThe unconference saw 20 people make the journey to Manchester in time for lunch. Despite high chore scores for several users, and multiple different journey sources, everyone who used the train medium landed at the offices in time for activities to begin.\n\n18 sessions cocreated and generated by 20 Measurelabbers. Every session saw high user engagement, with an average engagement time of over half an hour, an incredibly low bounce rate and a strange level of squirrels.\n\nThe second day had a 100% user retention, and engagement rates every bit as high as the first day.\n\nSessions explored alternatives to the Google suite of analytics products, how best to use AI tools in day to day workflows, scoring client’s accounts on a data maturity framework, generating squirrel based data visualisations, and reflecting on the impact of remote first working practices on company culture.\n\nThe different workstreams reported back at the end of the sessions to share learnings and establish bragging rights. All while providing time to decompress, evaluate the content discussed, and take on much needed coffee and charcuterie.\n\nAs analysts we also know that success can be measured qualitatively, we have dimensions through which we can explore how well we felt the event went.\n\nWhen working remotely is the norm, it feels good to meet up in person, it feels good to share food with colleagues, and it feels good to share ideas with the team.\n\nAnd it’s still something that the business has to get used to, making in person meet ups more valuable for the different quality of engagement. So meetups can serve two purposes, building team identity, and identifying ways to improve the value of our work to our clients.\n\nAnd nothing brings people together like the intense crucible of intra-company competition.\n\n\nSocialisation\n\nDay two saw 10 teams of two taking each other on in a battle of skill, wits, teamwork, bravery, concentration, memory, wits, and determination in The Cube. Or, at least the Manchester’ Urban Playground bar equivalent of TV’s top tea time gameshow, The Cube.\n\nNever have 10 perspex boxes filled with LED lights and childrens games been so hotly contested. The points won across 6 intense rounds of Cube on Cube competition are only one metric for keeping score of who wins and who loses. Ultimately the real winner was Measurelab as a whole.\n\n\nAnalysis\n\nOur initial framework allows us to apply a mixed attribution model for the overall success of the event.\n\nWe can credit the overall idea for the structure of the two days. An event like this requires a structure and level of organisation to allow for the time away from working for clients to be well spent, but also the freedom and space for ideas and discussions to emerge that ultimately drive new business ideas and value propositions.\n\nWe can credit the fun activities that bring team members together to foster better cooperation on future projects. We can look at the ideas generated, the new perspectives and shared knowledge that will help client relationships, improve the quality of work and increase the persuasiveness of our offering.\n\nBut it is each one of us who can claim the most credit, for engaging with the task - to build our own agenda, generate our own set of learnings, and reward the risk taken in focusing on the internals of the business for two days. Nurturing an environment where anyone can contribute requires everyone to lean in and contribute to that environment, and generally being a very decent group of people all working towards a common goal."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/sound-bite-the-future-of-attribution-modelling-in-google-analytics/#article",
      "headline": "Sound Bite: The future of attribution modelling in Google Analytics",
      "description": "Episode Summary:\n\nIn this weeks sound bite (from the archive) Dan discussed the end of rules-based attribution in Google Analytics 4. He reflects on the shift from Universal Analytics to GA4, highlighting the focus on data-driven attribution and the removal of other attribution models. He also explo",
      "url": "https://www.measurelab.co.uk/insights/blog/sound-bite-the-future-of-attribution-modelling-in-google-analytics/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/sound-bite-the-future-of-attribution-modelling-in-google-analytics/#webpage"
      },
      "datePublished": "2024-04-03T08:30:00.000+00:00",
      "dateModified": "2024-04-03T08:30:00.000+00:00",
      "author": {
        "@type": "Person",
        "name": "Will Hayes",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics"
      ],
      "articleBody": ""
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/sound-bite-how-to-approach-building-a-dashboard/#article",
      "headline": "Sound Bite: How to approach building a dashboard",
      "description": "Episode Summary:\n\nIn this weeks sound bite (from the archive) Dara discusses the process of building out automated dashboards. This includes everything  from the initial wire-framing, the creation, and potential iterations you might need to make a long the way. Check out the full episode on how to b",
      "url": "https://www.measurelab.co.uk/insights/blog/sound-bite-how-to-approach-building-a-dashboard/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/sound-bite-how-to-approach-building-a-dashboard/#webpage"
      },
      "datePublished": "2024-03-27T08:00:00.000+00:00",
      "dateModified": "2024-03-27T08:00:00.000+00:00",
      "author": {
        "@type": "Person",
        "name": "Will Hayes",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Looker Studio"
      ],
      "articleBody": ""
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/customer-data-platforms/#article",
      "headline": "Customer Data Platforms (CDPs)",
      "description": "Our take on CDPs\n\nWe’ve been around long enough to have seen the bandwagon-jumping that inevitably happens with any new tech trend as it travels the hype cycle. Right now, Customer Data Platforms (CDPs) are reaching the peak of inflated expectations - and are at risk of descending into the trough of disillusionment.\n\nMeasurelab doesn’t resell technology licences and we don’t rake in money from vendor kick-backs. So we’re happy to tell it like it is.\n\nIf you haven’t already got a CDP, you may not",
      "url": "https://www.measurelab.co.uk/insights/blog/customer-data-platforms/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/customer-data-platforms/#webpage"
      },
      "datePublished": "2024-03-14T14:45:55.000+00:00",
      "dateModified": "2025-07-31T20:35:24.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/cdp_-_blog-1.png",
      "author": {
        "@type": "Person",
        "name": "Matthew Hooson",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Cloud"
      ],
      "articleBody": "Our take on CDPs\n\nWe’ve been around long enough to have seen the bandwagon-jumping that inevitably happens with any new tech trend as it travels the hype cycle. Right now, Customer Data Platforms (CDPs) are reaching the peak of inflated expectations - and are at risk of descending into the trough of disillusionment.\n\nMeasurelab doesn’t resell technology licences and we don’t rake in money from vendor kick-backs. So we’re happy to tell it like it is.\n\nIf you haven’t already got a CDP, you may not actually need to buy one. There, we said it. And if you’ve already made the leap, there may be a faster way to get a return on the investment.\n\nOf course, having all your data unified, trusted, readily accessible, easily exported into other systems and actively used is desirable. But it doesn’t have to be all your data, all at once. And you may not need to buy new technology to get there.\n\n\nAn agile approach\n\nOur agile approach prioritises speed and impact. We try to avoid over-planned analytics initiatives and long-term strategic roadmaps. The technology underpinning CDPs is constantly changing and marketing tends to move faster than the data infrastructure that’s designed to support it.\n\nWith this in mind, here are ten guiding principles for any CDP-like initiative.\n\n 1.  Start with a small number of quick wins. It may help to think of these as “user stories” or data products/services as this ensures focus on the business value to be delivered. Start with those that have the potential to deliver high impact with minimal effort.\n 2.  See if it’s possible to deliver on these initial requirements with existing technology and data that’s readily accessible so as to accelerate the ‘time to value’.\n 3.  Explore the data set early in the process. Download a sample and get someone looking into it. Don’t make the mistake of assuming the data is going to be complete or rich enough to deliver on your requirements.\n 4.  Unless you already have a CDP, start with a composable solution built on readily available and widely-supported technologies (our go-to is the Google Cloud Platform). Architect with scalability and security in mind.\n 5.  Consider up-front who is going to own and support the technology on an ongoing basis. Think hard before going with a niche vendor or one without a partner network that gives you multiple options for support.\n 6.  Take an incremental approach to ingesting data. Start with maybe two or three priority data sources that support the creation of the data products or services that will give you immediate returns. Extract value and then add more over time as further use cases emerge.\n 7.  Ensure you follow good data governance practices and monitor data feeds to ensure integrity on an ongoing basis. Make an allowance for the time it takes to proactively monitor and maintain products.\n 8.  Get a working prototype in the hands of end users as early as possible. There’s a good chance that what they said they wanted isn’t what they actually wanted. Best find out early if that’s the case.\n 9.  Set time and budget aside to create the necessary documentation, and to train and enable users so they understand how they can use the data, insights and activations and integrate them into their daily workflow.\n 10. Don’t make the assumption end-users are actively using the data products and services you build. Monitor usage and be prepared to kill products that aren’t being used in order to free up time and resources so you can pivot towards new use cases that emerge.\n\nWhen it comes to Customer Data Platforms, Measurelab advocates for an agile approach. By starting with the end-goal, using existing technology where possible, and adopting an iterative agile process, you can start to see the benefits of data-driven insights and activations, while minimising the risk of an overblown, over-budget initiative. Get in touch with one of our consultants if you’d like to discuss your requirements."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/grand-designs-data-warehouse-cdp/#article",
      "headline": "Grand Designs: \"The Warehouse to CDP conversion\"",
      "description": "Opening scene: A large meeting room at BigCorp. A systems architecture diagram with lots of boxes and arrows flowing from left to right fills a large whiteboard. Kelvin joins Jan (marketing director) and Joe (head of data) at the table, earnest expression, hands clasped in front of him.\n\nKelvin: So, Jan, Joe, tell me a bit about the history of the warehouse.\n\nJoe: Well, going way back, it was originally an on-prem system, which was replaced back in 2019 with an Oracle data warehouse as part of a",
      "url": "https://www.measurelab.co.uk/insights/blog/grand-designs-data-warehouse-cdp/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/grand-designs-data-warehouse-cdp/#webpage"
      },
      "datePublished": "2024-03-14T10:46:36.000+00:00",
      "dateModified": "2026-01-27T11:24:12.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/grand-designs-blog-post-5-1-1.png",
      "author": {
        "@type": "Person",
        "name": "Steven Elliott",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Data Analysis",
        "Looker Studio",
        "BigQuery",
        "Privacy",
        "Ecommerce"
      ],
      "articleBody": "Opening scene: A large meeting room at BigCorp. A systems architecture diagram with lots of boxes and arrows flowing from left to right fills a large whiteboard. Kelvin joins Jan (marketing director) and Joe (head of data) at the table, earnest expression, hands clasped in front of him.\n\nKelvin: So, Jan, Joe, tell me a bit about the history of the warehouse.\n\nJoe: Well, going way back, it was originally an on-prem system, which was replaced back in 2019 with an Oracle data warehouse as part of an aborted single customer view initiative.\n\nJan: It’s full of crap to be honest. We have to go to IT to get anything done - and nobody uses it, apart from this one dashboard.\n\nJoe: Somebody uses that??\n\nThey all laugh. Kelvin stands and walks to the whiteboard. Jan and Joe follow. Kelvin motions at the diagram with a flourish.\n\nKelvin: So, who’s the mastermind behind all this?\n\nJan: Joe’s architected it mostly. He actually plans to project manage it himself too, which should save us some money.\n\nJoe: I’m treating Jan as if she’s my internal customer. And she’s certainly a demanding one! Hahaha\n\nJan: Our data is holding us back. And everyone seems to be saying a CDP is the answer. All this talk of personalisation at scale and AI... Honestly, I'd be happy if someone could just tell me which of our channels are working!\n\nKelvin points to the boxes on the left hand side of the whiteboard diagram.\n\nKelvin: I just love the ambition of this project - web and app data, ads data, social, search, CRM - and SAP? Amazing! I presume you have consent to use all this customer data?\n\nAwkward silence. Joe and Jan look at each other.\n\nJoe: Jan was taking care of all that with the privacy team.\n\nJan: I thought you were looking into it.\n\nKelvin: Ahem... Now, every build has its crowning glory - what’s the feature you’re most excited about?\n\nJoe: We've found a new AI-based identity resolution solution to stitch customer profiles together - it looks very exciting.\n\nKelvin: Of course you know what I’m going to ask next. What have you budgeted for the project? And when will you go live?\n\nJan: We absolutely have to have this in place before Christmas - it’s our busiest season.\n\nJoe: I’m confident. Trust the process!\n\nKelvin: I have to take my hat off to you guys. This is incredibly brave.\n\n.....\n\nCut to Kelvin walking towards camera through the actual warehouse of BigCorp, fingers steepled in front of his chest..\n\nKelvin: For Joe and Jan this endeavour is akin to embroidering delicate, digital lace onto a well-worn, industrial fabric. Their artisan aspirations are commendable, but the threads of reality seem extraordinarily tenuous.\n\n\nNine months later\n\nKelvin joins Jan and Joe back at the same BigCorp meeting table. Both are looking pale, drawn and exhausted. A crude drawing of male genitalia has appeared in one corner of the solution architecture diagram.\n\nKelvin: Jan, Joe, tell me: how’s it going?\n\nAwkward silence before Jan and Joe start speaking simultaneously.\n\nJan: Well, it took us three months to sort out the consent issue.\n\nJoe: Haha, yeah and by then of course Apple and Meta had changed their policies again.\n\nJan: Then when we started looking at the data we realised it was all a complete mess.\n\nJoe: To be fair, we really couldn’t have anticipated that - you just don’t know what you’re going to find until you “take up the floorboards”!\n\nJan: The devs were pulled on to a big re-platforming project, so getting this prioritised has been a nightmare.\n\nJoe: Then the startup we’d selected for the identity resolution piece was acquired by a competitor.\n\nKelvin: So have you actually got any data in yet?\n\nJoe and Jan: Errr, no.\n\n.....\n\nCut to Kelvin, Jan and Joe sat in front of a screen displaying BigCorp’s ecommerce store. It’s already dark outside. Snow can be seen softly falling through the window.\n\nKelvin: I know you wanted to be in before Christmas. How are you measuring your marketing right now? And how are you doing for budget?\n\nJan: We’re making do with a dashboard that Joe’s connected to a Google sheet. It's good enough for now - once it actually loads!\n\nJoe: We’re already into our contingency budget, but it’s all so exciting. We’re very excited.\n\nKelvin smiles smugly, then turns to Jan. As the camera pans away, we notice for the first time she has a visible bump.\n\nKelvin: And you’ve had some other exciting news, Jan. When’s the new arrival due?\n\nJan: Easter, about a month before we hope to go live. But I’m planning to keep working right up till then.\n\nKelvin: Amazing.\n\n.....\n\nCut to Kelvin, in an uncomfortably deep squat next to a BigCorp sign on a grassy mound near the car park.\n\nKelvin: This Customer Data Platform is emerging as a kaleidoscope, where each fragment of the old structure refracts into a spectrum of modern possibilities. Jan and  Joe are painting a futuristic mural on an ancient, flaking wall. Their artistic ambition is admirable, but one can't help but wonder if the paint will hold.\n\n\nAnother 9 months elapse\n\nKelvin presses the entry buzzer at BigCorp. Joe and Jan welcome him. Both have visibly aged. Joe has grown a silver-streaked beard. Jan now wears glasses. The three share an uncomfortable embrace.\n\nKelvin: Joe, Jan, tell me about life with your new CDP!\n\nJan: Well, it’s still a bit of a work in progress. But by the time summer came around we really felt we really had to start using it somehow.\n\nKelvin: Marvellous. And what are you actually doing with it?\n\nJoe: Well, there’s loads of exciting stuff planned. We’re really excited about it.\n\nJan: For now we just have this Looker Studio dashboard.\n\nThey proudly show Kelvin the dashboard, which features some filters and a colourful plot chart.\n\nKelvin: Unbelievable. So, you’re finally able to understand what’s working and what’s not?\n\nJan and Joe exchange a look. Silence.\n\nKelvin: You started out with a budget of £300,000. How much did you actually end up spending?\n\nJoe: It’s fair to say the project has expanded in scope along the way so it’s very difficult to say.\n\nJan: About double that so far.\n\nKelvin: And big news for you personally, I believe Joe?\n\nJoe: Yes - Jan and I are going to be separating. I’ve accepted a new job over at BiggerCorp.\n\nKelvin: So Jan, it’s all on you now, what’s next on the roadmap?\n\nJan: Well, the budget's exhausted and there’s a headcount freeze, so we’re going to have to wait until next financial year to free up funds. Plus we just found out this morning that the CEO has signed a multi-million dollar contract with Accenture for a huge digital transformation initiative. They’re actually kicking off their six month discovery phase next week. 187 stakeholder interviews!\n\n.....\n\nCut to Kelvin walking away from the BigCorp office, a drone shot pulls away to reveal a panoramic view of the building with Joe and Jan waving from the front entrance. Kelvin holds his arms out wide.\n\nKelvin: Transforming a dull, lifeless data warehouse into a living, breathing customer data platform has been like a pair of alchemists turning lead into gold. The CDP a time capsule burst open, its contents - once static and forgotten - are now sparkling with the future promise of rich insights and dazzling activations.\n\n\nClosing credits\n\nMake sure you join Kelvin again in next week’s Grand Designs as he follows Bo and Ben as they roll out their data democratisation initiative across 17 European markets, arming 1300 every-day users with actionable insights.\n\nAnd if you’d like to know how things might have worked out differently for Jan and Joe if they’d worked with Measurelab, take a look at our iterative approach to building CDPs here."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/sound-bite-building-deeper-relationships-through-personalisation/#article",
      "headline": "Sound Bite: Building deeper relationships through personalisation",
      "description": "Episode Summary:\n\nIn this weeks sound bite (from the archive) we revisit a conversation with David Mannheim from August 2023, diving into the topic of personalisation. David discusses how personalisation goes beyond just a recommendation engine, emphasising its role in building deeper connections wi",
      "url": "https://www.measurelab.co.uk/insights/blog/sound-bite-building-deeper-relationships-through-personalisation/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/sound-bite-building-deeper-relationships-through-personalisation/#webpage"
      },
      "datePublished": "2024-03-06T10:21:44.000+00:00",
      "dateModified": "2024-03-06T10:21:44.000+00:00",
      "author": {
        "@type": "Person",
        "name": "Will Hayes",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "articleBody": ""
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/sound-bite-how-can-personalisation-drive-lasting-value/#article",
      "headline": "Sound Bite: How can personalisation drive lasting value?",
      "description": "Episode Summary:\n\nIn this weeks sound bite (from the archive) Dan & Dara spoke with Rasmus Houlind from Agillic. They chat about what personalisation entails, the distinctions between implicit and explicit personalisation, the ownership of the customer journey by the customer, and the adaptation of ",
      "url": "https://www.measurelab.co.uk/insights/blog/sound-bite-how-can-personalisation-drive-lasting-value/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/sound-bite-how-can-personalisation-drive-lasting-value/#webpage"
      },
      "datePublished": "2024-02-21T07:30:00.000+00:00",
      "dateModified": "2024-02-21T07:30:00.000+00:00",
      "author": {
        "@type": "Person",
        "name": "Will Hayes",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "articleBody": ""
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/success-stories/howard-kennedy-ga4-data-content-performance-reporting/#article",
      "headline": "GA4 content performance reporting: Howard Kennedy success story",
      "description": "Howard Kennedy LLP is a London based, full-service law firm with nearly 200 lawyers in one location. They specialise in providing straightforward advice to entrepreneurial businesses and individuals on domestic and international matters.\n\n\nThe challenge\n\nHoward Kennedy creates various ‘Hot Topic’ campaign pages featuring videos, podcasts, and articles. Despite tracking these pages with Google Analytics 4, the performance data was not directly available to campaign managers or lawyers. The object",
      "url": "https://www.measurelab.co.uk/insights/success-stories/howard-kennedy-ga4-data-content-performance-reporting/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/success-stories/howard-kennedy-ga4-data-content-performance-reporting/#webpage"
      },
      "datePublished": "2024-02-07T10:56:00.000+00:00",
      "dateModified": "2025-12-10T01:28:59.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/08/4.png",
      "author": {
        "@type": "Person",
        "name": "Mark Rochefort",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Looker Studio"
      ],
      "articleBody": "Howard Kennedy LLP is a London based, full-service law firm with nearly 200 lawyers in one location. They specialise in providing straightforward advice to entrepreneurial businesses and individuals on domestic and international matters.\n\n\nThe challenge\n\nHoward Kennedy creates various ‘Hot Topic’ campaign pages featuring videos, podcasts, and articles. Despite tracking these pages with Google Analytics 4, the performance data was not directly available to campaign managers or lawyers. The objective was to develop an automated Looker Studio dashboard that would distill GA4 performance data into easily understandable KPIs for all stakeholders.\n\n\nThe solution\n\nBefore creating a Looker Studio dashboard for Howard Kennedy, a planning session was held with key stakeholders to identify important metrics and user needs. A preliminary dashboard design was presented for feedback, which informed further refinements, including aesthetic and usability enhancements, resulting in a more intuitive and user-friendly interface.\n\n\nThe results\n\nWith their first fully automated campaign dashboard in place, it has reduced the burden of manually pulling the metrics directly from Google Analytics 4, as well as being able to now share the data across the business for their colleagues to self-serve their own data and insights during their most recent campaign. \n\n\nWhat’s next?\n\nBy leveraging this data, Howard Kennedy seeks to gain valuable insights into what hot topic pages work better than others, and how much their paid, organic and social marketing activity plays a role to better invest in the right areas."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/sound-bite-how-has-the-role-of-data-changed-over-time/#article",
      "headline": "Sound Bite: How has the role of data changed over time?",
      "description": "Episode Summary:\n\nIn this weeks sound bite (from the archive) Dan & Dara spoke with Jim Sterne from Target Marketing. He specifically discusses the changes in online marketing and data since the 1990s.\n\nFull episode here: https://shorturl.at/euwI1\n\n-----\n\nAbout The Measure Pod:\n\nThe Measure Pod is a",
      "url": "https://www.measurelab.co.uk/insights/blog/sound-bite-how-has-the-role-of-data-changed-over-time/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/sound-bite-how-has-the-role-of-data-changed-over-time/#webpage"
      },
      "datePublished": "2024-01-31T08:00:00.000+00:00",
      "dateModified": "2024-01-31T08:00:00.000+00:00",
      "author": {
        "@type": "Person",
        "name": "Will Hayes",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "articleBody": ""
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/sound-bite-how-can-we-improve-accessibility-on-the-web/#article",
      "headline": "Sound Bite: How can we improve accessibility on the web?",
      "description": "Episode Summary:\n\nIn this weeks sound bite (from the archive) Dan & Dara spoke with Ellen Cole from Little Seed Group. Ellen shared insights on working with invisible differences and offers tips for businesses to enhance inclusivity in their social media and marketing efforts.\n\nFull episode here: ht",
      "url": "https://www.measurelab.co.uk/insights/blog/sound-bite-how-can-we-improve-accessibility-on-the-web/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/sound-bite-how-can-we-improve-accessibility-on-the-web/#webpage"
      },
      "datePublished": "2024-01-17T08:30:00.000+00:00",
      "dateModified": "2024-01-17T08:30:00.000+00:00",
      "author": {
        "@type": "Person",
        "name": "Will Hayes",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "articleBody": ""
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/sound-bite-costs-and-considerations-when-migrating-to-server-side-gtm/#article",
      "headline": "Sound Bite: Costs and considerations when migrating to server-side GTM",
      "description": "Episode Summary:\n\nIn this weeks sound bite (from the archive) Dan & Dara spoke with our very own Matt Hooson, the Data Engineering Lead here at Measurelab. In this clip taken from episode 74 we discuss the update framework he's developed, and the costs and considerations when migrating to server-sid",
      "url": "https://www.measurelab.co.uk/insights/blog/sound-bite-costs-and-considerations-when-migrating-to-server-side-gtm/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/sound-bite-costs-and-considerations-when-migrating-to-server-side-gtm/#webpage"
      },
      "datePublished": "2024-01-10T08:30:00.000+00:00",
      "dateModified": "2024-01-10T08:30:00.000+00:00",
      "author": {
        "@type": "Person",
        "name": "Will Hayes",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Tag Manager",
        "Server-side Tagging"
      ],
      "articleBody": ""
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/sound-bite-ga4-vs-bigquery-data-what-are-the-use-cases/#article",
      "headline": "Sound Bite: GA4 vs BigQuery data, what are the use cases?",
      "description": "Episode Summary:\n\nIn this weeks sound bite (from the archive) Dan & Dara spoke with Johan van de Werken from GA4BigQuery.com. In this clip taken from episode 72 we discuss the use cases for using the GA4 interface over BigQuery data, and some thoughts around where that's going in the future.\n\nFull e",
      "url": "https://www.measurelab.co.uk/insights/blog/sound-bite-ga4-vs-bigquery-data-what-are-the-use-cases/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/sound-bite-ga4-vs-bigquery-data-what-are-the-use-cases/#webpage"
      },
      "datePublished": "2024-01-03T07:30:00.000+00:00",
      "dateModified": "2024-01-03T07:30:00.000+00:00",
      "author": {
        "@type": "Person",
        "name": "Will Hayes",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "BigQuery",
        "Google Analytics"
      ],
      "articleBody": ""
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/2023-measurelabs-year-in-review/#article",
      "headline": "2023: Measurelab's year in review",
      "description": "2023 was a momentous year for Measurelab. It marked a decade of delivering analytics excellence to the world, a year when we were named one of the UK’s best places to work and became a fully-certified GCP partner, a summer that saw the sunsetting of Universal Analytics, followed by the new dawn of generative AI and the beginning of an augmented analytics era.\n\n\nInto the sunset\n\nFrom the very beginning of January, right up to the deprecation deadline of July 1st, we were swamped with GA4 migratio",
      "url": "https://www.measurelab.co.uk/insights/blog/2023-measurelabs-year-in-review/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/2023-measurelabs-year-in-review/#webpage"
      },
      "datePublished": "2023-12-22T11:24:26.000+00:00",
      "dateModified": "2026-01-27T11:24:14.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/image-13.png",
      "author": {
        "@type": "Person",
        "name": "Steven Elliott",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "BigQuery",
        "Privacy",
        "Debugging",
        "Google Cloud",
        "SQL",
        "AI & ML"
      ],
      "articleBody": "2023 was a momentous year for Measurelab. It marked a decade of delivering analytics excellence to the world, a year when we were named one of the UK’s best places to work and became a fully-certified GCP partner, a summer that saw the sunsetting of Universal Analytics, followed by the new dawn of generative AI and the beginning of an augmented analytics era.\n\n\nInto the sunset\n\nFrom the very beginning of January, right up to the deprecation deadline of July 1st, we were swamped with GA4 migration projects. We just couldn’t hire quickly enough and even had to turn business away (gutted). Thankfully, all you 360 customers have had another 12 months to plan and prepare, so there won’t be a similar rush in the run up to July next year, right? Right?\n\nBesides migrating new customers to GA4, we were helping our existing ones get more from the platform. Either through the adoption of advanced features, or by streaming the data into BigQuery for more advanced SQL analysis, modelling and activation - never missing the opportunity to flex our newly-certified cloud engineering and machine learning muscles (nice work Matthew and Elisa).\n\nApril saw the launch of our first six-week GA4 Immersion course, with 41 lucky learners joining the first cohort. This was a true labour of love on Dan’s part, with over six and a half hours of video instruction recorded, plus 79 specially produced website resources. More than 850 people have completed our CPD-accredited Google Analytics 4 courses this year alone.\n\nAnd when we weren’t implementing or training people on GA4, we were writing and talking about it. Perhaps unsurprisingly, 2023’s most popular blog was Nasima’s What is a ‘User’ in GA4?, closely followed by Katie’s piece on How to debug your SQL in BigQuery and Dan’s seminal work on GA4 property and data stream setup best practices. With new co-host Bhav joining the Measure Pod, our most listened-to episode was the one about personalisation with Rasmus Houlind from Agillic. The conversation with Johan van der Werken, the brains behind GA4BigQuery.com a very worthy runner up.\n\n\nWelcoming new arrivals\n\nOver the course of the year we saw some lovely new clients arrive. Among them: Salesforce, the University of the Arts London (UAL), Cambridge University Press, Pod Point, Cytoplan, SecondSale, Scientific American and most recently, The Brain Tumour Charity. We were delighted to see our engagements with Google, EDF Energy and Springer Nature all grow, while we also bade a fond farewell to a few clients too. Happy to say they left on good terms - and with much-improved analytics implementations.\n\nThe growth (25% up on last year) meant we were able to bring some new people on board. We welcomed the supremely talented Olade, Chanté and Máté to the team, supplemented by some fantastic freelance support from Adam, Andy, Graham and Stacey, and our first full-time marketer and pod producer, Will. And let’s not forget the two gorgeous Measurebabies who made an entrance in 2023 - Zoe and Alfie.\n\n\nThe social highlights\n\nOne of the proudest moments of 2023 came when we were named one of the UK’s Best Places to Work by the Sunday Times. The list is compiled using anonymous feedback volunteered by employees, so it’s a really meaningful gauge of how people feel about working here. And the outcome is a glowing reflection of the culture that Mark and Dara have created.\n\nThat culture is most evident when we’re able to get together in-person and there were plenty of opportunities through the year thanks to the efforts of our social schemers who had us chuckling at comedy nights, smashing sixes, escaping rooms, gaming, puzzling and guzzling at various get-togethers.\n\nSpring saw the entire company descend upon London for our inaugural Innovation Day, a high octane blend of Y-combinator’s famed demo day and colouring-in time at the local pre-school. At our summer gathering in Greenwich, we marvelled at the Painted Hall, gazed the heavens above at the observatory, and strolled hand-in-hand together through the park. The early autumn heralded MeasureStock. Twenty or so happy campers (and one or two slightly tired and grumpy ones) brought together in a field in Sussex, bonding around a campfire, with excursions to the go-karting track, driving range and a country pub.\n\n\nAn unfortunate episode\n\nIt wasn’t all sunshine, rainbows and toasted marshmallows though. After a first half of plentiful work, we experienced a tricky post-summer slowdown that sadly led to us having to make some redundancies - the first (and hopefully last) time this has happened at Measurelab. It would be easy to edit this bit out - it was an incredibly tough period for those involved in the process. But it’s part of the story and thankfully the great people who left the business have since secured new roles. We wish them the very best in 2024.\n\n\nFacing the future\n\nSpeaking of 2024, it’s just around the corner. And if you thought 2023 was eventful…\n\nThe focus of our FY24 kick off in November was AI (what else?) with Mark’s AI challenge. The announcements of custom GPTs and Assistants API the day before at OpenAI DevDay triggered a mix of anxiety and excitement, followed by a wave of innovative energy, culminating in the creation of the MeasureBrain, a.k.a. Brian, our new friendly neighbourhood AI assistant.\n\nElisa, Matthew, Victor, Katie, Scott and scooped this year’s company values awards. Next year we’ll be celebrating the team members who’ve shown the most initiative, support and adaptability - a new trio of values decided by the people, for the people.\n\nBack in the non-artificial world, the gradual deprecation of third-party cookies in Chrome begins in 2024 Q1, which will have a lot of organisations thinking hard about their first-party data strategies. Based on current client demand and the rapid repositioning of various vendors, not least Google, Customer Data Platforms could well be challenging AI’s claim to be the next big thing.\n\nThankfully, we’ve got a few days off before we dive back into all that malarkey. Precious time to panic-buy presents, bicker with loved ones and gorge on mince pies. We’ll be back in 2024, a little plumper perhaps, but still hungry and dishing up more data-driven delights. Toodle-pip."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/sound-bite-neurodiversity-in-data-technology-and-it/#article",
      "headline": "Sound Bite: Neurodiversity in data, technology and IT",
      "description": "Episode Summary:\n\nIn this weeks sound bite (from the archive) Dan & Dara spoke with Marc Crawley from Diversita, a recruitment company that specialises in advising and empowering neurodivergent data, technology and IT professionals.\n\nFull episode here: https://shorturl.at/fsyHQ\n\n-----\n\nAbout The Mea",
      "url": "https://www.measurelab.co.uk/insights/blog/sound-bite-neurodiversity-in-data-technology-and-it/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/sound-bite-neurodiversity-in-data-technology-and-it/#webpage"
      },
      "datePublished": "2023-12-20T07:30:00.000+00:00",
      "dateModified": "2023-12-20T07:30:00.000+00:00",
      "author": {
        "@type": "Person",
        "name": "Will Hayes",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "articleBody": ""
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/sound-bite-what-are-the-differences-between-eprivacy-and-gdpr/#article",
      "headline": "Sound Bite: What are the differences between ePrivacy and GDPR?",
      "description": "Episode Summary:\n\nIn this weeks sound bite (from the archive) Dan & Dara spoke with Rowenna Fielding, a data privacy expert. She discusses the difference between ePrivacy and GDPR, as well as debunking cookie consent. \n\nFull episode here: https://shorturl.at/mxTW5\n\n-----\n\nAbout The Measure Pod:\n\nThe",
      "url": "https://www.measurelab.co.uk/insights/blog/sound-bite-what-are-the-differences-between-eprivacy-and-gdpr/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/sound-bite-what-are-the-differences-between-eprivacy-and-gdpr/#webpage"
      },
      "datePublished": "2023-12-13T07:30:00.000+00:00",
      "dateModified": "2023-12-13T07:30:00.000+00:00",
      "author": {
        "@type": "Person",
        "name": "Will Hayes",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Privacy"
      ],
      "articleBody": ""
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/ai-augmented-era/#article",
      "headline": "Measurelab and AI: welcome to the augmented era",
      "description": "There’s nowhere you can hide from AI at the moment. And the Measured Opinions blog is no exception. Here’s what’s changing at Measurelab. And what’s going to remain reassuringly familiar.",
      "url": "https://www.measurelab.co.uk/insights/blog/ai-augmented-era/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/ai-augmented-era/#webpage"
      },
      "datePublished": "2023-12-06T11:30:35.000+00:00",
      "dateModified": "2025-07-31T22:42:41.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/ml_privacy-blog_1200x400-blog-1.png",
      "author": {
        "@type": "Person",
        "name": "Steven Elliott",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Measurelab",
        "AI & ML",
        "Google Analytics",
        "Looker Studio",
        "Data Analysis",
        "Google Cloud"
      ],
      "articleBody": "The time traveller’s blight\n\nHave you experienced Chrononaut Syndrome? It happens when you venture down the generative AI rabbit hole. When you get a glimpse of the future and see things you can’t unsee. When you witness some of the wonders already being created and consider, for just a moment, where it’s all going to go next.\n\nThen you return to your present day reality.\n\nSure, you can create that first draft of the doc in ChatGPT, magic up an amusing image in DALL·E, or even drop a csv into Data Analysis and get some initial insights. It’s clever enough. But when it comes to the crunch, you find yourself using the same trusted tools and time-honoured techniques. And it feels like you’re back in the stone age, impatiently banging two rocks together and hoping for a spark, while the clouds gather ominously in the distance.\n\nSe acerca una tormenta. There's a storm coming. It’s going to blow in very fast. And it’s going to change everything in the world of data and analytics.\n\n\n\nEntering the augmented era\n\nGPTs are only the start. Maybe even a distraction? The real change comes when AI is embedded in every tool we use. We’re going to be living in an augmented era - beneficiaries of an AI arms race that’s placing weapons-grade data and analytics capabilities in the hands of a community still figuring out where exactly sessions went in GA4.\n\nMeasurelab is certainly going to need to evolve to make the most of the opportunity. We need to remain invaluable partners to our clients - navigating them through the change. And we have to stay ahead of current and new competitors, some of whom may be available 24/7, work at lightning fast speeds, and be summoned via a prompt.\n\nBeing relatively small in size and fully-focused on one discipline works in our favour. Thankfully we’re spinning the steering wheel of a speedboat, not turning a tanker in a tsunami.\n\n\nStrengths stay constant\n\nBesides, not everything needs to change. Some business fundamentals still serve us well.\n\nCertified expertise: Our core toolset will essentially remain the same. It's just that those tools are about to get way way more powerful. We have the advantage of being certified Google Marketing Platform and Google Cloud Platform partners, while retaining the flexibility to plug any gaps with third party solutions. Google has everything to gain from rapidly integrating AI capabilities into the GMP and GCP - and billions to lose if they don’t. History suggests they’ll quickly imitate or acquire any new AI tech that gets traction.\n\nComplex customers: We’ll continue to work with large organisations dealing with a sprawling digital and data estate, multiple stakeholder groups and competing priorities. Companies whose needs are not well-served by out-of-the-box, one-size-fits-all solutions. We have the agility to act as a special ops team for analytics teams that have their hands full dealing with business-as-usual dashboard demands.\n\nAn enduring promise: Our essential customer promise stays the same: trust in data. Trust that underpins the ability to act with conviction, automate with confidence - and now unleash AI. Just as people will increasingly turn to trusted news organisations as a source of verified truth, we foresee a growing demand for analytics experts willing to vouch for the veracity of data.\n\n\nRinging the changes\n\nThat said, we’re going to have to change the way we think about data and analytics - or at least think a lot faster.\n\nA growth mindset: It starts with our company values and the behaviours they promote. We came together as a team earlier this month to reflect on the characteristics necessary for Measurelab to thrive in this brave new world. We agreed that showing initiative, supporting each other and being adaptable were the three key traits we wanted to celebrate, reward and recruit for. More on that in another post.\n\nAccelerated learning: Lots to learn. What’s new? We’ve always been a learning organisation. Our strategy since day one has been to acquire, apply and share new knowledge and skills with each other and the world. The difference is we now need to do this at 1.5x speed. To help facilitate this, we've given everyone a target of spending one day a week on professional and product development. And we’ll be measuring and reporting on this too.\n\nAvoiding overwhelm: The risk of AI-induced anxiety is real. So much to keep up with. To help people choose how and when to engage, we’re classifying AI-related information and activity at three levels. Sharing and discussing AI updates, announcements and oddities is optional; participating in activities and exercises for learning is encouraged; while adopting proven AI-enabled working practices and complying with policies designed to safeguard client data and the integrity of our work is strictly enforced.\n\n\nIt’s all about the work\n\nOur processes and product is where we’ll see the most dramatic shifts. Here's how we're categorising the effort.\n\nLeaning on assistive AI: GPT-4 for the early-adopters, 3.5 for the laggards, Copilot on GitHub, Duet AI in Google Workspace, Fireflies.ai, Otter.ai and even a solitary Claude.ai user - bless. Have we seen efficiency gains? Probably. Hard to tell for sure. At this point it’s more about getting people used to new interfaces and ways of doing things. Seeing AI as a friend, not a threat.\n\nIntegrating agents and automation: To expedite and enhance our existing delivery processes we're working on AI-driven shortcuts to speed Jira ticket creation, adding AI-generated recommendations to our automated audit tools, creating custom GPTs to generate data layer specifications, experimenting with Sphinx Mind, Zenlytics and Delphi for augmented analysis... We’re going to need a bigger backlog.\n\nAdopting AI features: All the while we’re monitoring the GMP and GCP roadmaps for the almost-daily release of new AI-enabled functionality. We need to be quick to understand them internally, equipped to implement on behalf of clients and able to train others. The pace of change is likely to mean any traditional training course will be out of date the moment it’s finished, so we’ll be exploring an ongoing approach to knowledge transfer.\n\nAI-ready infrastructure: Then of course there’s the opportunity - and with it the responsibility - of building scalable, secure, future-proofed analytics infrastructure for our clients, with all the necessary ontology, observability and controls necessary to safeguard the quality of AI-generated outputs.\n\nAI as a managed service: In the next year, we expect to find ourselves managing the entire lifecycle of AI products on behalf of customers. Identifying use cases that can transform marketing and customer experience, implementing the POCs, building, training, maintaining and refreshing AI models, and measuring their effectiveness and business impact.\n\n\nThe time is now\n\nAmara’s law suggests we tend to overestimate the impact of a technology in the short term and underestimate its effects in the long run. In other words, “chill, there’s plenty of time to get our heads wrapped around all this”.\n\nRoy Amara wasn’t around to see his eponymous law turned into a three verse sea shanty complete with bridge and chorus in three seconds flat. The time to act is now.\n\nWith gadgets bright and screens aglow,\n\nWe predict a world we think we know,\n\nHey-ho…\n\nNOTE: This blog was generated by a human, if you don’t count the sea shanty bit 😉"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/sound-bite-building-effective-learning-experiences-in-analytics/#article",
      "headline": "Sound Bite: Building effective learning experiences in analytics",
      "description": "Episode Summary:\n\nIn this weeks sound bite (from the archive) Dan & Dara spoke with Phil Gomm and Tony Reeves from Ding, a learning design consultancy. They discussed with us what learning design is, and how it can be applied to the analytics industry to create positive experiences. \n\nFull episode h",
      "url": "https://www.measurelab.co.uk/insights/blog/sound-bite-building-effective-learning-experiences-in-analytics/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/sound-bite-building-effective-learning-experiences-in-analytics/#webpage"
      },
      "datePublished": "2023-12-06T08:30:00.000+00:00",
      "dateModified": "2023-12-06T08:30:00.000+00:00",
      "author": {
        "@type": "Person",
        "name": "Will Hayes",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "articleBody": ""
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/sftp-gcp-google-analytics-data-import/#article",
      "headline": "How to set up an SFTP Server on Google Cloud (for Google Analytics data import)",
      "description": "How to set up an SFTP server on Google Cloud platform – with the necessary steps for public key authentication required by the Google Analytics Data Import.",
      "url": "https://www.measurelab.co.uk/insights/blog/sftp-gcp-google-analytics-data-import/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/sftp-gcp-google-analytics-data-import/#webpage"
      },
      "datePublished": "2023-12-01T10:26:54.000+00:00",
      "dateModified": "2025-07-31T22:48:24.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/results.png",
      "author": {
        "@type": "Person",
        "name": "Mark Rochefort",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Cloud",
        "Google Analytics",
        "Debugging",
        "Testing",
        "How-to"
      ],
      "articleBody": "If you want to automate data import into Google Analytics 4 then (at the time of writing) you will need to have that data available on an Secure File Transfer Protocol (SFTP) server as a CSV file. We wanted a simple Google Cloud based solution for the sole purpose of making that data available for the regular (i.e. daily, weekly, monthly) uploading of data into Google Analytics 4, where it can be joined alongside existing data to enrich and inform further insights, activations and all that malarky.\n\nThis tutorial therefore mostly focuses on setting up an SFTP server on Google Cloud Platform - but also incorporates the necessary aspects for public key authentication required by the Google Analytics Data Import.\n\n 1. Create new VM in Compute Engine\n 2. Setup your SFTP server\n 3. Set up the data source in Google Analytics\n\n\n1) Create new VM in Compute Engine\n\nThere's plenty of tutorials for this bit, so I'll be quick.\n\nChoose a local region and size / type of machine (I went for the closest and smallest):\n\nFor this tutorial, I selected CentOS as the boot disk then left everything else as default.\n\nYou will get an external but ephemeral IP address. If you want it to be static (it changes every restart) then head to VPC Network, reserve a fixed IP address - binding it to this new instance like so:\n\nAnd also make sure your firewall rules allow port 22:\n\n\n2) Setup your SFTP server\n\nHere you will need to create the user(s) you are going to use and configure the SSH daemon (ie the service that is running on the VM that listens and responds to requests - typically on port 22).\n\nSSH into VM using the SSH-in-browser\n\nWithin Google console, you will be able to click the “SSH” button next to where the instance is listed, to SSH into the VM using the SSH-in-browser. This logs you in using SSH keys, passed to the browser.\n\nCreate the user you will use for the SFTP transfers\n\nOnce logged in to your instance, via SSH, follow these steps:\n\nFirst add a user (replace <username> with the user you need to create - I called it sftpuser):\n\nsudo adduser <username>\n\nNow, assign a password to this user:\n\nsudo passwd <username>\n\nThen, create a group restricted for this user:\n\nsudo groupadd restricted\n\nAnd add user to the group:\n\nsudo usermod -g restricted <username>\n\nConfigure SSH to be able to login with this user\n\nLet’s go back to the SSH-in-Browser to step into the configuration of the SSH daemon, using the vi editor (see https://www.cs.colostate.edu/helpdocs/vi.html - it really is a dark art all to itself but comes bundled with Linux distros and is worth knowing the basics of for quick config file editing like this!)\n\nsudo vi /etc/ssh/sshd_config\n\nfor now just uncomment this line\n\nPasswordAuthentication yes\n\nThen restart the ssh daemon with\n\nsudo service sshd restart\n\nCheck that you can use the new user credentials by logging in with an SFTP client tool like Filezilla:\n\n * Address is the IP of the instance\n * User and password will be what you set above\n\nIf all is working as expected, you should be able to login!\n\nUpload your CSV to the SFTP server\n\nUsing the credentials in the SFTP client tool of your choice, upload your CSV (formatted following the template from Google Analytics), like so:\n\nSave SSH public keys on server\n\nGo grab the public key from Google (this is provided after you set up the transfer in step 3 ) and save it locally in a new file called authorized_keys.\n\nThe simplest way to transfer it will be to use the SFTP tool - so upload the authorized_keys file - like so:\n\nMove the authorized_keys file to a newly created .ssh folder and ensure permissions on both the folder and file are both restricted such that just the user can read, write and execute:\n\nConfigure the SSH service\n\nNow in the SSH-in-Browser again to configure the SSH daemon:\n\nsudo vi /etc/ssh/sshd_config\n\nScroll right down to the end of the file, now hit the i key to edit and add this (which will ensure any users in the restricted group are only used for SFTP):\n\nMatch group restricted\nForceCommand internal-sftp\n\nOnce added at the end, hit the esc key followed by :wq! to write and quit the file.\n\nThen restart the ssh daemon with\n\nsudo service sshd restart\n\nAnd, finally, you can watch the logs by running\n\nsudo tail -f /var/log/messages\n\nIf you want more detail in these logs, edit the sshd_config file again by looking for the Logging configs and edit accordingly:\n\nThis gives you more detail on connections that are being attempted and so on, which is useful if you need to debug. Remember to restart the daemon and then watch the the logs again with:\n\nsudo service sshd restart\nsudo tail -f /var/log/messages\n\n(Note there’s a bunch of other configurations you could be adding here to pin things down further - see reading at the end of this tutorial.)\n\n\n3) Set up the data source in Google Analytics\n\nUsing the credentials you created earlier, set up and map your data source in Google Analytics (note - the SFTP server URL follows the format sftp://<host>/<path to file><file>)\n\nI won’t go into the mapping of the data itself - the purpose of this tutorial is to just get a simple SFTP server running on GCP and to have it using the public keys from Google Analytics for authentication.\n\nTest the import\n\nClick Import now and see what happens! If you are still tailing the logs from above, you will see the connection being made by Google.\n\n\nFurther reading\n\nHow to Setup a SFTP Server in Google Cloud Platform and Restrict Access | by Rubens Zimbres | Medium\n\nSetting Up SFTP Public Key Authentication On The Command Line | JSCAPE\n\n[GA4] About Data Import - Analytics Help"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/sound-bite-unraveling-the-meaning-of-personalisation-with-david-mannheim/#article",
      "headline": "Sound Bite: Unraveling the meaning of personalisation with David Mannheim",
      "description": "Episode Summary:\n\nIn this weeks sound bite (from the archive) Dan & Dara spoke with David Mannheim about personalisation, and the meaning behind it.\n\nFull episode here: https://shorturl.at/yAU37\n\n-----\n\nAbout The Measure Pod:\n\nThe Measure Pod is a weekly podcast hosted by veteran practitioners of th",
      "url": "https://www.measurelab.co.uk/insights/blog/sound-bite-unraveling-the-meaning-of-personalisation-with-david-mannheim/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/sound-bite-unraveling-the-meaning-of-personalisation-with-david-mannheim/#webpage"
      },
      "datePublished": "2023-11-29T10:00:00.000+00:00",
      "dateModified": "2023-11-29T10:00:00.000+00:00",
      "author": {
        "@type": "Person",
        "name": "Will Hayes",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "articleBody": ""
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/sound-bite-rick-dronkers-discusses-data-privacy-and-gdpr/#article",
      "headline": "Sound Bite: Rick Dronkers discusses data privacy and GDPR",
      "description": "Episode Summary:\n\nThis is the first of our weekly sound bites (from the archive). In this clip from September 2022, Dan & Dara spoke with Rick Dronkers about GDPR and data privacy.\n\nFull episode here: https://shorturl.at/cIKSU\n\n-----\n\nAbout The Measure Pod:\n\nThe Measure Pod is a weekly podcast hoste",
      "url": "https://www.measurelab.co.uk/insights/blog/sound-bite-rick-dronkers-discusses-data-privacy-and-gdpr/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/sound-bite-rick-dronkers-discusses-data-privacy-and-gdpr/#webpage"
      },
      "datePublished": "2023-11-22T14:09:26.000+00:00",
      "dateModified": "2023-11-22T14:09:26.000+00:00",
      "author": {
        "@type": "Person",
        "name": "Will Hayes",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Privacy"
      ],
      "articleBody": ""
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/connecting-gpt-to-bigquery-zapier-ai-actions/#article",
      "headline": "Connecting GPT to BigQuery: Zapier AI actions",
      "description": "Using Zapier AI automation, we aim to build our very own GPT capable of grabbing data from BigQuery for analysis.",
      "url": "https://www.measurelab.co.uk/insights/blog/connecting-gpt-to-bigquery-zapier-ai-actions/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/connecting-gpt-to-bigquery-zapier-ai-actions/#webpage"
      },
      "datePublished": "2023-11-20T13:25:44.000+00:00",
      "dateModified": "2025-07-31T22:46:45.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/analytics-sub_big-query-1200x400-blog-1.png",
      "author": {
        "@type": "Person",
        "name": "Matthew Hooson",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "BigQuery",
        "AI & ML",
        "Google Analytics",
        "Privacy",
        "Testing",
        "SQL",
        "How-to"
      ],
      "articleBody": "Unless you have lived under a rock for the last 12 months, you have probably heard of a little old company called OpenAI. In my humble opinion, they essentially kicked off another industrial revolution with their mind-blowing GPT 3.5 and even MORE impressive GPT-4. Since then, many of us in marketing analytics and data engineering have explored its utility for our day-to-day. Some exciting tools have spun up in that time, not least of which Sphinx mind, ‘your AI marketing assistant’ which allows you to connect to a number of data sources (like GA4 and BigQuery) and talk to them in natural language, helping to analyse and visualise your data. All of this tech is built on the GPT 3.5 and 4 models, and with the seismic release of GP4-turbo and GPTs, it is now possible, with minimal code/no code, to replicate some of this functionality in your own GPT.\n\nSo that is our aim today: set up a GPT that can retrieve some data from BigQuery and summarise what we have grabbed. We will be using GPT-4, GPTs and Zapier AI actions. Remember that this will require a GPT plus subscription and a free Zapier account.\n\nLet’s get started!\n\n\nStep one: Zapier set-up\n\nFirstly, you will need to sign up for Zapier. Zapier is a no-code way of linking together various services from around the internet. It can handle all the permissions you may need, making it ideal for augmenting GPTs with powerful actions and automations.\n\nOnce you have a Zapier account, visit the following URL: https://actions.zapier.com/gpt/actions/ here, you will see a request to authorise Open AI access to your Zapier account. You will end up doing this twice; one approval allows you to test things in the preview of the GPT, and the other approval allows for use when live. Click Allow. This will take you off to log into your Chat-GPT account.\n\n\nStep two: Building out our GPT\n\nNow that we have Zapier up and running let’s head over to https://chat.openai.com/ to start building out the GPT. To build a GPT, click ‘Explore’ on the left-hand side, then click ‘Create a GPT’ at the top of the screen.\n\nThis will bring you to a new interface like the one below. On the left is all of your set-up and configuration, and on the right is the preview of your GPT.\n\nAs you can see, GPT asks us what we want to make. In this demo, I am going to create a connection to BigQuery, so I am going to add the following prompt.\n\nThe whole building process is based on natural language prompts, with no need for code. Plenty of experimentation is needed to get the GPT to behave exactly as is needed, but this is a good start. It can be gratifying to play with different prompts and see improvements in the GPT's behaviour. A wealth of resources are springing up on this exact subject.\n\nOnce you have given it its initial instructions, It will ask you about the logo, which I will skip over in this guide.\n\nNext, it will want your help with refining things. We need to provide it with a very specific set of instructions. The below is a version of the instructions seen on Zapier demo page, but we have swapped out the confirmation links to BigQuery instead of the calendar demos. Also note you will need to add in the name of your own GPT in the fist line. Here is the instruction to feed into your model:\n\nBigQuery helper will adhere to the following rules:\n\n### Rules:\n- Before running any Actions, tell the user that they need to reply after the Action completes to continue.\n- You will ask them for the Bigquery project id, dataset and table to use in the query you create\n- You will warn them about the risks of blindly querying tables in BigQuery\n- You do not need the user to confirm the query on Zapier\n\n### Instructions for Zapier Custom Action:\nStep 1. Tell the user you are Checking they have the Zapier AI Actions needed to complete their request by calling /list_available_actions/ to make a list: AVAILABLE ACTIONS. Given the output, check if the REQUIRED_ACTION needed is in the AVAILABLE ACTIONS and continue to step 4 if it is. If not, continue to step 2.\nStep 2. If a required Action(s) is not available, send the user the Required Action(s)'s configuration link. Tell them to let you know when they've enabled the Zapier AI Action.\nStep 3. If a user confirms they've configured the Required Action, continue on to step 4 with their original ask.\nStep 4. Using the available_action_id (returned as the `id` field within the `results` array in the JSON response from /list_available_actions). Fill in the strings needed for the run_action operation. Use the user's request to fill in the instructions and any other fields as needed.\n\nREQUIRED_ACTIONS:\n- Action: Google BigQuery: Run a Query\nConfirmation Link: https://actions.zapier.com/gpt/start?setup_action=google%20bigquery%20run%20a%20 query&setup_params=set%20have%20AI%20guess%20for%20projectid%20and%20sql%20query\n\nOnce we have the above in the model, we need to ensure the ability to pull Zapier actions is in the GPT. To do this, click ‘Configure’ on the top of the page, scroll down and then click 'Create new action' under the Actions heading.\n\nHere, you will see a Schema box. We need to import the specific schema for Zaper AI actions. Luckily, we can do this using a URL, which makes things much simpler. Click Import from URL, then use the following: https://actions.zapier.com/gpt/api/v1/dynamic/openapi.json?tools=meta\n\nOnce imported, a JSON script appears in the schema box. We do not need to make any changes to this. You will also see the schema has added 2 actions:\n1. list_available _actions – This will allow the GPT to see what the user already has set up in Zapier actions\n\n2. run_action  – This allows the GPT to run action within your Zapier AI actions account\n\nWe have already provided the GPT with instructions on using these, so there is nothing more to do on this page.\n\nPlease note that you must provide a privacy policy URL if you want to share this GPT publicly or with your team. In our case, as we plan on only having this demo available to us, there is no need.\n\nIn the top right of the screen, we will save the GPT and select ‘Only me’. This will close the editing window and bring you into your new BigQuery GPT interface. Let’s try it out!\n\n\nStep three: Testing\n\nAs you can see below, I have asked the GPT to help me with a SQL query, and it has asked me to sign into Zapier. I can click sign in and then ask again once that is done.\n\nNext, it is asking me to set up the automation it needs. Here is where we see a common issue. It has not used the confirmation URL we gave earlier to auto-create the connection. Instead, it is asking us to create it manually. For this demo, that is precisely what we will do, but you can try and refine your version to ensure it asks the right questions. There is also a chance that your version worked as expected; this is the joy/pain of working with these models; the same inputs can have slightly different outputs. If the GPT makes you start over, select 'BigQuery Run a Query' from the list. We want the model to use the Project ID and SQL query from our conversations, so select ‘Have AI guess’ for both of those fields. Leave ‘require preview’ unselected and then click ‘enable action’.\n\nNow head back to GPT and let it know you have enabled the action.\n\nBrilliant, it asks us what project we want to query, etc., just as instructed in our rule set! Let’s try and see if it can query what tables are in a dataset.\n\nWould you look at that? It knows the syntax to grab table information and has even drawn up the query for us to check before processing! That looks to me; let's run it.\n\nIt ran the query and returned all the dataset tables to me. If I wished, I could ask it to run queries on any of those tables, but let’s leave it there for this demo.\n\n\nWrapping up\n\nThis was a speedy and straightforward demo connecting BigQuery to chatGPT using Zapier AI actions. You can play with the prompts and instructions to refine it, getting it to behave exactly as needed for your use case. For example, right now, this only pulls through samples of larger results sets; you may want to work on getting all of the data from your query results into your GPT to kick off an analysis stage. This is also only using one action! Imagine having email and PDF generation also available; you could be running queries, collecting data, analysing and then sending results to people via email, all within the one GPT. All of this is possible with the correct set of actions and prompts.Remember to be cautious with running queries in BIgQuery. The same best practice rules apply as if you were using the UI. Not thinking about this could lead to expensive queries!\n\nIf you have any questions about using AI in marketing analytics, BigQuery or anything related, please reach out."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/what-is-ga4-measurement-protocol/#article",
      "headline": "What is GA4's Measurement Protocol?",
      "description": "We're looking to delve into the depths of the Measurement Protocol - a powerful tool that can transform how you collect and analyse data.",
      "url": "https://www.measurelab.co.uk/insights/blog/what-is-ga4-measurement-protocol/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/what-is-ga4-measurement-protocol/#webpage"
      },
      "datePublished": "2023-11-06T17:20:26.000+00:00",
      "dateModified": "2026-01-27T11:24:14.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/analytics-subject_1200x400-blog.png",
      "author": {
        "@type": "Person",
        "name": "George Mendham",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Ecommerce"
      ],
      "articleBody": "Let's start at the beginning. You may have heard whispers about the Measurement Protocol, but what exactly is it? The Measurement Protocol is the secret sauce that allows you to track user interactions beyond standard websites or apps. It's your key to measuring actions that occur outside the digital confines of your website/app, giving you a more complete view of user behaviour. Think of it as your ticket to tracking a world of data, not just your website data. Sounds too good to be true right?!\n\n\nHow does the Measurement Protocol work its magic?\n\nIt allows tracking user interactions beyond web pages or apps by sending data directly to Google Analytics servers using HTTP requests. Users provide specific parameters in requests, enabling custom event tracking, e-commerce transactions, and more, expanding data collection capabilities.\n\n\nWhat can it be used for?\n\nOffline event tracking is one of the key applications for Measurement Protocol. Whether this be tracking revenue subscriptions to get a more accurate picture of customer LTV, physical event attendance to see what channels drive event attendees or calls made to your call centre or made from your sales team. Measurement Protocol is the key that unlocks a lot of doors!\n\n\nOkay sold, now how do I use it?\n\nYou might be thinking, \"This all sounds great, but how do I actually use it?\". Well depending on what you want to send to GA4 via Measurement Protocol, you can lean on a third-party platform or tool that might integrate with the Measurement Protocol like Calltracks or Infinity for call tracking. Or, if you have developer resource, then you can work with your developers to configure the HTTP requests directly from your systems. The requests should be sent to the Measurement Protocol endpoint and should include parameters such as measurement IDs, client IDs, session IDs and any event details.\n\n\nWhat’s the difference between this and Data Import?\n\nGreat question! The Measurement Protocol in Google Analytics 4 enables real-time, programmatic data collection by sending data directly to GA4 servers via HTTP requests. In contrast, the Data Import feature allows the manual upload of offline data, like CRM or customer lists, to enrich existing data. Measurement Protocol is for real-time data collection, while Data Import enhances existing data with offline information.\n\nIn summary, the Measurement Protocol in Google Analytics 4 is your key to tracking offline events and getting a more complete picture of user behaviour. We’ve seen it adopted to fill the gaps of sales that recur offline (subscriptions) and also import other behaviour such as sales calls.\n\nIt can be a fiddly beast to get set up so as always if you have an idea and want some advice then get in touch!"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/debug-sql-in-bigquery/#article",
      "headline": "How to debug your SQL in BigQuery",
      "description": "Discover how to efficiently troubleshoot and find missing data in your code. Dive deep into the step-by-step process of querying code segments in BigQuery, leveraging CTEs, and ensuring you understand the flow of your data. Master the art of debugging with hands-on examples.",
      "url": "https://www.measurelab.co.uk/insights/blog/debug-sql-in-bigquery/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/debug-sql-in-bigquery/#webpage"
      },
      "datePublished": "2023-11-03T15:43:18.000+00:00",
      "dateModified": "2026-02-24T15:59:24.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/hero-services-whentocall.svg",
      "author": {
        "@type": "Person",
        "name": "Katie Kaczmarek",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "BigQuery",
        "SQL",
        "Google Analytics",
        "Debugging",
        "How-to"
      ],
      "articleBody": "How often have you run your code in BigQuery only to find a bit of data missing that you KNOW should be there? You need to debug your SQL to find where the error has occurred and at what point your code dropped that data. Because if you can find the error for that bit of code you’ll be able to fix the code for all the data.\n\nWith the new world of GA4 more of us are getting on board with BigQuery, with little to no experience of SQL. So lots of us are turning to websites like ga4sql and AI to create code for us. Which is fine if it works, and more importantly, gives us the correct data! When it doesn't you need to debug your SQL and be able to step through your code and run the elements individually looking for the data that is missing or incorrect.\n\nUsually we would find errors during one of the many checks you should do with your data. For instance, if you know there should be a 1000 users for a specific day and your final table only gives you 980 then where did the 20 go. We could extract the 1000 users and cross reference with the final data to see the id of the 20 users that didn't get extracted. Let's pretend for this example we found a user with the id 1234 on 10/08/2021 which did not appear in our data.\n\nBefore we do anything else you must have a think about the amount of bytes used to run the code, we are going to step through the code which means we are going to run individual elements at a time, each run will cost money in BigQuery. So before we begin, limit the code to that individual bit of data that you want to hunt for, could be an id and a date range (date range is especially important if that is what the table is partitioned by). In this instance we will limit the date to 10/08/2021 and the user to 1234.\n\nLots of code has multiple CTE’s (Common table expressions) . CTE’s are all the WITH statements that happen prior to your final code running, that help you break up a complex query into more digestible bits. These are, in their simplest forms, just temporary tables to store information that you will want to use in your final bit of code. Each CTE will perform a task to retrieve an element of data that you want.\n\n\nLets review your first CTE and begin to debug your SQL\n\nLets begin to debug your SQL. The best way to start is with the very first CTE and see if the data you are looking for is even in the first element of the code.\n\nThis is what CTE’s look like. So we can see here that there are 3 CTE’s named page_views, base and same_page:\n\nSo we need to unpick at what point in our code the user 1234 is dropping off (in this code it is extremely obvious, but lets pretend it's not!).\n\nDid you know that in BigQuery you can simply highlight the code you want to run and BigQuery will only run the highlighted code, this makes it a lot easier to run segments of the code and dissect where issues arise.\n\nThe first thing we should do is limit our first CTE to confirm if the user exists in the first extract. So what we need to do is add some additional information to the first CTE and then run that segment. We will limit the date to the date we know that the user appeared and limit the users to just the user we want to look for. Like this:\n\n\nMoving on to our second CTE\n\nIn this code we can see that each CTE feeds off the previous one so any data limited in the first CTE will filter through to all the others. If we had sections of code referencing other tables we might need to add code to limit that data also. So when we move on to the next CTE we do not need to add any code to limit the data we can just run it. However we will need to do some additional tweaking so that we can highlight and run the code as it is no longer a stand alone code, we need to include the previous code also. To do this we can add a simple SELECT * statement after the 2nd CTE and this will return all the data for the second CTE (its important to make sure that the select * is placed before the comma).\n\nPlease remember that SELECT * should only be used when we are sure it is not going to run large bytes of data. We know it is good in this example as we have already limited our data to a date and a user.\n\nLike this:\n\nAfter running this code I can see that the data for 1234 is no longer there so the error appears to be happening in this section of code…hopefully you can all see why? We have applied a WHERE statement in the second CTE to exclude 1234. If we remove this the data will be in our final table.\n\n\nWhen is a CTE not a CTE....when its a subquery\n\nOther things you might want to look out for is Subqueries, these work in exactly the same way as a CTE but the table is nested in another query. So the same code as above could look like this:\n\nWhen you see this you can do two things, extract the subquery code out and create a CTE (this is much tidier). Or you can extract the subquery to a new query and run it step by step there and leave the original code as it is.\n\n\nUtilise your temporary tables to debug your SQL\n\nAnother really useful way to debug your SQL by querying sections of your data is by utilising the temporary table that is created when you run code. Part of the query results includes job information, towards the bottom of these details is a destination table. If you click this temporary table you can query the data like you would any other table. It's really handy to review data before creating a final table. But be warned these temporary tables have a life expectancy of 24 hours so they are only really useful for quick reviewing whilst debugging your SQL.\n\nThat was an extremely easy unpicking, but hopefully it has given you the tools to step through your code one segment at a time and find where errors have occurred. Even if you do not have an error, running code step by step will give you a deeper understanding of what each section of the code is doing and will enable you to debug your SQL easier. Happy querying everyone.\n\nFor help with your next steps with SQL check out my other blog where you can find ids and suggestions on how to review your SQL. Or how to reduce your BigQuery cost where you can find hints and tips on how to reduce query costs."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/google-cloud-tools-marketing-analytics/#article",
      "headline": "The Google Cloud tools of the marketing analytics trade",
      "description": "The GCP is vast and overwhelming. We aim to sort through the clutter and help highlight what you need to know as a digital marketing professional.",
      "url": "https://www.measurelab.co.uk/insights/blog/google-cloud-tools-marketing-analytics/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/google-cloud-tools-marketing-analytics/#webpage"
      },
      "datePublished": "2023-11-02T12:17:38.000+00:00",
      "dateModified": "2026-01-27T11:24:15.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/measurelab-blog-ga4-streaming-to-bigquery_1200x400-blog-2.png",
      "author": {
        "@type": "Person",
        "name": "Matthew Hooson",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "BigQuery",
        "Google Analytics",
        "Looker Studio",
        "Data Analysis",
        "Google Cloud",
        "Dataform",
        "SQL",
        "Server-side Tagging",
        "AI & ML",
        "Marketing",
        "Google Ads"
      ],
      "articleBody": "The Google Cloud Platform (GCP) is vast. It is composed of over 100 services which serve purposes across countless industries and subsections of business. From the Internet of Things (IoT) to healthcare, there are tools within the GCP that are extremely powerful and invaluable.\n\nThat is all lovely, but it can be overwhelming. With the recent free connection between Google Analytics 4 (GA4) and BigQuery, this sense of overwhelm has been introduced to a whole new set of marketing analytics folks trying to filter out the noise and understand what is relevant to them. So I thought I would help by being that filter by producing a curated list of the tools and services you need to know about. Now you may not use all of them; there are levels of complexity to data transformation and pipelining that require some of the more advanced stuff here, but knowing what they are will at least help put this lump computing power into neater boxes.\n\nHere's the list of GCP services we'll be covering:\n\n * BigQuery\n * Dataform\n * Cloud Functions\n * Cloud Scheduler\n * Cloud Composer\n * Cloud Storage\n * Pub/Sub\n * Cloud Workflows\n * Dataflow\n * Dataprep\n * Dataplex\n * Vertex AI\n\n\nBigQuery\n\nBigQuery is the GCP’s flagship serverless data warehouse. It allows for the analysis of massive datasets in real time. Instead of managing database servers, users can focus on using SQL queries to extract insights. BigQuery automatically manages the underlying resources, scales with your needs, and ensures high availability of your data.\n\nGoogle has done a lot to make BigQuery many people's gateway to the GCP, but don't expect something as user-friendly as the GA4 UI. You'll need to know some basic SQL to get started, although the introduction of generative Artificial Intelligence (AI) in the form of Duet AI is going to help there.\n\nA simple example of how BigQuery might be used for marketing analytics is to extract your GA4 data and Google Ads data using the free connectors and build out some reporting tables for lightweight dashboards in Looker Studio.\n\nKeep the following in mind:\n\n * Cost: While BigQuery charges for the amount of data processed, without careful query management and partitioning, costs can escalate quickly.\n * Streaming Data: Ingesting streaming data can lead to additional costs.\n * Complexity: For very large datasets, optimising for performance might require a deeper understanding of how BigQuery works internally.\n\n\nDataform\n\nDataform ensures the maintenance of scalable and reliable data transformations by enabling software engineering practices within data teams. Integrating practices like version control, testing, and documentation directly into the data workflow, facilitates a new era of structured, maintainable, and error-free data operations.\n\nTo really get the most out of Dataform you will need to be familiar with GitHub or similar. This allows for all the versioning, backup and documentation features. Javascript knowledge is also nice to have to get the most out of ‘SQLx’, the version of SQL used in the service.\n\nAn example use case of Dataform in marketing analytics might be to build out a Dataform repository which creates reporting tables autonomously. Each stage of any transformation, staging table creation and joining is completed in order. You could also use ‘assertions’ to spot and alert you to any issues with data quality.\n\nKeep the following in mind:\n\n * Complexity: Requires familiarity with version control systems like Git. This might be intimidating for those without a software development background.\n * Dependency: Being too dependent on a tool like Dataform can become an issue if you need to transition to another system.\n\n\n\n\n\n\n\n\n\n\n30-minute consultation\n\n\n\n\n\n\n\n\n\nBook your free Dataform consultation\n\n\n\n\n\n\n\n✓\nInfrastructure audit\n\n\n✓\nTransformation plan\n\n\n✓\nEfficiency analysis\n\n\n\n\n\nGet started →\n\n\n\n\n\n\n\n\n\n\nCloud Functions\n\nCloud Functions allow developers to run backend code without managing servers. It's event-driven, meaning the code is executed in response to specific events (like changes in data, user actions or scheduled triggers). This serverless compute solution is especially useful for tasks like processing data, integrating with third-party systems, or even for automation purposes.\n\nIt's designed to be straightforward, especially for those familiar with writing code. The real beauty is you don't need to worry about the infrastructure. However, understanding event-driven architecture can be a plus.\n\nA common example use case is to set up a Cloud Function to automatically extract data from an API and store it in BigQuery, where it can then be transformed and joined to other marketing analytics data using Dataform or basic SQL.\n\nKeep the following in mind:\n\n * Cold Starts: Initial invocation after a period of inactivity might take longer to execute.\n * State Management: Being serverless, managing state across invocations can be challenging.\n * Limitations: There are limits on execution time, memory, and deployment package size. (although these are better with generation 2 functions)\n\n\nCloud Scheduler\n\nThink of Cloud Scheduler as a modern task scheduler in the cloud. It lets you run jobs on a defined schedule, akin to the Unix cron utility, but with the benefits of a cloud-native environment. From triggering HTTP endpoints to invoking Cloud Functions or sending Cloud Pub/Sub messages, Cloud Scheduler allows automation with reliability and fault-tolerance built-in.\n\nIt's pretty straightforward, especially if you have experience with cron jobs. The UI is user-friendly, but understanding the cron syntax is crucial, although there are plenty of resources to help.\n\nSet up a Cloud Scheduler job to trigger the Cloud Function mentioned in the previous section every night at midnight, so the previous day's data is waiting for you in BigQuery and on your dashboard the next morning.\n\nKeep the following in mind:\n\n * Overlapping Jobs: If jobs take longer than expected, there's a risk of overlapping executions.\n * Complexity: While the UI is intuitive, understanding cron syntax and setting up secure invocations might be challenging for some.\n\n\nCloud Composer\n\nCloud Composer is GCP’s managed orchestration service built on Apache Airflow. It's designed to create, schedule, and monitor workflows, integrating seamlessly with other GCP services. This means that instead of manually triggering tasks, you can set up a series of dependent tasks and let Cloud Composer manage their execution.\n\nFor those new to Apache Airflow, there is a steep learning curve. However, the managed nature of Cloud Composer alleviates many of the operational challenges.\n\nWhen dealing with larger data workloads you may set up a workflow in Cloud Composer to extract marketing analytics data from multiple sources, transform it, and then load it into BigQuery daily.\n\nKeep the following in mind:\n\n * Cost: Given it’s a managed service, costs can be higher than self-managed solutions, especially if not monitored.\n * Customisation: Some advanced Airflow configurations might be limited given the managed nature of the service.\n\n\nCloud Storage\n\nCloud Storage provides a durable and highly available storage solution for a variety of data types. It's more than just a place to store files; it's a powerful tool to integrate with big data and Machine Learning (ML) tools, serve websites, store backups, or even archive data for long-term storage.\n\nIt’s quite intuitive to use. If you've used other cloud storage services before, you'll find this familiar. The GCP console makes managing buckets and files easy.\n\nYou could use cloud storage as a data lake, storing raw unprocessed marketing analytics data before it is transformed and ready for BigQuery.\n\nKeep the following in mind:\n\n * Access Management: Without proper bucket policies and Identity and Access Management (IAM) roles, there's a risk of unauthorised data access.\n * Data Retrieval: Retrieving large amounts of data, especially from cold storage classes, can be time-consuming and costly.\n\n\nPub/Sub\n\nPub/Sub stands for Publish/Subscribe. It's a messaging service designed to connect applications, ensuring the seamless flow of information between them in real-time. With its asynchronous messaging backbone, it can be used to decouple services, making them more scalable and maintainable.\n\nFor those unfamiliar with messaging systems, there may be a learning curve. However, its design is to provide a simple, scalable foundation for building event-driven systems.\n\nA simple marketing analytics use case may be using Pub/Sub to help trigger particular cloud functions or workflows in pipelining. More complex uses may be to handle real-time data and pass it through services like Dataflow for transformation.\n\nKeep the following in mind:\n\n * Message Duplication: Ensuring exactly once processing can be complex.\n * Subscription Management: Unattended subscriptions can accumulate a backlog of unprocessed messages leading to increased costs.\n\n\nCloud Workflows\n\nCloud Workflows enable the automation and orchestration of GCP tasks, bridging various services together into a unified workflow. With its visual interface, users can design and implement complex processes, combining tools like Cloud Functions, Pub/Sub, and even third-party APIs into seamless operations.\n\nIt might require some understanding of workflow orchestration and YAML, but the visual representation and Google's documentation make it manageable.\n\nUsing Cloud Scheduler to trigger a workflow that runs a cloud function to extract and store marketing analytics data in BigQuery and then kick off a Dataform process that transforms the raw table data ready for reporting is a really simple yet powerful automated Extract Load Transform (ELT) pipeline.\n\nKeep the following in mind:\n\n * Complexity: Building and maintaining complex workflows might require deeper understanding and careful error handling.\n * Limitations: There are restrictions on execution time and payload…"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/success-stories/pret-adjust-ga4-app-attribution/#article",
      "headline": "GA4 app attribution case study: Pret + Adjust integration",
      "description": "Pret a Manger is a brick and mortar chain of coffee shops serving freshly made food and good organic coffee. They have 600+ stores distributed globally and their analytics team is responsible for over 30 million events every month collected across both web and app. \n\n“Measurelab have been a key partner to us as we’ve undertaken a complete overhaul of our app and web analytics. Having access to the wide range of skillsets within the organisation has been invaluable as we’ve embarked on this journ",
      "url": "https://www.measurelab.co.uk/insights/success-stories/pret-adjust-ga4-app-attribution/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/success-stories/pret-adjust-ga4-app-attribution/#webpage"
      },
      "datePublished": "2023-11-01T10:52:00.000+00:00",
      "dateModified": "2025-12-10T01:29:27.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/08/5.png",
      "author": {
        "@type": "Person",
        "name": "Mark Rochefort",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "BigQuery",
        "AI & ML",
        "Marketing",
        "How-to"
      ],
      "articleBody": "Pret a Manger is a brick and mortar chain of coffee shops serving freshly made food and good organic coffee. They have 600+ stores distributed globally and their analytics team is responsible for over 30 million events every month collected across both web and app. \n\n“Measurelab have been a key partner to us as we’ve undertaken a complete overhaul of our app and web analytics. Having access to the wide range of skillsets within the organisation has been invaluable as we’ve embarked on this journey, and their technical expertise has helped us to build a modern solution that provides insight into digital behaviours across multiple touchpoints.”\n\n\nThe challenge\n\nPret wanted to enhance the attribution of their app downloads utilising both Google Analytics 4 and Adjust, a mobile measurement partner. The ambition was to be able to optimise their digital campaign performance based on users successfully downloading their app and generally better understand the behaviours and paths leading to conversions.\n\n\nThe solution\n\nWe successfully integrated Google Analytics 4 and Adjust to dynamically send client ID, session ID, and traffic attribution parameters based on user behaviour. Additionally, we have ensured that the Adjust data is exported to BigQuery, allowing for seamless merging with the core GA4 dataset.\n\n\nThe results\n\nWith a consolidated dataset at their disposal, Pret is planning to conduct an in-depth analysis of the various channels and user journeys that contribute to app downloads. \n\nThis analysis aims to optimise the effectiveness of their digital channels, fine-tuning targeting techniques for the utmost impact and long-term success in attracting and engaging users.\n\n\nWhat’s next?\n\nBy leveraging this wealth of data, Pret seeks to gain valuable insights that will guide their decision-making process and drive continuous improvement in their app’s performance."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/success-stories/ual-reduce-container-size-improve-core-web-vitals/#article",
      "headline": "Core Web Vitals optimisation case study: UAL reduces container size & improves performance",
      "description": "The University of the Arts London (UAL) is the largest specialist Art and Design institution in Europe with over 18,000 undergraduate and postgraduate students. It comprises six specialist art and design colleges: Camberwell College of Arts, Central St Martins, Chelsea College of Arts, London College of Communication, London College of Fashion and Wimbledon College of Arts.\n\nThe UAL Digital Public Platforms team manages data from across 10+ sites and over 250,000 users a month.\n\n\nThe challenge\n\n",
      "url": "https://www.measurelab.co.uk/insights/success-stories/ual-reduce-container-size-improve-core-web-vitals/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/success-stories/ual-reduce-container-size-improve-core-web-vitals/#webpage"
      },
      "datePublished": "2023-10-09T10:47:00.000+00:00",
      "dateModified": "2025-12-10T01:30:03.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/08/3.png",
      "author": {
        "@type": "Person",
        "name": "Mark Rochefort",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Tag Manager",
        "Privacy"
      ],
      "articleBody": "The University of the Arts London (UAL) is the largest specialist Art and Design institution in Europe with over 18,000 undergraduate and postgraduate students. It comprises six specialist art and design colleges: Camberwell College of Arts, Central St Martins, Chelsea College of Arts, London College of Communication, London College of Fashion and Wimbledon College of Arts.\n\nThe UAL Digital Public Platforms team manages data from across 10+ sites and over 250,000 users a month.\n\n\nThe challenge\n\nUAL had a Google Tag Manager (GTM) container filled with legacy tags and duplicate triggers and variables. This was resulting in a bloated container that had the potential to be slowing the site down and leading to a poor user experience.\n\n\nThe solution\n\nWe started with a full audit of the GTM container. The first step was to identify any duplicate, legacy or unreferenced tags, triggers and variables. We then reviewed the Custom HTML that existed within the container and found several areas where this could be optimised by condensing/consolidating similar tag types. We also suggested utilising Google Consent Mode to reduce the need for consent dependent triggers and updated the tag, triggers and variables to a structured and recommended naming convention. To prevent any ongoing issues we also audited the user permissions and made recommendations to reduce the number of users with publish permissions.\n\n\nThe results\n\nThrough a staggering total of 777 revisions in a single workspace, we accomplished two significant improvements. Firstly, we drastically decreased the container size, reducing it from 95% to 51%. Secondly, we reduced the execution time of the JavaScript from 3.5 seconds to an impressive 1.9 seconds. As a result, we achieved a noteworthy 26% reduction in the Total Blocking Time, a pivotal metric in Core Web Vitals.\n\n\nWhat’s next?\n\nUAL now has a condensed and organised GTM container that is no longer negatively impacting their Core Web Vitals. Following the actions from the user permission audit, they’re also able to more effectively manage changes and continue to maintain an optimised container. "
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/success-stories/call-propensity-analysis-for-sanderson/#article",
      "headline": "Call propensity analysis for Sanderson – bridging online data and call centre insight",
      "description": "Sanderson Design Group designs and manufactures wallpaper and fabrics, with a history stretching back more than a century. It trades under several brands including Arthur Sanderson & Sons, Morris & Co., Zoffany and Harlequin.\n\nThe analytics team manages 5+ sites and over 20,000 digital transactions per month.\n\n\nThe challenge\n\nSanderson has recently launched a new B2B ordering system, aiming to streamline order generation and reduce customer service calls. Following the implementation, call volum",
      "url": "https://www.measurelab.co.uk/insights/success-stories/call-propensity-analysis-for-sanderson/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/success-stories/call-propensity-analysis-for-sanderson/#webpage"
      },
      "datePublished": "2023-10-05T10:41:00.000+00:00",
      "dateModified": "2025-12-10T01:27:31.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/08/2.png",
      "author": {
        "@type": "Person",
        "name": "Mark Rochefort",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "BigQuery",
        "Data Analysis"
      ],
      "articleBody": "Sanderson Design Group designs and manufactures wallpaper and fabrics, with a history stretching back more than a century. It trades under several brands including Arthur Sanderson & Sons, Morris & Co., Zoffany and Harlequin.\n\nThe analytics team manages 5+ sites and over 20,000 digital transactions per month.\n\n\nThe challenge\n\nSanderson has recently launched a new B2B ordering system, aiming to streamline order generation and reduce customer service calls. Following the implementation, call volumes were monitored, but unfortunately, no significant decline was observed, and the reasons behind this lack of reduction remain unclear.\n\n\nThe solution\n\nDuring the implementation of the new ordering system, we recommended incorporating a user ID within GA4. Leveraging the power of BigQuery, we used this user ID to connect GA4 data with two other datasets: Sanderson’s call centre data and their ordering system data. Through this integration, we were able to create a comprehensive table that captures a user’s interactions across the ordering system, while also incorporating any calls they may have made. This approach provided a unified view of a user’s journey, bridging the gap between online and offline platforms.\n\n\nThe results\n\nThrough data analysis, we discovered specific pages within the new ordering system that users frequently accessed before making phone calls. By identifying these pages, Sanderson was able to prioritise optimisation efforts, to reduce call volumes and an enhanced customer experience.\n\n\nWhat’s next?\n\nSanderson is focused on leveraging the analysis to further enhance their ordering system and generate valuable insights for their optimisation roadmap. Notably, they have successfully implemented a live chat feature on their website and are keen to incorporate these interactions into their analysis. This will enable them to evaluate the impact of these initiatives on reducing call volume."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/success-stories/edf-energy-saves-250gb-a-day/#article",
      "headline": "BigQuery optimisation case study: EDF Energy saves 250 GB a day",
      "description": "EDF Energy is the UK division of EDF, the multinational energy company. Their services span electricity generation and the sale of natural gas and electricity to homes and businesses throughout the United Kingdom.\n\nTheir analytics and insight team manage data from 15+ websites and apps totalling 65 million events every month.\n\nWe helped reduce their data query volume by an astonishing 250GB per day!\n\n\nThe challenge\n\nDuring the migration to Google Analytics 4 (GA4), EDF aimed to streamline their ",
      "url": "https://www.measurelab.co.uk/insights/success-stories/edf-energy-saves-250gb-a-day/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/success-stories/edf-energy-saves-250gb-a-day/#webpage"
      },
      "datePublished": "2023-10-05T10:37:00.000+00:00",
      "dateModified": "2025-12-10T01:27:52.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/08/1.png",
      "author": {
        "@type": "Person",
        "name": "Mark Rochefort",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "BigQuery"
      ],
      "articleBody": "EDF Energy is the UK division of EDF, the multinational energy company. Their services span electricity generation and the sale of natural gas and electricity to homes and businesses throughout the United Kingdom.\n\nTheir analytics and insight team manage data from 15+ websites and apps totalling 65 million events every month.\n\nWe helped reduce their data query volume by an astonishing 250GB per day!\n\n\nThe challenge\n\nDuring the migration to Google Analytics 4 (GA4), EDF aimed to streamline their app and web data. However, they encountered complications due to an outdated app schema. Inconsistent naming conventions hindered the rollout, putting their plans at risk with limited resources and budget to update the schema.\n\n\nThe solution\n\nAfter considering various options, the focus shifted towards using BigQuery to import, transform, and consolidate data from both the app and web sources. By establishing appropriate naming conventions and harnessing the power of user-defined functions, EDF successfully obtained a unified and comprehensive view of their app and web data for reporting purposes.\n\n\nThe results\n\nBy leveraging the consolidated snapshot table, we proceeded with migrating and condensing the legacy code, eliminating redundant queries whenever feasible. As a result, EDF successfully reduced the data query volume by a substantial 250GB per day, leading to a more cost-effective and efficient data warehouse. Besides the immediate savings on query costs, this optimisation also offered the advantage of reducing the overall number of tables within BigQuery.\n\n\nWhat’s next?\n\nMoving forward, EDF is further developing the snapshot table as the central hub for their internal reporting. This not only enables significant cost savings but also opens up the possibility of incorporating Ad data into the snapshot table, ultimately advancing toward a comprehensive sales and marketing dataset."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/new-gtm-google-tag/#article",
      "headline": "GTM’s new Google tag: one tag to rule them all",
      "description": "Goodbye to the GA4 Config Tag\n\nAnyone who’s spent any time implementing the Google Analytics 4 (GA4) tracking in Google Tag Manager (GTM) over the past few years will be familiar with the GA4 Configuration tag. Essentially the top level of tracking within GTM for configuring GA4, this is where you would specify your Measurement ID, configure server requests and specify things like event parameters and user properties.\n\nThe GA4 Config tag would then typically act as a reference point for all your",
      "url": "https://www.measurelab.co.uk/insights/blog/new-gtm-google-tag/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/new-gtm-google-tag/#webpage"
      },
      "datePublished": "2023-09-08T09:02:27.000+00:00",
      "dateModified": "2025-07-31T20:35:29.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/analytics-sub_gtm-1200x400-blog.png",
      "author": {
        "@type": "Person",
        "name": "Nick Roberts",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Ads",
        "Google Tag Manager",
        "Google Analytics",
        "Ecommerce"
      ],
      "articleBody": "Goodbye to the GA4 Config Tag\n\nAnyone who’s spent any time implementing the Google Analytics 4 (GA4) tracking in Google Tag Manager (GTM) over the past few years will be familiar with the GA4 Configuration tag. Essentially the top level of tracking within GTM for configuring GA4, this is where you would specify your Measurement ID, configure server requests and specify things like event parameters and user properties.\n\nThe GA4 Config tag would then typically act as a reference point for all your GA4 Event tags. For anyone still mourning the demise of Universal Analytics (UA), the GA4 Config tag behaved kind of like a UA Pageview tag and a Settings Variable all rolled into one.\n\nHowever, the eagle-eyed among you will have recently spotted a new message in your Google Tag Manager containers, heralding the news that change is afoot:\n\n\nHello to the Google Tag\n\nIn a move that has seemingly been brewing for a while, Google is introducing \"one tag to rule them all\" (and in a Google black box bind them?).\n\nIf Google Tag sounds familiar, it’s because it’s already been kicking around for a while. Formerly known as Global Site Tag, and commonly abbreviated to GTAG(.js), the Google Tag uses a single Tag ID that lets you fire information to all your favourite Google platforms.\n\nThe key thing here is that where GTM and GTAG were previously kind of an either-or situation (with GTAG typically being hardcoded), they’re now merging into one. This means you can send hits to multiple platforms from one handy GTM tag.\n\nBefore we all start panicking, Google assures us in their container-topping banner that “Your existing measurement will not change and no action will be required.”\n\nGood news, but what’s changing?\n\n\nGA4 event tags!\n\nGA4 Event tags are changing, but only ever so slightly, in that they’ll work with the new settings variables. The main difference here is that GA4 Event tags still reference your GA4 Property’s 'Measurement ID' while the Google Tag uses the 'Google Tag ID'.\n\nRight now GA4 Event Tags are displaying the following when creating a new GA4 Event:\n\nIt looks as though Google will gather the Measurement ID from the GA4 Config Tag you specify here and populate the new Measurement ID field with that value when Google Tag officially launches.\n\n\nThe Return of The Settings Variable\n\nGoogle has replaced the GA4 Config tag’s “Fields to Set” with two new Settings Variables. They have also moved around the Send a Pageview, Send to Server Container and User Properties settings.\n\nThe two new Settings Variables we have now are:\n\n * Configuration-Level\n * Event-Level\n\nThe Configuration-Level Settings Variable is for any parameters that you want to set when the Google Tag loads. Examples might include various page-level data points like Page Type or Page Location etc. The Configuration-Level Settings Variable also now hosts the Send a Pageview option, as well as the Send to Server Container option.\n\nA neat new addition in Settings Variables is that they will give a little tick if they recognise your parameter as a predefined parameter:\n\nThe Event-Level Settings Variable is to hold various event-level parameters like ecommerce data, click/navigation event data etc. The Event-Level Settings Variable is also the new home for all your User Properties.\n\nThe Event Settings Variable will also give you little ticks for predefined parameters, although oddly not user_id, uid or cid (at the time of writing):\n\nFor any who don’t remember UA's Settings Variables, the great thing about them is that you can populate them with all the key parameters you’re interested in for your daily tracking needs, and then reuse that variable across any tags you like. This saves needing to duplicate work manually updating tags with individual parameters.\n\nThere does seem to be a fair amount of overlap between which parameters you can and should include in Config Settings Variables and Events Settings Variables. However, Google has provided lists of recommended parameters for Configuration Settings and Event Settings, so unless you have a particular use case in mind, it’s best to align with those where possible.\n\n\nHow has my container changed?\n\nGoogle is currently in the process of rolling out these changes and will be replacing existing GA4 Config tags with the new Google Tag. It looks like the GA4 Config tag will continue to live as a 'Legacy' tag for the foreseeable future.\n\nFor those who haven’t had their containers updated yet, this is what the tag looks like:\n\nWhere previously the GA4 Config tag had UX checkboxes to send page views and to send hits to a Server Container, these are now manually specified either in your Google Tag, your Config Settings Variable, or your Event Settings Variable.\n\nOn that note, we’ve been seeing that multiple Google Tag configurations on a page can overwrite each other. As such it’s advisable to include server_container_url and other critical parameters in Event Settings Variables. This is because if you fire a Google Tag with a server_container_url specified, followed by a Google Tag with the same Tag ID without your server_container_url specified, that 2nd hit won’t go to your server and neither will subsequent hits.\n\nIt’s very important to make sure you aren’t accidentally using multiple configs and overwriting yourself.\n\n\nWhat’s next?\n\nAs Google says, there’s no need to change your existing configurations right now, they will be doing it for you. That said, the way we approach new implementations should be streamlined with the addition of the new Settings Variables. Google Tag’s combined approach should also save a lot of time and headaches when it comes to implementing tracking for the Google Marketing Platform (GMP) products such as Google Ads.\n\nIn a future blog post we’ll discuss Google Tag IDs and how to combine tags, as there are different formats depending on the platform (G- for GA, AW- for Google Ads and GT- which look to be the combined tag but more on that soon).\n\nIf you have any questions on what this change means for your implementation, or if you'd like a second pair of eyes on what you're setting up, please do let us know and get in touch!"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/customise-ga4-reports-menu-library/#article",
      "headline": "Customising GA4's reports menu using the report library",
      "description": "By now you’ll all have GA4 up and running (I hope!) but now the realisation is kicking in that you have to actually start using the UI and I don’t know about you all but for me, it didn’t quite feel right. Let’s talk about the UI, where the hell did all my reports go?!\n\nI miss Universal Analytics UI! There I said it.\n\nGA4 is fantastic and I love some of the new features they have brought out like creating and modifying events from within the UI and the additional layer of user acquisition; howev",
      "url": "https://www.measurelab.co.uk/insights/blog/customise-ga4-reports-menu-library/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/customise-ga4-reports-menu-library/#webpage"
      },
      "datePublished": "2023-08-29T14:11:37.000+00:00",
      "dateModified": "2026-01-27T11:24:16.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/hero-services-domorewithdata2-2.svg",
      "author": {
        "@type": "Person",
        "name": "George Mendham",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Data Analysis",
        "Google Analytics",
        "How-to"
      ],
      "articleBody": "By now you’ll all have GA4 up and running (I hope!) but now the realisation is kicking in that you have to actually start using the UI and I don’t know about you all but for me, it didn’t quite feel right. Let’s talk about the UI, where the hell did all my reports go?!\n\nI miss Universal Analytics UI! There I said it.\n\nGA4 is fantastic and I love some of the new features they have brought out like creating and modifying events from within the UI and the additional layer of user acquisition; however I miss the familiarity of the Universal Analytics UI. It feels like I’m staying in an AirBnB. Yes they may have the log fire I’ve always wanted and a kitchen I dream about, but whenever I go to cook something I have to open every cupboard to find the utensils and pots I need. It’s all there I just don’t know where.\n\nThis got me thinking, using the Reports Library feature, could I rebuild UA in GA4? Could I get my dream kitchen and log fire and know where everything is!?\n\nBefore we jump in, let me first explain what the reports library is. It’s a new feature within GA4 that allows editors and administrators to customise the Reports workspace. Essentially you can create, customise and add premade filters to any report in your property, meaning we can change the UI!\n\n\nHow to create a new report\n\nIn the reports workspace, head to the ‘Library’ which is at the bottom of the menu:\n\nNow in the ‘Library’, you can either edit an existing collection, create a new collection or create a new report.\n\nWe’re going to jump in and create a new report that we can add to the existing ‘Life-cycle’ collection. So click on the ‘+ Create new report’ button. You’ll then see two options to either create a detailed or overview report.\n\nA detailed report is like you see on the ‘Traffic acquisition’ report - it’s one page with two graphs at the top and then a table at the bottom.\n\nAn overview report is like on the ‘Acquisition - Overview’ report - it’s meant as a summary / landing page with links off to more detailed reports.\n\nFor now we’re going to create a detailed report - we can choose to create a report from a template or to start from scratch. For ease, let’s use the Traffic acquisition report as our template.\n\nWe can amend the primary dimensions that appear in the table by editing the ‘Dimensions’ section in the menu on the right. We can also edit the metrics and apply any filters via the same menu.\n\nFor now, let’s edit the dimensions to recreate the ‘Source / Medium’ report in UA. So, click into Dimensions and you should already see the dimension ‘Session source / medium’. Via the three dots next to this, set this as the default dimension and then click apply.\n\nNow click save and name the report ‘Source / Medium’:\n\n\nHow to add reports to the menu\n\nGoing back to the Reports Library, edit the Life-Cycle collection and drag and drop the new ‘Source / Medium’ report in the Acquisition Topic.\n\nSave the changes to the Collection and then view your new reports workspace.\n\n\nUse cases\n\nThis awesome feature of GA4 means we can customise the interface to our specification. And for those that have got this far, yes - it is possible to change the GA4 UI to replicate UA. Believe me when I say, it is a dream!\n\nGet in touch if you want to customise your own reporting library in GA4, or you can learn how to do it for yourself on our 6-week GA4 Immersion training course!"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/derelict-data-warehouse/#article",
      "headline": "The Derelict Data Warehouse",
      "description": "A well-maintained and utilised data warehouse is a thing of beauty. Imagine all your data from disparate sources autonomously extracted, loaded and transformed into nice neat reporting tables. Picture, if you can, impactful analysis, company-wide data-driven decision-making, a true understanding of return on ad spend. It’s enough to make anyone weak at the knees.\n\nBut therein lies the problem. Companies (or ambitious individuals) can be too desperate to reach the promised land and rush headlong ",
      "url": "https://www.measurelab.co.uk/insights/blog/derelict-data-warehouse/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/derelict-data-warehouse/#webpage"
      },
      "datePublished": "2023-08-24T09:06:00.000+00:00",
      "dateModified": "2025-07-31T20:35:30.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/measurelab-blog-ga4-streaming-to-bigquery_1200x400-blog-2-1.png",
      "author": {
        "@type": "Person",
        "name": "Matthew Hooson",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "BigQuery",
        "Data Analysis",
        "Google Cloud",
        "SQL"
      ],
      "articleBody": "A well-maintained and utilised data warehouse is a thing of beauty. Imagine all your data from disparate sources autonomously extracted, loaded and transformed into nice neat reporting tables. Picture, if you can, impactful analysis, company-wide data-driven decision-making, a true understanding of return on ad spend. It’s enough to make anyone weak at the knees.\n\nBut therein lies the problem. Companies (or ambitious individuals) can be too desperate to reach the promised land and rush headlong into a warehousing project without due care and attention. This results in a wasteland littered with what we playfully term 'derelict data warehouses’.\n\nAll is not lost. Most of these failed endeavours are ‘fix-em-uppers’ that can be salvaged with the right DIY skills. But before we reach for the toolbox, let’s first take a tour of the typical types of derelict data warehouse.\n\n\nThe Abandoned Warehouse\n\nWe’ve all been there. A project that never quite reached its end, or maybe the brainchild of someone who has long since left the company. Whatever the reason, the abandoned data warehouse is unused and unloved. The data is out of date; it needs documentation; it lacks adoption; heck, most people in the company don’t even know it exists. Worse still, it may come at a significant cost, both monetarily and from a data compliance standpoint.\n\n\nThe Duck Tape Warehouse\n\nIt might be charitable to call this hodge-podge of manually collected data and spreadsheet table joins a warehouse, but in a way it is - just in a very primitive form. A warehouse aims to get data out of silos, integrated and answering business questions that cannot be answered by a single source alone. And the most straightforward way to start doing this is manually. But a Duck Tape Warehouse is fragile, needs standardisation and security and is draining the time (and threatening the sanity) of your best and brightest.\n\n\nThe Over-engineered Warehouse\n\nBuilt with the best intentions, this warehouse is a complex maze of tables, schemas, and ETL processes. While technically impressive, its complexity makes it challenging for users to navigate, understand, or derive insights from without extensive training or hours spent poring over documentation. Warehouses can come in all shapes and sizes, and a company's likely use cases and maturity level need to be considered before deciding on the appropriate architecture and engineering approach.\n\n\nThe Untamed Warehouse\n\nNot all companies have a full complement of skills within their data team. This can result in a skew in expertise, leading to solutions being created but their latent value never fully realised. Untamed Data Warehouses arise when companies have the engineering nous to get data from multiple sources into a cloud platform, but lack the knowledge on schemas, SQL, analysis and business need to tame the data and actually make use of it.\n\n\nAudit to understand the problem\n\nThe above examples illustrate just some of the problems businesses face on their journey to building a data warehouse that delivers. I could have listed another 20. You may well have identified yourself in one of the above and be asking, “OK, so now what?”.\n\nThe answer may be knocking the whole thing down and starting again, it could be some minor renovations, or somewhere between the two. Data Warehouses are inherently complex due to the number of considerations and decisions needed during their creation and ongoing maintenance.\n\nAn audit can provide a more detailed understanding of the shortcomings and opportunities. We’ve put together a checklist of things to review, which you can find below.\n\n\nData Warehouse Audit Checklist\n\nIf you’d like an external perspective, Measurelab can do a complete audit of your data warehouse and present you with an estimate for the repair work - no chin scratching or sucking through teeth, guaranteed.\n\n 1.  Stakeholder feedback: Engage with the core users of the data, collecting their feedback and experiences.\n 2.  Performance Analysis: Unravel any lurking performance glitches, from slow query execution times to potential bottlenecks.\n 3.  Storage Efficiency: Dive into data storage patterns, identifying opportunities for more streamlined management.\n 4.  Cost Analysis: Break down the financial implications of your setup, seeking strategies to optimise expenses without sacrificing performance.\n 5.  Schema Review: Explore the intricacies of schema design, suggesting enhancements to boost both performance and usability.\n 6.  Granularity assessment: Check the granularity alignments with core reporting needs.\n 7.  Data integrity: Examine the data's robustness, ensuring its completeness and accuracy.\n 8.  Integrity planning: Suggest strategies to maintain impeccable data quality in the future.\n 9.  Current pipeline health: Investigate the journey of your data, pinpointing any inefficiencies or bottlenecks.\n 10. Pipeline improvements: Recommend alternative routes or tools if they can offer smoother transitions.\n 11. Security and Compliance: Check data for things like who has access and at what level, PII and personal data.\n 12. Build a security plan: Suggest enhancements in line with industry standards to fortify your data defence.\n 13. Disaster recovery: Assess the resilience plans in place, ensuring there's a robust strategy to combat every unforeseen calamity.\n 14. Documentation review: Scrutinise existing documentation, highlighting gaps or areas that might benefit from further illumination.\n 15. Continuous improvement: Propose methods to instil a culture of ongoing learning and knowledge refinement."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/getting-started-plotly-dash/#article",
      "headline": "Getting started with Plotly Dash",
      "description": "This blog post is a brief introduction to Plotly Dash and a short tutorial to learn how to build a custom visualisation. For this tutorial, you will need some basic knowledge of Python, HTML and JavaScript.\n\nThis article will focus on locally building and visualising your graph.\n\n\nWhat is Plotly Dash?\n\nLet’s start with the basics: what is Plotly Dash? Dash is a Python framework created by Plotly to render interactive dashboards which can also be hosted online, by using just Python. Dash has both",
      "url": "https://www.measurelab.co.uk/insights/blog/getting-started-plotly-dash/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/getting-started-plotly-dash/#webpage"
      },
      "datePublished": "2023-08-22T08:21:10.000+00:00",
      "dateModified": "2026-01-27T09:45:45.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/measurelab-blog-superpower_1200x400-blog.png",
      "author": {
        "@type": "Person",
        "name": "Natalia Rizzi",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Tag Manager",
        "Looker Studio",
        "Debugging",
        "React",
        "How-to"
      ],
      "articleBody": "This blog post is a brief introduction to Plotly Dash and a short tutorial to learn how to build a custom visualisation. For this tutorial, you will need some basic knowledge of Python, HTML and JavaScript.\n\nThis article will focus on locally building and visualising your graph.\n\n\nWhat is Plotly Dash?\n\nLet’s start with the basics: what is Plotly Dash? Dash is a Python framework created by Plotly to render interactive dashboards which can also be hosted online, by using just Python. Dash has both an enterprise and an open-source version, we’re going to be using the latter.\n\nDash is built on top of Flask, Plotly.js and React.js. So that means you don’t need to have extensive knowledge of HTML, CSS and JavaScript, but a basic understanding should be enough to build some visualisations.\n\nThere are many advantages of using Plotly Dash, but the three main advantages are:\n\n * Interactivity: with graphs and better storytelling. This allows you to zoom in and out, using filters or other interactive features such as buttons, dropdown menus, etc. All these features are entirely customisable.\n * Customisation: of dashboards. Compared to traditional visualisation tools, Plotly Dash gives you the opportunity to have full control of what you’re building. Moreover, Plotly supports Pandas plotting, so in this way, you can also perform complex data transformations before building a visualisation.\n * Flexibility: in sharing your dashboard anywhere in the world. At Measurelab we started using Dash for our clients whenever Google Looker Studio isn’t available in a particular country. By using Dash we’re able to build visualisation and deploy them without any geographical constraint.\n\n\nLet’s get started with Dash\n\nFor this tutorial I used a dataset I found on Kaggle which contains the “Top 1000 IMDB Movies” on which I performed some data transformation with Pandas (i.e. dropping columns, data type changes, etc.).\n\nIn this tutorial, we’re going to build a bar chart with a dropdown menu where we’ll filter the movies by year.\n\nAs a prerequisite to creating your Plotly Dash app, you’ll need first to set up your local environment, so create a new directory where you’ll store the code and set up the virtual environment.\n\nCheck if the file needs cleaning. For this specific file, I performed some data transformation, but this won’t be part of this tutorial.\n\nInstall Dash, Plotly Express and Pandas. For this tutorial, we’re going to use python3.\n\npip3 install dash plotly-express pandas\n\n\nInitialization of your Dash App\n\nLet’s start by creating an empty file named app.py in the root directory of your project. Save the data in the root directory as well. Below is how your project should be structured.\n\ntop_1000_imdb_movies/\n|\n├── venv/\n|\n├── app.py\n|\n└── movies.csv\n\nIn app.py import the dependencies\n\n# Import packagesfrom dash import Dash, html, dcc, Input, Output\nimport plotly.express as px\nimport pandas as pd\n\nRead your data with Pandas:\n\n# Read data\ndf = pd.read_csv(\"movies.csv\")\n\nTo initialise our app we use this code snippet. This is known as the Dash constructor.\n\napp = Dash(__name__)\n\nThe next part we’re going to add is known as the layout which represents the app components that will be displayed in the browser, from basic HTML components like divs (html.Div) to complex Dash components like dropdowns (dcc.Dropdown). The layout consists of a tree of components such as html.Div and dcc.Graph.\n\napp.layout = html.Div([\n    html.H1('Top 1000 IMDB Movies'),\n    html.H4('Gross profit by year'),\n    dcc.Dropdown(\n        id=\"dropdown\",\n        options=df['Released_Year'],\n        value=df['Released_Year'][0],\n        clearable=False\n    ),\n    dcc.Graph(id=\"graph\")\n])\n\nLet’s have a closer look at the elements in our code:\n\n * html.H1 and html.H4 are HTML tags that will generate for example <h1>Top 1000 IMDB Movies<h1> element in the app.\n * dcc.Dropdown is a Dash Core component used to generate the dropdown menu. This component comes with an option (the list options, in this case, the release year of the movie) and a value (the initial default value in the dropdown).\n * The clearable property is usually set to True on all dcc.Dropdown components. I set it to False to prevent the clearing of the selected dropdown value.\n * dcc.Graph is another component that renders the data visualisation, the bar chart in this case.\n\n\nThe interactivity of your App\n\nWe have defined how our components will be rendered. Time to make our app dynamic. To do so, we’re going to use callback functions. These functions are automatically called by Dash every time an input component’s property changes. In this case, data filtering will trigger the callback function and an output will be returned. So basically a callback function links the inputs and outputs of our App.\n\n@app.callback(\n    Output(\"graph\", \"figure\"),\n    Input(\"dropdown\", \"value\")\n)\n\nEvery time we change the input, Released_Year in this case, our graph will be updated.\n\nTime to wrap up everything. This last function will help us to create and update the bar chart.\n\ndef update_bar_chart(year):\n    release_year = df[\"Released_Year\"] == year\n    fig = px.bar(df[release_year], x=\"Movie Title\", y=\"Gross Profit\",\n                barmode=\"group\", text_auto='.2s')\n    return fig\n\n * In  release_year = df[\"Released_Year\"] == year we’re setting the value of the df column \"Released_Year\" to the argument year\n * In the second part, we’re using Plotly Express, which is a high-level interface to Plotly, to create the bar chart and its x/y axis values.\n\nTo complete the tutorial, we need to add a last part of the code that allows us to run the App.\n\nif __name__ == '__main__':\n    app.run_server(debug=True)\n\nTo run our App you run this command python app.py\n\nThis should be the final result:\n\nCongrats! You’ve just built your first Plotly Dash chart. This is the first step toward creating interactive and fully customizable applications.\n\nIf you’d like to learn more about our custom charts services with Plotly Dash, feel free to contact us."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/create-events-ga4-ui/#article",
      "headline": "How to create new events in GA4 (using the UI)",
      "description": "Google Analytics 4 (GA4) gives users the ability to create new events or modify existing events through the use of the GA4 user interface. This is a fantastic add-on available to all and will be welcomed by those who are not familiar with their existing tag management system or do not have the relev",
      "url": "https://www.measurelab.co.uk/insights/blog/create-events-ga4-ui/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/create-events-ga4-ui/#webpage"
      },
      "datePublished": "2023-07-21T08:29:55.000+00:00",
      "dateModified": "2026-01-27T11:24:17.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/ml_1200x400-highlight-discover-magnify.png",
      "author": {
        "@type": "Person",
        "name": "Olade Honvo",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Google Tag Manager",
        "Conversion Tracking",
        "Testing",
        "Ecommerce",
        "Marketing",
        "How-to"
      ],
      "articleBody": "First of all, creating a new event keeps you safe from interacting with existing events that may be powering reports or other business-critical systems. It would be hard to list all the use cases, as there are many reasons why one would want to make use of the game changing feature in GA4.\n\nFirst of all, creating a brand new event keeps you safe from interacting with existing events that may be powering reports or marketing campaigns. It’s a way to expand your data in GA4 without any risk.\n\nAlthough it would be hard to list all the use cases, one obvious reason to use this feature would be when there is a need to quickly add a new event into the data where tech resources are not available, or limited. Basically, it could be used as a temporary fix to get something tracking, pending a more permanent update to the tracking code via Google Tag Manager (GTM) or developers.\n\nFurthermore, GA4 is designed with app and web convergence in mind, it is easy to imagine that creating events via the user interface is by no means limited to web and can also be extended to app. Most web analysts or analytics consultants (including myself) can be very good at handling web implementation, but not so much when it comes to apps. Unlike before, we now have a powerful tool that helps us remove any blocker related to app development and new version releases.\n\n\nHow to create an event\n\nBefore we begin, one key element to mention is to ensure users have the required role in order to ensure tight control of events that are created. Users who can create events need to have either of the below following roles:\n\n * Administrator\n * Editor\n * Marketer\n\nCreating a new event supposes the existence of an existing ‘source’ event which is already tracked in GA4. In order to verify the list of event that is currently tracked in a given GA4 property, please visit Admin > Events (at the property-level):\n\nWhen clicking on ‘Create event’ you are first presented with a page that shows you all events that have already been created. Continue by clicking on ‘Create’ at the top, to be presented with the page below:\n\nThe next steps are as follows:\n\n 1. Choose an event name for the event you intend to create. See this guide on event types and naming conventions you can use.\n 2. Choose an existing event as a source event.\n 3. Choose any event parameter(s) you’d like to filter the source event on.\n\nFurther to that, you are also given the option to re-use any parameter of the existing event and set up the appropriate parameter configuration. In most cases, you’ll leave this checkbox ticked. For a detailed description and walkthrough on modifying events, please visit the blog “How to modify events in GA4” by Timothy Gorringe.\n\nIf you ever want to remove this new customised event, GA4 gives you the option to delete if you need to. To do so, you will find a vertical ellipsis at the top of the top right of the screen, click on it and choose ‘Delete’.\n\nExample\n\nIn my example, I would like to create a new event called “brochure_request_confirmation” whenever a user visits any of the following pages:\n\n * www.mysite.com/brochure\n * www.mysite.com/about/brochure\n * www.mysite.com/brochure/download\n\nFor this, I will use the ‘page_view’ event as the source event, but only on pages where “brochure” is contained in the URL (i.e. in the page_location parameter).\n\nBased on this configuration (see screenshot below), my new event named ‘brochure_request_confirmation’ will be created for each and every page_view event where the page_location parameter contains “brochure”:\n\nAfter creating your event, you can then optionally mark it as a conversion event. This will be possible the following day after you have created the event, when it shows in the ‘Events’ section in the admin screen where you can mark the event in question as a conversion by toggling the appropriate button:\n\nHowever if you are unable to locate the event you have created recently, but still want to mark it as conversion, you can navigate to the ‘Conversions’ section in the admin screen, and click ‘New conversion event’. At this stage you can input the event name (please note it is case sensitive):\n\nYou may be wondering why or what is the added benefit of making an event as conversion? If so, do you remember ‘Goals’ in Universal Analytics? If you do, then marking this newly created GA4 event as a conversion allows you to create an equivalent of a Universal Analytics destination Goal!\n\nHaving said that, please note that Universal Analytics Goals are session-scope, unlike goal conversions in GA4 which are event-scope by default. That is, unless you change the counting method to “once per session”.\n\n\nHow to check it’s working\n\nTesting that your new event is actually working as you expect is a non-negotiable part, especially when collecting/manipulating data.\n\nThere are certainly many ways to ensure the new event is yielding the expected result. We will focus on one such way - using the real-time report. GA4 has a built-in real-time feature which allows us to see in near real-time each and every event that has been received and processed in the last rolling 30 minutes.\n\nYou will first need to log a few events that meet the requirements of the newly created event (i.e a page containing “brochure” in our example). Then inside of GA4, click on ‘Reports’ in the furthest left summary section, followed by a click on ‘Real-time’. The Event count by event name card is the one we are interested in. Assuming we have successfully created the event, this is where we would hope to see our newly created event.\n\n\nLimitations\n\nAs handy as it can be in speeding up the implementation of new events, it is important to be aware of some restrictions around event creation:\n\n   \n * Use recommended event names if possible (see our full guide on GA4’s event types for details)\n   \n     \n   * And avoid using event reserved event names\n     \n   \n   \n   \n * Event creation allows a maximum limit of 50 events\n   \n   \n * Event creation is not retroactive and do not affect historical data\n   \n   \n * Parameters in the ‘item’ array (used in ecommerce tracking) cannot be used to define a new event\n   \n   \n * It can take up to an hour before the event start to show in GA4\n   \n\n\nConclusion\n\nIf you are reading this section, you have probably managed to get through each and every line above. Well done!\n\nIt is now your turn to experiment with the event creation tool via the GA4 user interface. Remember, each implementation requires testing, just to make sure you did it correctly, but on top of that, so you do not miss days of data.\nI believe that this new feature in GA4 is a game changer, it grants non-technical minded users the ability to perform some minor and some major changes pending implementation from a technical specialist. If you have any questions about how to use this feature, or would like to chat about ways we can assist you in this, please get in touch."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/bounce-engagement-rate-ga4/#article",
      "headline": "What is bounce and engagement rate in GA4?",
      "description": "What is “engagement” in Google Analytics 4 (GA4)? How does Google Analytics define and measure engaged sessions vs. ‘Bounced’ sessions? And what happened to Bounce Rate?",
      "url": "https://www.measurelab.co.uk/insights/blog/bounce-engagement-rate-ga4/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/bounce-engagement-rate-ga4/#webpage"
      },
      "datePublished": "2023-07-20T09:16:00.000+00:00",
      "dateModified": "2025-07-31T20:35:37.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/measurelab-blog-superpower_1200x400-blog-1.png",
      "author": {
        "@type": "Person",
        "name": "James Humphreys",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Conversion Tracking",
        "Google Ads",
        "How-to"
      ],
      "articleBody": "Let’s pop these questions of what bounce and engagement rate exaclty is, but if you’re pressed for (engagement) time, the short version is that a\n\nsession\n\ncounts as engaged if the user views 2 or more pages; or even if they only view one page they complete a conversion on that page or engage for more than 10 seconds.\n\nIn the above image we’ve broken down the difference between bounce rate in the old version of Universal Analytics (UA) and Engaged Sessions in GA4.\n\nUA’s definition of bounce rate was very straightforward - 1 pageview in a session makes it a ‘Bounced’ session, 2+ pageviews in a session make it a… not-bounced session.\n\nNow, think of a website that provides users with long-form ‘How To’ content; blogs on topics like ‘How to put up a bookshelf’, for example. It could be that a user looking for a step-by-step guide to putting up a bookshelf gets everything they need from one pageview. Is UA’s methodology of calling this session a ‘Bounce’, implying a failure on the part of the content, fair?\n\nSimilarly, if your website has a specific page that contains a lead-generating ‘More Information’ PDF file, and a high-interest user bookmarks that page, clicks into it one day, downloads the PDF and then later begins a purchase ‘IRL’, was that 1-pageview session necessarily a low value one?\n\nGA4’s definition of engaged sessions; sessions with 2+ pageviews or 1-pageview sessions with either 10+ seconds engaging with that page, or a conversion event completed, both accommodate for the above scenarios. In other words, GA4 would recognise that the user learning how to put up a bookshelf (10+ seconds on site) and the user downloading the lead-gen PDF (conversion even completion) both still count as engaged, despite only viewing 1 page.\n\nThat’s the logic behind GA4’s engagement rate, engaged sessions, etc. metrics in a nutshell. If you want to dig a little deeper, there’s two key factors when defining and measuring engagement in GA4; engagement time, and engagement rate.\n\n\nWhat is “engagement time” in GA4?\n\nGoogle’s support pages have a pretty thorough definition of how they measure engagement time but essentially the moment a user opens a web page or app, Google hits start on a tiny invisible stopwatch, secretly counting how long (in milliseconds) the user has been on site.\n\nWhenever that user has a meaningful interaction with the site (like scrolling to a certain depth, tapping a button, or clicking through to a new page or screen) that tiny invisible stopwatch sends a report to GA4 - “At exactly 2,307 milliseconds the User clicked!”\n\nIf the user closes their browser, shifts to a different tab, closes the app or otherwise “leaves”, the stopwatch pauses.\n\nThat’s engagement time.\n\nThe table on the aforementioned support.google page about engagement time gives a clear visual representation of how engagement time is tracked;\n\nUser…event_nameuser_engagement_msecvisits for the first time landing on first pagefirst_visit, page_view, session_startN/Ascrolls down the pagescroll8781navigates to next pageuser_engagement11856visits second pagepage_viewN/Ascrolls down the pagescroll6677leaves the websiteuser_engagement7711\n\n\nWhat is “engagement rate” in GA4?\n\nPart of the reason that Google has sunset Universal Analytics and transitioned to GA4 is to better reflect and report on modern browsing behaviour. Because be honest - how many tabs do you have open right now?\n\nThe moment a page or app screen is loaded, GA4 logs a “session_start” event, and that “session_start” event does exactly what it says on the tin - it marks the start of a session.\n\nBut what if the User then leaves that browser tab or app screen open and unread - to go do something else for an hour, or a day, or a week? Does it make sense to call that session an hour/day/week long? Of course not.\n\nEnter “engaged sessions”.\n\nWhen a User is on your site or app for more than 10 seconds; when they click from the first page or screen through to a second; or when they complete a “conversion event”, that session is labelled in GA4 as an “engaged session”. Engagement rate is the % of sessions that are engaged vs “disengaged”. “Disengaged” isn’t a term we actually use - we call those sessions “bounced”.\n\nThere were a couple of slightly vague terms we’ve used here - for example, we said that a session is marked as engaged when they complete a “conversion event” - but what exactly is a conversion event?\n\n\nConversion Events in GA4\n\nIn your GA4 Property, if you click into ‘Admin’ (i.e. the cog/gear in the bottom left corner) and then ‘Conversions’ (i.e. the little flag beneath ‘Property’) you can see and customise every user event that GA4 will define as a “conversion”.\n\nIf you remember the days of ‘Goals’ in Universal Analytics, they’re quite similar to those. If you want to go a step further, they’re very similar to hit-scope Goals in Universal Analytics.\n\nIdentifying an event as a conversion does a few things - for example, it tells GA4 you’re interested enough in that event that it should start modelling attribution to it. If you’re curious what touchpoints lead to someone, say, downloading a PDF from your site, you should consider marking it as a conversion. But that’s another story for another blog post. (As a bonus fun fact; it also speeds up the rate at which you’ll see those specific events in GA4’s reporting UI.)\n\nRight now, we’re more interested in the fact that identifying an event as a conversion also adds it to the list of things that GA4 considers an engagement. If it’s a conversion, it counts towards a user’s engagement rate.\n\nIt’s up to you what is and isn’t a conversion event. If you want every session which includes the click of a certain banner, or which views a certain screen to be counted as engaged, you can add it to conversions - just bear in mind that your GA4 property may be linked to marketing platforms like Google Ads, Meta’s Event Manager and so forth, so it’s worth considering what your bidding strategy looks like before turning too many events into conversions.\n\n\nBounce Rate\n\nWe’ve talked about engagement rate and how sessions can be engaged or “disengaged” - but we’ve also mentioned how “disengaged” isn’t actually the term we use. Instead, we call those not-engaged sessions Bounces, or Bounced sessions.\n\nBounce rate is the inverse of engagement rate in GA4 - if 75% of sessions over a timeline or within an audience were “engaged” sessions, then 25% of them were bounced.\n\nAs the nature of websites and apps have changed, bounce rate has become less important and for this reason it isn’t included in the default reports on the GA4 interface. To find the bounce rate you will need to customise the report you are looking at or create an Exploration. To customise a report you will need to have the Editor role.\n\nFollow these steps to add the metric to an existing report:\n\n 1. Enter the GA4 property.\n 2. Navigate to the report you wish to customise e.g. the Pages and screens report.\n 3. On the top right of the report click on the pencil icon labelled ‘Customise report.’\n 4. In the ‘Report Data’ section click ‘Metrics.’\n 5. Select ‘Bounce rate’ and click apply. You can also select engagement rate in this section if you wish to compare the bounce rate against this.\n 6. You will then see the bounce rate column on the report. You can also save the changes to the report so that you can easily find it again.\n\nA very important caveat to add to this is that Google may have had a good reason for ‘burying’ Bounce Rate slightly - it does not apply to page-level dimensions (e.g. page location, page title etc.) in the way you might assume. As we’ve said, Bounce Rate is rate of\n\nsessions\n\nthat were “not engaged” - so if you create a report in GA4 of Bounce Rate by Page location, you will not be seeing the 1-pageview exit rate of those pages, you’ll be seeing the % of “unengaged” sessions associated with that page divided by the total pageviews - which is a whole different measure and not what you most likely want.\n\nThere we have it! If you felt like your understanding of engagement in GA4 was a bit loose, then hopefully this has tied the knot.\n\nWe're always here to help if you have any questions or would like any further clarifications - get in touch to arrange a chat and see how we can help!"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/marketing-roi-ga4-acquisition-reports/#article",
      "headline": "Measuring marketing ROI with GA4's acquisition reports",
      "description": "For any data-driven business, understanding where website visitors come from is a crucial component of optimising marketing campaigns and improving ROI. Acquisition reports in Google Analytics 4 (GA4) provide valuable insights into visitor acquisition and can help businesses make informed decisions",
      "url": "https://www.measurelab.co.uk/insights/blog/marketing-roi-ga4-acquisition-reports/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/marketing-roi-ga4-acquisition-reports/#webpage"
      },
      "datePublished": "2023-07-19T09:43:53.000+00:00",
      "dateModified": "2026-01-27T11:24:17.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/measurelab-kpi_1200x400-blog.png",
      "author": {
        "@type": "Person",
        "name": "Gary Moore",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Data Analysis",
        "Google Analytics",
        "Marketing",
        "Google Ads"
      ],
      "articleBody": "By analysing acquisition reports, businesses can identify which channels and campaigns are driving the most high-quality visitors to their website. This allows them to optimise their marketing efforts by allocating more resources to the channels that are most effective at driving conversions and adjusting or pausing underperforming campaigns.\n\nFor example, if a business is running a campaign across multiple platforms (such as Google Ads, Meta, and TikTok), they can use the GA4 acquisition reports to track the performance of each campaign from a specific channel or source and identify which ones are driving the most valuable visitors. They can then allocate more budget to those campaigns and adjust or pause underperforming campaigns to improve their ROI.\n\nAnother way businesses can optimise their marketing efforts using GA4 acquisition reports is by analysing supporting behavioural metrics such as engagement rate, engaged sessions, engaged sessions per user and avg. engagement time so that businesses can gain insights into how visitors engage with their site or app once acquired. This data may potentially highlight channels that underperform in comparison to other channel metrics that could warrant further investigation, especially for paid media campaigns where audience messaging is critical for campaign performance.\n\nOverall, GA4 acquisition reports provide businesses with valuable insights into visitor behaviour and marketing performance, which they can use to make data-driven decisions about how to allocate their resources and optimise their marketing efforts, and ultimately grow their business. In this blog post, we'll dive deeper into the importance of GA4 acquisition reports for optimising marketing efforts, exploring how businesses can leverage the data to make informed decisions and improve their overall performance.\n\n\nAccessing the acquisition reports\n\nIf you are a new user to GA4 and/or want to obtain a greater understanding of your visitor acquisition data you can go into the GA4 UI and select ‘Reports (workspace) > Lifecycle (collection) > acquisition (topic)’.\n\nAssuming you have not customised the reports menu already, once you are logged in to the GA4 property, you will then see three report viewing options within acquisition:\n\n 1. Overview\n 2. User acquisition\n 3. Traffic acquisition\n\nThe overview report provides a selection of charts (cards) that contain metric values, some also include dimensions alongside the metrics to make the data more granular. It’s also worthwhile noting that some also have a link to a more indepth ‘detail’ report that you can click.\n\nA recent development was the addition of the data quality icon in the top right of each individual card. If the icon isn’t green then it’s worthwhile clicking the drop down to see the reason and how it impacts your data.\n\n\nDifferences between user acquisition and traffic acquisition reports\n\nThere are two main types of reports that at first appear to be similar, but there are subtle differences between the user acquisition and traffic acquisition reports. The user acquisition report provides insights into the number and behaviour of users who visit your website or app. While the traffic acquisition report provides insights into the number and behaviour of individual sessions (i.e. visits) to your website or app.\n\nSome of the metrics and dimensions available in the user acquisition report include user count, user retention, and user engagement. Meanwhile, session acquisition reports include metrics such as sessions and events per session. It's important to note that the user acquisition report focuses on the behaviour of individual users over time, while session acquisition reports focus on the behaviour of individual sessions.\n\nDepending on your marketing goals and the type of insights you're looking for, you may find that one type of report is more useful than the other. For example, if you're interested in understanding how many unique users are coming to your site and how they are engaging with your content over time, the user acquisition report may be more relevant. Conversely, if you're more interested in understanding how your marketing campaigns are driving individual sessions to your site, the traffic acquisition reports may be more helpful.\n\nAs you work with either report, you will notice that you can customise the primary and secondary dimensions. However, it's important to note that the available dimensions differ between the user acquisition and session acquisition reports. In the user acquisition report, each dimension begins with \"First user …\" while the traffic acquisition report dimensions start with \"Session …\".\n\nThe difference in dimension labels between the user acquisition and the traffic acquisition dimensions is caused by the way credit is attributed to the acquisition source. A good way to think about this is that in the user acquisition report, the 'first user...' dimensions are based on first-click attribution, scoped to the user level. This means that credit is given to the acquisition source that was the first click in the user's history. In contrast, the 'session...' dimensions in the traffic acquisition report are based on last-click attribution, but scoped to the session level. This means that credit is given to the acquisition source that was the last click in the user's most recent session.\n\nFor instance, let's take the example of a user who was introduced to a website via Google Ads, returned in a separate session via Facebook, and then made a purchase through a Google organic search in another session. In the user acquisition report, Google Ads would be credited with acquiring the user, while in the traffic acquisition report, the session that re-engaged the user with the brand would be attributed to ‘Organic Search’, i.e. Google search.\n\nNote: Universal Analytics (UA) only reported the trafiic acquisition. That is, if you want the like-for-like report from UA, then use the traffic acuisition report and the 'session...' dimensions.\n\n\nWorking with the acquisition reports\n\nYou can also filter events and conversions within the acquisition data table to specific events and conversions by selecting from the drop downs as seen to the right. In the example below you can see from a first user perspective which ‘first user default channel group’ resulted in the most ‘purchase’ conversions being recorded.\n\nNote: The image has been altered to remove some columns for brevity.\n\nThere are additional report level filters and a ‘comparison’ feature available within these reports, see the blog post How to filter and compare data in GA4’s reports for more information.\n\n\nWhich report should I use?\n\nThis is going to be one of those typical responses that make everyone roll their eyes: it depends...\n\nChoosing the appropriate report to use depends on a few factors, such as the type of acquisition data you and other stakeholders want to see and measure as KPIs. For example, if your goal is to acquire new users through marketing campaigns (i.e. outreach or prospecting), you may want to focus on reports that provide data on user acquisition. On the other hand, if your goal is to engage with users via specific sources within a specific period you may want to use reports that provide data on session marketing sources (i.e. cost-per-click and direct response).\n\nOnce you have a clear understanding of what data needs to be reported alongside your KPIs, you can choose the report that best aligns with your objectives. Ultimately, it's important to use a report that provides the most relevant and actionable insights for your specific needs.\n\n\nIn summary…\n\nThe GA4 acquisition reports offer valuable insights to businesses on visitor acquisition, enabling them to make informed decisions about where to allocate their marketing budgets, resources, and help improve their ROI.\n\nWhilst the GA4 UI may not appear to be the most intuitive in the first instance, the flexibility of the reports and customisation options makes it easier for businesses to access specific data and gain insights into visitor behaviour and marketing performance. Therefore, businesses should be using GA4 acquisition reports to make data-driven decisions, improve their marketing strategy and grow their business.\n\nWe're here to help if you have any questions on using these reports for optimising your marketing efforts! See how we work with marketing teams, or get in touch if you want to arrange a chat."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/universal-analytics-data-bigquery/#article",
      "headline": "Backing up Universal Analytics data in BigQuery",
      "description": "Saying goodbye to UA hurts, especially when you need your historical data out before Google deletes the lot. We at Measurelab built our own tool to soothe this pain for our clients.",
      "url": "https://www.measurelab.co.uk/insights/blog/universal-analytics-data-bigquery/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/universal-analytics-data-bigquery/#webpage"
      },
      "datePublished": "2023-07-06T13:19:25.000+00:00",
      "dateModified": "2026-01-27T11:24:17.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/analytics-sub_big-query-1200x400-blog-2.png",
      "author": {
        "@type": "Person",
        "name": "Matthew Hooson",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "BigQuery",
        "Google Analytics",
        "Google Cloud"
      ],
      "articleBody": "No point kicking up a fuss about it now, Universal Analytics (UA) is on life support. It still contains all the data but is not collecting more (well, in theory). In another year, the lovely historical information you collected over many years will also be on the chopping block. If you were not an early adopter of GA4, that could mean you lack the ability to perform any meaningful year-on-year analysis - for another year, anyway.\n\nPerhaps you were lucky enough to have Universal Analytics 360 and had all your data backed up in BigQuery from the get-go. However, for many, 360 was/is not an option financially.\n\nPerhaps you use an off-the-shelf ETL pipeline solution to back up your data (Supermetics, Funnel, Skyvia). But again, these can be expensive and a bit of an unwanted monthly outgoing for this single-use case.\n\nThis is why, here at Measurelab, we saw an opportunity to build a tool for our clients that will let them back up as many UA reports as they wish, as far back as they dare and store all that data in BigQuery for as long as they need it.\n\nEnter the incredibly creatively named “Universal Analytics to BigQuery Backfill… tool”!\n\n\nA little background\n\nWhen Measurelab took up the task of creating a backfill tool for UA data in BigQuery, we went a little against the grain. We discarded the idea of a complete backup of UA data. Why? Well, depending on your traffic levels, it could be costly, both from a data processing and storage perspective. Another reason is we believe you need only backup data pertinent to your performance indicators. Why import row after row of data on the operating system of a user when it is of no interest to your business? It is a valuable exercise to sit down and really think critically about what data you actually need, not analytics for analytics' sake. For this reason, we built a tool that collects data based on user-defined reports. Just specify your metrics, dimensions and your date range and away you go.\n\n\nThe nuts and bolts of the tool\n\nThe tool is a Flask application hosted on App Engine. It also uses Cloud Tasks to shatter API requests into daily chunks, Cloud Functions to make API calls, and BigQuery to store all the data. Engineering this solution on the Google Cloud Platform helps dodge sampling issues and keeps a lid on the API load to prevent quota limits from being breached. It also allows us to dynamically scale to meet the needs of the requests being received.\n\nFlask and App Engine\n\nApp Engine is Google's fully managed, serverless platform for developing and hosting web applications. Flask, a micro web framework written in Python, has been utilised with App Engine to manage the tool's web requests and responses.\n\nThe primary responsibility of the App Engine and Flask setup is to accept user-defined report configurations. The configurations are parsed, and the necessary API requests for data retrieval are created. These requests are then broken down into daily chunks, enabling the handling of large data sets without overloading the system or hitting sampling issues.\n\nCloud Tasks\n\nCloud Tasks is a fully managed service that allows developers to manage the execution, dispatch, and delivery of a large number of distributed tasks. Within the context of this tool, Cloud Tasks works to ensure that each API request is correctly undertaken. It can be configured only to run a certain number of tasks at the same time which allows for a controlled load on the API, avoiding quota limits.\n\nBy leveraging Cloud Tasks, the tool manages to execute each request reliably and efficiently, even in the event of temporary API outages or system failures, as Cloud Tasks have a built-in system for retrying failed attempts. Each task is a trigger for our cloud function.\n\nCloud Function\n\nCloud Functions, Google’s event-driven serverless compute platform, comes next in the pipeline. It's designed to scale up in response to internet events and triggers.\n\nIn the case of this tool, the Cloud Functions' primary role is to process the daily chunks of API requests received from the Cloud Tasks. They manage the asynchronous execution of these requests, ensuring a smooth, continuous data flow, even with sporadic internet or system interruptions. The function creates and then streams the data into a BigQuery table. Streaming allows for much higher rates of table writes, something that is necessary when dealing with large backfills of data.\n\n\nThe bottom line\n\nWe've designed our tool to effectively address the limitations associated with Universal Analytics, particularly its lack of a native BigQuery data transfer service. Utilising Google App Engine, Cloud Functions, and Cloud Tasks, our tool facilitates a user-configurable, reliable, and cost-effective method for backing up crucial data to BigQuery.\n\nAs Google's deadline approaches for the deletion of UA data (1st July 2024), our tool will become increasingly important for our clients who aim to preserve their UA data. More than just a bridge from UA to BigQuery, it promotes a more mindful and strategic approach to data preservation.\n\nAll companies we work with get access to this tool from today, so get in touch if you want to work with us and back up all of your key UA data while you still can!"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/why-server-side-gtm/#article",
      "headline": "Why you should consider Server-Side GTM",
      "description": "It can be daunting and frustrating to add another piece of technology and complexity to your analytics stack. Still, we explain why server-side GTM may be worth the migration.",
      "url": "https://www.measurelab.co.uk/insights/blog/why-server-side-gtm/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/why-server-side-gtm/#webpage"
      },
      "datePublished": "2023-04-26T16:39:36.000+00:00",
      "dateModified": "2026-01-27T11:24:20.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/measurelab-blog-ga4-streaming-to-bigquery_1200x400-blog-2-2.png",
      "author": {
        "@type": "Person",
        "name": "Matthew Hooson",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Tag Manager",
        "Server-side Tagging",
        "Google Analytics",
        "BigQuery",
        "Privacy",
        "Conversion Tracking",
        "Debugging",
        "Testing",
        "Google Cloud",
        "Ecommerce"
      ],
      "articleBody": "Not another migration!?\n\nI know, I know, “not another piece of technology for web analytics,” you cry, “I just got done migrating to GA4, setting up Consent Mode, and exporting my data to BigQuery!” you plead. Despite my bias toward a fascination with tech in this space (I am an engineer, after all), I understand your frustration. Finding your way to meaningful analysis and ROI can be challenging when you need to play a game of neverending whack-a-mole with emerging tracking technologies.\n\nAt what point can you sit back and reap what you have sown? Why does the web/marketing analytics technology stack seem to be in such a state of metamorphosis? I would put this shift into two buckets. Bucket 1 is the war of attrition against the 3rd party cookie, and bucket 2 is the ever-changing, ever-confusing world of privacy and security legislation.\n\nBoth buckets can, will, and have profoundly affected how data is collected and how you can use it. Server-side Google Tag Manager (sGTM), the reason I have gathered you all here today, helps to solve some of these emerging and established issues and is perhaps something you should seriously consider. It also comes with a new set of learnings and complexities that need serious thought. So, what on earth is it, and why should you perhaps plan for one more migration?\n\n\nWhat is it?\n\nI am not going into aching levels of detail here, the technology has been around for a while, and many people have done a better job than I could do explaining how it all works. But in a nutshell, a standard GTM container does its processing, JavaScript downloading and parsing, data wrangling and forwarding from the user's browser. Third-party tracking scripts collect the data you expect and a little you might not. It is all familiar, warm, a possible drain on-site load times, and a source of a growing list of data governance headaches.\n\nServer-side GTM moves all of the above to a server under your control. Think of it as a go-between, grabbing data sent by your site and processing everything before it is sent out to any analytics or marketing endpoints. In most cases, the server exists as a set of App Engine or Cloud Run instances, scaling up and down depending on the requests being received (nothing is forcing you into a Google Cloud Platform (GCP) hosted server other than its simplicity).\n\nIt can help solve many of the site load, data governance and security problems we have already hinted at, which I’ll go into more detail on. Check out the below diagrams to get a visual idea of how sGTM and browser-based containers differ.\n\nFigure 1: Traditional client-side (browser side) GTM architecture (from Google documentation)\n\nFigure 2: sGTM architecture (from Google documentation)\n\n\nWhat use is it?\n\nWe know what it is and some of the problems it is looking to solve, so let’s go into more detail on what it offers and why you may be tempted to bite the bullet.\n\nGranular control over data\n\nWith sGTM, all tracking data is sent to a server you own before being forwarded to any 3rd parties. You have complete control over what format that data is sent in. For example, you may wish to ensure any personally identifiable information (PII) data received is encrypted before sending it to its destination. Likewise, you may want to ensure a specific 3rd party receives no PII data.\n\nBy the server acting as a fully-controlled intermediate step, you can ensure the data you want, in the format you wish, is sent to external marketing and analytics partners. This granular control helps shore up any nasty PII leaks and gives you a complete picture of what data you are sending out.\n\nCleaning up CSPs\n\nAnother benefit from a data governance perspective is the clean-up of content security policies (CSPs). The CSP is a security feature that helps protect websites from cross-site scripting (XSS) attacks and other types of injection attacks. It specifies a list of approved domains from which the website can load resources, such as scripts, style sheets, and images.\n\nUnfortunately, when a tag management system (TMS) such as the client-side version of GTM (cGTM) is implemented on the client side, each tag typically requires its domain to be listed in the CSP to function correctly. This need can lead to many domains being recorded, making it more challenging to maintain and update. With sGTM, the CSP need only contain the domain of the server (assuming you can move that piece of functionality over) and makes managing which sites and applications have permissions much more straightforward.\n\nFirst-party cookies and server-managed Client IDs\n\nServer-side GTM, Google Analytics 4 (GA4) and Universal Analytics (UA) client templates facilitate the implementation of a server-managed Client ID. When this option is enabled, the server response writes a first-party cookie with the HttpOnly flag called 'FPID'.\n\nThis flag means the browser cannot remove or manipulate the cookie, which is how Safari’s ITP has affected the lifespan of JavaScript cookies in the past. However, Apple has closed this loophole by redefining first-party cookies as those set by the specific IP of the site. Although the server is on the same domain, it doesn't share the IP, so the cookie may still be degraded as before.\n\nDespite this, an argument could be made for the benefits of first-party trust. Since first-party cookies are set by the website that the user interacts with, a direct trust relationship exists between the user and the website. In contrast, third-party cookies are set by a different website, raising privacy concerns from the user's perspective. However, these advantages could be diminished by browser restrictions and privacy regulations.\n\nAnother potential advantage of first-party cookies is security. They are often encrypted and transmitted over secure HTTPS connections, helping to protect them from interception and tampering. Third-party cookies, on the other hand, can be vulnerable to interception and manipulation by malicious actors, which may compromise the user's privacy and security.\n\nImproved site performance\n\nAs mentioned, the user's browser is doing a lot of heavy lifting when it comes to marketing and tag-related JavaScript. One of the main benefits of sGTM is that it can improve a website's performance. Tags and tracking scripts are loaded from the server instead of the user's browser, which can help reduce page load times and improve the user experience. These improvements depend on the number and type of tags, and not all sites will see significant performance improvements.\n\nAnother potential benefit is that as the volume of data and the number of tags increase, the performance of cGTM can be impacted, leading to slower page load times and potential errors. sGTM can help address this issue by offloading some of the processing and handling of data to the server, allowing for improved scalability and performance.\n\nTake advantage of conversion APIs\n\nTransitioning to sGTM allows users to leverage powerful tools such as Facebook's Conversions API (CAPI) and Google's Enhanced Conversions. These features enable businesses to optimise their advertising efforts by securely sharing conversion data directly from their servers, bypassing browser-based tracking limitations.\n\nBy utilising sGTM, advertisers can maintain accurate conversion tracking and attribution, even in the face of increasing privacy regulations and browser restrictions. Furthermore, sGTM enhances data security and accuracy by reducing the risk of data loss or tampering associated with client-side tracking.\n\nData Enrichment\n\nAs our sGTM server is (probably) hosted in a GCP project, there are opportunities to utilise other GCP services to enrich data. One example of this available now is the Firestore look-up table. Where Cloud Firestore is a flexible, scalable, and fully managed NoSQL database service provided by Google for web and mobile app development. This server-side variable can be added to the server container and will look up and return values from a Cloud Firestore document.\n\nOne possible example of its use could be looking up product data. For example, an e-commerce event could send over just a product ID to the server. The lookup table could then use this ID to retrieve additional information about the product, such as type, stock level, or colour, and add this information to the event before it is sent to Google Analytics or any other endpoint.\n\n\nIs it a no-brainer?\n\nThe unsatisfying answer is of course 'it depends'. It depends on what your aims are as a company/site owner. If you are striving for a temple of gold-standard data governance and privacy, then the added granular control over what data is sent where is undoubtedly a pillar. Or you may want to do all you can to speed up site load times on an application with escalating tracking complexity. In that case, moving away from browser-based processing has obvious advantages.\n\nBut there are a few more things to consider with sGTM that make it a much more complex beast than its younger counterpart, cGTM. Before embarking on any sGTM project, it is critical to ensure that you understand what it is and how it works. Below are some things you need to be cognisant of to ensure success. Your company may need more internal resources to effectively and safely manage this type of technology in the immediate term.\n\nA new way of thinking about GTM\n\nMany will be well used to cGTM by now. Its UI, tag, trigger, and variable set-ups, and its methods for previewing and debugging. With sGTM, things are different. The UI looks similar, and the concepts of tags, triggers and variables remain the same, but there are new concepts to get your head around.\n\nNew ideas like ‘clients’ (used to capture, parse and respond to HTTP requests), HTTP-only first-party cookie settings, and different processes for preview and debugging may be noodle scratchers. I have no doubt anyone with knowledge of cGTM will be able to find their way around with some…"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/custom-insight-email-alert-ga4/#article",
      "headline": "How to set up GA4’s custom insights and email alerts",
      "description": "What are custom insights?\n\nSometimes the data available in Google Analytics 4 (GA4) can seem a bit overwhelming especially if you have a complex site with lots of users coming and going every day. It can often seem difficult to quickly identify the most important trends or anomalies. Thankfully GA4’s Analytics Intelligence is here to help bring some much needed clarity. This is a group of features that uses modelling to help you understand your data. Insights is one such feature and it comes in ",
      "url": "https://www.measurelab.co.uk/insights/blog/custom-insight-email-alert-ga4/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/custom-insight-email-alert-ga4/#webpage"
      },
      "datePublished": "2023-04-17T08:59:13.000+00:00",
      "dateModified": "2026-01-27T11:24:21.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/analytics-sub_uaga4-1200x400-blog.png",
      "author": {
        "@type": "Person",
        "name": "Timothy Gorringe",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "How-to",
        "Google Analytics",
        "Looker Studio",
        "AI & ML",
        "Marketing"
      ],
      "articleBody": "What are custom insights?\n\nSometimes the data available in Google Analytics 4 (GA4) can seem a bit overwhelming especially if you have a complex site with lots of users coming and going every day. It can often seem difficult to quickly identify the most important trends or anomalies. Thankfully GA4’s Analytics Intelligence is here to help bring some much needed clarity. This is a group of features that uses modelling to help you understand your data. Insights is one such feature and it comes in two varieties, Automated Insights and Custom Insights.\n\nGA4's automated Insights use machine learning to detect trends and anomalies in your data and then presents them to you on the GA4 homepage and in the Insights dashboard.\n\nCustom insights takes this further by enabling you to set your own conditions so that you can see the changes in specific parts of your data that are important to your business. Perhaps one of the best parts of this feature is that you can set up email alerts so that you and anyone else in your business can be notified when new custom insights are surfaced.\n\n\nWhat is an anomaly?\n\nAutomated and custom insights can detect anomalies in the data. This is an exciting new feature for GA4 and is what makes insights so powerful, but you're probably wondering how GA4 detects these anomalies.\n\nGA4 uses Anomaly Detection to find abnormal data within a time series of data. This relies on machine learning predicting what the data should look like based on its observation of historic data. If the actual data appears a particularly long way off this prediction (data falling outside the credible interval) then it is counted as an anomaly.\n\nA concept called principal component analysis (PCA) is also used to detect anomalies simultaneously over several metrics and dimension values at the same point in time. Dimensions and metrics are normalised by the number of users within multiple segments. If any segments show a significant deviation in the data and at least 0.05% of users on the property are affected then these segments are counted as anomalies.\n\nThe direct benefit of Anomaly Detection for organisations is that GA4 can quickly find useful insights and potentially time critical anomalies in the data and present them to the user. This means the organisation can save time and resources that would have otherwise been spent on analysts painstakingly checking every possible combination of dimensions and metrics for these anomalies in the data.\n\n\nWhere to find your insights\n\nWhen you open your GA4 property you will be taken to the home page. This contains some overview report cards on basic KPIs as well as a real-time summary.\n\nIf you scroll down to the bottom of this page you will find the ‘Insights and recommendations’ section. This is where you will see a selection of your automated insights.\n\nTo view and manage all of your insights, as well as create new insights, simply click on ‘View all Insights’ in the top right corner of the ‘Insights and recommendations’ section. This will then take you to the insights dashboard. If you click on an insight you will see more information appear to the right of the screen.\n\n\nHow to create your first custom insight\n\nTo create a custom insight you will first need to consider what kind of data is most important to your organisation and to any stakeholders who may access your GA4 property. Maybe there’s a particular type of conversion that is critical to your revenue stream or maybe your email marketing team wants to know about any drops in email acquisitions. However, if you are unsure and just want to get started straight away GA4 does also recommend some custom insights.\n\nTo start, you’ll need to click on the create button in the top right of the Insights dashboard. If you can’t see the create button or if it is greyed out you may not have a high enough access level on the GA4 property. You need to have either the analyst (or above) role to create a custom insight.\n\nYou’ll then be presented with the option to pick a suggested custom insight or start from scratch and define your own rules.\n\nIn this case we want to create a new custom insight from scratch so we’ll click ‘create new’ at the bottom of the page. Now we can set our conditions. The evaluation frequency will determine how often GA4 will check the conditions to determine if there has been a significant enough change in the data. You can choose hourly (web data only), daily, weekly or monthly.\n\nSegment allows you to choose which groups of users should be included in the insight. This is done by setting conditions to include or exclude the relevant dimensions. Within the segment builder you can select up to 5 conditions. In our example we’re going to select ‘first user medium’ and set the dimension value as ‘email’.\n\nThe next step is to select the conditions required for your insight to trigger. You need to select the metric, which in our case will be ‘Total users.’ Next we’ll select the condition itself. This can be set to be an anomaly or any change by a certain count or percentage. If you’re using a percentage you’ll also need to set a comparison period to be either yesterday, same day last week or same day last year.\n\nYou’ll then need to name your insight. You’ll need to make sure this name can be understood by anyone who’s receiving the notification.\n\nThe final step is to select the email addresses you wish the notifications to be sent to. This can be anyone who has access to your GA4 property. In our scenario, for example, we would want everyone in the email marketing team to be notified when the insight is triggered. To do this we’ll simply enter each of their email addresses separated by commas.\n\nOnce you’ve entered all your email addresses you’ll need to scroll back up to the top of the page and click ‘Create’ in the top right corner to finish building your insight.\n\n\nHow to manage your insights\n\nManaging your insights is easy. For automated insights you can leave feedback to help GA4 show the kinds of insights that would be most useful for you. This is done by hovering over the top right corner of the insight card and clicking either thumbs up or thumbs down. GA4 will then start tailoring your insights to be more relevant to your needs.\n\nTo manage your custom insights you’ll need to scroll to the bottom of the home page and click on ‘View all Insights’ in the top right corner of the ‘Insights and recommendations’ section. On the insights dashboard click on ‘Manage’ in the top right of the page.\n\nYou’ll then see a list of your custom insights. Click the 3 dots on the right of your custom insight. From here you can choose to delete or edit your insight.\n\n\nCongrats!\n\nIf you’ve been following along, congratulations you’ve made your first custom insight in GA4. Your team will thank you when they get timely notifications on major changes in their data. In our scenario our email marketing team can breathe a sigh of relief as they’ll now get notified if their campaigns suddenly start underperforming!\n\nIf you’ve found custom insights to be particularly useful for your team we’d love to hear your tips on how to get the most out of this amazing feature.\n\nIf you need help getting started on your custom insights or just figuring out what you want to track in the first place, get in touch today."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/create-customised-events-ga4/#article",
      "headline": "How to create events in GA4 using the UI",
      "description": "Google Analytics 4 (GA4) now gives users the ability to create new events or modify existing events through the use of the GA4 user interface. This is a fantastic add-on available to all and will be welcomed by those who are not familiar with their existing tag management system or do not have the relevant tech resources available to make some changes in a timely manner.\n\n\nWhy would you create an event?\n\nFirst of all, creating a new event keeps you safe from interacting with existing events that",
      "url": "https://www.measurelab.co.uk/insights/blog/create-customised-events-ga4/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/create-customised-events-ga4/#webpage"
      },
      "datePublished": "2023-04-11T09:41:59.000+00:00",
      "dateModified": "2026-01-27T11:24:22.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/analytics-sub_uaga4-1200x400-blog-1.png",
      "author": {
        "@type": "Person",
        "name": "Olade Honvo",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "How-to",
        "Google Analytics",
        "Google Tag Manager",
        "Conversion Tracking",
        "Testing",
        "Ecommerce"
      ],
      "articleBody": "Google Analytics 4 (GA4) now gives users the ability to create new events or modify existing events through the use of the GA4 user interface. This is a fantastic add-on available to all and will be welcomed by those who are not familiar with their existing tag management system or do not have the relevant tech resources available to make some changes in a timely manner.\n\n\nWhy would you create an event?\n\nFirst of all, creating a new event keeps you safe from interacting with existing events that may be powering reports or other business-critical systems. It would be hard to list all the use cases, as there are many reasons why one would want to make use of the game changing feature in GA4.\n\nOne obvious reason would be when there is a need to quickly add a new event into the reports where tech resources are not available, or limited. This feature could be used as a temporary fix pending a more permanent update to the tracking code via Google Tag Manager (GTM) or developers. Furthermore, GA4 is designed with app and web convergence in mind, it is easy to imagine that creating events via the user interface is by no means limited to web and can also be extended to app. Most web analysts or analytics consultants (including myself) can be very good at handling web implementation, but not so much when it comes to apps. Unlike before, we now have a powerful tool that helps us remove any blocker related to app development and new version releases.\n\n\nHow to create an event\n\nBefore we begin, one key element to mention is to ensure users have the required role in order to ensure tight control of events that are created. Users who can create events need to have either Administrator, Editor or Marketer access level in GA4.\n\nCreating an event supposes the existence of an event in GA4. In order to verify the list of events that are currently tracked in a given GA4 property, please visit Admin > Events:\n\nWhen clicking on ‘Create event’ you are first presented with a page that shows you all events that have already been created. Continue by clicking on ‘Create’ at the top, to be presented with the page below:\n\nThe next steps are as follows:\n\n 1. Choose an event name for the event you intend to create.\n 2. Choose an existing event as a source event.\n 3. (Optionally) choose an event parameter(s) to filter on.\n\nFurther to that, you are also given the option to re-use any parameter of the existing event and set up the appropriate parameter configuration. In most cases, you’ll leave this checkbox ticked. For a detailed description and walkthrough on modifying events, please visit the blog How to modify events in GA4 by Timothy Gorringe.\n\nAfter you create a new event, GA4 gives you the option to delete if you need to. To do so, you will find a vertical ellipsis at the top of the top right of the screen, click on it and choose ‘Delete’.\n\nExample\n\nIf for example, I would like to create a new event called “brochure_request_confirmation” when a user visits any of the following pages:\n\n * www.mysite.com/brochure\n * www.mysite.com/about/brochure\n * www.mysite.com/brochure/download\n\nThen I would use the ‘page_view’ event as the source event, on all pages that contain “brochure” in the URL (i.e. in the page_location parameter). You can even use regex as a matching condition!\n\nBased on this configuration (see screenshot below), my new event named ‘brochure_request_confirmation’ will be created for each and every page_view event where the page_location parameter contains “brochure”:\n\nAfter creating your event, you are given the option to mark it as a conversion event. About a day after you have created the event, it will show in the Admin > Events screen where you can mark the event in question as a conversion by toggling the appropriate button.\n\nHowever if you are unable to locate the event you have created recently, but still want to mark it as conversion, you can navigate to Admin > Conversions screen and click ‘New conversion event’. At this stage you can input the event name (please note it is case sensitive).\n\nYou may be wondering why or what is the added benefit of making an event as conversion? If so, do you remember ‘Goals’ in Universal Analytics? If you do, then marking this newly created GA4 event as a conversion allows you to create an equivalent of a Universal Analytics destination Goal! Having said that, please note that Universal Analytics Goals are session-scope, unlike goal conversions in GA4 which are event-scope. I therefore invite you to be mindful, and above all, verify that your GA4 conversion events align with the former Universal Analytics Goals before you sign off your implementation and start using your data (the ‘Validation’ part of our PIVOT GA4 migration process).\n\n\nHow to check it’s working\n\nTesting that your new event is actually working as you expect is a non-negotiable part, especially when collecting/manipulating data.\n\nThere are certainly many ways to ensure the event that has newly been created is yielding the expected result. We will focus on one such way - using the real-time report. GA4 has a built-in real-time feature which allows us to see in near real-time each and every event that has been received and processed in the last rolling 30 minutes.\n\nYou may first want to log a few events that meet the requirements of the newly created event (i.e a page containing “brochure” in our example).\n\nOnce you have opened GA4, click on ‘Reports’ in the furthest left summary section, followed by a click on ‘Real-time’. The Event count by event name card is the one we are interested in. Assuming we have successfully created the event, this is where we would hope to see our newly created event.\n\n\nLimitations\n\nAs handy as it can be in speeding up the implementation of new events, it is important to be aware of some restrictions around event creation:\n\n   \n * Use recommended event names if possible (see our full guide on GA4’s event types for details)\n   \n     \n   * And avoid using event reserved event names\n     \n   \n   \n   \n * Event creation allows a maximum limit of 50 events\n   \n   \n * Event creation is not retroactive and do not affect historical data\n   \n   \n * Parameters in the ‘item’ array (used in ecommerce tracking) cannot be used to define a new event\n   \n   \n * It can take up to an hour before the event start to show in GA4\n   \n\n\nConclusion\n\nIf you are reading this section, you have probably managed to get through each and every line above. Well done! It is now your turn to experiment with the event creation tool via the GA4 user interface. Remember, each implementation requires testing, just to make sure you did it correctly, but on top of that, so you do not miss days of data.\n\nThis new feature from GA4 is game changer, it grants non-technical minded users the ability to perform some minor and some major changes pending implementation from a technical specialist. If you have any questions about how to use this feature, or would like to chat about ways we can assist you in this, please get in touch."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/users-ga4/#article",
      "headline": "What is a 'User' in GA4?",
      "description": "GA4 doesn’t track people, it tracks users. But users are the closest proxy we have to counting people, so we end up just using it anyway, but do you know what it means?",
      "url": "https://www.measurelab.co.uk/insights/blog/users-ga4/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/users-ga4/#webpage"
      },
      "datePublished": "2023-03-16T12:59:12.000+00:00",
      "dateModified": "2026-01-27T11:24:23.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/analytics-sub_uaga4-1200x400-blog-2.png",
      "author": {
        "@type": "Person",
        "name": "Nasima Khatun",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Looker Studio",
        "Privacy",
        "AI & ML"
      ],
      "articleBody": "First thing first, users are not people!\n\nOften we get asked “how many people did X on the site yesterday” or something like that, which is not possible to answer in Google Analytics 4 (GA4). GA4 doesn’t track people, it tracks users. But the reality is that users are the closest proxy we have to people, so we end up just using it anyway. And even rename it to ‘people’ in our reports and dashboards to prevent having this conversation each and every time…\n\n\nActive Users vs. Total Users\n\nGA4 defines an ‘active user’ as a person who has an engaged session, or when Analytics collects the first_visit from a website or first_open event from an app. So every new user and non-bouncing returning users are counted as ‘active’.\n\nOn the other hand, ‘total users’ is a total count of all users to the website and apps, regardless of their engagement or whether or not it’s their first time.\n\nOne of the major differences from Universal Analytics (UA) is that active users now take centre stage in Google Analytics 4. While most data from UA concentrates on total users, GA4 concentrates on active users.\n\nWherever you see the metric ‘Users’ in GA4, it is showing ‘Active Users’.\n\n\nIdentity methods\n\nGA4 has four different ways to identify users:\n\nUser ID\n\nUser ID is the process of identifying the user yourself, and then sending that data into GA4 to use. This is only applicable if you have some way for a user to identify themselves, for example if they log into an account.\n\nWhen a user registers for an account or logs in to an existing account, you can pass that user ID into GA4 to link all of their subsequent website or app events. As a result, you get a more full picture of how customers behave and interact with your company over time across different platforms (app and web), as well as across different browsers and devices.\n\nYou must manually implement User ID in your website and/or app tracking in order to use it with GA4. A user's user ID is passed into GA4 via the ‘user_id’ user property. Sending this in with every event, GA4 connects all activities associated with that user ID to a single user profile, providing a more complete view of user behaviour.\n\nGoogle signals\n\nGoogle Signals is an optional feature in GA4 that is used to connect your website and app data to Google’s own data. Part of this feature is used for identifying users by utilising data from logged-in Google users who have given permission to share their information.\n\nData thresholding may result when Google Signals data is used for user identification. In circumstances where Google Signals is enabled, you can avoid data thresholding by using the ‘device-based’ reporting identity.\n\nDevice ID\n\nEvery user or device that interacts with your website or app is given a special identity called a ‘Device ID’ in GA4. It makes it possible for GA4 to distinguish between several users and sessions and to monitor user behaviour across various devices.\n\nFor websites, the Device ID is a first-party cookie called _ga which is placed on the user’s browser and contains the Client ID. The Client ID is thereafter provided to GA4 with each succeeding hit, enabling it to monitor the user's behaviour over time for that browser.\n\nIn apps, it works almost exactly the same, but the Device ID is the App Instance ID.\n\nModelling\n\nThis is GA4’s way to account for non-consented user data by using machine learning to ‘fill in the gaps’. We have written up a deep-dive all about how this works if you want to learn more.\n\n\nReporting identities in GA4\n\nGA4 allows you to define what a user actually is. That is, what of the different identification methods should be used to deduplicate against. These are called Reporting Identities, and there are three available to use:\n\nIt is important to note, each of the three options will result in different counts for user-based metrics within the interface and in the Data API (i.e. in your Looker Studio dashboards). Changing the reporting identity does not permanently alter the underlying data in GA4, you’re free to change this as many times as you like and the data will be updated instantly across all the reports.\n\nBlended\n\nThe blended reporting identity option loops between all four methods of user ID:\n\nIn order to distinguish between users and group events for reporting and exploration, it first employs the user ID. GA4 takes data from Google signals if it is available in the absence of a user ID. Analytics uses the device ID if neither the User-ID nor the Google Signals information is available. In the absence of a device ID (where consent if not granted), GA4 uses its machine learning modelling where possible.\n\nObserved\n\nThe observed reporting identity utilises all trackable IDs, but excludes modelled data:\n\nIf a user ID is collected, it is used first. GA4 takes data from Google signals if it is available in the absence of a user ID. If neither are available, GA4 then uses the device ID.\n\nDevice-based\n\nThe device-based reporting identity ignores any other IDs that are gathered, and only uses the device ID:\n\nThis approach aligns most closely with user calculation in Universal Analytics."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/utm-campaign-parameters-ga4/#article",
      "headline": "Using UTM parameters for tracking campaigns in GA4 (properly)",
      "description": "UTM parameters are essential to be able to measure your marketing links and campaigns effectively in GA4. In this guide, I show you what they are and how to use them properly. There's also a free Google Sheet to use yourself to manage the link building process.",
      "url": "https://www.measurelab.co.uk/insights/blog/utm-campaign-parameters-ga4/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/utm-campaign-parameters-ga4/#webpage"
      },
      "datePublished": "2023-03-06T09:50:27.000+00:00",
      "dateModified": "2026-01-27T11:24:24.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/analytics-sub_uaga4-1200x400-blog-3.png",
      "author": {
        "@type": "Person",
        "name": "George Mendham",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Google Ads",
        "How-to"
      ],
      "articleBody": "When Google bought Urchin and adopted the usage of UTM parameters (Urchin Tracking Module to the uninitiated), I was 6 and little did I know these UTM parameters would play such an important role in my life.\n\nWith the news of Google sunsetting UA, an increasing number of people are now using, or planning to use, Google Analytics 4 (GA4) day to day. As everyone starts to use GA4 more, one of the most frequent requests I get is for us to update the default channel groups. Rather than do this, we try to advise clients to utilise the existing channel groups in GA4 which have been predefined for us using a combination of traffic sources and some rather wide RegEx rules (seriously really wide RegEx!).\n\nCustom channel groups are available in GA4 - more to follow on this!\n\n\nRemind me, what are channel groups?\n\nSimply put, channel groups are a way of Google bucketing traffic together based on its origin. These channels are then surfaced in Google Analytics and allows users to view traffic levels, users, conversions and ultimately determine what channels are proving most successful and therefore should receive more/less investment.\n\n\nOkay - but how does this all work?\n\nWell the same Urchin technology from 2005 hasn’t changed too much. Google still uses the same parameters: utm_source, utm_medium and utm_campaign to categorise the traffic into channels. The only difference is that there is now a list of predefined Video, Social, Shopping and Search utm_sources that Google uses within the channel group rules.\n\nSo for example, a link appended with\n\n?utm_source=facebook&utm_medium=social\n\nwould be categorised correctly with the source/medium of “facebook / social”, however\n\n?utm_source=youtube&utm_medium=social\n\nwould be ‘Uncategorised’ due to the value in the utm_source being seen as ‘Video’ not ‘Social’.\n\n\nDoes that mean I need to tag everything with these ruddy UTMs?!\n\nYes and no - never a straightforward answer! A lot of platforms out there have incorporated automatic campaign tagging within their settings, say for example HubSpot and Mailchimp - any email sent from these platforms will populate the utm_source, utm_medium and utm_campaign with the correct values if the setting is enabled. Other platforms such as Google Ads have a native connection called auto-tagging, and so you’ll want/need to connect your Google Ads property to your GA4 property and then you’ll get accurate campaign reporting across your paid campaigns.\n\nFinally there are some instances where you’ll inevitably need to create your own custom links that incorporate the UTM tracking for example if you’re working with a 3rd party and want to see traffic from their site or app. In this case, we’ve put together a handy link builder Google Sheet that you can use to build out your own custom links. It also includes a validation step to ensure that the correct source is imputed and traffic isn’t going to be attributed to the wrong channel in GA4.\n\n\nUsing the UTM link builder Sheet\n\nOpen the Google Sheet - Measurelab - GA4 - UTM Link Builder.\n\nTo use the sheet, firstly make yourself a copy by going to File > Make a copy:\n\nNow you have your own copy, select the channel from the drop down menu in column D of the ‘UTM Link Builder’ tab. Based on your selection, this will automatically populate column E with the correct ‘utm_medium’ you will need to use. Then you will need to populate column F with your ‘utm_source’.\n\nIf the source you enter is included in Google’s predefined list of sources then column G will be populated with a tick. Otherwise you will need to enter an alternative ‘utm_source’ as your traffic may be misattributed.\n\nFeel free to then populate any/all of the columns H-N and then finally input your URL into column O. Your final tagged URL will be automatically generated in column P which you can then use in your links/ads to track your campaigns.\n\n\nIs there any other way?\n\nAlways! There are tools like UTM.io that manage all your UTM’d links in a web platform - and they even have a handy Chrome extension too.\n\nYou can always build them one-by-one using Google's own link builder tool.\n\nThere is even the website utmbuilder.net that is dedicated to all things UTMs, and even has a list of other UTM link builder sheets you can use. I haven’t vetted each and every one on that list, but we have put everything we’ve learnet into our one above - I can vouch for that one at least!\n\nThis is by no means a comprehensive list of resources, but should give you everything you need to know to make a start and get using UTMs in GA4 effectively.\n\n\nIn review\n\nFortunately (or unfortunately), UTM parameters are here to stay and without the proper care and attention traffic and conversions may be incorrectly attributed. So, while you migrate your teams and sites to GA4 hopefully this link builder tool will create one less headache for you!\n\nWe’re here to help, so get in touch with me/us if you have any questions on UTMs, or if you’d like to suggest an update to the UTM link builder sheet itself."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/google-analytics-360-ga360-ga4/#article",
      "headline": "What is Google Analytics 360 (GA360) for GA4?",
      "description": "Google Analytics 360 (GA360) is worth knowing about, especially if you’re using Google Analytics 4 (GA4) to report on a business that gets a lot of daily traffic; has multiple analytics projects dependent on the BigQuery extract; operates on a lot of different sites and/or apps or has a particularly",
      "url": "https://www.measurelab.co.uk/insights/blog/google-analytics-360-ga360-ga4/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/google-analytics-360-ga360-ga4/#webpage"
      },
      "datePublished": "2023-03-01T13:10:24.000+00:00",
      "dateModified": "2026-01-27T11:24:25.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/analytics-sub_uaga4-1200x400-blog-4.png",
      "author": {
        "@type": "Person",
        "name": "James Humphreys",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Google Tag Manager",
        "Looker Studio",
        "BigQuery",
        "Privacy",
        "Data Analysis",
        "AI & ML",
        "Marketing",
        "Google Ads",
        "How-to"
      ],
      "articleBody": "Google Analytics 360 (GA360) is worth knowing about, especially if you’re using Google Analytics 4 (GA4) to report on a business that gets a lot of daily traffic; has multiple analytics projects dependent on the BigQuery extract; operates on a lot of different sites and/or apps or has a particularly large number of users all utilising the same GA4 Property.\n\nIf you’re really pressed for time, the nutshell summary is that GA360 is a paid-for upgrade to GA4 that has far higher data limit caps (and GTM360 bundled in too).\n\nWhen I was asked to write a blog post about GA360 my first thought was “Sure! GA360 is absolutely worth knowing about!” and my second thought was “I’ll get ChatGPT to write it for me!”\n\nSo that’s what I did, and the GA360 blog ChatGPT wrote was… fine. All I really needed to add was corrections to all the parts it got wrong, details about the parts it vaguely referenced without important context, and some “I’m a human and I’ve actually done this for real” examples.\n\nYou know, editorial stuff.\n\n\nWhat is GA4 360?\n\nGA360 is the enterprise version of Google Analytics 4. It is designed for large businesses that need more advanced analytics capabilities than what the standard version of GA4 offers. With GA360, businesses can track user behaviour across multiple devices and platforms, create custom reports, and access advanced insights and data analysis tools.\n\nChatGPT\n\nThis is true, I suppose. But is it just me, or does the way it’s all worded imply that these features are exclusively in GA360, not in the free version of GA4? That’s not the case.\n\nIf you had the UA’s flavour of GA360 back in the days of Universal Analytics, you’ll have an idea what to expect with GA360 - GA360 is effectively the same service as GA4, with the exact same UI and functionality (despite what ChatGPT implied) but with far less quotas, less data caps, and less limitations.\n\nThose exact differences in the higher amount of data you’re permitted to collect/report on/retain in GA360 are the key to understanding whether GA360 is right for your business.\n\nIf you’re currently on GA4 and considering the move to GA360, I’d recommend familiarising yourself with the scale of the data you currently process in GA4 and comparing it to the details on this page.\n\nBut I’m getting ahead of myself! Perhaps ChatGPT was about to say exactly the same thing…\n\n\nHow does GA360 differ from regular GA4?\n\nGA4 360 offers several additional features that are not available in the standard version of GA4. Some of the key differences include:\n\nData limits: GA360 offers higher data limits, which makes it ideal for businesses that generate a large amount of data.\n\nChatGPT\n\nNo arguments from me on that one! The elephant in the room (which ChatGPT misses) is the BigQuery export; in regular GA4, you’re limited to 1 million events in your daily exports. In GA360, that number becomes “billions”.\n\nMany of our largest clients at Measurelab depend upon the BigQuery export. If your business has a large, dedicated analytics team familiar with SQL or BigQuery; or a large data lake into which you want an unfiltered feed of web & app data from GA4; or you have a BigQuery connection that likely to capture (or already hitting) more than 1 million events a day, then GA360 and the gigantic amount of “room” it affords your BigQuery export may be the solution for you.\n\nData modeling: GA360 includes advanced machine learning capabilities that allow businesses to analyze their data more effectively and gain deeper insights into user behavior.\n\nChatGPT\n\nOk, I’ve crossed that one out because it’s quite misleading.\n\nThe way in which GA360 models user data is exactly the same as GA4. If you’re using Consent Mode, GA360 does use machine learning to enrich that user data, but the same is also true of regular GA4. There’s just more data available in GA360 before you hit quota limits.\n\nIn GA4 you can categorise users with up to 25 user-scoped custom dimensions per property; in GA360 that number becomes 100.\n\nIn GA4 you can only define 100 audiences; in GA360 that number becomes 400.\n\nThose higher data-capture thresholds absolutely will allow for more nuanced, granular audience definitions which, in turn, open up the possibility of some really cool and detailed user behaviour insights. If I was feeling generous I’d give ChatGPT the benefit of the doubt and say that’s what it was going for.\n\nBut once more to be clear; there’s no secret “extra” machine learning paywalled behind GA360. At the risk of being a broken record; GA360 is more about lifting the caps and limitations of regular GA4 for larger businesses.\n\nIntegration with other Google products: GA360 integrates seamlessly with other Google products such as Google Ads, allowing businesses to create more effective marketing campaigns.\n\nChatGPT\n\nTrue, but again we’re choosing an odd point to focus on; GA4 also integrates with Google Ads. It’d be weird, from a business perspective for Google, if it didn’t, right?\n\nFar more interesting is that GA360 comes bundled with Google Tag Manager 360 (GTM360). GTM360 is an advanced version of Google Tag Manager that is designed to work seamlessly with GA4 360. It includes additional features that make it easier to manage and deploy tags, and it is included with the purchase of GA360.\n\n\nHow much does GA4 360 cost?\n\nThe cost of GA360 varies depending on the size of the business and the level of analytics support required. However, it is typically more expensive than the standard version of GA4.\n\nChatGPT\n\nBoth of these points are correct; GA360’s cost does scale to the size of your business, but you can expect that price to start from a baseline of at least $50k per year.\n\nRegular GA4 is free, so… I guess I agree with ChatGPT’s summary that GA360 is “typically more expensive”\n\n\nHow to ascertain whether you need GA4 360 or not?\n\nIf you're a small business with a relatively simple online presence, the standard version of GA4 should be sufficient. However, if you're a large business with multiple websites or platforms, or if you need more advanced analytics capabilities, GA360 may be a better option.\n\nChatGPT\n\nHear hear!\n\nAt the end of the day, it's important to assess for yourself whether your business needs GA360.\n\nLarge businesses with high traffic volumes, multiple sites or the need for an unfiltered BigQuery export should look into it as soon as possible.\n\nBut there’s plenty of other reasons you might want to have those higher caps.\n\n * Does your site or app have an above-average amount of interactivity, or is your event-tracking detailed and granular enough that your users tend to hit more than 500 events per day? With regular GA4, 500 events per day per user is the absolute limit; in GA360 you can track 2000.\n * Does the 14 month data retention period within the GA4 UI not give you enough historical data to benchmark against, or are your traffic volumes large enough that the Google SLA’s have defined your business as Large/XL and capped that retention at 2 months? With GA360 you could potentially store up to 50 months… unless you’re an “XL” business in which case it remains 2 months.\n * Event Parameters don’t currently pull in through the Looker Studio Connector for GA4, unless you map them (again) to an event-scope Custom Dimension; do this a few times, and you’ll quickly run out of the 50 event-scope custom dimensions you’re allowed in regular GA4. In GA360, that number becomes 125.\n\nThe list of “other” reasons a business might want the higher caps of GA360 could go on infinitely - oftentimes, either an investigation or a conversation bespoke to your particular business is the only reliable way to make the decision whether GA360 is right for you. If you’re curious we’d recommend that you familiarise yourself with Google’s documentation on the differences, and/or drop us a message at hello@measurelab.co.uk. Just maybe don’t ask ChatGPT for advice quite yet."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/real-time-report-ga4/#article",
      "headline": "How to use the real-time report in GA4",
      "description": "The real-time report in GA4 is not without its merits. Here's what it is, how it works and how to use it and all of it's features.",
      "url": "https://www.measurelab.co.uk/insights/blog/real-time-report-ga4/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/real-time-report-ga4/#webpage"
      },
      "datePublished": "2023-02-16T08:32:00.000+00:00",
      "dateModified": "2026-01-27T11:24:25.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/analytics-sub_uaga4-1200x400-blog-5.png",
      "author": {
        "@type": "Person",
        "name": "Daniel Perry-Reed",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Data Analysis",
        "Google Analytics",
        "Privacy",
        "Debugging",
        "Testing"
      ],
      "articleBody": "The real-time report in Google Aanalytics 4 (and Universal Analytics for that matter) has always been something that I’ve described as “interesting, but not very useful” - and I stand by that. However, that doesn’t mean it’s of no use, and not without its merits. But before we get into how to use it, we have to mention what data it’s showing, as well as some caveats and considerations.\n\nFirstly, it shows only data from the last rolling 30 minutes - once it’s gone, it’s gone. That is until the next day in which it’ll appear in all the regular reports as normal.\n\nSecondly, it’s called real-time, but there can be a delay of up to a few minutes for data to get from the user's device to this report - especially for iOS and Android apps. This may not sound too bad, but if you ever need real-time data, you need it in real time. Imagine for example if you had to wait a few minutes every time you used your card to pay for something in a shop, you’d get pretty annoyed.\n\nLastly, and it almost goes without saying nowadays, it only shows data from users that have GA cookies (or equivalent app identifiers) - i.e. consent users only. That is until 8th December 2022 when GA4 introduced behavioural modelling into its real-time data. But to see any behavioural modelling in any of your reports, you’ll need to be using Consent Mode. Check out episode #42 of The Measure Pod podcast on Consent Mode and behavioural modelling for more details on what it is and how it all works.\n\nNow that the foundation has been laid, let’s look at what it can do!\n\n\nInteractive map\n\nIt is what it is, an interactive map. It shows the geographical location of your users that have visit your site/app in the last 30 minutes\n\nIt shows data down to the city level, and you can pan and zoom using your cursor and/or the +/- icons to the right of the map.\n\n\nSummary cards\n\nOut of all of the smaller charts underneath the map, the two that I find myself using time and time again is the ‘Views by Page title and screen name’ and ‘Event count by Event name’ ones:\n\nFundamentally, this shows what web pages and app screens are being looked at, and the total count of events. The latter is very useful if you’ve just pushed some new event tracking live, and want to see it come through in real-time. Logging the events yourself and seeing them appear here almost immediately is a good basic way to QA the tracking implementation.\n\n\nUser snapshot\n\nAt the top right of the real-time report, you’ll see a link button to ‘View user snapshot’:\n\nClicking this then opens up the user snapshot screen, where it picks one user that has been on the app/site in the last 30 minutes at random and shows you their activity stream:\n\nIn this screen, there’s a lot of information to look at, starting with the user’s device (1) and country they are browsing from (3). There is a macro timeline (4) and micro timeline (5) showing all of the events the user has logged with their timestamps, and then a summary of the total events they have logged in the last 30 minutes (6). If you want to cycle through to another user, you can use the toggle at the top left of the screen (2).\n\nClicking on any event in the micro timeline (5) opens up another panel in which you can see all of the event’s parameters:\n\nFor example in the above screenshot, we have selected the ‘view_promotion’ event and opened up the ‘page_location’ parameter to see that this event was logged on the homepage.\nIf you’ve read this and think that it would be great to be able to pick out a specific device (i.e. your own) for QA, then you can with the DebugView report! The DebugView report is basically the same thing as the user snapshot, but for specific devices that have been identified."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/ga4-property-data-stream-setup-best-practices/#article",
      "headline": "GA4 property and data stream setup best practices",
      "description": "How do you structure a GA4 property and data stream, what considerations do you have to watch out for, and what are the options?",
      "url": "https://www.measurelab.co.uk/insights/blog/ga4-property-data-stream-setup-best-practices/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/ga4-property-data-stream-setup-best-practices/#webpage"
      },
      "datePublished": "2023-02-15T08:45:43.000+00:00",
      "dateModified": "2026-01-27T11:24:26.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/analytics-sub_uaga4-1200x400-blog-6.png",
      "author": {
        "@type": "Person",
        "name": "Daniel Perry-Reed",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "BigQuery",
        "Google Analytics",
        "Google Tag Manager",
        "Firebase Analytics",
        "Google Ads",
        "How-to"
      ],
      "articleBody": "Google’s own guide on how to structure GA4 properties can be a great resource, but only if you have a large and complex set up - which isn’t very helpful for the majority of people and companies that will be going through this process:\n\nThe things we have to define when setting up and configuring GA4 are:\n\n * Properties - the place that all the data flows into, all reporting will be done at this level by default\n * Data Streams - the source from where you are collecting data (iOS app, Android app or website)\n\nAn analogy to put this into context is a lake (property) that is being filled up by some waterfalls (data streams). All data goes into the one set of reports, but can be fed from many difference sources.\n\nWe have outlines some scenarios below, but there are a few things to consider when planning out your property and data stream setup:\n\n 1. How many websites, domains, subdomains you are tracking\n 2. If you have staging/UAT/dev environments for your apps and/or websites\n 3. Location of your teams and how your linked ad accounts (i.e. Google Ads) are structured\n 4. If you have GA360, or are planning to get it\n\n\nDomains\n\nFirstly, the best advice we can give is to only have one web data stream if you can - especially if your website users navigate between them in a single browsing session. That is because sessions are unique to each data stream. I.e. if someone lands on data stream 1, then browses to data stream 2, this would log a new session_start event and thus increase the number of sessions, have a unique landing page, affect the average pages per session metric, and more.\n\nIf you have multiple subdomains, you can track them all within one data stream very easily, and with no additional setup required. If you have multiple (root) domains tracking in the same data stream, then you will need to configure cross-domain tracking which can be done from within the GA4 UI.\n\nIf you have completely separate websites (regardless of domain), then you could use multiple web data streams if you need to. For example, if you had a corporate/B2B website and a main/B2C website, then you could set up two data streams. The decision to set up a separate data stream within the same property, or to set up a brand new property will have to be made. I’d consider if having all the data together in all reports by default would be a benefit, or hindrance. You can always filter out what you don’t need in the reports, but that could be forgotten, or easily missed.\n\n\nTesting environments\n\nIt’s good practice to have a pre-release version of your apps and websites to be able to test functionality as well as the analytics implementation on. The best practice is to have a duplicate property in place for the UAT/staging/development environments wherever possible.\n\nFor websites this can be easily achieved by using Google Tag Manager (GTM) to swap out the Measurement ID for these sites. You could use a completely separate GTM container for these environments, but that is often too much admin to maintain two completely identical containers - but it’s possible!\n\nThe main thing to consider here is that when linking your app analytics to GA4 via Firebase, it’s a one-to-one relationship for Firebase projects to GA4 properties. So make sure that your staging/dev/UAT/test apps are in a separate project if possible. It’s hard to change this once set up, so try to consider this up front if you can.\n\n\nLocation and connected GMP accounts\n\nThe time zone and currency settings in GA4 are at the property-level. That is, all data is converted into a single time zone and a single currency - no matter where the user that visits your website/app is in the world, or what currency they spend.\n\nIf everyone that will do the reporting and analysis is based in the UK, and the business reports globally in GBP £, then setting the property to a UK-based time zone and GBP would make sense. If that’s not the case and each region requires their own version of the data, then you have two choices:\n\n 1. Upgrade to GA360 - to utilise subproperties or roll-up properties\n 2. Use a separate property for each region\n\nThe same situation arises when linking Google Ads, DV360, CM360 and SA360 to GA4. All conversions and audience in GA4 will be shared with all of the connected ad accounts. But what if you end up needing more than the limited number of conversions and/or audiences? Or what if you need to optimise a specific ad account or campaign to a specific regions conversions?\n\nIf you have the ‘purchase’ event set up, but that’s tracking purchases from your Spanish, French and German websites, then optimising your Spanish Google Ads account to the total purchases might not be ideal (or a good idea at all).\n\nThe same two choices are then raised:\n\n 1. Upgrade to GA360 to utilise subproperties (and share only the subproperty conversions, etc. with the ad accounts)\n 2. Use a separate property for each region (and only connect the specific region’s ad accounts)\n\n\nGA360 considerations\n\nAs already mentioned, upgrading to GA4’s version of GA360 is an option that some may need to consider. It’s not cheap, so not something to rush into if you’ve never paid for GA in the past. (speak to us if you want to know more, we can help figure out if you truly need to, or if there’s an alternative to paying for GA360!)\n\nThe key features of GA360 that could help when structuring your GA4 setup are:\n\n 1. Subproperties - basically GA4’s answer to Universal Analytics’ views\n 2. Roll-up properties - if you started with regional properties, this can roll them into a single set of reports (or multi-regional such as EMEA, APAC, etc.) for easier reporting\n\nIf you are on GA360 (or plan to be) before setting anything up, then you’re in a good position to build subproperties and roll-up properties into your planning. If you upgrade at a later point, it can be a benefit for sure, but might mean re-tooling the setup somewhat to make it better in the long term.\nWhatever way you decide to go, remember that the raw data can be exported to BigQuery for free (well, free-ish as you just pay for storage and processing, not the actual export itself from GA4). That means you can slice and dice the data however you want, in any way you want using SQL. And hey, this is another way we could help - get in touch if you are interested in learning more!\n\n\nScenarios\n\nAll of the belwo scenarios assumes use of the free version of GA4, and are looking at websites only. For anything more complex, get in touch to arrange a chat with one of our analytics consultants to discuss how you could structure yours.\n\n1 website with 1 root domain\n\n1 property and 1 web data stream.\n\n1 website with 1 root domain but mulitple regional paths (i.e. /uk, /fr, etc.)\n\n1 property and 1 web data stream or >1 property with 1 web data stream each (per region).\n\n1 website with >1 root domain\n\n1 property and 1 web data stream (with cross-domain tracking enabled) or >1 property with 1 web data stream each (per domain)."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/filter-compare-data-ga4-reports/#article",
      "headline": "How to filter and compare data in GA4's reports",
      "description": "GA4's default reports are fine, but we need to be able to filter, compare and manipulate the data to fit specific needs, here's how.",
      "url": "https://www.measurelab.co.uk/insights/blog/filter-compare-data-ga4-reports/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/filter-compare-data-ga4-reports/#webpage"
      },
      "datePublished": "2023-02-14T17:40:50.000+00:00",
      "dateModified": "2026-01-27T11:24:26.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/analytics-sub_uaga4-1200x400-blog-7.png",
      "author": {
        "@type": "Person",
        "name": "Daniel Perry-Reed",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Data Analysis",
        "Google Analytics"
      ],
      "articleBody": "The reports workspace is a great place to start when using GA4, and it will allow you to answer the majority of your data questions too. The out-of-the-box reports are fine, and have their place, but pretty quickly we’d need to be able to sort, filter, compare and manipulate the data to fit our specific needs.\n\nIn this post, we’ll be going through all of the various ways we can filter and compare data in the overview reports and detail reports, including examples of common and useful lesser-known use cases.\n\n\nFiltering data\n\nThere are three types of filters that can be performed in the reports workspace in GA4:\n\n 1. Date\n 2. Table\n 3. Data\n\nDate range filter\n\nBeing able to change the date range is almost a given in Google Analytics. However, it’s probably the most useful and common way to filter data out there.\n\nThe default date range is set to the last 28 days (4 weeks), not including today. But there are plenty of very convenient pre-defined ranges for us to choose from too, including yesterday, last week (with a choice of what day the week starts on), last 12 months, and even a custom date range option to manually select a start date and end date:\n\nWhatever you select, the date range is ‘sticky’. That is, whatever report you navigate to, it’ll stay the same and not reset.\n\nTable filter\n\nTable filters are a way to filter just the data table on detail reports. To add a table filter, search for a term in the search box just above and to the left of the data tale on any given detail report in GA4.\n\nThe search will be a (case insensitive) ‘contains’ match across anything in the primary and secondary dimensions in your report.\n\nFor example, in the below tech details report we have device category as a secondary dimension and then a table filter for “Desktop” applied:\n\nIt’s worth highlighting that the header row of the data table will show a percent of total when using a table filter. So in the above example, we can see that ~75% of all users are on a desktop device in the given date range.\n\nData filter\n\nData filters are only available in the detail reports, and can be accessed by clicking ‘Add filter’ underneath the report name at the top left of the report.\n\nWhen adding a filter, you can choose whether it’s an include or exclude filter, then select a dimension from the drop-down list, and then choose the values of that dimension from the second drop-down list. A summary of the filter is provided below to double-check that it’ll do what you want it to. For example:\n\n\nComparing data\n\nThere are two ways to compare data in the reports workspace in GA4:\n\n    \n 4. Date\n    \n    \n 5. Data\n    \n\nDate range comparison\n\nComparing date ranges may also feel a bit obvious, or even assumed of any data tool nowadays, but it’s still a powerful way to quickly and easily see how things have changed over time. There are a number of options to choose when comparing date ranges - previous period, last year and even a manually selected range of your choosing:\n\nBy comparing any date range in a detail report, each row of the table is now three - the primary date period, the comparison date period and then the percent change. This can make the data a tad busy and potentially unreadable, but luckily there’s an option to hide/show the additional rows at the top of the primary dimension, just below the dimension name:\n\nComparisons\n\nComparisons are a generic name given to data comparisons, where you can duplicate the data in any report, but filtered differently to compare against. You can add and edit comparisons at the top of a report by clicking ‘Add comparison’ or clicking the edit comparisons icon:\n\nThe process of adding a comparison is exactly the same as adding in a data filter, and you can add up to five at any one time.\n\nA good use case for data comparison is if you have Android/iOS apps tracking alongside a website, where we can see the various platform data side-by-side. To see this, we’d set up an ‘include’ comparison for each platform we have tracking. For example, for iOS we’d have:\n\nANd then setting one up for web, iOS and Android would easily and quickly break down any chart and table:\n\n\nAvalibility\n\nEach of these filters and comparisons can be useful when using them correctly - and even more so when combining them together in a single report. Not all of these are available in all types of reports, so the table below details what can be used where:\n\nFilter/comparisonWorks in overview reportsWorks in detail reportsDate range filterYESYESTable filterNOYESData filterNOYESDate range comparisonYESYESData comparisonYESYES"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/ga4-default-reports/#article",
      "headline": "Understanding and using GA4’s default reports",
      "description": "The reports section in GA4 is where you will do your day-to-day reporting. Here's how each of the default reports can be used effectively.",
      "url": "https://www.measurelab.co.uk/insights/blog/ga4-default-reports/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/ga4-default-reports/#webpage"
      },
      "datePublished": "2023-02-14T11:40:32.000+00:00",
      "dateModified": "2026-01-27T11:24:27.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/analytics-sub_uaga4-1200x400-blog-8.png",
      "author": {
        "@type": "Person",
        "name": "Daniel Perry-Reed",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Data Analysis",
        "Google Analytics",
        "Looker Studio",
        "Ecommerce",
        "Marketing"
      ],
      "articleBody": "The reports section in GA4 is where you will do the majority of all your day-to-day reporting. It has a number of perks such as never sampling your data (unlike in explorations), and having all your historical data (regardless of your data retention setting).\n\nAlthough the reports menu can be completely customised per property, the out-of-the-box reports hold a lot of value and benefits. The ‘vanilla’ version of GA4 has the following sets of reports:\n\n * Reports snapshot\n * Real-time\n * Life cycle\n * User\n\nYou may see more or less than this, and that’s absolutely fine! Depending on what you’re tracking, what accounts you have linked and what’s been changed, this can be unique for every property.\n\nBefore we look at each section, it’s worth explaining that there’s two types of reports in GA4:\n\n 1. Overview reports - a dashboard consisting of summary charts and tables\n 2. Detail reports - a few charts and a detailed data table\n\n\nReports snapshot\n\nThis is the ‘landing page’ for the reports workspace and is an overview report. It does a decent job of giving an overview across all the data streams and events you’re collecting into the property, but nicely includes plenty of links to the detailed reports to drill into more detail as and when needed.\n\nPossibly the most useful charts on this report are the top three. The first is the trend for some key metrics such as total users, engagement time and revenue:\n\nAnd the other two charts are a sample of real-time data and the automatically generated insights.\n\n\nReal-time\n\nThe real-time report does what it says on the tin - well sort of. It looks at the last rolling 30 minutes of data that has been collected. The reason I say ‘sort of’ is that there can be a short delay in some data getting into GA’s servers, so although it says it is ‘real time’, it’s not as real time as it could be!\n\nOther than the interactive map (which can be fun and interesting), the main thing to see on this report is the views by page, and events by event name:\n\nThe views by page can be useful for seeing what pages are being viewed, especially interesting if you push a new campaign live, send an email, etc. to see what pages are being seen almost instantly.\n\nThe events by event name is the star of the show though. As this is a view of what events are being collected, it can be one of the most useful ways to check that a new bit of event tracking has been set up correctly, and is working.\n\n\nLife cycle\n\nThe life cycle collection contains the largest set of reports by default in GA4. It is designed to give a full view of the users from how you got to your website/app, what they did on them, how/if you made money from them, and whether or not they came back again.\n\nAcquisition\n\nThis set of reports is designed to explore how you brought the users to your website and/or app. What marketing channels were used, what worked best, what converted and what brought the best results in the long run.\n\nThe traffic acquisition report is by far the most used report in this section.\n\nThe line chart at the top of the report gives a great view on the trend of each channel, and can identify any peaks or troughs, or even seasonality by channel.\n\nThe data table is the main reason for using the detail reports though. And in this report, we’re looking at the performance of traffic by marketing channel (although we can drill into the campaign, etc. too).\n\nA valuable metric to see in this report would be the engagement rate. This gives a great measure of the quality of the traffic you’re receiving from each marketing channel, campaign, platform, etc. There is no ‘good’ or ‘bad’ engagement rate, but viewing this metric in context against the other channels is a good way to see what works better and worse for your audience.\n\nFor example, in the data above we can see that email is highly engaged with, yet paid social is not. This could be due to a number of factors, such as that the paid social ads could be better targeted for our engaged audience, or that the copy could be clearer or improved to prevent people clicking through that might not be interested in what they have to offer.\n\nEngagement\n\nThe engagement reports are looking at what the users did on your website/app after you acquired them. What pages/screens did they see, what events did they trigger and did they convert or not.\n\nThe two main reports in this section are the events report and the pages and screens report. The events report is pretty much the nuts and bolts of GA, and as close as we get to seeing the raw data in the UI.\n\nAny event that GA collects will be shown here with a count, users and count per user. Each line of this report has a different context - the event count for the page_view event is the total pageviews, and the event count for the session_start event is the total sessions for example.\n\nAlmost all reports in GA can be made from this single report, however it can be a bit of a chore at times. That’s why there’s a default report for the pages/screens to save us the time!\n\nThis report nicely includes things like the average engagement time to see how long people spend engaging with each page on average. As well as the number of views and view per user can help build a good picture of what pages are being seen, and engaged with from your audience.\n\nNote: This report defaults to using the page title, but you can swap this out for the page path easily if you prefer seeing the page data that way.\n\nMonetisation\n\nMonetisation is a generic term for three ways to earn revenue from your website/app:\n\n 1. Ecommerce - selling stuff\n 2. In-app purchases - selling stuff via the App/Play Store (iOS and Android only)\n 3. Publisher ads - earning money from serving ads on your site\n\nEach of these three ways of earning revenue have their own detail report, but not all properties will have data for all three. Or you may be a B2B business and have nothing in any of these reports!\n\nEach of these reports have their merits if you earn revenue that way. But I have to call out the ecommerce report and it’s scatter chart at the top that can help quickly see big changes in add to basket rates by product:\n\nAnd of course the data table that ultimately give a view of the product funnel - from view, to add to cart to purchase:\n\nRetention\n\nThe retention report is a single report and sometimes appears as “Retention” or just “Overview” for some reason in the menu.\n\nIt’s just an overview report, but it does have some valuable charts to look at - the user retention and user engagement specifically:\n\nThe user retention chart shows the percentage of users who return to the site/app each day in their first 42 days after visiting for the first time. Personally, I’d have excluded the 100% user retention on ‘day 0’, but hovering on the chart shows the percent of all users that return to the site/app. Here you can see how things like basket abandonment emails after 2 days affects the likelihood of a user returning, or if there is an organic seasonality such as people doing their grocery shopping on the same day every week.\n\nThe user engagement chart shows pretty much the same thing, but now looking at how long the returning users spend on your site/app when they return. Do your users invest more time the more they come back, or does it tail off?\n\n\nUser\n\nThe user collection of reports has two sections, each containing an overview and a detail report:\n\n 1. Demographics - geography, age, interests, etc.\n 2. Tech - device type, operating system, browser, etc.\n\nI’ll just straight into the detail reports, as I find these the most useful in this section. Starting with the demographics details, which is a good place to come for understanding the location of your users. For example, you can include the secondary dimension of ‘Region’ for a breakdown of each country. You could include ‘City’ but there are some accuracy issues in that data (not just a GA-thing), which means I tend to steer clear of using.\n\nThe tech details report has a few hidden but very useful surprises that can be valuable to use from time to time. For example, if you are collecting data from websites and iOS/Android apps, the combined dimension ‘Platform/Device category’ is a must-use. It can be an easy way to see how many of your users are using the app versus the mobile version of the website:\n\nAnd other not so used dimension in this report is the screen resolution. There’s likely to be a lot of variations in this report, but even just looking at the top 10 rows can give you a strong sense of how big the website/app is being seen as. For example, should you be primarily designing for smaller screens, or larger.\n\nYou can also tell if your website/app is being seen in portrait or landscape - something that can be more easily looked at in Looker Studio using a simple formula."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/ga4-event-modification/#article",
      "headline": "How to modify events in GA4",
      "description": "How to use the event modification feature in Google Analytics 4 (GA4) to change details about the event without touching the implementation. No coding, no Google Tag Manager, no developers, all done from within the GA4 user interface!",
      "url": "https://www.measurelab.co.uk/insights/blog/ga4-event-modification/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/ga4-event-modification/#webpage"
      },
      "datePublished": "2023-01-31T12:33:19.000+00:00",
      "dateModified": "2026-01-27T11:24:28.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/analytics-sub_uaga4-1200x400-blog-9.png",
      "author": {
        "@type": "Person",
        "name": "Timothy Gorringe",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "How-to",
        "Google Analytics",
        "Google Tag Manager",
        "Privacy",
        "Debugging",
        "Testing"
      ],
      "articleBody": "Since Google Analytics 4 (GA4) officially launched in October 2020, we’ve benefited from lots of great new features such as the introduction of predictive metrics, customisable reports, and anomaly detection. Perhaps one of the most useful of these is the event modification feature which, in a nutshell, allows you to change details of events all within the GA4 UI. That’s right, you no longer need to write any code or use a tag management system (i.e. GTM) to manage most of your events. In this post I will show how to use this exciting new feature.\n\n\nModifing events\n\nFirst of all, to find the event modification feature you will need to open your GA4 property and navigate to the Admin screen from the side menu on the left. You will also need to have 'Administrator' access privileges to be able to see this setting. Then select Events from the list to access the events page.\n\nWithin the Events page you will see all the existing events including the corresponding count and users as well as the percentage change based on your date range. This can be a really good place to quickly understand if your tags are firing correctly and to identify any that are not. If something has gone wrong, you will typically see an unrealistically low event count or a percentage change that has gone up or down by a significant amount. Another useful feature is that you can see which events are marked as conversions, and even change this yourself.\n\nOur site collects events automatically from Enhanced Measurement, including the generic \"click\" event for all outbound link clicks. This event's name isn’t particularly useful, so we would like to modify the event name to \"outbound_click\" to help us identify these outbound clicks from any other kind of internal click.\n\nFirstly we will click on ‘Modify event’ in the top right.\n\nAnd then on the next screen we will click 'Create'.\n\nThis will take us to a configuration page where we can build up our event modification. In the ‘Modification name’ field we will enter a name so that we can identify the modification later on. This is only for our reference in the GA4 UI and does not appear within the event itself.\n\nNext we need to set the matching conditions - this tells GA4 which event to modify. In our case, we will enter event_name equals \"click\" to find the click event. In case there are any other click events, we also want to specify that it should only be clicks that are outbound. Click ‘Add condition’ and then enter outbound equals \"true\". This means it will only modify outbound clicks.\n\nNow the fun part, in Modify parameters we want to tell GA4 how it should modify the event. We want to enter the event_name parameter into the first input box and then enter the New value as \"outbound_click\". This is what the event will appear as when it’s displayed in your reports so you need to choose the name wisely.\n\nOptional: You can also click ‘Add modification’, enter the outbound parameter and then leave the new value field blank to remove it from the event altogether.\n\n\nTesting and QA\n\nYou’re probably wondering whether all this has actually worked - now is the time to test the event modification. There are a number of ways we can do this but the one thing all methods have in common is that we first need to actually find and click on an outbound link on the site in question. Once you have found at least one, click it a few times and then you're ready to see the data in GA4.\n\nThe simplest way is to look for your modified event in the real-time report in GA4. To do this, click Reports > Real-time to access the report. It’s important to note however that you need to accept cookies on the site, otherwise your actions won’t be tracked, and the event be visible in the GA4 UI.\n\nAs we can see, after clicking an outbound link on our site, the event has triggered and appears in our event count list in the real-time report. It is also possible to see the event fired using the DebugView report which is also within GA4. Or by entering the preview mode on Google Tag Manager and clicking on a link through that.\n\n\nLimitations\n\nAs great as this new feature, there are some limitations on its use:\n\n * The modified events won’t apply to historical data.\n * You can only modify up to 50 existing events.\n * It can take an hour or more for modifications to take effect (although in our testing it's almost immediate).\n * Modifying an event doesn’t necessarily fix the root problem, but it is still a useful short term solution to ensure data isn’t lost or miss tagged while you wait for a more permanent fix (via a developer, GTM, etc.).\n\n\nUse cases\n\nThis could potentially be the sign of a future where we don’t need to handle code or advanced tag management platforms like GTM to set up and modify event tags! This means analytics could become much more approachable, and less daunting, for the typical business owner, marketing manager, or analyst who may be less technically minded.\n\nHowever, this could of course also bring in new and/or different problems such as no version control, reduced accountability and account access issues. It will certainly be interesting to see how Google will develop the feature to account for these issues.\n\nIf you're interested in this topic, fellow measurelabber George wrote an opinion piece on 5 new GA4 features we’d like to see in future releases. You could also listen to our podcast episode GA4 features we need to see in 2023 (with Usman Qureshi @ Spiralyze).\n\n\nConclusion\n\nIf you’ve made it this far, congratulations! In this post we’ve only scratched the surface of what event modification is capable of. There are many more cases where event modification could be used and I would recommend experimenting with it. You can also find out more on this feature from the Google docs or these very detailed guides from Analytics Mania and Charles Farina. We’d love to hear how you end up using the feature!\n\nEven if you’re not sure you’ll need all of your historical data, it’s better to be safe than sorry. And if you need a hand with any of these steps, please do get in touch do discuss this with one of our experienced consultants."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/ga4-data-api-quota-limitations-looker-studio/#article",
      "headline": "How to deal with the GA4 Data API quota limitations in Looker Studio",
      "description": "Still struggling with Google Looker Studio breaking due to the GA4 Data API quota limits? We have tested some of the available solutions for you to help get around the issues and get a working dashboard up and running.",
      "url": "https://www.measurelab.co.uk/insights/blog/ga4-data-api-quota-limitations-looker-studio/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/ga4-data-api-quota-limitations-looker-studio/#webpage"
      },
      "datePublished": "2023-01-31T12:30:13.000+00:00",
      "dateModified": "2026-01-27T11:24:29.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/analytics-sub_sheets-1200x400-blog-1.png",
      "author": {
        "@type": "Person",
        "name": "Magdalena Pajak",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Looker Studio",
        "Google Analytics",
        "BigQuery",
        "SQL",
        "Google Ads",
        "How-to"
      ],
      "articleBody": "\n\n\n\n\n\nA nice surprise (as of May 10th 2023)\n\n\nWe have observed that the API quota limits have been increased substantially. While there's been no official announcement (yet), we have seen the documentation updated here!\n\n\n\n\nRecently we have written about some changes to the GA4 Data API quota limits and how these may affect your Google Looker Studio (FKA Data Studio) dashboards, or any other tools that use GA4 Data API to pull in the data. Although the Looker Studio team is actively working on plans to address the issue, we still have no definite ETA and we don’t know if the solution will indeed solve the problem. With the latest release from the Looker team, we are now able to monitor the quota usage. This update together with the previously mentioned optimisation suggestions (and Google's quotas guide), will hopefully help with reformatting your dashboards to make them usable again.\n\nYou can check our suggestions on how to deal with the quota limits in our previous blog and also follow some additional best practices to reduce the amount of data that is queried from GA4.\n\nAs mentioned before, we think that the proposed solutions are far from ideal, but we decided to test some of them to see how they compare to one another.\n\n\nOption 1 - BigQuery\n\nIf you already use BigQuery for more complex analyses, know how to use SQL and the cost is not a concern, you could look into either linking your GA4 proprty to BigQuery using the native in-product linking, or setting up data pipelines using one of the ETL third-party tools (e.g. Skyvia, Stitch or Funnel to name only a few).\n\n\nGA4's daily and streaming BigQuery exports\n\nThe benefit of this approach is that you have event-level raw data that you can not only use for simple dashboards but also for more complex analyses. The setup is easy and you won’t have to worry about things like data retention.\n\nHowever, the GA4 native exports lack some of the key fields that you might typically use in your reports, such as channel grouping, session-level campaign data or Google Ads data. For users who are not familiar with the nested tables, using these in Looker Studio may be challenging.\n\nTo deal with the limitations you can try to re-create the channel attribution (stay tuned - soon we will share our own solution) and connect your Google Ads data using data transfers to enrich your data, but this will require some advanced SQL knowledge.\n\nThe other thing that you would have to consider is cost, which will depend on the amount of queried and stored data, and whether you use any complex custom queries. You can of course mitigate the cost by creating smaller summary tables that you then use in your dashboards.\n\n\nData pipelines and ETL tools\n\nFor our testing, we used Stitch, as we are familiar with this product, however, there are many other ETL tools that you could choose from. The great thing about using Stitch is that you can get the fields from GA4 that are not available with the native BigQuery > GA4 integration, such as channel grouping or Google Ads data. You can also do additional analysis and data transformation in BigQuery before connecting to your dashboard - the data, however, is aggregated so you won’t be able to do more complex analyses as you would with the raw export.\n\nAs you would still store your data in BigQuery, you will incur costs relating to storage and querying on top of the fees that you would have to pay for the tool itself. You are also limited in terms of how many fields you can pull in a single pipeline which actually shouldn’t be a big issue, as you would probably want to split the data into smaller tables anyway to avoid high costs when querying. It is also worth mentioning that the GA4 connector is currently in beta and it lacks the ability to filter or use segmentation, this will lead to a greater number of rows than is actually required and a higher cost.\n\n\nOption 2 - Partner Connectors\n\nIf you are not familiar with SQL and are concerned about the costs associated with BigQuery, you can instead look at using one of the partner connectors available directly in Looker Studio. There is some cost associated with using those connectors, but this can be very low depending on your needs and the type of connector you choose. These are mostly easy to set up and you will be able to get the same data as you would using the Google Analytics Looker Studio native connector.\n\nHere is a quick comparison of some of the partner connectors:\n\n\nSupermetrics\n\nPros:\n\n * Easy and quick connection and set-up\n * Comes with a report template\n * Relatively cheap if only using the basic membership\n * No sampling\n\nCons:\n\n * The custom fields option is only available with the “Super” membership at €499\n * A bit slow, but this may depend on the size of your property and can be comparable to the default GA4 connector\n\n\nWindsor.ai\n\nPros:\n\n * Easy and quick connection and set-up\n * Quicker than Supermetrics (at least in the tests we run. Check also this video from JJ Reynolds where they test Supermetrics and other connectors)\n * There is a free package available that only has one data connector and user but could be sufficient for some users\n * Can create custom fields even with the free version\n * The Basic package is the cheapest of all connectors we tested\n\nCons:\n\n * The free option has a limited number of time periods you can select from in the original data pull. This limitation is lifted when upgrading to the Basic package\n\n\nAnalytics Canvas\n\nPros:\n\n * You can join other data sources and do transformations within the Analytics Canvas UI\n\nCons:\n\n * A more complex set-up. Some tutorials might be required. It’s more like an ETL tool than just a simple connector\n * There is a limit to how many metrics/dimensions you can choose, with a total of 9 dimensions and custom dimensions and a total of 10 metrics\n * Can’t get more than 2 years of data (which should be sufficient for most users)\n\n\nAdverity\n\nPros:\n\n * You can apply dimension and metrics filters before connecting to Looker Studio\n * You can add “enrichments”, i.e. connect to other data sources, format data, add custom columns/fields\n * You can choose from available data streams (tables) or create your own\n\nCons:\n\n * No pricing information on the site\n * Requires a more complex custom set-up within the tool and might need a bit of reading to learn how to use it\n\n\nConclusion\n\nHave you tried any of these options? Let us know what worked for you! And if you need help choosing the best solution for your business, get in touch and we can help you decide on the best way forward for you and your business."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/update-server-side-gtm-migration-framework/#article",
      "headline": "UPDATE: a six-step framework to server-side GTM migrations",
      "description": "If you’re ready to make the leap to a server-side Google Tag Manager (sGTM) container, we developed the UPDATE framework to help you maximise your chances of a successful switch.",
      "url": "https://www.measurelab.co.uk/insights/blog/update-server-side-gtm-migration-framework/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/update-server-side-gtm-migration-framework/#webpage"
      },
      "datePublished": "2023-01-31T09:30:34.000+00:00",
      "dateModified": "2026-01-27T11:24:29.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/1200x400-blog-4x.png",
      "author": {
        "@type": "Person",
        "name": "Matthew Hooson",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Tag Manager",
        "Server-side Tagging",
        "Privacy",
        "Testing",
        "Google Cloud",
        "How-to"
      ],
      "articleBody": "At this point, we are all familiar with Google Tag Manager (GTM), as well as its quirks, workarounds, and nuances. It’s like a warm blanket, an old friend, a cup of cocoa… However, here at Measurelab, our heads have indeed been turned by the emergence of GTM's newer, more badass sibling: server-side GTM (sGTM). So much so that we think most companies will want to switch sooner rather than later to take advantage of some of the things server-side GTM migration enables (HTTP cookies, anyone?)\n\nHaving said that, taking this particular leap can be more daunting than switching between other technologies on the analytics stack. There are a plethora of new terms to consider, including getting your head around how it all works, the prospect of provisioning and maintaining server instances in the Google Cloud Platform (GCP), and much more that make this a project worthy of a thorough plan of action.\n\nEnter the UPDATE framework…\n\n\nServer-side GTM migration\n\nUsing our experience undertaking server-side migrations for our clients, we’ve put together a framework that will help guide you through the process and make sure you have considered every angle and outcome to be successful.\n\nUPDATE stands for Understand, Plan, Declutter, Action, Transfer, and Evaluate. It’s not designed to be a step-by-step guide on setting up a new container, rather, it’s a structure that ensures you approach the process systematically and don’t skip crucial steps.\n\nDownload the framework in PDF format here, which includes a summary of the key tasks, our top tips, and potential pitfalls. Check out the image within the blog and have a read through the summary of each stage below.\n\n\nUnderstand\n\nThere are several benefits to migrating to sGTM but, as already mentioned, there is also a layer of added complexity and cost. It’s important that you understand both the pros and cons and come to a decision as a business on if it is the right time to make a move.\n\nConsiderations such as, “do we have the budget?”, “do we have the internal resource for maintenance?”, and “Do we understand this technology?” should be front of mind. Once you have worked through these and confirmed you’re happy with the proposition of a switch, it’s time to plan.\n\n\nPlanning\n\nNow, it may be tempting to approach this project on the fly and deal with problems as they arise, assuming you’ll eventually get the job done, but there is much more to be considered here to ensure you do not damage your data or your wallet…\n\nFor example, what approach will you take to send the information to the server? Will out-of-the-box clients serve our needs? How many server instances do our site's traffic levels warrant? What metrics will we use to scale? As you can see, a thought-out plan of action will save a world of pain down the line, so take a breath and start plotting.\n\n\nDeclutter\n\nYour GTM container is a mess. There, I said it. Maybe that is unfair: your GTM container is probably a mess. After years of third-party tags, abandoned tracking initiatives, and long-since-forgotten experiments, most are. If you don’t have a robust GTM maintenance policy, an sGTM migration is a perfect opportunity to audit your current GTM setup.\n\nWhy waste time migrating this superfluous infrastructure when you don’t need to? Work through your container(s), decide what is and is not active, and promote it to the cutting room floor!\n\n\nAction\n\nSo, you have an understanding of the why, confidence in your ability to maintain everything moving forward, and a plan of action both in terms of what needs to happen and what can be left to die on the vine – it’s time to spring into action and start work.\n\nYou can spin up your server, set up all the necessary clients, tags, triggers, and variables, and thoroughly test that everything is working as it should. If you’ve done your planning correctly, you should know your approach to all aspects of setup and be able to move things through tasks quickly and easily.\n\nYou also need to be very diligent in your testing, ensuring data looks as you expect, that there are no issues with your server instances and that your tags are firing with the correct parameters, etc. The next step is to transfer to live, so feel free to linger on Action until you’re sure all is well.\n\n\nTransfer\n\nOk, when you’re happy that everything looks as expected, you’re ready to go live. This step involves swapping URLs in code snippets, ensuring sub-domains are pointing at your server, transferring the management of cookies to HTTPs, and migrating client containers to load from the server.\n\nAll of this should have been in your plan so there are no nasty surprises. By the end of this step, you will be using a shiny new sGTM container.\n\n\nEvaluate\n\nWhen you’re live, it’s time to explore the benefits afforded by sGTM. How has your page speed improved? Has the switch to HTTP cookies positively affected your traffic data?\n\nYou can also begin to think about some solutions now available to you – perhaps switching to Cloud Run for the server to allow for scale to 0 and potential cost savings. Maybe think about utilising firestore tables to augment the data before it heads off to third parties? How about sending data from the server to pub/sub to kick off a whole host of potential actions on GCP?\n\nThere is a lot to think about, right? And that is before we get to the possibilities afforded to you post-switch. If this is all still a little daunting, or you want some help planning, Measurelab can help get your migration journey started – just get in touch for a chat."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/2022-measurelabs-year-in-review/#article",
      "headline": "2022: Measurelab’s year in review",
      "description": "A reflection on the year gone by and how far we’ve come as a company and team. From taking over the north, growing the team, and an ever growing GA4 and sGTM appetite, this is the time to give ourselves a big pat on the back.",
      "url": "https://www.measurelab.co.uk/insights/blog/2022-measurelabs-year-in-review/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/2022-measurelabs-year-in-review/#webpage"
      },
      "datePublished": "2022-12-20T13:25:09.000+00:00",
      "dateModified": "2026-01-27T11:24:33.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/annual-wrap-up-blog.png",
      "author": {
        "@type": "Person",
        "name": "Dara Fitzgerald",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Measurelab",
        "Google Analytics",
        "Google Tag Manager",
        "Looker Studio",
        "BigQuery",
        "Privacy",
        "SQL"
      ],
      "articleBody": "A big focus for us this year has been growing our team. We have even bigger plans for 2023 but this is a reflection blog, so I won’t say too much about future plans. We’re finishing the year as a team of 25 (including a few trusted contractors). This is up from 18 last year. A few people decided their time had come to move on in 2022, but we’ve also welcomed some bright new faces to the full-time Measurelab crew: Scott - who I mentioned in last year’s review in advance of him joining in January, Rajeev, Liam, Tim, Cal, Nasima, James and Gary.\n\nOne of the names in that list, Cal Ellis, joined us as our own Talent Lead in August so we now have someone fully dedicated to and focussed on growing our team further.\n\n\nNorthern Takeover\n\nSix of these new faces are based in the North of England, joining the 3 people we already had in the greater Manchester area and Nick, who was an honorary Southerner, moved back up to York to join the Northern takeover. To cater for this growing crew north of the wall, we moved to a new private workspace in one of the amazing Colony Cowork offices in Manchester.\n\n\nFun fun fun!\n\nOur First Thursday Club monthly socials roar on. In fact, we’ve just recently had our Christmas edition, on ice!\n\nGoing back to the start of the year, we sadly had to cancel our January social due to a high number of cases of a certain virus that I shall not dare to name. But they were back with a bang from February when we had some VR fun @ Otherworld, followed by Pizza Pilgrims.\n\nWe hit a games room in March, bent the laws of physics with ping pong in April, couldn’t hear each other in a very noisy cocktail bar in May, had a good knees up with the Old Time Sailors at the Brighton Fringe in June, Plonked some crazy golf and ate lots of tasty vegan food at Mallow in July, immersed ourselves in a gamebox in August AND had our Summer BBQ/Picnic Thingy in Richmond. Then it was a board game café in September and Escape Rooms plus Oktoberfest in Brighton in October. Then it was our annual offsite in November followed shortly by our Christmas social mentioned above to wrap the year in a big red bow like a gift from Santa.\n\nMeasureversaries and role changes\n\nWe’ve naturally had a few more Measureversaries (I can’t believe this name has stuck) and also a few role changes at the top - something I also talked about last year.\n\nDan and Magda both hit the 6 year mark with us. Steve, our new MD, reached 4 years. Victor and Dave both reached 3, George hit 2, Nick, Natalia, Katie, Matthew and Elisa all hit their magic first. And of course Measurelab celebrated its 9th birthday. 🥳\n\nThis year also saw some other changes, with myself moving to the CEO role, and Mark COO. As mentioned above, Steve has been a Measurelabber for 4 years now, and is now our MD - steering the ship of Measurelab into 2023 and beyond!\n\nMarketing\n\nNot to toot our own horn, but we are proud of the work we do here at Measurelab, and we love sharing it too. No strings attached. This year saw 33 new blogs at the time of writing (including this one). A personal favourite of mine has to be the one from Victor on using GTM to add Doom to a site and visualising the GA4 BigQuery export schema from Scott!\n\nWe attended a number of events now that they're back IRL. CRAP Talks, MeasureCamp London, brightonSEO and MeasureFest being just a few to call out.\n\nAnd now for a personal favourite of mine, The Measure Pod podcast. I know I'm biassed being a co-host, but 2022 saw our first full year and in that, there have been >7,200 listens at the time of writing! We released 45 full episodes (and one bonus), with a 50/50 split between having a guest or just myself and Dan nattering away.\n\nOffsite and awards\n\nA highlight of the year for me is the annual offsite, or now called our \"Kick-off\", the time we all get together IRL to look ahead to the next year. This year was in Reading, with a few nights staying in a fancy hotel. Including a cinema that we absolutely did take over and watch Back to the Future in!\n\nWe also ran our 2nd annual Company Values Awards. Before the event, we asked everyone to anonymously nominate one person for each award, with one award for each of our four company values. Our very deserving winners can be seen looking understandably proud below:\n\nLeft to right: Katie (Compassion), George (Tenacity), Daniel (Integrity), and Matthew (Curiosity).\n\nTraining\n\nIt's been a while since I ran our analytics training at Measurelab (anyone remember UA?!), but this year has gone from strength to strength. In 2022 we ran 35 training courses, teaching GA4, Looker Studio and Tag Manager to 422 people!\n\nWe have also started running GA4 training for brightonSEO, which always brings an amazing group of analytics-curious people together in-person a few times a year.\n\nPredictions for 2023\n\nI feel like a broken record, but we wouldn’t be here if it wasn’t for the dedication of our team and the loyalty and trust of our clients.\n\nI’m more than excited to see what 2023 holds for us, and it will be interesting to see what changes 12 months from now in the industry with things like UA being sunset and the focus on privacy and compliance not slowing down any time soon. We’re seeing GA4 get closer and closer to being the source of truth, and of course, working with BigQuery is ever growing in importance. So, I foresee further growth in demand for legal and ethical data collection methods and the inevitable full transition to GA4 in the year ahead.\n\nIn the meantime, to everyone reading this, have a safe and Merry Christmas and a very Happy New Year – from me personally and on behalf of the whole team here at Measurelab."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/cloud-run-server-side-gtm/#article",
      "headline": "Why you should consider Cloud Run for server-side GTM",
      "description": "Why is exploring Cloud Run as an alternative to App Engine for sGTM instance provision now recommended? And what we found in terms of cost and stability.",
      "url": "https://www.measurelab.co.uk/insights/blog/cloud-run-server-side-gtm/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/cloud-run-server-side-gtm/#webpage"
      },
      "datePublished": "2022-12-13T09:44:11.000+00:00",
      "dateModified": "2025-07-31T22:58:49.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/analytics-sub_gtm-1200x400-blog-1.png",
      "author": {
        "@type": "Person",
        "name": "Matthew Hooson",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Tag Manager",
        "Server-side Tagging",
        "Google Cloud",
        "How-to"
      ],
      "articleBody": "Here at Measurelab we have built up a good amount of experience in the world of server-side GTM (sGTM) migrations. So much so we have developed a framework for a successful migrations (soon to be published).\n\nThe standard way to do things is to go with the out-of-the-box Google auto-provisioned App Engine instance for your analytics server. This is all very nice in theory, with a reassuringly simple Google approach to set up. But a mixture of curiosity, 500 errors and the recent resource shortage for App Engine flexible environment instances over black Friday/cyber Monday led us to explore the possibility of provisioning our analytics servers using Cloud Run. All of that is before we even talk about the prospect of some healthy cost savings. Although as we find out, this is not always a guarantee.\n\nWe are in the unique position of being able to compare a Cloud Run deployment on two sites with dramatically different event rates (7,000 vs 100 Million) and to observe what effect, if any, this has on cost and stability. So, let's dive in.\n\n 1. Why Cloud Run?\n 2. Latency\n 3. Costs\n 4. Head to head\n 5. Summary\n\n\nWhy Cloud Run?\n\nI have seen it said in blogs and forums in the analytics sphere that, were Google to release sGTM today, its default would not have been App Engine, rather it would utilise a much newer GCP technology, Cloud Run. Since the App Engine resource issue over the Black Friday weekend, Google has also come out and specified Cloud Run as a solution for sGTM server provision. So outside of ‘Google says so’ what other advantages does it offer over its older sibling App Engine?\n\nFirst of all, Cloud Run is a container on-demand service. Meaning that you only pay for what you use to the nearest 100 milliseconds. Its ability to quickly scale up and down the number of instances based on demand means that, in theory, your sGTM instances could scale down to 0 when not receiving requests and therefore cost nothing.\n\nThe eagle-eyed of you will spot the caveat here - what if my site never receives 0 requests? And you are right, the cost benefits are reduced or eliminated in such instances. However, cost is not the only string to Cloud Run’s bow.\n\nWe have observed greater stability on higher traffic sites which inevitably leads to a greatly reduced risk of data loss. Anecdotally, we noticed a phenomenon of ‘instance catch-up’ on an App Engine deployment, whereby large spikes of requests crashed an instance. As this then took the instance pool to below its minimum, it would find itself caught in a loop of catch-up and crashing, never managing to scale in the way it needed to. This is not something we have observed on Cloud Run, even with greater levels of requests.\n\nCloud Run can also be configured with a load balancer for a multi-region approach. This not only advantageous to websites with a global audience, but could also help avoid issues like the ones seen over the Black Friday weekend by allowing for redundancy. For example, if we had a load balancer pointing to 3 instances in 3 regions, if one region lacked availability, the load balancer would simply send the data to one of the other available instances. A load balancer comes with its own costs and set up, so we won't go into detail here, but keep an eye out for an upcoming blog on this exact subject from us soon.\n\nIt is probably also worth mentioning that if you are (understandably) jumpy about scaling to 0 with Cloud Run, you don’t have to. You can set minimum instances just as you can with App Engine. These instances are kept ‘warm’ and ready to serve requests, reducing latency by minimising cold starts.\n\nSo I have laid out why you might go with Cloud Run, but what are some potential areas where it could fall short? Let’s start with latency.\n\n\nLatency\n\nConventional wisdom would dictate that the App Engine would have better latency, partly because of its always-allocated CPU resource, and partly because it compresses files automatically. But conventional wisdom be damned, from our deployments of this solution, we see no such issue. Observed latency times seem to have parity with App Engine, or in some cases are even better. Below you can see Cloud Run latency over 5 days for a site that received around 97 million events in one month:\n\n * 50th percentile: 0.03s\n * 95th percentile:0.46s\n * 99th percentile: 0.85s\n\nAnd from the other end of the spectrum, latencies for a site that received around 7,000 events in one month:\n\n * 50th percentile: 0.04s\n * 95th percentile:0.12s\n * 99th percentile: 0.13s\n\nSimo Ahava saw similar behaviour when deploying Cloud Run on his own site.\n\nA good deal of finding my way around this solution is thanks to that Simo blog linked above, along with another by Mark Edmondson.\n\n\nCosts\n\nAs already mentioned, there is a theoretical cost saving to be had if you are using Cloud Run. Still, this all very much depends on the number of requests and your configuration. If your site will regularly be receiving no traffic, Cloud Run's ability to scale down to nothing is a big bonus. However, as we have already established, there may be more benefits to the Cloud Run approach than just cold hard cash.\n\nIf you want to spend to unlock the other benefits Cloud Run affords, there are ways to reduce costs down:\n\n * If you know that you wish to have a minimum number of reserved instances for at least a year, Google can provide committed use discounts https://cloud.google.com/run/cud.\n\n * In our experience, there does not seem to be a need for always on CPU resources when provisioning an analytics server. Doing so will increase costs considerably. More information on CPU allocation can be found here https://cloud.google.com/run/docs/configuring/cpu-allocation#console_1.\n\n * We would recommend not resting on laurels when it comes to set up. Keep monitoring things and updating scaling to find the right balance of maximum/minimum instances to ensure all requests are dealt with in the most cost-effective manner.\n\n * Remember that Cloud Run does not immediately shut down instances once they have handled all requests. To minimise the impact of cold starts, Cloud Run may keep some instances idle for a maximum of 15 minutes. You will be billed until they are shut down entirely.\n\nExample costs:\n\nAs highlighted earlier, we are in the privileged position of being able to compare deployments on the extreme ends of the spectrum. Let’s start with a lower-traffic site that receives around 7,000 requests a month.\n\nThe configuration:\n\n * Min 2 instances\n * Max 6 instances\n * CPU is only allocated during request processing\n * CPU limit 1\n * Memory limit 512 Mib\n\nThis incurs a cost of around £1.03 per day or about £30 a month. We have seen no issue in terms of analytics collection and all instances are scaling as we would expect.\n\nNow let’s look at a site that sends close to 200 million requests per month to a Cloud Run.\n\n * Min 1 instance\n * Max 100 instances\n * CPU is only allocated during request processing\n * CPU limit 1\n * Memory limit 512 Mib\n\nThis incurs a cost of around £13.40 a day, which is significantly more than the £5.87 a day incurred when using App Engine, but there are some very important things to point out.\n\n 1. App Engine had a max instance set-up of 8 before the configuration was moved.\n 2. There was significant data loss seen on App Engine due to extreme traffic spikes causing instance crashing, a problem not seen on the new Cloud Run set-up.\n 3. The traffic hitting the site was significantly higher post-move to Cloud Run.\n 4. It is relatively early in its deployment and there is still experimentation going on to determine the best/optimal number of instances and their individual configurations.\n\nNeither of these deployments has a load balancer in place which would come with additional expense.\n\n\nHead to head\n\nTo round things off let’s have a look at a comparison table for Cloud Run and App Engine.\n\nApp EngineCloud RunRuns on Compute Engine instancesUses serverless containersNo scale-to-zeroCan be configured to only run when servicing requestsAutomatically compresses filesNo automatic compressionAdds some additional metadata to HTTP requestsDoes not modify HTTP requestsSingle-region, hard to-load balanceCan be configured with the multi-region network using load-balancerEstablished technologyRelatively new technology (late 2019)\n\n\nSummary\n\nSo, should you do it?\n\nThis is cutting-edge stuff, and it may well be that the costs and stability of App Engine are perfectly acceptable to you and your site. The level or traffic hitting your site may mean then you never experience the ‘instance catch-up’ we observed. Even if that is the case, there are still plenty of benefits to be had from a multi-regional approach.\n\nAnd if you are having problems with cost and know that scaling to 0 will help, or are a victim of the Black Friday App Engine calamity, Cloud Run may be a good option for you to try out. From our experience, it has certainly proven a stable and effective way of provisioning analytics servers.\n\nKeep your eyes peeled for more upcoming content on sGTM including information on our framework for a successful migration, instructions on how to provision a load balancer on your Cloud Run instances, and just what the point of switching to sGTM is in the first place!\n\nUntil then, please do reach out if you have any questions or would like help an/or advice in making the switch to sGTM yourselves."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/ga4-data-api-quotas-looker-studio/#article",
      "headline": "GA4's Data API quotas are breaking Looker Studio reports",
      "description": "If you've been using Looker Studio (formerly Data Studio) to build GA4-based reports and dashboards, you might have noticed that they have started to break. Here's some information about a recent change Google Analytics has made that has caused these errors.",
      "url": "https://www.measurelab.co.uk/insights/blog/ga4-data-api-quotas-looker-studio/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/ga4-data-api-quotas-looker-studio/#webpage"
      },
      "datePublished": "2022-12-01T11:37:27.000+00:00",
      "dateModified": "2025-07-31T20:35:42.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/analytics-sub_sheets-1200x400-blog-2.png",
      "author": {
        "@type": "Person",
        "name": "Dara Fitzgerald",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Data Analysis",
        "Looker Studio",
        "Google Analytics",
        "BigQuery",
        "How-to"
      ],
      "articleBody": "We wanted to share some information about a recent change Google Analytics has made to the GA4 Data API, that could be causing your GA4-based Looker Studio (formerly Data Studio) dashboards to error.\n\nSince the 7th November, Looker Studio reports that connect to Google Analytics 4 data are subject to Google Analytics Data API (GA4) quotas.\n\nNote: this is not just affecting Looker Studio. These quotas are for the GA4 Data API so any tools that pull data from GA4 via this API will be subject to these same quotas. For example, Power BI, Tableau, Google Sheets or Excel add-ons for GA4, etc.\n\nIf any of your Looker Studio reports are affected by these quotas, you will see one of the errors listed here https://support.google.com/looker-studio/answer/12182485#ga4-quota&zippy=%2Cin-this-article%2Csteps-to-resolve.\n\nThe actual quotas can be seen here https://developers.google.com/analytics/devguides/reporting/data/v1/quotas, but the one most likely to impact reports from what we have seen so far is the one I've highlighted below for the maximum number of concurrent requests being set at 10.\n\nThat is, only 10 requests can be made to the API at any one point in time. This can effectively make any dashboard with >10 charts per page useless at present (although the requests do not quite work in such a one-to-one way).\n\nWe at Measurelab are not alone in being very frustrated about this. There is a lot of dissatisfaction online within the analytics community, with many people experiencing issues with reports that were previously working, now erroring.\n\nA small silver lining however, is that the Looker Studio team have replied to a public community post about this, saying they are looking into solutions to work around this quota limitation. But there is no ETA, and we don't really know what this solution will look like yet.\n\nThe official suggestions from the Google Looker Studio team to deal with this are listed here (but also below in bullets) https://support.google.com/looker-studio/answer/12182485#ga4-quota&zippy=%2Cin-this-article%2Csteps-to-resolve.\n\n   \n * Reduce the traffic to the report. Consider sharing the report with fewer people, and don't embed the report in a high traffic website.\n   \n   \n * Reduce the number of charts on each page.\n   \n   \n * Extract the Google Analytics 4 data and use the extracted data instead of the Google Analytics 4 data source.\n   \n     \n   * Note: you'll need to wait until any exceeded quotas have refreshed before you can extract the data. Depending on the quota exceeded, this can take up to 24 hours.\n     \n   \n   \n   \n * Export your Analytics data to BigQuery, then use the BigQuery connector to visualize that data in Looker Studio.\n   \n   \n * Upgrade to Analytics 360.\n   \n   \n * Consider using a partner connector.\n   \n\nIn our view, these are far from ideal. We are hoping that the backlash will lead Google to reconsider, but of course we have no way of knowing that or their motivations for making this change in the first place.\n\nIf you have reports that are affected by this change (i.e. suddenly breaking, with one of the errors shown on the page linked at the top of this post) then please let us know and we can discuss it together to determine the best course of action."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/dream-analytics-team/#article",
      "headline": "Dream team: the 4 people you need on your digital analytics team",
      "description": "There’s no one-size-fits-all approach to building an analytics team, but there are four types of people you should look for to advance your in-house analytics capabilities.",
      "url": "https://www.measurelab.co.uk/insights/blog/dream-analytics-team/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/dream-analytics-team/#webpage"
      },
      "datePublished": "2022-11-30T12:11:13.000+00:00",
      "dateModified": "2026-01-27T11:24:36.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/measurelab-data-characters_group-1200x400-1.png",
      "author": {
        "@type": "Person",
        "name": "Steven Elliott",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Data Analysis",
        "Google Tag Manager",
        "BigQuery",
        "Google Cloud",
        "Dataform",
        "AI & ML",
        "How-to"
      ],
      "articleBody": "If you’re looking to enhance your in-house analytics capabilities, you're going to need skills. A certain set of skills. Scarce skills. Premium-priced skills. Silky soft skills, as well as the hard ones.\n\nWith quality candidates thin on the ground, you may be forced to compromise, or tempted to take a gamble on attitude over aptitude. You may be inclined to reshape the role around a particular person.\n\nThere’s a lot of potential for overlap and ambiguity when it comes to analytics roles and responsibilities, especially when making your first hires. So, where do you start? What skills are essential and which are nice-to-have?\n\nMuch will depend on your company’s size and structure, your budget and resources, analytics maturity and objectives. However there's one thing we wouldn't recommend you try...\n\n\nDesperately seeking unicorns\n\nA lot of organisations attempt a shortcut, hunting for an analytics unicorn – that mythical being possessing endless expertise: implementation, collection, integration, preparation, exploration, visualisation, activation... not to mention an alicorn (Google it) and a swishy tail.\n\nThe quest will be futile. Even if you do find someone with such a broad skill set can you capture and keep hold of them? Training them will be a full-time job. Offering a career path will be a challenge. Replacing them a proper nightmare. Before you know it, you'll be back at square one.\n\nWe've found the real magic happens when smart people with different skills, mindsets and experience come together and collaborate on data and analytics. Far better to find and combine specialists - even if that means working with external consultants while you build the business case for hiring more people internally.\n\nTo get you started, here are four types of people you should look for. Together, they'll provide a solid foundation on which to build and advance your analytics capabilities.\n\n\nOlivia – the orchestrator\n\nOlivia is a pragmatic visionary. She sees the big picture as well as the individual puzzle pieces needed to make up the whole. Olivia likes to make things happen. She's resourceful - always finding a way around obstacles to keep projects on track.\n\nWith sufficient technical know-how to know what she doesn't know, she acts as the bridge between the analytics team and the rest of the business, helping to turn sometimes fuzzy marketing and product goals into specific analytics initiatives. Olivia isn’t one to put words in your mouth, but can very effectively translate what you’re trying to say.\n\nBackground: Either leading teams of analysts (client or agency side) or an experienced data-led, strategic marketer.\n\nSoft skills: Communication, stakeholder management, presentation skills.\n\nTools and tech: strong background with the GMP, some GCP, and Project Management tools.\n\nKiller question: What’s the biggest improvement you’ve driven through an analytics initiative?\n\nPractical test: Take some sample marketing data, analyse it and present back your interpretation and recommendations.\n\n\nEllis – the Engineer\n\nEllis is possibly the most organised and logic-driven person you’ve ever met. Ellis likes everything to be in order (a bit of a neat freak - check out that desk!). Systematic, methodical, patient and persistent, and totally focused on the mechanics of how things work, Ellis constantly strives to find a better, more efficient, way of doing things.\n\nEllis played a lot with lego as a child. An ingenious ‘do-it-yourself’ architect and builder who takes great satisfaction in seeing a vision realised. You’ll often find Ellis developing data infrastructure and pipelines, and building systems from the ground up. No problem is too complex if you give Ellis enough time to seek out a solution.\n\nBackground: Engineers often come from a development background, others are former analysts who got frustrated with the quality of data they were analysing and decided to fix the problem themselves.\n\nSoft skills: The ability to collaborate is critical, whether that's with a developer tasked with implementing a data layer, negotiating with IT for access to data or figuring out what tables an analyst needs.\n\nTools and tech: The list is almost endless. Tag management solutions like GTM and Tealium, JavaScript, Python, experience working with APIs and pipelining tools like Funnel, Fivetran and Skyvia, data transformation tools like dbt or Dataform, BigQuery and other GCP engineering tools.\n\nKiller question: There maybe more than one way to approach a problem in the world of engineering, ask for an alternate method to the one they already laid out.\n\nPractical test: Engineering is broad. Present a candidate with an existing solution and ask them what steps they'd take to improve it, both in efficacy and cost.\n\n\nSam – the Scientist\n\nSam lives and breathes data, and whether it’s mathematics, statistics, programming, machine learning, or data mining, modelling, or visualisation, when Sam develops an interest in something, they go deep - very very deep.\n\nA critical thinker, Sam questions everything, systematically analysing a problem or idea from multiple perspectives to understand it as thoroughly as possible. Sam sees things that aren’t immediately obvious to others, whether it’s patterns and meanings in the data, a new way of looking at something, or a solution uniquely suited to the problem at hand.\n\nBackground: Either academic research (in a STEM subject) or direct experience on the job.\n\nSoft skills: Communication is key as it's hard to explain (and thus justify) the value that data science can bring.\n\nTools and tech: We could list a bunch of tools like Jupyter Notebooks, Python, R, etc. (we try to use the GCP stack wherever possible), but any data scientist will have their preferences.\n\nKiller question: What data science solution that you built had the biggest impact?\n\nPractical test: Tricky. The work of a scientist might take days or weeks to produce. Share some code, methods, or systems with them and see if they can spot any errors and suggest improvements.\n\n\nAlex – the Analyst\n\nAlex is an inquisitive, critical thinker who loves to dig into the data to find the story, extracting patterns, trends, or correlations that others might have missed. Alex is a pro at bringing the story to life, visualising and translating the data to guide others in their decision-making.\n\nCurious by nature, Alex is constantly questioning, exploring new ideas and falling down data rabbit holes to seek out answers. Alex has a knack for problem-solving – they’re perceptive, observant, insightful, and always mindful of the big picture. Loves an Escape Room team challenge.\n\nBackground: Transferable skills are key here so the Analyst may come from a variety of backgrounds. The common thread will be tenacious problem solving using data.\n\nSoft skills: Working self-sufficiently, breaking down problems, thinking analytically and critically, good communication skills including presenting complex explanations in simple terms.\n\nTools and tech: SQL, Sheets/Excel, GA, and some Python and/or R.\n\nKiller question: Which problem are you most proud of solving?\n\nPractical test: Build some SQL queries, perform a comparison of two data sets in Google Sheets/Excel, analyse some sample data and make some recommendations for improvement/further investigation.\n\n\nWinning the world cup of analytics\n\nAs you look to scale your analytics maturity and build an in-house data analytics team, remember it’s a team sport. And a team can’t function effectively with too few players - or if everyone wants to play in the same position. Be more Gareth. As a manager, it's your responsibility to adjust the formation to suit your organisation’s analytics needs (which may change over time). And if you don’t have the resources to fill all these roles on day one, you can always draft in a ringer or two from the Measurelab all-star squad."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/what-to-consider-consent-mode/#article",
      "headline": "What to consider when considering Consent Mode",
      "description": "Google's Consent Mode is quickly becomming an essential part of any GTM setup. Here are some questions you need to answer before you decide to ‘turn it on’.",
      "url": "https://www.measurelab.co.uk/insights/blog/what-to-consider-consent-mode/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/what-to-consider-consent-mode/#webpage"
      },
      "datePublished": "2022-11-22T14:06:57.000+00:00",
      "dateModified": "2026-01-27T11:24:36.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/analytics-sub_gtm-1200x400-blog-2.png",
      "author": {
        "@type": "Person",
        "name": "Matthew Hooson",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Tag Manager",
        "Google Analytics",
        "Privacy",
        "Debugging"
      ],
      "articleBody": "The aim of this short post is not to go into what Consent Mode is, Dan has already done an excellent job of that in his recent post, and in episode #42 of The Measure Pod. Instead, the point here is to specify what Consent Mode is not and to give you some questions you need to answer before you decide to ‘turn it on’.\n\nThese recommendations all come from experience, as a consultancy we help clients with a multitude of technology stacks that tackle consent management and this has given us rare insight into what platforms do not work.\n\n\nWhat Consent Mode is Not\n\nSo first and foremost what isn’t Consent Mode? Simply put, it is not a Consent Management Platform (CMP). This is a common misconception, and one that I can understand. After all, it does fundamentally change the way Google Tag Manager (GTM) handles consent.\n\nRather, it is a tool that allows for the simplification of managing how tags behave after your CMP has handled the user's choice. The CMP handles the updating and management of the current consent state so that consent mode can pick it up and run with it.\n\nGone are the blocking triggers and other hacky solutions we have all become accustomed to. It also automatically manages Google tags, firing anonymous pings to ads and analytics platforms when consent is not given so data can be modeled… Wait, I said I would not talk about what it is, didn't I!\n\nAs you can see it is hard not to get caught up in the exciting things that Consent Mode allows, and that is why it is tempting to jump in with two feet. But without properly thinking through a couple of aspects, you are going to find yourself doing a lot of troubleshooting and head-scratching. So what are these all-important considerations?\n\n\nThings to Consider\n\nAsk yourself the following questions before you jump into Consent Mode.\n\nWhich CMP are you using?\n\nWhich CMP you use is important. It needs to support Consent Mode for one thing, or expose enough of its inner workings that you can reconstitute it for use with Consent Mode. For example, consider OneTrust and CIVIC Cookie Control.\n\nOneTrust keeps the scripts controlling consent behind the scenes, providing access to a small piece of code in which you will not see any of the individual functions that update consent on user interaction. Consent Mode is a tick box within the UI, rather than anything manual. CIVIC on the other hand is much more open. As you build up the CIVIC script, you see the accept and revoke functions and so can manipulate them to work with Consent Mode manually.\n\nThis is important because it dictates how you should implement the banner script if you plan on using consent mode…\n\nHow will you be Installing your CMP?\n\nThere are two main ways you can install your CMP onto your site, using the Google tag (gtag.js) and a script supplied by the CMP to add it directly to the head of your site, or via GTM. As mentioned above, a platform like OneTrust does not give you direct access to the consent functions behind the scenes, just access to the production script once everything is published. No problem, we can either add this into the head of the site or via a Custom HTML (cHTML) tag in GTM right? Wrong.\n\nThis is where the biggest pitfall comes into play. In order for Consent Mode to work correctly, that is for it to dictate the behavior of tags based on user consent, consent states must be updated before any tags fire. Without this guarantee, tags could be fired without consent or could be blocked with consent. Obviously neither is desirable for different reasons.\n\nThe issue here is that OneTrust, for example, uses Gtag to update default consent states, and this simply does not work anywhere near quickly enough when added in via a cHTML tag. In fact, it does not work quickly enough when added in via GTM full stop. This is why, for a CMP to be configured with GTM, Google recommends utilising Custom Tag Templates. Specifically, Custom Tag Templates that update consent states utilising Tag Template APIs rather than Gtag. When triggered using the 'Consent Initialisation' trigger, a tag template using the API method of consent manipulation can ensure the correct consent state is set before tags fire.\n\nSo when we consider our two example CMPs one more time, how could we implement them based on what we now know?\n\nOneTrust: As mentioned above, it uses Gtag to update consent states and we have no ability to change this. This means that OneTrust will work with Consent Mode providing it is toggled on in the UI, and is added directly to the head of the site.\n\nCIVIC: Here we have access to the underlying consent update function. This means, in theory, we could write our own custom tag template and swap out gtag updates for API updates. This means we could add it via GTM with some development work on the script or add it to the site head directly.\n\nSome CMPs have already built custom tag templates to handle Consent Mode. These will make life much easier if you want to deploy via GTM but don’t have the internal development resource to create your own. Do be careful though, we have seen some examples of community-built custom tag templates that still just use Gtag as the consent update method, which, as we now know, won’t work.\n\n\nConsent Mode deployment checklist\n\nTo help simplify all of this, here are two checklists that will help you understand if Consent Mode will work with your chosen method of deployment.\n\n\"I want Consent Mode and want to implement my CMP directly to the head of my site.\"\n\n 1. Is the selected CMP compatible with Consent Mode?\n 2. If not stated in the documentation, are the underlying consent and revoke functions able to be manipulated to add in Consent Mode updates?\n\nIf the answer to either of the above is yes, you are good to go - providing you have the know-how or dev resources to rework the consent functions!\n\n\"I want Consent Mode and want to implement my CMP via GTM.\"\n\n 1. Does the CMP have a pre-built tag template that utilises the ‘updateconsentstate’ API?\n 2. Does the script provide sufficient access to allow for a Custom Tag Template to be built using the Tag Template APIs? If so, do you have the development resource to build it?\n\nIf the answer to either of the above is yes, you are good to go! If not, you may still be able to deploy via Gtag directly in the head of the site.\n\n\nConclusion\n\nI hope this provides some insights into what needs to be considered when setting up Consent Mode. In my humble opinion, Consent Mode is a fantastic tool and here to stay, but more fool you if you rush in assuming it is just the flick of a switch away!\n\nCheck your CMPs documentation, your planned implementation method and your dev resource. Do all that and you won't look back."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/measurefest-october-2022/#article",
      "headline": "MeasureFest 2022: why GA4 means you should get on board with BigQuery",
      "description": "MeasureFest is an analytics conference, part of brightonSEO. Katie ran a talk this year all about how BigQuery should be your friend when migrating over to Google Analytics 4, like it or not!",
      "url": "https://www.measurelab.co.uk/insights/blog/measurefest-october-2022/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/measurefest-october-2022/#webpage"
      },
      "datePublished": "2022-10-26T10:17:21.000+00:00",
      "dateModified": "2026-01-27T11:24:39.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/katie-measurefest-october-2022-blog.png",
      "author": {
        "@type": "Person",
        "name": "Katie Kaczmarek",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "BigQuery",
        "Google Analytics",
        "How-to"
      ],
      "articleBody": "This is my first time speaking at any analyics conference, let alone MeasureFest, and I'm looking forward to sharing my passion for SQL and BigQuery. I've been a data analyst for over 10 years, I've used SQL with Oracle, Microsoft and now Google BigQuery, and I can honestly say that Google has been my favourite so far! They are constantly thinking of new ways to improve the user experience, and the speed of the code is amazing. Plus they have a suite of products which have been made to speak to one another with ease.\n\nI love extracting data using SQL, the control you have is amazing. Lots of people can code SQL to extract data, but only the best ones will be checking their outputs and ensuring the data you are looking at is correct. All you need to get started is a little imagination for what you want to extract and how you are going to use that data, a question to ask your data is a good start. From there it's just a case of building up your code and testing along the way. This article I wrote will help with what you should think about when testing your SQL code.\n\nBefore you start using BigQuery with your GA4 data, you'll need to get the exports all set up. Here's a guide I wrote on how to do it step by step:\n\nhttps://www.measurelab.co.uk/insights/set-up-ga4-bigquery-export/\n\nHere's some resources related to the talk to help get started and utilising BigQuery now:\n\n * How much it costs - https://cloud.google.com/products/calculator/\n * Official documentation and guides from Google - https://cloud.google.com/bigquery/docs\n * Great guides and code snippets to get started - https://www.ga4bigquery.com/\n\nAnd here's some handy free resources for learning SQL (and beyond):\n\n * https://developers.google.com/analytics/bigquery/basic-queries\n * https://www.w3schools.com/sql/default.asp\n * https://www.kaggle.com/learn\n\nFor other people to follow, podcasts to listen to, newsletters to subscribe to, websites to visit, and other things that we recommend, see our full recommended list that we pulled together.\n\n\nSlides\n\nBelow are my slides from my MeasureFest talk. Here is the link to Google Slides in case that doesn't work.\n\n\nRecording"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/review-sql-code-bigquery-duplication-errors/#article",
      "headline": "How to review SQL code in BigQuery for duplication and errors",
      "description": "Just because your SQL has run without any errors, it does not mean it's error free! Here's some tips on how to aviod the most common to make mistakes and issues.",
      "url": "https://www.measurelab.co.uk/insights/blog/review-sql-code-bigquery-duplication-errors/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/review-sql-code-bigquery-duplication-errors/#webpage"
      },
      "datePublished": "2022-10-26T10:13:59.000+00:00",
      "dateModified": "2026-02-24T16:00:55.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/analytics-sub_big-query-1200x400-blog-3.png",
      "author": {
        "@type": "Person",
        "name": "Katie Kaczmarek",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "BigQuery",
        "SQL"
      ],
      "articleBody": "Sometimes we can spend hours, days or even weeks writing SQL in BigQuery. Hopefully what you have ended up with is a code that will run error free. Unfortunately, just because a code has run and completed without any errors, it does not mean it's error free! Joins can cause duplication, calculations could be incorrect, column orders could be in the wrong place for unioned tables. The possibilities are endless, lucky us!\n\nThe larger the data set, the harder it will be to notice any discrepancies. It is good practice to implement a process that enables us to check through our SQL code in a logical way to help identify errors. None of them are foolproof, but they should help you to spot issues. This article outlines what I do to avoid the most common mistakes and issues.\n\n\nUnderstanding your data\n\nThe best way to ensure you are extracting the correct data is to understand your data in the first place. Unfortunately, we do not always have that luxury as we often deal with lots of different data from lots of different companies, not to mention set up in various different ways.\n\nThe best way for us to understand these tables is to review your table schema to help you to understand each column, and then ask the people that have dealt with the tables before (or the stakeholder directly) any questions you may have.\n\n\nOrder by\n\nUsing ORDER BY in BigQuery is a great way to try and spot unwanted duplication. This is especially true if its duplication is caused by a JOIN, as it should be pretty obvious that there are multiples of each line of data.\n\nSometimes it will take a little more hunting, but putting data in order allows you to cluster together groups of data making it easier to review and potentially check against the original dataset.\n\n\nTest a subset of data\n\nYou can use the ORDER BY above to choose a selection of data that contains as many variations of the final dataset as possible. Use this output to analyse against the original dataset to ensure the final data extract is behaving in the way you would expect. Using a subset of data will allow you to focus on a small selection of data, usually if you can get the code to work for the small subset it will work for the larger dataset also.\n\n\nCompare calculated fields\n\nWhen we are doing a calculated field, it will group data together in the way you have defined. It is good practice to do a quick check against the original data, filtering the original data for what you are grouping by. Do the counts and sums correlate as they should? If so bingo! If not, you may need to break up your SQL code and investigate why you are getting differences.\n\n\nQuick and dirty row numbers\n\nA lot of duplication or a reduction in rows can come after we start joining on tables. This can happen for a multitude of reasons, such as joining on columns that contain null values. A really quick and easy way to find out if anything has changed is to make a note of the row numbers in the bottom right corner of BigQuery before and after the join. If there is a change, was it approximately what you expected?\n\n\nPeer review\n\nIt should go without saying, but it is beneficial to implement peer reviews to check your work. The more questions they can ask the better. Sometimes we all look at the same piece of work for too long that we get lost in it and can’t see certain issues. Having someone look at your work and question why you have written it in the way you have can help to evaluate your work better.\n\nHopefully these many points above can help you to make less error-prone SQL in BigQuery. If you have any questions on these, or want us to check your code, or peer review what you've done, then get in touch and we can book in a chat!"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/google-analytics-data-retention-settings/#article",
      "headline": "Change your Google Analytics data retention settings",
      "description": "Did you know the default data retention period in GA4 is set to 2 months? Don't lose the ability to report and explore - change your data retention settings today.",
      "url": "https://www.measurelab.co.uk/insights/blog/google-analytics-data-retention-settings/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/google-analytics-data-retention-settings/#webpage"
      },
      "datePublished": "2022-08-31T11:40:18.000+00:00",
      "dateModified": "2026-01-27T11:24:43.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/analytics-sub_sheets-1200x400-blog-3.png",
      "author": {
        "@type": "Person",
        "name": "Rajeev Gill",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "BigQuery",
        "Google Analytics",
        "Privacy",
        "Ecommerce"
      ],
      "articleBody": "It may be news to some: Google Analytics does not keep all of your data forever. The data storage and processing costs for millions of free analytics accounts must be racking up - and it appears with the sunsetting of Universal Analytics in July 2023, Google no longer wants to foot the bill. If you're in the process of migrating to GA4, it’s worth familiarising yourself with the new default data retention settings and making the necessary changes to ensure you can continue to access the reports you need.\n\n\nDefault data retention settings and options\n\nIn both UA and GA4, you can access the controls under the property settings. In GA4, click Admin > Data Settings > Data Retention. In UA, click Admin > Tracking Info > Data Retention. The Google Analytics Data Retention controls give you the ability to select how long user-level and event-level data (associated with cookies, User ID, and advertising identifiers) is stored by Analytics before it's scheduled for automatic deletion from Google’s servers.\n\nIn Universal Analytics, you could choose intervals ranging between 14 months and \"do not automatically expire.\" In GA4, however, you can choose to retain data for either two months or 14 months (on the free version). Here’s the complete range of options:\n\n\n\nUniversal AnalyticsGA4 propertiesGA4 properties under Analytics 360\nNo limit (but UA will stop processing new hits on 1 July 2023)\n\nLimit: up to 14 monthsLimit: up to 50 months\nOptions: 14, 26 (default), 38 or 50 months, or “do not automatically expire”\n\nOptions: 2 (default) or 14 monthsOptions: 2 (default), 14, 26, 38 or 50 months\n\n\n\nThe maximum amount of time that Google Analytics will retain Google Signals data is 26 months, regardless of your settings. After that, your data will be automatically deleted on a month-by-month basis.\n\n\nDrilling into the detail\n\nThe default setting of two months in GA4 is much shorter than we’ve come to expect, especially considering we’ve had the option for data not to expire at all with UA. It’s a big change - a lot of people might not even know there is a different default data retention setting in place when migrating.\n\nThere’s another key difference between UA and GA4 to be aware of. If you increase the retention period, or set it to ‘Do not automatically expire’ for a Universal Analytics property, that change will not apply to data that’s already been collected. Data collected when the retention setting was 14 months will still be deleted 14 months after it was collected, even if you subsequently extend the retention period to 26 months. With GA4, however, if you increase the retention period, the change is applied to data you’ve already collected.\n\nAnother thing you should consider is applying the option to reset user data based on new activity. With each new event from a given user, the expiration date refreshes to the current time plus the retention period. In this way, even with a two month data retention period set, a user’s data would be kept forever if they visit your website or app every month. When the user has been inactive for more than two months, their historical data would be deleted.\n\n\nThe impact on reporting and explorations\n\nIn GA4 your data retention setting doesn’t affect standard reports in the Reports Workspace  (e.g. Traffic acquisition, Pages and screens or E-commerce purchases). These reports are based on pre-calculated tables that cost next to nothing to store and process. You won’t lose the aggregated tables that support these standard reports – so daily users, sessions, and events aren’t going anywhere. You’ll still be able to access those insights as far back as the creation date of your property.\n\nHowever, if you’re using things like segments or secondary dimensions in Universal Analytics, or creating custom reports, tables or visualisations, that’s when sampling comes into effect and data retention settings can have more of an impact. This unaggregated data will no longer be available.\n\nThe issue is with user and event-level data associated with an identifier. For example, in GA4 if your data retention period is set to two months, then after two months of inactivity, that user and event data will no longer be stored. A lot of reporting, analysis, and explorations are done in the Exploration workspace, which is where you’re going to feel it when you only have two months of data to work with.\n\n\nDisappearing Universal Analytics data?\n\nWhatever your data retention setting in Universal Analytics, there’s no guarantee you’ll retain access to all your historical data. Within six months of UA being sunsetted (probably by January 2024), all of your data within UA (both aggregated and non-aggregated) is likely to be deleted.\n\nThis is one of the reasons we suggest people make the jump to GA4 sooner rather than later. It’s also a compelling reason to export your data to BigQuery and store it there or in another data warehouse. By doing so, you get to control exactly what data you keep and for how long.\n\nThis is probably the reason Google made the BigQuery connector free for GA4 properties. You can keep your data forever, provided you’re happy to pay the storage and processing costs once you’ve used up your free allowance. We recommend setting up the BigQuery connector, even if you have no plan to use it right now. Think of it as a backup plan in case you need access to historical data down the line.\n\nData retention settings: what to do right now\n\n 1. Whether you’re using UA or GA4, change your default retention setting now\n 2. If you’re still using Universal Analytics, begin planning your migration to GA4 ASAP\n 3. Once you’ve done that, connect your GA4 data to Google BigQuery\n\nEven if you’re not sure you’ll need all of your historical data, it’s better to be safe than sorry. And if you need a hand with any of these steps, get in touch."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/doom-gtm-edition/#article",
      "headline": "Doom: GTM edition!",
      "description": "For 30 years Doom has been ported onto every device imaginable, now it's time to be able to play it on any website with the help of GTM!",
      "url": "https://www.measurelab.co.uk/insights/blog/doom-gtm-edition/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/doom-gtm-edition/#webpage"
      },
      "datePublished": "2022-08-18T13:29:53.000+00:00",
      "dateModified": "2026-01-27T09:46:23.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/doom_1280w.webp",
      "author": {
        "@type": "Person",
        "name": "Victor Sarker",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "How-to",
        "Google Tag Manager",
        "Google Analytics",
        "Data Analysis",
        "SQL"
      ],
      "articleBody": "The classic 1993 video game Doom has had an amazing life over the last 30 years. Not only are there people still adding new levels via offical add-ons, but the modding community is going strong. For example, check out Beautiful Doom HD!\n\nThe other side of the Doom fandom lies in porting the game to all sorts of weird and unlikely screens. It has been ported to a pregnancy test, a graphical calculator, a MacBook Pro touch bar, and even on a tractor. Someone has even got Doom running inside of Doom itself, because why not.\n\nMy skills lie in Google Tag Manager (GTM), so I thought I'd give it a go to see how I can get Doom running on any website. I also used the Konami Code to hide it on a web page, so only those who know can find and play it!\n\nGive it a go youself by typing in the Konami Code (↑↑↓↓←→←→BA) on this page or on our homepage!\n\n 1. Custom HTML tag\n 2. Trigger\n 3. Google Analytics tracking\n 4. References\n\n\nCustom HTML tag\n\nBelow is the final code for the Custom HTML tag I used. It works for our site, but bear in mind it may need some tweaking if it doesn't work for yours right away.\n\n<script src=\"https://js-dos.com/6.22/current/js-dos.js\"></script>\n<style>\n  canvas {\n    width: 100%;\n    height: 100%;\n    margin: auto;\n    padding: 0;\n  }\n  .dosbox-container {\n    width: 640px;\n    height: 480px;\n    margin: auto;\n    padding: 0;\n  }\n  #controls-heading, #controls-list {\n    padding-left: 50px;\n  }\n</style>\n<script type=\"text/javascript\">\n  var els, i, len, title;\n  var konamiCode = '38,38,40,40,37,39,37,39,66,65';\n  var keyPresses = [];\n  var checkKonami = function (e) {\n    keyPresses.push(e.keyCode);\n    if (keyPresses.slice(keyPresses.length - 10).join() === konamiCode) {\n      runKonami();\n    }\n  };\n  var runKonami = function () {\n    console.log('konami code activated!');\n    dataLayer.push({\n      'event': 'doom_launched'\n    });\n    \n    // Create new site section\n    var doomSection = document.createElement('section');\n    doomSection.setAttribute('id', 'doomSection');\n    \n    // Create and append dosbox container\n    var dosboxContainer = document.createElement('canvas');\n    dosboxContainer.setAttribute('id', 'jsdos');\n    doomSection.appendChild(dosboxContainer);\n    \n    var div1 = document.createElement('div');\n    div1.setAttribute('class', 'row no-gutters');\n    doomSection.appendChild(div1);\n    \n    var div2 = document.createElement('div');\n    div2.setAttribute('class', 'col-md-7 left-fullwidth-block white-bg my-auto ');\n    div1.appendChild(div2);\n    \n    var div3 = document.createElement('div');\n    div3.setAttribute('class', 'content-center');\n    div2.appendChild(div3);\n    \n    // Create and append controls list\n    var controls = [\"Move: UP, DOWN, LEFT, RIGHT\", \"Use: W\", \"Fire: S\", \"Speed on: SPACE\", \"Strafe on: ALT\", \"Strafe: A, D\"];\n    var controlsHeading = document.createElement('h3');\n    controlsHeading.setAttribute('id', 'controls-heading');\n    controlsHeading.innerText = 'Controls';\n    var controlsList = document.createElement('ul');\n    controlsList.setAttribute('id', 'controls-list');\n    for (var i = 0; i < controls.length; i++) {\n        var item = document.createElement('li');\n        item.appendChild(document.createTextNode(controls[i]));\n        controlsList.appendChild(item);\n    }\n    div3.appendChild(controlsHeading);\n    div3.appendChild(controlsList);\n    \n    // Create and append Fullscreen button\n    var doomFullscreenBtn = document.createElement('button');\n    doomFullscreenBtn.setAttribute('id', 'fullscreenBtn');\n    doomFullscreenBtn.setAttribute('onclick', 'ci.fullscreen()');\n    doomFullscreenBtn.innerText = 'Fullscreen';\n    div3.appendChild(doomFullscreenBtn);\n    \n    // Inject section\n    document.querySelector('body > main').prepend(doomSection);\n    \n    // Run dosbox and extract + load DOOM\n    Dos(document.getElementById(\"jsdos\"), {\n        wdosboxUrl: \"https://js-dos.com/6.22/current/wdosbox.js\",\n        // cycles: 1000,\n        // autolock: false,\n    }).ready(function (fs, main) {\n      fs.extract(\"https://js-dos.com/cdn/upload/DOOM-@evilution.zip\").then(function () {\n        main([\"-c\", \"cd DOOM\", \"-c\", \"DOOM.EXE\"]).then(function (ci) {\n            window.ci = ci;\n        });\n      });\n    });\n  };\n  document.addEventListener('keyup', checkKonami);\n</script>\n\nBreaking down how it works though, the first piece of HTML that we need is the js-dos library (we've used v6.22):\n\n<script src=\"https://js-dos.com/6.22/current/js-dos.js\"></script>\n\nFollowing this, the next piece of HTML will be the Konami Code example from Simo’s blog (see useful links below). This will set up the necessary mechanisms for logging the keypresses and checking their keycode values to see if they resemble the same ones as the Konami Code.\n\nThe next part is to replace the code within the runKonami() function declaration. This will be where the Dosbox emulator will be injected into the page.\n\nIn order to proceed, an element needs to be referenced on the page. This can either be an existing element or a brand new one can be created. For our website, a brand new section is built using JavaScript utilising document.createElement() commands and then prepended to the beginning of the body using Element.prepend().\n\nNow that an element on the page is available, the Dosbox emulator can be initialised. To do this, see the link to the js-dos v6.22 examples below. However, the following key changes (highlighted) were made.\n\n1) The first argument in the Dos() command points to the element that will hold our emulator:\n\nDos(document.getElementById(\"jsdos\"), {\n        wdosboxUrl: \"https://js-dos.com/6.22/current/wdosbox.js\",\n        cycles: 1000,\n        autolock: false,\n    })\n\n2) This points to the hosted version of DOOM available on a js-dos.com CDN. This could be replaced with a different game ROM if you like:\n\nfs.extract(\"https://js-dos.com/cdn/upload/DOOM-@evilution.zip\")\n\n3) These are the MS-DOS commands that we need the emulator to execute after it has finished extracting the ROM (navigate to the DOOM directory and run DOOM.EXE):\n\nmain([\"-c\", \"cd DOOM\", \"-c\", \"DOOM.EXE\"])\n\n\nTrigger\n\nThis new Custom HTML tag needs a trigger. The tag would need to be executed on one of the page load triggers, either DOM Ready at the earliest, or Window Loaded at the safest. This is to ensure that the page is ready to have its visible features changed.\n\nNote: If possible, try to restrict the trigger to fire on either specific pages, or the presence of specific page elements.\n\nHit publish, then give it a go! Here is what it looks like on our website:\n\nTry it out for yourself on our homepage or this blog page!\n\n\nGoogle Analytics tracking\n\nOf course I wanted to track how many times the Dosbox emulator was initialised, so I added a data layer push within the runKonami() function:\n\nvar runKonami = function () {\n   console.log('konami code activated!');\n\n   dataLayer.push({\n      'event': 'doom_launched'\n   });\n\n   // some other stuff\n\n};\n\nThen set up your trigger in GTM based on the dataLayer event name you've used:\n\nAnd then set up your GA event tag using the trigger from the previous step:\n\nWe've used the GA4 event tag here, but you can trigger any tag from this dataLayer push.\n\n\nReferences\n\nAdding The Konami Code To Your Site via GTM (by Simo Ahava)\n\nhttps://www.simoahava.com/gtm-tips/add-konami-code-to-your-site/\n\nSimply follow the instructions in setting up the Custom HTML tag. The example included will reverse any of the text in an <h2> element, but the contents of the runKonami() function can be changed to run any arbitrary JavaScript code.\n\nDOOM with js-dos example\n\nhttps://js-dos.com/DOOM/\n\nThe above example uses an obsolete version of js-dos (This version worked fine locally, but only loaded a grey square on the Measurelab site, switched to v6.22 - see below).\n\nThe source code example imports a locally sourced DOOM rom file in an upload/ directory. I instead found a copy hosted on a js-dos CDN available here: https://js-dos.com/cdn/upload/DOOM-@evilution.zip.\n\njs-dos 6.22\n\nhttps://js-dos.com/6.22/examples/\n\nThe primary js-dos library that is used in the Custom HTML tag (line 1):\n\n<script src=\"https://js-dos.com/6.22/current/js-dos.js\"></script>\n\nThis version of js-dos has different syntax to the original example in the DOOM page above."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/how-to-delete-events-in-google-analytics-4/#article",
      "headline": "How to delete events in Google Analytics 4",
      "description": "You can't fully delete event in GA4, which is a problem. See how to work around the limitations and fully delete events for good.",
      "url": "https://www.measurelab.co.uk/insights/blog/how-to-delete-events-in-google-analytics-4/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/how-to-delete-events-in-google-analytics-4/#webpage"
      },
      "datePublished": "2022-08-10T08:38:20.000+00:00",
      "dateModified": "2025-07-31T20:35:45.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/analytics-sub_uaga4-1200x400-blog-10.png",
      "author": {
        "@type": "Person",
        "name": "George Mendham",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "How-to",
        "Google Analytics",
        "Looker Studio"
      ],
      "articleBody": "A recent problem was posted in Measure Slack asking if it were possible to completely delete events from Google Analytics 4 (GA4). The good news is that while it isn’t immediately obvious, it is completely possible. Well, of sorts!\n\nWithin GA4 there is a feature called Data Deletion Requests (Admin > (Property) > Data Deletion Requests) in which are different ‘Deletion types’ that a user can now take advantage of. This means we can now be quite granular about what we do/don’t want to delete. This is a much welcome relief from the somewhat devastating data deletion feature that existed in Universal Analytics. The 5 deletion types are:\n\n 1. Delete all parameters on all events\n 2. Delete all registered parameters on selected events\n 3. Delete selected parameters on all events\n 4. Delete selected registered parameters on selected events\n 5. Delete selected user properties\n\nFrom the above list it isn’t immediately obvious which deletion type you would need to use if you wanted to delete an event and all the associated parameters from your property. After some testing we found that you actually need to do this in two steps.\n\n\nStep 1 - Delete all the event parameters\n\nWe first need to delete all of the parameters for the event(s) we want to delete. We can do by running a data deletion request and choosing the 'Delete all registered parameters on selected events'. After choosing your event that you want to delete, and the selected time frame, you then need to schedule this data deletion request.\n\n\nStep 2 - Delete the event name\n\nOnce the above data deletion has been processed, all that would be left in your property is the event name as it would no longer carry any parameters. So what we need to do is then delete the event from the property.\n\nWe do this by doing another data deletion request, only this time choose the 'Delete selected parameters on all events' option. Within the ‘Parameters to delete’ dropdown field search for ‘event_name’ and add this parameter. Finally, enable the option to ‘only delete parameter value that contain the following text’ and enter the name of your event that you want to delete i.e. ‘my_event_to_delete’ in our example, and then schedule the request.\n\nOnce the above two requests have processed, you’ll still be left with an event in your events reports called ‘(data deleted)’, and all associated parameter values will also appear as ‘(data deleted)’ too.\n\nNote: in our example above, we have the parameter 'page_location' set as an event-level Custom Dimension and thus it is deleted via this process. The standard out-of-the-box dimensions are not deleted, i.e. Page path\n\nThere's not much else we can now, the '(data deleted)' event will remain visible in the reports. However, you can of course manually filter these events out in any custom report, or dashboards you build in Google Dtaa Studio.\n\nHappy deleting!"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/roi-return-on-analytics/#article",
      "headline": "Can you measure the return on analytics?",
      "description": "Is it possible to show a return on analytics or is seeking ROI a futile folly? If you can't point to directly-attributable revenue, how else might you quantify the contribution of an analytics team?",
      "url": "https://www.measurelab.co.uk/insights/blog/roi-return-on-analytics/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/roi-return-on-analytics/#webpage"
      },
      "datePublished": "2022-07-26T12:39:47.000+00:00",
      "dateModified": "2026-01-27T11:24:46.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/roa.png",
      "author": {
        "@type": "Person",
        "name": "Dara Fitzgerald",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Looker Studio",
        "Conversion Tracking",
        "Testing",
        "Marketing"
      ],
      "articleBody": "It’s a question that comes up from time to time (you can listen to Dan and I discussing it on the Measure Pod) - usually when a client's trying to make a case for internal analytics headcount or thinking about renewing their GA360 licence. Besides pointing to directly-attributable revenue, are there other ways we might quantify the contribution of an analytics team and justify the cost of the tools used?\n\n\nInvestment and attribution\n\nThe first challenge is calculating the cost of analytics. Analytics headcount isn't always easy to identify and isolate. It's straightforward if there's a core team or “Analytics Centre of Excellence”, but analysts are often embedded within other functions, and implementation responsibilities can fall to IT or a web development team.\n\nSimilarly, while some analytics tools might be wholly owned by an analytics team, others might be covered by a central IT budget, or the costs spread across other departments like marketing, sales and customer service.\n\nThe analytics team tends to be a decision support function. Whether it’s in-house or an external consultancy, it’s usually at least one step away from where the final decisions relating to website optimisation, media investments or customer experience design are actually made.\n\nWhile your engineers and analysts may do the hard yards, preparing the data, building the reports and offering opinions, they need to work with people who have the context necessary to interpret the data in a meaningful way. As such, the credit for analytics work often gets attributed to other business functions, such as Operations, Marketing, Engineering, or Product Development.\n\n\nLet others do the talking\n\nMaybe this isn't such a problem. Barry McCardel argues the best way for a data or analytics team to justify their existence is to sit back and let others talk up their contribution. McCardel suggests that if an analytics team is really providing value, the leaders of other functions will be willing to share the credit for their successes and advocate on your behalf. If they don't, then they're clearly not feeling or recognising the tangible impact of your team.\n\nOf course, the ability of an analytics team to make an impact will depend on where the organisation is on its data journey. In many of our engagements, the first months are spent auditing and optimising the existing analytics implementation and validating the data collected. While the technical fixes may be quick, it can take much longer to build sufficient trust in the data to make the organisation receptive to, and willing to act upon, recommendations.\n\nThis willingness to act on data was one of the nine signs of analytics maturity we identified in our conversation with Steen Rasmussen of IIH Nordic. Ben Stancil goes further, saying an analyst’s only job is to make people more decisive, and therefore the best method for measuring analytical work is to measure how quickly people make decisions with it. He also suggests tracking the time it takes for an analytics team to answer questions put to them.\n\n\nQuantifying the ROI on analytics\n\nOf course, there are times when it’s essential to produce a number. Maybe you’re making a business case for more headcount, or need to justify the expense of the current team in an organisation experiencing cost pressures. If that's the case, here are some ways to associate or attribute revenue to the analytics team that you might consider.\n\n\nOptimising return on ad spend\n\nAnalysis, insights and recommendations can lead to more efficient marketing campaigns, whether it’s increased sales or reduced costs. Think of it as a last-touch attribution model, crediting the analytics team with the improvements in return on ad spend (ROAS).\n\n\nImproving web and app conversion rates\n\nThe next area where you could look at improvements based on analytics is with your website or app. AB and multivariate testing and Conversion Rate Optimisation (CRO) programmes depend on solid data and expert analysis.\n\n\nProduct optimisation\n\nBetter understanding user behaviour can increase activation and engagement, reduce churn, and identify up- and cross-sell opportunities, ultimately increasing Customer Lifetime Value (LTV). Establish a baseline, then subsequent improvements as a result of analysis can be attributed to the analytics team.\n\n\nTime savings\n\nA well-oiled analytics function can save a lot of time within the business. With automated reports and dashboards providing the right data to the right people, decisions can be made quicker and with more confidence.\n\n\nDamage control\n\nIt doesn’t always have to be about edging up sales or trimming costs; analytics can act as an early warning system that might help minimise the negative impacts of a market crash or identify an unexpected dip or spike in demand, as we’ve witnessed first-hand during the COVID pandemic.\n\n\nAll of the above\n\nRather than trying to painstakingly calculate every dollar of directly attributable revenue, we might be better served zooming out and simply looking at overall business performance. Do the companies that spend a higher proportion of their revenues on data and analytics outperform their competitors?\n\nAccording to McKinsey, the answer is yes. Companies with a data-driven culture see thousands of incremental improvements, the cumulative effect of which can be game-changing. They report data-driven organisations are 23 times more likely to acquire customers, six times more likely to retain customers and 19 times more likely to be profitable. Forrester is in agreement. They claim “insight-driven businesses” grow at an average of 30% each year and predicted that from 2021 these businesses would be taking $1.8 trillion in business a year away from their less-informed industry competitors.\n\nIf those numbers still aren't enough to convince your internal stakeholders on the value of adding analytics headcount, you might want to start by hiring a freelance analytics consultant or a specialist analytics consultancy like Measurelab as a 'proof of concept'. It's a low-risk way of demonstrating the value an analytics team can bring to an organisation - a role we're happy to play. In just a few months, those sceptical stakeholders are hooked on data and making more internal hires to feed the demand for additional analysis becomes a no-brainer."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/bigquery-data-server-side-gtm/#article",
      "headline": "How to access BigQuery data from server-side GTM (via Firestore)",
      "description": "This guide details the steps to be able to augment server-side GTM tags with data stored in BigQuery before they are sent to their endpoints.",
      "url": "https://www.measurelab.co.uk/insights/blog/bigquery-data-server-side-gtm/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/bigquery-data-server-side-gtm/#webpage"
      },
      "datePublished": "2022-07-20T12:41:57.000+00:00",
      "dateModified": "2025-07-31T22:14:07.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/analytics-sub_gtm-1200x400-blog-3.png",
      "author": {
        "@type": "Person",
        "name": "Matthew Hooson",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "How-to",
        "BigQuery",
        "Google Tag Manager",
        "Google Analytics",
        "Debugging",
        "Google Cloud",
        "Firebase Analytics",
        "Server-side Tagging"
      ],
      "articleBody": "This solution allows for data, contained within BigQuery to be queried and stored in Firestore where it can then be accessed on the fly by server-side GTM. This will allow for tags to be augmented with additional information before they are sent to their endpoints. For example:\n\nA purchase event on the client-side GTM container triggers an HTTP request to the server-side container\n\n↓\n\nHTTP request contains event name ‘Purchase’ and item id ‘14589’\n\n↓\n\nItem id is used to look up item information using a Firestore lookup variable\n\n↓\n\nAll information about that specific item is returned back to the server container where it can be added to the event tag before it is sent to GA4\n\nThe Google cloud services used are:\n\n * BigQuery: This is where the main tables of data live. They can either be queried as a one-off to build a JSON of desired data for Firestore or they can be regularly queried so up-to-date data is feeding into Firestore\n * Cloud Store: Cloud store acts as the intermediary between BigQuery and Firestore. When an initial query is sent to BugQuery, its results are stored in a storage bucket in the form of a JSON file. This JSON file is then uploaded to Firestore using a cloud function\n * Cloud Function: The cloud function in this case is used to take the JSON file stored in the cloud storage bucket and import it to Firestore. The function is triggered by a pub/sub call\n * Google Workflow: Google workflow is used to dictate the order and flow of tasks that need to take place. It used a YAML script to break down the various stages and execute them before moving on to the next. This is where to BigQuery table is queried and stored. Only then is a pub/sub message sent to the function to store the file in Firestore. This workflow can also be triggered using a cloud scheduler\n * Cloud Scheduler: This allows for the workflow to be triggered at specific intervals. Uses cron job notation\n\n\nContents\n\n 1. Prerequisits\n 2. Create a cloud function\n 3. Create a Google Workflow\n 4. Test\n 5. Accessing the data from ssGTM\n 6. Check the look-up is working\n 7. Conclusions\n\n\nPrerequisites\n\nSomething you will need to have in place before proceeding:\n\n * A GCP project\n * Some BigQuery data\n * A query that collects the necessary data from BigQuery\n * Google Cloud Storage Bucket to store the query results in\n\nYou also need to enable these services:\n\n * Google Workflows\n * Google Cloud Functions\n * Google Pub/Sub\n\nCreate a new service account, where the account should be able to do the following:\n\n * Query BigQuery tables where the data you want to move lives\n * Read and Write files into relevant Cloud Storage Bucket\n * Able to create new cloud scheduler rules\n * Be able to read and write to firestore\n * Be cable to send pub/sub messages\n\n\nCreate a cloud function\n\nFirst, we need to create a pub/sub-triggered cloud function that will write the necessary data to Firestore. There is no need to alter the code below as all of the information required will be contained within the pub/sub message that triggers the function.\n\nSettings\n\nThe setting to apply to the function are:\n\n * Environment: 1st gen\n * Trigger type: Cloud Pub/Sub (you can create a topic from within the function UI if you have not already done so)\n * Memory Allocated: 128MB (for small amounts of data this will work. If you notice that the function is timing out then adjust the memory accordingly).\n * Timeout: Depends on the file size you want to process (see limits). For files that are not that large, you could start with the default 60 seconds.\n * Runtime: Node.js 16\n\nThen attach the service account created earlier.\n\nPackage.json\n\n {\n    \"name\": \"gcf-cloudstorage-to-firestore\",\n    \"version\": \"1.0.0\",\n    \"dependencies\": {\n        \"@google-cloud/storage\": \"^5.20.3\",\n        \"firebase-admin\": \"^10.2.0\",\n        \"split\": \"^1.0.1\"\n    }\n}\n\nindex.js\n\n'use strict';\n\nconst admin = require('firebase-admin');\nconst {Storage} = require('@google-cloud/storage');\nconst split = require('split');\n\n/**\n * Triggered from a Pub/Sub message.\n *\n * @param {!Object} event Event payload.\n * @param {!Object} context Metadata for the event.\n */\nexports.loadCloudStorageToFirestore = async(event, context) => {\n\n    const pubSubMessage = event.data ? Buffer.from(event.data, 'base64').toString(): '{}';\n    const config = JSON.parse(pubSubMessage);\n\n    console.log(config)\n\n    if (typeof config.projectId != 'undefined') {\n\n        const projectId = config.projectId;\n        const bucketName = config.bucketName;\n        const bucketPath = config.bucketPath;\n        const firestoreCollection = config.firestoreCollection;\n        const firestoreKey = config.firestoreKey;\n\n        console.log(`Initiated new import to Firebase: gs://${bucketName}/${bucketPath}`)\n\n        // Init Firebase\n        if (admin.apps.length === 0) {\n            admin.initializeApp({ projectId: projectId })\n        }\n\n        // Init Storage\n        const storage = new Storage()\n        const bucket = storage.bucket(bucketName);\n        const file = bucket.file(bucketPath);\n\n        let keysWritten = 0;\n\n        try {\n        \n            // TO-DO: Remove old records\n\n            // Read file and send to Redis\n            file.createReadStream()\n                .on('error', error => reject(error))\n                .on('response', (response) => {\n                    // connection to GCS opened\n                }).pipe(split())\n                .on('data',  async record => {\n                    if (!record || record === \"\") return;\n                        keysWritten++;\n\n                        const data = JSON.parse(record);\n                        const key = data[firestoreKey].replace(/[/]|\\./g, '');\n\n                        try {\n                            await admin.firestore().collection(firestoreCollection).doc(key).set(data)\n                        } catch(e) {\n                            console.log(`Error setting document:  ${e}`);\n                        }\n                })\n                .on('end', () => {\n                    console.log(`Successfully written ${keysWritten} keys to Firestore.`);\n                })\n                .on('error', error => reject(error));\n        \n        } catch(e) {\n            console.log(`Error importing ${bucketPath} to Firestore: ${e}`);\n        }\n    }\n\n};\n\nOnce finished, deploy the function and wait to see that it throws no errors.\n\n\nCreate a Google Workflow\n\nCreate a new Google workflow and apply the service account created earlier. You will need to copy in the below YAML code which will created a visual representation of the workflow:\n\n- init:\n    assign:\n    - project_id: \"<your-project-id>\"\n    - bq_dataset_export: \"<your-bq-dataset-for-export-table>\"\n    - bq_table_export: \"<your-bq-tablename-for-export-table>\"\n    - bq_query: >\n            select\n                user_id,\n                device_first,\n                channel_grouping_first\n            from\n                `bigquery.table`\n    - gcs_bucket: \"<your-export-bucket>\"\n    - gcs_filepath: \"firestore-export/firestore-export.json\"\n    - pubsub_topic: \"<your-pubsub-topic-name>\"\n    - pubsub_message: {\n            \"projectId\": \"<your-firestore-project-id>\",\n            \"bucketName\": \"<your-export-bucket>\",\n            \"bucketPath\": \"firestore-export/firestore-export.json\",\n            \"firestoreCollection\": \"<your-firestore-collection>\",\n            \"firestoreKey\": \"<your-key-to-use-as-firestore-document-id>\"\n        }\n- bigquery-create-export-table:\n                call: googleapis.bigquery.v2.jobs.insert\n                args:\n                    projectId: ${project_id}\n                    body:\n                        configuration:\n                            query:\n                                query: ${bq_query}\n                                destinationTable:\n                                    projectId: ${project_id}\n                                    datasetId: ${bq_dataset_export}\n                                    tableId: ${bq_table_export}\n                                create_disposition: \"CREATE_IF_NEEDED\"\n                                write_disposition: \"WRITE_TRUNCATE\"\n                                allowLargeResults: true\n                                useLegacySql: false\n\n- bigquery-table-to-gcs:\n    call: googleapis.bigquery.v2.jobs.insert\n    args:\n        projectId: ${project_id}\n        body:\n            configuration:\n                extract:\n                    compression: NONE\n                    destinationFormat: \"NEWLINE_DELIMITED_JSON\"\n                    destinationUris: ['${\"gs://\" + gcs_bucket + \"/\" + gcs_filepath}']\n                    sourceTable:\n                        projectId: ${project_id}\n                        datasetId: ${bq_dataset_export}\n                        tableId: ${bq_table_export}\n- publish_message_to_pubsub:\n    call: googleapis.pubsub.v1.projects.topics.publish\n    args:\n      topic: ${\"projects/\" + project_id + \"/topics/\" + pubsub_topic}\n      body:\n        messages:\n          - data: ${base64.encode(json.encode(pubsub_message))}\n\nYou will need to add in some values here which which will be used to access BigQuery, run a query, store it in GCP and then trigger a pub/sub message containing the necessary Firestore information. It is important to note that when defining your table and data set variables, these will be where the query results are stored, DO NOT use the same dataset and table name as the table being queried or all data will be replaced with the query result.\n\nSome descriptions on the information needed from above:\n\n * project_id: GCP project ID\n * bq_dataset_export: The name of the dataset you want your BigQuery query results to live in\n * bq_table_export: The name of the table you want your BigQuery query results to live in\n * bq_query: The specific query that will return the data you wish from the table (SQL)\n * gcs_bucket: Name of the GCS bucket you wish to store your query results in\n * gcs_filepath: what do you want the file…"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/set-up-ga4-bigquery-export/#article",
      "headline": "How to set up the GA4 BigQuery export",
      "description": "Setting up the Google Cloud Platform (GCP) so that you can export the data from Google Analytics 4 (GA4) can often be confusing, and the documentation from Google can be a bit vague. This guide walks through all the steps to get it set up correctly, and enable the GA4 exports.",
      "url": "https://www.measurelab.co.uk/insights/blog/set-up-ga4-bigquery-export/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/set-up-ga4-bigquery-export/#webpage"
      },
      "datePublished": "2022-07-18T15:13:43.000+00:00",
      "dateModified": "2025-07-31T20:35:46.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/analytics-sub_big-query-1200x400-blog-4.png",
      "author": {
        "@type": "Person",
        "name": "Steven Elliott",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "How-to",
        "BigQuery",
        "Google Analytics",
        "Google Cloud",
        "Firebase Analytics"
      ],
      "articleBody": "The act of enabling the export from Google Analytics 4 (GA4) to BigQuery is actually a relatively simple process. However there are some parts of the Google Cloud Platform (GCP) setup that can trip people up, and the documentation from Google can be a bit vague. Without setting up the GCP correctly, your GA4 data will not be exported properly. So it's essential to make sure this is done from the very beginning as to not lose any historic data (as the GA4 data does not backdate in BigQuery!).\n\nThe steps detailed in this guide are:\n\n 1. Create a GCP account\n 2. Create a project\n 3. Enable APIs\n 4. Set IAM permissions\n 5. Set up the GA4 to BigQuery export\n\nI hope it helps!\n\n\nCreate a GCP account\n\nHead over to the GCP website and click the 'Get started for free' button. Sign in with your Google account, and fill in the country and description from the drop-down list.\n\nYou should also see some free credit when signing up at this step. Google changes this occasionally, but you can see I have $400 for free to spend over the first 90 days.\n\nClick continue and then verify your identity using a phone number.\n\nThe final step is to create a payments profile which requires you to fill in all the fields on the screen.\n\n * Account type\n * Tax information (enter your company's VAT number here)\n * Name and address\n * Primary contact\n * Payment method\n\nOnce completed, you may have to verify the bank account - the method depends on the bank.\n\n\nCreate a project\n\nA project in the GCP is essentially an organisational 'folder' of sorts. Google's definition is\n\nA project organizes all your Google Cloud resources. A project consists of a set of users; a set of APIs; and billing, authentication, and monitoring settings for those APIs. So, for example, all of your Cloud Storage buckets and objects, along with user permissions for accessing them, reside in a project.\n\nIf you have followed the previous step in this process, you will already have a new project called \"My First Project\" which was set up automatically. You can use this project, just rename it by clicking the three dots in the top right corner of the screen and going to 'Project Settings'. As this will be for the GA4 data, I would suggest something along the lines of [company_name]_ga4_[ga4_property_reference] so our one would be something like \"measurelab_ga4_demo\".\n\nYou cannot edit the 'Project ID' or the 'Project number', so if that is an issue, you will have to create a new project altogether.\n\n\nEnable APIs\n\nTo enable data to be shared smoothly from GA4 to BigQuery, there are a couple of APIs we would recommend setting up for this project.\n\nOpen the left navigation panel and head to 'APIs and services' and then make sure you are on the 'Enabled APIs and services' page. Scroll to the bottom of this page to see all current APIs and services you have enabled for this project.\n\nClick '+ ENABLE APIS AND SERVICES' at the top to select more APIs and services from the library. We will want to add three more APIs in here:\n\n 1. BigQuery Data Transfer API\n 2. Google Drive API\n 3. Google Analytics API\n\nFor each one, click 'ENABLE' and follow the on screen instructions.\n\nNote: Check that the 'BigQuery API' is enabled - it should be by default, but double checking here can save time down the line! If it is not, go through the same process above and enable it too.\n\n\nSet IAM permissions\n\nNow we have a project, we can set the Identity and Access Management (IAM) permissions to allow people access to the project, and we can define what level or access they are allowed.\n\nOpen the left navigation panel and head to 'IAM and admin' and then make sure you are on the 'IAM' page. At the top of the page, click '+ ADD' and add the email address(es) of the people you want to grant access. The simplist role to give would be one of the Quick access > Basic ones.\n\nWe will also need to add two service account emails to enable the GA4 data exports. To do this, use the same process as above, but add the following email addresses at the 'Editor' level:\n\n * analytics-processing-dev@system.gserviceaccount.com\n * firebase-measurement@system.gserviceaccount.com\n\nClick save, now BigQuery is ready to receive GA4 data!\n\n\nSet up the GA4 to BigQuery export\n\nGoogle has a pretty thorough walkthrough on how to enable the exports from GA4 to BigQuery that can be followed here. Note that if you are setting this up, you will need 'Edit' level permissions in both the GA4 property and the GCP project.\n\nMake sure to pay attention to the data location you are choosing as this cannot be changed afterwards! For example, we would use 'eu-west 2 (London)' as we are based in the U.K.\n\nThere are two export options for the GA4 data which can be enabled:\n\n 1. Daily - exports of the full day's data sometime in the morning (based on the time zone defined in GA4)\n 2. Streaming - intraday data (almost) realtime but only for the current day (based on the time zone defined in GA4)\n\nWe suggest always having the 'Daily' export enabled, and the 'Streaming' optionally if you have some plan for the data. It can always be enabled at a later date.\n\nOnce set up, you will have to wait at least 24hrs before the data will start appearing in BigQuery.\n\nPlease do get in touch if you want to discuss getting GA4 implemented, and the BigQuery exports enabled."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/measurecamp-london-2022/#article",
      "headline": "MeasureCamp London 2022: our top highlights & lessons",
      "description": "In May 2022, it was the 10th anniversary of MeasureCamp London and a few of us Measurelabbers headed out for a Saturday of analytics discussions, debates and fun!",
      "url": "https://www.measurelab.co.uk/insights/blog/measurecamp-london-2022/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/measurecamp-london-2022/#webpage"
      },
      "datePublished": "2022-06-17T13:13:00.000+00:00",
      "dateModified": "2026-01-27T11:24:49.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/measurelab-kpi_1200x400-blog-1.png",
      "author": {
        "@type": "Person",
        "name": "Daniel Perry-Reed",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Google Tag Manager",
        "Looker Studio",
        "BigQuery",
        "Privacy",
        "Testing",
        "Google Cloud",
        "Server-side Tagging",
        "Google Ads"
      ],
      "articleBody": "In May 2022, it was the 10th anniversary of MeasureCamp London and a few of us Measurelabbers headed out for a Saturday of analytics discussions, debates and fun!\n\nIt was the first time Measurelab sponsored the event too, which meant we had a room named after us (thus the customary awkward picture). And it was also the first time I volunteered and helped out on the day (thus the very loud red t-shirt):\n\nBelow are a few of each of our favourite bits from the anniversary event.\n\n\nDara Fitzgerald\n\nThe session I enjoyed the most at MeasureCamp was \"A Post GA World?\" by Jordan Peck from Snowplow. I always like sessions that make me think outside my normal day to day. As an analytics consultancy we have always specialised in Google Analytics and these days we’re very busy migrating clients over to GA4 and training their teams on how to get the most out of the latest, greatest version of GA. So I sat in Jordan’s session to get a totally different perspective. It’s vital we keep on top of alternatives so we can best advise our clients with well-rounded knowledge and integrity.\n\nThe background here is that some companies may be considering if GA is still right for them. There are a number of reasons for this, including:\n\n * Concerns around the legality of GA in certain EU countries.\n * The fact UA is being sunsetted and GA4 is still buggy and lacking in a few feature areas.\n * The number of privacy centric analytics tools popping up in the market, like Fathom and Plausible.\n\nJordan talked through a couple of options he wouldn’t really recommend like self-hosting GA or forwarding hits collected for GA in the browser and sending them to BigQuery (using customTask in GTM, a Google Cloud Function or server-side GTM). The main drawbacks of these methods are that they still rely on Google Analytics code and are likely to still send data to the US.\n\nThe third option he covered was building your own analytics solution but this is not even going to be considered by the vast majority of companies. And for those that do consider it, the effort involved will often outweigh the value delivered.\n\nSo option four is using one of the start-up, privacy friendly analytics solutions. Many of these are EU based, allow you to track most of what you are likely to need and some also offer data warehousing solutions. Some also share the same drawbacks though, including lacking features you might be used to, struggling with high volume and potentially going too extreme on the privacy front.\n\nUnderstandably Jordan saved Snowplow as his last suggestion. Although he’s naturally biassed as he works there, we have a lot of respect for Snowplow too. It’s fully open source, you can host it in your own cloud and you get unlimited custom data structures and properties.\n\n\nKatie Kaczmarek\n\nThis was my very first MeasureCamp, let's talk all things swag, knowledge sharing and great company.\n\nFirstly swag, whatever bag you think is big enough, bring a bigger one. This could potentially just be me, I’m awfully partial to a freebie! But a bag is definitely a good idea, preferably one that's easy to carry. I came away with t-shirts, jumpers, pens, socks and a massive jar of M&Ms. But that last one was definitely just me, what can I say, I’m very good at counting grey M&Ms!\n\nMoving on to more important stuff, the event was great, anybody could put themselves forward for a session and talk about whatever they are passionate about. Being surrounded by people who have come to a data event, means a data based (see what I did there) subject would be preferable. Saying that though, one of the best talks I went to was by Bhavik Patel, who took us through his journey in analytics and searching for happiness within your chosen career. Sometimes it will be the subject that has you listening, sometimes speakers were so engaging you could listen to them talk about soup for 30 minutes and still be engaged. Bhavik held the room and everyone was captivated by his story.\n\nThere are different types of talks you can go to, there were demos, workshops, discussions and presentations. Some came prepared, some winged it, all were fabulous. I think the next time I go I will probably head for the discussions. It can be a lonely business working in data, there's something appealing about coming into a discussion group to talk about issues you’ve faced, problems you’ve tackled and being amongst like minded people to hear about their experiences and solutions. Lets face it, sharing good practices in all jobs would make the world a better place.\n\nThere are a multitude of rooms hosting a variety of speakers. It can be quite tricky to choose just one. Initially I started picking talks that might benefit my career, but I had very little knowledge on them. This seemed like a good plan but I sometimes felt I was getting a little lost! Then I started going to some talks which were more within my field of expertise. It felt nice to contribute to a discussion and feel like I understood what was going on. On reflection I think a mix of all aspects might be good, learn something new, and boost your confidence with talks from your more knowledgeable areas.\n\nThe thing about MeasureCamp is you almost instantly feel like you are surrounded by your people, and it's that comfortable feeling that makes participation feel encouraged and supported. Personally, 30 minutes feels a little too daunting for me. Maybe a 15 min problem solving discussion would be great, state your problem, others can come who have experienced a similar thing and you can hash it out together, maybe find a solution, maybe not, but at least you won't feel alone. Opportunities to be surrounded by this many like minded people don't happen very often so we should all take advantage of it. Thanks MeasureCamp for a great event, if I’m lucky enough to get tickets in the future I’ll be back in a heartbeat... Closing thought, you can never have enough pens, stock up!\n\n\nJacob Birch\n\nI was so excited to go to MeasureCamp London 2022 having not attended an in-person analytics event since pre-Covid. Overall, I took away loads of actions to investigate in GA/GTM further and spoke to some great people - it’s a great way to learn and think about areas or processes you didn’t think could fit together (but where someone has created a tool and it's a great idea!), or make some connections so you have some analysts to bounce ideas off in the future.\n\nI attended some great talks throughout my day, and I want to write about the three that stood out to me:\n\nMy morning started off with our very own Liam Grant talking about his journey into the cloud, where he ran through the different Google Cloud Platform (GCP) services; where to start and where to go next. For someone who only uses BigQuery and doesn’t delve into the other tools within the GCP, this was great to see how the tools tie in together and what they can be used for.\n\nLiam split the tools into different stages based on his experience of which tools he utilises the most, and this portrayed a sense of what you could be exploring based on what level of knowledge you have with the GCP.\n\nMy main takeaway from Liam’s talk was that you should approach exploring the GCP one piece at a time. This was a key message for me because I’ve always thought of the GCP as a product where you should be using every tool from the get-go. However, knowing which are relevant and which tie in together (like Data Transfer Service for Google Ads) helps know where to look next as part of my GCP learning journey and what you should start experimenting with!\n\nThe next speaker was Tariq Syed who gave a talk called \"How To Create Your Own Data Monitoring System for your GA4 Data\" where they had produced a tool to monitor changes in your GTM setup, so you could report on how fresh or recently modified parts of your measurement plan were. This is also a great idea for companies who have restricted access to GTM but want some parts to be visible to other members of the team. All you need to do is:\n\n * Setup a unique 'Tag ID' for each tag in your measurement plan and in GTM\n * Setup your measurement plan in BigQuery\n * Setup the GTM API\n * Lookup GTM API changes based on your measurement plan Tag ID\n\nThe result that was showcased is essentially a dashboard where you can select a tag (or category of tags) and show when it was last updated in GTM (this is because the Tag ID is searched from the measurement plan and looked up in the GTM change log). You could also include a summary of how many times it has triggered in the past day to ensure it’s firing.\n\nThe tool itself is still in development but I’m excited to see what Tariq's final product is!\n\nI always look forward to a Phil Pearce presentation, because I always come away with some great tips (which you can vote for the best tips after his session, which is a fun idea!). Phil’s talk \"Top 10 GA4 migration mistakes to avoid\" made me aware of some GA4 setup options that you could easily miss when setting up a GA4 account. I’ve listed my top 4 here:\n\n * Engagement metric: part of the new ‘bounce rate’ is that once a user has been idle on your site for 10 seconds they count as an engagement. You can change this up to 60 seconds, where Phil mentioned that a lot of clients review this as the stage of the setup, so that the data is consistent from the get-go.\n * Link Google Ads! Even if your UA property is linked, you will need to set up a new link to Google Ads. However, ensure that both your UA and GA4 are not creating the same conversions in your Google Ads account as this will double count conversions.\n * If you have a reason for it, change your data retention to 14 months - this only affects the exploration part of the UI, where the aggregated reports will retain aggregated data longer than this.\n * Consider having a dev and live property. GA4 doesn't have the option for views, so building out a separate property for your dev site will avoid test transactions polluting your live…"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/consent-mode-ga4/#article",
      "headline": "What is Consent Mode for GA4?",
      "description": "Consent Mode is used in Google Analytics 4 to model unconsented user data into the reports, but what is it? This guide will explore what Consent Mode is, and how GA4 and GTM utilises it.",
      "url": "https://www.measurelab.co.uk/insights/blog/consent-mode-ga4/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/consent-mode-ga4/#webpage"
      },
      "datePublished": "2022-06-16T14:02:00.000+00:00",
      "dateModified": "2026-01-27T11:24:49.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/analytics-sub_uaga4-1200x400-blog-11.png",
      "author": {
        "@type": "Person",
        "name": "Daniel Perry-Reed",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Google Tag Manager",
        "Privacy",
        "Firebase Analytics",
        "AI & ML",
        "Google Ads"
      ],
      "articleBody": "What is Consent Mode?\n\nConsent Mode is a feature that helps manage what tracking occurs when consent is and is not granted from the user. This feature applies for websites via Google’s global site tag (gatg.js) and Google Tag Manager (GTM), and for apps via the Firebase SDK.\n\nThere are five default types of consent (you can add your own on top as well) that can be managed in Consent Mode:\n\n\n\nConsent TypeDescriptionad_storageEnables storage (such as cookies) related to advertisinganalytics_storageEnables storage (such as cookies) related to analytics e.g. visit durationfunctionality_storageEnables storage that supports the functionality of the website or app e.g. language settingspersonalization_storageEnables storage related to personalization e.g. video recommendationssecurity_storageEnables storage related to security such as authentication functionality, fraud prevention, and other user protection\n\n\n\n\nWhat isn’t Consent Mode?\n\nConsent Mode is not a consent management platform (CMP). That is, it doesn’t collect user consent on a website or app. Consent Mode is only the process of managing tracking based on the collected consent levels. You will need to implement a CMP to do the actual consent collection.\n\nGTM has some out-of-the-box CMP integrations via templates that can be used with relative ease. However, you do not need to use one of these to use Consent Mode effectively. For example, the Measurelab website www.measurelab.co.uk uses CIVIC’s Cookie Control which is not on the list and it works absolutely fine with Consent Mode.\n\n\nHow Consent Mode works with GA4\n\nGenerally speaking, each tracking tag will have some sort of consent dependency. For example, you will need ad_storage to be true to be able to fire the Facebook Pixel. However, Consent Mode works slightly differently when it comes to the Google tags (Google Analytics, Google Ads, Floodlights).\n\nFor Google Analytics 4 (GA4), it will actually track all the events with or without consent. There are a few variations of consent as GA4 utilises both the analytics_storage (for the core tracking) and ad_storage (for Google Signals) consent. Depending on what the user consents to, depends on what is collected in GA4. The below table details what happens in each situation:\n\n\n\nanalytics_storagead_storageGA4 trackingtruetrueThe 1P _ga cookie is set and read.\nAll events are tracked including a Client ID and Session ID.\nGoogle Signals data is collected.truefalseThe 1P _ga cookie is set and read.\nAll events are tracked including a Client ID and Session ID.\nGoogle Signals data is not collected.falsetrueThe 1P _ga cookie is not set or read.\nAll events are tracked without a Client ID or Session ID.\nGoogle Signals data is collected.falsefalseThe 1P _ga cookie is not set or read.\nAll events are tracked without a Client ID or Session ID.\nGoogle Signals data is not collected.\n\n\n\n\nGA4 data modelling\n\nThe reason GA4 still tracks all events even without consent (called 'cookieless pings') is so that it can use machine learning models to estimate the number of unconsented users, sessions, etc. in the data. This process is called behavioural modelling for Consent Mode and is available for all GA4 properties now.\n\nAssuming you have met the prerequisites in data volume, then you will be able to use the ‘Blended’ reporting identity in GA4, which is set under Admin > Reporting Identity.\n\nYou will then see the modelled data in all available reports when using GA4. You can see if any specific report is using modelled data by clicking on the report status icon:\n\n\nOpting out of cookieless pings (GTM)\n\nSome companies might not agree with Google’s cookieless pings and want to prevent them from happening altogether. In a sense, make sure that no consent means no track of any sort.\n\nIn GTM this is relatively simple to do. First you may have to enable the consent overview in Admin > Container Settings > Additional Settings:\n\nThen you should see a new ‘Consent Settings (BETA)’ section under the ‘Advanced Settings’ in any tag configuration.\n\nIn there, for the GA4 tags you have, you can select ‘Require additional consent for tag to fire’ and specify the consent type you want to ensure you have. For GA4, this is most likely to be the analytics_storage consent.\n\nOnce saved and published, all the GA4 tags will now behave the same as the non-Google tags in that nothing will be tracked until you have the user’s consent.\n\nNote: By doing this, you will never be able to use the behavioural modelling in GA4!\n\n\nDo I need to use Consent Mode?\n\nNo, but it will save you all the time and effort of manually triggering tracking based on consent statuses from your CMP.\n\nIn GTM, you can manage variables and triggers for each consent type by creating trigger groups to include consent and dynamically fire each tag. However, Consent Mode makes all of this much easier, and you can manage, change and update consent requirement in bulk without the need of trigger groups!\n\nIf you are using a CMP (and who isn’t nowadays), then Consent Mode is a valuable tool and asset to making sure it is ‘plumbed in’ effectively to all your marketing and analytics tracking and data collection."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/ga4-event-types-guide/#article",
      "headline": "GA4 event types guide",
      "description": "There are a lot of different types of events in Google Analytics 4 that are not obvious when getting started. This guide details all the different event types and where and when they should be used.",
      "url": "https://www.measurelab.co.uk/insights/blog/ga4-event-types-guide/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/ga4-event-types-guide/#webpage"
      },
      "datePublished": "2022-06-15T08:16:00.000+00:00",
      "dateModified": "2026-01-27T11:24:50.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/analytics-sub_uaga4-1200x400-blog-12.png",
      "author": {
        "@type": "Person",
        "name": "Daniel Perry-Reed",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Data Analysis",
        "Google Analytics",
        "Google Tag Manager",
        "BigQuery",
        "Debugging",
        "Testing",
        "Ecommerce",
        "How-to"
      ],
      "articleBody": "First things first, let's start by defining exactly what an event is in Google Analytics 4 (GA4). An event is how GA4 collects data, all data. This is unlike Universal Analytics (UA) as even things like Sessions (session_start) and Page Views (page_view) are tracked as events.\n\nHowever, not all events in GA4 are created equally. There are several different types of events to be aware of when implementing GA4 for your apps and/or websites.\n\nAlthough all of these event types are essential to understand if you're setting up and managing your GA4 implementation, all events are reported in exactly the same way. The average end user pulling data from GA4 will not know (or probably care) about how it's collected, and what we call the types of events!\n\nThe event types are:\n\n * Enhanced Measurement\n * Automatically collected\n * Recommended\n * Custom\n * Customised\n * Audience trigger\n\n\nEnhanced Measurement events\n\nEnhanced Measurement are most likely the first types of events that you will see in GA4. They are the 'out-of-the-box' events that come as standard when implementing the configuration tag on your website. These events include:\n\n * page_view – every time a page is loaded\n * scroll – when 90% of the page is visible\n * click – when a hyperlink was clicked that is not to your own domain (i.e. an outbound link)\n * view_search_results – when the search results page is viewed\n * video_start – an embedded YouTube video starts playing\n * video_progress – an embedded YouTube video is watched to 10%, 25%, 50% and 75% completion\n * video_complete – an embedded YouTube video ends\n * file_download – when a hyperlink is clicked with a file extension (i.e. it is downloaded or opened)\n\nYou can see what Enhanced Measurement events are enabled under Admin > Data Streams, then select a Web Data Stream. You can also turn each one off inside this settings panel, except for the page_view event which is mandatory.\n\nNote: These events only apply to web Data Streams, not Android or iOS apps.\n\nNote: These events may not work on every website. Like any standardised implementation, it may work on 90% of sites, but not all. Make sure to test each one once you have deployed the configuration tag!\n\nSome of the Enhanced Measurement events have some additional configuration settings which are detailed below.\n\npage_view\n\nThe page_view event will always be triggered on page load, but can also optionally be triggered on browser history events. Useful in cases when the page content loads after the original page load (i.e. for single-page applications).\n\nThis is on by default, which we have seen causes issues in some cases. If it's interfering with the regular page view tracking, turn this setting off and see if that fixes things.\n\nview_search_results\n\nSite search tracking is a UA feature that GA4 has replicated in exactly the same way. GA4 looks for a URL query string parameter that matches one of the parameters in the list. If it finds a parameter that matches, GA4 assumes a search has occurred and this is the search results page.\n\nThese parameters it looks for are detailed in the advanced settings for the view_search_results event. There are default parameters it looks for in the list, and you can also add custom parameters if your site search uses different ones too.\n\nNote: If you have multiple types of search that can be performed on the site (i.e. product search, FAQ search, etc.), then all will be tracked using the same event. In this case, you might just wont to chose one to track, or even turn this Enhanced Measurement even off completely and implement custom events.\n\n\nAutomatically collected events\n\nAs the name suggests, these events are collected automatically. A subset of these are technically the Enhanced Measurement events, but are generally considered separate within the industry - mainly as these events cannot be disabled. The automatically collected events are:\n\n * first_visit*\n * session_start*\n * user_engagement\n * in_app_purchase\n * app_remove\n * notification_receive\n * etc.\n\nNote: Some of these events are specific to web, Android and/or iOS Data Streams.\n\n*The session_start and first_visit events are not independent events (you won’t see them when testing or debugging). They are actually calculated off of the back of other events (typically the page_view event) by the inclusion of the _fv (for first visit) and _ss (for session start) parameters:\n\n(^ I use the Chrome extension Adswerve – dataLayer Inspector+ if you were curious why it the Console looks like this.)\n\nNote: Any custom event parameters you apply to the GA4 configuration tag (in GTM or gtag.js) will not apply to these two events. Hopefully they'll fix/update this down the line...\n\n\nRecommended events\n\nWhen it comes to adding in your own event tracking on top of the 'out-of-the-box' events, Google has a reference list of Recommended events names for common use cases. A good example is for ecommerce event tracking (as there is no Enhanced Ecommerce in GA4!).\n\nFor example, if you wanted to see transactions and revenue in the GA4 reports, you will have to use the exact event name and event parameter naming convention for the purchase event. Otherwise, the conversions and revenue metrics will not be populated in the data, although you will still be able to report on the count of events as you would expect.\n\n\nCustom events\n\nIf you need to track something that does not fit into the list of Recommended events, you can use Custom events. They are implemented the same way as all the other events in GTM or gtag.js, but you get to pick whatever even name and event parameter naming conventions you require.\n\nThe drawback of these events is that Google will never be able to utilise them in standard reports, templates or models, but you will be able to use them in any report in the same way. They are also exported to BigQuery.\n\nBelow is a useful flow chart to help decide what type of event to use:\n\n\nCustomised events\n\nCustomised events is the generic name given when events are created within the GA4 interface. You can access all of the existing (and add new) customised events in Configure > Events > Create event.\n\nThese events are very useful when needing to mark a subset of an existing event as a conversion (see an example of this in a previous post).\n\nA big benefit of customised events is that they can be added and removed at any time, without needed to change or update the implementation on the apps or websites. Especially useful for apps where any tagging changes require a new app version to be published to the app/play store.\n\nNote: You can create up to 50 customised events at any one time per Data Stream.\n\n\nAudience trigger events\n\nAudience trigger events have a great deal of potential in what they can achieve!\n\nThis is the name given when logging an event when a user enters an Audience. Regardless how you define the criteria in the Audience membership logic.\n\nYou can set the event name to whatever you like, the same as custom and customised events.\n\nThe true potential of this type of event is when you start defining complex or predictive Audiences that would be impossible for anyone setting up tags using GTM, gtag.gs or the SDKs. For example, defining multiple layers of activity and inactivity within a specific timeframe."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/measuring-offline-marketing/#article",
      "headline": "Measuring offline marketing efforts with Google Analytics",
      "description": "Tracking digital marketing campaigns in Google Analytics is easy - in theory at least. Can the efficacy of offline campaigns be measured in GA? The short answer is yes, but proceed with caution.",
      "url": "https://www.measurelab.co.uk/insights/blog/measuring-offline-marketing/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/measuring-offline-marketing/#webpage"
      },
      "datePublished": "2022-05-31T12:50:10.000+00:00",
      "dateModified": "2026-01-27T11:24:50.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/ml_1200x628-multi-channel.png",
      "author": {
        "@type": "Person",
        "name": "Dara Fitzgerald",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Data Analysis",
        "Google Analytics",
        "Marketing",
        "Google Ads"
      ],
      "articleBody": "It's relatively easy to track online marketing campaigns, but what about offline marketing channels like TV and radio, print and outdoor ads, catalogues and direct mail or point of sale promotions? Most companies still run campaigns in the \"real world\" and want to know: can the efficacy of these efforts be tracked using Google Analytics?\n\nThe short answer is yes, with one elephant-sized caveat: for Google Analytics to be a useful tracking tool, the target audience for your offline marketing campaign has to end up on your website. As far as GA is concerned, any activity that didn't take place on the website (or app) didn't happen at all. With that inconvenient truth out of the way, let’s talk about some of the ways you might choose to track your offline campaigns in GA - and the risks inherent in doing so.\n\n\nCreating custom URLs\n\nWhen you point people to a website from an online ad, you simply include UTM parameters in the URL and you're able to collect granular information about your source, medium, campaign, content, and term. (Simple in theory, but not always in practice for social promotions and rogue marketers). You can use a similar method in offline media if your goal is to drive people to your website.\n\nThe easiest way is to create a custom or \"vanity\" URL to track offline marketing activities separately from other campaigns. For example, we might create the vanity URL, measurelab.co.uk/radio, and our radio ads running on Analytics FM would point listeners there to access a discount or special deal. The vanity URL would redirect to a page with the complete URL structure, including a UTM parameter like utm_medium=radio so we knew visitors had arrived as a result of our radio campaign.\n\nOne problem you might encounter with this approach is the Campaign Timeout in Google Analytics, which is set to six months by default. Any subsequent direct visit to the website would be reattributed back to the radio campaign, so you may see multiple sessions from the same person appearing as having originated from the radio ad, even though they actually only clicked/typed the vanity URL once. (Find out more about the Campaign Timeout in Universal Analytics).\n\nEven then, it remains an inexact science. If someone shares your vanity URL with a friend, or bookmarks it, you may end up with visits that don't come as a direct result of seeing or hearing the ad.\n\n\nSearching for a key word or phrase\n\nAnother problem with using a vanity URL is that people may well forget the vanity URL and search for the brand name instead - in which case the campaign gets no credit. That’s where a unique combination of words is more memorable and useful - think of it more like a promo code or hashtag that makes it clear a website visit could only have come as a result of your marketing.\n\nFor example, if you were given the enviable task of promoting a world-leading analytics consultancy, you could use a unique phrase such as “dazzling data” or \"Hooray for GA!\" to describe your offering. You would then bid on that phrase to ensure you appeared at the top of the search results and direct people to a specific landing page on your website. Just remember to do your research first to make sure your chosen key phrase isn't already \"owned\" or too expensive to bid on. You don't want to be sending free traffic to DazzlingData.com (Yes, they do already exist - curses!)\n\n\n\nMeasuring uplift in direct traffic\n\nAnother tack you can take is to track any changes in direct traffic to your site in Google Analytics. Direct traffic is a count of the website visitors who have not come from other online sources such as search engines, social media, or referring websites. Your website is always getting direct traffic – for example from people who’ve bookmarked the site or who typed the URL directly into the address bar – but it's possible to establish a baseline and attribute any uplift to your offline marketing push.\n\nA TV ad run during a prime time slot will almost certainly result in an immediate spike in direct traffic, organic search, and PPC if you're running paid ads. Pay particular attention to traffic from mobile devices and tablets as people might be dual-screening and search on their phones while they’re half-watching TV.\n\nThe figure won’t be precise. The response curve will flatten out relatively quickly and you can't categorically prove people have seen or heard the campaign, but it’s at least an indication that the campaign is having the desired impact.\n\n\nIsolating increases by geographic region\n\nIf you’re running a localised campaign in a specific region, an uplift in web traffic is even easier to observe. In Google Analytics, you can narrow results down to the whole of Manchester, for example, and look at sessions, events and conversions for that area. You might notice a surge in traffic from Manchester after a TV campaign airs, which indicates the ad was effective.\n\nOf course, you’re not tracking the effect of the offline media, you’re inferring it. As such, the best way to gauge the success of the campaign is to establish a control group. In this case, you'd need to identify another region where the TV ads are not aired to compare against, so you can examine the uplift provided by the campaign over a specific period of time.\n\n\nThe attribution problem with offline marketing\n\nOne problem with attribution when it comes to offline marketing campaigns is the timeframe. How long will it take for the campaign response to take effect, and how long do you continue to attribute traffic to that campaign after it's run?\n\nMost of the means by which you might track or infer offline marketing effectiveness require that you suppress the apparent effectiveness of a digital channel.\n\nEven if a direct visit comes as a result of exposure to a TV campaign, it may still arrive via a digital channel such as SEO or paid search. For example, in the case of the search phrase “dazzling data”, you would still want to know that it was PPC that ultimately brought users to the site, which ad group and execution was responsible, and what the ad spend was.\n\nWhat you don’t want to do is permanently and conclusively attribute any online uplift purely to the offline campaign. For more accurate analysis, it might be worth adding a query parameter like tv=true or offlinemedia=tv so that you can see a particular user likely conducted their search as a result of seeing or hearing an ad.\n\n\nOffline or online? The bottom line\n\nThe huge disclaimer that comes with measuring offline marketing efforts is that you can never know for certain that your offline campaign was responsible for an increase web traffic. The data will never be perfect or exact. As an analyst, all you can look for is the trend and attempt to answer the question, did we see an impact, yes or no?\n\nA good analyst knows the limitations of their data. To proceed with tracking offline marketing using an online tool, you have to accept that these methods are fallible. So while the short answer is yes, you can measure the success of an offline marketing campaign with Google Analytics, the more nuanced reality is that the data will never give you exact numbers, just an indication of effectiveness."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/brightonseo-measurefest-april-2022/#article",
      "headline": "brightonSEO and MeasureFest April 2022: our favourite talks",
      "description": "In April 2022, a few Measurelabbers got together for three days to attend brightonSEO and MeasureFest (an analytics-themed fringe event). After the three days, we all got together to discuss our favourite stand-out talks of the event on The Measure Pod podcast which you can listen to below.",
      "url": "https://www.measurelab.co.uk/insights/blog/brightonseo-measurefest-april-2022/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/brightonseo-measurefest-april-2022/#webpage"
      },
      "datePublished": "2022-05-17T13:15:50.000+00:00",
      "dateModified": "2026-01-29T10:40:00.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/measurelab-kpi_1200x400-blog-2.png",
      "author": {
        "@type": "Person",
        "name": "Daniel Perry-Reed",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Testing",
        "AI & ML"
      ],
      "articleBody": "In April 2022, a few Measurelabbers got together for three days to attend brightonSEO and MeasureFest (an analytics-themed fringe event). After the three days, we all got together to discuss our favourite stand-out talks of the event on The Measure Pod podcast which you can listen to below.\n\n#34 MeasureFest and brightonSEO – April 2022 debrief (with Liam Grant and Matthew Hooson)#34 MeasureFest and brightonSEO – April 2022 debrief (with Liam Grant and Matthew Hooson)Play EpisodePause Episode\n\nMute/Unmute EpisodeRewind 10 Seconds1xFast Forward 30 seconds00:00/34:04SubscribeShareAmazonApple PodcastsCastBoxCastroDeezerGoogle PodcastsOvercastPlayer.fmPocketCastsPodbeanPodcast RepublicPodchaserRSSRadio PublicSpotifyStitcherTuneInYouTubeRSS FeedShareLinkEmbed\n\nThis post is a more detailed and considered review of each of our favourite picks from the event.\n\n\nAutomate the technical SEO stuff\n\nTalk by Michael Van Den Reym from IO.\n\nChosen and written by Matthew Hooson.\n\nWhile not aimed squarely at someone in my line of work, the recent brightonSEO conference did offer up a few gems. One of those gems, a talk by Michael Van Den Reym, reignited in me a hatred for repetition and inspired me to work on my own project which I will detail in another blog in the near future. The title and content of Michael’s talk “Automate the technical SEO stuff” were inspired by the famous book on automation “Automate the boring stuff with python” which is available for free right here.\n\nSo what kinds of tasks are crying out for some sort of automation? Simply put, repetitive well defined tasks are the perfect candidates. These are the kinds of efforts programmatic approaches are fantastic at and they are also the kinds of problems that gobble up most of our time and bore us to tears. Michael argues that by removing these low cognitive tasks from our workload, we free ourselves up for more complex problem solving and creative thinking. We can think of it as making ourselves superhuman. By augmenting our workflow with automation, we become much more efficient in all aspects of our day-to-day work.\n\nA couple of projects Michael detailed in his talk stood out to me as examples of how powerful automation can be. Firstly, Michael used Robotic Process Automation (RPA) and some interesting python libraries to update meta descriptions on specified pages. He used selenium, a popular web driver tool used for web UI automation, to visit URLs defined in a list, log into the page, and update meta descriptions. In another example, Michael used screaming frog, the page speed insights API, and a python library called pillow to create a list of pages that contained oversized images. His script then automatically resizes them to remove any wasted bytes and replace the images on the site with the newly resized copies. He was then able to demonstrate, with data, how much this automation project had improved page speeds and even how these improvements had led to a gigantic leap in page impressions.\n\nAs I mentioned earlier, I do not work in SEO, but it does not take much to imagine the kinds of tasks and improvements that could be made to anyone's workflow. Our brains are too good at problem-solving and creative thinking to be tasked with trudging through the repetitive and mundane.  So go forth and automate!\n\n\nLessons from hundreds of SEO A/B tests\n\nTalk by Will Critchlow from SearchPilot.\n\nChosen and written by Daniel Perry-Reed.\n\nI went into this talk thinking that I knew what A/B tests are, and that I had a good grasp on A/B testing practices in general.  That's what drew me to this talk in the first place. I was wrong, this talk was on SEO A/B testing, not CRO A/B testing - very different in fact!\n\nFirstly, this talk was great, and Will is a great presenter. He explained complex things easily and in a way everyone could engage with and follow.\n\nThe key point I took away from this talk was that the main difference between SEO and CRO A/B testing is that SEO testing is all about widening the top of the funnel, whereas CRO testing is about widening the bottom of the funnel.\n\nI pulled the image above from the deck Will presented. The full deck goes through a number of great examples as well as a few 'who wants to be a millionaire?' style questions that were fun. I think I got one of the three right in all honesty.\n\nThe last interesting part of the talk that I will mention was that an interesting result he found when testing reordering the HTML code of a page that didn't change anything visual at all (slide 40 of his deck if you're interested). They noticed an improvement on the SERPs (search engine results pages) even though the page was exactly the same to the naked eye.\n\nA theory is that Google and the other search engines are rewarding well maintained pages. So any change to a page, even if not visual, is a signal that you're keeping it fresh and updated in some way. That's the idea at least.\n\n\nStat packages: the secret recipe to getting SEO implemented\n\nTalk by Harry Sumner from iCrossing.\n\nChosen and written by Liam Grant.\n\nAt the start of April 2022, a small contingent of Measurelabbers attended MeasureFest, the more analytics heavy conference, at which Daniel Perry Reed talked on the Google Analytics Multiverse and the shift to Google Analytics 4, a great presentation on both the history and the future of the Google Analytics stack as well as a selection of great talks throughout the day and a diverse Q+A period to cap off the well ran event.\n\nWe all stuck around for the Main event brightonSEO in search of any talks that were inspirational, and Harry Sumner’s talk Stat packages: the secret recipe to getting SEO implemented was to me a real stand out. A combination of how best to leverage machine learning models, how to gain confidence with ML practices and to me was a real show of how to start to implement machine learning and deep learning into your business.\n\nOne of the biggest challenges with machine learning is showing value to clients or internal stakeholders. By using machine learning instead as a device to already show impact or drive already established business needs (such as forecasting), you can show the power of machine learning within a more easier to understand business context.\n\nMeta’s Prophet is a forecasting procedure that leverages a trained neural net that is especially good at looking at time series that have strong seasonal effects. Luckily for us working in analytics, forecasting is an understandable topic, and makes a great jumping in point to using statistical packages.\n\nThe simplistic approach to using Prophet means that we can already start building robust forecasting models with a couple simple lines of Python. Within a couple of minutes, and a clean CSV, you can have your yearly forecasting done and probably better than what most can do in Excel!\n\nThe other mentioned pack was CausalImpact from Google - originally an R package, and also turned into a Python package too. CasualImpact is used to “estimate the causal effect of a designed intervention on a time series”. Any changes can then be reviewed to see if they caused statistical impact to a key metric. In essence, this allows us to change that gut feeling or the small peaks that could indicate positive or negative change to a statistically significant figure, and be able to back up our changes with data. This of course is especially useful for SEO, but could be leveraged in any changes to a website or app.\n\nBoth of the packages are easy to start and are supported with great documentation that allows nearly out-of-the-box usage with simply understanding a small amount of Python. And Harry’s talk certainly got the cogs turning in my head!\n\n\nHow they teach you to be creative at Google\n\nTalk by Max Hoppy from Bind.\n\nChosen and written by Dara Fitzgerald.\n\nI knew the others from Measurelab would get more from the technical talks so my pick was about creativity and it was presented by Max Hoppy from Bind: The title of his talk was How they teach you to be creative at Google and as the name suggests this was about Max’s time working at Google and specifically about a creativity workshop he attended there. Simplicity can too often be seen as a negative, with the misbelief that complex is naturally superior. What I liked most about Max’s presentation was that the key takeaways were all things you feel are obvious once you hear them. But something being obvious doesn’t guarantee it makes it into our daily behaviour.\n\nTakeaway #1: Environment is fundamental to creativity. Max kicked things off with the results from a survey that asked people where they have their most creative thoughts. Top of the list was exercise, and I can certainly relate to this. I often go for a run in the middle of the working day and this allows me to work through problems and consider different angles. By the time I’m back home and at my desk again, I feel more relaxed, focussed and have better clarity of thought. The point here is about breaking out of a rut if you’re stuck on something. Take a break from it and get a change of scenery. This seems so obvious but how often do we keep trying to force a solution in the moment, rather than simply stepping away and getting some perspective?\n\nTakeaway #2: Environment is not enough. We also need stimulus. To find this stimulus, Max suggested we use the 3 Rs.\n\n * Related worlds: Very few problems are truly unique and looking to other industries, domains, disciplines, etc. can be hugely insightful. His example was Speedo basing new swimwear technology on the biology of shark skin. Not your everyday example but the point is someone/something probably has a transferable solution already out there so look outside your own bubble.\n * Revolution: List out all the rules that exist around the problem you’re facing. Then pick just one and break it. His example was KPMG making their office receptions stand out more from the other big consulting firms by laying out copies…"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/stadia-session-days-data-studio/#article",
      "headline": "Calculating Session Days in Google Data Studio",
      "description": "Google's game streaming service Stadia introduced the concept of Session Days, something we can use in the digital analytics world too using Data Studio and Google Analytics 4.",
      "url": "https://www.measurelab.co.uk/insights/blog/stadia-session-days-data-studio/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/stadia-session-days-data-studio/#webpage"
      },
      "datePublished": "2022-05-09T10:56:25.000+00:00",
      "dateModified": "2026-01-27T11:24:53.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/analytics-sub_sheets-1200x400-blog-4.png",
      "author": {
        "@type": "Person",
        "name": "Daniel Perry-Reed",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Data Analysis",
        "How-to",
        "Google Analytics",
        "Looker Studio",
        "BigQuery",
        "Privacy"
      ],
      "articleBody": "What is a Session Day?\n\nI’ve been a gamer for as long as I can remember, and a fan of Google's Stadia service from day one (@dpezrez if you fancy a game!). Although this post is not about Stadia itself, or Google's less-than-ideal promotion of the service, even though it it does work great assuming you have a stable internet connection. Stadia introduced this KPI called Session Days which they have started paying game publishers on.\n\n…we’re giving 70% of monthly program revenue back to participating partners. Earnings are based on player engagement and measured by “session days”.\n\nSession Days are defined as the number of (unique) days a player has played a game. That is, if someone plays a total of two hours across five gaming sessions, but all in one day, it'll be counted as one Session Day.\n\nI think this is a good metric that we can adopt in the digital analytics world. Especially in Google Analytics where we can define it as the number of days a user has visited your website or app. Then maybe, just maybe, Average Session Days could be a KPI - if it is important enough that is...\n\n\nWhat's wrong with Sessions?\n\nSessions has long been a metric that has caused much debate in the analytics industry - mainly over it's relevance in a hyper-connected world. And something I discussed with Dara on The Measure Pod in episode #2 which you can listen to below.\n\nThe takeaways from the chat for why I think Sessions is dead are:\n\n 1. The definition is too rigid/basic. We’ve got one definition of how to assess a Session across all pages of websites and screens on apps – 30 minutes of inactivity. Yes, I know you can change these in GA, but generally, people leave defaults as is.\n 2. It’s just too old fashioned, defined in the pre-smartphone and pre-mobile era. Few people nowadays sit down to have a session on a website. It's a web-based metric defined 20 years ago that we’ve tried to keep relevant as the devices and browsing habits have changed.\n 3. Browser technology has evolved and is now harder to keep cookies across the lifetime of a user. Things like Apple’s ITP setting cookie expiry to 24 hours in some instances.\n\nThis is where I believe Session Days can be more meaningful than Sessions. It gets around common issues with Sessions, such as spending more than 30 minutes on a page then triggering a new Session when going to the next page, even if the user has been constantly engaged the whole time. Or if a user opens a website on their phone with no intention of browsing then, but as a reminder of sorts so that they can browse properly later (or is that just me?).\n\n\nGetting Session Days in Data Studio\n\nAs we can't get natively in GA4 itself, Google Data Studio is the route I rent down. Of course you can use the BigQuery export and SQL to calculate it, but that's for another time. In this example, I've used GA4’s Data API via the built-in Data Studio data source.\n\nStart by connecting your GA4 property to the Data Studio report, then add in a new ‘Extract Data’ data source including:\n\n * Date\n * Total Users\n * Active Users (optional)\n * New Users (optional)\n\nAnd set it to automatically update some time early in the morning daily.\n\nIn my example, I have set the date range to pull in the last 90 days, but you can configure whatever range you need. I have included all three user metrics GA4 has (Total, Active and New) for comparison, but just pick total or active users is all you really need.\n\nNote: Rename the metric(s) to use the name \"Session Days\" in some way at this step to save time later on when using the data in the charts.\n\nBear in mind that Session Days only works as an aggregated metric. For example, if you plot Session Days by date, you will get the same as plotting users by date:\n\nBelow is a few examples using variations of the Session Days metrics. For this website I am reporting on, the difference between 'active' and 'total' users was insignificant, but yours may not be.\n\n\nUsing Session Days\n\nNow that the Extract Data data source is set up, Session Days will be available in all your charts and data controls in the dashboard. You can use this new metric(s) alongside the existing GA4 data source data – and even blend them together to plot in a single chart.\n\nNote: The limitation of the Extract Data source will be the date range. For example, you can see below that if I specify a year on year comparison in a scorecard, It will show that there is no data as we only defined 90 days in the data source configuration:"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/data-studio-screen-orientation/#article",
      "headline": "Screen orientation calculation in Google Data Studio",
      "description": "Here's a Data Studio CASE formula to work out the screen orientation (portrait or landscape) from the resolution.",
      "url": "https://www.measurelab.co.uk/insights/blog/data-studio-screen-orientation/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/data-studio-screen-orientation/#webpage"
      },
      "datePublished": "2022-05-06T13:38:59.000+00:00",
      "dateModified": "2025-07-31T20:35:55.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/analytics-sub_sheets-1200x400-blog-5.png",
      "author": {
        "@type": "Person",
        "name": "Daniel Perry-Reed",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Looker Studio",
        "Data Analysis"
      ],
      "articleBody": "If you're just here for the screen orientation CASE formula to use in Google Data Studio, here it is:\n\nCASE \n    WHEN CAST(REGEXP_REPLACE(Screen Resolution, 'x.*', '') AS NUMBER)<CAST(REGEXP_REPLACE(Screen Resolution, '.*x', '') AS NUMBER) THEN \"Portrait\"\n    ELSE \"Landscape\"\nEND\n\nDigging into it a bit further, the way tis works is that it takes the bit before the ‘x’ of the Screen Resolution dimension (the x-axis), and sees if it’s smaller than the bit after the ‘x’ (the y-axis). So if the x-axis is less than the y-axis the screen orientation is portrait, otherwise it’s landscape.\n\nI’m using the Universal Analytics dimension 'Screen Resolution' in this example, but you can swap out that for any other reference you have, as long as it has the same format of ‘AxB’ - i.e. 900x800. You can even swap out the 'x' if there is another delimiter in your data. This screen orientation calculation is agnostic and easily changed to fit whatever your data looks like.\n\nIn Data Studio, you can add this in the data source itself, or as a custom calculation in any chart as such:\n\nUsing this newly created dimension, you can use them in charts to break down any data into landscape and portrait.\n\nIt's also useful in tables where you can use it as a filter to give the viewer a different way to view device data. For example:\n\nA small improvement on the formula at the top of this post is below where it accounts for square resolutions too! Not that it occurs frequently to be honest, but it's all about being precise.\n\nCASE \n    WHEN CAST(REGEXP_REPLACE(Screen Resolution, 'x.*', '') AS NUMBER)<CAST(REGEXP_REPLACE(Screen Resolution, '.*x', '') AS NUMBER) THEN \"Portrait\"\n    WHEN CAST(REGEXP_REPLACE(Screen Resolution, 'x.*', '') AS NUMBER)>CAST(REGEXP_REPLACE(Screen Resolution, '.*x', '') AS NUMBER) THEN \"Landscape\"\n    ELSE \"Square\"\nEND\n\nThey do exist though:\n\nWe cover this example and lots of others in our Data Studio Kickstarter training course. If you'd like to book in the training for your team, or have any questions about it, please get in touch."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/ga4-scroll-depth-conversions/#article",
      "headline": "How to track scroll depth conversions in GA4",
      "description": "Learn how to track scroll depth conversion on specific pages in GA4 without coding or tagging in Google Tag Manager.",
      "url": "https://www.measurelab.co.uk/insights/blog/ga4-scroll-depth-conversions/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/ga4-scroll-depth-conversions/#webpage"
      },
      "datePublished": "2022-04-29T08:35:08.000+00:00",
      "dateModified": "2025-07-31T20:35:56.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/analytics-sub_big-query-1600x900-1.png",
      "author": {
        "@type": "Person",
        "name": "Daniel Perry-Reed",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Google Tag Manager",
        "Testing",
        "Wordpress",
        "Google Ads"
      ],
      "articleBody": "Sometimes you cannot use Google Tag Manager (GTM) to log additional events on your website for any number of reasons. For example, you might not use GTM in the first place, or you might not have access. Luckily, Google Analytics 4 (GA4) has a new feature that enables us to create new events off of the back of existing events, all from inside GA4 itself.\n\nA good application I have recently used this new feature on is where I wanted to measure some form of content consumption on this blog. Reporting purely on total page views and engagement time doesn’t always tell me enough. I have no idea if the browser tab is even visible in the user's browser or even if the content was read, just that the blog page was loaded.\n\nWithin the automatically collected Enhanced Measurement events, one of them is called ‘scroll’ which tracks scroll depth at 90% on all pages. The issue with this however is that it fires on all pages. If I want to measure this as a conversion, I need this to only fire on the pages I want it to – blog pages in my example.\n\nLuckily (again) GA4 has a feature we can use that allows us to create an event from existing events. There are two ways to get to the event creation screen, one is to go Configure > Events > Create event:\n\nAnd the other is to go Admin > Data Streams > (select a Data Stream) > More Tagging Settings > Create events:\n\nEither way, you get to a screen where you can add new rules. Click Create and the config panel pops out:\n\nSo what I needed to do is look for the ‘scroll’ event and make a copy of that when it’s seen on a blog page. I’ll call this event ‘blog_scroll’, and look for a pattern in the page_location parameter. For my WordPress website, I went for page_location contains (ignore case) “/2022/”.\n\nIt’s not very future-proofed, I know. I hope they roll out regex support soon so that I can use something like \".*\\/202[0-9]\\/.*\" or similar.\n\nAfter you click save, you should see it come through the real time reports after a few minutes, and then into the standard events reports the following day:\n\nI marked this event as a conversion, so that I can see the attribution data in the Advertising workspace, and I could optimise any Google Ads campaigns or Google Optimize AB tests to it.\n\nSo there you have it, this is how you can set up a new event in GA4 without needing to use GTM or any custom code deployed to the site. You can use this method to create any event – not just for blog page scrolls like I have done in this example. You just need an existing event that you can use to trigger your new one."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/ga-campaign-timeout-definition/#article",
      "headline": "Defining the Campaign Timeout in Universal Analytics",
      "description": "The Campaign Timeout setting in Universal Analytics is hard to understand, and often misunderstood. Here we explain what it is and how it effects pretty much all of your data in GA.",
      "url": "https://www.measurelab.co.uk/insights/blog/ga-campaign-timeout-definition/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/ga-campaign-timeout-definition/#webpage"
      },
      "datePublished": "2022-04-28T15:25:08.000+00:00",
      "dateModified": "2025-07-31T20:35:56.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/analytics-sub_data-mod-1600x900-1.png",
      "author": {
        "@type": "Person",
        "name": "Daniel Perry-Reed",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Google Tag Manager",
        "Privacy",
        "Server-side Tagging",
        "Marketing",
        "Google Ads",
        "How-to"
      ],
      "articleBody": "I've been running Google Analytics training since 2016, and every time without fail I am met with puzzled faces when it comes to explaining the Campaign Timeout setting in Universal Analytics (UA).\n\nIt doesn’t matter if you are new to GA or have been using it for years, most people are generally unaware that it actually exists. And if they are, they generally don't realise the extent it effects the campaign data they when pulling reports from GA.\n\n\nWhat is it?\n\nStarting with where it is, you can find the setting in the property setting list for any UA property under Admin > Tracking Info > Session Settings:\n\nThe default timeout window is set to 6 months, but this is configurable to anyone who has admin access.\n\nNow for what it is, it is a method to artificially reduce the attributed credit that the channel Direct receives, and to give that credit to the other non-Direct channels.\n\nYes, it means that the count of Sessions by channel (medium, source, campaign, etc.) is not actually the number of times someone uses that channel to reach your website. This is why you generally see more Sessions in GA than Clicks in any of your ad platforms when validating them against each other – even between Google Ads. This means that a single link click can lead to many Sessions in GA.\n\n\nHow it works\n\nThe mechanics of how it works is relatively simple, albeit hard to grasp at first. The first and most important thing to remember is that the Campaign Timeout only effects Direct sessions (check out this article to see how GA defines Direct).\n\nWhen a Direct session is seen, GA then looks back in that user’s session history up the length of the Campaign Timeout (i.e. 6 months by default) until it finds a non-Direct session. If it finds a non-Direct session, then it copies the medium, source, campaign, etc. If no non-Direct session is found, or it is the first session for that user, then Direct is kept as the session’s channel.\n\n\nWhy?\n\nI don’t think anyone knows exactly. What we have to remember is that Google purchased Urchin Analytics back in 2004/5 to measure AdWords (Google Ads) campaigns more effectively. It's a marketing tool at heart.\n\nThe Campaign Timeout effectively up weights tracked marketing campaigns in GA, which includes Google Ads through their auto-tagging feature when you link the two platforms.\n\nThe other idea is that, from a marketer’s perspective, you can always invest more time, money, people, etc. into any non-Direct channel, but you can’t invest more into Direct. So attributing back to a channel you can action is something that may be more useful and actionable.\n\nI suppose you can argue that word-of-mouth and offline marketing contribute to an increase in Direct traffic, and measuring Direct is a good indicator of brand awareness (etc., etc.), and I would tend to agree with you!\n\nWhatever your thoughts and views on the Campaign Timeout are, it’s there and it's most likely always been there affecting your data – your channel baselines, benchmarks, targets, etc. may already be based on the artificially up weighted data. Removing it (which you can do of course) would mess with all of this, and as it doesn’t backdate, will basically mean drawing a ‘line in the sand’ when it comes to reporting. It’ll be apples and oranges so you shouldn’t compare to the historical data.\n\n\nNow what?\n\nWe do have the Direct Session dimension that you can add to any session-level report to see if the session was actually Direct or not. The best place to see this is in the Acquisition > All traffic > Channels report, and add ‘Direct Session’ as a secondary dimension:\n\nIn the example above, you can see that 406,237 out of 586,805 Organic Search Sessions were actually Direct that were reattributed to Organic Search via the Campaign Timeout, that’s about 69%!\n\nAnnoyingly the 'Direct Session' dimension is not available in the Reporting API v4, just the UI. So its usefulness is limited to manual reporting and analysis within GA for now. And with Google Analytics 4 (GA4) now getting all the time and attention from the team at Google, I don’t have high hopes for it ever being added to the API to be honest, not now all eyes (and devs) are on Google Analytics 4...\n\n\nSafari, cookies, and whatnot\n\nIf you’ve read this far, thanks, now to talk about cookies!\n\nI’ll keep this part specifically around Safari as they have a 19-23% browser market share (Chrome has 52-65%) as of October 2021. But this also applies to Firefox and other browsers too.\n\nWhen Apple released Intelligent Tracking Prevention (ITP) 2.1 in April 2019, it came with a cap on how long some 1st party cookies can be set for. Cookies such as GA’s _ga cookie could only be kept in the browser for a maximum of 7 days.\n\nThat is, if a person visits a site and then again 8 days later, that person would be tracked as two users in GA. This does not happen in Chrome.\n\nThis is an issue for all types of attribution, but especially for the Campaign Timeout as it’s harder to find any non-Direct sessions in the user’s session history if the historic sessions are tracked against a different user (and cookie).\n\nFrom this, we started seeing that Safari traffic has a much higher proportion of Direct sessions compared to other browsers such as Chrome.\n\nAbove is actual data pulled from GA covering all of February 2022 for a travel website that has the default 6-month Campaign Timeout in place.\n\nThere is no way around ITP unless you look to move your tracking to the server (i.e. using server-side GTM), and setting the GA 1st party cookie via HTTP headers. Feel free to get in touch if you'd like to chat about how to do that!\n\nI hope this helps with your understanding of how this odd and sometimes annoying feature works, and how it affects pretty much all the data you see in GA."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/adobe-analytics-google-analytics-parallel/#article",
      "headline": "Running Adobe Analytics and Google Analytics in parallel",
      "description": "Why would you run both Adobe Analytics and Google Analytics on your website? Won’t you end up with two parallel running tools reporting different figures?",
      "url": "https://www.measurelab.co.uk/insights/blog/adobe-analytics-google-analytics-parallel/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/adobe-analytics-google-analytics-parallel/#webpage"
      },
      "datePublished": "2022-03-29T13:51:00.000+00:00",
      "dateModified": "2026-01-27T11:24:56.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/ml_ga-aa-blog_li-1200x628-1.png",
      "author": {
        "@type": "Person",
        "name": "Nick Roberts",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Marketing",
        "Google Ads"
      ],
      "articleBody": "A frequently asked question when it comes to Adobe Analytics and Google Analytics is, why would you run the two different analytics tools in parallel? Let’s take a look at some of the differences, the strengths and weaknesses, and the target audience for each tool.\n\nIf you have a team of analysts and a dedicated resource to throw at it, Adobe Analytics (AA) is great because it’s an analyst’s tool. You can dig into levels of granularity and set your specific level of customisation more so than with Google Analytics (GA). Most people cut their teeth with GA though because it’s free and it gives you exactly what you want.\n\nGoogle Analytics is an entry-level tool for people who want to come in, see reports, and get an easy view of all of the metrics that they’re used to. Fundamentally though, both tools are web analytics platforms tracking conversions, page views, etc. just with slightly different approaches.\n\n\nAnalysts vs. marketers\n\nA tool like GA sits within their marketing product suite (the Google Marketing Platform) as a marketer's product, while AA is more of an analyst's product. Google Analytics is very accessible and everybody who works either as an analyst or as a marketer has had some experience with GA. Marketing teams usually push for GA because most of the tools that they use are in the Google Marketing Platform, like Google Ads, Display & Video 360 and Search Ads 360.\n\nGoogle Analytics is a no-brainer for the ease of connection and the level of ability in terms of things like attribution. GA is easy to plug and play, and Google favours their own product connections, whereas Adobe requires extra legwork.\n\nIn AA, you can do all the drill-downs and visualisations in one tool, which suits analysts who have the time to dig into the data. It’s not so much about what’s missing in Adobe as a lack of understanding about how to set up the connections. There are a few extra hoops to jump through.\n\n\nWhy are these figures different?\n\nThe problem with working with both GA and AA is that you might end up with two different versions of what should be the same number – two sources of truth in a sense. So, when you’ve got a tool that’s free and an enterprise-level tool, and two figures that say something different – which one is right?\n\nIt’s very difficult to have two tools that are set up in exactly the same way, saying the same thing. That would be the ideal, but it’s never going to happen. Whether it’s Adobe, Google, or any other platform, you’re always going to have slight nuances or variations.\n\nGoogle is so dominant in the industry that people just assume it’s right, but human error does come into play – GA can be set up in a way to be wrong. Data very rarely lies, but it can tell a different story depending on the implementation and the specific metrics you’re using. There could be an underlying tracking issue, and only after an audit do you realise that you’ve been reporting on the wrong metrics.\n\n\nThe Google halo effect\n\nThis is the idea that Google is always right, or that it can’t be wrong. The perception is often, because it’s free, why not run it alongside another tool? You might be validating the session numbers across various different analytics product, but it’s hard to entertain the idea that GA might be wrong when the numbers don’t match.\n\nAt the end of the day, GA is a product owned by Google, who have a vested interest in making media look performative. Things like the Campaign Timeout in Universal Analytics have helped them do so. We have to be cognisant of the fact that Google (like any other ad platform) will want their own products to look good. Whether you go into Facebook Ads or Google Ads, they pick attribution models that favour their own ads - as you would expect.\n\n\nMirroring like-for-like\n\nWeb analytics tools are not accounting tools. Analytics tools are more for trend observation, and for observing those trends over time and seeing how your changes affect things. The numbers are probably going to be wrong (because of so many different factors), but it’s more about being able to spot the trends.\n\nSo, can these two tools run happily in parallel? You can run them both in tandem with strong governance in place and if the connections are set up properly. You can try to ensure – as much as possible – that the data that’s being sent to both platforms is consistent, and in the same format. Then it’s purely processing on the tool side that would change any data between them. The tricky part comes from ensuring that you’ve got the same data in different places.\n\nHowever mirroring like-for-like is not necessarily the right thing to do, as a lot of work has to go into that to start with and it has to be maintained at the same level of integrity. If you don’t have that strong level of governance in place, and you aren’t clear about what you want to get out of each tool, then you are going to end up with two parallel running tools with different figures and applications.\n\nWhen a use case comes up, there has to be a real discussion around that before enriching the dataset with that extra conversion or interaction point. If that’s something you want to do, discuss why and ask how it’s going to change your implementation. How is this going to change the analysis and the data that you’ve got?\n\n\nDo you buy or build?\n\nPurely from an analytics or data perspective, it’s also worth asking how far to go with a software-as-a-service product before you take that spend and build your own stack. In some verticals, you may have a very specific nuance for how you want the data to fit. To get off the ground quickly, tools like Adobe and GA get you running, getting reports out, and meeting business needs.\n\nGoogle's data schema is pretty rigid – it’s great for entry-level analytics as there's less to get wrong. Adobe is a stepping stone beyond that, more of an analyst-friendly product that enables you to do advanced data manipulations and customisations. When you’re trying to bend the restrictions that are put in place by analytics platforms though, at this point, you possible need to start looking at building versus buying.\n\nThe build option is the next level when a flexible tool becomes inflexible, so the next logical step is to build. It’s a maturity progression. If you’re not bending your current solution, then you probably don’t need the next level up because you’re not making full use of what’s already available. Each time you start bending to the point of breaking, you’ve got justification to move to that next level.\n\n\nAdobe Analytics and Google Analytics\n\nIt’s not really a case of GA versus AA, or GA versus anything else to be honest. It’s more about understanding what the needs of the business are and then picking a tool, or multiple tools, that are going to meet those requirements. Whether you’re running with one analytics tool or multiple in parallel, governance is hugely important. Everyone using the data has to understand the differences between the different data sources, and the know-how to play to the strengths of each one.\n\nIf you’re interested in finding out more about why you’d have both Google Analytics and Adobe Analytics on your website, check out episode 30 of The Measure Pod."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/build-interactive-ga4-bigquery-data-schema/#article",
      "headline": "How to build an interactive GA4 BigQuery data schema",
      "description": "What and why?\n\nOne of the great features of Google Analytics 4 (GA4) is the ability to pass data into BigQuery (BQ). There are many benefits to this which have already been covered in some of our previous blogs (i.e. 10 reasons to export your GA4 data to BigQuery). Passing data to BigQuery is no longer just available to enterprise GA360 customers, but to anyone using GA4 for free.\n\nWhat I wanted to create was a simple interactive way to explore how GA4 data is saved in BigQuery. I found the GA36",
      "url": "https://www.measurelab.co.uk/insights/blog/build-interactive-ga4-bigquery-data-schema/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/build-interactive-ga4-bigquery-data-schema/#webpage"
      },
      "datePublished": "2022-03-23T13:24:49.000+00:00",
      "dateModified": "2026-01-27T12:59:14.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/ml-blog-ga4-bigquery-schema-visualisation_1200x400-blog-scaled.jpg",
      "author": {
        "@type": "Person",
        "name": "Scott Hellmund",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "How-to",
        "BigQuery",
        "Google Analytics"
      ],
      "articleBody": "What and why?\n\nOne of the great features of Google Analytics 4 (GA4) is the ability to pass data into BigQuery (BQ). There are many benefits to this which have already been covered in some of our previous blogs (i.e. 10 reasons to export your GA4 data to BigQuery). Passing data to BigQuery is no longer just available to enterprise GA360 customers, but to anyone using GA4 for free.\n\nWhat I wanted to create was a simple interactive way to explore how GA4 data is saved in BigQuery. I found the GA360 interactive schema from E-Nor (now Merkle – Cardinal Path) by Justin Marciszewski to be a handy way to know where different elements can be found in the BQ schema, what I'd need to unnest to get to them, and at times found fields I hadn't noticed were available (most recently total.sessionQualityDim).\n\nGA4 has a new schema, different to that of the current schema if you are used to GA360/BigQuery, so this is hopefully useful for new and old GA/BigQuery users.\n\nFinally, as well as outputting an interactive schema I wanted to learn what R was all about and what else may be possible.\n\n\nHow?\n\nThe accompanying blog from Justin has a nice to follow process on how the GA360 interactive map was put together.\n\nIn the interest of saving time, I skipped the scraping and tidying of data and simply created a data frame manually using the GA4 documentation.\n\nBelow is a summary of the steps involved to create the interactive schema using R, along with links to documentation I found helpful and full code on our GitHub for you to be able to recreate this for your own GA4 dataset.\n\nStep 1\n\nInstall RStudio on my laptop from a local CRAN Mirror. With R being open source, this is a network of servers to be able to download and install the latest versions of R.\n\nStep 2\n\nOnce installed, I then needed to figure out the basics of R. This video tutorial was really helpful in getting a basic understanding of R, from variables to data frames and packages.\n\nStep 3\n\nAfter I had understood the basics I then needed to install the collapsible tree package. This only needs to be done once for your laptop or whenever you update the version of R.\n\ninstall.packages(\"collapsibleTree\")\n\nStep 4\n\nOnce installed I needed to call the library associated with this package.\n\nlibrary(collapsibleTree)\n\nStep 5\n\nThen I needed to declare the data frame. The same as the previous steps, this was pulled together manually to save time. A future update I can make will be to look at ways this can be automated.\n\nga4_ <- data.frame(\n  node = c(\n    NA,'event_','event_',.....\n  ),\n  leaf = c(\n    'event_','event_date',......\n  ),\n  variableType = c(\n    'RECORD','STRING',.....\n  )\n)\n\nThe full data frame can be found on our GitHub.\n\nStep 6\n\nThe next step was to call the package referencing the data frame. This has been developed on from earlier iterations to add a custom fill, height, width and ensure the tree starts in a collapsed state. Other fields can also be declared as part of this with more details here.\n\ncollapsibleTreeNetwork(ga4_, attribute = \"variableType\", collapsed = TRUE, zoomable = FALSE, fill = \"#66E251\", height = 700, width = 1200)\n\nStep 7\n\nThe final step was to export this to html. This was simply done via the \"Export > Save as Web Page\" feature in the viewer tab of RStudio.\n\nYou can see the final interactive tree output that we have done over on the GA4 BigQuery Export Schema page.\n\n\nSummary\n\nAt the moment, GA4 is still being developed so I fully expect the current schema to change a few times yet.\n\nIn the meantime, I hope this can help anyone who is either transitioning from GA360 to GA4, or to those who are completely new to GA4 and are keen to understand how the data from BigQuery is stored.\n\nPlease do get in touch with us if you have any suggestions for future updates, or to let us know how you are using it!"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/sunsetting-universal-analytics-announcement/#article",
      "headline": "The sun is setting on Universal Analytics",
      "description": "It’s finally happening. Google has announced the sunsetting of Universal Analytics, or more specifically, the date when UA will stop processing new hits. The 1st of July, 2023. For those without a calendar to hand, that’s fifteen and a half months from now.\n\nSo plenty of time still to think about migrating to Google Analytics 4, right?\n\nWrong.\n\nWell, wrong if on 1st July 2023 you want to be able to compare your latest GA4 data with comparable data from the previous year. And what analyst wouldn’",
      "url": "https://www.measurelab.co.uk/insights/blog/sunsetting-universal-analytics-announcement/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/sunsetting-universal-analytics-announcement/#webpage"
      },
      "datePublished": "2022-03-16T15:50:43.000+00:00",
      "dateModified": "2026-01-27T11:24:58.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/sunset-blog.png",
      "author": {
        "@type": "Person",
        "name": "Dara Fitzgerald",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Looker Studio",
        "BigQuery",
        "Data Analysis",
        "Google Cloud"
      ],
      "articleBody": "It’s finally happening. Google has announced the sunsetting of Universal Analytics, or more specifically, the date when UA will stop processing new hits. The 1st of July, 2023. For those without a calendar to hand, that’s fifteen and a half months from now.\n\nSo plenty of time still to think about migrating to Google Analytics 4, right?\n\nWrong.\n\nWell, wrong if on 1st July 2023 you want to be able to compare your latest GA4 data with comparable data from the previous year. And what analyst wouldn’t want this option?\n\n“This looks really strong. Nice colours in the chart too! But I’m curious, how does this compare to the same period last year?”\n\n“Erm, well, you see the thing is…”\n\nNobody wants that. It’s clear we’ve reached that inflection point where the risk of not acting outweighs the pain and inconvenience of beginning your GA4 migration.\n\n\nImplement and validate GA4 now\n\nYou effectively have three and a half months to implement a GA4 property. And ideally to validate the data being collected in GA4, to ensure consistency with your UA data. Not that long if you have a highly customised analytics implementation.\n\n\nOnboard users and replicate reports\n\nFor the following year, Universal Analytics can remain your “system of record” as you replicate reports and dashboards using GA4 data, and familiarise stakeholders with the GA4 user interface and features. Remember, UA properties will continue to collect new data until 1st July 2023. Beyond this, you will still be able to access previously processed data in UA for “at least” six months, but it will be on a “read only” basis.\n\nThose fortunate (or flush) enough to have a Universal Analytics 360 license, get three additional months of new hit processing. 1st October 2023 is when the sun is scheduled to set on UA 360. No other extensions will be granted!\n\n\nExport and store your historic data\n\nIf you do want to keep hold of historic UA data - something we’d highly recommend - Google is strongly encouraging users to export it using a CSV download or via the API. Historic UA data will remain accessible for GA360 customers using BigQuery.\n\n\nKey dates for your diary\n\n * 1st July 2023 - UA stops processing new hits\n * 1st October 2023 - UA360 stops processing new hits\n * 1st January 2024 - Historic UA data may no longer be available\n * 1st April 2024 - Historic UA360 data may no longer be available\n\n\nHow Measurelab can help\n\nWe’ve developed a simple framework to help companies think through the phases of a GA4 migration. You can read about the PIVOT GA4 migration framework or hear about it on the Measure Pod. And if you need additional expert support, please contact us (though we do have limited capacity between now and 1st July).\n\nTo get acquainted with GA4 and understand the key differences from UA, you might want to consider our GA4 Kickstarter training course. All our training courses are run by experienced consultants and can be tailored to your team’s specific needs.\n\nOnce your GA4 property is in place, we strongly recommend setting up the free connector to Google BigQuery right away to ensure you have GA4 data from day one (remember, there’s no backfill if you do this later). Here are 10 good reasons to do this right now.\n\nWe can walk you through the process of setting up a GCP account and connecting GA4 to BigQuery. We also have tools to help with the ingestion of historic UA data into BigQuery. Contact us for more details on this."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/sunsetting-universal-analytics/#article",
      "headline": "(BONUS pod) Google is sunsetting Universal Analytics!",
      "description": "Dan and Dara react to the big news (bombshell) from Google about them sunsetting Universal Analytics in 2023.\n\nThe announcement from Google can be read in full at https://bit.ly/3thHJDq.\n\nCheck out on LinkedIn:\n- Dan - https://bit.ly/3JQKHEb\n- Dara - https://bit.ly/3vzV0bO\n- Measurelab - https://bit",
      "url": "https://www.measurelab.co.uk/insights/blog/sunsetting-universal-analytics/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/sunsetting-universal-analytics/#webpage"
      },
      "datePublished": "2022-03-16T13:52:07.000+00:00",
      "dateModified": "2022-03-16T13:52:07.000+00:00",
      "author": {
        "@type": "Person",
        "name": "Daniel Perry-Reed",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Looker Studio",
        "BigQuery",
        "React",
        "SQL"
      ],
      "articleBody": "Dan and Dara react to the big news (bombshell) from Google about them sunsetting Universal Analytics in 2023.\n\nThe announcement from Google can be read in full at https://bit.ly/3thHJDq.\n\nCheck out on LinkedIn:\n\n * Dan - https://bit.ly/3JQKHEb\n * Dara - https://bit.ly/3vzV0bO\n * Measurelab - https://bit.ly/3Ka513y\n\nPlease leave a rating on Spotify and/or Apple Podcasts.\n\nIf you want to join Dan and Dara on the podcast, or want to suggest a topic for them to chit-chat about, email podcast@measurelab.co.uk or find them on LinkedIn and drop them a message.\n\n\nTranscript\n\n[00:00:00] Dara: Hello, and thanks for joining us in a bonus edition of The Measure Pod. So we're bringing you this bonus episode because of some big, big news that Google have announced, which we felt warranted a quick, special edition, just to make sure you're all aware of this. It's something we're probably going to discuss quite a lot over the coming weeks and months, but we wanted to get some information out there to you as quickly as possible.\n\n[00:00:39] Dara: So Dan, let's kick things off. What is this bombshell? What is this big piece of news?\n\n[00:00:45] Daniel: Well Google have announced that they are going to deprecate or sunset as they're calling it Universal Analytics and all previous versions of Google Analytics. So that just leaves Google Analytics 4. So Google Analytics 4 as of 1st of July next year will be the only Google Analytics tool should we say that they're going to be supporting and using. It's huge, it's big news. I mean, I'm not saying it's going to be life-changing or game changing, but it's definitely big enough for people like us in the analytics industry that work with this stuff day in, day out.\n\n[00:01:11] Daniel: We're not used to Google doing this kind of thing, we're used to them occasionally dropping certain features or phasing out certain elements of the platform. So they used to have things like YouTube tracking, where you could track your YouTube profile or even the, do you remember the heat mapping or the attempt at heat mapping, where they did that click overlay classic in Universal, that kind of just disappeared at one point right.\n\n[00:01:31] Dara: Yeah, but you're right this is a very different situation, and it's unusual to have such a definite change in such a potentially I guess in some people's view is going to be a harsh approach and this is definitely going to light a fire under people, or it should because there's probably companies out there who have still been just pushing GA4 down the road, thinking, well look, we'll figure that out later, and now there's a very real urgency to actually not just start trying it out, but actually start moving all of your reporting over to GA4.\n\n[00:02:01] Daniel: Yeah exactly, if you're kicking the can down the road then now's the time to stop and to get it implemented.\n\n[00:02:05] Dara: The road’s getting a lot shorter.\n\n[00:02:06] Daniel: Yeah the roads come to an abrupt end. So let's talk about timelines. So what they've announced is that as of the 1st of July 2023, they're going to stop processing new hits and then you'll have access to that data, it says for at least six months. So there's an ambiguity there, but it looks like, let's assume worst case scenario, you'll have access until the end of December 2023 to the data, and then either data's deleted or access is removed or a combination of the two, but it doesn't really matter, same difference. Ultimately we have until July the end of June next year to keep tracking Universal and then you'll have read-only access to that data for another six months.\n\n[00:02:39] Daniel: The reason why they're saying this now, and the reason why they've chosen that date, or at least the idea behind it is to allow you enough time to implement GA4 now to be able to get year on year reporting capabilities come the 1st of July next year. On paper, it makes perfect sense you know, if I implement GA4 now before the 1st of July 2022, by the 1st of July 2023 I'll be able to do a year and your reporting. That's great, but that only leaves us as of recording six weeks. So what that really means is you've got six weeks to implement all of Google Analytics 4, all the recommended events, the ecomm events or anything that you want to have you and your data for. You need to get that on your website as soon as physically possible. So that come this time next year you'll be able to have that year in your reporting. It doesn't actually give us a lot of time, not a lot of time to actually. There's going to be some stuff you probably don't care too much about, you don't need year on year reporting. In which case you can kick that can down the road slightly but those kinds of core events and KPIs, especially if you're ecomm and you're talking about transactions and revenue, those need to be implemented as soon as possible.\n\n[00:03:37] Dara: On the at least six months point about whether you've got some kind of read only access, but without data being collected. Even if they end up extending that it's probably worth exporting any data that you're going to really care about regardless, even if they made that indefinite, you don't really want to be going back into an old now sunsetted version of the product to pull out bits and pieces. So really having a plan for what historical data is even needed, because there's an argument that maybe some of your really far back data isn't needed in any way, but certainly anything in recent history that you would want in a single kind of set of reporting tables, you might want to pull out and get into BigQuery and not rely on that six months window too much.\n\n[00:04:18] Daniel: Yeah, exactly and the last thing I want to mention really is that this is going to cost whether it's money or time, and that's the one thing to start preparing for. Just because it's a free product, sure, you can use Google Analytics for free and Universal Analytics has a free tier as well, but it's going to take time, which is money. To transfer all of your Data Studio reports or your data warehouse data feeds, or the tables that you're creating off the back of some analysis you're doing in Universal Analytics or GA 360, or even just training and education and familiarity with these products and making sure every marketer and analyst in the team has the confidence to go into GA4 and continue doing what they were doing in Universal Analytics.\n\n[00:04:53] Daniel: So it's just a bit of a pre forewarning really. This is going to cost whether it's time, money, resources, effort, energy, all of the above. And it's probably going to start really, really soon. So, like I said, six weeks from the time of recording, we've got until the 1st of July 2022. So really soon, to get all of those core events implemented so that's come the 1st July 2023, you will have your year on year reports.\n\n[00:05:14] Dara: One final detail to art is if you're a 360 customer, if you've got Universal Analytics properties on 360, you get an additional three months grace. So that would actually collect data up until October 2023, but then the same situation applies from that point.\n\n[00:05:31] Daniel: Yeah, more details to come I'm sure. Especially as we get closer to that time, they might change their mind, but for now that's as much as we know.\n\n[00:05:38] Dara: Yeah, we're very likely to discuss this topic many more times and then we'll reach a point where we won't be calling it Google Analytics 4 anymore, we'll just be calling it Google Analytics.\n\n[00:05:46] Daniel: I know, I know. Yeah I can bet money that we'll be talking about this again, but I think that's, that's enough for now, just a quick reaction to the announcement of the news, the big news and yeah, back to our regularly scheduled programming.\n\n[00:05:57] Dara: Yeah so thanks for listening, see you soon.\n\n[00:05:59] Daniel: See you later, bye."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/ga4-bigquery-export-schema/#article",
      "headline": "GA4 BigQuery export schema",
      "description": "In BigQuery, the Google Analytics 4 schema is completely different to the (Universal) Google Analytics 360 schema. This tree map is a simple interactive way to explore the new schema for new and old GA/BigQuery users alike.",
      "url": "https://www.measurelab.co.uk/insights/blog/ga4-bigquery-export-schema/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/ga4-bigquery-export-schema/#webpage"
      },
      "datePublished": "2022-03-10T13:03:10.000+00:00",
      "dateModified": "2026-01-27T11:24:58.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/ml-blog-ga4-bigquery-schema-visualisation_1200x400-blog-scaled-1.jpg",
      "author": {
        "@type": "Person",
        "name": "Scott Hellmund",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "How-to",
        "BigQuery",
        "Google Analytics"
      ],
      "articleBody": "I've always found the GA360 interactive schema from E-Nor (now Merkle - Cardinal Path) by Justin Marciszewski to be a handy way to find out where different elements can be found in the BigQuery schema.\n\nGA4 has a new schema, different to that of the Universal Analytics schema you may have become familiar with using GA360. I hope this proves to be a useful visual reference for new and old GA4/BigQuery users alike!\n\nYou can explore the GA4 BigQuery export schema by clicking on the tree map below. Or you can open it full-screen in a new tab (and maybe bookmark the page for future reference).\n\nIf you're wondering if or why you should be exporting your GA4 data to BigQuery in the first place, Lace gives 10 very good reasons in her blog.\n\nI've also written up a full guide on how to build this yourself using R should you want to have a go and to use your own GA4 event schema to generate the tree map."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/data-collection-conversion-modelling/#article",
      "headline": "From the wild west of data collection to conversion modelling",
      "description": "How will Google’s machine learning conversion modelling and other models change analytics? Is this the end of real data?",
      "url": "https://www.measurelab.co.uk/insights/blog/data-collection-conversion-modelling/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/data-collection-conversion-modelling/#webpage"
      },
      "datePublished": "2022-02-24T13:58:46.000+00:00",
      "dateModified": "2026-01-27T11:24:59.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/working-at-ml-1200-x-400-px.png",
      "author": {
        "@type": "Person",
        "name": "George Mendham",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Data Analysis",
        "Google Analytics",
        "BigQuery",
        "Privacy",
        "AI & ML",
        "Marketing",
        "Google Ads"
      ],
      "articleBody": "Access to ‘real’ data in Google Analytics (UA and GA4) is becoming more limited due to technology and legislation changes. So, what does this mean for people who are used to having access to all of their data, and how will this change how we use data in these platforms in the future? Is this the end of real data in analytics?\n\nGoogle announced in 2021 that they are moving all of their products over to machine learning models, whether that’s data-driven attribution or filling in gaps with conversion modelling. Analytics consultants like us are used to having access to 100% of the trackable data to export to BigQuery from Google Analytics or creating audiences and segments based on the smallest segments of users when they go through a website in a very specific way, but this won’t really be possible going forward.\n\n\nIncreasing regulations make measurement challenging\n\nLike it or not, this change is going ahead, partly in response to the fact that observed data is becoming less and less reliable. There are an increasing number of gaps in data collection due to improvements in data privacy legislation and technology within browsers to control the information that’s being collected about you as a user. There’s actually less data collected in tools like Google Analytics now than there was 5–10 years ago.\n\nIt’s no longer the ‘wild west’ in the digital marketing and analytics world – technology and legislation are catching up. Every browser has specific rules around how they manage cookies and trackers, and most browsers, except for Chrome, already block third-party cookies. Chrome will remove access to third-party cookies some time in 2023 and that will officially be the end of third-party cookies.\n\nAlthough first-party cookies aren’t going anywhere, with the browser technology available, setting these can be quite limiting. Safari is limited to either 24 hours or seven days, depending on certain factors. In other browsers, you don’t set any analytics cookies at all – there’s no tracking whatsoever. So there are issues that didn’t exist ‘back in the day’.\n\n\nAdapting to a world that prioritises privacy\n\nLegislation like GDPR and the CCPA (soon to be the CPRA) are changing conditions all the time, requiring active opt-in consent (to be acknowledged by the user that you’re taking their data and doing something with it). The actual data you end up collecting in a platform like Google Analytics, regardless of what version you’re using, is reduced. There will also be fewer users – not everyone will opt-in to be tracked.\n\nWhen they do opt-in, the data won’t necessarily be as accurate as it was in the past because the cookie won’t be there to tie it all together. If a user returns once a month, they’ll most likely be seen as a new user, regardless of what browser they’re using. The fact is, web analytics data has never been entirely accurate – there have always been reasons why data will be missed.\n\nEven when there’s a 10% difference, it’s still useful for trend analysis and comparative change. Rather than thinking of it as the total revenue you’ve earned, it’s a change compared to a previous period. Cross-device users and cross-browser tracking has also always been an issue even when cookies were more prevalent, so some of the modelling techniques may actually improve the data’s accuracy.\n\nWe’ll never really know though because it’s a black box algorithm and we’re taking Google Analytics’ word that they’re modelling users and stitching users together, understanding behaviour from unconsented users, and applying it to the real data. We assume they have our best interests at heart and that it’s going to be 100% accurate, but it’s not transparent. The black box modelling doesn’t allow you to dig into and understand how it’s working.\n\n\nThe changing digital marketing landscape\n\nWith observed data less available, this is something that has to happen. Modelling is the best option available based on the constraints, both technical and in terms of the legislation. And Google Analytics is clear: if you want to use our tool, you sign up to our terms and conditions, otherwise, there are other ways (and other tools) to collect and process data.\n\nThey’ve sweetened the deal with an easy-to-install product that has a free version that anyone can use and most people are familiar with. Most people don’t have an analytics team, data engineers, or data scientists to set up their own analytics tool and send data directly to a data warehouse though, so they’re pushed into a corner and forced to adapt.\n\nGoogle Ads has been modelling data for some time, specifically around conversion modelling where there’s no cookie data available. Modelling is used with the store visit data within Ads as well. Even Universal Analytics has been using modelled data for a number of years, and the sales pitch of GA4 is that it’s built on machine learning, using built-in predictive audiences and predictive modelling.\n\n\nConversion modelling\n\nGA4 introduced conversion modelling in July 2021, which identifies viewable users that convert via everything that’s not direct traffic. It takes all of your users that converted directly, so no campaign data was available, and then it tries to model the actual campaign that drove that conversion. So, it’s not creating conversions where there were none. They try to model, based on viewable data, what the channel was that drove users to convert.\n\nThese are the use cases or scenarios where modelled conversions might be applied, according to Google:\n\n * Browsers that don't allow conversions to be measured with third-party cookies will have conversions modelled based on your website’s traffic.\n * Browsers that limit the time window for first-party cookies will have conversions (beyond the window) modelled.\n * Some countries require consent to use cookies for advertising activities. When advertisers use consent mode, conversions are modelled for unconsented users.\n * Apple’s App Tracking Transparency (ATT) policy requires developers to obtain permission to use certain information from other apps and websites. Google won’t use information (such as IDFA) that falls under the ATT policy. Conversions whose ads originate on ATT impacted traffic are modelled.\n * When the ad interaction and the conversion happen on different devices, conversions may be modelled.\n * Conversion modelling covers both click-based events and engaged views for YouTube, to help with attribution for engaged-view conversions (EVCs).\n * Any conversions imported into Google Ads from linked Google Analytics 4 properties will include modelling.\n\nThe same article also states:\n\n\"When looking at Google Analytics reports, keep in mind that attributed conversion data for each channel can still be updated for up to 7 days after the conversion is recorded.\"\n\nThey’re basically saying you can’t use GA4 for the last seven days of data because it’s likely to change the attribution. Google will continue to model your data days after it happened, which is definitely going to cause some reporting headaches.\n\n\nModelled conversions and reporting\n\nThe attribution modelling methodology isn’t a completely new concept – in Google Ads, the data could continue to update because conversions are always attributed back to the click. It’s just new within Google Analytics. Google Ads has always had an interaction time attribution approach, whereas Google Analytics had a conversion time attribution approach. So, in Google Ads, you expect data to always be in flux and changing. In Google Analytics, we have to start expecting that.\n\nThe changes that GA4 is introducing is about plugging the gaps in what’s already happened – you take data that is partial and then Google models the difference, or at least what it expects the difference to be. It then does the conversion modelling, where it tries to reattribute the channel for the conversion. And then it applies a machine learning model to do data-driven attribution across that before we see a report through the UI or API.\n\nPreviously, we could go in and validate the accuracy of the data to maybe a 5–10% difference. Going forward, there won’t be any indicators to say this isn’t accurate. For the old school analytics people, the biggest fear is, how are we going to know if things are right or wrong?\n\nThis isn’t a new problem though – it’s a case of technology catching up. The increase in legislation around user privacy is, in principle, a good thing. The use of modelling is going to become more and more prevalent, both in Google Analytics and other marketing analytics and ad technology. So we have to adapt and accept that we’re going to have less and less visibility. We’re going to move away from counting things and have to start trusting what we’re told.\n\nIf you’re interested in Dan and Dara’s full breakdown of modelling technology and if this is the end of real data in analytics, check out episode 11 of The Measure Pod."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/bigquery-data-transfer-service-google-ads/#article",
      "headline": "How to use the BigQuery Data Transfer Service for Google Ads",
      "description": "To perform advanced data analysis, you need a powerful data warehouse like BigQuery. Here’s how to extract Google Ads data using the BigQuery Data Transfer Service.",
      "url": "https://www.measurelab.co.uk/insights/blog/bigquery-data-transfer-service-google-ads/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/bigquery-data-transfer-service-google-ads/#webpage"
      },
      "datePublished": "2022-02-22T12:10:23.000+00:00",
      "dateModified": "2026-01-27T11:24:59.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/analytics-sub_big-query-1200x400-blog-5.png",
      "author": {
        "@type": "Person",
        "name": "Natalia Rizzi",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "How-to",
        "BigQuery",
        "Google Ads",
        "Google Cloud"
      ],
      "articleBody": "The BigQuery Data Transfer Service is a tool the GCP provides to automate data movement into BigQuery on a scheduled, managed basis without having to write any custom code. The supported data sources include YouTube, Google Play, Google Ads and many other Google and 3rd party tools.\n\nTo use the BigQuery Data Transfer Service, first of all, you need to activate the BigQuery API. To do this, go to “APIs & Services” from the GCP side menu and select “Library”.\n\nOnce you are in the Library, search for “BigQuery API” and check if the API is enabled. If it is enabled, you can go straight to the next step. If the API is not enabled, then click “Enable”.\n\nTo use the API, you’ll need to create the credentials. So, from APIs & Services, click “Credentials”.\n\nOnce you’re on the Credentials page, click on the top menu bar on “Create Credentials”, and then click on “Help me choose”.\n\nIn this case, we are going to select “BigQuery APIs”, fill out the form (like the one below), and click done.\n\nAfter you click done, you’ll need to create the name and the ID of the service account and click done.\n\n\nEnabling the BigQuery data transfer\n\nThe next step is to enable the BigQuery Data Transfer API, so we go back to the GCP sidebar menu and click on “APIs & Services”. Go to Library and search for “BigQuery Data Transfer APIs”.\n\nCheck if the API is enabled. If it is enabled, you can go straight to the next step. If the API is not enabled, then click “Enable”.\n\nNext, you need to go to “Data transfers” and click on “Create Transfer”.\n\nYou’ll need to explore the different data sources and (in this case) select “Google Ads (formerly AdWords)”.\n\nYou’ll be asked to create the name of your transfer (it needs to be in a snake case format).\n\nPick the schedule options depending on your preference.\n\nAdd the Google Ads customer/account ID.\n\nYou can also set a Refresh Window (the default is the last 7 days, but I suggest 30 days).\n\nClick “Save”.\n\n\nPrerequisites\n\n * Have access to the Google Ads account (read-only should be enough)\n * Have the BigQuery admin role\n * Have a dataset under which you want to transfer the data"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/google-analytics-limitations/#article",
      "headline": "Google Analytics limitations: where GA falls short",
      "description": "It’s an uncomfortable truth for Analytics specialists: GA is not always the answer. Google Analytics' limitations mean it won’t always be the right solution for you.",
      "url": "https://www.measurelab.co.uk/insights/blog/google-analytics-limitations/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/google-analytics-limitations/#webpage"
      },
      "datePublished": "2022-02-18T10:57:40.000+00:00",
      "dateModified": "2026-01-27T11:25:00.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/measurelab-kpi_1200x400-blog-3.png",
      "author": {
        "@type": "Person",
        "name": "Vanessa Fitarelli",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Data Analysis",
        "Google Analytics",
        "BigQuery",
        "Ecommerce"
      ],
      "articleBody": "When is Google Analytics not the answer? And just to clarify, when we refer to GA, we mean Universal Analytics. As analytics consultants, it can be difficult to acknowledge that GA cannot do everything – there are situations where it falls short when it can’t be used to answer certain questions – whether it’s navigating gaps in data collection or forcing some types of data analysis that just don’t work.\n\nIt’s important to acknowledge Google Analytics’ limitations so you can understand when GA is not the answer. So, let’s get into it…\n\n\nThe difference between quantitative data and qualitative data\n\nGoogle Analytics is really good at telling you how many times something happened (quantitative data), but it doesn’t really tell you why something happened (qualitative data). For example, GA might tell you that 10 people visited a certain page and then moved on to the next page. It doesn’t provide any context, i.e. why they moved to that next page, why some people didn’t, and what factors caused that drop-off.\n\nNow consider more qualitative tools like SessionCam, Microsoft Clarity or Hotjar that record sessions and track heatmaps, or even survey data and feedback forms you may have. The data you get from these give you some context as to why an event took place and what caused an action to be taken.\n\nLet’s say you’ve got a contact form on your website. In Google Analytics, you can track how many times that form has been submitted successfully, and maybe even how many failed attempts there were too. What’s missing is ‘why’ the form is erroring, or why people are submitting it in the first place. GA just tells you five things have happened – basically, it’s glorified counting. GA can tell you there’s a problem, maybe even where that problem is, but it won’t tell you what the problem is.\n\nGoogle Analytics is for quantitative data analysis, not qualitative. You’re better off using a another tool for this kind of analysis. The upside is that tools like SessionCam and Hotjar work really well with GA and you can overlay the two datasets to get to that answer – to get to that insight of why something is or isn’t working.\n\n\nIntegrating different datasets\n\nAt the end of the day, we have to remember Google Analytics’ primary function is trend analysis, and more specifically, marketing trend analysis. GA is not necessarily meant to do everything, and it’s not the place to collect all of your data. You might be trying to connect two different systems that report on a metric in two very different ways.\n\nTrying to align Google Analytics to your stock or finance system can be an uphill battle you might never win – validating something like revenue is always going to result in a 5–10% difference at the best of times, and that’s expected. The question to ask is if the data you’re pushing into GA needs to be there. Is it adding value to your marketing trend analysis?\n\nA good example is ecommerce refunds. There are ways of accounting for refunds in GA, but what is the benefit of incorporating that data into GA? It won’t change the near-immediate actions that were taken from the data. Marketing teams will typically report on conversions and transactions, not final completed sales. A refund two weeks after the transaction may have more to do with an unsatisfactory product or delivery than a failure in the website conversion process.\n\n\nGoogle Analytics is a website tracking tool\n\nIt’s about knowing where the data needs to be. Shoehorning data back into Google Analytics isn’t always the answer. If that data exists in a CRM system or in BigQuery, it’s much easier to get the GA data into BigQuery or your CRM than the other way around. Even though there are a lot of systems that integrate automatically with GA, it makes more sense to align all of your data (online and offline) in a data warehouse.\n\nWith Universal Analytics, it will always try to turn everything into some kind of online activity – there’s no such thing as an offline event within UA (there is in GA4 though). There’s no offline session and there’s no offline user – sending data into GA results in new sessions and users being created, which skews the data.\n\nGoogle Analytics 4 is a bit more agnostic when it comes to this kind of data – GA4 doesn’t care if events are online or offline.\n\n\nGA360: Overkill or underkill?\n\nThere are cases where companies don’t necessarily need the extra features that Google Analytics 360 offers. A high-traffic site that doesn't run any (or much) paid advertising won’t benefit from the ad platform integrations and might not want to pay the price just to be able to track more data. Most people start out with GA using the free tier, and it comes as a shock when they find out how much GA360 is (it's lots by the way), especially if they haven’t needed to budget for it before.\n\nWhat Google Analytics does is just data collection and data aggregation. GA processes it in different ways and creates a visual platform (UI) for you to interrogate that data. Then there is the API and BigQuery export as optional extras. There’s always a question around whether Google Analytics is potentially overkill for what you need though. This is when you need to ask, is it doing too many things for what I actually need it to do? When you’re getting close to the GA360 threshold, consider if you’re just using GA as a data collection and aggregation tool. If so, you could look to build your own data collection process, and pull the data directly into a BigQuery data warehouse and build our reports from there. Basically, bypassing the GA middle-man.\n\nOn the other hand, instead of doing lots of things that you don’t want it to do, Google Analytics could be holding you back if you want to really customise your data collection. For people with very specific use cases and needs, GA's hyper standardised and rigid approach to data collection and reporting is probably not going to be quite right for you.\n\n\nGoogle Analytics’ limitations\n\nGoogle Analytics comes with bells and whistles, but it’s not always the answer. Maybe it’s full of features you’re never going to use, or it doesn’t have enough features, in which case, why settle?\n\nIf you’re interested in Dan and Dara’s full breakdown of why GA may not always be the right answer and where it falls short, check out episode 15 of The Measure Pod."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/hit-level-segment-universal-analytics/#article",
      "headline": "How to force a hit-level segment in Universal Analytics",
      "description": "In Universal Analytics, you can build a user-level or session-level segment. Here’s a nifty little hack to force a hit-level condition to get the data that you want.",
      "url": "https://www.measurelab.co.uk/insights/blog/hit-level-segment-universal-analytics/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/hit-level-segment-universal-analytics/#webpage"
      },
      "datePublished": "2022-02-15T12:41:43.000+00:00",
      "dateModified": "2026-01-27T11:25:00.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/analytics-sub_uaga4-1200x400-blog-13.png",
      "author": {
        "@type": "Person",
        "name": "Dara Fitzgerald",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "How-to",
        "Google Analytics",
        "Ecommerce"
      ],
      "articleBody": "Note: This how-to is for forcing a hit-level condition within a session-level segment. It is not commonly understood that if two criteria in a user-level segment are in the same condition filter, then they have to occur in the same hit. This can be achieved within a user-level segment, with the default behaviour of adding multiple criteria within a single condition, separated by AND statements.\n\nDoing this with user-level segments, however, will include sessions for those users where they did not meet your criteria. As a result, it’s often necessary to do this within a session-level segment, and it is that requirement that is covered in this guide.\n\nTypically, within session-level segments, the criteria you want to base your segment on can happen independently within the session. So, for example, you might want to look at sessions where the landing page was the homepage and the session resulted in a transaction. These two criteria are independent of each other i.e. they happen at different points in the session. Therefore, you can do this by simply adding additional conditions to the segment and this will give you exactly what you want.\n\n\nSequence-based segments\n\nHowever, there are times when you need to be more specific and tie two criteria together within a single hit. The most common example of this is when you want to include sessions that involved the purchase of a specific product i.e. you want to tie a product name to a purchase hit. This sounds like it should be easy to do and it’s a common requirement, but Google Analytics only offers session-level and user-level segmentation, and what we need here is actually a hit-level condition, as we want to specify a product that was contained within a purchase hit.\n\nThe problem with trying to do this within the segment builder for a session-level segment is that it will only look to see if each of the criteria happened at some point within the session, and each criterion is looked at independently. So, if we tried to do this…\n\n…it would show us this:\n\nWhich looks sensible, however, it is very misleading. This will include sessions where a product name exactly matching “Delon Velvet Chair” was included in a hit and in the same session, the unique purchases per hit is greater > 0. However, what it does not specify is that the hit the product name appeared in was the same hit as the purchase occurred. So, it’s entirely possible that this session involved the user viewing the “Delon Velvet Chair” product page (or that product appearing in a product list they viewed), but purchasing an entirely different product.\n\n\nSession-level segment criteria\n\nTo ensure that we only include sessions where the Delon Velvet Chair was purchased, we need to force the segment to tie the product name criteria to the unique purchase criteria in the same hit. This is where the hack comes into play.\n\nIn the segment above, we are using a sequential condition, and this is the hack. Sequential segments evaluate each ‘step’ as a single hit, so this sequential segment is the equivalent of a hit-level segment.\n\nBelow are the results of the two segments we have created: the incorrect condition-based segment and the correct sequential segment.\n\nAs mentioned, the incorrect condition-based segment is over-including, as it will include sessions where the product name appeared in a hit that was separate from the purchasing hit. However, the sequential segment forces the condition to be hit-level and therefore this will only include sessions where the product name (in this case, “Delon Velvet Chair”) was in the same hit that the purchase occurred (unique purchases per hit > 0).\n\n\nPrerequisites\n\n * The interactions you wish to include in your segment are already being tracked in Google Analytics.\n * Enhanced Ecommerce is being used if wanted to segment by product(s).\n\n\nUse cases\n\n * Segmenting purchases of a specific product (or products) within a single transaction.\n * Seeing combinations of events triggered on specific pages."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/new-ga4-features-2022/#article",
      "headline": "5 new GA4 features we want Google to  introduce in 2022",
      "description": "Whether GA4 is the ‘new and improved’ version of Universal Analytics remains to be seen. There are some GA4 features and functionality we’d like to see in 2022.",
      "url": "https://www.measurelab.co.uk/insights/blog/new-ga4-features-2022/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/new-ga4-features-2022/#webpage"
      },
      "datePublished": "2022-01-28T09:54:49.000+00:00",
      "dateModified": "2026-01-27T11:25:01.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/analytics-sub_sheets-1200x400-blog-6.png",
      "author": {
        "@type": "Person",
        "name": "George Mendham",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "How-to",
        "Google Analytics",
        "Looker Studio",
        "Conversion Tracking",
        "Testing"
      ],
      "articleBody": "Let’s talk Google Analytics 4 and what’s in store this year. There are some features missing from GA4 and it's preventing some companies with more complex configurations from migrating – what you might call dealbreakers. So, what are the features Google needs to introduce to GA4 in 2022 to reach parity with (or even surpass) Universal Analytics?\n\nThe main features we see GA4 needing are:\n\n 1. Views (or a good enough replacement)\n 2. Session- and product-scoped Custom Dimensions (and Metrics)\n 3. Updates to the Data API (for the rest of the standard dimensions and metrics)\n 4. Enhanced report filtering and sorting (including regex filters)\n 5. Google Optimize integration\n\n\n1. Views\n\nWithin Universal Analytics, you have your account, your property, and your views. Google Analytics 4 doesn’t have customised Views like Universal Analytics, though. While in UA you can create a custom subset of the data that you can then filter, GA4 has a single reporting view at the Property level, and Data Streams that feed into it – it’s all-or-nothing.\n\nThere are ways around it. You could achieve the same effect with comparisons or the exploration workspace, but it’s not as intuitive or as convenient, and you’re having to solve problems that never existed within UA. Hopefully, Views will be one of the features that Google introduces as GA4 evolves.\n\n\n2. Session- and product-scoped Custom Dimensions\n\nCustom Dimensions and Metrics have changed in Google Analytics 4. Session-scoped Custom Dimensions are not available in GA4 and item parameters have replaced product-scoped Custom Dimensions. For many people, the five default “item_category” options are acceptable, but if they want to add an additional item-level custom parameter, this can’t be enabled within the interface as a dimension, which is quite restrictive.\n\nIt’s been the biggest gap within GA4’s data structure because there’s a lot of reporting, especially from a marketing analytics perspective, that’s done at the session-level. The interface is the real issue – there are things you probably can’t create on your own unless you’re a SQL analyst. It would be great to see this feature rolled out in 2022.\n\n\n3. Updates to the Data API\n\nOne of the things that prevented people from embracing Google Analytics 4 until now has been the Data API, which is missing some of the functionality of Universal Analytics' Reporting API. To move from UA to GA4, you’d hope to replace your existing dashboards using the API, which is difficult to do when certain metrics are missing.\n\nFor example, 'exits per page' is a metric that appears in GA4, but you can’t report on that in Data Studio. The same goes for 'conversion rate' and 'average engagement time', both of which aren’t yet in the Data API – a problem for people reporting on those KPIs. While the API is lacking some fundamental dimensions and metrics, there are different workarounds, but again, it’s adding additional steps that aren’t required with UA.\n\n\n4. Enhanced report filtering and sorting\n\nOne of our pain points at Measurelab has been the lack of regex (regular expression) availability within the Google Analytics 4 reports workspace. Anyone who’s used Universal Analytics is familiar with the page report where you maybe have thousands of rows of pages and want to look at ones matching a certain regex pattern. Unfortunately, the GA4 filter only uses a ‘contains’ and not an ‘exclude’ – making it difficult to drill into the data.\n\nIt may only affect 5% of users, but for that 5%, this is functionality they probably use 95% of the time. And again, there’s a way around it (you can go into the explore workspace), but it’s not a user-friendly interface compared to the ease of UA – not to mention sampling. UA has built different advanced filtering and sorting mechanisms over the years and it’s frustrating to lose this functionality. This is definitely one of the features GA4 needs to be on a par with UA.\n\n\n5. Google Optimize integration\n\nThere is currently no connector for Google Optimize and Google Analytics 4, but this should be released soon. All of the data that Google Optimize uses to measure website performance and do any kind of testing is using Universal Analytics. And there’s no option to do it from GA4 (yet).\n\nIt’s one of those instances where GA4 launched, but the surrounding products that rely on Google Analytics weren’t yet ready, which is a major deterrent to the teams working with those other products.\n\n\nNew GA4 features on the horizon?\n\nUltimately, this is the year where we foresee Google Analytics 4 reaching feature parity and exceeding Universal Analytics. So, if you’re not currently using GA4, now is the time to start parallel tracking.\n\nOf course, when it comes to features and functionality, progress is always a moving needle. We need all of the other platforms to catch up with GA4 and build integrations as well, but there’s a lot to look forward to as the platform evolves.\n\nIf you’re interested in the full breakdown of what’s missing from GA4 compared to UA, check out episode 21 of The Measure Pod to hear mine and Dan's in-depth discussion about all the GA4 features we’d like to see in 2022."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/analytics-resources-list/#article",
      "headline": "Keep up! - the ultimate analytics resource round-up",
      "description": "Keeping up with the analytics industry is a daunting task. This list is a good starting point for anyone wanting to get caught up - or stay one step ahead.",
      "url": "https://www.measurelab.co.uk/insights/blog/analytics-resources-list/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/analytics-resources-list/#webpage"
      },
      "datePublished": "2022-01-26T11:21:55.000+00:00",
      "dateModified": "2026-01-27T11:25:01.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/measurelab-blog-superpower_1200x400-blog-2.png",
      "author": {
        "@type": "Person",
        "name": "Daniel Perry-Reed",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "BigQuery",
        "Google Analytics",
        "Google Tag Manager",
        "Looker Studio",
        "Privacy",
        "Google Cloud",
        "Firebase Analytics"
      ],
      "articleBody": "Over the years, I’ve stumbled across (and regularly returned to) a number of invaluable resources that help me keep up-to-date with the goings on with the technology, legislation and general industry news. Here's my list of go-to sources. I hope you find them useful too!\n\n\nAnalytics forums\n\n * GMP partner forum (restricted to partners, sorry!)\n * Measure Slack\n * Stack Overflow\n\nGoogle Marketing Platform product forums\n\n * Google Analytics Community\n * Google Tag Manager Community\n * Google Data Studio Community\n\n\nAnalytics product resources\n\nGoogle product release notes\n\n * GA4\n * GTM\n * GDS\n * Firebase\n * BigQuery\n\nFollow Google products on LinkedIn\n\n * Google Analytics products\n * Google Marketing Platform\n * Google Cloud\n\n\nAnalytics blogs and newsletters\n\nGoogle product official blogs\n\n * GCP blog (specifically the BigQuery blog)\n * GMP blog (specifically the Google Analytics products blog)\n\nIndependent and agency blogs\n\n * Trust Insights\n * Analytics Mania\n * Ken Williams\n * Simo Ahava\n * Charles Farina\n * Krista Seiden\n * Avinash Kaushik\n * CRAP Talks\n * Measurelab\n * Bounteous\n * IIH Nordic\n * Adswerve\n * Cardinal Path - GMP Hub\n * International Institute for Analytics (IIA)\n * Ben Collins (Google Sheets tips)\n\n\nAnalytics influencers to follow\n\n * Steen Rasmussen - IIH Nordic (LinkedIn)\n * Mark Edmondson - IIH Nordic (LinkedIn)\n * Simo Ahava - 8-bit-sheep & Simmer (LinkedIn)\n * Krista Seiden - KS Digital (LinkedIn)\n * Charles Farina - Adswerve (LinkedIn)\n * Ken Williams - Search Discovery (LinkedIn)\n * Peter O’Neill - ZHS Orchards (LinkedIn)\n * Julius Fedorovicius - Analytics Mania (LinkedIn)\n * Stéphane Hamel - Many! (LinkedIn)\n * Avinash Kaushik - Google (LinkedIn)\n\n\nAnalytics podcasts\n\n * In-Ear Insights (Katie Robbert and Chris Penn from Trust Insights)\n * Analytics Neat (Bill Bruno)\n * Analytics Power Hour (Michael Helbling, Tim Wilson and Moe Kiss)\n * Technical Marketing Handbook (Simo Ahava from Team Simmer)\n * Standard Deviation Podcast (Simo Ahava from Team Simmer and Juliana Jackson from Media.Monks)\n * The Measure Pod (Daniel Perry-Reed and Dara Fitzgerald from Measurelab, and Bhavic Patel from LeanConvert)\n * Leading Analytics Podcast (Jack Phillips from International Institute for Analytics)\n * Measure Up (Jim Gianoglio from MMM Hub)\n * The Marketing Analytics Show (Anna Shutko from Supermetrics)\n * 33 Tangents (Jason Thompson and Jim Driscoll from 33 Sticks)\n * Business Unfiltered (Mercer from MeasurementMarketing.io and Jeff Sauer from Data Driven U)\n * Life After GDPR (Rick Dronkers from Data to Value)\n * Masters of Privacy (from PrivacyCloud)\n * Women in Analytics After Hours (Lauren Burke from Women in Analytics)\n * Meet the Analytics Stack (Timo Dechau from deepskydata)\n\n\nAnalytics events and meetups\n\n * CRAP Talks (London and Manchester, UK meetup)\n * BrightonSEO (every 6 months in Brighton, UK)\n * MeasureFest (Brighton SEO fringe event)\n * MeasureCamp (IRL and online globally)\n * SUPERWEEK (Normally in January/February in Hungary)\n * Brighton Data Forum (Brighton, UK meetup)\n\n\nAnalytics organisations\n\n * Internet Advertising Bureau (IAB)\n * Information Commissioner's Office (ICO)\n * Digital Analytics Association (DAA)\n\nIf you have any resources you’d like to add that I’ve missed, please drop me an email at daniel@measurelab.co.uk and I’ll add them to the list."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/reduce-bigquery-cost-data-processing/#article",
      "headline": "How to reduce the cost of BigQuery data processing",
      "description": "BigQuery cost optimisation tips to reduce the number of bytes processed and the cost of running queries.",
      "url": "https://www.measurelab.co.uk/insights/blog/reduce-bigquery-cost-data-processing/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/reduce-bigquery-cost-data-processing/#webpage"
      },
      "datePublished": "2022-01-25T11:34:44.000+00:00",
      "dateModified": "2025-07-31T20:36:06.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/analytics-sub_big-query-1200x400-blog-6.png",
      "author": {
        "@type": "Person",
        "name": "Steven Elliott",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "How-to",
        "BigQuery"
      ],
      "articleBody": "Every Google BigQuery code you run costs money – the amount you pay can vary hugely based on different factors. Although the amount may be minimal, as your dataset increases, so will your costs. Let’s have a look at the various ways you can limit the number of records retrieved through your code, some that save you money and some that don’t.\n\nSome of the biggest costs you can incur is while you’re busy developing code for a project. It's all too easy to write code and click run before truly thinking about how much that code will cost. Luckily, we have some scripts and processes you can use to help reduce the BigQuery cost of data processing.\n\n\nBigQuery cost optimisation tips\n\n\n1. Bytes used\n\nBigQuery has a great little nugget of information in the top right corner of your script. It basically gives you a rough estimate of how much data your code is going to process when you click the run button. It looks something like this:\n\nAs you change your code, you will see this number go up and down accordingly. We tend to start questioning code once it has gone above 15GB. Sometimes this could be valid due to large datasets, but it’s always worth checking your code a couple of times to see if there is anywhere you could make a saving.\n\n\n2. Don't rely on Limit\n\n\"I know what I’ll do, I’ll just add LIMIT to the bottom of my SQL and just get the first 1,000 records out – 1,000 records can’t cost a lot of money, right?\"\n\nWrong! By the time you come to the limit section of your code, BigQuery has already processed all the data to get the information you are seeing. That processing cost is all yours my friend. It’s like asking someone to bake a cake so that you can just have a slice of it…effort has still been spent making the whole cake.\n\nLimit is a great way of seeing just a few records, but doesn't have an impact on the processing costs. If you are used to using limits to get an example of the data, I’d recommend opening the table you want to look at and then selecting “Preview”.\n\n\n3. Columns are key\n\nUnlike some other SQL products, BigQuery reads data column by column, not row by row. This means that if you limit the number of columns you're pulling data from, it will dramatically affect the amount of bytes it takes to process the information (and the cost).\n\nThe key rule here is do not use SELECT * (like ever). Instead, think about the key pieces of information you actually want to see and don't forget that you can review the table for free and see what is available.\n\n\n4. Clustering and partitioning\n\nAnother great way to reduce the number of bytes used to process a query is to ensure key columns are partitioned and/or clustered. This has to be done at the point the table is created (a workaround could be to create a table from existing tables’ data and add the partitioning and clustering). This will allow BigQuery to organise your data based on certain columns; this way, when you limit by those columns, the bytes used will reduce significantly.\n\n\n5. Table sample\n\nOn the whole, sampling a table is a fabulous option to allow you to play with a random selection of data while you’re developing code. The amount of data you're selecting is completely up to you – you can stipulate the percentage of data you would like to look at.\n\nIf you apply a table sample to the table you are querying, then you will only be querying a random sample from that data. The keyword here is ‘random’. Be warned: each time you run the code, it will be a different random sample, so your data will never match a prior extract (this can cause problems if you are trying to reconcile data). The code looks like this:\n\nSELECT * FROM dataset.my_table TABLESAMPLE SYSTEM (10 PERCENT)\n\nIf you’re in the process of developing code and know you’re going to run sections of your code to test as you go, I would recommend creating a staging table from your dataset using a table sample. This way, you can develop to your heart’s content knowing you are querying the table using a fraction of the bytes.\n\nThe data won’t be correct (as it’s not all there), but it will enable you to write code at a fraction of the cost. There are some limitations to the table sample code to bear in mind, however:\n\n * A sampled table can only appear once in a query statement. This restriction includes tables that are referenced inside view definitions.\n * Sampling data from views is not supported.\n * Sampling the results of subqueries or table-valued function calls is not supported.\n * Sampling inside an IN subquery is not supported."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/signs-analytics-maturity/#article",
      "headline": "The nine signs of analytics maturity",
      "description": "How do you measure up when it comes to analytics maturity? Forget all those finicky frameworks. If you're displaying one of these nine signs then chances are, you're on the right track.",
      "url": "https://www.measurelab.co.uk/insights/blog/signs-analytics-maturity/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/signs-analytics-maturity/#webpage"
      },
      "datePublished": "2021-12-20T13:24:24.000+00:00",
      "dateModified": "2026-01-27T11:25:02.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/analytics-maturity.png",
      "author": {
        "@type": "Person",
        "name": "Steven Elliott",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Looker Studio",
        "BigQuery",
        "Marketing"
      ],
      "articleBody": "Go do a search for digital analytics maturity models or web analytics maturity frameworks - there’s no shortage of them. Some are simple, some very sophisticated. Some are definitely more practical and useful than others. Most have been created by advisors, agencies or consultancies - Gartner, McKinsey and IBM have all had a crack. If you were cynically-minded, you might even suggest such assessments were conceived with the express intent of instilling an inferiority complex and selling in a raft of services to help customers advance from Level 1 to 5.\n\n\n\nWhat these models generally have in common is they’re linear and static. As such they’re unable to reflect the nuanced complexities of most large organisations and unsuited to an ever-evolving analytics landscape. The fact is, most companies can boast pockets of maturity, while still feeling they’re behind the analytics curve in most respects.\n\nIn a recent episode of our podcast, The Measure Pod, we explored this very topic with our guest, Steen Rasmussen of fellow analytics consultancy IIH Nordic. They don’t have a proprietary analytics maturity model to punt, but together, we managed to identify nine signs that indicate a mature - or at least maturing - analytics organisation.\n\n\n#1 Momentum\n\nWe’ve always described analytics as an ongoing endeavour - not a once-and-done fix. There’s never a point at which you can say you’re done and that you’ve made it (sorry). Models can’t capture the speed of change, or the energy and resource that’s being directed into analytics. Perpetual progress is our first sign of maturity.\n\n\n#2 Consistency\n\nFew things are more likely to set a company back than failing to build on what’s already been done. Having a clearly articulated strategy (focus), priorities and documented deliverables can mitigate the risk of new stakeholders, with different goals and aspirations, coming in and starting from scratch.\n\n\n#3 Urgency\n\nThis is a really easy one to benchmark. If a report is broken or a tag isn’t firing and the response is: we’ll sort it at some point, or let’s put it in the budget for next year, then that’s a strong indicator the data is not being relied upon and the business does not see analytics as a priority. Eliminate the friction that stops people from fixing stuff.\n\n\n#4 Action\n\nImmediate action is an obvious indicator of a data-driven culture. Are your reports and dashboards simply monitoring the vital signs of the organisation? Or are decisions made and actions taken as a direct result of what they reveal? Bonus maturity points if you have sufficient trust in your data to automate decisioning.\n\n\n#5 Integration\n\nThe fifth sign we identified was integrated data. It’s a strong indicator that companies - and their agencies - are no longer thinking and operating in silos. They’re on the journey from thinking about the website, to thinking about digital marketing activity, to thinking about where the business is trying to go and how data can help them get there.\n\n\n#6 Activation\n\nIngesting and integrating data within a marketing data warehouse is one thing, but creating and exporting new audiences or segments that can be activated through your site or marketing channels, is a sure sign you’ve taken your analytics to another level. If you can predict the likely outcome of a race with certainty, it makes sense to place some bets.\n\n\n#7 Contingency\n\nSmart companies build in budget for the unknowns. Not just for the unfortunate eventualities associated with projects, but in anticipation of unforeseen opportunities. In this sense, a lack of planning can actually be a sign of maturity. It demonstrates an understanding of the realities of dealing with data day-to-day.\n\n\n#8 Imperfection\n\nPerfection can be a debilitating distraction. Maturity is recognising it’s better to do something with imperfect data, than waiting around doing nothing until the day it’s perfect (there’s a good chance you might never get there!). Make the best of dirty data and discrepancies. And forgive the occasional error - punishing mistakes is an innovation-killer.\n\n\n#9 Simplicity\n\nOur ninth and final sign of maturity is keeping things simple and elegant. Understanding less is more. Asking fewer questions, but the right questions. Don’t run the risk of over-engineering and over-complicating, applying resources to creating things that nobody can use - or will take too long, or cost too much to maintain. Simple is smart.\n\nThere you go. Momentum, consistency, urgency, action, integration, activation, contingency, imperfection and simplicity. How many of the nine signs do you see in your organisation? And what signs did we miss? Get in touch to explore how Measurelab might help you evolve your analytics capability."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/2021-year-review/#article",
      "headline": "2021: Measurelab’s year in review",
      "description": "A reflection on the year gone by and how far we’ve come as a company and team. From remote working to co-working, finding time for fun, and a growing appetite for GA4, we only mention Covid a few times.",
      "url": "https://www.measurelab.co.uk/insights/blog/2021-year-review/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/2021-year-review/#webpage"
      },
      "datePublished": "2021-12-17T13:37:09.000+00:00",
      "dateModified": "2026-01-27T11:25:02.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/measurelab-year-in-review_1200x400-blog-scaled.jpg",
      "author": {
        "@type": "Person",
        "name": "Dara Fitzgerald",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Google Tag Manager",
        "BigQuery",
        "Privacy",
        "SQL",
        "How-to"
      ],
      "articleBody": "I know I’m not alone in thinking how strangely time is running at the moment. 2020 seems like a complete blur, almost like it didn’t happen, but this year has seen us go from a winter lockdown, to ‘freedom day’, to now worrying about this new Omicron variant. Unlike last year though, I feel like 2021 has proved how much (for the most part) we have all adapted to Covid. This year-in-review is definitely not about Covid-19, honest. It would be hard not to mention it though when summing up how 2021 has been for Measurelab, or for anyone really.\n\nWe’re finishing the year as a team of 18. Some moved on, seeking something new, but we’ve had six new faces join us full-time. We welcomed Vanessa, Nick, Natalia, Katie, Matthew, and Elisa to the team. And we are very much looking forward to Scott starting in January. We will also be actively recruiting for analytics consultants, digital analysts and data engineers again soon.\n\n\nLocal, remote, and IRL\n\nJust to put another pound in the Covid swear jar, as a business there have been some silver linings to these “unprecedented times”. Vanessa, mentioned above, moved over to the UK from Brazil this year. When she first joined us, she was working remotely… from Brazil, meaning very early mornings for her!\n\nPre-Covid, all our recruitment was focussed not just in the UK, but local to the South East. Vanessa traveled the furthest, but it’s worth noting that none of our new starters this year are all that local to our HQ in Lewes (Katie is the closest and she’s in Worthing, so more than a stone’s throw). We have three people based in the greater Manchester area now too, and as a result of that, we signed up to Work.Life and have been using shared offices in both Manchester and London.\n\n\nMeetups and measureversaries\n\nWe are remote-first now, but we also have more options than before for people to work together, IRL, in an office. It’s not just about meeting up in offices though. We also set up a social committee, led by Natalia and Jake, who arrange something each month for us to get together outside of work. We call this our First Thursday Club and so far, we have bowled, bingoed, and battled big little cars (big compared to the original Scalextric). Many LOLs have been lolled, and although I am obviously very biased, I will put my neck out and say a healthy helping of fun has been had.\n\nWe’ve had two 5-year Measureversaries this year (sorry, not sorry), with both Daniel and Magda having seen plenty of change in their time at Measurelab. Magda also returned to us from maternity leave during the summer. I was personally so happy to have Magda back. Not only is she great to work with in general, but I was still leading one of our client accounts at that point, and Magda was an absolutely essential and rock-solid support to me on that; something she’s still doing now, just not with me. I’ve left that to someone far more energetic, efficient, and effective (aka Jake).\n\nSindhoora celebrated 3 years with us all the way back in March, so she’s closer to 4 years now. Victor and Dave both hit the 2-year mark this year, and Jake, Lace, Liam, and George all had their first candle on their cakes. Jake joined us right as we went into the first lockdown in March 2020, so I can only imagine what that was like. And for Lace, Liam, and George (as well as our new joiners this year), they have only known Measurelab since the dreaded C-word has been hounding us all.\n\nOn a personal note, I’ve changed my role this year. In May, I stepped into the Managing Director role. This blog isn’t about me though, so I’m not going to waffle about that here – we’ve posted previously about the shake-up at the top. What I will say is how much I’m relishing this new challenge for me and how excited I am to see Mark focus fully on technology and operations, doing what he loves best – solving problems with technology and systems. For me, it’s a genuine joy to work with everyone at Measurelab and I’m having fun figuring out how I can best help everyone and the company to succeed.\n\n\nMarketing and The Measure Pod\n\nWe ramped up our marketing efforts this year, something we intend to push even further in 2022. We published 18 blog posts throughout the year, covering a mixture of technical topics (including how-to guides like how to flatten tables in BigQuery and how to write a value to a cookie using GTM, and processes like our PIVOT framework for GA4 migration), opinion pieces (like the superpower of objectivity or who cares about data privacy?), and also some insight into who we are as a company and how we work (like our company values).\n\nWe also launched our podcast, The Measure Pod, and at the time of writing we have 20 podcasts live (a prize for anyone who correctly guesses the number of times Dan mentions GA4 across all 20). This was a daunting experience at first, as we had never done anything like this before. But Dan and I threw ourselves into it, and I have to give him the vast majority of the credit for this. All I do is show up and ramble on each week. Dan does all the editing and makes sure each episode is ready and available bang on time each Friday morning.\n\nThere’s a line in my intro that says we “try to have a little fun along the way”. Well, to be honest, recording the podcast each week has been a huge amount of fun. It’s basically like a big chat each time, and there are so many bloopers that always crack us up (usually at my expense, but I’m fine with that).\n\nTo support this increase in content, we’re trying to be more active on social channels and we’re also sending out our Random Forest newsletter again (sign up in the footer of our website if you’re interested).\n\n\nTime with the team\n\nSadly, I missed our last official social event of the year, the office Christmas party, as I tested positive for that fairly well-known, contagious respiratory disease. But fun was had and rumours suggest a hardy few ended up in a Brighton club until the early hours of the morning. Here they all are earlier in the evening, with appropriately fresh faces.\n\nThankfully, I didn’t miss our annual company away-day(s) a month ago – a thoroughly enjoyable couple of days. It started off with classic team-building exercises, including some top-quality, artistic storytelling, and group sharing of personality tests. On day two, we chased around London in groups, doing some high-tech AR secret agent missions.\n\nTasty food (more fish than we could handle, especially for the vegans) and plenty of drinks punctuated all the shenanigans, and we also ran our inaugural Company Values Awards. Before the event, we asked everyone to anonymously nominate one person for each award, with one award for each of our four company values. Our illustrious and deserving winners can be seen looking justifiably proud below. Left to right: Victor (Integrity), Sindhoora (Compassion), Jacob (Tenacity), and Daniel (Curiosity).\n\n\nReflecting on the year in review\n\nIt’s been a rollercoaster year but, on reflection, it has been very positive for us as a company and we have the memories to prove it. And we wouldn’t be here if it wasn’t for the commitment and dedication of our team and the loyalty and trust of our clients.\n\nI’m excited about what 2022 holds for us and it will be interesting to see what has changed when the time comes to write the next year-in-review 12 months from now. We’re seeing appetites sharpen for GA4 amongst our clients and, of course, this bridges a gap with BigQuery that existed previously with non-360 Universal Analytics. So, I foresee further growth in demand for data unification and advanced analytics in the year ahead.\n\nIn the meantime, to everyone reading this, have a safe and Merry Christmas and a very Happy New Year – from me personally and on behalf of the whole team here at Measurelab."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/enable-ga4-firebase-debugview-android-apps/#article",
      "headline": "How to enable the GA4/Firebase DebugView for Android apps",
      "description": "How to enable analytics debug mode on an Android device, using the GA4/Firebase DebugView to monitor app event data.",
      "url": "https://www.measurelab.co.uk/insights/blog/enable-ga4-firebase-debugview-android-apps/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/enable-ga4-firebase-debugview-android-apps/#webpage"
      },
      "datePublished": "2021-12-16T14:26:40.000+00:00",
      "dateModified": "2026-01-22T10:51:21.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/analytics-sub_gtm-1200x400-blog-2-1.png",
      "author": {
        "@type": "Person",
        "name": "Mark Rochefort",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Firebase Analytics",
        "How-to",
        "Google Analytics",
        "Debugging"
      ],
      "articleBody": "Want to know how to enable the GA4/Firebase DebugView for Android apps? Let's take you through the process step-by-step!\n\n\n1. Download and install Android Studio\n\nYou will need this to be installed even if the app is being developed in another framework or engine.\n\n\n2. Connect the Android device via USB\n\nPlug it in!\n\n\n3. Find the adb (Android Debug Bridge) tool\n\nThis is via the Command Prompt for Windows (cmd.exe), or the Terminal app for MacOS.\n\nPart of this install includes a tool called ADB (for \"Android Debug Bridge\"). It will be installed to your Android --> SDK folder --> Platform Tools Folder (which is referred to as [path_to_adb] below).\n\nTo get to that folder in the cmd/terminal window, use the command:\n\ncd [path_to_adb]\n\nFor me, on Windows was (assuming installed on C:):\n\ncd C:\\ProgramData\\Microsoft\\AndroidSDK\\25\\platform-tools\n\nAnd on MacOS was:\n\ncd /Users/mark/Library/Android/sdk/platform-tools\n\n\n4. Run adb with the relevant parameters\n\nThis is achieved by typing the following in the terminal, with the command prompt being at the location of the adb (as found above):\n\nadb shell setprop debug.firebase.analytics.app [package_name]\n\nSo if the [package_name] is com.my.app, you would use:\n\nadb shell setprop debug.firebase.analytics.app com.my.app\n\n(For MacOS, prefix the adb command with ./ to execute it.)\n\nIf you don't know what the app's package name is, you can run:\n\nadb shell \"pm list packages -f\"\n\nTo return a list of installed packages you can use to determine what the relevant package package name is.\n\nIf the app is available on the Google Play Store, you can also navigate to the app’s listing page via a web browser and look at the value for the id URL query string parameter. For example, play.google.com/store/apps/details?id=com.example.app123 where the app's package name is com.example.app123.\n\n\n5. Accept the connection on the device and verify\n\nIf the device hasn't been verified, you may find running this command prompts a verification dialogue on the device.\n\nIf successful, you will be able to see the device listed by running the following:\n\nadb devices"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/reasons-export-ga4-data-bigquery/#article",
      "headline": "10 reasons to export your GA4 data to BigQuery",
      "description": "There are a lot of benefits to linking your GA4 data to BigQuery – we’ve got ten good reasons for you to take your analytics to the next level today.",
      "url": "https://www.measurelab.co.uk/insights/blog/reasons-export-ga4-data-bigquery/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/reasons-export-ga4-data-bigquery/#webpage"
      },
      "datePublished": "2021-11-25T10:35:29.000+00:00",
      "dateModified": "2026-01-27T11:25:02.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/measurelab-blog-ga4-streaming-to-bigquery_1200x400-blog-2-3.png",
      "author": {
        "@type": "Person",
        "name": "Lace Rogers",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "BigQuery",
        "Google Analytics",
        "Looker Studio",
        "Google Cloud",
        "SQL",
        "AI & ML",
        "Google Ads"
      ],
      "articleBody": "At Measurelab we love BigQuery and Google Analytics. It’s our ‘thing’. We're continually looking at ways to use these tools to make our analysis and reporting even better.\n\nLuckily, Google has made this super-easy by providing all Google Analytics 4 properties with a way to export daily and real-time data into BigQuery - free. The storage of this data is cheap as chips and allows you to enrich and leverage your web and app data to build data-driven solutions and optimisations. A winner all round. Let’s take a look at why you might want to connect and begin exporting your GA4 data to BigQuery today.\n\n\nExporting GA4 data to BigQuery\n\n 1. You can store and retain all of your data without it expiring, unlike Google Analytics 4, which will delete data outside of the Data Retention window. The export to BigQuery only begins from the point you set up the connection – set it up today so that you can use the data whenever you’re ready.\n\n 2. It really doesn’t cost much. The Google Cloud Platform provides a free allowance each month for each project, and normally you shouldn’t expect storage to cost much more than $2 per day (that’s assuming you have 100k users per day, each logging 100 events over 2 years, using the GCP Pricing Calculator).\n\n 3. You can take the opportunity to clean your data, which means that pesky “faceboook” UTM can be amended to the correct name, and you can also generate custom campaign and channel groupings that align to your marketing strategies.\n\nGet more insight into your most important user journeys\n\n 4. You can create (and retrospectively apply) as many conversions as you like. You can even test out new conversions before adding them directly into GA4.\n\n 5. You can join your GA4 data with other data to get a more holistic view of your KPIs and user journeys. Just imagine being able to add your advertising revenue, CRM data, and other sources to your online data and what you could do with that!\n\n 6. Perform advanced analysis the way you need to, including user journey analysis, attribution modelling, Customer Lifetime Value (LTV), retention and churn predictions, and so much more (the list is almost infinite).\n\nThe benefits of analysing Google Analytics data in BigQuery\n\n 7. Create super fast reports and dashboards within your preferred data visualisation and BI tools. No more tedious waiting around for reports to load.\n\n 8. You can easily use tools such as Python, R, SAS, and BigQuery ML (machine learning) to build powerful advanced analytics models – to help develop towards a more data-driven organisation.\n\n 9. Data can be fed back into GA4, Google Ads, or even to other on-prem and cloud services such as AWS and Azure.\n\n 10. Save time on all the manual, repetitive reporting jobs. Automate and schedule your reporting so that your team can get on with focusing on actually using the data to optimise and drive change.\n\n\nMove your GA4 data to BigQuery today\n\nThere are so many reasons to connect and export data from Google Analytics 4 to BigQuery. What are you waiting for?\n\nGet in touch to speak with one of our Analytics Consultants about how this can work for your team and how to get started today."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/set-cookies-custom-html-tag/#article",
      "headline": "How to write a value to a cookie using GTM",
      "description": "Learn how to create and set cookies using Google Tag Manager using this simple script and a Custom HTML tag.",
      "url": "https://www.measurelab.co.uk/insights/blog/set-cookies-custom-html-tag/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/set-cookies-custom-html-tag/#webpage"
      },
      "datePublished": "2021-11-10T12:08:54.000+00:00",
      "dateModified": "2025-07-31T20:36:09.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/analytics-sub_gtm-1200x400-blog-1-1.png",
      "author": {
        "@type": "Person",
        "name": "Victor Sarker",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "How-to",
        "Google Tag Manager",
        "Privacy",
        "Testing"
      ],
      "articleBody": "Guide\n\nIf there is a value stored in a variable (either as a Global JavaScript variable on a webpage or as a Variable within GTM) this can be written to a browser cookie using the following code using a Custom HTML tag:\n\n<script>\n  (function (cookieName, cookieValue, expirationTime, domain) {\n    var date = new Date(); \n    date.setTime(date.getTime() + expirationTime); // Sets expiration time (Time now + expiration time)\n    var expiry = date.toUTCString(); // Converts cookie expiry to UTC time string\n\n    document.cookie = cookieName+\"=\"+cookieValue+\"; expires=\"+expiry+\"; path=/; domain=\"+domain+\"; SameSite=None; Secure\"; // Sets cookie in browser\n    return;\n  })(<MY_COOKIE_NAME>, <MY_COOKIE_VALUE>, <EXPIRY_IN_MILLISECONDS>, <DOMAIN>); // pass cookie arguments here\n</script>\n\nEdit the placeholders in Line 9 with the 4 required arguments (as denoted by the placeholders in <ANGLED_BRACKETS>):\n\n 1. cookieName: This is the name of the cookie that will be created. Only use alphanumeric US-ASCII characters.\n 2. cookieValue: This will be the value that you want to set. This must be a string type and can take any US-ASCII characters excluding control characters, Whitespace, double quotes, comma, semicolon, and backslash.\n 3. expirationTime: This is the cookie expiry time in milliseconds. This must be an integer type.\n 4. domain: This is the domain that the cookie will be hosted on. For example, to set a cookie for the Measurelab website and all of it’s subdomains, use: \".measurelab.co.uk\"\n\nAttach the appropriate trigger to the tag to signify when the cookie should be set. Ensure that when the trigger is made that the value being set in the cookie is available. For example, if scraping a value off the webpage document, ensure that the tag is fired once the DOM is ready and the value/variable is defined.\n\nFinally, test in Preview Mode and Publish.\n\n\nPrerequisites\n\nEdit access to a GTM Container and the necessary values in place to set the cookie.\n\n\nUse cases\n\nEnsuring a User ID that is set when a user logs in on a particular subdomain is available on another subdomain."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/superpower-objectivity/#article",
      "headline": "The superpower of objectivity",
      "description": "The do-it-yourself approach to data-driven organisational change can be daunting – an objective consultant, removed from the day-to-day operations of the business, can take more risks.",
      "url": "https://www.measurelab.co.uk/insights/blog/superpower-objectivity/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/superpower-objectivity/#webpage"
      },
      "datePublished": "2021-11-08T09:43:42.000+00:00",
      "dateModified": "2025-07-31T20:36:09.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/measurelab-blog-superpower_1200x400-blog-3.png",
      "author": {
        "@type": "Person",
        "name": "Dave Beatty",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "BigQuery"
      ],
      "articleBody": "When working with a consultancy firm, the typical benefits you might look for are likely some combination of relevant expertise and available resources. You may be looking to level up the skills within your business, or you may be looking to ease the pressure on a stretched team.\n\nAs Analytics Consultants, we have a wealth of specialised experience that we can bring to bear on your business. However, working with a consultant also brings a hidden benefit that you may not have thought of: the superpower of objectivity.\n\nLet me explain.\n\nWhen it comes to your company’s data strategy, you can play it safe, or you can place some big bets. The currency you are using in this wager is your professional reputation and internal standing.\n\n\nDigital transformation can be daunting\n\nSmall, iterative changes will most often lead to small, iterative results. These are safe, they're unlikely to rock the boat or get you in trouble, and will give you a solid basis for any career.\n\nBut, what if you want to take something to the next level, quickly? What if you want to revolutionise your company's use of reporting? To do this, a lot of change will need to happen quickly. You might want to implement GA4, to build a data warehouse, and pivot away from a whole load of Excel reports that have \"worked just fine\" for several years.\n\nBy doing something dramatic, you could genuinely catapult your company’s efficiency and profits by taking control of data. You could roll out a whole suite of reports that fundamentally improve the way decisions are made across the business. You could be the author of this change – you could reap the benefits.\n\nBut, it might not work. It might be delayed, it might turn out to be more complex than you thought, reports may break, stakeholders may be upset. It can be easy to see why now is not the right time, why it’s better to put this on the backburner for the time being. Just get a few reports out – let’s think about it next year.\n\n\nAccess an objective outsider’s experience and expertise\n\nHow do I know this? I’ve worked as an in-house analyst. These have been my thoughts, my worries, my concerns. Knowing I could be doing something better, but not quite knowing how to get there.\n\nIt’s not just me. Every team member at Measurelab has previously worked in an analytics function in an agency or as an in-house analyst. We get it. And this is where our superpower of objectivity can help.\n\nAs a consultant, because it’s not my business, it’s not my team, and it's not my boss who will give me a hard time, I'm less susceptible to the thoughts and niggles that might lead me to talk myself out of a bolder solution. I can objectively look at the most effective path to level up your data strategy without considering the risks in the same way.\n\nTo be clear – I am not implying that I don’t care about the risks to my clients’ businesses or that I make flippant decisions or recommendations – I care very deeply about the work I do. And that’s precisely it. I care about the work.\n\n\nThe power of an Analytics Consultant in driving change\n\nDriving change like this is a high stakes game – it's a high reward, but it’s a high (professional) risk. As Analytics Consultants, we're able to suggest higher risk solutions because it's not our entire job or career on the line.\n\nWe're also able to shoulder this risk on behalf of our clients – they can suggest something risky that might disrupt things internally because it's us recommending it. If it goes wrong or doesn't work well, then it’s quite rightly our responsibility to fix it.\n\nWorking with Measurelab isn’t just about technical skills or experience in software – it’s about gaining access to someone who can see things from a degree of distance and act as a lightning rod for risk.\n\nIt’s about gaining access to the superpower of objectivity."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/key-kpi-metrics/#article",
      "headline": "Key KPIs, ATM machines and other such nonsense",
      "description": "All KPIs are metrics, but not all metrics are KPIs. Are they key to the business’ success? Or do they contribute to it? When it comes to analytics, not all performance indicators are critical.",
      "url": "https://www.measurelab.co.uk/insights/blog/key-kpi-metrics/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/key-kpi-metrics/#webpage"
      },
      "datePublished": "2021-10-06T09:13:22.000+00:00",
      "dateModified": "2026-01-27T11:25:03.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/measurelab-kpi_1200x400-blog-4.png",
      "author": {
        "@type": "Person",
        "name": "Daniel Perry-Reed",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Google Ads"
      ],
      "articleBody": "Something you may or may not be aware of is RAS syndrome (Redundant Acronym Syndrome). This is where an acronym is used but either the first or last word is used again anyway – RAS syndrome is itself afflicted ironically!\n\nSome of the common ‘mistakes’ we all make (guilty as charged) are:\n\n * COVID disease\n * HIV virus\n * ATM machine\n * PIN number\n * DC comics\n\n<rant>\n\nThe worst offender though has to be the ‘Key KPI’, which I hear more often than I’d like, working in analytics. Just to be super clear, KPI stands for Key Performance Indicator.\n\nChristopher Penn puts it nicely, defining a KPI as:\n\n“A number for which you will get a bonus or fired.”\n\nSo what is a ‘key’ KPI? My theory is that it’s a symptom of overusing the term ‘KPI’ when referring to any and all metrics, or performance indicators.\n\nI’m sure most of us have used some form of project management tool like Jira, and have seen cases where the ‘high priority’ flag has been abused. This means that to escalate a real high priority item, something even grander must be used – a ‘highest priority’ if you will. But then what if that gets overused too? A ‘super-duper highest and of most importance priority’?\n\nWhen it comes to looking in Google Analytics, it’s not uncommon to hear people referring to some of the out-of-the-box metrics such as Bounce Rate, Sessions, Average Session Duration, etc. as KPIs. I’m not saying that they can’t be KPIs, but my money is on them not being all that ‘key’.\n\nOur co-founder Mark Rochefort wrote an article on analytics planning back in 2013 (an oldie but a goodie – the article, that is) which details in part the approach to figuring out what is a KPI and what is not. Mark suggests starting with the business strategy, then identifying supporting strategic goals. Your key performance indicators should be the metrics that best indicate your success in achieving these goals. Supporting metrics can be used to measure the many drivers that contribute towards the KPIs.\n\nThe distinction between a KPI and a supporting metric is important here. A KPI is “a number for which you will get a bonus or fired”, so is something like Bounce Rate something you would get fired over? Definitely not! If you would, then it’s probably worth looking elsewhere anyway (shameless plug – how about then working with us?)\n\nI’m not saying Bounce Rate is not a decent metric or performance indicator in its own right, it’s just not integral or ‘key’ to the business’ success – it’s not a KPI.\n\nThe definition can also get a bit fuzzy when talking across functions, roles, departments, agencies, etc. For example, a KPI for measuring your PPC agency’s success could be CPC (cost per click), but that would probably not make the cut when looking holistically across the entire business. The agency, marketing manager, CMO, board of directors, et al will all have their own view of what is a KPI and what is a metric (supporting or not).\n\nThe stumbling block here is really in the language we use. Just because something is my KPI, does not make it everyone’s (or a business) KPI.\n\nLet’s try to be more considered and deliberate when using the term ‘KPI’ to avoid having to one-up the language and start having to use terms like ‘key KPI’ or ‘main KPI’. Please.\n\n</rant>\n\nIf you're questioning what your marketing, website, or app KPIs should be, we can help. We run workshops to create measurement frameworks that support companies and teams knowing what is and is not important in ‘moving the needle’.\n\nGet in touch to chat with one of our Analytics Consultants to see how and where we can help ensure you fully trust your data, and how you can use it to make better decisions."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/company-values/#article",
      "headline": "How core values define a company",
      "description": "At Measurelab, we look to our company values to drive the company culture. The whole company has to feel connected to these core values; they have to mean something to everyone.",
      "url": "https://www.measurelab.co.uk/insights/blog/company-values/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/company-values/#webpage"
      },
      "datePublished": "2021-09-28T08:38:39.000+00:00",
      "dateModified": "2026-01-27T15:43:19.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/measurelab-blog-co-values_1200x400-blog-2.png",
      "author": {
        "@type": "Person",
        "name": "Dara Fitzgerald",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Measurelab"
      ],
      "articleBody": "On The Measure Pod recently, we talked about what makes a good analytics consultant. I mentioned that beyond the technical skills and knowledge needed, we also look to use our company values to assess potential new additions to the Measurelab team. This prompted me to share a bit about what our company values mean to us, give some context on how we got to them, and how we use them.\n\nGoing way back, just for a minute, Mark and I started Measurelab almost 8 years ago to the day. We set out with a pretty simple mission: we wanted to create the kind of company that we would want to work for. So from the off, we wanted to do really great work with even greater people. We wanted to create a working environment that focussed on collaborative problem solving and continuous learning, and we wanted to do this with integrity and without pretence. We didn’t want to overpromise, underdeliver, or treat anyone in a way we wouldn’t want to be treated ourselves.\n\nA few years ago, we did an all-company exercise to come up with a ‘working agreement’.\n\nThis was created by all of us (at that time) and was used to ensure we were all working together as we agreed we should. It worked because everyone contributed to it, and agreed to abide by it. It was like an internal social contract. Here’s what we came up with:\n\n1 – Be open to constructive feedback\n\n2 – Show enthusiasm and interest\n\n3 – Accept and share failure\n\n4 – Learn from it!\n\n5 – Respect and empathise with all\n\n6 – No questions go unanswered.\n\n\nHow company values drive behaviours\n\nMark and I would occasionally remind people why we’d started Measurelab and what was important to us at the time, but we realised that as well as the working agreement, we needed to have a clear set of company values. We had our thoughts on this, and these thoughts formed part of the emerging culture at Measurelab.\n\nWe wanted the whole company to feel connected to these values though. Just like with the working agreement, it needed to mean something to everyone. So, we had another one of our all-company workshops to brainstorm what would become our core company values.\n\nThese are not set in stone but they do represent what’s most important to us right now. If we change, they might change too – and everyone at Measurelab will be a part of that. They should evolve as we do: for the people, by the people.\n\nIntegrity 😇\n\n\"We are genuine and we do our best.\"\n\nThis one doesn’t take much explaining: we ask people to try and do the right thing – to be honest with each other and do what is best for our clients.\n\nA very recent example of integrity in action was when we told a client, who was asking for a data warehouse, that they didn't need one to achieve their current goals. We didn't think they'd see the ROI at this point in time and so advised against what might have been a profitable project for us.\n\nTenacity 💪\n\n\"We strive to overcome problems.\"\n\nWe all love to solve problems. It’s why we chose to work in digital analytics. Here are a couple of examples of tenacity in action from our Slack appreciation channel:\n\n“Shout out for taking the time to show me how to approach a specific issue I had, and running through all the options with me. Showed me some cool tips and functions in BQ (which will make my life easier for other random stuff going forward!) Showed strong signs of tenacity, being determined to help me and get the solution!”\n\n“Shout out for working TIRELESSLY for the past couple of months, keeping multiple plates spinning, and ensuring that our clients are kept happy. You are like a beacon of compassion at Measurelab. You do your job with a smile, bringing the whole team along with you, and keeping everyone motivated. Thank you for working so hard.”\n\nCompassion 💚\n\n\"We assume everyone is trying their best and treat them kindly and with respect.\"\n\nCompassion is one of the values that seems baked into a lot of the feedback shared on our Slack appreciation channel, with people thanking others for going above and beyond to help them solve problems, and for being willing to share their knowledge so openly and readily. Reading these examples always puts a big smile on my face as this is exactly the kind of environment we set out to create.\n\nCuriosity 🤓\n\n\"We continually seek to learn new things and see every task and interaction as a learning opportunity.\"\n\nWe always look to hire people who are fascinated by the world of analytics and hungry to learn more – not just about the data and technology, but how they can be applied in the real world.\n\nA recent example of curiosity that I had the joy of witnessing first-hand was seeing a colleague take on work that isn’t strictly within our core offering. It was another business unit within an existing client, and although it involved data analysis and reporting, they weren’t using website analytics data. This didn’t phase them in the slightest though, and they are now up and running with this work, really enjoying the variety of it, and delivering great work to a happy client.\n\n\nReinforcing our core values\n\nWe’ve recently stepped up our game in terms of talking about these values internally and linking them to our daily work. We now have a Slack channel for saying thank you, with the idea being that people will show appreciation and thanks to each other for demonstrating the company values.\n\nWe want to encourage, recognise, and reward the behaviours that reflect these values, without being too contrived. One of the things that I enjoy most at Measurelab is seeing these values demonstrated naturally by people in their everyday work and their interactions with both colleagues and clients.\n\nThis isn’t something to get complacent about though, so I know there’s more we can do to encourage everyone to live and breathe these values at Measurelab. We have some thoughts on this that we’d like to explore and experiment with in due course.\n\nCompany culture plays a huge role in career satisfaction, and nothing impacts culture more than a company’s values. If our values and what they mean to us strike a chord with you, then why not check out our current roles at Measurelab?"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/experiment-canvas/#article",
      "headline": "Everything’s an experiment",
      "description": "Everyone in the team has ideas for how we can optimise the organisation. Here’s how we use an Experiment Canvas and Experiment Board to prioritise and manage change at Measurelab.",
      "url": "https://www.measurelab.co.uk/insights/blog/experiment-canvas/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/experiment-canvas/#webpage"
      },
      "datePublished": "2021-09-21T09:47:18.000+00:00",
      "dateModified": "2026-01-27T15:47:34.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/blog-experiments_1200x400-blog-1.png",
      "author": {
        "@type": "Person",
        "name": "Steven Elliott",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Measurelab"
      ],
      "articleBody": "Measurelab as an experiment\n\nThe founding hypothesis? Two handsome young(ish) bucks can escape the grind of the digital agency world and make a living providing no-nonsense analytics consulting from the rural idyll of Lewes.\n\nEight years later, the hypothesis has been validated. Measurelab has flourished, but still remains a work-in-progress. The company has grown and evolved, but so has the realm of digital marketing and measurement. The aspirations and expectations of people have also shifted: not least how, where and when they work.\n\nWe’re in the business of analytics consulting. This isn’t Coca-Cola or KFC - our original 'recipe' for success has to be continually tweaked to account for changing tastes.\n\nNaturally, everyone at Measurelab has their ideas and opinions on how we might adapt the formula to make things better - and who better to trust than the people doing the work? But continually evolving roles, processes and ways of working can be disorienting and anxiety-inducing.\n\nTo help us manage organisational change, we borrowed from the world of analytics and introduced our very own pseudo-scientific system: the Experiment Canvas and the Experiment Board.\n\n\nThe Experiment Canvas\n\nThe canvas is simple enough. The template will be familiar to those who have worked in Conversion Rate Optimisation (or studied GCSE chemistry).\n\nAnyone in the company with an idea they want to bring forward - work or play, big or small, serious or silly - can complete a canvas. Find the Google Slides template here.\n\n\n\n\n\n\n\n\nThey’ll need to provide some relevant Background on what’s happening now, state their (falsifiable) Hypothesis, and propose the Details of what they actually want to do to test it - ideally including any resource or funding requirements. They have to specify a Start & Finish, so the experiment is time-bound, rather than open-ended.\n\nThe Owner is usually the person completing the canvas, but in some cases, the experiment might be adopted by a more senior ‘sponsor’. Let’s park the Results, Conclusion & Recommendation and Next Steps for now. These sections only have to be filled in once the experiment has run its course - typically one to three months.\n\n\nThe Experiment Board\n\nThe canvases are added to a kanban board, which enables us to periodically review new Ideas as a group, moving them into the Backlog if there are no objections (there rarely are) before voting on which should be prioritised and pulled into the Doing column.\n\nOperating transparently gives everyone a say and an opportunity to bring about positive change. The kanban process helps ensure there’s not too much distraction or diversion at any given time - although if something is obvious, urgent or requires minimal effort, we’ll often just let the owner crack on with it.\n\nExperiment owners are expected to oversee the experiment, then report back to the group on their observations and outcomes. They’ll recommend we Discard the idea if it’s failed to deliver as hoped, to Iterate if it’s worthwhile adapting the approach in pursuit of the goal, or to Scale if it’s been a success i.e. formally incorporate into our way of working.\n\n\nAn experimental process\n\nThat’s the theory at least. At the risk of getting ‘meta’, the whole thing is still an experiment itself! We’ve not been reviewing the board so regularly since going fully remote. Ironically, we’re not always as disciplined about measuring and reporting on results as we might be. And it has been suggested the requirement to create a canvas may inhibit spontaneous innovation, rather than encourage it. But we’ve seen enough value in the process to continue iterating for now.\n\nWe’ve had experiments designed to help us carve out more focus time, tried “work-swap Wednesdays”, trialled a mentoring scheme, and implemented a tool to facilitate more frequent company health checks. Right now, we’re running three experiments to test how we can better support each other as we work as a distributed team.\n\nHow do you encourage and manage experimentation in your company or team? Is it top-down or bottom-up? Do you have a formal process or do you just wing it?"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/pivot-ga4-migration-process/#article",
      "headline": "PIVOT: a five-step process for your GA4 migration",
      "description": "If you’re migrating from Universal Analytics to Google Analytics 4, our PIVOT framework provides guidance on what you’ll need to consider at each stage of the process. See our GA4 migration guide.",
      "url": "https://www.measurelab.co.uk/insights/blog/pivot-ga4-migration-process/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/pivot-ga4-migration-process/#webpage"
      },
      "datePublished": "2021-09-03T09:33:38.000+00:00",
      "dateModified": "2026-01-27T11:25:03.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/microsoftteams-image-8.png",
      "author": {
        "@type": "Person",
        "name": "George Mendham",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Looker Studio",
        "BigQuery",
        "How-to"
      ],
      "articleBody": "There are many famous acronyms designed to help people follow a recommended procedure. For example, ‘DR ABC’ is commonly used by first responders to help them triage and treat patients. Now we’re definitely not suggesting our new PIVOT acronym will save lives, but it could save you time (and probably a few headaches!) when migrating to Google Analytics 4 (GA4).\n\nPIVOT. Plan, Implement, Validate, Onboard, Transform. It sounds simple, maybe even a bit obvious. We prefer the term ‘delightfully intuitive’. It’s helping us and our clients understand what phase of a GA4 migration they’re currently in and what they need to do to progress smoothly to the next.\n\nYou can download a PDF of the PIVOT migration framework featuring a summary of the key tasks, our top tips and potential pitfalls. We've also summarised each stage in the process in this blog - just scroll down the page 👇\n\n\nPlanning\n\nFailing to plan is planning to fail, right? Will your aim simply be to replicate your current UA set-up, recreating existing events within the new GA4 taxonomy? Or will you seize the opportunity to define an entirely new analytics strategy? Is this the time to finally bring web and app analytics together? Don’t miss the opportunity presented by a blank canvas, but beware of planning paralysis and an unnecessary delay to beginning dual tracking.\n\n\nImplementation\n\nWith a clear, comprehensive plan, implementation can be swift and painless. New GA4 properties and data streams can be set up, with the enhanced measurement events, recommended events and custom events implemented in turn. Perhaps you’ll take the opportunity to spring clean those containers. Where it gets messy is when you start making decisions on the fly or expanding the scope as you begin to discover what’s actually possible.\n\n\nValidation\n\nThe data is streaming. The moment of truth. Are your UA and GA4 properties returning consistent counts and matching metrics? Or is there a disparity you need to explore and explain? One thing’s for certain: you’ll want to have complete confidence in the data before exposing it to scrutiny - or using it as the basis for optimising investments.\n\n\nOnboarding\n\nIt’s time to extend access and roll out the new reports and dashboards. Training may be required to familiarise users with the new schema, interface and capabilities - as well as explaining what’s missing, “Where’s the bounce rate gone?!” Your UA reports may need to be maintained for some time before GA4 becomes your sole ‘system of record’.\n\nEven now, GA4 is evolving and advancing, so it’s worth considering how you can go about providing regular updates, and how you’re going to collate and prioritise the new requests that will undoubtedly come your way.\n\n\nTransformation\n\nThis is where it gets interesting. The free built-in connector to Google BigQuery data warehouse opens up a number of new possibilities. For starters, you’re able to overcome the limitations of sampling in Google Analytics and analyse across an unlimited number of custom dimensions. It becomes truly transformative when you combine your web and app analytics data with campaign data, CRM and ERP data, and other data sets and make the leap from descriptive to predictive analytics.\n\n\nWhere are you on your GA4 journey? Whether you’re pondering the P, vacillating with the V, or tempted by the T, we can probably help you PIVOT. Get in touch to chat about your requirements.\n\n"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/customising-event-parameters-ga4/#article",
      "headline": "GA4 event parameters - now with extra pickles!",
      "description": "Google Analytics offers unlimited options for customising your event parameters. George explains how you can get yours made to order.",
      "url": "https://www.measurelab.co.uk/insights/blog/customising-event-parameters-ga4/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/customising-event-parameters-ga4/#webpage"
      },
      "datePublished": "2021-08-19T10:38:51.000+00:00",
      "dateModified": "2026-01-27T11:25:04.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/measurelab-blog-ga4-with-pickles_1200x400-blog.png",
      "author": {
        "@type": "Person",
        "name": "George Mendham",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics"
      ],
      "articleBody": "As mentioned in an episode of The Measure Pod, GA4 is a big change for those of us who are so used to Universal Analytics. It took me a while to wrap my head around the disappearance of Event Category, Action, Label and the adoption of Event Names and Parameters but then it occurred to me, the easiest way to think about this was to keep in mind the extra pickles. Bear with me, this will make sense.\n\nWhenever I fancy a burger, I go to Five Guys. The level of customisation is above any other chain or restaurant (and the food is so much better!). I always add extra cheese, extra bacon and extra pickles. I don’t know if you've ever really inspected a receipt from Five Guys, but they generally look something like this.\n\nThe main line items are ‘Hamburger’ or ‘Bacon Cheeseburger’ and then the additional information, such as extra cheese, extra bacon, mayo, lettuce and pickles all sit beneath. This is how I imagine GA4 events and parameters.\n\n\n<script>window.dataLayer = window.dataLayer || [];\ndataLayer.push({  'event': 'search',  'search_term': 'what’s the difference between pickles and gherkins',   });\n</script>\n\nFor example, you may have a ‘search’ event as a main line item. Underneath, you can add additional extras, or parameters, such as ‘search_term’.\n\nNot every item needs ‘extra pickles’. I’ve found the ‘login’ event doesn’t really need any additional parameters. Sure, you can add ‘method’ as Google recommends but it’s not always useful/relevant.\n\nThis level of customisation is so different from Universal Analytics.\n\nIn Universal Analytics we’re restricted to using Event Category, Action and Label. So maintaining the Five Guys analogy, if our Event Category was ‘Burger’ our Event Action would be ‘Cheese’ or ‘Ham’ and we’d then use the Event Label to store customisation. We’d end up with an Event Label looking something like ‘Extra Bacon | Extra Cheese | Extra Pickles | Lettuce’ etc. With all the information concatenated into one string rather than their own parameters, it becomes a nightmare to analyse.\n\nHopefully at this point the extra pickles analogy makes sense and I’ve not just made you all really crave a Five Guys. Thinking of GA4 events and parameters like this may help you get your head around the new structure and appreciate the potential for customisation within GA4."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/getting-started-google-bigquery/#article",
      "headline": "Getting started with Google BigQuery",
      "description": "BigQuery is literally the next “Big” thing (with a capital B) in analytics. We explain what it is, how some of our clients are already using it, how much it costs and where you can start.",
      "url": "https://www.measurelab.co.uk/insights/blog/getting-started-google-bigquery/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/getting-started-google-bigquery/#webpage"
      },
      "datePublished": "2021-08-18T16:50:01.000+00:00",
      "dateModified": "2025-07-31T20:36:14.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/measurelab-blog-ga4-streaming-to-bigquery_1200x400-blog.png",
      "author": {
        "@type": "Person",
        "name": "Lace Rogers",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Data Analysis",
        "Google Analytics",
        "Looker Studio",
        "BigQuery",
        "Google Cloud",
        "SQL",
        "AI & ML",
        "Marketing",
        "Google Ads",
        "How-to"
      ],
      "articleBody": "What exactly is Google BigQuery?\n\nAs you might imagine, Google has A LOT of data: device installation data, crash reports, spam within Gmail and petabytes more. To store and analyse this data they developed an internal tool called Dremel. The architecture of Dremel was optimised for the analysis of billions of rows of data at lightning-fast speeds.\n\nIn 2011, Google released BigQuery, the “external version” of its home-brewed Dremel, allowing customers to store and analyse their data in the cloud - the Google Cloud Platform (GCP) to be precise.\n\nBigQuery data warehouses are highly secure and available. They can easily ingest data in a variety of formats, from multiple sources, which can then be queried using SQL, Python, SAS and R, and/or visualised using tools like Google Data Studio, Looker and Power BI.\n\nWith such a powerful platform and a plethora of possibilities, where and how do you get started exploring the potential?\n\n\nBegin with Google Analytics 4 data\n\nUnlike Universal Analytics (UA), the recently-released Google Analytics 4 (GA4) won’t store your data indefinitely. Boo! However, Google does offer a native (and free) connection between GA4 and BigQuery to allow you to stream and store all your raw event data. Yay!\n\nThere’s no backfill for historical data already collected in GA4, so it’s best to connect ASAP. Once connected, BigQuery enables you to preserve an unlimited historical view of your web and app data (without the constraints of sampling).\n\nYou now have the opportunity to correct any errors or inconsistencies and to analyse across an unlimited number of custom dimensions using super-fast SQL. It also gives you the opportunity to experiment with Google’s rapidly advancing out-of-the-box machine learning models - once there’s sufficient data to work with.\n\n\nCombine old and new web analytics data\n\nAfter implementing a new Google Analytics 4 property, one client was keen to see how KPIs like session counts and page views were tracking versus historic benchmarks created using data from Universal Analytics.\n\nWe used a proprietary data pipeline for a one-off import of the historical UA data into BigQuery. Once validated, we set about mapping and joining the UA data with the GA4 data in a single table.\n\nUsing this table as the source, we were able to build a reporting dashboard in Google Data Studio so the client could see for themselves how performance is trending month-on-month and year-over-year. They can now gauge the impact of their optimisation efforts as fresh GA4 data is added daily through the built-in connector.\n\n\nOptimise digital marketing performance\n\nEven though it’s designed to be a marketing tool, we often find Google Analytics is underused when it comes to digital campaign measurement.\n\nOne particular client was unable to tell which of its digital ads were over-or under-performing. With no associated spend tables, they had no way to optimise their investments based on outcomes.\n\nThe solution we proposed was a “lean” BigQuery data warehouse. We first ingested campaign data including impressions, clicks and spend from Google Ads and Facebook, before stitching it together with Google Analytics data in a single table. Our advanced analytics consultants then built a suite of reports to enable in-house analysts to independently evaluate end-to-end performance, with the ability to drill down by geography, channel, campaign and creative execution.\n\nWith this level of insight, it’s no surprise the client has been able to reduce marketing spend significantly while continuing to improve yield.\n\n\nGo further down the funnel: integrating CRM data\n\nWith data stuck in disparate files on various peoples’ drives, this client had no way to fully understand and analyse customer profiles, behaviour and spending patterns. Sound familiar?\n\nMeasurelab was tasked with importing and joining multiple CSV files together to gain a single customer view. The solution had to allow for regular updates to the CRM data and future enrichment with additional data sources.\n\nOur engineers were able to automate the process for ingesting the data from CSV files, then normalising it using a combination of GCP tools and Python. Funnel was used to pipe in additional data from social media channels, so it could be combined in the BigQuery data warehouse. Our team of advanced analysts were then able to create reports providing the required customer insight and build models to estimate future demand.\n\n\nHow much does BigQuery cost?\n\nNot as much as you might think/fear.\n\nYour first 10 GB of data storage is free, then it’s 2 cents per additional gigabyte. Google charges 1 cent per gigabyte for “inactive” data that has not been updated in 90 days. As for data-processing costs, the first 5 terabytes costs $5, then it’s $5 per additional TB.\n\nTo put this into context, a single GA4 property with 45 million events per month would have a monthly storage cost of between $3-10 - about the price of a London pint (or a round in Wetherspoons).\n\nIt’s easy to track costs via the GCP interface, but if you prefer, there’s a Cloud Billing data export to BigQuery, which can be connected to your preferred reporting tool. We track our clients’ BigQuery spend at Measurelab in this exact way.\n\n\n\nHow you can get started\n\nAs you might expect, it’s worth spending a bit of time up-front to ensure you set out on the right foot. We recommend an initial consultation to understand what you’re looking to achieve, where exactly you want your data located and who’s going to need to access it.\n\nWe can then set up a GCP project and BigQuery instance on your behalf, or walk your team through the process. We’ll ensure you have billing and access set up correctly, with documentation and guidelines for naming conventions in place, before we begin streaming in the GA4 data. Finally, we can run GA4 and BigQuery training sessions with your team to familiarise them with the interface and open their eyes to what’s possible.\n\nKeen to get started on your BigQuery adventure? Get in touch today."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/how-to-flatten-table-with-user-defined-functions-in-bigquery/#article",
      "headline": "How to flatten tables with user-defined functions in BigQuery",
      "description": "Flattening tables in Google BigQuery can be painful when doing multiple fields with UNNEST. User-defined functions (UDFs) make life easier and this one will do it for you automatically.",
      "url": "https://www.measurelab.co.uk/insights/blog/how-to-flatten-table-with-user-defined-functions-in-bigquery/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/how-to-flatten-table-with-user-defined-functions-in-bigquery/#webpage"
      },
      "datePublished": "2021-08-12T09:27:00.000+00:00",
      "dateModified": "2025-07-31T20:36:14.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/analytics-subject_1200x628_li-1.png",
      "author": {
        "@type": "Person",
        "name": "Lace Rogers",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "How-to",
        "BigQuery",
        "Google Analytics",
        "Google Cloud",
        "Firebase Analytics"
      ],
      "articleBody": "As we all know Google is continuously improving and expanding the Google Cloud Platform and BigQuery has truly benefited from this. It's taken a simple scalable data warehouse into what is now a comprehensive and dynamic system. As you may guess, I’m a massive fan of BigQuery and it's user-defined functions.\n\nBigQuery offers a huge amount of functionality including Data Definition Language (DDL) and Data Manipulation Language (DML), however, sometimes there simply isn’t the function to help you complete what you are doing. Often in the past, I would end up accessing BigQuery via Python or SAS and applying the missing function.\n\nUser-Defined Functions (UDFs) cover some of the current gaps, and since they are now persistent (I’ll explain this further later), you can share and re-use these with your colleagues.\n\nWhat is a UDF?\n\nA UDF simply is a function you create that applies a logic not available within the standard SQL function to your data. Generally, you will be using JavaScript, SQL, Simple Logic or base Python (albeit in a rather hacky approach).\n\nHow do you generate UDFs?\n\nUsing BigQuery’s comprehensive guides, you can see the general structure is very similar to some DDL statements, however, it can take a little getting used to. I go into this in more detail over on Medium with examples.\n\nHow to flatten tables with UDFs\n\nImagine a scenario where you have a Google Analytics 4 (GA4) or Firebase (FB) dataset where you need to flatten multiple fields. Normally you would need to write out the standard UNNEST script of:\n\n(SELECT VALUE.INT_VALUE FROM UNNEST(EVENT_PARAMS) WHERE KEY = 'CCC')\n\nHowever, that is super painful to repeat multiple times and likely to produce errors. So using a UDF, scripting and the fab SQL execute statement, I have generated the code below which will automatically UNNEST your GA4 data.\n\nBe careful to select the specific dates and events you wish to review. You can even remove the SQL execute and simply copy the query into another window or a tool such as Python.\n\nDECLARE\n  SQLRUN STRING DEFAULT '';\nCREATE TEMP FUNCTION\n  ga4_firebase( key1 STRING,\n    params ARRAY <STRUCT <key STRING,\n    value STRUCT <string_value STRING,\n    int_value INT64,\n    float_value FLOAT64,\n    double_value FLOAT64 >>>) AS ( (\n    SELECT\n      param.value\n    FROM\n      UNNEST(params) param\n    WHERE\n      param.key=key1) );\n  # *****************************************\n  # Set the tables names and define row numbers and update times\n  # *****************************************\nSET\n  SQLRUN = \n  (\n  SELECT\n    CONCAT('SELECT EVENT_NAME , ', STRING_AGG(CONCAT(\"ga4_firebase('\",key,\"',    event_params).\", event_parameter_value, \" AS \", key, ',' ), '\\n'), '  FROM  `project.analytics_yyyymmdd.events_*` WHERE _TABLE_SUFFIX = \"20210801\"  ORDER BY 1' )\n  FROM (\n    SELECT\n      DISTINCT event_name,\n      params.key AS key,\n      (CASE\n          WHEN params.value.string_value IS NOT NULL THEN 'string_value'\n          WHEN params.value.int_value IS NOT NULL THEN 'int_value'\n          WHEN params.value.double_value IS NOT NULL THEN 'double_value'\n          WHEN params.value.float_value IS NOT NULL THEN 'float_value'\n      END\n        ) AS event_parameter_value,\n    FROM\n      `project.analytics_yyyymmdd.events_*`,\n      UNNEST(event_params) AS params\n    WHERE\n      _table_suffix BETWEEN FORMAT_DATE('%Y%m%d',DATE_SUB(CURRENT_DATE(), INTERVAL 3 DAY))\n      AND FORMAT_DATE('%Y%m%d',DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)) )\n     AND  EVENT_NAME = 'page_view'\n    );\n  # *************************************\n  # Execute the query\n  # *************************************\nEXECUTE IMMEDIATE\n  (SQLRUN);\n\nSaving and persisting UDFs\n\nI mentioned earlier that recently Google introduced persistent UDFs, ones that can be saved in your database and this is relatively simple to do. You simply need a destination dataset and the name of your UDF. This will then save in your dataset and include a function flag to make them easy to spot. You can then see the function values when you click on them and apply them to any code using the dataset.function_name.\n\nCREATE FUNCTION  UDFS.ga4_firebase\n\nIn fact, a great UDF community has formed an open-sourced UDF project which you can actually apply to your own work, including many statistical techniques such as P-Values and much more simply by using the following syntax:\n\nSELECT bqutil.fn.udf_name(variable)\n\nBe sure to check them out!"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/the-measure-pod-a-podcast-from-measurelab/#article",
      "headline": "The Measure Pod: a podcast from Measurelab",
      "description": "We’re so obsessed with analytics that we started a podcast! Here’s how we turned our passion into The Measure Pod.",
      "url": "https://www.measurelab.co.uk/insights/blog/the-measure-pod-a-podcast-from-measurelab/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/the-measure-pod-a-podcast-from-measurelab/#webpage"
      },
      "datePublished": "2021-08-11T09:06:00.000+00:00",
      "dateModified": "2026-01-27T11:25:04.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/podcast-art_light_blog-1200x400-1.png",
      "author": {
        "@type": "Person",
        "name": "Daniel Perry-Reed",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Data Analysis",
        "Google Analytics",
        "Wordpress",
        "React",
        "Google Cloud"
      ],
      "articleBody": "Why?!\n\nAs of the time of writing, there are over 2 million podcasts and more than 48 million episodes, with nearly three out of four listeners (in the US) tuning in to learn new things (source). The Measure Pod is but a drop in the podcast ocean.\n\nWhy start one, right? Everyone and their nan has a podcast now.\n\nTrue. But we’re in the market of knowing as much as we possibly can about analytics and sharing that with like-minded people. Rather than fussing over LinkedIn reactions, or newsletter subscriber numbers (please subscribe by the way ;) ), it seems an obvious medium to be able to communicate directly with the people. Our people. Analytics obsessives.\n\nAnyway, we talk about this sort of thing all the time, it's just not recorded. And generally with beer in hand, which is not untrue of the podcast…\n\nWe’re in the business of doing clever stuff with data that we find fun and interesting. It’s not the kind of thing your family and friends will ever fully understand, so why not get the buzz from each other in this weird industry we’re in. That's where The Measure Pod come in.\n\n\nLaunching The Measure Pod\n\nSo right at the beginning of this venture, we had a choice. Pay a podcast hosting provider or self-host. Well, for The Measure Pod we went down the free route because who wouldn’t at first, right?\n\nOur website is built on WordPress and we found a great plugin called Seriously Simple Podcasting which fits the bill. It sets up and manages an RSS feed as well as offering a neat workflow to add new episodes, just like a blog post. All very familiar territory, great!\n\nHowever, the reason you may consider paying a hosting platform to do this all for you is that they manage all the integrations with all the podcast networks like Apple Podcasts, Google Podcasts, Spotify, Amazon, Pocket Casts, etc.\n\nNot having that luxury, we had to go to each of these platforms individually and add our RSS feed. This, in and of itself, is not too painful, but some networks take up to 3 days to add them to their players (looking at you Google Podcasts). So there goes our launch day with episode number 1…\n\nOnce all that initial leg work is done there’s no need to do it again for each episode, so it’s pretty straight forward after that. The official ‘launch’ is now the following week with episode number 2!\n\nAs of the time of writing, we have 3 episodes of The Measure Pod out which can be streamed from our website, or on most podcast players. If we missed any, let me know by emailing me on daniel@measurelab.co.uk and I’ll add it in. They are:\n\n 1. Why should I care about GA4? ~16 mins\n 2. Is the Session dead? ~12 mins\n 3. What to know before you start with GA4 ~15 mins\n\n\nRecording\n\nActually recording the conversations between myself and Dara Fitzgerald is the easy and fun part. What’s hard is figuring out what you want to say, and then saying it.\n\nPreparation is key, write down everything beforehand. Well not everything, you don’t want to read from a script. But you do want to figure out the key points you want to get across and not stray too far from the topic at hand.\n\nIn case you were wondering, we are recording over Zoom with a Soundtronics Podcast Pro microphone each. And I generally have a beer on the go, much to Dara’s jealousy!\n\nSo the fun part is over, now it’s time to edit. Not that it isn’t fun, but it can be a drag hearing your own voice over and over and over and over (okay we get it...) again. I genuinely couldn’t have done this without a magical tool called Descript. It turns audio files into a transcript, which you then edit just like a Google Doc or Word Doc. It does all the fancy actual audio editing behind the scenes, I just fix typos and remove text!\n\nAlso, the first few recordings are weird and feel strange. We’ve been on Zoom for well over a year now, but it feels different. It passes, but we do have 1.5 episodes in the trash that will never see the light of day. Just us finding our feet. Well, voice.\n\n\nAnalytics\n\nLaunching The Measure Pod was easy, just click publish in WordPress. The RSS feed does its magic, and all the podcast networks see the new episode and add it to their libraries, pinging anyone who’s subscribed. Then the fun can start - looking at the data!\n\nThe WordPress plugin gives an almost real-time view of the data, but only tracks ‘Listens’ and there is no way to get the data out by downloading or via an API from what I can see. Very limiting outside of an “oh, that’s cool” conversation.\n\nHowever, we also implemented a free podcast analytics tool called Podtrac on our RSS feed, which offers a step-up in terms of data collection and access. It captures the listener’s podcast player as well as geographic information. And some other useful stats such as audience size (unique listeners).\n\nIt still feels pretty basic compared to what I’m used to in terms of Google Analytics (especially Google Analytics 4), but that’s what I’m most familiar with.\n\nMaybe we’ll have a go at building our own GCP-based analytics tracking solution. I mean how hard can it really be?!\n\nFamous last words..."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/how-to-share-single-bigquery-dataset-gcp-iam/#article",
      "headline": "How to share access to a single BigQuery dataset with GCP IAM",
      "description": "Sometimes less is more; especially when it comes to security access. This simple walkthrough will show you how to use GCP IAM to surface just the parts of your data warehouse to just the right people.",
      "url": "https://www.measurelab.co.uk/insights/blog/how-to-share-single-bigquery-dataset-gcp-iam/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/how-to-share-single-bigquery-dataset-gcp-iam/#webpage"
      },
      "datePublished": "2021-08-05T08:54:00.000+00:00",
      "dateModified": "2025-07-31T20:36:18.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/analytics-subject_1200x400-blog-1.png",
      "author": {
        "@type": "Person",
        "name": "Liam Grant",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "How-to",
        "BigQuery",
        "Google Cloud",
        "AI & ML"
      ],
      "articleBody": "\n\n\nAt Measurelab we’ve heard some horror stories about the deletion of critical datasets. Even though Google BigQuery has the BigQuery Backup Recovery of up to 7 days, it’s often better to err on the side of caution when it comes to allowing access to your data warehouse.\n\n\n\n\nThose with rose-tinted glasses glued to their head might have a hard time lauding the usability of GCP IAM (the Google Cloud Platform’s Identity and Access Management). Clients find it to be one of the less understandable parts of the platform.\n\n\n\n\nBefore GCP IAM was introduced\n\n\n\n\nOriginally the GCP’s security settings were three-fold. Viewer, Editor and Owner. Three primitive basic roles for access to everything within one GCP. These roles are still around but really shouldn’t be used unless there is no alternative. To illustrate the problem, if you use the basic roles, that member of your team you granted Editor permissions for Cloud Storage, also now has Editor permissions on your Machine Learning Pipeline. Not the best.\n\n\n\n\nThe explosion of GCP IAM roles\n\n\n\n\nSecurity exploded into IAM and now there are 4,167 (and counting) different permissions at Organisation, Folder, Project and Service levels. With some services like BigQuery allowing for Dataset, Table, Column and Row security. A true web of security, especially now that there is a hierarchy to permissions. This is great, but it often means you need permissions at two or even three different hierarchical levels in a mix and match that can leave your head spinning.\n\n\n\n\nSo simple? Yet so not\n\n\n\n\nOne of the most common dilemmas our clients bring to us is: how can I only allow a group of people to see a single dataset in my BigQuery data warehouse, rather than all the tables?\n\n\n\n\nHere’s a guide on how to allow access to just one dataset on your Google Cloud Project.\n\n\n\n\n\nInstructions\n\n\n\n\n1. Create a Google Group (Optional)\n\n\n\n\nThis preliminary step is optional but will allow for easier management of the selected group of people from outside the Google Cloud Platform environment. If the group that you wish to give access to is large, or changes regularly requiring updates to permissions, this method will save you a lot of manual work.\n\n\n\n\nGoogle Groups can be used instead of unique Google accounts. For the above-mentioned reasons, you might want to create Google Groups for more effective management of your GCP IAM roles.\n\n\n\n\n 1. Navigate to Google Groups.\n 2. Click on the Create group button in the top left-hand corner of the screen.\n    \n    \n 3. Add in the relevant information and select a name for the google group, this will be the identifier that you can use within your Google Cloud Platform to manage permissions and roles.\n    \n    \n 4. The next step is setting permissions of the Google Group, since the google group’s main goal is to act as a user for the permissions in Google Cloud Platform the following settings are suggested.\n\n\n\n\n\n\n\n 5. Finally, add members to the group, if you desire other users to manage the group access, add their emails as a Google Groups Manager. This is so you can invite a test account to the group to test the permissions within GCP once you have added the permissions.\n\n\n\n\n\n\n\n2. IAM and Roles\n\n\n\n\nTo edit a user's Roles and Permissions within a project the Role Administrator Role is required.\n\n\n\n\n 1. Navigate the correct Google Cloud Project and then to IAM & Roles\n    \n 2. Click on the Add members in the top left-hand corner\n    \n    \n 3. Add the User or the Google group that you wish to see the data set into the new members.\n    \n 4. Within select a role drop-down, filter by job user and then BigQuery Job User\n    \n 5. Click Save.\n\n\n\n\n3. Dataset Roles\n\n\n\n\nTo edit a user's Roles and Permissions within a project at dataset level the Role Administrator Role is required.\n\n\n\n\n 1. Navigate to the BigQuery Dataset that you wish to give access to and click share dataset\n    \n    \n 2. Within add members add the identifying address for the User or Users\n    \n 3. Click on the role and then BigQuery\n 4. You are then given a selection of roles for the dataset only.\n 5. Select the Role you want to give and click save.\n\n\n\n\nResources\n\n\n\n\nUnderstanding the roles you can select and what each means: BigQuery IAM Roles.\n"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/role-changes-measurelab/#article",
      "headline": "A shake-up at the top",
      "description": "As the Measurelab family expands and evolves, our team at the top has decided to switch up roles and use their talents where they fit best. You can't have growth without change, right?",
      "url": "https://www.measurelab.co.uk/insights/blog/role-changes-measurelab/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/role-changes-measurelab/#webpage"
      },
      "datePublished": "2021-07-26T10:42:49.000+00:00",
      "dateModified": "2026-01-22T10:52:07.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/measurelab_1200x628-li-role-changes.png",
      "author": {
        "@type": "Person",
        "name": "Mark Rochefort",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "articleBody": "Back in 2013, when Dara and I started Measurelab, it was just the two of us. I called myself Managing Director because I was the one signing stuff and it seemed to fit. Dara was the subject matter expert running training courses and talking at events, so we settled on the title of Analytics Director for him. We didn’t care too much for job titles anyway and just got on with growing the business.\n\nOur initials are M and D. People have joked on more than one occasion that we’re a bit like a Mum and Dad to this funny little family - with neither of us quite knowing who was Mum and who was Dad. Not that it mattered. People seemed to intuitively know who to go to about what. It just worked (mostly).\n\nBut that funny little family grew. We waved a tearful goodbye to some of our progeny, but welcomed many new faces to our happy home (although several of them we’ve mostly seen on Zoom!).\n\nBit-by-bit, our roles evolved. We each shed some responsibilities - ah, the joys of delegation - and accumulated others. Some of it by design, most of it by default. Not all of it made sense - to us or anyone else.\n\nIt was time to take a step back. To look at what we were doing and how we were spending our time. What was making us happy and energised? What were the sources of frustration or anxiety? We looked. And we decided to change things up.\n\n\nMore than just an impressive beard\n\nA good leader needs to be a good listener. And when Dara listens, you know every single word you say is being heard and heeded. He makes everything seem better. Everyone in the company naturally turns to him for guidance, advice and support - myself included! And the more people we have, the more we need those peerless people skills.\n\nFor the past couple of years, much of Dara’s time has been greedily gobbled up by some of our precious clients. (They have excellent taste, who can blame them?) Nobody understands the needs of our customers better, or the challenges of meeting those needs.\n\nAs well as sporting the most famous beard in analytics, Dara has a well-deserved reputation as a thought leader and speaker. I’ve lost count of the number of clients and staff who’ve approached us because they saw Dara talk at some event or other (or had a beer at the bar with him afterwards). If Measurelab was a band, he’d be the frontman. We need him out there, centre stage.\n\nFine folk of the global analytics community, it gives me great pleasure to introduce Measurelab’s new Managing Director, the one and only Mr. Dara Fitzgerald.\n\n\nAnd here's a word from Dara\n\nIt’s very easy to pinpoint Mark’s super power. This is a guy who coded his first website back in 1997, when our youngest employees were a single year old. He regularly talks about burning CD-ROMs, the joys of TCP/IP (I’m still not convinced that’s a real thing) and the good old days when he and Tim Berners-Lee sat in the Lewes Arms brainstorming something they would later call the Interwebz.\n\nI’ve never once seen fear in Mark’s eyes. He simply relishes a technical challenge. Like the bravest of cats, stalking the meanest of seagulls. He never tires of tinkering and tuning the engine. Whether that engine is a client’s analytics implementation, our internal use of software, or the business as a whole. The man’s skill at coming up with cunning workarounds and genius solutions is matched only by his ability to articulate them in a way that actually makes sense.\n\nThat creative, technical brain of his is squandered. It needs to be laser re-focussed on leading our innovation and driving our continued growth through the use of new-fangled technology. That’s why I’m thrilled to announce that Mark has agreed to transition into the role of Director of Technology and Operations."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/data-privacy-ga4/#article",
      "headline": "Data privacy in GA4: ensuring compliance & user trust",
      "description": "We all need to play our part in promoting a more responsible, ethical approach to collecting and using customer data. If we don’t, there’s a risk we’ll be left with nothing to measure.",
      "url": "https://www.measurelab.co.uk/insights/blog/data-privacy-ga4/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/data-privacy-ga4/#webpage"
      },
      "datePublished": "2021-07-09T14:51:10.000+00:00",
      "dateModified": "2025-12-10T00:51:01.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/measurelab-privacy_1200x400-blog.png",
      "author": {
        "@type": "Person",
        "name": "Steven Elliott",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Privacy",
        "Google Analytics",
        "Google Tag Manager",
        "AI & ML"
      ],
      "articleBody": "Some surveys would have us believe privacy is really really important to people these days. A 2020 study in the US by KPMG found 97% of consumers were concerned by data privacy, with 87% seeing it as a fundamental human right.\n\nI’m not buying it. Sure, there may be a minority of activists out there, switching suppliers and cancelling contracts with righteous indignation, but you won’t overhear many heated debates about consumer privacy in the recently unlocked beer gardens of Britain. (Covid, Brexit and Jack Grealish feature heavily).\n\nIt could yet change. Check out the latest Apple ad. A naive consumer is shadowed by a growing legion of grey-suited spooks - a sinister metaphor for the dark forces tracking our every move online and sharing our personal information indiscriminately.\n\nArguably, this powerful piece of communication isn’t based on the insight that consumers these days care about their privacy, but on the insight that they actually don’t.\n\nApple wants people to care more about privacy. They make most of their billions selling candy-coloured devices, rather than eyeballs and ads. And they’re betting their competitors - Facebook, Amazon and of course, Google - will be reluctant to follow them into an anonymised future.\n\n\nDoes Google care about data privacy?\n\nWell, based on the airtime devoted to the topic at Google Marketing Live, it turns out they do. Hey, presto! Google Analytics 4 is now a privacy-first, privacy-centric analytics solution, with privacy features built-in thanks to Google’s new “privacy by design” ethos.\n\nWhat exactly does this mean in practice?\n\nWell, Google may have recently called time on third-party cookies, but GA4 still relies heavily on first-party cookies for anything more than basic measurement via cookieless pings. That means in Europe at least, we won’t be doing away with those dinky cookie banners requesting explicit consent any time soon.\n\nThe good news is that GA4 will observe the users who do consent to analytics and use machine learning to model the behaviour of those who don’t. This fills the inevitable gaps in your data so you don’t “lose” all that hard-earned traffic.\n\nGA4 enables much more granular control over how you identify visitors: via the device ID for both app and web visitors; through a user ID to understand logged-in journeys; using Google Signals if you’re keen to personalise ads or some combination of the three.\n\nIP anonymisation is enabled by default and can’t be switched off. Data is retained for a much shorter period of time: either two or 14 months, rather than the infinite option possible with the current Universal Analytics (UA).\n\nAn updated user explorer tool makes it easier to delete an individual user’s data to comply with GDPR right to be forgotten. However, as before, you have no choice as to where the data collected on your site is stored and processed. There’s a strong likelihood this will include servers in the US, so you will still need to disclose you’re making international data transfers in your privacy policy.\n\nYou’ll still need to carefully review the choices related to sharing your data with Google - in particular, selecting advertising preferences and choosing whether to opt into Google Signals.\n\n\nHow much do you care about data privacy?\n\nAll these new features in GA4, combined with Google Tag Manager’s consent mode, will make it much easier to implement your company’s privacy policies. Unfortunately, Google isn’t going to formulate those policies for you. As a marketer, you still need to weigh up the trade-offs and make the judgement calls. The buck stops with you.\n\nAnd that begs the question: how much do you care about data privacy?\n\nWill you bury your head in the sand, refusing to acknowledge reality and hoping it will all blow over? (Sorry, that’s not going to happen any time soon.)\n\nWill you be wilfully negligent? Happy to give the outward appearance of compliance while harvesting data in the background and retargeting at will.\n\nWill you passively let the tech vendors or your media agencies make the tough calls? Or obediently adhere to the red lines drawn by an overly-cautious legal department?\n\nOr do you genuinely want to do the right thing? Will you actively seek to balance the best interests of the company and consumers? Are you prepared to sacrifice short-term performance in order to establish a sustainable marketing operating model?\n\n\nWhat do we care?\n\nThe easiest option would be to operate as a no-questions-asked implementation arm, taking and fulfilling orders without question. Who wouldn’t want a reputation for being quick and easy to work with?\n\nBut this risks making us complicit in bad practice, or even breaking the law. It’s a slippery slope. One day you’re implementing a cookie without updating a privacy policy, the next you’re burying bodies in some West Sussex woodland. Let’s not go there.\n\nWe’re not necessarily going to start advising on legal positions, drafting policies and auditing internal procedures. We’re in this business because we love data and analytics, not statute and precedent. But we will ensure we have a working understanding of the relevant laws and directives.\n\nWe’ll also be asking challenging questions and pointing out potential breaches. Sometimes we may even politely refuse a request. And we will definitely be exploring the new tools and technologies that can assist with consent management - including getting our own house in order.\n\nHopefully, you’ll join us in taking a more proactive, progressive approach to data privacy. Before it’s too late."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/migrating-to-ga4/#article",
      "headline": "Why migrate to GA4? Your data may not be as good as you think",
      "description": "Be warned: the risk of sticking with your current Google Analytics implementation may well be greater than any costs associated with the \"migration\" to GA4.",
      "url": "https://www.measurelab.co.uk/insights/blog/migrating-to-ga4/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/migrating-to-ga4/#webpage"
      },
      "datePublished": "2021-03-29T08:36:19.000+00:00",
      "dateModified": "2025-07-31T20:36:20.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/measurelab_1200x628-li-ga4.png",
      "author": {
        "@type": "Person",
        "name": "Steven Elliott",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Firebase Analytics",
        "Google Analytics",
        "BigQuery",
        "Privacy",
        "React",
        "AI & ML"
      ],
      "articleBody": "Better the devil you know?\n\nThe new, improved Google Analytics 4 is here (GA4 to its friends). You may be asking yourself: why bother? What’s wrong with what we’ve got? Is a migration really worth all the disruption?\n\nRightfully so. We marketers need to learn to resist the lure of the bright shiny object.\n\nFew tools in the martech stack are as tried-and-trusted as the current version of Google Analytics. It’s as close to an industry standard as it’s possible to get. A faithful old friend. And trust matters when it comes to data. We've all come to rely on its reports. The KPIs are consistent, and goddamit you’ve only just managed to convince everyone bounce rate really isn’t important.\n\nWhat's more, analytics resources are precious. Every hour your team spends migrating a platform could be spent delivering real value: analysis, interpretation and optimisation recommendations. Even \"free upgrades\" come at a price.\n\n\nWhat’s in it for them?\n\nThere’s always going to be a degree of suspicion when someone gives you something for nothing. If you’re not paying for the product, you probably are the product. Or, you're going to be compelled to buy more of another product. Is this a part of Google’s master plan to monetise its ubiquitous analytics platform? Will you be locked into the Googlesphere for eternity? Dangnammit, is close to half your paid media budget not enough!\n\nGoogle isn’t evil (we work with them, they’re actually lovely). True, they'd like us all to spend more through the Google Marketing Platform. But that brings with it an imperative to demonstrate any additional investment yields a higher ROI. They don't win unless they can prove you're winning.\n\nFrom Google's perspective, trying to persuade loyal customers to abandon a product they’re largely happy with carries risk. Particularly as migrating to GA4 means making an entirely fresh start - it carries over zero legacy data. Who’s to say marketers won’t take the opportunity of a clean break to consider their options? Those Adobe reps are pretty persistent, after all.\n\n\nGA4 is not the change\n\nLet’s face it, Google Analytics was due an upgrade. The current iteration - Universal Analytics, or UA - has been around for nine (yes, 9) years. And even that was only a superficial upgrade on Google Analytics Classic. You're basically relying on a technology which pre-dates the iPhone!\n\nWhile GA4 is fundamentally different in terms of how it collects and presents data, ultimately the product itself is not the change. GA4 is a reaction to the change around us. Specifically, rapid advancements in marketing technology and some seismic shifts in consumer attitudes and behaviours.\n\nTogether, these changes mean the data you’re basing your decisions on may already not be as complete and reliable as you think. And it's only going to get less so. The punchline: the risks of sticking with UA will soon be greater than the momentary pain involved in migrating.\n\n\nAn incomplete picture\n\nThat’s a bold claim. But chances are, you’ve already encountered some frustrations with the limitations of Google Analytics and the occasional inconsistencies in the data it produces. Let’s take a closer look at some of the factors undermining our collective confidence.\n\nDynamic web experiences\nTake the web page. What a quaint concept. An unhelpful hangover from the days when websites were simply digitised brochures or catalogues. When websites were static, page views actually meant something. The world (wide web) has moved on. Now page views are of less and less value as an indicator of interaction.\n\nWebsites are increasingly dynamic. With more page elements personalised according to the user’s source, profile and past browsing history, no two pages are the same. That’s before we take into account the user’s viewport - 37” wraparound monitor or 6” phone screen? What use is a page view count for a dynamically-hosted one page website or single page application (SPA)?\n\nGA4 uses an “event-based” data model so it can accurately track the performance and relative contribution of each individual page element, with every version and variation you might wish for. You can actually measure the lived experience, rather than a proxy.\n\nMovement between app and web\nIf you have a website (who doesn’t?) and an app, you’ll have likely spent countless hours wishing you knew how users moved between the two. Incomplete and interrupted journeys. Many blind spots. Much hand-wringing.\n\nGoogle’s Firebase Analytics product and Universal Analytics (GA3) have very different data schemas that make combining and comparing data almost impossible. It doesn't help when - as we frequently encounter - there are different teams or individuals responsible for implementing and managing the two analytics products.\n\nThe clues were there for all to see. GA4, the product formerly known as as Google Analytics App+Web, is essentially built on Firebase. That means it will be way easier to connect data in order to get a complete picture of user behaviour. Where once we were blind, we will now be able to see. Hallelujah.\n\nMissing persons\nIn civilised Europe we have long had to politely ask before placing cookies on a user’s browser for tracking purposes. GDPR and the ePrivacy Directive adding serious consequences. Progressive California enacted the CCPA, and now even Brazil is getting in on the “act” with the LGPD (Lei Geral de Proteção de Dados - but you knew that already).\n\nWhile many users tacitly accept cookies without thought (guilty), increasing numbers of privacy-sensitive souls are reading the small print and choosing to opt out of all but essential cookies. Incognito-a-go-go. As cookies are more routinely cleared and their lifespan shortened, those using Universal Analytics are going to find themselves with a gaping black hole in their data, analysing a rapidly shrinking universe.\n\nIt’s fair to say the cookie is crumbling. Fast-following other “privacy-first” platforms, Google has signalled the end of third-party cookies in its Chrome browser. Individual tracking and targeting will soon be a thing of the past.\n\n\"Today, we’re making explicit that once third-party cookies are phased out, we will not build alternate identifiers to track individuals as they browse across the web, nor will we use them in our products.\"\n\nGA4 will help plug some of these gaps in your visitor data through machine learning. The more training data you can start collecting, the more accurate the algorithm. Keep calm and carry on measuring.\n\nMissed opportunities\nWith so much data being captured and processed, building and automating reports can be a full-time job that leaves analysts precious little time to mine for insight and opportunity. Who knows how many pounds sterling have been left on the table? Probably best not to dwell on it.\n\nThe good news is GA4 opens all this data up to artificial interrogation. The Google machine can observe, learn and predict; inbuilt models finding value in the data that might well be invisible to the naked eye of an analyst. Have we sown a seed of doubt in your data? Quite possibly, but Universal Analytics is not a burning platform you need to leap off right away. So what’s the inflection point, or trigger that makes a move to GA4 worth considering?\n\n\nThe migration myth\n\nHere’s the thing. Right now you don’t have to “migrate” to Google Analytics 4 at all. In fact a wholesale migration is completely inadvisable. What’s important, is that you create a GA4 property and start dual tracking at the earliest opportunity. And this is dead simple. There’s no need for a GA4 migration plan, roadmap or budget allocation. It’s so easy, you may be surprised to learn some bright spark has already just gone ahead and done it.\n\nOnce it’s set up you don’t have to do anything else. Sit back and let the data accumulate. It may not be capturing all the custom events you’d ideally like to track, but when you’re ready to make the transition to using GA4 as your primary analytics platform, you’ll at least have some historic data with which to establish baselines.\n\nIn the meantime, if you’d like to get an introduction to the capabilities of GA4, or explore how you might begin to take advantage of the native BigQuery connector, we have a GA4 training course that could be of interest. If you’re excited by the opportunity to start afresh and want to get your GA4 implementation right first time, speak to one of our analytics consultants today."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/data-warehouse-repair-broken-tables-in-bigquery/#article",
      "headline": "Data warehouse: Repair broken tables in BigQuery",
      "description": "At Measurelab, we love a bit of data warehousing using BigQuery; in fact, we are obsessed with finding the best approach to managing data warehouses in the most optimal way possible.  So in this series, we want to share with you our knowledge and expertise to show what a fantastic and dynamic tool BigQuery is.\n\nAs you may know, BigQuery has some super powerful features, which allow us to build, manipulate and even run machine learning algorithms within the interface. However, we’re all human, an",
      "url": "https://www.measurelab.co.uk/insights/blog/data-warehouse-repair-broken-tables-in-bigquery/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/data-warehouse-repair-broken-tables-in-bigquery/#webpage"
      },
      "datePublished": "2021-03-08T17:14:21.000+00:00",
      "dateModified": "2025-07-31T20:36:20.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/bq-2.png",
      "author": {
        "@type": "Person",
        "name": "Lace Rogers",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Looker Studio",
        "BigQuery",
        "Google Cloud",
        "AI & ML"
      ],
      "articleBody": "At Measurelab, we love a bit of data warehousing using BigQuery; in fact, we are obsessed with finding the best approach to managing data warehouses in the most optimal way possible.  So in this series, we want to share with you our knowledge and expertise to show what a fantastic and dynamic tool BigQuery is.\n\nAs you may know, BigQuery has some super powerful features, which allow us to build, manipulate and even run machine learning algorithms within the interface. However, we’re all human, and things can go wrong- so what do you do when that happens?\n\nImagine one morning you’re on the BigQuery interface and want to simply do an aggregation of your table to check the volumes, but you forget to clear down the options before running.\n\nJust as the code finishes running, you realise months of daily updates have been lost as the table was accidentally overwritten and, even worse, any reporting in dashboard tools like Data Studio or Tableau using this table will now fail.\n\nBefore you look to completely re-run all your historical data which could both end up costing a lot of your time and increase your BigQuery spend, Google Cloud Platform has some great tools which allow you to recover and revert your datasets.\n\nWhat can you do?\n\n * If you have deleted a table, you have two days to recover.\n * If you have an error on your table, you have seven days to recover.\n\nAnd what isn’t possible?\n\n * Remember at present you cannot restore a deleted dataset\n\nThe syntax\n\nThe syntax itself for reverting the tables is relatively simple and is not expensive to run.\n\n * The interval can be seconds/hours/days; however, it cannot be over seven days due to the reversion time limit.\n * You must remember when you are reverting if you have added correct data in the period you are reverting to you will lose this, so it’s crucial to check when the error occurred if possible.\n * You can either use Data Manipulation Language (DML)* or the output functionality to overwrite the table you are reverting to, without a destination, you will simply see the data in a temp table.\n\nHere is a link to the script on Github\n\nThen voilà, check your table has reverted and if all looks well, have a tea and relax in the knowledge your reports feeding on this table will be back up and running when they next process (phew).\n\nWhilst we should always be super careful when amending or overwriting tables if something does go wrong, remember to look at this syntax before you re-run the full history.\n\n* And what is DML I hear you say?\n\nDML stands for Data Manipulation Language. DML statement is used to insert, update or delete the records on tables and is super powerful when creating tables. We will be talking about these fantastic tools in a future post.\n\nIf you need any support or want to find out more about how Measurelab can help you leverage the full capability of your BigQuery data or want to know more about the analytics services and training services we offer, please contact us at hello@measurelab.co.uk or lace@measurelab.co.uk."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/google-analytics-4-connects-bigquery-data-studio/#article",
      "headline": "How data moves between Google Analytics 4, BigQuery and Data Studio",
      "description": "There's a surprising number of data feeds and transfers for Google Analytics 4, BigQuery, Data Studio and all its connected accounts and platforms. We set out to map them all to assist with your architecting.",
      "url": "https://www.measurelab.co.uk/insights/blog/google-analytics-4-connects-bigquery-data-studio/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/google-analytics-4-connects-bigquery-data-studio/#webpage"
      },
      "datePublished": "2021-01-29T19:29:50.000+00:00",
      "dateModified": "2026-01-27T11:25:04.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/measurelab-blog-ga4-streaming-to-bigquery_1200x400-blog-1.png",
      "author": {
        "@type": "Person",
        "name": "Daniel Perry-Reed",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Data Analysis",
        "Firebase Analytics",
        "BigQuery",
        "Google Analytics",
        "Looker Studio",
        "Privacy"
      ],
      "articleBody": "Over the last year or so I have been getting myself familiar with Google Analytics 4 (GA4 - previously App+Web), especially since it came out of beta back in October 2020 and became the default property type overnight. To be honest, this was a crash course as up to this point I had very little to do with Firebase, or app analytics in general!\n\nThe more time I have spent setting up GA4 on websites and apps, the more I have come to appreciate how different it truly is from Universal Analytics (UA or GA3). I know this sounds obvious, but the messaging from Google has been one that alludes to it being a natural and simple process to get it dual tracking alongside UA. In their defence, it is rather easy to get the code on the sites and apps, especially as there are a number of automatically collected and Enhanced Measurement events that don't require any additional tagging to work!\n\nFor me however, one of the big nice-to-have features in GA4 is the Google BigQuery (BQ) connection for the raw event-level data daily and stream exports. But then I quite quickly came to a crossroads when it came to building some dashboards in Google Data Studio (GDS) - do I use the native GDS-GA4 connector through the Data API, or use the native GDS-BQ connector? At the surface-level, it probably doesn't matter either way assuming you have the SQL skills-to-pay-the-bills. However, there are some dimensions that are not available in the BQ export/stream that are in the API such as Age and Gender and some metrics that are just easier to have pre-calculated such as ARPU, Engaged Sessions, etc.\n\nMy prediction over the coming year(s) is that the data available in the GA4 Data API will diverge from the data fed into BQ, mainly due to data privacy and sharing policies. For example, data from Google Signals is used in GA4 to identify users across browsers and devices as well as providing demographic data. This is not exported to BQ as it is all anonymised and aggregated (to us) behind the scenes. Google isn't about to share their secret ad profiling recipe as easily as this - especially as ad revenue is 70+% of their total!\n\nAnyway (tangent over), to make better sense of this I have made a few attempts to draw out how all the data feeds work all centred around GA4 (of course).\n\nA few pages later, I felt I had a good enough grasp to move it to a Google Drawing (ignore the random choices for shapes and colours, I just went with whatever!):\n\nAs you may be able to tell, it was a bit more complicated than I naively first thought. As I drew each component it was apparent that I needed to consider all data feeds and transfers that I could possibly think of.\n\nI'm by no means suggesting that this is technically correct behind the scenes, I'm sure there's loads I don't know and am ignorant to - however it's a 'v1.0' and helps my colleagues and I get a better feel for how all the data flows, pipes, lakes and oceans start to come together.\n\nPlease get in touch if you spot anything I have missed out, misrepresented or want to suggest updates - it would be great to keep this as up to date as possible. My email is daniel@measurelab.co.uk, or you can use our contact us form.\n\nWe've recently designed a GA4 training course for teams that want to kickstart their use of the new tool. Get in touch if you want to book in and get a head start!"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/how-to-get-to-know-your-customers-better/#article",
      "headline": "Customer segmentation: how to get to know your customers better",
      "description": "In marketing, it’s vital to know your customers and how they interact with your brand. You need to know what they buy, when they buy, how often, how much... But why?\n\nBecause if you know their habits and behaviours, you can tailor your marketing tactics and even personalise your customers’ journey. In doing so, you can maintain and even raise engagement between your customers and your brand.\n\n\nSo how do we do this?\n\nBefore thinking about any targeting strategies, you need to get to know your cus",
      "url": "https://www.measurelab.co.uk/insights/blog/how-to-get-to-know-your-customers-better/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/how-to-get-to-know-your-customers-better/#webpage"
      },
      "datePublished": "2021-01-22T10:11:39.000+00:00",
      "dateModified": "2025-12-22T14:53:29.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/nerd2.png",
      "author": {
        "@type": "Person",
        "name": "Oli Paterson",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Data Analysis"
      ],
      "articleBody": "In marketing, it’s vital to know your customers and how they interact with your brand. You need to know what they buy, when they buy, how often, how much... But why?\n\nBecause if you know their habits and behaviours, you can tailor your marketing tactics and even personalise your customers’ journey. In doing so, you can maintain and even raise engagement between your customers and your brand.\n\n\nSo how do we do this?\n\nBefore thinking about any targeting strategies, you need to get to know your customers. If you have customer level data, a fantastic and efficient way to do this is to utilise segmentations. What is segmentation, you might wonder? Segmentation is simply splitting your customers into groups based on behaviours and demographic, which makes them easy to understand, ultimately enabling you to build better strategies and analysis.\n\nThere are countless customer segmentations, but a great place to start is with a Recency, Frequency, and Value (or Monetary) segmentation - also known as an RFV or RFM. This does exactly what it says on the tin - it labels each customer according to how recently they purchased something, how frequently they purchase products, and how much monetary value they have spent with your company.\n\n\nHow is this done?\n\n\nStep 1\n\nWe calculate the values mentioned above for each customer.\n\nRecency - How many days since their last purchase?\n\nFrequency - How many times have they purchased in the chosen time period?\n\nValue - How much have they spent with you?\n\n\nStep 2\n\nOnce each customer’s values are calculated, we can then label them according to how well they are performing and how engaged they are. In the example shown here, 4 would be the lowest category and 1 the highest.\n\n\nStep 3\n\nThe scores are then combined into a single score and the customers can then be grouped into segments. These groupings can be tailored according to the company’s needs but examples include loyal customers, new customers, customers at risk of churning (leaving), and more.\n\nThis information is invaluable. Once you know the sort of customer and where they lie in your segmentation, you can then create communication strategies that are tailored to each group. Having these bespoke strategies enables you and your brand to really engage with your customer on a new level. It is also possible to refresh the segmentation periodically. This gives the opportunity to track the potential movement of customers across the segments, with the goal of getting them into segments associated with more engaged and higher performing customers.\n\nOverall, an RFV is a fantastic tool to have, but it’s just the beginning. RFV segmentations can be made even more powerful by being used alongside other segmentations and models. These include analysing churn, lifetime value, utility, discount elasticity, price elasticity, and more.\n\nContact us at Hello@measurelab.co.uk and see if Measurelab can support you with leveraging your own marketing data to gain insights and understanding, helping you get more from your customers and your data."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/data-warehousing-what-is-bigquery-and-how-do-i-get-started/#article",
      "headline": "Data warehousing: What is  BigQuery and how do I get started?",
      "description": "At Measurelab we live and breathe the Google Cloud Platform, so our specialists are experts in Bigquery.  We have decided in this series to share our knowledge and take you through some great techniques to maintain your BigQuery data warehouse.  \n\nSo firstly-what is BigQuery?\n\nBigQuery is a fully-managed, serverless data warehouse that enables scalable analysis over petabytes of data.\n\n...and that means?\n\nSimply put, BigQuery is a fantastic cloud-based data warehouse in which you can store huge ",
      "url": "https://www.measurelab.co.uk/insights/blog/data-warehousing-what-is-bigquery-and-how-do-i-get-started/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/data-warehousing-what-is-bigquery-and-how-do-i-get-started/#webpage"
      },
      "datePublished": "2020-12-21T11:13:17.000+00:00",
      "dateModified": "2025-07-31T20:36:21.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/bq-3.png",
      "author": {
        "@type": "Person",
        "name": "Lace Rogers",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "BigQuery",
        "Google Analytics",
        "Looker Studio",
        "Google Cloud",
        "Firebase Analytics",
        "AI & ML"
      ],
      "articleBody": "At Measurelab we live and breathe the Google Cloud Platform, so our specialists are experts in Bigquery.  We have decided in this series to share our knowledge and take you through some great techniques to maintain your BigQuery data warehouse.  \n\nSo firstly-what is BigQuery?\n\nBigQuery is a fully-managed, serverless data warehouse that enables scalable analysis over petabytes of data.\n\n...and that means?\n\nSimply put, BigQuery is a fantastic cloud-based data warehouse in which you can store huge volumes of data and use SQL (and other tools) to query that data extremely quickly.  It can put your company in control of its own data and tends to be incredibly low cost to manage and process data.\n\nBigQuery is part of the Google Cloud environment, which contains many complementary tools that supports creating a centralised warehouse from multiple data sources and relational datasets.\n\nWhat is in it for me?\n\nSo firstly if you have a Google Analytics 4, 360, or Firebase account you can stream event and hit level daily tables and store them in the BigQuery data warehouse with only a couple of clicks.  However, BigQuery is much more than that and provides many tools that allow you to automate and read in data from many sources so long as the data is structured.  This includes reading in your marketing and CRM data from APIs, CSVs, and even your Google drive, to create a centralised data warehouse for your one point of truth. Imagine how easy it is then to calculate your Return On Advertising Spend (ROAS).\n\nAn additional feature of BigQuery is just how scalable it is at a relatively low cost for storage, which means your data warehouse can grow as you do as you're only charged for what you use.  We will talk more about the cost comparisons in a later post.\n\nSo, what does the BigQuery  interface look like?\n\nThe interface is a one-stop shop to access and maintain your data warehouse as well as perform analysis, autoML and much much more.\n\nHow can I access BigQuery?\n\nIf you want to set up a new project follow this link to initially set up your console: https://console.cloud.google.com/\n\nYou will then need to enable the BigQuery API\n\nOpen up your GCP console link and expand the left-hand GCP menu and select the API & Sevices>Dashboard\n\nSearch BigQuery API and enable it. Once this is enabled you can then navigate to your shiny new project\n\nAnd if you wish to practice your BigQuery SQL skills you have a monthly free allowance for 1Tb of code even better you actually get your first 10 GB of storage free each month.  There are also some great public datasets available here link to test your knowledge.\n\nIf you have an app with Firebase or a website with GA4, BigQuery has built-in functionality that, once implemented, allows data to be automatically exported into tables for storage and querying... but more on that in a future blog!\n\nAt Measurelab we simply love BigQuery and to see how we can help your team leverage your data capability, please reach out to us at Hello@measurelab.co.uk.\n\nAny comments, queries or feedback can be sent to lace@measurelab.co.uk"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/how-recognising-images-works-when-youre-an-algorithm/#article",
      "headline": "How recognising images works - when you're an algorithm",
      "description": "There are many different types of image recognition. The main aim of such practises is to correctly match a new picture to an existing group of pictures. In some instances it is not dissimilar to how a clustering algorithm works, in that common features are identified and grouped together (Moosmann et al., 2008).\n\nAlthough several methods of image recognition exist, this blog post will give an overview of the method of facial image recognition that has been patented by Tsai (2004). This inventio",
      "url": "https://www.measurelab.co.uk/insights/blog/how-recognising-images-works-when-youre-an-algorithm/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/how-recognising-images-works-when-youre-an-algorithm/#webpage"
      },
      "datePublished": "2020-12-15T16:19:12.000+00:00",
      "dateModified": "2025-07-31T20:36:21.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/nerd2-1.png",
      "author": {
        "@type": "Person",
        "name": "Katy Beckett",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "AI & ML"
      ],
      "articleBody": "There are many different types of image recognition. The main aim of such practises is to correctly match a new picture to an existing group of pictures. In some instances it is not dissimilar to how a clustering algorithm works, in that common features are identified and grouped together (Moosmann et al., 2008).\n\nAlthough several methods of image recognition exist, this blog post will give an overview of the method of facial image recognition that has been patented by Tsai (2004). This invention creates a method of Multiple Stage Face Image Identification. Before any image recognition can begin, the picture has to be processed - this is done using the following three steps:\n\n1. Inputting an original picture of a face\n\n2. Trimming the picture so that it contains only a complete facial image, before processing can begin\n\n3. Decompose the picture into N resolutions, each having M channels, where N x 2 and M x 2, so that the facial image is decomposed into N x M sub-images\n\nOnce the picture has been processed, the learning stage can commence. A front-on facial image with a neutral expression is used as a learning image. The sub-images, resulting from the processing, are inputted into a N x M self-organising map neural network. This is then used to perform unsupervised classification learning. Unsupervised learning can be explained by supposing that there exists a set of N observations (x1, x2, x3,... , xN) of a random p-vector X, having joint density Pr(X). The desired outcome is to directly infer the properties of this probability density function without the aid of a supervisor, or teacher, providing the answers (Hastie et al., 2009). This estimation is done using a variety of statistical methods. The method depends upon the size of the data N and its complexity.\n\nWhen the neural networks have completed a predetermined learning process, the sub-images of the learning image are input, for a second time, into M neural networks to complete the learning process. Each neural network generates a winning unit, with a correct identification. The learning process creates a recognition decision process for determining distances from the M winning units to the winning units of each learning image. This is put into a corresponding self-organising map neural network, which finds all possible candidates. If there is only one candidate, the candidate automatically becomes the winner and the decision process is finished. When there is more than one candidate, the candidates are retained to perform a decision process in a relatively high level of resolution. A summary of the end to end learning process is shown in Figure 1.\n\nOnce the learning process has been defined using the test image, other images can be matched. An original image needs to be identified so that other pictures can be matched to it. The image to be identified then undergoes the picture processing stage previously outlined. These sub-images are then input into the neural net where the learning process, a product of unsupervised learning, is applied. Winning units should be produced, matching the new image to the original.\n\nThis is just an overview on one specific algorithm, but there are so many out there! Image recognition is really useful for identifying and categorising your products in public posts, which could be used for future promotion.  If you have any questions on image recognition or have a related project please get in touch with us.\n\nReferences\n\nHastie, T., Tibshirani, R. and Friedman, J. (2009),Unsupervised Learning, Springer New York, New York, NY, pp. 485–585.\n\nMoosmann, F., Nowak, E. and Jurie, F. (2008), ‘Randomized clustering forests for image classification’,IEEE Transactions on Pattern Analysis and Machine Intelligence 30(9), 1632–1646.\n\nTsai, K.-C. (2004), ‘Method of multi-level facial image recognition and system using the same’. US Patent 6,697,504."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/30-sleeps-til-christmas/#article",
      "headline": "30 sleeps ’til Christmas: our reflections on 2020",
      "description": "Reflecting on a challenging year\n\nWhat a year. I don't think I'm alone in wishing this particular year away and wanting to start Christmas ASAFP! 2020 has certainly thrown up a few challenges that we could never have predicted this time last year. The global pandemic has affected our lives collectively and individually on so many levels.\n\n\nAdapting to remote work\n\nFor us at Measurelab we have all been working remotely now for just over 8 months. We were thrown into a situation that on one hand w",
      "url": "https://www.measurelab.co.uk/insights/blog/30-sleeps-til-christmas/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/30-sleeps-til-christmas/#webpage"
      },
      "datePublished": "2020-11-25T15:13:00.000+00:00",
      "dateModified": "2026-01-27T11:25:04.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/stars-1.png",
      "author": {
        "@type": "Person",
        "name": "Mark Rochefort",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Measurelab"
      ],
      "articleBody": "Reflecting on a challenging year\n\nWhat a year. I don't think I'm alone in wishing this particular year away and wanting to start Christmas ASAFP! 2020 has certainly thrown up a few challenges that we could never have predicted this time last year. The global pandemic has affected our lives collectively and individually on so many levels.\n\n\nAdapting to remote work\n\nFor us at Measurelab we have all been working remotely now for just over 8 months. We were thrown into a situation that on one hand was relatively easy to adapt to, as a small and digital focussed organisation, but on the other hand was quite a challenge, as a team with a culture rooted in doing good things together.\n\n\nExperimenting and learning together\n\nWe have always been ones to experiment and question the way we do things - so, in fact, what better way to experiment with company-wide remote working? Of course, we have adapted our Google Marketing Platform training courses to all be delivered remotely too. And we have learnt so much along the way and will always be doing so.\n\n\nGrowing as a team\n\nIncredibly, throughout all this, we have also continued to grow and evolve as a team. Such that we can now count about a third of Measurelab as people who have only ever known us all as a remotely working team. Our geographical reach has changed as a result and so have so many other little nuanced aspects about how we come together to do good data.\n\n\nThanking our team\n\nSo, as we count down to Christmas I just wanted to thank all those that have stuck with us and also make a little mention of the people that have joined us these last few months... Jake, Lace, Oli, Julian, Liam and George - thank you! Your faith in jumping aboard the Measurelab-train in the midst of uncertainty around the world says it all. Here's to the future ✨\n\n[ngg src=\"galleries\" ids=\"8\" display=\"basic_thumbnail\"]"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/using-python-in-google-cloud-functions-to-automate-data-import-into-google-analytics-from-big-query/#article",
      "headline": "Google Analytics data import: automate data import with Python & Cloud functions",
      "description": "Why automate data import into Google Analytics\n\nA few months back I was granted access to a Google Cloud Source Repository (private Git repositories hosted on Google Cloud part of Google’s Cloud developer tools) that contained Python code and configuration details for automating the extraction of data from a BigQuery table and uploading to Google Analytics as a custom dimension via the Management API on a desired schedule.\n\n\nChoosing the right approach for blog word counts\n\nBeing primarily a Jav",
      "url": "https://www.measurelab.co.uk/insights/blog/using-python-in-google-cloud-functions-to-automate-data-import-into-google-analytics-from-big-query/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/using-python-in-google-cloud-functions-to-automate-data-import-into-google-analytics-from-big-query/#webpage"
      },
      "datePublished": "2020-11-16T17:43:16.000+00:00",
      "dateModified": "2025-12-15T05:18:59.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/gcp-banner.png",
      "author": {
        "@type": "Person",
        "name": "Victor Sarker",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Google Tag Manager",
        "BigQuery",
        "Google Cloud",
        "How-to"
      ],
      "articleBody": "Why automate data import into Google Analytics\n\nA few months back I was granted access to a Google Cloud Source Repository (private Git repositories hosted on Google Cloud part of Google’s Cloud developer tools) that contained Python code and configuration details for automating the extraction of data from a BigQuery table and uploading to Google Analytics as a custom dimension via the Management API on a desired schedule.\n\n\nChoosing the right approach for blog word counts\n\nBeing primarily a JavaScript-focussed individual I thought this was a good opportunity to expand my knowledge and work on something a bit different to my usual Google Tag Manager shenanigans. The only problem, however, was coming up with a suitable scenario where I could make use of this repository—thankfully, while discussing the potential applications of this code, a memory surfaced of a previous client request; namely, to collect the word count on the client’s blog articles so that they were available in a custom dimension.\n\nThis request went round to a few Measurelabbers who each came up with a different approach.\n\n\nLimitations of GTM and manual CSV uploads\n\nMy initial suggestion was to use GTM (naturally) to scrape the page in a custom JS variable, calculate a word count and pass on the value in a custom dimension field. However, this necessitates having to run a bunch of additional JS code in a user’s browser and potentially delaying the page view tag to only fire once the visible content has loaded.\n\nAnother suggested approach was to get the client to compile each word count with each page as a CSV and use the Data Import feature in Google Analytics. However, that approach requires repetitive manual input from the client every time a new blog is added.\n\n\nUsing Python and Google Cloud to solve the problem\n\nYet another suggestion was uploading the data to Google Cloud Storage or BigQuery and handling the data that way. This Google Cloud Solution offered (at least in part) a way to get round these obstacles.\n\nWith this problem in mind, I decided a good way to utilise this repo would be to to set up a word count custom dimension for Measurelab’s own blog. Now that I had an objective, it was time to get started.\n\n\nScraping the blog content with Python\n\nFirst of all, I needed to get hold of the blog word counts. Since I didn’t want to bloat the site with additional JS in GTM to scrape pages in real-time, I figured I’d acquire the pages in a different way. I realised I could create a Python script that could crawl the site at a time when there would not be much traffic and extract the information that way.\n\nI’m not going to go into the laborious, line-by-line detail of how the site-crawling code works as I’m already spilling over into Page 2 of this document.\n\n\nExtracting and cleaning the text\n\nBut once the script is running however, it identifies how many blog list pages there are, loops through those blog list pages for the blog URLs and then scrapes each one for their HTML content. Having inspected a blog page already I've identified the necessary elements that contain the text of the blog - that text gets extracted, cleaned (words made up entirely of punctuation e.g. code snippets will be thrown out) and counted. During this process I can also scrape other pieces of information if they are available (such as the blog author and the date the blog was published from any tags for example).\n\n\nFormatting data for BigQuery\n\nOnce the data has been scraped, it’s formatted into a dataframe and ready to be exported into a designated BigQuery table. Since this script is designed to be run periodically, I’ve included a code block that queries the existing table and compares it with the current dataframe, if the two are identical then there hasn’t been a new blog posted and there’s no need to update BigQuery. If the data frame is different from what is currently in BigQuery however, the table is overwritten with what was obtained during the scrape.\n\n\nSetting up the Cloud Function to push data to Google Analytics\n\nNow that there’s data available in BigQuery, the BQ_to_GA repository can finally be set up. The repo comes with a README.md file which describes the necessary steps required to deploy the cloud function.\n\n\nPrerequisites and configuration\n\nThe prerequisites to this are:\n\n 1. Access to a Google Cloud Platform project (with billing enabled), and an active Google Analytics account.\n 2. Enable API for Cloud Source Repository, Cloud Functions and Cloud Scheduler in the GCP project.\n 3. Following step 1 of Analytics API quickstart to enable the Analytics API in the GCP project and adding the service account's email id to the Google Analytics account.\n\nOnce all the above has been set up, it’s simply a case of cloning the repo into a Cloud Shell session, installing the necessary Python dependencies and configuring the config.properties file with the necessary information (service account key, BigQuery info, and GA info etc.).\n\n\nDeploying the Cloud Function and scheduling updates\n\nThere is a function included where you can test the connection to Google Analytics where the GA property ID is returned, if that is successful then the Cloud Function can be deployed. In doing this a PubSub topic is referenced (or created if it doesn’t exist) and Cloud Scheduler can be used to invoke this topic on a desired schedule.\n\n\nAutomating the workflow\n\nAfter a successful deployment and seeing a new file appear in GA’s Data Import, I altered the cloud function to run my page-crawling, word-count-scraping code to run first. Since there are only a hundred or so blog posts on the Measurelab website this process can be handled in one go with an execution time of around 2 minutes (Cloud Functions have a maximum timeout of 9 minutes or 540 seconds). For larger scrapes or code that takes extra time to run the process would need to be separated out some more.\n\n\nResults and next steps\n\nSo, in conclusion, any time a blog is posted on the Measurelab website (like this one), each night at 23:45 some python code is invoked, a table in BigQuery is updated and a new file is uploaded to GA, all in a matter of minutes - without anyone needing to push any buttons.\n\nAny comments, queries or feedback can be sent to victor@measurelab.co.uk"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/google-analytics-4/#article",
      "headline": "Google Analytics 4",
      "description": "The new future version of Google Analytics has been announced - now branded as Google Analytics 4. Building on the \"App + Web\" property that was released last year, this sets the direction for Google Analytics going forwards. It is now the default experiences for all new properties and is where all product developments will be focussed.\n\nGoogle Analytics 3, commonly known as Universal Analytics, was released in October 2012. This next product iteration for Google Analytics is a major step on fro",
      "url": "https://www.measurelab.co.uk/insights/blog/google-analytics-4/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/google-analytics-4/#webpage"
      },
      "datePublished": "2020-10-14T22:41:20.000+00:00",
      "dateModified": "2026-01-27T11:25:05.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/google-analytics.png",
      "author": {
        "@type": "Person",
        "name": "Mark Rochefort",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Looker Studio",
        "BigQuery",
        "Privacy",
        "Firebase Analytics",
        "Ecommerce"
      ],
      "articleBody": "The new future version of Google Analytics has been announced - now branded as Google Analytics 4. Building on the \"App + Web\" property that was released last year, this sets the direction for Google Analytics going forwards. It is now the default experiences for all new properties and is where all product developments will be focussed.\n\nGoogle Analytics 3, commonly known as Universal Analytics, was released in October 2012. This next product iteration for Google Analytics is a major step on from that - and has re-built the entire approach to implementation, reporting and analysis.\n\nBringing together insights across platforms and devices, at its heart are powerful machine-learning models, enabling predictions for things like churn rates and revenue. Such modelling will also be used to fill the gaps in data, caused by opt-outs and cookie blocks for example, in specific sets of data. Indeed, features such as \"consent-mode\" and \"data deletion\" directly address the need to provide a customer with greater control of their analytics data collection and management.\n\nWhile Google Analytics 4 is a new version, the underlying paradigm has actually been around a while - and it is something we are very familiar with. Both in the App + Web property released last year and, since before that, when it was powering the analytics within Firebase (Google's mobile application framework). So, if you have seen Firebase or App + Web, you are likely to recognise the direction this is headed.\n\nThis is where Google are investing any future product improvements. Game changing features such as BigQuery export (something that was previously a Google Analytics 360 - i.e. enterprise - feature only), e-commerce reporting, Data Studio connectors and much more are rolling out as we speak! Google Analytics 3 will not be developed much further - to gain from any of these new features you should be looking to make the switch to Google Analytics 4. At the moment, we suggest this is done in parallel to your existing setup so you can reasonably compare and contrast between the versions.\n\nSpeak to one of our experts to find out more about how we can help you with this transition."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/three-popular-gtm-server-side-tagging-misconceptions/#article",
      "headline": "Three popular GTM server-side tagging misconceptions",
      "description": "With the recent release of server-side tagging for Google Tag Manager, a whole new woooooorld of possibilities has opened up. But on that, some people have got the wrong idea, so with that in mind, here's three popular (but wrong!) things people believe about server-side GTM.\n\n\n1) You still need client-side GTM to make it work\n\nThis is slightly unfair, as I can see why this misconception arose. You do need something to send your hits to the GTM server, and in many cases the easiest and best thin",
      "url": "https://www.measurelab.co.uk/insights/blog/three-popular-gtm-server-side-tagging-misconceptions/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/three-popular-gtm-server-side-tagging-misconceptions/#webpage"
      },
      "datePublished": "2020-09-23T11:50:53.000+00:00",
      "dateModified": "2025-07-31T22:44:55.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/google-tag-manager-blog.png",
      "author": {
        "@type": "Person",
        "name": "Adam Englebright",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Server-side Tagging",
        "Google Tag Manager",
        "Google Analytics"
      ],
      "articleBody": "With the recent release of server-side tagging for Google Tag Manager, a whole new woooooorld of possibilities has opened up. But on that, some people have got the wrong idea, so with that in mind, here's three popular (but wrong!) things people believe about server-side GTM.\n\n\n1) You still need client-side GTM to make it work\n\nThis is slightly unfair, as I can see why this misconception arose. You do need something to send your hits to the GTM server, and in many cases the easiest and best thing to use will be the already-existing client-side GTM. A lot of the examples you see will do this, and in a lot of real cases, it will be the best and most sensible route to take. However, there is no necessity for it. If you wanted to remove GTM entirely, you could have your developers insert calls directly to GTM rather than data layer pushes, for instance. It can be treated more like Google Analytics' Measurement Protocol—or, for that matter, the prelapsarian state before man ate the fruit of the knowledge of GTM and event calls had to be delicately hardcoded onto the page individually.\n\nAs I say: I suspect in a lot of cases you will want to keep client-side GTM around to send the hits to the server, but it's not strictly speaking necessary.\n\n\n2) It's a 1:1 replacement for everything\n\nWhile some tag providers will be largely unaffected by having their tracking run through SST, there are others whose tracking ability depends on their code actually being on the page. Most heatmapping—think Hotjar, SessionCam, CrazyEgg—or 'track first, classify later' solutions like Heap, FullStory or Snowplow—require their code to be on the page. They can't hoover up and send off every little thing the user's doing from the server like that—and if you were to send everything in that way, it would obviate some of the benefit of moving to server-side tagging in the first place. The bottom line, I suppose is—if you're heavily dependent on those tools, maybe SST isn't for you; or at least, maybe you want to keep client-side GTM around too.\n\n\n3) You don't need to worry about user tracking preferences\n\nThere's been some beef lately, though thankfully not between Brian Clifton and Simo Ahava (very much the Biggie and Tupac of the digital analytics world). The beef has been between people who see the introduction of server-side GTM as an excuse to bypass people's express preferences with regards to tracking and those of us on the side of the law and God. Server-side GTM is a brilliant new tool that will allow for lighter page weight, fewer calls to external sources and better security around things like content security policies. It is not an excuse to ignore people's choice to not be tracked. Any legal concerns aside, it's just not a good thing to be doing. In the words of our Lord and Saviour Simo: “I hope people who think like this will take a moment to consider the ethical ramifications of what they’re doing”."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/life-as-a-new-starter-remote-edition/#article",
      "headline": "Life as a new starter: remote edition",
      "description": "In the analytics industry, everyone I have had the opportunity to work with is so passionate about their role and always thrives on learning and sharing techniques. So when you're starting a new job at an analytics agency you know you'll have the opportunity to learn lots of new tricks and experiment with new types of datasets, which is very exciting.\n\nExcitement is one of the two feelings you experience when starting a new job. Then comes the unknown, the nerves - What if I'm not what they expe",
      "url": "https://www.measurelab.co.uk/insights/blog/life-as-a-new-starter-remote-edition/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/life-as-a-new-starter-remote-edition/#webpage"
      },
      "datePublished": "2020-07-03T09:03:12.000+00:00",
      "dateModified": "2026-01-27T11:25:05.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/nerd2-2.png",
      "author": {
        "@type": "Person",
        "name": "Jacob Birch",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Tag Manager"
      ],
      "articleBody": "In the analytics industry, everyone I have had the opportunity to work with is so passionate about their role and always thrives on learning and sharing techniques. So when you're starting a new job at an analytics agency you know you'll have the opportunity to learn lots of new tricks and experiment with new types of datasets, which is very exciting.\n\nExcitement is one of the two feelings you experience when starting a new job. Then comes the unknown, the nerves - What if I'm not what they expect? What if I don't click with the team? What if no one likes cats?\n\nSo what happens when you are about to start a new role - then a global pandemic hits, companies begin to review their outgoings, and some of your friends and family begin to get furloughed? Well, you start asking yourself a whole load of new questions which brings more anxiety and unknowns.\n\nI joined Measurelab as a Senior Analytics Manager on 16th March, just as the lockdown began. The first few days saw everyone in the company adjusting to the 'new' environment, and I was eager to get to know everyone. There are a few practices that I experienced over the first three months that helped me settle into working remotely:\n\n\nTrust\n\nEvery team member is so transparent and honest, which creates trust between one another. We were sent a report on how our revenue was progressing against forecast throughout the time of the pandemic. Aside from the results themselves, the transparency of the reporting gave me huge confidence. Communicating changes and honesty at a time like this shows that we are a team, all working towards the same goal. Transparency is a must.\n\n\nEmpathy\n\nThis is one of Measurelab's core values - everyone tries their hardest; no one knows everything. One of my fears about my role being client-facing is that I have to provide answers on the spot. The strength of the team working together to solve problems carefully eliminates this pressure, and I soon learnt from my peers that if you need time, take it. A rushed job will cause problems in the future. Making a mistake is absolutely fine if you're honest and you can communicate the resolution quickly.\n\n\nGrowth\n\nAs mentioned, our clients need us more than ever at the moment. Everyone's been working at nearly full capacity, and Measurelab has recruited numerous new members of staff since I joined. This is so exciting as we continue to solve even more problems for our clients, as well as bring in new skills and viewpoints of analytics that we can all learn. Our next push is everything data science and engineering where we have just recruited a new lead to push the company in the right direction (where we are currently hiring at the time of writing this!).\n\n\nKnowledge\n\nEveryone at Measurelab loves to learn - and we always are. We learn from each other every day by running ideas past each other, showing solutions to the group and tackling problems by putting our heads together. We love to share our learning in other blog posts too, where recently we have updated our GTM Solutions series. This is so important - don't stop learning, and always be surrounded by people cleverererer than you!\n\nIf I was to give any advice to someone joining a new company during this time - ask your new employer the following questions:\n\n * How are you maintaining communication and trust within the team remotely?\n * What are you doing to ensure everyone has the right level of support?\n * How do you ensure that members of the team are always upskilling and learning from each other?\n\nIf you're thinking about moving to a new adventure during this time, and the companies core values align with your own, go for it."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/we-are-going-big-on-data/#article",
      "headline": "We are going BIG on DATA",
      "description": "See what we did there? Okay, so maybe a tad too much on the title. It is catchy, so hey.\n\nFirstly - we are pretty chuffed to welcome Lace to our team. She joins us to spearhead our offering in all things DATA science and data engineering, which (to be completely frank) is where all roads point in this analytics game. With the advent of App plus Web (from Google Analytics), and particularly the opportunity to access raw data through BigQuery, this is an exciting place to be right now.\n\nSecondly -",
      "url": "https://www.measurelab.co.uk/insights/blog/we-are-going-big-on-data/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/we-are-going-big-on-data/#webpage"
      },
      "datePublished": "2020-06-29T19:44:51.000+00:00",
      "dateModified": "2026-01-27T11:25:05.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/hands.png",
      "author": {
        "@type": "Person",
        "name": "Mark Rochefort",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "BigQuery",
        "SQL"
      ],
      "articleBody": "See what we did there? Okay, so maybe a tad too much on the title. It is catchy, so hey.\n\nFirstly - we are pretty chuffed to welcome Lace to our team. She joins us to spearhead our offering in all things DATA science and data engineering, which (to be completely frank) is where all roads point in this analytics game. With the advent of App plus Web (from Google Analytics), and particularly the opportunity to access raw data through BigQuery, this is an exciting place to be right now.\n\nSecondly - we are growing the team and going BIG. It has been a crazy few months. The pandemic still prevails. People are uncertain of what the future looks like. And so this is precisely the time to grasp that nettle and carve out a path for our future. We are fortunate to already be working in a field that has become even more relevant; it is a fairly good bet right now. What all this has changed though are the parameters within which we can play. Suddenly we are all working from home - and that changes how we all look at stuff. It also means we can look to revisit the status quo for the better - forever - to create a more sustainable and scalable way of doing all this. Again - quite an exciting place to be!\n\nSo that's all... If you think any of these roles could be you then get in touch (by emailing jobs@measurelab.co.uk). In fact - get in touch if you think that Measurelab might be the right sort of place for you. We are more about finding the right people than finding people who fit a job description."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/gtm-solutions-corner-5-tracking-changes-in-pre-populated-html-form-fields/#article",
      "headline": "Google Tag Manager form field tracking: capture pre-populated form changes",
      "description": "This is part 5 (and my first contribution, so bear with me) to this \"semi-regular\" series, dedicated to reusable GTM solutions for scenarios or issues we’ve encountered more than once. Last time, we looked at how to capture existing classic Google Analytics calls with GTM, and this time we'll be exploring how to track changes in pre-populated HTML form fields.\n\n\nWhy I did it\n\nI was recently approached with a request from a client who wanted to know which fields were updated in a form that was pa",
      "url": "https://www.measurelab.co.uk/insights/blog/gtm-solutions-corner-5-tracking-changes-in-pre-populated-html-form-fields/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/gtm-solutions-corner-5-tracking-changes-in-pre-populated-html-form-fields/#webpage"
      },
      "datePublished": "2020-06-22T17:41:34.000+00:00",
      "dateModified": "2025-12-10T02:58:41.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/treated_9-1.jpg",
      "author": {
        "@type": "Person",
        "name": "Victor Sarker",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Google Tag Manager",
        "SQL"
      ],
      "articleBody": "This is part 5 (and my first contribution, so bear with me) to this \"semi-regular\" series, dedicated to reusable GTM solutions for scenarios or issues we’ve encountered more than once. Last time, we looked at how to capture existing classic Google Analytics calls with GTM, and this time we'll be exploring how to track changes in pre-populated HTML form fields.\n\n\nWhy I did it\n\nI was recently approached with a request from a client who wanted to know which fields were updated in a form that was part of an account renewal process. These fields would include primary/secondary email/postal addresses. Since this work would involve interactions with individual HTML form input elements, I drew inspiration from Simo Ahava's blog post on Form Abandonment tracking and incorporated it as part of this solution. Let's take a closer look at how it works, shall we?\n\n\nOverview\n\nThe solution will be contained within a Custom HTML Tag that will be deployed using Google Tag Manager. The contents of this tag can be found here. You can choose to deploy the tag across the entire site, or specify a trigger to only fire the code on certain pages that require forms to be tracked.\n\n\nQuick-start\n\nWe start by first defining the CSS selectors and form attributes we need to capture the necessary elements of the HTML form.\n\nvar formSelector = 'form';\n\nThe first variable 'formSelector' targets the entire form element - modify this to be more specific if you have more than one on the page (by default it will select the first form on the page).\n\nvar attribute = 'name';\n\nSecondly, the 'attribute' variable is the name of the element attribute that is shared across all the or elements from within the form. In most forms the 'name' attribute is usually what is stored here, but this can be changed.\n\nAnd that's it. As long as the HTML forms are not set up in an overly-elaborate or inconsistent manner then this should be all that is required to be initialised to get this tag working.\n\n\nThe nitty gritty\n\nFor those interested, I'll attempt to describe how the process works. So here goes. We create a new function and declare some variables (including the two mentioned in the previous section):\n\nfunction formFieldUpdates() {\n    var formSelector = 'form';\n    var attribute = 'name';\n    var inputSelector = formSelector + ' input[' + attribute + '], ' + formSelector + ' select[' + attribute + ']';\n    var inputs = [];\n    var initObj = {};\n    var eventAction, i;\n\nWhen the function begins…functioning… it grabs all of the input fields and pushes them into an array:\n\nwindow.document.querySelectorAll(inputSelector).forEach(function (input) {\n        inputs.push(input);\n    });\n\nThen for each input, we store current values of those elements in an object as key-value pairs e.g. 'firstName': 'Victor', 'lastName': 'Sarker':\n\nfor (var input of inputs) {\n        initObj[input.getAttribute(attribute)] = input.value;\n    }\n\nNext, we create a fresh copy of that object to store the values of any changes to those input field values that may happen on the page:\n\nvar newObj = JSON.parse(JSON.stringify(initObj));\n\nNow that we have our 'initial' and 'new' objects, let's define a function that will compare the two and determine which keys have been changed:\n\n// keep track of the form update history\n    var updateHistory = [];\n// check the new object for updated property values\nvar getUpdatedProps = function (newObj, initObj) {\n    var updates = [];\n    for (var key in newObj) {\n        if (newObj[key] !== initObj[key]) {\n            if (initObj[key] === '') { // addition\n                updates.push(key + ' added');\n            } else if (newObj[key] === '') {\n                updates.push(key + ' removed'); // deletion\n            } else {\n                updates.push(key + ' updated'); // updated\n            }\n        }\n    }\n    return updates.join(', ')\n}</code></pre>\n\n\n\nThis method will iterate over each key in the new object (each of our selected input form fields) and check against the initial object to see if the value has changed. If so, then it will check whether the field was empty in either the initial state or new state. This will determine whether an entry has been added or removed. If the values were not empty in both then the field has simply been updated. We keep track of each check by pushing the key and how it was changed into an array. The method then returns a list by joining these array elements together by forming a comma-separated list.\n\nWith everything in place, all that needs to happen is add the event listeners. There is one that will listen out for changes in the form fields:\n\nwindow.document.querySelector(formSelector).addEventListener('change', function (e) {\n        updateHistory.push(e.target.getAttribute(attribute));\n        newObj[e.target.getAttribute(attribute)] = e.target.value;\n    });\n\nThere is one that will push a data layer event when the form is submitted. The event will only be pushed if there has been at least one change in the fields:\n\nwindow.document.querySelector(formSelector).addEventListener('submit', function () {\n        eventAction = getUpdatedProps(newObj, initObj);\n        if (updateHistory.length && (newObj !== initObj)) {\n            window.dataLayer.push({\n                event: 'formFieldsUpdated',\n                eventCategory: 'Form Fields Updated',\n                eventAction: eventAction\n            })\n        }\n    });\n\nFinally, since it would be a shame not to include it, we add the 'beforeunload' listener used in Simo's form abandonment post so that if the form is not completed, an event is pushed to the data layer that describes which fields were interacted with.\n\nvar i;\nvar checkSubmit = function () {\n        i = window.dataLayer.length - 1;\n        while (i > -1) {\n            if (window.dataLayer[i].event === 'gtm.formSubmit') {\n                return true;\n            }\n            i--;\n        }\n    };\n\n    window.addEventListener('beforeunload', function () {\n        if (!checkSubmit()) {\n            window.dataLayer.push({\n                event: 'formAbandonment',\n                eventCategory: 'Form Abandonment',\n                eventAction: updateHistory.join(' > ')\n            });\n        }\n    });\n\nAnd there you have it. Enjoy."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/emergency-analytics-support/#article",
      "headline": "Emergency Analytics Support",
      "description": "It can be tricky judging how to pitch a new offer in times of crisis. There’s a fine line between being genuinely helpful and appearing exploitative.\n\n\nSometimes you have to just jump in and try things, knowing they may be misinterpreted by the minority. In business, indecision can be crippling. While people’s lives are undoubtedly the most precious thing, livelihoods are worth saving too.\n\n\nA number of our clients - particularly those in the retail sector - have been hit hard by recent events. ",
      "url": "https://www.measurelab.co.uk/insights/blog/emergency-analytics-support/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/emergency-analytics-support/#webpage"
      },
      "datePublished": "2020-04-02T16:12:24.000+00:00",
      "dateModified": "2025-11-17T14:17:34.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/mask.png",
      "author": {
        "@type": "Person",
        "name": "Steven Elliott",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Google Tag Manager",
        "Looker Studio",
        "BigQuery",
        "Debugging",
        "Marketing"
      ],
      "articleBody": "It can be tricky judging how to pitch a new offer in times of crisis. There’s a fine line between being genuinely helpful and appearing exploitative.\n\n\nSometimes you have to just jump in and try things, knowing they may be misinterpreted by the minority. In business, indecision can be crippling. While people’s lives are undoubtedly the most precious thing, livelihoods are worth saving too.\n\n\nA number of our clients - particularly those in the retail sector - have been hit hard by recent events. As a consequence, our business has suffered too. It feels like every email and phone call carries the threat of a pause or cancellation. Like many other companies, we’ve been compelled to reexamine our business model and consider steps we may not have taken otherwise.\n\n\nHistorically we’ve only ever worked on a retained basis, on the grounds that long-term engagements give us not only the most financial security, but the best chance of delivering value. We firmly believe analytics is an ongoing endeavour, not a one-time fix. The tenure of most clients, and the proportion of our business that comes from referrals, suggests our judgement has been sound.\n\n\nThese aren’t normal times though, and business is anything but usual.\n\n\nI’m pretty sure there’s a number of companies out there with digital marketing and analytics teams depleted for one reason or another. It could be that key staff are unwell, or have their hands full caring for dependants. We’re starting to hear of entire teams being furloughed, and many companies have put in place a headcount freeze for the foreseeable future.\n\n\nAnd yet the demand for up-to-date information and insight is greater than ever. When physical stores close, there’s even more attention focused on digital properties. These same companies desperately need to understand new behaviours and establish new baselines. They need to automate daily reports in case the people aren’t there to produce them and accurately predict demand so the moment they see an uptick, they’re ready to ramp ad spends, reorder stock or get production lines producing.\n\n\nWe need to do what we can to keep businesses moving. Closer to home, we need to keep people busy and productive. That’s why we’ve taken the decision to offer free 20-minute remote consultations to UK-based companies to provide support on the core Google tools that we have expertise in: Google Analytics, Google Tag Manager, Google Data Studio and Google BigQuery.\n\n\nBook a session and our certified experts will do their best to answer your questions or solve your problem on the spot. It could be setting up a custom report in Google Analytics, debugging a tag in GTM, checking a connection in Data Studio or doing a quick code review for BigQuery. If we can’t fix it there and then, we’ll quote for completing the work as soon as we can divert time away from our retained clients.\n\n\nThere’s no catch. The consultation is genuinely free and any estimate given comes with no obligation. However we naturally hope at least one or two paid projects result from the time we invest in helping people. If not straight away, then maybe down the line when times are better and budgets are replenished.\n\n\nLet’s all hope those times come sooner rather than later. Keep calm and carry on measuring!\n"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/life-moves-pretty-fast/#article",
      "headline": "Life moves pretty fast: navigating the remote work transition",
      "description": "Realising change was coming\n\nOn Thursday, 12 March, advice about the coronavirus was still unclear. We did what we do best, we looked at the numbers. The modelling made it clear that, for the health of our team and community, we should move to remote work and begin social distancing.\n\n\nAdapting to remote work overnight\n\nIt was a sudden change. Yet, being a digital (and people) business meant that this transition was a relatively easy one. We don't exactly have a factory to dismantle and move. Ou",
      "url": "https://www.measurelab.co.uk/insights/blog/life-moves-pretty-fast/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/life-moves-pretty-fast/#webpage"
      },
      "datePublished": "2020-03-22T11:24:55.000+00:00",
      "dateModified": "2026-01-27T11:25:06.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/12/stay-home.png",
      "author": {
        "@type": "Person",
        "name": "Mark Rochefort",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "articleBody": "Realising change was coming\n\nOn Thursday, 12 March, advice about the coronavirus was still unclear. We did what we do best, we looked at the numbers. The modelling made it clear that, for the health of our team and community, we should move to remote work and begin social distancing.\n\n\nAdapting to remote work overnight\n\nIt was a sudden change. Yet, being a digital (and people) business meant that this transition was a relatively easy one. We don't exactly have a factory to dismantle and move. Our work can be done in the cloud and with a laptop, so we are lucky in that regard. The next day people were set up and we were having our first virtual stand-up.\n\nIt has been quite a week - both Adam and Victor have posted about their experiences so far. I'm sure there'll be more to come.\n\n\nKeeping our team culture alive\n\nWe are still learning what works and what doesn't. Our culture is the backbone of the company. We are a small team and we have all established some amazing social bonds through work and socialising that strengthen the way in which we all collaborate. Now we are learning that while videos calls will not replace the real thing, they are invaluable in maintaining clear communication - so much can be lost in Slack or email. We even had a Friday evening remote beer in place of Friday evening IRL beer - and it was nice to all wind down together at the end of the week.\n\n\nManaging anxieties and responsibilities\n\nWe all have understandable Coronavirus anxieties and it helps to know that everybody is in the same boat - both on a personal level and a business level - in some form or another. For me, on a personal level, I worry about my friends, my family (not just my young kids and my wife, who works for the NHS, but everyone - they all have stuff going on) and my parents in particular (my Mum is caring for my very vulnerable Dad at home, with the incredible help of others). On a business level, the financial support measures announced on Friday have certainly helped with some immediate concerns. So much is changing so fast.\n\n\nSeeing the best in our communities\n\nOne thing that really has struck me is how our local communities are helping and looking out for each other. Online or offline there are caring people offering all sorts of support - and that is truly strengthening to see.\n\n\nMeasurelab doing its part\n\nI want Measurelab to be part of these efforts in its own little way. The first thing we can all do is stay at home. People on the frontline of the NHS are already overwhelmed and they need every bit of help they can get. Beyond this, we are busy putting our heads together (albeit at an acceptable social distance, i.e. virtually) to see what we can best do as a business.\n\n\nMoving forward together\n\nTimes, they are a changing. Let's do what we can to help each other get through this and out the other side."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/allowed-to-recommended-week-1/#article",
      "headline": "Allowed to recommended: Week 1 – Remote work challenges in the UK",
      "description": "Last week the government's coronavirus advice moved from \"contain\" to \"delay\", and Measurelab moved from \"allowing\" to \"recommending\" that we work from home. As people left the office, one at a time, I couldn't help but feeling that I was saying goodbye to people for what would probably be quite a while. It's been a week since I've seen any of my colleagues in person and while we've been trying our best to continue to foster office camaraderie remotely, it's been a bit of a learning curve for al",
      "url": "https://www.measurelab.co.uk/insights/blog/allowed-to-recommended-week-1/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/allowed-to-recommended-week-1/#webpage"
      },
      "datePublished": "2020-03-20T17:43:24.000+00:00",
      "dateModified": "2025-12-10T00:44:35.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/image-12.png",
      "author": {
        "@type": "Person",
        "name": "Adam Englebright",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "articleBody": "Last week the government's coronavirus advice moved from \"contain\" to \"delay\", and Measurelab moved from \"allowing\" to \"recommending\" that we work from home. As people left the office, one at a time, I couldn't help but feeling that I was saying goodbye to people for what would probably be quite a while. It's been a week since I've seen any of my colleagues in person and while we've been trying our best to continue to foster office camaraderie remotely, it's been a bit of a learning curve for all of us.\n\nThe experience of trying has taught me, amongst other things, that video-chat software isn't made equal. Before this I would've said Hangouts, Zoom, whatever; it doesn't matter what you use. I still think that's true for 2- or 3-person calls, but once you start getting a fair few people on a call, as we have been for our morning catchup calls, Zoom's gallery view makes it a lot easier to see everyone and make it feel like we're all together.\n\nA lot of my work is stuff I can \"just do\", which makes things a bit easier than it has been for others—I have several colleagues whose days are chiefly composed of internal or client calls. Chaining those one into another, much as that can impact you in the office, can be even worse when you don't have the stand-up-move-around of going in and out of a meeting room, or just getting up and moving around in-between.\n\nI've not done much working from home prior to this, so it's been a bit of an abrupt adjustment. I woke up early, and damn, I don't have my usual half-hour commute? I guess I'll… start early? And then… not stop? A lot of the usual rhythms of the working day are thrown off without familiar external cues, but I've been slowly adjusting. A lot of that has been, while embracing the newfound flexibility, enforcing or re-creating certain office-work behaviours. My colleague Dave talked about having a \"shut-down ritual\", closing your laptop and saying \"I am done\", then going for a quick walk around the block. I've also been trying to enforce breaks by making lots of cups of tea. Leaving the house at lunchtime, even if it's just going out onto the balcony and swinging my arms around, or a quick wander around the park, is really useful.\n\nWorking from home isn't like doing psychedelics in most respects, but one way it is would be the importance of set and setting. I've tried to maintain a distinction between \"work mode\" and \"home mode\" that's usually provided by a change of location. For me, it even comes down to stuff like wearing the clothes I'd normally wear to the office rather than Primark jogging bottoms I own exclusively to laze around the house in. If you're not used to working from home, as I'm not, it's easy to slip into bad habits, poor posture, etc. I've also been trying to separate my work-space physically—I'm lucky enough to have a study so as the week has gone on I've realised I'm probably better off not lounging on the sofa in the living room but rather being sat up straight in a proper chair, and so on.\n\nAs I'm finishing this up, it's Friday afternoon, and we're having a nice end-of-the-week group video chat over some beers. The vibes are good and everyone is smiling. The more we can see each others' faces and hear each others' voices the better, I think. The more we try and continue to foster that environment, the easier this will be. It's somewhat anxiety-inducing not knowing how long this is going to last, but I'm feeling more optimistic, at least right now."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/working-from-home-an-alternative-blog-post/#article",
      "headline": "Working From Home: An Alternative Blog Post",
      "description": "I wouldn't really consider myself a writer and to my knowledge I've only ever written one blog post in my entire lifetime (which was more like a sarcastic Dry January Facebook post). But when Adam said he was writing a blog post about their experience of Working From Home during this Covid-19 pandemic and was asking for input from others - it sort of turned into it's own blog post anyway, so here goes:\n\nEvery day I wake up and I'm full of energy.  In fact, I find myself with enough extra energy ",
      "url": "https://www.measurelab.co.uk/insights/blog/working-from-home-an-alternative-blog-post/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/working-from-home-an-alternative-blog-post/#webpage"
      },
      "datePublished": "2020-03-20T16:07:00.000+00:00",
      "dateModified": "2025-11-21T17:01:19.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/web3-work-from-home-computer-funny-silly-shutterstock_589145861.jpg",
      "author": {
        "@type": "Person",
        "name": "Victor Sarker",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "articleBody": "I wouldn't really consider myself a writer and to my knowledge I've only ever written one blog post in my entire lifetime (which was more like a sarcastic Dry January Facebook post). But when Adam said he was writing a blog post about their experience of Working From Home during this Covid-19 pandemic and was asking for input from others - it sort of turned into it's own blog post anyway, so here goes:\n\nEvery day I wake up and I'm full of energy.  In fact, I find myself with enough extra energy (and additional time) to prepare myself for the day both physically and mentally and still have plenty of time to do my working hours. If there wasn't a killer virus on the loose I'd have plenty to go the gym in the morning without having to sacrifice on free time or sleep (some people might just call me lazy but I struggle to wake up at stupid times like '7 am'. Ridiculous.)\n\nHowever there is a danger: with the absence of a commute, I find myself at risk of over-working each day. 08:30-17:30 (maybe even 18:00) since I'm usually back home at 18:30 on most days (exhausted). Respecting the boundaries of the working hours is a must - Dave suggested the idea of taking a quick minute to walk down the road and coming back at the end of the day works very well to reset your brain out of the work mindset. Steve also suggested signing the day off with a tasty beverage. I guess either is a good option depending on the weather.\n\n\nAdditionally, I am making sure that I am only eating during designated meal times, there's a risk of me just engorging on food constantly, but since there's a shortage of that stuff available I have to be sensible.\n\nI have also observed that I am able to focus better and consider myself to be more productive getting on with most of my tasks. Since a lot of my work usually has a relatively fast turnaround and can be worked on independently this may be easier for someone like me as opposed to someone who is more client-facing or requires regular updates from the team.\n\nHowever, I've found quick calls on slack to be very quick and useful and do not tend to last for too long. Group calls of more than say 4 people do tend to take much more time, most likely due to the delay in transmission, and the technical gymnastics required to make sure people don't talk at the same time - adding further delay. Perhaps creating a very quick agenda at/before the start will help.\n\n\nI suppose there is an additional factor of the lack of human interaction and contact to consider but, frankly, this is what I consider \"normal\". However, I must concede that I do miss the alcoholic Friday camaraderie with a bit of beer, some chit-chat and local multiplayer video games which an online video conference can't reproduce.\n\nLastly, I thought I'd just put a list of some \"WFH Lifehacks\" in case you're the type of person who skim-reads and heads straight to anything with bullet points:\n\n  1)  Don't, under ANY circumstances, drop your laptop or your phone down the toilet (especially during a video call) as this may prove to be embarrassing. Oh, and wash your hands. Often. Like, right now.\n\n  2)  It's easy to go stir-crazy at home, especially if you are alone, try to have some ambient music or noise on in the background - nothing too distracting.\n     2a)  Alternatively, play \"Best of Trance Mix (Old School)\" on YouTube at 10am to really get yourself PUMPED for the working day.\n\n  3)  Make sure your feet touch the ground! - Get up and stretch your legs every hour - it is easy to develop DBT (Deep Bunghole Thrombosis) if you're glued to your seat - especially if you continue to be stuck at the same workstation in your out-of-work time (like me).\n\n  4)  Try to find somewhere to have your lunch away from your work - use it as a time to give your brain a rest and take your mind of things, read a book or something.\n      4a)   OR hop on a video conference and have a good old perv at others eating their food [satisfied lip smacks in Spanish]."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/google-tag-manager-basics-3-your-first-tag/#article",
      "headline": "Google Tag Manager setup: how to create your first tag",
      "description": "Creating your first GTM tag\n\nThis is the third of a series dedicated to introducing you, faithful reader, to the wonders and delights of Google Tag Manager. Last time, we took a high-level look at GTM and how it works, and today we'll be looking at how to set up a simple tag.\n\n\nSetting up a Google Analytics pageview tag\n\nWe're going to set up a Google Analytics pageview tag. This replaces the old hardcoded GA that you'd used to have to put on every page of the site. We start by going to tags and",
      "url": "https://www.measurelab.co.uk/insights/blog/google-tag-manager-basics-3-your-first-tag/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/google-tag-manager-basics-3-your-first-tag/#webpage"
      },
      "datePublished": "2020-02-07T16:00:00.000+00:00",
      "dateModified": "2026-01-27T11:25:06.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/gtm-basics-course.png",
      "author": {
        "@type": "Person",
        "name": "Adam Englebright",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Google Tag Manager",
        "Privacy"
      ],
      "articleBody": "Creating your first GTM tag\n\nThis is the third of a series dedicated to introducing you, faithful reader, to the wonders and delights of Google Tag Manager. Last time, we took a high-level look at GTM and how it works, and today we'll be looking at how to set up a simple tag.\n\n\nSetting up a Google Analytics pageview tag\n\nWe're going to set up a Google Analytics pageview tag. This replaces the old hardcoded GA that you'd used to have to put on every page of the site. We start by going to tags and selecting the \"New\" button in the top-right.\n\n\nConfiguring the tag\n\nThe tag creation pane slides over, and we click into the Tag Configuration block there to open the tag template menu:\n\n\nChoosing the template and track type\n\nSelect Universal Analytics from the list, because that's the tag template we're using here:\n\nThere's the option to select between pageview, event, and some other track types but we're going to stick with Pageview.\n\n\nCreating the GA settings variable\n\nThen we have to select what variable is going to contain our settings. There's no settings variable yet, so we're going to create a new one by selecting \"New Variable\" at the bottom there:\n\nThis highlights something quite important about GTM—you can do things in several different ways. If I'd thought ahead, I could've created my GA settings variable beforehand, but since I didn't I can create it 'on the fly' while making my tag, without having to back out of the tag creation interface. Here, I'm going to add my tracking ID (not real) and give my variable a name. We'll leave Cookie Domain set to auto:\n\nThat's all the configuration we need to do for this tag's settings for the time being!\n\n\nAdding a trigger and saving\n\nAll that remains is adding a name and a trigger. We add the name by editing the name field at the top, and the trigger by clicking the block at the bottom:\n\nThere's only one built-in trigger in GTM, but fortunately that's the one we want—All Pages; as this is replacing the GA code we'd put on all pages to fire:\n\nNow we're done, we just need to click the Save button in the top-right:\n\n\nFirst tag complete\n\nNow you've set up your first tag! Next time, we’ll be looking at testing the tag we've just implemented! If you have any questions, please get in touch 🙂"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/audience-activation-in-5-simple-steps/#article",
      "headline": "Audience activation in 5 simple steps",
      "description": "Amidst news of cookies crumbling and third party cookies eventually becoming obsolete, there is even more emphasis on identifying visitors who arrive on websites and providing users with a reason to remain loyal to your brand.\n\nHere is a simple user case on how to effectively personalise your customer experience using the Google Marketing Platform. According to Econsultancy:\n\n“50% of consumers are likely to engage with a brand when they receive an interesting offer.”\n\nSo how can you demonstrate ",
      "url": "https://www.measurelab.co.uk/insights/blog/audience-activation-in-5-simple-steps/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/audience-activation-in-5-simple-steps/#webpage"
      },
      "datePublished": "2020-02-04T16:28:07.000+00:00",
      "dateModified": "2025-12-01T06:11:22.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/s3-news-tmp-980-crowd-reflection-color-toy-1679618-default-1280.jpg",
      "author": {
        "@type": "Person",
        "name": "Aimée Hart",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Privacy",
        "Marketing"
      ],
      "articleBody": "Amidst news of cookies crumbling and third party cookies eventually becoming obsolete, there is even more emphasis on identifying visitors who arrive on websites and providing users with a reason to remain loyal to your brand.\n\nHere is a simple user case on how to effectively personalise your customer experience using the Google Marketing Platform. According to Econsultancy:\n\n“50% of consumers are likely to engage with a brand when they receive an interesting offer.”\n\nSo how can you demonstrate why personalisation should be a business priority in 5 simple steps?\n\nExample User case\n\nProcess\n\n1: Link your Display & Video 360 advertiser and Optimize container to your Analytics property.\n\n2: In Analytics 360, create an audience (‘3 Orders-12 Months-Low AOV’) for users that meet the following conditions:\n\nTransactions per user > 2, AND\n\nDate of First Session is on or after 04/02/2020, AND\n\nRevenue per user < £30 (Site wide Average AOV)\n\n\nIn the ‘Audience destinations’ section, select your Display & Video 360 and Optimize accounts.\n\n3: In Optimize 360, set up an experiment that shows a banner on the landing page with the message, “Indulge yourself: free travel size Product X when you spend £30 or more”. Target the experiment to the ‘3 Orders-12 Months-Low AOV’ audience.\n\n4: In Display & Video 360, create a remarketing campaign, targeted to the ‘3 Orders-12 Months-Low AOV’ audience, with creatives that feature the message: “Indulge yourself: free travel size Product X when you spend £30 or more”.\n\n5: Analyse the Display & Video 360 reports in the Acquisition section of Analytics 360 to see conversion metrics for your newly created audience\n\nIn 5 steps we have a personalised experience with uplifts and tangible benefits to take back to your stakeholders.\n\nHappy analysing! Get in touch to share your experiences.\n\n"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/gtm-solutions-corner-4-capturing-existing-classic-ga-calls/#article",
      "headline": "Capturing existing classic GA calls with GTM – Solutions Corner #4",
      "description": "This is part 4 of a semi-regular series, dedicated to reusable GTM solutions for scenarios or issues we’ve encountered more than once.\n\n\nThe challenge with pre-GTM classic calls\n\nLast time, we looked at how to turn on-page classic Google Analytics calls to data layer pushes, and this time we'll be looking at a supplement to that—what if the classic GA call you're looking to capture is before GTM loads? This pretty much only matters for ecommerce, so that's what the solution focuses on.\n\nWe start",
      "url": "https://www.measurelab.co.uk/insights/blog/gtm-solutions-corner-4-capturing-existing-classic-ga-calls/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/gtm-solutions-corner-4-capturing-existing-classic-ga-calls/#webpage"
      },
      "datePublished": "2020-01-29T17:23:16.000+00:00",
      "dateModified": "2026-01-27T11:25:06.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/12/image-1.png",
      "author": {
        "@type": "Person",
        "name": "Adam Englebright",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Google Tag Manager",
        "Ecommerce"
      ],
      "articleBody": "This is part 4 of a semi-regular series, dedicated to reusable GTM solutions for scenarios or issues we’ve encountered more than once.\n\n\nThe challenge with pre-GTM classic calls\n\nLast time, we looked at how to turn on-page classic Google Analytics calls to data layer pushes, and this time we'll be looking at a supplement to that—what if the classic GA call you're looking to capture is before GTM loads? This pretty much only matters for ecommerce, so that's what the solution focuses on.\n\nWe start by defining some variables:\n\nvar gaq = window._gaq;\nvar ctdl_obj = {};\nvar ctdl_arr = [];\n\nThe second two are where we're going to push some values a bit later, and the first one is getting the existing _gaq object.\n\nfor(i=0;i < gaq.length;i++){\n\nNow we're going to start looping through gaq to see what's in there.\n\n if(gaq[i][0] === \"_addTrans\"){\n    window.ctdl_obj.id = gaq[i][1];\n    window.ctdl_obj.affiliation = gaq[i][2];\n    window.ctdl_obj.revenue = gaq[i][3];\n\nIf we find a \"_addTrans\" which is the push that adds the transaction-level information, we write it into the ctdl_obj we created at the beginning, in Enhanced Ecommerce format.\n\n } else if(gaq[i][0] === \"_addItem\"){\n    window.ctdl_arr.push({\n          'id':gaq[i][2],\n          'name':gaq[i][3],\n          'category':gaq[i][4],\n\t\t      'price':gaq[i][5],\n          'quantity':gaq[i][6]\n        })\n\nThen if it's \"_addItem\", the pushes which add items (obviously!) we push that into the ctdl_arr array we created earlier.\n\n } else if(gaq[i][0] === \"_trackTrans\"){\n    dataLayer.push({\n          'event': 'hcga_trans',\n            'ecommerce': {\n        \t\t'purchase':{\n          \t\t\t'actionField' : window.ctdl_obj,\n          \t\t\t'products' : window.ctdl_arr\n        \t\t\t\t\t}\n      \t\t\t\t\t}\n        \t\t\t}\n\t\t\t\t);\n  }\n}\n\nFinally, once we hit the \"_trackTrans\" push, we arrange all the stuff we've gathered into EE format and push it into the data layer.\n\n\nNext steps\n\nOnce you’ve added this in a custom HTML tag to fire where it's needed, you’ll need to configure a GA tag to fire on the data layer push. The solution is also available in full on the Measurelab Github. Please drop me a line if you’ve got any questions or ideas for improvement!"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/google-tag-manager-basics-2-a-closer-look-at-gtm/#article",
      "headline": "Google Tag Manager basics: a closer look at GTM’s core concepts",
      "description": "Exploring GTM core concepts\n\nThis is the second of a series dedicated to introducing you, faithful reader, to the wonders and delights of Google Tag Manager. Last time, we were looking at just what a tag manager is anyway? This time, we'll be taking a look at GTM itself.\n\nWe're going to go through the three key components of GTM: tags, triggers and variables. We're not going to touch on the other things in the GTM sidebar, folders and templates, for the time being—they're useful extensions but n",
      "url": "https://www.measurelab.co.uk/insights/blog/google-tag-manager-basics-2-a-closer-look-at-gtm/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/google-tag-manager-basics-2-a-closer-look-at-gtm/#webpage"
      },
      "datePublished": "2020-01-24T18:03:37.000+00:00",
      "dateModified": "2026-01-27T11:25:07.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/gtm-basics-course-1.png",
      "author": {
        "@type": "Person",
        "name": "Adam Englebright",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Google Tag Manager"
      ],
      "articleBody": "Exploring GTM core concepts\n\nThis is the second of a series dedicated to introducing you, faithful reader, to the wonders and delights of Google Tag Manager. Last time, we were looking at just what a tag manager is anyway? This time, we'll be taking a look at GTM itself.\n\nWe're going to go through the three key components of GTM: tags, triggers and variables. We're not going to touch on the other things in the GTM sidebar, folders and templates, for the time being—they're useful extensions but not truly core functionality in the way that these three are.\n\n\nUnderstanding tags\n\nWe'll start with tags, since they're in the name—they're the components within GTM that send information to outside providers. You have tags to send information to Google Analytics or Doubleclick or whoever you want—or, if you'd like, to change things on the site.\n\n\nTemplated vs custom tags\n\nTags are just blocks of code; and in GTM they come in two varieties— templated and custom. Templated tags are provider-specific, and quite straightforward–you just fill in the boxes! They're a \"friendly face\" so that you don't have to deal directly with code. Custom tags are blank canvases, and powerful—you can do pretty much whatever you want with them! You can use them to add tags from providers who don't have templates—e.g. Facebook—or make changes to the site code itself¹.\n\n\nVariables: GTM’s little Lego bricks\n\nA lot of the information they send is provided by variables, which retrieve information either from the GTM itself, from the site or from the data layer.\n\nVariables are little units of data, the icon for which looks like a Lego brick, which I personally think is delightful. They can return values about the page (its URL, for instance), or if you interact with something on the page—click on a link, say—return values about the element you interacted with (its URL or text). They can do all sorts of other things too—and we'll examine them as we get further into GTM.\n\n\nTriggers: when tags fire\n\nVariables are also used by triggers to determine when the tags should fire. There are a number of different types of trigger, based on all the different sorts of user interaction that GTM can listen out for—page view, link clicks, form submission etc. Then within that, you can specify additional conditions—this trigger will fire any tags attached to it when this event happens, provided this variable meets these conditions. For example, a link click trigger might only fire when the url being clicked on has a different hostname to the site hostname, and hence is outbound.\n\n\nWrapping up GTM basics\n\nThis was a quick overview of the different components of GTM. They might seem somewhat abstract, but once you start using the tool, they'll begin to become more concrete. Next time, we'll be looking at creating a simple tag in GTM! If you have any questions, please get in touch 🙂\n\n¹: Since the addition of templates, it's now not necessary to run a lot of more common tags without providers as custom tags, as the community template gallery provides templates for many common but previously un-templated tags!"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/google-tag-manager-basics-1-what-is-a-tag-manager/#article",
      "headline": "Google Tag Manager Basics #1 - What Is A Tag Manager?",
      "description": "This is the first of a new series dedicated to introducing the uninitiated to the wonders and delights of Google Tag Manager. Before we start thinking too closely about GTM itself, though, we'll pull back a bit and ask:\n\n\nWhat is a tag manager?\n\nA tag manager is a service that allows you to remotely insert and manage small pieces of code, or “tags”, onto a site by means of a Javascript snippet placed across the whole site.\n\nThere are a number of different tag managers out there—Tealium, Ensighte",
      "url": "https://www.measurelab.co.uk/insights/blog/google-tag-manager-basics-1-what-is-a-tag-manager/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/google-tag-manager-basics-1-what-is-a-tag-manager/#webpage"
      },
      "datePublished": "2020-01-17T17:50:53.000+00:00",
      "dateModified": "2025-07-31T20:36:28.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/gtm-basics-course-2.png",
      "author": {
        "@type": "Person",
        "name": "Adam Englebright",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Google Tag Manager",
        "Conversion Tracking",
        "Marketing",
        "Google Ads"
      ],
      "articleBody": "This is the first of a new series dedicated to introducing the uninitiated to the wonders and delights of Google Tag Manager. Before we start thinking too closely about GTM itself, though, we'll pull back a bit and ask:\n\n\nWhat is a tag manager?\n\nA tag manager is a service that allows you to remotely insert and manage small pieces of code, or “tags”, onto a site by means of a Javascript snippet placed across the whole site.\n\nThere are a number of different tag managers out there—Tealium, Ensighten, Adobe Launch—but we'll be focusing on GTM because... well, that's the premise of the series, but also because it's popular and, more importantly, free, which is not something you can say about a lot of the alternatives.\n\nIt means that you can insert Google Analytics event tracking, Adwords conversion tracking, or really anything you want without having to add inline code directly to the site. It allows you to deploy said code in a consistent, logical rules-based fashion—no more errant third-party code placed on pages and forgotten.\n\nIt also means you don't have to wait on developers and the vagaries of release cycles and sprints. Properly used, it should enable better relationships between developers and e.g. digital marketing—rather than constantly making small requests of the developers, you'll only need to ask when you really need something non-routine. A degree of freedom ought to grease the gears.\n\nThat's a brief top-level overview–next time we'll take a closer look at GTM itself! If you have any questions, please get in touch :)"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/gtm-solutions-corner-3-turning-classic-ga-calls-into-data-layer-pushes/#article",
      "headline": "Turning classic GA calls into dataLayer pushes with GTM",
      "description": "This is part 3 of a semi-regular series, dedicated to reusable GTM solutions for scenarios or issues we’ve encountered more than once. Last time we looked at how to track clicks on iframes using GTM, and this time we’re looking at how to turn on-page classic Google Analytics calls to data layer pushes.\n\n\nThe problem with hard-coded GA calls\n\nSay you still have hard-coded calls to classic GA on the page, but the library code itself was being delivered via GTM. It's now been removed, but there are",
      "url": "https://www.measurelab.co.uk/insights/blog/gtm-solutions-corner-3-turning-classic-ga-calls-into-data-layer-pushes/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/gtm-solutions-corner-3-turning-classic-ga-calls-into-data-layer-pushes/#webpage"
      },
      "datePublished": "2020-01-09T14:51:17.000+00:00",
      "dateModified": "2026-01-27T11:25:07.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/big-data-hero-banner.png",
      "author": {
        "@type": "Person",
        "name": "Adam Englebright",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "How-to",
        "Google Analytics",
        "Google Tag Manager",
        "Ecommerce"
      ],
      "articleBody": "This is part 3 of a semi-regular series, dedicated to reusable GTM solutions for scenarios or issues we’ve encountered more than once. Last time we looked at how to track clicks on iframes using GTM, and this time we’re looking at how to turn on-page classic Google Analytics calls to data layer pushes.\n\n\nThe problem with hard-coded GA calls\n\nSay you still have hard-coded calls to classic GA on the page, but the library code itself was being delivered via GTM. It's now been removed, but there are still errors all over the place. There are a few different things you could do—you could deploy the GA classic code without calling the page view, but then you're still sending classic hits. You could just define and empty array and ignore the errors, but then you're losing data. What we decided to do was to write a solution that would capture the hits, parcel them up and send them to the data layer for handling with GTM.\n\nWe start by defining _gaq, the classic GA array, as either whatever's there or empty, in the same way we would for the data layer.\n\nvar _gaq = _gaq || [];\n\nWe then define an empty object and array, to be used later if there's ecommerce stuff involved.\n\nvar gaq_ecommerce_object = {};\nvar gaq_products_array = [];\n\nWe're creating a function called data_layer_push here, which accepts two arguments—the first being an array, the second being a 'callback' function we'll run on that array.\n\nvar data_layer_push = function(arr, callback) {\n\nThe push method for the array 'arr' is being redefined here.\n\n  arr.push = function(e) {\n\nThis is just ensuring normal array push functioning—do what you would have done before, push 'e' into array 'arr', by using 'call' on the default Array object push.\n\n    Array.prototype.push.call(arr, e);\n\nBut then after that, we're getting it to run the callback function on the array 'arr'—so the 'callback' function will be applied to array 'arr' every time something is pushed into 'arr'.\n\n    callback(arr);\n  };\n};\n\nWe're then running that function where _gaq is the array, and the callback function is one we're about to define.\n\ndata_layer_push(_gaq, function(newgaq) {\n\nWe're setting a variable here to be the latest item pushed into the _gaq array.\n\n      var data_layer_values = newgaq[newgaq.length - 1]\n\nThen we run through the values that have just been pushed to _gaq and sort out what sort of hit they are, and then return to the data layer the relevant information in data layer form.\n\n      switch(data_layer_values[0]){\n\nIf it's a pageview hit, we push an object to the data layer with an identifying event name and the path as additional parameters.\n\n        case '_trackPageview':\n        dataLayer.push({\n          'event': 'hard_coded_ga_pv',\n          'hard_coded_ga_path': data_layer_values[1]\n        });\n        break;\n\nIf it's an event, we push we push an object to the data layer with an identifying event name and all the relevant parameter values.\n\n        case '_trackEvent':\n        dataLayer.push({\n          'event': 'hard_coded_ga_event',\n          'hard_coded_ga_event_category': data_layer_values[1],\n          'hard_coded_ga_event_action': data_layer_values[2],\n          'hard_coded_ga_event_label': data_layer_values[3],\n          'hard_coded_ga_event_value': data_layer_values[4]\n        });\n        break;\n\nTransactions are handled differently in Classic than in Universal—they're split into multiple parts, \"_addTrans\", which specifies the transaction-level information, which we assign to the empty gaq_ecommerce_object object we created earlier in EE format.\n\n        case '_addTrans':\n          window.gaq_ecommerce_object.id = data_layer_values[1];\n          window.gaq_ecommerce_object.hard_coded_ga_trans_affiliation = data_layer_values[2];\n          window.gaq_ecommerce_object.revenue = data_layer_values[3];\n          window.gaq_ecommerce_object.tax = data_layer_values[4];\n          window.gaq_ecommerce_object.shipping = data_layer_values[5];\n        break;\n\nThen items are added using '_addItem', and we push those to the empty gaq_products_array we created earlier as an object in EE if there's ecommerce stuff involved.\n\n        case '_addItem':\n        window.gaq_products_array.push({\n          'id':data_layer_values[2],\n          'name':data_layer_values[3],\n          'category':data_layer_values[4],\n\t\t      'price':data_layer_values[5],\n          'quantity':data_layer_values[6]\n        })\n        break;\n\nFinally \"_trackTrans\" is run and we push the whole object to the data layer in EE format.\n\n        case '_trackTrans':\n        dataLayer.push({\n          'event': 'hard_coded_ga_trans',\n          'ecommerce': {\n            'purchase if there's ecommerce stuff involved':{\n              'actionField' : window.gaq_ecommerce_object,\n              'products' : window.gaq_products_array\n                        }\n                        }\n    })\n        break;\n      }\n    });\n\n\nNext steps\n\nOnce you’ve added this in a custom HTML tag to fire everywhere, you’ll need to configure some GA tags to fire on the data layer pushes. The solution is also available in full on the Measurelab Github. Please leave a comment if you’ve got any questions or ideas for improvement!"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/a-day-in-the-shoes-of-andrew-fowkes-talks-about-delivering-a-fresh-insights-perspective/#article",
      "headline": "A day in the shoes of an Insight manager: Andrew Fowkes at EDF",
      "description": "For our regular \"A Day In The Shoes\" feature, Andy - Senior Research Executive at EDF - talks about delivering a fresh insights perspective and tells us about the skills he needs to be effective in his role. Here’s what his day-to-day looks like.\n\n\nAimée: Can you start by telling me your job title and responsibilities\n\nAndy: I manage Customer Insight projects of all types at EDF . My view is that the role of an insight manager in a big organisation has changed massively. It’s moved away from jus",
      "url": "https://www.measurelab.co.uk/insights/blog/a-day-in-the-shoes-of-andrew-fowkes-talks-about-delivering-a-fresh-insights-perspective/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/a-day-in-the-shoes-of-andrew-fowkes-talks-about-delivering-a-fresh-insights-perspective/#webpage"
      },
      "datePublished": "2020-01-06T18:14:28.000+00:00",
      "dateModified": "2025-12-10T01:55:45.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/screenshot-2019-11-06-at-14-16-01-jpeg.jpg",
      "author": {
        "@type": "Person",
        "name": "Aimée Hart",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Ecommerce",
        "Marketing"
      ],
      "articleBody": "For our regular \"A Day In The Shoes\" feature, Andy - Senior Research Executive at EDF - talks about delivering a fresh insights perspective and tells us about the skills he needs to be effective in his role. Here’s what his day-to-day looks like.\n\n\nAimée: Can you start by telling me your job title and responsibilities\n\nAndy: I manage Customer Insight projects of all types at EDF . My view is that the role of an insight manager in a big organisation has changed massively. It’s moved away from just delivering that project churn to really knitting together different insights; I think you need a broad range of skills. One of the impacts of the shift to digital is that marketing is a lot more measurable – so insight and research have converged a lot more with marketing execution. Ten years ago, you could oversee large continuous projects, collecting high-level metrics such as awareness, consideration and likelihood to purchase but now it’s much more about understanding how different brands use their marketing, how content links with channel, the ‘4 Ps’ etc., and using insight to support execution.\n\nThe first aspect of the role is managing projects. I’ll manage multiple projects at any one time and between 40 and 60 over the year—from start to end, in line with a business objective. My background is in delivering from an agency point of view, so I manage agencies delivering on the same common objective. Projects have broadly similar structures, but we work in an agile way – at different speeds, depending on the objectives.\n\nSecond is stakeholder management – understanding the business problem, identifying the Insight solution, delivering it and selling it in.\n\nThird is being a consultant able to understand those insights, being able to communicate what they mean for the business, allowing for recommendations to be adopted. The latter gives the work real value.\n\n\nAimée: How would you describe what you’re responsible for within that role?\n\nAndy: My two main stakeholder groups are sales and product teams in the residential and SME markets. I’m close to the teams so more and more my role is evolving into the major projects I’ve delivered. This year, I’ve focused on leading market segmentations: One looking at customers’ life-stages, and more product-focused projects on the tariff and electric vehicle markets. When the projects are finished It then becomes about selling in those approaches to different stakeholders and that takes you into proposition development. We’re closely involved with marketing and product execution and form a key part of the feedback loop that allows for continuous improvement.\n\n\nAimée: What metrics do you have for measuring success?\n\nAndy: The first one is adoption; are people using it and making decisions as a result of the insight? That’s the main measure of success for the key projects we build each year, such as a market segmentation, a model or a large-scale piece of analytics which determines what is driving a specific factor, such as brand perception or retention. In some cases, the aim is to get the work embedded in the business. In other cases, the work can form the basis for further analysis, investigation or modelling before being adopted, and inspiring fresh thinking is no bad thing!\nThe other piece is informing the broader thinking and outlook for the business. We tend not to commission work that is just going to validate what’s already known. We want to inform the business’s thinking and add to the body of customer understanding. This can range from deep-dives into how we can improve our service, to how we can better improve our marketing messages, channel mixes and targeting in order to better compete in the market.\n\n\"The skillsets at Measurelab are multi-faceted and you combine this with a very agile way of working. Both are invaluable to us – the former as it builds on internal capability, and the latter because a\nsmall, agile ‘expert’ can drive change in a large corporate like ours, in the shape of quick turnaround projects.\"\n\n\nAimée: How have you built trust with other teams in the business with how insight is adopted?\n\nAndy: The first thing is talking the same language and understanding what’s in it for the teams and using a language they understand and work with day-to-day. All insight solutions need to answer key business questions, so it’s important that you understand their objectives and their day-to-day challenges. Being able to couch all findings in evidence is also central. Stakeholders are always open to good ideas but want us to base them in evidence – data not opinions!\n\nWe don’t need to build formal business cases to support our thinking, as is the case in some organisations, but when we are bold and come forward with ideas it’s crucial that they are strongly supported by one or more robust pieces of work. This builds the trust level and ensures the work is listened to, and/or adopted. The energy sector and company itself has strong analytical capability, so evidence-based work is a necessity, but we are well-placed as a team to deliver it.\n\n\n\nAimée: Insight & analytics is a big term; can you break it down into methods and tools you mainly rely on?\n\nAndy: Broadly, I think we’re like all service businesses in that we’re on a trajectory where advertising and marketing is very measurable. There’s a realisation that we should have linked data, so the key is linking data together and having that single customer view right from typical digital marketing; awareness, discovery right through to conversion and getting into a typical retail or e-commerce mindset of asking where the problems along that journey are. The energy tariff market is quite tactical, with lots of nimbleness required both to win and retain customers, so being able to deliver to this ‘Single Customer View’ approach is only going to become more important.\n\n\n\nAimée: What were you hoping to gain from working with an external analytics team?\n\nAndy: I feel when you work with a partner, you need to be buying in a skillset that supports considerable internal strengths. I feel that for any consultancy relationship to be valuable we need to be buying a strong ‘hard’ skill set too. The skillsets at Measurelab are multi-faceted and you combine this with a very agile way of working. Both are invaluable to us – the former as it builds on internal capability, and the latter because a\nsmall, agile ‘expert’ can drive change in a large corporate like ours, in the shape of quick turnaround projects.\n\n\n\nAimée: What do you think will be different in 5 years in the way we interact with energy suppliers?\n\nAndy: When I worked on the agency-side, I felt we were moving towards a position where clients more and more wanted insight and research to predict the future: Who’s going to win the election? How much are our Customer Service ratings going to improve by? How soon will electric vehicles dominate the car market? And similar questions! With research and insight, you can’t predict the future, but you can identify trends in the market and identify the customer need and want. That gives you a good degree of power to advise on business direction and predict what is likely to succeed in-market.\n\nThe first potential trend is auto-switching. We tend to see that customers most engaged with the market can enjoy the deal-seeking element and shopping around between brands. It could be that the auto-switching services fulfil a need for the more time-poor elements that understand the market but put getting a better deal to the bottom of their ‘to do list’. For the brands themselves in this space, it’s all about gaining the customer’s trust – they will need to win the customer’s belief that the service will always put and keep them on the best deal, without the customer needing to engage the market at all.\nThe other element is that you’ve had a lot of small suppliers emerge over the last 10 years, with a liberalised market. We could see that the growth of these small challengers has peaked and as some have collapsed, we may see consumers placing greater value on a large, household name that they are familiar with and can trust to be there.\n\n\nAimée: What are the most valuable things you’ve learnt at your time working at EDF?\n\nAndy: The key one is to believe in your skills a bit more. Skills are very transferable—there can be a lot of pigeonholing of jobs and roles in marketing, but people are becoming a lot more agile and fluid as the nature of work changes. The great thing about working in a large organisation is you that you see different skill sets you have that scope to build a CV around different areas. Client-side is a lot broader than agency-side, which gives you a more rounded view of the sales and marketing mix.\n\n\nAimée: We can’t know everything, so is there anything you feel you need more knowledge on, in an analytics context?\n\nAndy: The two things I want to know more about are, firstly, data, to properly understand the complexities surrounding it. The hard thing is defining the line between knowing something inside out and having a good working knowledge. If you tried to do everything you wouldn’t ever complete a project! The other thing is product lifecycle: Understanding more beyond the early stages of product development and marketing,\nhow it’s managed and improved and how it evolves into something else; getting to grips the execution a little more.\n\n————\n\nFeel inspired? Get in touch to feature in the ongoing Analytics blog series or sign up to our newsletter below.\n"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/how-to-conduct-an-exceptional-training-session/#article",
      "headline": "How to Conduct an Exceptional Training Session",
      "description": "So… you’ve been asked to conduct a training session and you don’t know where to start. Or, you’re looking for a way to take your current training process to the next level. Whatever your level of experience, the following tips will help you make your next training session exceptional.\n\n\n1. Know the subject\n\nThe first step in giving an exceptional training session is being deeply familiar with the subject matter. In the words of Albert Einstein:\n\nYou may think you know a subject through and throu",
      "url": "https://www.measurelab.co.uk/insights/blog/how-to-conduct-an-exceptional-training-session/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/how-to-conduct-an-exceptional-training-session/#webpage"
      },
      "datePublished": "2019-12-06T14:57:36.000+00:00",
      "dateModified": "2025-07-31T20:36:32.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/treated_16-1.jpg",
      "author": {
        "@type": "Person",
        "name": "Dave Beatty",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "How-to",
        "Google Analytics",
        "Google Tag Manager",
        "Looker Studio",
        "BigQuery"
      ],
      "articleBody": "So… you’ve been asked to conduct a training session and you don’t know where to start. Or, you’re looking for a way to take your current training process to the next level. Whatever your level of experience, the following tips will help you make your next training session exceptional.\n\n\n1. Know the subject\n\nThe first step in giving an exceptional training session is being deeply familiar with the subject matter. In the words of Albert Einstein:\n\nYou may think you know a subject through and through, but to be an exceptional trainer you need to be able to pitch you delivery to a variety of levels, often to the same audience!\n\nIf you aren’t extremely confident in the subject matter, you will struggle to keep things engaging for your audience. Questions may break your flow, you may find it difficult to fully explain a particularly tricky section – but most crucially, you won’t feel confident. The trick to providing a great training experience is having the confidence to speak about your subject for hours.\n\nCan you give a good training session without being a subject matter expert? Sure you can.\n\nBut it will never be exceptional.\n\n\n2. Plan your structure\n\nIt doesn’t matter if you’re giving a 1 hour or a full day training session – you need a plan.\n\nKeeping your audience engaged is a careful balancing act of giving enough new information that they are actively learning and paying attention, without becoming mentally exhausted or burning out.\n\nWith the best will in the world, people can generally only concentrate fully for at around 90 minutes at a time, so you want to plan for your training to have at the most 90 minute blocks of content (ideally less), with a break to allow your audience to rest their minds, check their emails, pour another cup of coffee or nip to the loo.\n\nBonus tip - We’re all familiar with the post-lunch crash. Bear this in mind and try to avoid putting a particularly heavy section right after your lunch break.\n\n\n3. Listen\n\nThe secret to giving exceptional training is not speaking, but listening.\n\nExceptional training rests on the connection you have with your trainees. Before you start, take time to understand what motivates them, what they want to get out of the session.\n\nAs you talk, try to take note of who’s ears just pricked up, and who has just switched off and slouched in their chair. You want to try to keep people engaged, so if a particular section has everyone in the room fidgeting and yawning – move on! This leads very nicely on to the next section\n\n\n4. Be Prepared to Improvise\n\nEvery Google Analytics Training session I have ever run has been different. The actual content I cover, the order of the sections, the time I spend explaining different sections – this varies wildly depending on...\n\n-how many people are in the room\n\n-what particular job each trainee has\n\n-the level of experience of each trainee\n\n-the room you’re in\n\n-the weather, the time of year\n\n-the time of day\n\n-(etc etc…..)\n\nBecause of the number of factors which are not in your control, you will have to make changes to your session as you are conducting it.\n\nIf your structure is too rigid or you are not confident in the subject matter, then you will find this difficult. You should plan for some breathing room in your schedule  should a particular section start a segue into another conversation - and you should plan for extra content in case you run through the session too quickly.\n\nTo give your audience exceptional training you need to adapt your syllabus to suit their needs.\n\n\n5. Have fun!\n\nGiving a training session can be a hugely rewarding experience.\n\nIf you’re a subject matter expert, if you’ve planned the session well, if you take the time to listen to your audience and if you adapt your session to suit their needs – you’ve got what it takes to conduct an exceptional training session!\n\nYou now get to enjoy a day talking about something you know well with a bunch of new people, helping them learn and finding ways to make their jobs more efficient! I must admit, its one of my favourite parts of my job.\n\nAt Measurelab, training is our bread and butter. We have 8 years’ experience as Digital Analytics specialists in the Google stack – so you know our Google Analytics, Google Tag Manager, Google Data Studio and Google BigQuery training sessions are run by industry leading experts.\n\nWe’ve been running training for many years. Our team of experienced trainers know how to work with you and your team to ensure you extract the most value out of a training session.\n\nBook a place at one of our regular public training sessions, or get in contact to see how we can sculpt a custom training session for your business.\n"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/what-did-you-do-at-the-weekend/#article",
      "headline": "Team weekend outing: Measurelab’s Dorset adventure",
      "description": "Measurelab hits the Dorset coast for a team weekend\n\nLast Friday we all put our \"out of office\" notifications on our email, ditched the computers and headed off to Bournemouth and the beautiful Dorset coast for a couple of days. It was time to reflect on how the company is evolving and a chance for us all to get to know each other a little bit better.\n\n\nReflecting on our journey together\n\nIt was really lovely for us to all be able to get around the same table and share our thoughts. Throughout t",
      "url": "https://www.measurelab.co.uk/insights/blog/what-did-you-do-at-the-weekend/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/what-did-you-do-at-the-weekend/#webpage"
      },
      "datePublished": "2019-11-11T20:19:55.000+00:00",
      "dateModified": "2025-12-15T05:12:11.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/whatsapp-image-2019-11-08-at-21-47-00-jpeg.jpg",
      "author": {
        "@type": "Person",
        "name": "Mark Rochefort",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Measurelab"
      ],
      "articleBody": "Measurelab hits the Dorset coast for a team weekend\n\nLast Friday we all put our \"out of office\" notifications on our email, ditched the computers and headed off to Bournemouth and the beautiful Dorset coast for a couple of days. It was time to reflect on how the company is evolving and a chance for us all to get to know each other a little bit better.\n\n\nReflecting on our journey together\n\nIt was really lovely for us to all be able to get around the same table and share our thoughts. Throughout the afternoon, we learnt a lot about each other - and the shared love continued well into the evening over a home-cooked vegan chilli.\n\n[ngg src=\"galleries\" ids=\"7\" display=\"basic_thumbnail\"]\n\nThe next day it was activity time! The weather forecast was horrendous but the rain eventually subsided and the team boldly donned some rather damp wet suits - heading out onto the chilly sea on kayaks!\n\nUnfortunately, there's no photo evidence of us out on the sea on kayaks, so I've borrowed a picture from the guys who took us out; you'll have to imagine a slightly greyer sky with a slightly choppier sea ;)\n\n\nEmbracing the challenges of the weather\n\nDespite the weather, we had a fantastic time. And learnt a just little bit more about each other to boot."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/a-day-in-the-shoes-of-will-deschene-senior-digital-analyst-at-edf/#article",
      "headline": "A day in the shoes of a Senior Analyst: Will Deschene at EDF",
      "description": "Our first launch into a ‘day in the shoes’ series is spent with Will Deschene, Senior Digital Analyst at EDF. In this interview, he tells us about managing stakeholders and a team, brands that have inspired him lately, and shares some valuable advice for new analysts.\n\nAimée: Please describe your job: what do you do?\n\nWill: The majority of my work is stakeholder management, less of the 'doing' in the analytics world, as I now have two analysts in the team. It's more about stakeholder engagement ",
      "url": "https://www.measurelab.co.uk/insights/blog/a-day-in-the-shoes-of-will-deschene-senior-digital-analyst-at-edf/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/a-day-in-the-shoes-of-will-deschene-senior-digital-analyst-at-edf/#webpage"
      },
      "datePublished": "2019-11-06T14:51:13.000+00:00",
      "dateModified": "2025-12-10T00:43:38.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/screenshot-2019-11-06-at-14-16-01-jpeg-1.jpg",
      "author": {
        "@type": "Person",
        "name": "Aimée Hart",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Looker Studio"
      ],
      "articleBody": "Our first launch into a ‘day in the shoes’ series is spent with Will Deschene, Senior Digital Analyst at EDF. In this interview, he tells us about managing stakeholders and a team, brands that have inspired him lately, and shares some valuable advice for new analysts.\n\nAimée: Please describe your job: what do you do?\n\nWill: The majority of my work is stakeholder management, less of the 'doing' in the analytics world, as I now have two analysts in the team. It's more about stakeholder engagement and prioritisation. My core focus is on trying to find innovative ways to join the data, which is a big challenge for us.\n\n\nAimée: Whereabouts do you sit within the organisation? Who do you report to?\n\nWill: I report into the Data Manager within Digital Operations which is part of the Customer Unit at EDF.\n\n\nAimée: What kind of skills do you need to be effective in your role?\n\n\nWill: I still do a lot of the data side of things, especially the implementation of Google Analytics, and I’m still heavily involved with scoping things out with the data layer and fielding new requests.\n\nFor any analyst communication is really important—especially when juggling so many priorities and different stakeholders from around the business. Attention to detail is also key and having a passion for data in general.\n\nAs people become more data literate and companies become more digitally mature, stakeholder management is so important as you need to be able to understand the type of requests and conflicting priorities that such a large organisation generates.\n\n\nAimée: Tell us about a typical working day…\n\nWill: We work 8-4—we like to get here before others so people can start the day with reports on their desks, especially on Monday mornings.\n\nIt’s less about a typical day and more about a typical working week, as we work to set priorities within our backlog from JIRA; it's about planning capacity around those tasks.\n\nI have quite a lot of meetings: 50% of my time is actually talking to people about doing work rather than doing it! Now that I have a team I can spread the work out a bit more, but I still need to be cut-throat about meeting attendance for those that are relevant.\n\n\nAimée: What do you love about your job? What sucks?\n\nWill: I like the scale, there’s always so much to do and so much to be involved in—you can define your own scope. Obviously all teams have their core responsibilities; however, because data is so intrinsic there’s a lot of opportunity for us to have a seat at the table when it comes to talking about data.\n\nThe flip side is that because there are so many processes and systems, making the leap from where we are to where we want to get to is incredibly difficult, as you’re dealing with so many different legacy systems particularly as EDF used to be several different companies consolidated into one. This brings with it lots of potential blockers from different ways of working, as much as this is a challenge it’s what makes my role interesting—it’s a love/hate kind of thing!\n\n\nAimée: What kind of goals do you have? What are the most useful metrics and KPIs for measuring success?\n\n\nWill: We would like to move towards being more of an insight providing function rather than just connecting data. The wider goal is to bring a '360 view' of the customer: every touchpoint and system in to one view on a regular basis that can be analysed and accessible to the rest of the business. Once different parts can be joined we should be owning the dissemination of that insight out to the rest of the business, so a KPI might be to define how much and how actionable the insight provided is. So for example if there was a particular interest in the app ratings or a piece of technology developed in our apps, we should be looking at showing how effective that was, what commercial value it had and how it made for a better customer experience. 'Customer-first' initiatives are a huge focus for us at EDF. Our function wears double hats in a sense, both working to support and service internal customers, stakeholders, whilst keeping in mind the customer centricity of our external consumers.\n\n\nAimée: What’s the hardest part of your job?\n\nWill: There is so much going on at one point and we’re involved across so many workstreams at EDF, everyone seems to want outputs from Google Analytics so the breadth can be quite mentally draining. Having to constantly rotate between those different viewpoints and priorities and manage their different levels of understanding. One of the biggest challenges for me is the varying levels of technical understanding around data and having to gauge someone's level of understanding almost instantly—whether they know the difference between a pageview and unique pageview vs a user, for example.\n\n\nAimée: Do you ever get any resistance from analysis you present?\n\nWill: One of the things we’re keen to change here in terms of digital analytics culture, is that 'self-serve' mentality. The resistance is moving from requesting reports and expecting a number to shifting an entire organisation over to self-serve and this idea of 'data democracy' where people have the information at their fingertips. This is definitely one of the exciting parts, trying to pin down the levels of granularity you go to in a Tableau report that you make widely accessible without confusing the audience, so judging that balance of what the report is and who it's for: it’s brilliant when you get it right. We’re progressing at quite a good pace now, next year we will be looking to take it even further—using dashboards to feed people’s intrigue, developing a base of power users to gain critical mass and growing insight.\n\n\nAimée: How did you end up at EDF, and where might you go from here?\n\nWill: This is quite an interesting one (!) It’s been a bit of a journey: I was a musician travelling all over the world playing music until 28. After that, I moved into the charity sector in London for a couple of years, where I started learning the systems behind the organisation where I was working. Then I moved to Brighton and worked in an accounting firm (which wasn't for me), and worked as an analyst in a higher education for int’l students before finally moving here two and half years ago. It’s been great to be a part of EDF and build out a vision for analytics.\n\n\nAimée: Which brands/campaigns have impressed you lately?\n\nWill: I’ve really enjoyed the shift in retail, the combination of apps and the in store experience is so clever. I use H&M; the way they gamify voucher redemptions through the app and collect a wealth of data in the process is just awesome.\n\nAimée: Which data-driven companies do you admire?\n\nWill: Again, I wish I knew more, this is an area for my own personal development that I’m keen to spend more time on next year. Allocating more time towards educating myself on what’s happening in the marketplace and getting my head around the way other companies are doing things. We try to collaborate with other organisations outside of the energy sector to expand our learning. We’re actually going to the Big Data Event next week.\n\n\nAimée: What do you think separates a good implementation from a bad one?\n\nWill: One that has the end user in mind—ours wasn’t as focused on that as it could’ve been. It was built too much for an analyst and not for non-data-literate end users.\n\n\nAimée: What advice would you give an analyst starting out in 2019?\n\nWill: To make sure you enjoy what you’re doing! The beginning of any career is going to define what you do for the next 30years, so make sure you enjoy it. As a manager I’d like to think I treat my direct reports with respect and I give them the space and freedom to explore their roles and flourish doing something they enjoy.\n————\n\nFeel inspired? Get in touch to feature in the ongoing Analytics blog series or sign up to our newsletter below."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/to-product-affinity-and-beyond/#article",
      "headline": "Product affinity analysis: discovering what items customers buy together",
      "description": "Understanding what customers buy together\n\nBeing able to answer the question ‘which of my products do people regularly buy together’ with ease and simplicity can be invaluable. Market Basket Analysis, also known as association analysis, is a way of mining shopping data to establish a set of rules that describe purchasing patterns. This analysis can be conducted using a wide variety of software such as SAS, Python and R.\n\n\nWhy association rules matter\n\nThe reason for investigating association is ",
      "url": "https://www.measurelab.co.uk/insights/blog/to-product-affinity-and-beyond/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/to-product-affinity-and-beyond/#webpage"
      },
      "datePublished": "2019-10-11T10:41:38.000+00:00",
      "dateModified": "2025-12-15T05:07:51.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/treated_2-1.jpg",
      "author": {
        "@type": "Person",
        "name": "Katy Beckett",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Data Analysis",
        "Google Analytics"
      ],
      "articleBody": "Understanding what customers buy together\n\nBeing able to answer the question ‘which of my products do people regularly buy together’ with ease and simplicity can be invaluable. Market Basket Analysis, also known as association analysis, is a way of mining shopping data to establish a set of rules that describe purchasing patterns. This analysis can be conducted using a wide variety of software such as SAS, Python and R.\n\n\nWhy association rules matter\n\nThe reason for investigating association is to identify groups of products that are often bought together, implying that the products have a strong affinity. In MBA the product groups are shown by rules, for example one rule will say that, given bananas are in the basket there is a high probability that chicken breasts and spinach will also be in the basket. To interpret the significance of each rule there are three corresponding metrics; support, confidence, and lift. Support is the frequency of transaction in which all items are bought in the same basket. This is calculated by dividing the number of baskets containing all items by the total number of baskets. Let us take an example where we want to calculate the support for product X and Y, out of all transactions N, where the products appear together nxy times. This can be written as\n\nConfidence is the percentage of transactions that contain Y if and only if they contain X. This means that confidence is the conditional probability that the two items are bought together. It follows that\n\nThe final metric, lift, removes the effect of product frequency. This means that lift is best suited for ranking rules, opposed to interpreting the value. The higher the lift the more significant the rule.\n\nThe generated rules consist of a left hand side (LHS), right hand side (RHS), support, confidence and lift. The LHS shows product X, this is always a single product. RHS tells us that given product X product(s) Y are also in the basket. Visualisations are often the best way of analysing results, particularly when large numbers of rules are generated, they are also powerful when presenting your findings. The complexity and number of your rules will dictate your choice of visualisation.\n\nA grouped matrix (“Fig 1”.) gives an easy way to compare the support and lift of your top ten rules. Each rule is represented by a bubble at the intersection on the products involved in the rule. A large bubble shows that the products often appear in a basket together; darker bubbles have higher lift.The grouped matrix can become too busy when more than ten rules are visualised.\n\nIn such cases using a network graph (“Fig 2”.) is preferable. As with the previous visualisation size is representative of support and colour with lift. Here the arrows show rules going from LHS to RHS. Identifying groups of products is simpler using the graph below, as you can immediately see product clusters and interaction.\n\nThe power of Market Basket Analysis can be applied to fields outside of transactions analysis. It could be used with Google Analytics data to find pages that are often viewed in the same session or channel groupings that lead to a transaction. MBA can be used to mine any data for association rules, making it very flexible as well as easy to use. If you would like to find out more please feel free to contact us.\n\nReferences\n\nHahsler, M. and Chelluboina, S. (2011), ‘Visualizing association rules: Introduction to the r-extension package arulesviz’, R project modulepp. 223–238.\nHahsler, M., Grun, B., Kepler, J., Hornik, K. and Buchta, C. (2005),Introduction to arules.URL:https://cran.r-project.org/web/packages/arules/vignettes/arules.pdf\n\nR Code for Running MBA\n\ninstall.packages('arules')\ninstall.packages('arulesViz')\n\nlibrary(arules)\nlibrary(arulesViz)\ndata(Groceries)\n\ntxn_rules<-apriori(Groceries, parameter=list(supp=0.001, conf=0.6, target=\"rules\"))\n\nrules_sorted<-sort(txn_rules, by=\"lift\")\nsubrules <- head(rules_sorted, 5)\n\nplot(subrules, method=\"grouped\", interactive=FALSE)\nplot(subrules, method=\"graph\")"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/three-small-recent-ga-gtm-improvements/#article",
      "headline": "Three Small Recent GA/GTM Improvements",
      "description": "Google are always making small unannounced tweaks and improvements to their products—here are a few of the more noteworthy ones we've spotted recently!\n\n\nScroll Depth Tracking\n\nI gave out at length last year about the fact that you can't specify the trigger conditions for the listener dropping on the scroll depth trigger—meaning the page length couldn't be calculated accurately and causing scroll depth events to fire early. I suggested that they might want to let you select the listener conditio",
      "url": "https://www.measurelab.co.uk/insights/blog/three-small-recent-ga-gtm-improvements/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/three-small-recent-ga-gtm-improvements/#webpage"
      },
      "datePublished": "2019-09-20T15:57:12.000+00:00",
      "dateModified": "2026-01-27T11:25:07.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/screenshot-2019-09-20-at-15-07-49.png",
      "author": {
        "@type": "Person",
        "name": "Adam Englebright",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Tag Manager"
      ],
      "articleBody": "Google are always making small unannounced tweaks and improvements to their products—here are a few of the more noteworthy ones we've spotted recently!\n\n\nScroll Depth Tracking\n\nI gave out at length last year about the fact that you can't specify the trigger conditions for the listener dropping on the scroll depth trigger—meaning the page length couldn't be calculated accurately and causing scroll depth events to fire early. I suggested that they might want to let you select the listener condition. Lo and behold, they did pretty much exactly what I asked! It also defaults to Window Load which is ideal.\n\n\nFile Extension and Is Outbound\n\nI always teach attendees to my GTM training course how to set up events to detect clicks to download files and clicks on outbound links. That's got easier recently thanks to Google's introduction of file extension and 'is outbound' component types for the auto-event Element URL variable. This allows us to isolate the file extension with very little effort, and can be used in tags and triggers alike. Similarly, the addition of \"Is Outbound\" allows for quick and easy configuration of outbound click events.\n\n\nClient ID through the API\n\nThis isn't a GTM one—though it will save you a bit of time if you're setting up Simo's Standard Custom Dimensions. Client ID is now queryable as a dimension through the API as standard—and that's backdated for 18 months; meaning going forward you no longer need to worry about setting it as a custom dimension!"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/expanding-on-optimisation/#article",
      "headline": "Expanding on optimisation: effective strategies for digital success",
      "description": "Recently I ran a workshop with a leading International luxury fashion retailer. The purpose was to structure thoughts between disparate teams around purpose and definition of an optimisation workstream.\n\nInitially we talked about short term imminent goals, with the festive season fast approaching these were not surprisingly highly tactical and focused around maximising peak performance.\n\n\nSetting the scene\n\nAt this stage I introduced more broader notions around decoupling the shopping journey or",
      "url": "https://www.measurelab.co.uk/insights/blog/expanding-on-optimisation/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/expanding-on-optimisation/#webpage"
      },
      "datePublished": "2019-09-17T21:00:29.000+00:00",
      "dateModified": "2026-01-27T11:25:07.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/screen-shot-2019-09-17-at-21-41-21.png",
      "author": {
        "@type": "Person",
        "name": "Aimée Hart",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Ecommerce",
        "Marketing"
      ],
      "articleBody": "Recently I ran a workshop with a leading International luxury fashion retailer. The purpose was to structure thoughts between disparate teams around purpose and definition of an optimisation workstream.\n\nInitially we talked about short term imminent goals, with the festive season fast approaching these were not surprisingly highly tactical and focused around maximising peak performance.\n\n\nSetting the scene\n\nAt this stage I introduced more broader notions around decoupling the shopping journey or moment mapping, the idea simply to take a step back and re-evaluate the basics before delving into the data or being distracted by day-to-day priorities and opinions.\n\nThese sorts of workshops are an excellent opportunity to probe further and draw out what matters around customer experience. And as a facilitator to lead the audience on their own journey; how they believe their customers typically experience their brand, how do customers get to the site, visit the site, browse products, check out, and what happens afterwards.\n\nIndividual ideas were later taken away and grouped together to map the customer experience beyond the scope of single interactions.\n\n\n\nThe Future state\n\nParking to one side carefully crafted Optimisation 101’s around process, frameworks and tools, all of which there are available in abundance across the internet, the next exercise in the workshop was to discuss how we envisaged the ideal, future state and challenge ourselves with how these might be adjusted to increase key business objectives.\n\nQuite a step change in thinking for most that live and breathe digital and e-commerce daily and whose day to day roles are heavily focused around email calendars, peak planning by marketing channel or site merchandising changes. Customers don’t think about these elements, they will know, love and interact with a brand. Herein lies the challenge of re-evaluating the customer journey as a whole and considering the overall value of the collective experience beyond team dynamics, opinions and company silos.\n\n\nRecap and next steps\n\nFocusing on broad segments (new and returning), considering what was happening at each of the shopping journeys a step at a time, where else customers might be shopping, who they’re shopping for and the purpose of their visit, we had brainstormed a great wealth of ideas that weren't necessarily enshrined to a specific campaign or time of the year.\n\nJob done. We had set the scene. Follow up initiatives were to find common themes, idea grouping, follow the data and build an optimisation roadmap. Easy, right?\n\nAny thoughts, comments or views on the above please get in touch!"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/bigquery-without-analytics-360-adams-measurefest-2019-talk/#article",
      "headline": "How to use BigQuery without GA360: insights from Measurefest 2019",
      "description": "Speaking at Measurefest\n\nFor the first time in a few years, I took to the stage at Measurefest to talk about how to get your data from Google Analytics into BigQuery, and what you can do with it when you get there.\n\n\nAffordable BigQuery solutions\n\nObviously, Analytics 360 can do this, but it costs $$$ per year. I outlined some more affordable methods, including third-party connector solutions, and provided a detailed example of how we would use our own Pipelines solution and what we could achiev",
      "url": "https://www.measurelab.co.uk/insights/blog/bigquery-without-analytics-360-adams-measurefest-2019-talk/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/bigquery-without-analytics-360-adams-measurefest-2019-talk/#webpage"
      },
      "datePublished": "2019-09-12T16:07:48.000+00:00",
      "dateModified": "2026-01-27T11:25:08.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/img_2531-scaled.jpg",
      "author": {
        "@type": "Person",
        "name": "Adam Englebright",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "BigQuery",
        "Privacy",
        "Google Cloud",
        "Firebase Analytics"
      ],
      "articleBody": "Speaking at Measurefest\n\nFor the first time in a few years, I took to the stage at Measurefest to talk about how to get your data from Google Analytics into BigQuery, and what you can do with it when you get there.\n\n\nAffordable BigQuery solutions\n\nObviously, Analytics 360 can do this, but it costs $$$ per year. I outlined some more affordable methods, including third-party connector solutions, and provided a detailed example of how we would use our own Pipelines solution and what we could achieve with it. Sadly, unlike last time, there wasn't a central Garfield-based metaphor—Calvin and Hobbes put in several appearances, but as visual flair only.\n\n\nThe impact of App + Web\n\nI ended the talk with a brief overview of the changes that App + Web will bring to the analytics landscape - both in general and specifically pertaining to this question (since Firebase plugs into BigQuery directly, it changes the game somewhat!) - Mark has talked more about that here.\n\n\nSlides and next steps\n\nMy slides are below, and if you're interested in talking more about our pipeline solutions, App + Web or BigQuery/Google Cloud services, please get in touch!\n\nhttps://www.slideshare.net/AdamEnglebright/bigquery-without-analytics-360-measurefest-2019-adam-englebright/edit?src=slideview&type=privacy"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/next-generation-measurement-with-google-analytics/#article",
      "headline": "Next‑Generation measurement with Google Analytics 4",
      "description": "Why GA4 has us excited\n\nThis announcement has us rather excited at Measurelab. It has been a long time coming and represents the beginning of a completely new shift in how we use and think about digital measurement with Google Analytics.\n\n\nLeaving the old pageview model behind\n\nWhat we are effectively looking at here is a move away from Google Analytics as we know it, which inherited its underlying data collection schema and methods from Urchin Analytics; the analytics software product Google bo",
      "url": "https://www.measurelab.co.uk/insights/blog/next-generation-measurement-with-google-analytics/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/next-generation-measurement-with-google-analytics/#webpage"
      },
      "datePublished": "2019-08-02T15:29:10.000+00:00",
      "dateModified": "2025-12-15T04:53:29.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/2019-08-02_16-40-08.png",
      "author": {
        "@type": "Person",
        "name": "Mark Rochefort",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Data Analysis"
      ],
      "articleBody": "Why GA4 has us excited\n\nThis announcement has us rather excited at Measurelab. It has been a long time coming and represents the beginning of a completely new shift in how we use and think about digital measurement with Google Analytics.\n\n\nLeaving the old pageview model behind\n\nWhat we are effectively looking at here is a move away from Google Analytics as we know it, which inherited its underlying data collection schema and methods from Urchin Analytics; the analytics software product Google bought and subsumed way back in 2005. While Urchin was officially discontinued in 2012, the \"web page\" paradigms upon which the analytics product was founded continued through the present day product of Google Analytics. Page views are increasingly becoming less relevant as technologies such as Reactjs and Nodejs allow for User Interfaces to be uniquely displayed for any given experience, as a collection of micro-moments. Measuring interactions using a clunky combination of page view hits and event hits (with an attached 3-tier nested taxonomy of Category / Action / Label) has been becoming increasingly cumbersome and unwieldy.\n\n\nThe power of events\n\nEnter stage left, the next generation of measurement paradigm - events. Yup - that's all we need. Just events. This isn't anything new in the world of analytics; tools like segment, mixpanel, heap, in fact pretty much all the modern analytics tools I can think of have always been measuring using an event based schema. But for Google Analytics, this is quite a shift.\n\n\nGA4 is still in beta and what this means for you\n\nAs it stands, this isn't going to replace the features you see in your current Google Analytics web property for some time (we estimate 12-24 months). This is very much in beta and is only being recommended to be implemented as a dual-tag (i.e. alongside your existing implementation). If you have a website and an app, with a login (i.e. a User-ID) on both, then the beta launch can immediately glean you insights for cross-device usage, with the \"Web + App\" data stream. But I wouldn't rush out to immediately replace any of your GA tags for your website quite yet.\n\n\nMobile apps and Firebase insights\n\nIf you have a mobile app, running Google Analytics for Firebase, then you will find that you already have implemented the underlying tech that will become just Google Analytics. That means that the limits and methods of working you may have become familiar with when using \"Google Analytics for Firebase\" will become the basis for how you use the new Google Analytics product. And we are particularly interested to see how the ability to export raw data from Firebase Analytics to Google BigQuery will play out for this new version of Google Analytics.\n\n\nNo limits, no sampling, no conversions\n\nAt present, just as with Google Analytics for Firebase, there are no hit limits (but you are limited to 50 parameters) and there's no sampling in the reporting interface. The concept of a session/visit currently does not exist in these reports; good-bye conversion rates!(?)\n\n\nExciting reporting tools at your fingertips\n\nIn the reporting UI, an \"Analysis\" tool is included - something that was only available before in GA360. This opens up exciting possibilities for data exploration, dynamic funnel reporting and path analysis.\n\n\nImplementation relies on the dataLayer\n\nRegarding the implementation, everything hinges off the dataLayer - whether that be created by gtag.js or Google Tag Manager. This means that automated event tracking (for events such as scroll depth, video, outbound clicks) becomes a reality:\n\n\nEnhanced measurement and the road ahead\n\nRight now, things are very much in beta and the main reason you would implement this new method is to benefit from the \"Web + app\" cross platform measurement. Other reporting and analysis features are set to roll-out - particularly for Web, so watch this space!"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/gtm-solutions-corner-2-iframe-click-solution/#article",
      "headline": "GTM iframe tracking – Solutions Corner #2",
      "description": "This is part 2 of a semi-regular series, dedicated to reusable GTM solutions for scenarios or issues we've encountered more than once. Last time we looked at how to fire Google Analytics event to keep track of your Google Optimize experiments in GA, and this time we're looking at tracking clicks on iframes. We have encountered, several times, the situation of a client wanting to track clicks on an iframe. While we can't do much about interactions with stuff within the iframe without having GTM a",
      "url": "https://www.measurelab.co.uk/insights/blog/gtm-solutions-corner-2-iframe-click-solution/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/gtm-solutions-corner-2-iframe-click-solution/#webpage"
      },
      "datePublished": "2019-04-02T14:45:24.000+00:00",
      "dateModified": "2026-01-27T11:25:08.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/treated_4-1.jpg",
      "author": {
        "@type": "Person",
        "name": "Adam Englebright",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "How-to",
        "Google Analytics",
        "Google Tag Manager",
        "Debugging"
      ],
      "articleBody": "This is part 2 of a semi-regular series, dedicated to reusable GTM solutions for scenarios or issues we've encountered more than once. Last time we looked at how to fire Google Analytics event to keep track of your Google Optimize experiments in GA, and this time we're looking at tracking clicks on iframes. We have encountered, several times, the situation of a client wanting to track clicks on an iframe. While we can't do much about interactions with stuff within the iframe without having GTM available on it, we can, with a bit of cunning, set up a solution that detects clicks on the iframe.\n\n\nSetting up the custom html tag\n\nHere, we've got a bit of code that you'll want to set up as a custom HTML tag (don't forget to add the open-and-close script tags to the top and bottom!) to fire on DOM Ready on all pages (or whatever pages are appropriate). It sets up a few variables to keep track of things and select iframes, adds a listener to the window for the 'blur' event (when the window loses 'focus') and listeners for 'mouseover' and 'mouseout' events on iframe elements on the page. Taken together, the solution checks when a user is hovering over an iframe and if the window loses focus it fires a data layer event. Since we can't track clicks directly, using the loss of focus as a proxy is a clever workaround!\n\nWe begin by creating a function:\n\n(function() {\n\nThen we set up the myConfObj object, which stores the user's current \"state\"—whether they're hovering over an iframe or not, and the iframe's ID.\n\nvar myConfObj = {\niframeMouseOver: false,\niframeID: 'not found'\n}\n\nThen we select all iframes on the page to be tracked. You will probably want to choose a more specific selector!\n\nvar frames = document.querySelectorAll('iframe');\n\nHere, we set up the listener for the window losing focus, firing a data layer push with optional info, when the window loses focus but only if the user was hovering over the iframe at the time.\n\nwindow.addEventListener('blur', function() {\nif (myConfObj.iframeMouseOver) {\ndataLayer.push({\nevent: 'ga-event',\neventCategory: '', //YOUR CATEGORY HERE\neventAction: '', // YOUR ACTION HERE\neventLabel: '', // YOUR LABEL HERE\neventValue: '' // YOUR VALUE HERE\n});\n}\n});\n\nThen we need to determine whether the user was hovering over the iframe or not, so we loop through all the iframes on the page (again, your selector may differ)...\n\nframes.forEach(function(element) {\n\nand listen out for mouseover on them. When it's detected we set the value of the myConfObj iframeMouseOver property to be 'true', and the iframeID property to the iframe's ID. You could always change it to something else if it's more appropriate.\n\nelement.addEventListener(\"mouseover\", function(event) {\nmyConfObj.iframeMouseOver = true;\nmyConfObj.iframeID = element.id; //OR WHATEVER VARIABLE IS APPROPRIATE\n});\n\nThen to make sure we catch the user leaving as well, we add a listener for mouseout. Then we close all the brackets and call the function.\n\nelement.addEventListener(\"mouseout\", function(event) {\nmyConfObj.iframeMouseOver = false;\n });\n });\n}())\n\n\nFinal steps and GA tag configuration\n\nOnce you've added that, you'll need to configure a GA tag to fire on the data layer push—then you're done! This solution is also available on Github, for those of you who don't want to copy it out of this blog post in little bits! The Github solution also includes commented-out lines which can be used to debug the solution if you're having trouble getting it working. Please leave a comment if you've got any questions or ideas for improvement!"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/google-analytics-enhanced-ecommerce-tracking-with-adobe-dtm/#article",
      "headline": "Google Analytics Enhanced Ecommerce tracking with Adobe DTM",
      "description": "Here at Measurelab, we work predominantly with the Google stack but that doesn't stop us using other tools. As there's not much documentation available in the public forum on how to implement Enhanced Ecommerce in Google Analytics using Adobe Dynamic Tag Manager (DTM) formerly know as Satellite, I think this blog post would be useful.\n\nAs good introduction to the tools itself, below there’s a useful overview of Adobe’s Dynamic Tag Management architecture, which is from their learning resource pa",
      "url": "https://www.measurelab.co.uk/insights/blog/google-analytics-enhanced-ecommerce-tracking-with-adobe-dtm/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/google-analytics-enhanced-ecommerce-tracking-with-adobe-dtm/#webpage"
      },
      "datePublished": "2019-01-21T17:57:06.000+00:00",
      "dateModified": "2025-07-31T20:36:36.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/treated_15-1.jpg",
      "author": {
        "@type": "Person",
        "name": "Alex Cirstea",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "How-to",
        "Google Analytics",
        "Google Tag Manager",
        "Debugging",
        "Ecommerce"
      ],
      "articleBody": "Here at Measurelab, we work predominantly with the Google stack but that doesn't stop us using other tools. As there's not much documentation available in the public forum on how to implement Enhanced Ecommerce in Google Analytics using Adobe Dynamic Tag Manager (DTM) formerly know as Satellite, I think this blog post would be useful.\n\nAs good introduction to the tools itself, below there’s a useful overview of Adobe’s Dynamic Tag Management architecture, which is from their learning resource pages, which I highly recommend reading.\n\nThis guide is based on the assumption that you have a dataLayer implemented on your site, and more important, on your confirmation page. This would have all the ecommerce values you want to send to your GA property.\n\nFirst things first, you need to create the data elements that will capture the dataLayer values you want to use to form your ecommerce purchase object. Data elements are the equivalent of variables in GTM, therefore you can create them once and use them as many times you need, which improves the efficiency of your tagging process. Below there’s example of how you can create a data element to capture the transaction ID from the dataLayer:\n\nSecondly, you need to decide where you want your ecommerce tag to fire. This can be either a direct rule or a page load rule on the confirmation page. To this rule you will add your custom JS tag and use the data elements created previously.\n\nIn this JavaScript tag, you will create variables that will be referencing the data elements created in the first step. To reference data elements in a custom tag in DTM you can use the following taxonomy:  _satellite.getVar('Your data element name'). You will then use all these variables to build your ecommerce object which will be sending data to GA. Here’s a screenshot of how this might look like:\n\nNote: If you are using a custom GA tracker name (which DTM normally creates by default), you need to add this to your custom HTML tag. To check your tracker name, go to your GA or UA Tool > Customize Page Code > Tracker Name > and you should see an alphanumeric string. You need to use this in all you ga() calls.\n\nSecond note: Unless you’ve disabled page view tracking in your GA tool, you’re most likely double tracking page views with the above solution. You can either disabled the page view tracking at the tool level, or you can prevent the standard page view tracking in your custom HTML tag by using: return false;\n\nFinally, if you were wondering what are your debugging options for your DTM implementation you can use the DTM debugger chrome extension, this will print messages to the console in regards to your page view and event tracking from DTM.\n\nIf you have issues regarding your DTM/GTM tracking implementation, feel free to get in touch."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/its-nearly-the-end-of-term/#article",
      "headline": "It's nearly the end of term",
      "description": "As we countdown the last few days to the Christmas break, I wanted to share a few moments from what's been a busy and fun-packed couple of weeks at Measurelab. Besides all the great work everyone has been doing (which is de rigeur, of course), there's been much going on.\n\nFirst up to report is our little Christmas outing to Brighton; we went ice-skating at the beautifully picturesque outdoor ice rink at Brighton Pavilion. Some of us were a little more proficient than others (ahem). Gladly no bon",
      "url": "https://www.measurelab.co.uk/insights/blog/its-nearly-the-end-of-term/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/its-nearly-the-end-of-term/#webpage"
      },
      "datePublished": "2018-12-20T16:32:28.000+00:00",
      "dateModified": "2026-01-22T10:54:41.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/image-from-ios-2-scaled.jpg",
      "author": {
        "@type": "Person",
        "name": "Mark Rochefort",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Measurelab"
      ],
      "articleBody": "As we countdown the last few days to the Christmas break, I wanted to share a few moments from what's been a busy and fun-packed couple of weeks at Measurelab. Besides all the great work everyone has been doing (which is de rigeur, of course), there's been much going on.\n\nFirst up to report is our little Christmas outing to Brighton; we went ice-skating at the beautifully picturesque outdoor ice rink at Brighton Pavilion. Some of us were a little more proficient than others (ahem). Gladly no bones were broken. We still don't believe it was Aimée's first ever time - she's a natural.\n\n[ngg src=\"galleries\" ids=\"2\" display=\"basic_slideshow\"]Plus the usual secret Santa shenanigans (shhh!)\n\n[ngg src=\"galleries\" ids=\"3\" display=\"basic_slideshow\"]Then, with bleary eyes and foggy heads, we needed a little extra help in the office. Cue - four dogs in the office. And excellent Santa's helpers they proved to be; it turns out Henry is quite the data whizz and certainly showed Dave a thing or two.\n\n[ngg src=\"galleries\" ids=\"6\" display=\"basic_slideshow\"]These helpers galvanised the Christmas team spirit to ensure tasty homemade treats were sent to many of our clients. And ummm well, if you didn't get one then you know what to do to make sure you are on the list for next year ;)\n\n[ngg src=\"galleries\" ids=\"4\" display=\"basic_slideshow\"]And finally, endless Christmas songs on the office stereo, plus far too many mince pies, have ensured the team continue to deliver excellent work right through to the end of term. If there was any doubt, today we saw a beer tap installed - just to nudge the Christmas \"spirit\" even further. Responsibly, of course.\n\nSo that's it folks. Have a good one and see you in the New Year!"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/what-is-a-data-strategy-and-do-i-need-one/#article",
      "headline": "What is a Data Strategy and do I need one?",
      "description": "Let’s assume you’ve been using Google Analytics in your organisation for some time and your digital marketing endeavours at least are data-driven. More and more people are starting to see the benefit in using data to get their jobs done and now everyone’s talking about Data Science or Big Data or whatever. To be clear - when we say “data” we are not talking about just Google Analytics but the proliferation of this tool means that it is very likely a starting point for your data analytics. Alongs",
      "url": "https://www.measurelab.co.uk/insights/blog/what-is-a-data-strategy-and-do-i-need-one/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/what-is-a-data-strategy-and-do-i-need-one/#webpage"
      },
      "datePublished": "2018-12-13T16:51:19.000+00:00",
      "dateModified": "2026-01-22T10:55:01.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/istock_000060322508_medium.jpg",
      "author": {
        "@type": "Person",
        "name": "Mark Rochefort",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Marketing"
      ],
      "articleBody": "Let’s assume you’ve been using Google Analytics in your organisation for some time and your digital marketing endeavours at least are data-driven. More and more people are starting to see the benefit in using data to get their jobs done and now everyone’s talking about Data Science or Big Data or whatever. To be clear - when we say “data” we are not talking about just Google Analytics but the proliferation of this tool means that it is very likely a starting point for your data analytics. Alongside your Google Analytics data, you’ve probably got a CRM and a bunch of other data sources that you know you should be doing something with - and gaining some kind of “competitive advantage”.\n\nBetter get a plan! If you don’t you’ll be left behind, right? Well - yes and no.\n\nIt is very easy with digital analytics to be caught up with the technical intricacies of data collection implementations and tactical analysis; quickly not seeing the woods for the trees. A strategy allows you to pull back and take stock of where you are and where you want to be. In essence it means you can identify your position, map out your surroundings and understand the route you want to take.\n\nBut stuff changes, fast. You can’t plan for every eventuality. And how your organisation is aligning their endeavours (i.e. their “stance”) will determine the shape of the roadmap for your data strategy. According to a couple of clever chaps writing at Harvard Business Review, organisations adopt offensive and a defensive stances to their data strategies; where an offensive data strategy is focused on flexibility and a defensive data strategy is focused on control. You will need a mix of both and that mix will depend on your industry sector, competitive landscape and current trends.\n\nAcknowledging your stance and understanding this changes over time is enough. As your organisation progresses along their path of analytics maturity, your stance with regard to data strategy is likely to alter too.\n\nTo help ourselves in this planning process, we have created the “Data Strategy Canvas”:\n\nIt is still in early stages (version 0.1 in fact) but those of you familiar with the canvas approach made famous by the folks at Strategyzer (see their Business Model Canvas) will quickly grasp what the intention is here. Draw up the canvas onto a whiteboard or print it out on a big sheet of paper, then simply use post-its to capture answers in the corresponding areas.\n\nBegin with goals in the centre of the canvas and work your way outwards. To get things started, let’s take a key principle from the Lean Analytics movement - just “measure what matters”. Take a look at your business model; do you know your customers? Do you understand their buying process? Do you know why and how they buy? And how can you be using data to improve your business?\n\nOnce you’ve determined your goals, you will need to assess the data you have available and what data you need (Tools & Tech / Data Sources). There might be a trade off; what’s the value you will likely derive from all this work? Some technical implementations can be costly and that cost simply might not measure up against the returns it could bring.\n\nSome plans might entail investing in new IT infrastructures or new hires. But before you do, ask yourself what can you do with external help. And you will be pleasantly surprised quite what can be done with your existing systems at very little comparative technical overhead these days.\n\nMost importantly, can you trust your data (Weaknesses & Risks)? It is a rare thing to hear of a company that has an absolutely fault free end-to-end data pipeline. And most of the issues start right at the very beginning of that pipeline - with a misplaced tracking tag, for example. And, before you start hiring a team of analysts, can your existing team be trained and supported to get the job done to a reasonable level (Skills & Capabilities)?\n\nAnyway, we’ve found that a Data Strategy Canvas such as this can really useful in asking those early questions."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/overcoming-the-limitations-of-google-analytics/#article",
      "headline": "Overcoming the limitations of Google Analytics",
      "description": "Google Analytics and Google Tag Manager are used by around 30 to 50 million companies worldwide. The tools are great for basic web analytics but restrict the user to aggregated data unless a substantial fee is paid (reported to be £90K per annum). This presents a large obstacle for small to medium sized businesses who want to develop a data-driven strategy. Let’s imagine a small retailer wants to implement a recommendation engine. Not a bad idea given that Amazon estimates that around 35% of sal",
      "url": "https://www.measurelab.co.uk/insights/blog/overcoming-the-limitations-of-google-analytics/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/overcoming-the-limitations-of-google-analytics/#webpage"
      },
      "datePublished": "2018-11-05T11:15:57.000+00:00",
      "dateModified": "2025-12-10T01:18:39.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/treated_2-1-1.jpg",
      "author": {
        "@type": "Person",
        "name": "David Kane",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Google Tag Manager"
      ],
      "articleBody": "Google Analytics and Google Tag Manager are used by around 30 to 50 million companies worldwide. The tools are great for basic web analytics but restrict the user to aggregated data unless a substantial fee is paid (reported to be £90K per annum). This presents a large obstacle for small to medium sized businesses who want to develop a data-driven strategy. Let’s imagine a small retailer wants to implement a recommendation engine. Not a bad idea given that Amazon estimates that around 35% of sales are generated through their recommendation engine! To do so, the retailer needs access to the ‘raw’ data, but they won't want to pay a fee of £90K for what is often a research project and won’t want to abandon GA because of the time invested in developing accurate tracking through GTM.\n\nUltimately, Google’s binary (either free or very expensive) payment plans do not encourage companies to experiment with data. While this may be tolerable today, in the long term, small and medium sized companies are going to be left behind in the race to develop data-driven solutions.\n\nAn affordable solution.\n\nAn ideal solution would allow a company to continue using GA and GTM whilst somehow allowing the extraction of ‘raw’ hit-level data at an affordable price.\n\nOne solution we have been working on here at Measurelab is to implement research by Simo Ahava. This solution uses GTM to ‘trick’ Google into reporting hit-level data as a custom dimension, along with the essential client and session identifiers. Once implemented you can pull unaggregated data from Google’s internal databases and begin to really understand how customers interact with your website.\n\nHowever, it can be tricky to get all of the data out of Google's internal databases. It can be done using a Google Analytics' API but this requires some serious engineering. To this end, we have developed a user-friendly web application which can handle large backdates of data in one fell swoop.\n\nBang! Hit level data at just a fraction of the cost of a GA 360 subscription. One word of caution, you will still have a wait until enough data has been collected before you can perform a meaningful analysis!"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/knead-that-crodough-into-shape-tis-the-season-for-the-perfect-prove/#article",
      "headline": "Knead that CRO dough into shape, ‘tis the season for the perfect prove",
      "description": "\t\t\tWhether you’re starting on your CRO journey or have been at it for years, chances are you’re after opportunities to give your bottom line a boost during the festive season. Taking some time to plan and carefully curate those optimisation journeys will not only go some way to making sure the additional traffic works better for you, it’ll result in a meaningful set of results and maximise learnings for the post-Christmas wash ups.\n\n\nHaving worked 5 years for a well-known UK health and beauty re",
      "url": "https://www.measurelab.co.uk/insights/blog/knead-that-crodough-into-shape-tis-the-season-for-the-perfect-prove/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/knead-that-crodough-into-shape-tis-the-season-for-the-perfect-prove/#webpage"
      },
      "datePublished": "2018-10-29T09:40:17.000+00:00",
      "dateModified": "2025-07-31T20:36:37.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/aimee-hart_blog-e1540805236935-jpeg.jpg",
      "author": {
        "@type": "Person",
        "name": "Aimée Hart",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "AI & ML"
      ],
      "articleBody": "\t\t\tWhether you’re starting on your CRO journey or have been at it for years, chances are you’re after opportunities to give your bottom line a boost during the festive season. Taking some time to plan and carefully curate those optimisation journeys will not only go some way to making sure the additional traffic works better for you, it’ll result in a meaningful set of results and maximise learnings for the post-Christmas wash ups.\n\n\nHaving worked 5 years for a well-known UK health and beauty retailer, Christmas planning packs and aggressive yet meticulous trading plans drop into the inbox in July (and if you’re (un)lucky that’s slap bang in the middle of a heat wave).   Come the festive period and the first inkling of those shiny boxed mince pies sitting expectantly on the supermarket shelves, you’ll have bored yourself and others hypothesising about what might happen on Black Friday, how much the Black Friday/Cyber Monday will bleed into a longer holiday season, how effective your perfectly crafted campaigns will turn out and whether sales targets will be met.  Come this time you simply want to forget all about Christmas until the following…. July.\n\nThe Festive landscape\n\nAmidst all the speculation, let’s remind ourselves that it’s in the context of online businesses finite demand for products and services that has led to optimisation programs emerging in the relentless pursuit of maximising website traffic, providing valuable insight into customer experience and understanding the fickle nature of online behaviour. Against the backdrop of an increasing trend towards a longer holiday period from Halloween through to Christmas, there’s more pressure than ever on CRO programs to deliver on exclusivity, differentiation and to assist brands in elevating their online presence where individual days (Black Friday, Cyber Monday) may have featured as the festive landmarks in the past.  These days may still continue to mark the trading plans, yet how many more offers can we squeeze into the two-month window before offer fatigue kicks in and how many more countdown timers and flashy red discount signposts can we fit onto pages? Remember our mobile and digital savvy shoppers don’t necessarily feel the same urgency we’d like to impart and have been carefully building their wish lists over months.\n\nBrand USPs\n\nThis is the time to take a good hard look at your brands USPs and hone in on some of these towards gearing up a well-defined CRO plan, and how they can assist in defining key user journeys.  Let’s take free delivery and free returns as a topical case study for peak.  In order to keep up with competition, plenty of brands now offer free delivery and returns, and customers have come to expect it.  There may be a strong argument to maintain shipping charges, but at what cost? Even if it isn’t offered, there will always be those shrewd shoppers who fill their baskets just to hit the free delivery threshold, and then return anything unwanted using free returns.  Sound familiar? Fine-tuning the sweet spot of delivery thresholds to fuel growth with a careful eye on the sort of return shopping behaviour you want to avoid shouldn’t go overlooked in mitigating costs affecting your bottom line.\n\nExperiential journeys\n\nAs the festivities gain momentum some brands have become synonymous with heavy discounting as a means to compete for customer attention over peak, creating risk and intensity around key dates and potential rising costs as an outcome to the unexpected and dreaded scenario… site outages.  Using CRO as a means to get smarter and wean customers off the discount drug and away from the path of deep discounts as the sole type of relationship with your brand is a sensible option.  Ideally your focus will aim towards putting forward a compelling experience whose focus is both on acquisition and retention with a long-term customer relationship in mind.  Not forgetting that some of the biggest wins and profitability will come from your preexisting VIP customers who will expect an exclusive treatment this season. Again, small gains can be had with simple messaging through product recommendations that, at the very least, provide customers’ ideas based on complimenting previous browsing behaviour and incentivising them to explore your site further. Take some time to think through how you want to promote and nurture returning customers to your site.\n\nMince pie fan or not, as the temperature takes a sudden drop, grab your CRO dough because the festive season has arrived, things have shifted up a gear and competition is fierce!\n\nWhether you’re starting out your first CRO program or running fully fledged CRO and personalisation programs and looking to enrich your experiences with additional data and predictive modelling techniques, our team of CRO and data science experts are here to help!"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/toot-toot-all-aboard-the-measurelab-train/#article",
      "headline": "Toot toot... All aboard the Measurelab train!",
      "description": "\t\t\tIn the last couple of months we've had three new starters and I'd like to give them a little nod of recognition, if I may.\n\n\nFirst up is (Doctor) Dave, who joined us as a Data Scientist in the Summer; he popped along to one of our Brighton Analytics meetups and it just went from there. Dave's background is in terribly clever machine vision stuff - he was recently working in Barcelona (at Universitat Pompeu Fabra) doing Postdoctoral Research involving adaptive image processing algorithms (wher",
      "url": "https://www.measurelab.co.uk/insights/blog/toot-toot-all-aboard-the-measurelab-train/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/toot-toot-all-aboard-the-measurelab-train/#webpage"
      },
      "datePublished": "2018-10-16T08:11:44.000+00:00",
      "dateModified": "2026-01-22T10:55:26.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/treated_12.jpg",
      "author": {
        "@type": "Person",
        "name": "Mark Rochefort",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Data Analysis",
        "Ecommerce",
        "AI & ML"
      ],
      "articleBody": "\t\t\tIn the last couple of months we've had three new starters and I'd like to give them a little nod of recognition, if I may.\n\n\nFirst up is (Doctor) Dave, who joined us as a Data Scientist in the Summer; he popped along to one of our Brighton Analytics meetups and it just went from there. Dave's background is in terribly clever machine vision stuff - he was recently working in Barcelona (at Universitat Pompeu Fabra) doing Postdoctoral Research involving adaptive image processing algorithms (where he obtained two patents for the use of High Dynamic Range Imaging video processing). And before that he was in California (at UC Berkeley) looking into 3D stereo vision. He holds a PhD in Psychophysics and an MSc in Artificial Intelligence and is now honing his craft by applying his skills to the wonderful world of marketing analytics.\n\nThen we have Aimée, who joined us as an Analytics Consultant a month or so ago. Aimée was at the Body Shop for nearly six years, working as both EMEA Head of Insight & Analytics and as UK E-commerce Analytics Manager (Digital & Ecommerce). A multi-linguist, Aimée has worked in large corporations all over the world, and has a flair for leading insight, data analysis and optimisation programmes that drive outstanding results. And now she's weaving her magic here with our clients at Measurelab.\n\nAnd finally, Steve, who joins us as Commercial Director and will be developing and delivering on our growth strategy. At 33, Steve was managing a WPP agency, before founding and growing the digital consulting and services business at MarketOne where he became Partner. Now, alongside his work with Measurelab, Steve is studying a part-time MA in Digital Management, at Hyper Island. He is currently exploring how innovation happens at the intersection of design thinking, digital technology and change management. Careful - he loves a sharpie and post-it note!\n\nSo - there you have it. Quite exciting! And if you haven't already I'm sure you'll be speaking to these guys soon :)"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/gtm-solutions-corner-1-optimize-events/#article",
      "headline": "GTM event tracking best practices – Solutions Corner #1",
      "description": "This is part 1 of what I hope will become a semi-frequent series on here, dedicated to reusable GTM solutions for scenarios or issues we've encountered more than once. This particular entry is a companion to Mark's piece from a couple of years back, but for Google Optimize rather that Optimizely. In short, it sends data layer pushes so you can fire Google Analytics events when there are Optimize experiments running, which saves you from using custom dimension slots etc in the course of ordinary ",
      "url": "https://www.measurelab.co.uk/insights/blog/gtm-solutions-corner-1-optimize-events/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/gtm-solutions-corner-1-optimize-events/#webpage"
      },
      "datePublished": "2018-10-01T10:57:10.000+00:00",
      "dateModified": "2026-01-27T11:25:08.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/screenshot-2018-10-01-11-10-06.png",
      "author": {
        "@type": "Person",
        "name": "Adam Englebright",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Google Tag Manager"
      ],
      "articleBody": "This is part 1 of what I hope will become a semi-frequent series on here, dedicated to reusable GTM solutions for scenarios or issues we've encountered more than once. This particular entry is a companion to Mark's piece from a couple of years back, but for Google Optimize rather that Optimizely. In short, it sends data layer pushes so you can fire Google Analytics events when there are Optimize experiments running, which saves you from using custom dimension slots etc in the course of ordinary analysis.\n\n\nSetting up the custom js variable\n\nHere, we've got a bit of code that you'll want to set up as a custom JS variable, to set as hitCallback in the custom fields to set on your default GA pageview, as we want it to run after GA's available and any pageview hits are being sent. It checks to see if there are any Optimize experiments being run, then pushes to the data layer the ID and variations of any that are being run. Unfortunately there's no \"human-readable\" name available on the page as there is with Optimizely, but if you really want it to be readable in the GA interface, you can set up a lookup table or something to get the name from the experiment ID.\n\nThis being a hitCallback, the whole thing is a function returning another function.\n\nfunction(){ return function(){\n\n\nDefining the property id\n\nThen, we define the property ID - you'll want to set this to be a string—whatever the GA property you've got associated with Optimize is.\n\nvar propertyId = ; // YOUR PROPERTY ID HERE\n\n\nChecking gaData and active experiments\n\nWe then check that the gaData global object exists, that there are active experiments and that we haven't done this before on this page.\n\nif (gaData[propertyId] !== undefined && typeof(gaData[propertyId].experiments) !== \"undefined\" && window.optHitCounter !== 1) {\n\nand then, if that's all correct, we create an array of the number of keys in the 'active experiments' object, set a global variable to 1 to prevent the data layer push from firing multiple times,\n\nvar activeExperiments = Object.keys(gaData[propertyId].experiments); window.optHitCounter = 1;\n\nset a varable equal to the length of the experiments array,\n\nvar mCnt = activeExperiments.length;\n\nloop through them all,\n\nfor (var i=0;i<(mCnt);i++) {\n\nset variables equal to each experiment ID and variation,\n\nvar mExp = activeExperiments[i]; var curVar = gaData[propertyId].experiments[mExp];\n\n\nLooping through experiments and pushing to the data layer\n\nAnd push to the data layer the ID value and variation ID for each of them, which you can set up a GA event tag against to send the information to GA.\n\nwindow.dataLayer.push({ 'event': 'google_optimize', 'eventCategory': 'Google Optimize', 'eventAction': 'Experiment ID: ' + mExp, 'eventLabel': 'Variation ID: ' + curVar }); } } } }\n\n\nFinal implementation\n\nAnd that's it, set that as hitCallback on your pageview and you'll be tracking your Optimize implementation events in no time. This solution is also available on Github, for those of you who don't want to copy it out of this blog post in little bits!"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/google-marketing-platform/#article",
      "headline": "Goodbye DoubleClick, hello Google Marketing Platform!",
      "description": "Last week, Google announced they were unifying their analytics and advertising platforms under a single new name: Google Marketing Platform.\n\nThe Google Analytics 360 Suite and DoubleClick brands are being replaced with this single name.\n\nWhat does this mean for DoubleClick?\n\nIf anything this is a change that has needed to happen for years. DoubleClick always sat rather clumsily alongside other tools from Google and this shift heralds the beginning of a more unified approach.\n\nSearch Ads 360 wil",
      "url": "https://www.measurelab.co.uk/insights/blog/google-marketing-platform/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/google-marketing-platform/#webpage"
      },
      "datePublished": "2018-07-17T09:42:55.000+00:00",
      "dateModified": "2026-01-22T10:56:04.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/google-marketing-platform.png",
      "author": {
        "@type": "Person",
        "name": "Mark Rochefort",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Google Tag Manager",
        "Looker Studio",
        "Google Cloud",
        "Firebase Analytics",
        "Marketing"
      ],
      "articleBody": "Last week, Google announced they were unifying their analytics and advertising platforms under a single new name: Google Marketing Platform.\n\nThe Google Analytics 360 Suite and DoubleClick brands are being replaced with this single name.\n\nWhat does this mean for DoubleClick?\n\nIf anything this is a change that has needed to happen for years. DoubleClick always sat rather clumsily alongside other tools from Google and this shift heralds the beginning of a more unified approach.\n\nSearch Ads 360 will be a new product to replace DoubleClick Search (DCS), whereas Display & Video 360 takes some aspects of tools such as DoubleClick Bid Manager (DBM) and DoubleClick Campaign Manager (DCM).\n\nWhat does this mean for the Google Analytics Suite?\n\nThe name \"Suite\" will go but the products within in remain (i.e. Analytics, Data Studio, Optimize, Tag Manager and Surveys).\n\nHow will the platform be charged for?\n\nQuite how the products will be charged for remains to be seen. I personally am hoping to see a model tied more closely to what we see with Firebase - with a \"pay for what you use\" model, underpinned by Google Cloud Platform, rather than the current opaque \"enterprise only\" pricing we have gotten used to.\n\nWhat does this mean for digital marketing?\n\nThere's no place to hide. Accurate measurement is central to everything!"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/chat-analytics-drink-beer/#article",
      "headline": "Chat about analytics and drink beer",
      "description": "\t\t\tLast night's #BrightonAnalytics&nbsp;<a href=\"https://www.meetup.com/BrightonAnalytics-Meetup/events/251264167/\">meetup</a> was a great success - thanks to all who made it along to the Evening Star pub to chat about analytics and drink beer!\n\n\nThe next one will be Tuesday July 17th - again at 6pm-9pm in the Evening Star, Brighton.\n\nSee you there!\n\n[ngg_images source=\"galleries\" container_ids=\"1\" display_type=\"photocrati-nextgen_basic_thumbnails\" override_thumbnail_settings=\"1\" thumbnail_width",
      "url": "https://www.measurelab.co.uk/insights/blog/chat-analytics-drink-beer/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/chat-analytics-drink-beer/#webpage"
      },
      "datePublished": "2018-06-20T13:18:44.000+00:00",
      "dateModified": "2026-01-22T10:56:36.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/2018-06-20_13-53-56-min.png",
      "author": {
        "@type": "Person",
        "name": "Mark Rochefort",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Measurelab"
      ],
      "articleBody": "\t\t\tLast night's #BrightonAnalytics&nbsp;<a href=\"https://www.meetup.com/BrightonAnalytics-Meetup/events/251264167/\">meetup</a> was a great success - thanks to all who made it along to the Evening Star pub to chat about analytics and drink beer!\n\n\nThe next one will be Tuesday July 17th - again at 6pm-9pm in the Evening Star, Brighton.\n\nSee you there!\n\n[ngg_images source=\"galleries\" container_ids=\"1\" display_type=\"photocrati-nextgen_basic_thumbnails\" override_thumbnail_settings=\"1\" thumbnail_width=\"150\" thumbnail_height=\"150\" thumbnail_crop=\"1\" images_per_page=\"20\" number_of_columns=\"0\" ajax_pagination=\"0\" show_all_in_lightbox=\"1\" use_imagebrowser_effect=\"0\" show_slideshow_link=\"0\" slideshow_link_text=\"[Show slideshow]\" order_by=\"sortorder\" order_direction=\"ASC\" returns=\"included\" maximum_entity_count=\"500\"]"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/adding-firebase-analytics-react-native-app/#article",
      "headline": "Adding Firebase Analytics to your React Native app",
      "description": "\t\t\t<span style=\"font-weight: 400;\">This article describes how to integrate Google Analytics for Firebase (formerly Firebase Analytics) to a React Native app. </span><span style=\"font-weight: 400;\">In order to do this, you need to use a JavaScript bridge called </span><a href=\"https://github.com/invertase/react-native-firebase\"><span style=\"font-weight: 400;\">RNFirebase</span></a><span style=\"font-weight: 400;\">. &nbsp;</span>\n\n\nThis is lightweight layer sitting on top of native Firebase librarie",
      "url": "https://www.measurelab.co.uk/insights/blog/adding-firebase-analytics-react-native-app/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/adding-firebase-analytics-react-native-app/#webpage"
      },
      "datePublished": "2018-05-23T15:19:39.000+00:00",
      "dateModified": "2025-07-31T20:36:38.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/image3-small.png",
      "author": {
        "@type": "Person",
        "name": "Alex Cirstea",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Firebase Analytics",
        "How-to",
        "Google Analytics",
        "Privacy",
        "Debugging",
        "React"
      ],
      "articleBody": "\t\t\t<span style=\"font-weight: 400;\">This article describes how to integrate Google Analytics for Firebase (formerly Firebase Analytics) to a React Native app. </span><span style=\"font-weight: 400;\">In order to do this, you need to use a JavaScript bridge called </span><a href=\"https://github.com/invertase/react-native-firebase\"><span style=\"font-weight: 400;\">RNFirebase</span></a><span style=\"font-weight: 400;\">. &nbsp;</span>\n\n\nThis is lightweight layer sitting on top of native Firebase libraries for both iOS and Android which mirrors the Firebase Web SDK as closely as possible.\n\nEven though the Firebase Web SDK library will work with React Native, it is mainly built for the web and some features are not available. You can find more details on the documentation page, but in summary, RNFirebase offers a faster performance over the web SDK and allows to hook into device SDKs which is not possible with the web SDK.\n\nHere’s a screenshot of some of the features that are available in RNFirebase in comparison to the Firebase Web SDK:\n\nIn order to add Firebase to your React Native app, you need to create a Firebase project and then follow the steps for both Android and iOS. Once you have Firebase added to your app, you can start adding custom tracking. The below code examples have been added to the app.js file in my React Native project folder.\n\n1) Setting the current screen name\n\nsetCurrentScreen(name)\n\nSets the current screen name, which specifies the current visual context in your app. This helps identify the areas in your app where users spend their time and how they interact with your app.\n\nExample: firebase.analytics().setCurrentScreen('home');\n\n2) Setting User Properties\n\nsetUserProperty(name, value)\n\nAnalytics automatically logs some user properties; you don't need to add any code to enable these. If your app needs to collect additional data, you can set up to 25 different Analytics User Properties in your app. You can analyze behaviors of various user segments by applying these properties as filters to your reports.\n\nExample:  firebase.analytics().setUserProperty('userType', 'developer');\n\nNote: This feature must be used in accordance with Google’s Privacy Policy.\n\n3) Logging an Event\n\nlogEvent(name, params)\n\nLogs an app event. If your app needs to collect additional data, you can log up to 500 different Analytics Event types in your app. Be aware of automatically collected events.\n\nExample:  firebase.analytics().logEvent(\"buttonPressed\");\n\nDebugging Firebase Analytics\n\nThe events recorded are not automatically sent to Firebase. Instead they are cached and periodically sent to the servers. You can however enable debug mode in Firebase for both Android and iOS.\n\nFor Android devices you have to run the following command:\n\nadb shell setprop debug.firebase.analytics.app <package_name>\n\nFor iOS you have to pass the following argument in Xcode:\n\n-FIRDebugEnabled\n\nAfter this step, you should be able to see events in the Firebase console under DebugView. At this point you should have default Firebase tracking implemented and also some custom events being logged to your Firebase project."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/firebase-analytics-demystified/#article",
      "headline": "Firebase Analytics demystified",
      "description": "\t\t\t<span style=\"font-weight: 400;\">After a steep learning curve into the world of Firebase Analytics or Google Analytics for Firebase, it seems that a blog post about it would be much valued and appreciated. I’ve compiled a list of the most frequently asked questions.</span>\n\n\n1. How does Firebase Analytics define a session?\n\nFirebase Analytics defines a session as a user engaging with your app for a minimum amount of time (10 seconds by default) followed by your user not engaging with your app ",
      "url": "https://www.measurelab.co.uk/insights/blog/firebase-analytics-demystified/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/firebase-analytics-demystified/#webpage"
      },
      "datePublished": "2018-02-05T12:15:12.000+00:00",
      "dateModified": "2025-07-31T20:36:38.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/screen-shot-2018-02-05-at-12-12-12.png",
      "author": {
        "@type": "Person",
        "name": "Alex Cirstea",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Firebase Analytics",
        "Google Analytics",
        "Looker Studio",
        "BigQuery",
        "Privacy",
        "Data Analysis"
      ],
      "articleBody": "\t\t\t<span style=\"font-weight: 400;\">After a steep learning curve into the world of Firebase Analytics or Google Analytics for Firebase, it seems that a blog post about it would be much valued and appreciated. I’ve compiled a list of the most frequently asked questions.</span>\n\n\n1. How does Firebase Analytics define a session?\n\nFirebase Analytics defines a session as a user engaging with your app for a minimum amount of time (10 seconds by default) followed by your user not engaging with your app for a certain amount of time (30 minutes by default). So if a user is using your app, switches to camera and takes a photo, then goes back to your app, that's considered one session. Another example is if the user accidentally taps on your app then switches away to open a different app, this won’t record a session in Firebase (if they do this within 10 seconds). You can manually define the duration of a session: for Android within the FirebaseAnalytics class and for iOS through the FIRAnalyticsCofiguration class.\n\n2. How does Firebase Analytics define a unique user?\nIn Firebase Analytics, a user is synonymous with an instance of an app this is called App Instance ID.  As the name suggests, this identifies a unique instance of the application on a device, so that if the app is uninstalled and reinstalled, it will have a distinct App Instance ID. Updating the app to a newer version does not change the App Instance ID. If you export Firebase data to BigQuery you will find this dimension under: app_instance_id now changed to user_pseudo_id\n\nYou can find the full list of dimensions exported to BigQuery here.\n\n3. Can I manually supply my own user ID into Firebase?\n\nYes, you can supply your own user ID using the FirebaseAnalytics.setUserId method. You can then link the account to BigQuery and count distinct users using BigQuery. This custom user ID will show in your BigQuery table under: user_id\n\n4. How much time does it take for Firebase analytics first report?\n\nIt takes a few hours, normally around 3-4 hours but the documentation says that the dashboard updates \"a few times every day\" and it can take up to 24 hours.\n\n5. Does Firebase Analytics work offline?\n\nFirebase with batch the events and store them locally on the device. When the device has a network connection and it’s time to upload the data, Firebase will attempt to upload the data. If the upload is successful the data is deleted from the device. If the device is offline the app will wait for connectivity before attempting to upload again.\n\nShort answer: Yes, events are stored locally and uploaded when there is an internet connection.\nNote: Data older than 72 hours will be ignored.\n\n6. Where does Firebase Analytics gets demographics and interests data from?\n\nOn Android, the data is derived from the Android Advertising ID, which is automatically collected on devices with Google Play Services installed.\n\nOn iOS, this data is derived from the Advertising Identifier (IDFA) when available (i.e. when your app links to the Ad Support Framework).\n\nNote: Demographic reports are thresholded for privacy reasons. Once you have enough data (at least 10 users per age/gender bracket), data for that bracket will be shown\n\n7. Can Firebase Analytics combine the data for the Android and iOS version of the same app?\n\nNo, currently there's no way to view combined analytics for multiple apps in the same project. You can do this with BigQuery, of course, but there's no out-of-the-box solution for the Firebase Analytics reports. After recent releases, project level reporting nows allows you to see what's happening across all the apps (iOS and Android) in a project, while also being able to apply a filter to view them individually.\n\n8. Why I can’t see custom parameters in my Firebase reports?\n\nIn order to see custom parameters in your Firebase reports you need to register these parameters with their corresponding event in the Firebase interface. To enable these parameters in Firebase go to Events, then in the row with the event you want to add the parameter click on “Edit parameter reporting”.\n\nNote: You can register up to 50 event parameters per app (40 numeric and 10 text).\n\nThese don’t report retroactively in the UI, custom parameters only report from the point you add them. But historical data is available in BigQuery."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/problem-shiny-new-built-triggers-possible-solution/#article",
      "headline": "The Problem With Google Tag Manager Triggers: Those Shiny New Built-In Options (And a Possible Solution)",
      "description": "Hey folks. The shiny new Built-In Triggers for things we used to have to use big old Custom HTML tags to track before—Youtube tracking! Scroll depth! Element visibility!—have had a bit of time to bed in now. We had a look at changing over to the new built-in solutions everywhere we were using Custom HTML—if it's being done by Tag Manager itself, it has to be better, right? Right?\n\nWrong.\n\nThis issue is related to a fact that I've discovered through experience but not seen actually documented exc",
      "url": "https://www.measurelab.co.uk/insights/blog/problem-shiny-new-built-triggers-possible-solution/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/problem-shiny-new-built-triggers-possible-solution/#webpage"
      },
      "datePublished": "2018-01-18T12:00:43.000+00:00",
      "dateModified": "2025-12-11T03:51:56.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/screenshot-2018-01-17-16-30-42.png",
      "author": {
        "@type": "Person",
        "name": "Adam Englebright",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Tag Manager",
        "Data Analysis"
      ],
      "articleBody": "Hey folks. The shiny new Built-In Triggers for things we used to have to use big old Custom HTML tags to track before—Youtube tracking! Scroll depth! Element visibility!—have had a bit of time to bed in now. We had a look at changing over to the new built-in solutions everywhere we were using Custom HTML—if it's being done by Tag Manager itself, it has to be better, right? Right?\n\nWrong.\n\nThis issue is related to a fact that I've discovered through experience but not seen actually documented except in the answers to Stack Exchange questions and the comments on Simo's blog. Those of you who are getting on a bit (like myself) will remember back in the day before GTM v2, when you had to add listeners manually. You'll still see them sometimes in old containers that haven't been cleaned out in a while, hanging around like a bad smell. Anyway: the point is, those don't exist any more. Or you can't add them, at least. Auto-event listeners are the order of the day, as they have been for a good long time now. Eagle-eyed observers, though, will have realised that those listeners are still there, they're just automatically dropped in if you have one of the relevant triggers in your container.\n\nNow, here's the thing, the fact that I set up at the beginning of the last paragraph of this paragraph: the listeners are added on the gtm.js event, aka the Page View event, and barring data layer pushes, the first event to fire on page load. I discovered this when I found that someone had managed to add a data layer declaration in the wrong place and it meant gtm.js didn't happen. I set the pageview tags to fire on gtm.dom until it was fixed, but then we realised that the click-triggered tags weren't firing. Push an event with the name \"gtm.js\" into the data layer, though, and the clicks come back. Auto-event triggers are added on page view. Good to know! That makes sense though—surely you want the listeners to be listening as soon as possible, right? Right?\n\nWrong.\n\nWell, wrong in certain cases, at least; for click, link click, form submission etc, it's fine. Where it becomes an issue is listeners that aren't necessarily best fired as early as possible. Scroll depth, for instance, which is dependent on the length of the page, and the length of the page can be affected by stuff loading in. Land on the page, three scroll depth tracking events before you’ve even touched your mouse. At this point I'd say \"especially in the case of single-page applications\", but honestly I've seen this happen on my test site which is flat HTML. It's not just scroll depth tracking either—sometimes, videos are loaded in later and we want to be able to trigger the listener on a click (or sometimes even a setTimeout after a click), and I'm sure you can think of some examples you've encountered yourself.\n\nAs a consequence, we’re still relying on custom HTML tags in a fair few cases when we’d really rather not be. For the time being, there’s no good way around this, really—but there could be. If Google were to give you the option to customise their auto-event listeners for triggers, even somewhere buried deep in the advanced settings so we could put off the scroll depth listener to gtm.dom or gtm.load, that would let us use the Built-In Triggers everywhere—but as it is, for the time being, most people will still be better off using Custom HTML tags until we can be sure it’s not .\n\nGoogle, if you’re listening—how about some auto-event listener customisation?"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/happy-birthday-measurelab/#article",
      "headline": "Measurelab turns 4: celebrating our anniversary & journey",
      "description": "Our fourth birthday in Paris\n\nMeasurelab turned 4 in September and to celebrate we all shut our laptops (except Mark, who got very excited about the organisations announcement from Google) and took the Eurostar to Paris for some well deserved and much needed rest, relaxation and culture.\n\n\nFirst taste of Parisian adventure\n\nThe trip was unofficially sponsored by Heineken (no craft ales or even Harvey’s best for sale on Eurostar unfortunately) and we toasted the start of our trip in style with pe",
      "url": "https://www.measurelab.co.uk/insights/blog/happy-birthday-measurelab/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/happy-birthday-measurelab/#webpage"
      },
      "datePublished": "2017-10-26T09:33:51.000+00:00",
      "dateModified": "2025-12-15T04:40:01.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/seine_at_night.jpg",
      "author": {
        "@type": "Person",
        "name": "Dara Fitzgerald",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "articleBody": "Our fourth birthday in Paris\n\nMeasurelab turned 4 in September and to celebrate we all shut our laptops (except Mark, who got very excited about the organisations announcement from Google) and took the Eurostar to Paris for some well deserved and much needed rest, relaxation and culture.\n\n\nFirst taste of Parisian adventure\n\nThe trip was unofficially sponsored by Heineken (no craft ales or even Harvey’s best for sale on Eurostar unfortunately) and we toasted the start of our trip in style with peanuts and lager.\n\n\nClimbing hills and finding dinner\n\nWe got to Paris and taxied straight to our Airbnb. We dropped our bags and headed straight back out for dinner. None of us were even slightly hungry so Mark had the great idea of walking up a vertical hill for 35 minutes to work up an appetite.\n\nWe had an amazing meal at La boite aux lettres, where the chef explained the menu in detail to us in English and then went out of his way to make something special for the two troublesome #MeasureVegans (don’t worry, I’m ashamed of myself for hash-tagging that).\n\n\nWine, whisky, and unusual rituals\n\nWe savoured some French wine and Japanese whisky (as you do in Paris) and Magda showed her appreciation to the chef by drinking water backwards from a glass (I think it’s some kind of Polish ritual).\n\n\nBathtub rum and Eiffel Tower views\n\nWe stopped by a local bar to sample some strange bathtub-brewed rum, which helped us appreciate the stunning view of the Eiffel Tower at night from Sacré-Cœur Basilica. So beautiful was this view in fact, not one of us took a photo of it.\n\n\nPlanning the future over camomile tea\n\nAll in all, an acceptable amount of fun was had whilst discussing the future of the company, the economy, the likely outcome of the Brexit negotiations and generally setting the world to rights. Then we all had some camomile tea and got an early night.\n\n\nMaking the most of our only full day\n\nAs the lead-by-example kind of guy I am, I woke the team early the next day to make the most of our only full day in Paris.\n\n\nExploring Paris landmarks\n\nWe met up with Adam after lunch, who arrived in Paris a day later than us, and we took a wander down to the Arc de Triomphe and also checked out the Luxor Obelisk.\n\n\nCycling along the Seine\n\nFrom there we took pity on our tired legs and rented bicycles, happily paying a surcharge for flat tyres to add some authenticity. We spent the afternoon and early evening cycling slowly along the Seine, stopping occasionally to whet our whistles or to grab a quick snack.\n\n\nEvening stories and culinary adventures\n\nThat evening we visited Notre-Dame cathedral, had some dinner and headed back to our Airbnb where Juan gave us a detailed history of his family’s paprika business and Mark tried his best to offload his bulk supply of Picon on us.\n\n\nFarewell Paris, until next time\n\nOn our last morning we had a nice chilled breakfast and watched the world go by for a bit before making our way to the Musée d'Orsay to soak up some last minute culture. After that we just about had time for some lunch and then it was back to the Gare du Nord to catch our train back to London. We all made it back in one piece, still talking to each other and all with jobs to go to on Monday morning so I say it was a roaring success overall.\n\n\nLooking ahead to the next adventure\n\nTalk has quickly turned to our next adventure, with Romania an early front-runner for a future Measurelab invasion."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/activist-analytics/#article",
      "headline": "Activist analytics: using digital analytics to drive change",
      "description": "Hey folks, Adam here. I had quite a busy weekend last week - one that has now been documented in the national press! - and thought I'd share some thoughts about it on here.\n\n\nMy journey into activist analytics\n\nI've been a member of the Labour Party and the related grassroots movement Momentum for several years now, but beyond a bit of leafleting here and there social anxiety has kept me away from the phonebanking, street stands and doorknocking that lie at the heart of party political activity.",
      "url": "https://www.measurelab.co.uk/insights/blog/activist-analytics/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/activist-analytics/#webpage"
      },
      "datePublished": "2017-07-26T10:18:10.000+00:00",
      "dateModified": "2025-12-22T13:07:52.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/12/2.png",
      "author": {
        "@type": "Person",
        "name": "Adam Englebright",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Google Tag Manager"
      ],
      "articleBody": "Hey folks, Adam here. I had quite a busy weekend last week - one that has now been documented in the national press! - and thought I'd share some thoughts about it on here.\n\n\nMy journey into activist analytics\n\nI've been a member of the Labour Party and the related grassroots movement Momentum for several years now, but beyond a bit of leafleting here and there social anxiety has kept me away from the phonebanking, street stands and doorknocking that lie at the heart of party political activity.\n\n\nSaying yes to the digital hub\n\nWhen I first got an email about the Momentum Digital Hub a few weeks back, I was interested, but slightly reluctant. Initially, I wasn't sure how much I'd be able to contribute—while I dabble in a lot of things, I wasn't sure if there'd be a use for the skills I'm completely confident in. I signed up anyway, though, and got a message from one of the facilitators asking if I had any questions, and after a quick chat she assured me there would definitely be something for me to do. I was still slightly apprehensive, but I went along anyway, planning to get the lay of the land, go out for lunch with a friend and maybe go back afterwards if there was something for me to do.\n\n\nWalking into the buzz\n\nI turned up a little late, and already the room was buzzing with activity. Small working groups had formed around the scattered tables, and various people with \"facilitator\" badges were standing around the drinks area in the centre to help people who had just arrived and looked confused.\n\n\nMeeting Harry, Adam, and the team\n\nAs one such confused-looking person, I was greeted and directed to a corner of the room where I was introduced to Harry and Adam (a different one).\n\n\nBringing my Analytics skills to the table\n\n\"What sort of stuff can you do?\" they asked.\n\n\"I can do Google Analytics and Tag Manager...\"\n\n\"Tag Manager? You know anything about the data layer? We could do with someone taking a look at that.\"\n\n\"My dudes,\" I didn't say, \"I'm all about the data layer\".\n\n\nDiving headfirst into the work\n\nLike that, I was off to the races. Creating Trello boards, reviewing tracking setups, creating events... I stayed until the late evening, then returned home to Brighton, trying both to draw up a plan for future tracking on the train and to keep my eyes open.\n\n\nComing back for day two\n\nI was so enthused I ended up going back the next day, which I hadn't planned to. It was a bit quieter, and I was able to spend more time discussing stuff with the others, and I was able to get agreement for a bunch of \"next steps\" for the planning, which I will be following up on in the coming weeks!\n\n\nWhy this weekend meant so much\n\nBy the end I was exhausted and the realisation dawned that I had spent my entire weekend doing what I spend the whole week doing anyway; but also that I didn't mind. I don't think I can quite oversell how good it was to be able to fully contribute to an endeavour in that way. Part of it was relief—I was able to be useful, even when I thought I wouldn't be!—but a lot of it was that I was able to use my skills in service of something I believe in. I love all of our clients (of course!) but doing stuff for a cause is another thing entirely. It was a great weekend, and I'd like to encourage anyone who's so inclined—especially if, like me, you're not well-suited for the usual forms of political activity—to get involved with stuff like this.\n\nUnless you're a Tory.\n\nOver and out."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/data-studio-new-countries-availability/#article",
      "headline": "Data Studio new countries availability",
      "description": "\t\t\t<span style=\"font-weight: 400;\">The time has come for more of you to enjoy the benefits of Data Studio reports! Today, Google has announced long-awaited expansion of its product availability to more than 180 countries. </span>\n\n\nMore and more people will now be able to enjoy the benefits of this powerful tool - you can now create, share and edit reports, and impress your boss and clients with your skilful dashboard creation skills.\n\nBut that's not all! With that great news come other useful f",
      "url": "https://www.measurelab.co.uk/insights/blog/data-studio-new-countries-availability/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/data-studio-new-countries-availability/#webpage"
      },
      "datePublished": "2017-03-07T17:21:17.000+00:00",
      "dateModified": "2025-07-31T20:36:39.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/treated_4.jpg",
      "author": {
        "@type": "Person",
        "name": "Magdalena Pajak",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Looker Studio",
        "Google Cloud"
      ],
      "articleBody": "\t\t\t<span style=\"font-weight: 400;\">The time has come for more of you to enjoy the benefits of Data Studio reports! Today, Google has announced long-awaited expansion of its product availability to more than 180 countries. </span>\n\n\nMore and more people will now be able to enjoy the benefits of this powerful tool - you can now create, share and edit reports, and impress your boss and clients with your skilful dashboard creation skills.\n\nBut that's not all! With that great news come other useful features:\n\n * updated filters functionalities (Reuse Filters, Compound Filters, Metric Filters)\n * segments - both system and custom user defined segments\n * improved data connectors\n * better integration with Google Cloud Platform\n * file uploads (up to 2GB of CSV data for free)\n\nCheckout for more details on Google Blog, enjoy the new features and stay tuned for more updates on Data Studio!"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/free-google-analytics-health-check-template-measurelab/#article",
      "headline": "Free Google Analytics Health Check Template by Measurelab",
      "description": "Hey Folks, It's been a while since the last time I wrote anything on the blog so I thought I'd make it up to you with a little freebie.\n\n\nWhy GA health checks are important\n\nOne of the most common tasks at Measurelab (and I'm sure in many other analytics agencies) is to run a \"health check\" of the main features and configurations of the Google Analytics user interface.\n\n\nHow the template works\n\nThis varies in depth and level of detail depending on various factors but we do find it quite helpful ",
      "url": "https://www.measurelab.co.uk/insights/blog/free-google-analytics-health-check-template-measurelab/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/free-google-analytics-health-check-template-measurelab/#webpage"
      },
      "datePublished": "2017-02-17T12:00:10.000+00:00",
      "dateModified": "2025-12-15T04:07:38.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/treated_4-2.jpg",
      "author": {
        "@type": "Person",
        "name": "Juan Barros",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Google Tag Manager"
      ],
      "articleBody": "Hey Folks, It's been a while since the last time I wrote anything on the blog so I thought I'd make it up to you with a little freebie.\n\n\nWhy GA health checks are important\n\nOne of the most common tasks at Measurelab (and I'm sure in many other analytics agencies) is to run a \"health check\" of the main features and configurations of the Google Analytics user interface.\n\n\nHow the template works\n\nThis varies in depth and level of detail depending on various factors but we do find it quite helpful as it provides us and the client with a quick overview of the \"health status\" of the Google Analytics Account, Property(ies) and View(s). It can also help to flag the main priorities and what the next steps should be.\n\nThe template below - which you can download or make a copy of - runs through the configuration and feature settings that are key to ensure that GA is gathering the correct information but also touches on some of the further tracking capabilities that can truly enhance your data gathering efforts.\n\n\nScoring and progress labels\n\nEach item can then be labelled with either a score, which provides an idea of whether this feature is being used to its full potential, or with a progress label (To do, Ongoing, etc) to help you keep track of what's been done, what's next, etc.\n\n\nCustomize the template for your needs\n\nAgain this document can be further developed to provide a more in-depth analysis of your digital analytics framework or to focus on more specific areas of the implementation, so feel free to modify it to fit your needs! [Measurelab] Google Analytics Health Check - Template Cheers, Juan *\n\n\nLearn more with our GTM course\n\nCheck out our Google Tag Manager Course in Udemy to find out more."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/data-studio-just-getting-better-better/#article",
      "headline": "Google Data Studio: just getting better & better",
      "description": "We have some great news for all those of you who live and breathe Data Studio! Google has just announced two big changes to the tool:\n\n 1. The 5 report limit for the free version has been removed\n 2. What is even more exciting, Data Studio is now free for both basic and 360 (enterprise) version users!\n\nUp till now, the only real downside of the free version of the tool, was its limitation in the number of reports you could create per account. So if you are a free version user, you won’t be reall",
      "url": "https://www.measurelab.co.uk/insights/blog/data-studio-just-getting-better-better/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/data-studio-just-getting-better-better/#webpage"
      },
      "datePublished": "2017-02-02T17:19:06.000+00:00",
      "dateModified": "2025-12-10T00:51:41.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/treated_2.jpg",
      "author": {
        "@type": "Person",
        "name": "Magdalena Pajak",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Looker Studio"
      ],
      "articleBody": "We have some great news for all those of you who live and breathe Data Studio! Google has just announced two big changes to the tool:\n\n 1. The 5 report limit for the free version has been removed\n 2. What is even more exciting, Data Studio is now free for both basic and 360 (enterprise) version users!\n\nUp till now, the only real downside of the free version of the tool, was its limitation in the number of reports you could create per account. So if you are a free version user, you won’t be really getting any additional features that would otherwise be only reserved to the paid version, but it does mean that you will be able to create as many new reports as you wish. It seems like a small advantage, but just imagine having to create 20 totally different reports, with multiple data sources and aimed at completely different public - after all you don’t always want to share all of your data with everyone in the company!\n\nHow will these changes affect me and my clients?\n\nFor those of you, who have already paid for the enterprise version, as of 2nd of February 2017, you should no longer be billed for the tool. And if you wonder if there are any benefits that you may have from using Data Studio 360 in the future - yes, there are! The idea is to work on developing a more powerful core product, with new great features that will work for all users, but adding even more extra functionalities for paid clients at a later stage.\n\nIf you are one of the whitelisted Data Studio 360 beta clients, you will continue to receive Data Studio for free. There will be no changes for those clients who use beta version in countries where the product is still unavailable. However, no new clients will be accepted to the Data Studio whitelist at the moment. What the product team is hoping to achieve with this change, is easier localization, which would help making Data Studio available in more countries in H1 2017.\n\nMake sure to keep an eye on new releases and enjoy your unlimited reports!"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/tricks-tips-data-studio/#article",
      "headline": "Google Data Studio tips: tricks and best practices",
      "description": "Getting started with Google Data Studio\n\nSince its release back in May 2016, Data Studio (a free version of Data Studio 360) has made quite a lot of progress on improving its functionality. Of course, it is still in beta, so you might come across some system bugs and limitations, but the Google team is working hard to add new features and fix any issues the user may face, with at least two new releases per month (so far).\n\nI won't go into details as what you can do with the tool, as you can chec",
      "url": "https://www.measurelab.co.uk/insights/blog/tricks-tips-data-studio/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/tricks-tips-data-studio/#webpage"
      },
      "datePublished": "2016-12-07T15:01:29.000+00:00",
      "dateModified": "2025-12-15T05:11:35.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/treated_2-2.jpg",
      "author": {
        "@type": "Person",
        "name": "Magdalena Pajak",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "How-to",
        "Google Analytics",
        "Looker Studio"
      ],
      "articleBody": "Getting started with Google Data Studio\n\nSince its release back in May 2016, Data Studio (a free version of Data Studio 360) has made quite a lot of progress on improving its functionality. Of course, it is still in beta, so you might come across some system bugs and limitations, but the Google team is working hard to add new features and fix any issues the user may face, with at least two new releases per month (so far).\n\nI won't go into details as what you can do with the tool, as you can check that using Google Data Studio Help site which includes some useful video tutorials and general overview of the product.\n\nBut what if you're a little impatient (like me) and want all these extra features to be ready to use now? Well, you can always try and look for a way around and use your imagination! For example…\n\nLet’s say you want to create a table with data from Google Analytics, showing the pageviews by Channel and compare the totals to the previous period and last year. Something like that:\n\n\nCustomizing table headings for clarity\n\nFirst step is to make sure that the table headings are short and informative. As you know, this is not always the case with the dimensions and metrics that you get from GA. For example, instead of “Channels” you will get “Default Channel Grouping” or a very long “Goal 1 (Goal 1 Completions)” where all you want is simply “Goal 1 Completions” etc.\n\nTo solve that, go to your metrics and dimensions list and click on the field you want to update and simply change the name:\n\n\nComparing data across periods\n\nNext step is more tricky. At the moment, Data Studio gives you an option to only compare metrics with either previous period or previous year:\n\nHowever, you will find that many clients like to see how their data compares to both of these as it will give them a better understanding of trends, and flag any unusual activities on the account.\n\n\nCreating separate tables for multiple comparisons\n\nOne way to achieve that would be by creating two separate tables. However, if you are space-limited or just want to see everything in one place you can use this little trick that I found quite handy.\n\nYou still need to create two tables, with the same dimensions and metrics, but one will compare data with the previous period and the other with the previous year.\n\n\nUsing a background object to display both comparisons\n\nNow using your editing skills, create a rectangular object which will have the same colour as your report’s background (in my case white). You will need that to “cover” some of the data from the second table. The next step is to play around with how the tables are ordered on the report.\n\n\n\n\nOrdering tables and objects for the desired view\n\nYou will need the main table (1) to be brought to front followed by the rectangular object (2) and with the second table (3) send to back. Here is how this experiment would look like on a background that doesn’t match my object:\n\nThe main reason to have object (2) is to cover the second table data and only show the desired YoY change.\n\n\nLinking tables to the same data source\n\nNow, you only need to change the background so that it matches object (2), add some text and formatting, and voila! Now your table shows both comparisons in one neat widget.\n\nMake sure to link both tables to the same source and date range which should be setup to “auto” so that you don’t need to update these manually."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/ga-just-isnt-enough-measurefest-talk/#article",
      "headline": "When GA just isn't enough - my #measurefest talk",
      "description": "\t\t\t<span style=\"font-weight: 400;\">I spoke at <a href=\"http://www.measurefest.com/\" target=\"_blank\" rel=\"noopener noreferrer\">#Measurefest</a> in the Barbican last Friday. Here are the slides from my talk but I wanted to write a quick summary to give a bit more context as the slides on their own don’t tell the story. </span>\n\n\nWhen GA just isn't enough from darafitzgerald\n\nThe title of the talk was \"When GA just isn't enough\". For some that know me this might sound like an unexpected title. I sp",
      "url": "https://www.measurelab.co.uk/insights/blog/ga-just-isnt-enough-measurefest-talk/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/ga-just-isnt-enough-measurefest-talk/#webpage"
      },
      "datePublished": "2016-11-24T15:23:12.000+00:00",
      "dateModified": "2026-01-29T10:54:04.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/20161118_122853.jpg",
      "author": {
        "@type": "Person",
        "name": "Dara Fitzgerald",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Google Tag Manager",
        "Looker Studio",
        "Data Analysis",
        "Ecommerce"
      ],
      "articleBody": "<span style=\"font-weight: 400;\">I spoke at <a href=\"http://www.measurefest.com/\" target=\"_blank\" rel=\"noopener noreferrer\">#Measurefest</a> in the Barbican last Friday. Here are the slides from my talk but I wanted to write a quick summary to give a bit more context as the slides on their own don’t tell the story. </span>\n\n\nWhen GA just isn't enough from darafitzgerald\n\nThe title of the talk was \"When GA just isn't enough\". For some that know me this might sound like an unexpected title. I spend my working life using Google Analytics, talking about Google Analytics and training other people how to use Google Analytics. It's fair to say I've done my bit over the years to advocate GA and help businesses use this powerful, free (for most users!) analytics platform.\n\nBut I talk about its benefits a lot and so this time I wanted to talk about a few useful tools outside the Google world that we use for our own business at Measurelab, as well as recommending them to clients when we feel they are the right for the job.\n\nThe point of this wasn’t to detract from GA in any way but instead to point out that no single technology platform does everything a business needs and it is entirely sensible to use more than just GA to measure the performance of your website and better understand your users.\n\nThe other solutions I covered in my talk were Hotjar, GoSquared, Heap and Power BI and each of these offers something extra to what you can get with GA.\n\n\nHotjar\n\nHotjar records user sessions and lets you play them back to better understand user behaviour on your website and identify optimisation opportunities. There are many other session recording tools out there and for my Measurefest talk I didn’t intend to explain all the merits of session recording as these tools are well known (some alternatives to Hotjar include Inspectlet, SessionCam and Clicktale). The point I wanted to stress was that Google Analytics (or any pure web analytics platform for that matter) focusses predominantly on quantitative data whereas session recording solutions are a very good example of qualitative data capture. In other words while Google Analytics is great for telling you what is happening and how often, tools like Hotjar are better able to tell you why.\n\nI also mentioned a solution for passing the Hotjar user ID into GA for further analysis opportunities. The great advantage of doing this is that it allows you to identify users in GA based on certain behaviours on site (e.g. converting users, cart abandoners, content consumers, etc.) and then play back the sessions of particular users from those segments.\n\nThe solution I recommended for this was Hotjar userId tracking in Google Analytics with Google Tag Manager v2 by the very knowledgeable Eivind Savio, who works for a fellow Google Analytics Certified Partner in Norway.\n\n\nGoSquared\n\nWe’re huge fans of GoSquared here at Measurelab and we use it on a daily basis for our own business as well as recommending to others. GoSquared started life as a real-time analytics platform but it has become much more than that. It is now marketing itself as an “all-in-one software platform for marketing, sales, and support.” It does this through three main features: Analytics, Live Chat and a People CRM. In my own words I would say GoSquared allows you to interact with users on your site with real-time analytics data about what they are doing. You can reach them via email if they leave the site during your live chat and once they have identified themselves you will then have all your leads, contacts and customers in one place all tied to onsite analytics data and chat history. It’s lightweight but powerful and practical. It doesn't offer a huge array of features that aren’t relevant to most businesses. What it does offer is focussed and useful and it does it very well.\n\n\nHeap\n\nA very common situation when it comes to data reporting and analysis is realising you’re not actually collecting the data you want to analyse. I’m sure you’ve been there. A colleague or manager asks you how many users have done a particular thing on your website and you realise you aren’t actually tracking this. A well thought out measurement plan can help to minimise how likely this is but generally speaking no business is tracking everything on their website and you don’t always know everything you will need until you need it.\n\nI regularly have to say the words to clients “You will only have data for this in Google Analytics from the point we add the extra tracking”. This usually applies to event tracking but can also be applied to Ecommerce actions that might these days we tracked using Enhanced Ecommerce (which again will only collect data from the point you implement the tracking tags).\n\nEnter Heap. “Heap automatically captures every user action in your web or iOS app and lets you analyze it all retroactively.” In other words, from the day you add the single JavaScript snippet to your site, Heap will record all user actions that take place in the DOM and allows you to then define your events on the fly based on the data collected. This means you can see data for these events for all your historical data stored by Heap. This offers a huge advantage over traditional analytics platforms. The cost of this advantage is, well, the cost. Heap charges based on volume but you do get 5,000 sessions per month on the free version. You can increase this to 50k per month if you are willing to add their badge to your website. So 50,000 sessions per month would be sufficient for some businesses but not for all. And there’s little point in having Heap if it’s not collecting all data for all users.\n\nI was asked a really good question about Heap by Al Wightman after my talk and I had no answer for it at the time. He asked how Heap is affected when the front-end code changes on the site. So the short answer is that an event will stop tracking if the onsite code that you used to define the event in Heap changes. The good news is that you can then update your definition in Heap to include both the old (already in place) and new code. Once you’ve done this you can again view all the historical data collected by Heap.\n\n\nPower BI\n\nMore and more these days, businesses want to get the data that’s in GA, out of GA. Business reporting involves more than just web analytics data and furthermore management often want custom business performance dashboards that pull data from multiple sources and are presented visually and automatically updated. We are using Google Data Studio (the free version of Data Studio 360) more and more now but because it is still relatively new the number of data connectors (i.e. data sources) is still limited. There are a number of other BI/data visualisation solutions out there but some are pricey and have a steep learning curve (e.g. Tableau). This is fine if this level of sophistication is needed but that’s not always the case. Data Studio offers an easy, low cost entry to data visualisation and so does Power BI by Microsoft. Before Data Studio was released we were using Power BI for data visualisations that relied on multiple data sources. One of the main advantages Power BI has over Data Studio right now (this will change in time I’m sure!) is the number of data connectors is offers. Data Studio currently offers 8 while Power BI has 60. Email marketing data (e.g. MailChimp, CRM data (e.g. Salesforce), Financial data (e.g. Xero) and social data (e.g. Facebook) are just a few of the data source types that are available with Power BI.\n\nYou can also do clever stuff if you’re so included like using R with Power BI for traffic and sales forecasting. Watching this R Visualisations within Power BI YouTube video prompted us to try this.\n\nAnother nifty, yet easy to overlook, data source within Power BI is the unassuming web connector. This simply lets you input a web URL and Power BI will then pull in the content from that webpage. Obviously not all web content will be useful in a data visualisation/reporting context but numbers, lists, ratios, prices, etc. can all be extremely relevant. To demo this my colleague Daniel built a simple dashboard using the web connector to pull data from a page on the IMDB website, listing the most popular TV series. This pulled the actual list of shows from the page into Power BI, where Daniel was able to clean it up a little and then use it to power some graphs. This was the end result:\n\nThere is one major drawback to using Power BI currently. The desktop application (which you need to use Power BI to its full extent) is Windows only. The online editor  just isn't nearly as comprehensive as the desktop application.\n\n\nPII\n\nGoogle Analytics have always had a clear and consistent stance on personally identifiable information (PII). It is simply not allowed within GA. So no usernames, actual names, email addresses, etc. A customer or user ID is allowed as long as it is not possible to directly identify the user within GA using that ID. There is nothing stopping you from pulling data out of GA by customer ID (you do need to be tracking customer ID in the first place obviously) and then linking this up with richer, user data in your CRM. You just can’t do this inside Google Analytics. This obviously makes Google Analytics very impersonal (that’s the point!). But businesses want to see data by users, ideally actual people rather than some anonymous user ID. GoSquared & Heap both allow PII to be tracked and this can be used very effectively to better understand your users overall and individually. They will even retroactively attach your user information once someone identifies themselves (e.g. logs in) to all their previous sessions before the logged in. Even if you are using the User ID reporting in GA effectively, this will only stitch together sessions where the user is logged in and will therefore (vitally!) exclude that user’s initial sessions where they were browsing but not yet registered/signed up/logged…"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/getting-optimizely-integrated-universal-analytics-using-google-tag-manager-better-way/#article",
      "headline": "How to integrate Optimizely with GTM & Universal Analytics",
      "description": "\n\nIf you want to integrate your Optimizely experiment and variation data with Google’s Universal Analytics via Google Tag Manager, you will soon see that the official documentation assumes a custom‑coded implementation. It then instructs you to edit your GA pageview tag directly. If you are using Google Tag Manager, then you obviously will not want to follow this guidance as you probably have the Google Analytics pageview tag in a tag template. It is always advisable to keep custom JavaScript an",
      "url": "https://www.measurelab.co.uk/insights/blog/getting-optimizely-integrated-universal-analytics-using-google-tag-manager-better-way/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/getting-optimizely-integrated-universal-analytics-using-google-tag-manager-better-way/#webpage"
      },
      "datePublished": "2016-09-16T12:16:14.000+00:00",
      "dateModified": "2025-12-11T03:09:02.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/treated_13.jpg",
      "author": {
        "@type": "Person",
        "name": "Steven Elliott",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "How-to",
        "Google Analytics",
        "Google Tag Manager",
        "Testing"
      ],
      "articleBody": "\n\nIf you want to integrate your Optimizely experiment and variation data with Google’s Universal Analytics via Google Tag Manager, you will soon see that the official documentation assumes a custom‑coded implementation. It then instructs you to edit your GA pageview tag directly. If you are using Google Tag Manager, then you obviously will not want to follow this guidance as you probably have the Google Analytics pageview tag in a tag template. It is always advisable to keep custom JavaScript and HTML tags to a minimum, and using the built-in Google Analytics pageview tag template. Moreover, the integration suggested by Optimizely requires a new Custom Dimension slot for each experiment, which can quickly exhaust your available slots and requires setup before each experiment which can often be overlooked.\n\n\n\nHowever, there is a better way! With the approach detailed below, you don’t need to customise any tag templates in Google Tag Manager, nor will you have to remember to set up Custom Dimensions in Google Analytics before every experiment. This approach uses Event tracking for all the Optimizely experiments in Google Analytics which can then be used throughout your Google Analytics reports.\n\nSo how do we send experiment information from Optimizely into Universal Analytics using Google Tag Manager?\n\n(This is the tech bit, so jump to step 1 below if you just want to get to the integration bit!)\n\nFirstly, let’s explain the “integration” script that Optimizely provide and ask you to use:\n\nwindow.optimizely = window.optimizely || []; window.optimizely.push(\"activateUniversalAnalytics\");\n\nThe first line here looks for the existing global variable, named “optimizely” and sets it to an empty array if it doesn’t exist. Nothing too unusual there as this is created if you are running Optimizely, having inserted the required Optimizely script tag they supply (e.g. <script src=\"//cdn.optimizely.com/js/123456789.js\"></script>) at the top of your head in the html of your page.\n\nThe second line causes the appropriate experiment and variation data from Optimizely to be exposed and (where appropriate) custom dimensions to be set (not sent).\n\nThe official documentation from Optimizely describes how you may insert this “activation” between the lines of code in your Google Analytics script where the tracker is initialised and the pageview hit is made. However, if you’re using a pageview template, you will not be able to make such an edit. Instead, we need to do the “activation” and then send an event to Google Analytics with the relevant Optimizely experiment data (as a Custom Dimension too, if you like) by using a sequenced Cleanup Tag in the tag template.\n\n\nStep 1)\n\nAdd the following code as a new tag of type “Custom HTML” in GTM and name it “JS - cleanup - Optimizely”):<p>window.optimizely = window.optimizely || [];<br> window.optimizely.push(&quot;activateUniversalAnalytics&quot;); <br> if (window.optimizely.data !== undefined) {<br> var oData = window.optimizely.data;<br> var activeExperiments = oData.state.activeExperiments;<br> if (oData.state.activeExperiments &amp;&amp; oData.state.activeExperiments.length) {<br> activeExperiments = oData.state.activeExperiments;<br> var mCnt = activeExperiments.length;<br> var mExp = '';<br> var tCount = 0;<br> for (var i=0;i&lt;(mCnt);i++) {<br> mExp = activeExperiments[i];<br> var curTest = oData.experiments[mExp].name;<br> var curVar = oData.state.variationNamesMap[mExp];<br> var curVarID = oData.state.variationIdsMap[mExp];<br> tCount += 1;<br> dataLayer.push({<br> 'event': 'optimizely',<br> 'eventCategory': 'Optimizely',<br> 'eventAction': 'Experiment &quot;' + curTest + '&quot; | ID: ' + mExp,<br> 'eventLabel': 'Variation &quot;' + curVar + '&quot; | ID: ' + curVarID<br> });<br> }<br> }<br> }<br>\nNOTE: Although Google Tag Manager will prompt you to add a firing trigger, save the tag with none.\n\n\nStep 2)\n\nThe new tag created in step 1 will push the Optimizely data into a data layer, so we will then need to create the corresponding Variables in Google Tag Manager. Here we have used the standard Google dataLayer taxonomy, so if you already have these variables saved, you can skip this step!\n\nThere are 4 variables that will need to be created, all with the type of \"Data Layer Variable\":\n\n * dataLayer.eventCategory (Data Layer Variable Name = eventCategory)\n * dataLayer.eventAction (Data Layer Variable Name = eventAction)\n * dataLayer.eventLabel (Data Layer Variable Name = eventLabel)\n * dataLayer.eventValue (Data Layer Variable Name = eventValue)\n\n\nStep 3)\n\nNow in your Google Analytics pageview template tag, go to the Tag Sequencing part and select to fire a Cleanup Tag it fires and choose the “JS - cleanup - Optimizely” HTML tag you've just created in step 1:\n\n\nStep 4)\n\nLastly, we then need to actually send the Optimizely experiment variation into Google Analytics as an Event. Now create a new Google Analytics Event template tag and also create a new Trigger to fire on the “optimizely” data layer event trigger. Then add the new Variables you've just created in step 2 in their respective fields for the Event:\n\n\nStep 5)\n\nPreview the changes and test on your site. If everything is working, then you're good to publish!\n\n\nStep 6)\n\nSit back and watch the data roll in!\n\nHere’s a better way to integrate Google Analytics with Optimizely, using Google Tag Manager."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/learnt-non-interactive-interactions-first-month-measurelab/#article",
      "headline": "Understanding GA non-interactive events: month 1 insights",
      "description": "Starting a new adventure in analytics\n\nWhen I first decided to quit my ohh-so-lucrative job in the investment banking, most of my friends and family thought I was going bonkers! Neither were they impressed with my idea to start a new career in Web Analytics, working for some small start-up based in Lewes (wait why exactly do you want to work in Loos?!?). I must say that I had my doubts as well - will I be able to adapt to a totally new working environment? Will I ever learn what all the cookies,",
      "url": "https://www.measurelab.co.uk/insights/blog/learnt-non-interactive-interactions-first-month-measurelab/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/learnt-non-interactive-interactions-first-month-measurelab/#webpage"
      },
      "datePublished": "2016-09-15T16:02:01.000+00:00",
      "dateModified": "2026-01-27T11:25:09.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/treated_12-1.jpg",
      "author": {
        "@type": "Person",
        "name": "Magdalena Pajak",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Tag Manager",
        "Privacy",
        "How-to"
      ],
      "articleBody": "Starting a new adventure in analytics\n\nWhen I first decided to quit my ohh-so-lucrative job in the investment banking, most of my friends and family thought I was going bonkers! Neither were they impressed with my idea to start a new career in Web Analytics, working for some small start-up based in Lewes (wait why exactly do you want to work in Loos?!?). I must say that I had my doubts as well - will I be able to adapt to a totally new working environment? Will I ever learn what all the cookies, crawler, and spiders really mean? And most importantly - will I become a total computer geek???\n\n\nMonth one reflections\n\nOne month on and some of these questions have been answered already: I shouldn’t be afraid of spiders; I should only eat low sugar cookies; and working for a start-up is actually quite cool. The rest - TBC.\n\nIt’s been an intensive month so far, but I can already see some progress and can’t say that I hate my job yet (which is a good sign)!\n\n\nDiscovering non-interaction events\n\nLet’s have a look at one curious thing I learned recently - Non-Interaction Events.\n\n\nWhat are non-interaction events?\n\nOK, that doesn’t sound quite logical - events by nature are users interactions with the content on your site, like clicks on links, submitting forms, downloading PDF, etc. So how can you have events that are non interactive?\n\n\nWhen to use non-interaction events\n\nLet’s say that your main page has a video that automatically plays when a user enters the site (happens all the time when I open news articles on some popular news sites). The user is not really interacting with the video as these are set to automatic play, and they can close the site immediately without watching the clip, reading the site content or going to any subsequent pages. In that case, you would like to track that hit as a non-interaction event.\n\n\nHow to set them up\n\nTo do so you either set the interaction parameter to “1” in your event data:\n\nor “true” if you are using Google Tag Manager:\n\n\nWhy non-interaction events matter\n\nThere is one main reasons why you should set these kind of events to non-interaction hits. The bounce rate! Here is what GA has to say about events : “by default, the event hit is considered an interaction hit, which means it is included in bounce rate calculations”. And we don’t really want that to happen! We want these sessions to be treated as totally 100% bounced so that they don’t mess up our reporting! This is where the non-interaction events come in handy. Knowing this small trick will ensure better accuracy of your data.\n\n\nWrapping up and next steps\n\nCheck GA support site for more details on non-interaction events and wish me luck with my new job!\n\nBy the way, if you’re confused when it comes to bounce rate concept I strongly recommend reading a great article by one of my colleagues, Alex: Bounce Rate vs Exit Rate."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/bounce-rate-vs-exit-rate-part-one/#article",
      "headline": "Bounce rate vs. Exit rate part one",
      "description": "\t\t\t<span style=\"font-weight: 400;\">Many companies consider a high bounce rate an issue that needs to be addressed quickly. Others support a high bounce rate. The truth is that most people don’t understand what “bounce rate” really means.</span>\n\n\nSo what is a Bounce rate?\n\nAccording to Google:\n\nBounce Rate is the percentage of single-page sessions (i.e. sessions in which the person left your site from the entrance page without interacting with the page).\n\nA better definition would be:\n\nBounce Ra",
      "url": "https://www.measurelab.co.uk/insights/blog/bounce-rate-vs-exit-rate-part-one/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/bounce-rate-vs-exit-rate-part-one/#webpage"
      },
      "datePublished": "2016-09-12T12:22:21.000+00:00",
      "dateModified": "2025-07-31T20:36:41.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/landing-page-efficio-blu2.jpg",
      "author": {
        "@type": "Person",
        "name": "Alex Cirstea",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics"
      ],
      "articleBody": "\t\t\t<span style=\"font-weight: 400;\">Many companies consider a high bounce rate an issue that needs to be addressed quickly. Others support a high bounce rate. The truth is that most people don’t understand what “bounce rate” really means.</span>\n\n\nSo what is a Bounce rate?\n\nAccording to Google:\n\nBounce Rate is the percentage of single-page sessions (i.e. sessions in which the person left your site from the entrance page without interacting with the page).\n\nA better definition would be:\n\nBounce Rate is the percentage of single-interaction sessions. A bounce means that someone landed on your site and then didn’t click anything before the session expired.\n\nAnother more simplistic definition by the analytics evangelist Avinash Kaushik is: “I came, I puked, I left”.  Although this quote helps to keep things simple and memorable, a bounce rate is a much more complex metric and shouldn’t be looked at in a simplistic way because is quite possible to draw incorrect conclusions about user behavior on one’s site.\n\nA few things to note:\n\n * Bounces are always one page sessions.\n * Bounce rate applies only to a landing page (i.e. the first page a person visits)\n * Bounce means that the user didn’t interact with the page\n\nWhat is considered a bounce?\n\n * Clicks on external links\n * Clicks on the back button (very common)\n * Closes the browser (window/tab)\n * Types a new URL in the same browser tab or window\n * Does nothing (session times out after 30min)\n\nBelow we have a few reports to look into for better understanding of the bounce rate metric and how is it relevant to your website.\n\nTraffic Sources Report\n\nGo to Traffic Sources > All Traffic.\n\nHere we can see what type of traffic has the highest bounce rate. In this case, although a lot of traffic is coming from YouTube, the bounce rate for these visitors is over 80% and the average time they spend is 1.58 min compared to the average 4.76 min on other pages.  Also the revenue for this traffic is zero, maybe your YouTube campaign are not as efficient as you'd like, or maybe that’s what you want, to raise awareness.\n\nLanding Pages Report\n\nGo to Content > Site Content > Landing Pages\n\nHere you will see the pages on your website that have received the most Pageviews within the last thirty days with their bounce rate.\n\nWe can see that 35% of the visitors that land on the homepage bounce, which means the rest of them either take action, or move to another page on our website. However, we can see for the page on row three that the bounce rate is really high 99% and the average time spent on this page is 5 seconds. Clearly, there are some technical issues that need to be fixed here.\n\nBrowser & OS Report:\n\nGo to Audience > Technology > Browser & OS\n\nHere, you can see if one particular Browser has high bounce rate. We had one client with really high bounce rate for Safari, we discovered that the website wasn’t optimised for this particular browser, thus users would land on a page and leave straight away because they had a bad experience.\n\nAnother useful report would be the Mobile report. Audience -> Mobile. Here you can see if one particular platform (mobile,  tablet or desktop) has a higher bounce rate, thus you can optimise your website for that audience.\n\nGoogle Analytics Benchmark Averages for Bounce Rate\n\n40-60% Content websites\n\n30-50% Lead generation sites\n\n70-98% Blogs\n\n20-40% Retail sites\n\n10-30% Service sites\n\n70-90% Landing pages\n\nWhen is a High Bounce Rate Acceptable?\n\nWhen the user has positive experience! This is often the case for most popular blogs. A user (usually a returning visitor) will come to read your latest blog post and then leave. Don’t lose sleep over it! This will cause a high bounce rate, but that doesn’t mean your website is not efficient.\n\nHow to improve your bounce rate (if needed)\n\n * See which type of pages engage users the most and create similar\n * Add links to content everyone will love to your sidebar\n * Add links to other pages within your website’s content\n * Improve your content quality on pages with high bounce rate. It’s almost always something technical, such as an incorrect image or missing content\n * Add scroll tracking on your blog so you can better understand your visitors\n\nConclusion\n\nInterpreting bounce rates is all about context.\n\nNever make any analysis based off of one metric or one statistic and always look at the complete picture of your website’s data. Bounce rates are a user behavior metric, not a site performance metric like conversions or revenue. At the end of the day you need to focus on the customers that didn’t leave.\n\nStay tuned for part two, which will be focused on Exit Rate."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/workspaces-google-tag-manager/#article",
      "headline": "GTM workspaces: how to manage multiple workspaces in Google Tag Manager",
      "description": "Exciting news in the world of analytics! Recently, Google has launched a new feature called Workspaces for both GTM and GTM 360 users.\n\nThe goal of this new feature is to solve workflow challenges for multi-user teams working within the same container.\n\nWorkspaces allow you to make changes in a specific instance of GTM, while others can work in a separate instance of the same container. Basically, when a Workspace is created, a new Container Draft is separated from the latest GTM container versi",
      "url": "https://www.measurelab.co.uk/insights/blog/workspaces-google-tag-manager/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/workspaces-google-tag-manager/#webpage"
      },
      "datePublished": "2016-08-31T10:45:55.000+00:00",
      "dateModified": "2025-12-10T03:27:52.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/workspace-menu.jpg",
      "author": {
        "@type": "Person",
        "name": "Alex Cirstea",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Tag Manager"
      ],
      "articleBody": "Exciting news in the world of analytics! Recently, Google has launched a new feature called Workspaces for both GTM and GTM 360 users.\n\nThe goal of this new feature is to solve workflow challenges for multi-user teams working within the same container.\n\nWorkspaces allow you to make changes in a specific instance of GTM, while others can work in a separate instance of the same container. Basically, when a Workspace is created, a new Container Draft is separated from the latest GTM container version, and this becomes your new Workspace. For example, you can have one person from your team creating custom HTML tags, while someone else could be implementing advertiser tags.\n\n\nCreating a new Workspace\n\nThis is pretty straightforward; you just have to add a Workspace name and a Description. Keep a consistent naming convention within your team.\n\nAll your variables, triggers and tags you had already will be available in your new Workspace. Any changes that you make within the Workspace will only apply after you publish them.\n\n\nPublishing a Workspace\n\nAs Workspaces are Container Drafts, you can either Create a Version or Publish the Workspace (this will automatically create the version and then publish it). If you haven't updated your Workspace, GTM will automatically update it when you want to publish your version.\n\n\nBuilt-in conflict resolution\n\nLet's say that you want to update your Workspace or that you are prompt to do an update, you might get an orange pop-up bar saying \"Conflicts found\". This happens when a Variable,Trigger or Tag was changed in the Latest Container Version, and you have also modified that same item in your current Workspace. In order to update to the latest version, you will need to fix all conflicts either in the favour of the Latest Version or your Workspace.\n\n\nLimitations:\n\nThere's a limit of three Workspaces per container for standard GTM users, while Tag Manager 360 users can create unlimited workspaces. Don't worry! Having a limit of three workspaces means that you actually have to be more efficient when making changes to the container.\n\n\nWorkspace-related user permissions\n\nIf you go to Admin - > User Management you will see some changes to the container permission level.\n\n * View – Read-only access to the container\n * Edit – Can create and edit Workspaces, but can’t create Versions or publish them\n * Approve – Can create and edit both Versions and Workspaces, but not publish them\n * Publish – Full rights to create Versions, Workspaces, make edits, and publish them\n\n\nConclusion:\n\nThough the interface redesign in GTM will take some time to get used to, Google has solved an important request of the Google+ community by launching the \"Workspace\" capability.\n\nTo sum up: the new GTM workspace feature will make your life better either way."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/learn-measurelab-beta-launch/#article",
      "headline": "Learn With Measurelab beta launch!",
      "description": "\t\t\tMeasurelab already offers some of the <a href=\"https://www.measurelab.co.uk/training/\">best in-person training around</a>, with monthly courses on <a href=\"https://www.measurelab.co.uk/training/google-tag-manager-training/\">Google Tag Manager</a> and <a href=\"https://www.measurelab.co.uk/training/google-analytics-training/\">Google Analytics</a>&nbsp;in London and <a href=\"https://www.measurelab.co.uk/training/google-analytics-training/\">custom in-house training available on request</a>, but w",
      "url": "https://www.measurelab.co.uk/insights/blog/learn-measurelab-beta-launch/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/learn-measurelab-beta-launch/#webpage"
      },
      "datePublished": "2016-07-08T16:02:08.000+00:00",
      "dateModified": "2025-07-31T20:36:43.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/gtm-basics-course-3.png",
      "author": {
        "@type": "Person",
        "name": "Adam Englebright",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Google Tag Manager"
      ],
      "articleBody": "\t\t\tMeasurelab already offers some of the <a href=\"https://www.measurelab.co.uk/training/\">best in-person training around</a>, with monthly courses on <a href=\"https://www.measurelab.co.uk/training/google-tag-manager-training/\">Google Tag Manager</a> and <a href=\"https://www.measurelab.co.uk/training/google-analytics-training/\">Google Analytics</a>&nbsp;in London and <a href=\"https://www.measurelab.co.uk/training/google-analytics-training/\">custom in-house training available on request</a>, but we felt bad depriving folk prevented by geography from getting it irl, so we've created <a href=\"https://learn.measurelab.co.uk/\">Learn With Measurelab</a>, a site where we'll be putting up courses in Google Tag Manager and Google Analytics, and all that good stuff. It's in beta right now, so it's not all there, but you can get at our free GTM Basics course <a href=\"https://learn.measurelab.co.uk/course/gtm-basics/\">right here, right now</a>, with more to follow soon. Check it out, tell us what you think!\t\t\n"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/measurelab-year-self-betterment/#article",
      "headline": "The Measurelab Year of Self Betterment",
      "description": "\t\t\tAs Measurelab, we have been running bi-monthly Google Analytics and Google Tag Manager training sessions up in London for nearly 18 months now. We like to keep the groups small enough (under 10) to be personable and really help each attendee out with their questions and unique&nbsp;requirements. Due to the success of these training events, we are now running them every month (see all the dates for&nbsp;<a href=\"https://www.measurelab.co.uktraining/google-analytics-training/\">GA Training</a>&n",
      "url": "https://www.measurelab.co.uk/insights/blog/measurelab-year-self-betterment/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/measurelab-year-self-betterment/#webpage"
      },
      "datePublished": "2016-05-27T16:11:48.000+00:00",
      "dateModified": "2025-07-31T20:37:08.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/treated_15.jpg",
      "author": {
        "@type": "Person",
        "name": "Daniel Perry-Reed",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Google Tag Manager"
      ],
      "articleBody": "\t\t\tAs Measurelab, we have been running bi-monthly Google Analytics and Google Tag Manager training sessions up in London for nearly 18 months now. We like to keep the groups small enough (under 10) to be personable and really help each attendee out with their questions and unique&nbsp;requirements. Due to the success of these training events, we are now running them every month (see all the dates for&nbsp;<a href=\"https://www.measurelab.co.uktraining/google-analytics-training/\">GA Training</a>&nbsp;&amp; <a href=\"https://www.measurelab.co.uktraining/google-tag-manager-training/\">GTM Training</a>)!\n\n\nBut why do we need GA and/or GTM training, I have it all set up fine... I think?\n\nI hear you ask in the back of your head.\n\nWell, do you want this situation:\n\nOr this one:\n\nIt all comes down to data trust and quality. Not being confident on how the data is being collected, where the data comes from, or what it is used for will mean that you cannot leverage it to it's full potential. Even making the most basic of optimisations off the back of untrustworthy/unknown data could lead to wasted spend and bad marketing ROIs!\n\nMy setup is fine, I sorted this out years ago!\n\nI also hear you ask.\n\nWell this is actually way more common than you may think. Web analytics as a whole is a continually evolving process. From new and improved tracking methods and technology, to better and more advanced reporting and analysis requirements. For example, look at how much Google Analytics has changed even over the last few years:\n\nAnd looking at the adoption of these features:\n\n(See here for a great review on the last 10 years of GA.)\n\nWhere do you fit into this? Do you make the most of the Data Import feature, or have you not even upgraded to Universal Analytics yet?\n\nWhat a day's training could do for you is to introduce you to these features (new and existing), whether it is just food for thought or something that you can take away and use in your day to day working lives. We have courses for all types of users, from beginners courses to advanced courses. If there are 4 or more of you wanting to attend, it may even be more beneficial (financial and educational) to book us to come to your office for the day to run a custom tailored training session.\n\nIf you have any questions on any of the training courses we offer, or even just want to say hi then please get in touch! :)"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/data-visualisation-with-power-bi/#article",
      "headline": "Data Visualisation with Power BI",
      "description": "\t\t\tSince the recent(ish) announcement of <a href=\"https://www.google.co.uk/analytics/360-suite/data-studio/\" target=\"_blank\" rel=\"noopener noreferrer\">Google Data Studio 360</a>&nbsp;(Google's answer to&nbsp;Tableau), we wanted&nbsp;to&nbsp;see where Data Studio 360 will fit into the mix by trying to compare what little we currently know about it with&nbsp;other data visualisation tools that are already on the market.\n\n\nFast forward a few weeks, and to cut a long story short, Microsoft Power BI ",
      "url": "https://www.measurelab.co.uk/insights/blog/data-visualisation-with-power-bi/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/data-visualisation-with-power-bi/#webpage"
      },
      "datePublished": "2016-05-06T15:13:19.000+00:00",
      "dateModified": "2025-07-31T20:37:08.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/treated_2-3.jpg",
      "author": {
        "@type": "Person",
        "name": "Daniel Perry-Reed",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Looker Studio",
        "Data Analysis"
      ],
      "articleBody": "\t\t\tSince the recent(ish) announcement of <a href=\"https://www.google.co.uk/analytics/360-suite/data-studio/\" target=\"_blank\" rel=\"noopener noreferrer\">Google Data Studio 360</a>&nbsp;(Google's answer to&nbsp;Tableau), we wanted&nbsp;to&nbsp;see where Data Studio 360 will fit into the mix by trying to compare what little we currently know about it with&nbsp;other data visualisation tools that are already on the market.\n\n\nFast forward a few weeks, and to cut a long story short, Microsoft Power BI really impressed us!\n\nIt has an impressive number of API connections (Facebook, MailChimp, Stripe, Zendesk, R, etc.), integrates with Excel, can scrape data directly from a web page, connect to a wide range of databases (SQL, mySQL, Access, PostgreSQL, etc.) and most importantly can pull in all available Google Analytics data.\n\nThe basic setup of Power BI is to compose a Dataset from each of the different data sources, then to build a Report from these datasets. Each report is a fully dynamic and responsive visual 'dashboard' which can consist of multiple tabs/pages. These Reports contain a collection of visualisations from data tables to data filters/slicers to graphs. Any of these visualisations from any Report can then be pinned to a Dashboard. This is a great way to combine multiple Datasets together in one visual Dashboard, and each of the widgets link to the underlying Report which can be used to drill down into the data.\n\nNow, the really interesting functionality comes into play when a Dashboard is set up. Each dashboard can be shared with each member of the team/business, and they can view the visualisations even if that particular user doesn't have access to the underlying data. For example, if I created and shared a dashboard based on Datasets from multiple different GA Views, my team can then see the populated Dashboard and Reports even if they themselves do not have access to GA account.\n\nI have to say that the pricing was a big appeal - in so much that is is free to get up and running! With the free package, you can create and share Dashboards and Reports, and have a data capacity limit of 1GB per user. What I have found is that each Report you set up is ~ 1MB, so that means you can set up roughly 1,000 Reports which could power many many Dashboards! After a few weeks of usage, I opted in for the paid package at a whopping £6.20 per month... The only reason for this was so that we could create something they call 'Content Packs'. These are a way to bundle a number for Datasets, Reports, and Dashboards together to then be shared. For example, I can then create a Content Pack for a client and share this amongst their staff all in one click. It also makes it more manageable from an agency/consultancy perspective in terms of managing lots of Reports and Dashboards for different clients. It also means that the client don't need to sign up to the paid Power BI package!\n\nWe only need a single paid user licence to do this, so it works out very reasonable indeed!\n\nThere are many features that I haven't covered (or if I have, then not in much detail) that we will revisit in the future. However, the last snippet of nerdy-ness I want to mention is that it comes fully cross-device compatible out of the box! There is a desktop app, Windows 10 app, mobile app, and is web-based.\n\nJust to recap, comparing to the yet unreleased Google Data Studio 360, as it stands it is far more powerful. I don't know much about Data Studio 360 yet except for the pre-release tech demos, but it feels that Power BI has got the edge mainly because it has been out for a full year longer. Let's see what Google have to say...\n\n(Check out the Power BI blog for all news and feature announcements. Believe it or not, it's actually quite useful!)"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/core-reporting-api-v4/#article",
      "headline": "Core Reporting API v4",
      "description": "\t\t\t<p class=\"p1\">“<a href=\"https://developers.google.com/analytics/devguides/reporting/core/v4/changelog#header\">Core Reporting API update</a>” doesn’t sound like the most exciting thing in the world, but trust me: it is. Well, maybe not <i>the</i> most exciting thing, but certainly getting on that way. So what’s new?</p>\n\n\n * Metric Expressions Are you sick of having to do post-processing on metrics in a separate sheet before you pipe them to your presentation layer? Well, guess what – you can ",
      "url": "https://www.measurelab.co.uk/insights/blog/core-reporting-api-v4/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/core-reporting-api-v4/#webpage"
      },
      "datePublished": "2016-04-14T14:25:33.000+00:00",
      "dateModified": "2025-07-31T20:37:08.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/treated_17.jpg",
      "author": {
        "@type": "Person",
        "name": "Adam Englebright",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "How-to"
      ],
      "articleBody": "\t\t\t<p class=\"p1\">“<a href=\"https://developers.google.com/analytics/devguides/reporting/core/v4/changelog#header\">Core Reporting API update</a>” doesn’t sound like the most exciting thing in the world, but trust me: it is. Well, maybe not <i>the</i> most exciting thing, but certainly getting on that way. So what’s new?</p>\n\n\n * Metric Expressions Are you sick of having to do post-processing on metrics in a separate sheet before you pipe them to your presentation layer? Well, guess what – you can now combine metrics mathematically in your queries!\n * Multiple date ranges Are you sick of having to run multiple queries to compare date ranges? Well, guess what – there’s now support for requesting two date ranges in a single request!\n * Multiple segments Are you (sensing a theme here?) sick of having to run multiple queries to compare different segments? Well, guess what – you can now request multiple segments in a single request!\n * Cohorts and Lifetime Value Are you sick of… the API not having a rich vocabulary to request Cohort and Lifetime value reports? Well… guess what? (That. That is the thing they can now do.) That is to say: there are now a bunch of additional metrics and dimesions that allow you to access cohort and lifetime values – jolly useful if you use those reports – and some additional, more involved stuff specifically pertaining to those reports (see the full documentation for more).\n * Resource/Cost based quota system Are you sick of… the previous resource/cost based quota system? There's now a slightly different one – based solely around project queries (though as they say in wrestling, the card is subject to change).\n\nA lot of stuff in there that I think many people who make extensive use of the API (whether through the sheets addon or otherwise) will be happy about. Further details will hopefully follow as we start getting into the weeds of some of this stuff."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/google-analytics-360-suite/#article",
      "headline": "Google Analytics 360 Suite: what it is & why it matters",
      "description": "So it's finally happened, Google has brought their enterprise-level analytics offerings together in one neat package: the Google Analytics 360 Suite! What they have done is re-branded Google Analytics Premium as Google Analytics 360 and Adometry as Google Attribution 360, and released 4 all new tools.\n\n\nWhat’s included in the suite:\n\n\nGoogle Audience Center 360 (beta)\n\nA data management platform (DMP) that helps understand and identify customers across channels, devices, campaigns, etc.\n\n\nGoogle",
      "url": "https://www.measurelab.co.uk/insights/blog/google-analytics-360-suite/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/google-analytics-360-suite/#webpage"
      },
      "datePublished": "2016-03-15T14:00:53.000+00:00",
      "dateModified": "2025-12-22T14:00:08.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/ga-suite-screen-1.png",
      "author": {
        "@type": "Person",
        "name": "Daniel Perry-Reed",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Google Tag Manager",
        "Looker Studio",
        "Testing",
        "Marketing"
      ],
      "articleBody": "So it's finally happened, Google has brought their enterprise-level analytics offerings together in one neat package: the Google Analytics 360 Suite! What they have done is re-branded Google Analytics Premium as Google Analytics 360 and Adometry as Google Attribution 360, and released 4 all new tools.\n\n\nWhat’s included in the suite:\n\n\nGoogle Audience Center 360 (beta)\n\nA data management platform (DMP) that helps understand and identify customers across channels, devices, campaigns, etc.\n\n\nGoogle Optimize 360 (beta)\n\nA website testing and personalization tool that helps to deliver better user experiences. It can show variations of a site or page and figure out the best for each audience.\n\n\nGoogle Data Studio 360 (beta)\n\nA completely new analysis and visualization tool. It connects to all your data and produces interactive dashboards with built-in real-time collaboration (like Google Docs).\n\n\nGoogle Tag Manager 360\n\nA simpler way to add code to a site. A number for built-in APIs increase data accuracy and streamline workflows.\n\n\nLooking ahead\n\nThe new tools have been released in 'limited beta' today, so we can expect more from Google on these tools over the next few weeks.\n\n\nGoogle’s perspective\n\n\"This is just the beginning of our ongoing innovation in enterprise marketing analytics – we can’t wait to share more.\" - Google Analytics Blog"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/cafe-analytique-2/#article",
      "headline": "Cafe Analytique... 2",
      "description": "\t\t\t<img class=\"wp-image-3615 size-medium alignleft\" src=\"https://measurelab.ghost.io/content/images/2025/07/skandinaviska_konstnarernas_frukost_i_cafe_ledoyen_-_fernissningsdagen_1886-300x300.jpg\" alt=\"Skandinaviska_konstnärernas_frukost_i_Café_Ledoyen_-_Fernissningsdagen_1886\" width=\"300\" height=\"300\">\n\n\nAfter the rousing success of the first Cafe Analytique back in November, we thought we'd have another one on Wednesday the 16th of March from 6pm, and immediately make the name redundant by h",
      "url": "https://www.measurelab.co.uk/insights/blog/cafe-analytique-2/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/cafe-analytique-2/#webpage"
      },
      "datePublished": "2016-03-04T15:05:56.000+00:00",
      "dateModified": "2025-07-31T20:37:08.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/treated_11.jpg",
      "author": {
        "@type": "Person",
        "name": "Adam Englebright",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "articleBody": "\t\t\t<img class=\"wp-image-3615 size-medium alignleft\" src=\"https://measurelab.ghost.io/content/images/2025/07/skandinaviska_konstnarernas_frukost_i_cafe_ledoyen_-_fernissningsdagen_1886-300x300.jpg\" alt=\"Skandinaviska_konstnärernas_frukost_i_Café_Ledoyen_-_Fernissningsdagen_1886\" width=\"300\" height=\"300\">\n\n\nAfter the rousing success of the first Cafe Analytique back in November, we thought we'd have another one on Wednesday the 16th of March from 6pm, and immediately make the name redundant by having it in a pub – specifically the Hare and Hounds on London Road. A bit more informal this time – no talk at the beginning, just sitting down and chatting about #analytics. If that sounds like something you'd be interested in, let us know you're coming by signing up here."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/google-analytics-minus-google-analytics-my-measurefest-2015-talk/#article",
      "headline": "When GA isn’t enough: beyond Google Analytics & better analytics tools",
      "description": "My Measurefest talk\n\nAfter a few nerve-wracking weeks of preparation, I did my talk about Google Analytics, the API and R yesterday afternoon at Measurefest in Brighton. I must admit, the whole thing is a bit of a blur, but I've been assured by several people (not just my friends!) that it went well, so I'll take their word for it. I was even approached by people afterwards and asked questions! (and if you were one of those people: apologies, I didn't quite get back to normal for several hours, ",
      "url": "https://www.measurelab.co.uk/insights/blog/google-analytics-minus-google-analytics-my-measurefest-2015-talk/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/google-analytics-minus-google-analytics-my-measurefest-2015-talk/#webpage"
      },
      "datePublished": "2015-11-26T17:37:37.000+00:00",
      "dateModified": "2025-12-15T04:17:03.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/2015-11-25-17-16-52.jpg",
      "author": {
        "@type": "Person",
        "name": "Adam Englebright",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics"
      ],
      "articleBody": "My Measurefest talk\n\nAfter a few nerve-wracking weeks of preparation, I did my talk about Google Analytics, the API and R yesterday afternoon at Measurefest in Brighton. I must admit, the whole thing is a bit of a blur, but I've been assured by several people (not just my friends!) that it went well, so I'll take their word for it. I was even approached by people afterwards and asked questions! (and if you were one of those people: apologies, I didn't quite get back to normal for several hours, so my answers may have been somewhat rambling and confused (well, more so than normal)) Now that it's done, of course, I'm thinking about what I can do a talk about next!\n\n\nSharing my slides\n\nIf you weren't able to make it – or if you were, and you want to relive the excellent jokes and insightful analysis – the slides, along with an approximation of what I said/was meant to say, can be found here.\n\n\nThank you to the team and audience\n\nMany thanks to Kelvin for letting me speak, the rest of Team Measurelab for their encouragement and forbearance when I started to crack under the strain, and the audience, for laughing at my jokes."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/we-are-google-tag-manager-certified/#article",
      "headline": "We are Google Tag Manager Certified!",
      "description": "Measurelab is officially Google Tag Manager certified\n\nWe are proud to announce that, following a rigorous testing process, Google have approved Measurelab to be certified partners for Google Tag Manager – re-affirming our position as one of the UK’s top Google Analytics consultancies, specifically when it comes to using Google Tag Manager.\n\n\nWhy this certification matters\n\nAs well as demonstrable advanced technical skills with Google Tag Manager implementations, a pre-requisite of the certifica",
      "url": "https://www.measurelab.co.uk/insights/blog/we-are-google-tag-manager-certified/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/we-are-google-tag-manager-certified/#webpage"
      },
      "datePublished": "2015-11-10T13:14:01.000+00:00",
      "dateModified": "2025-12-15T05:13:53.000+00:00",
      "author": {
        "@type": "Person",
        "name": "Mark Rochefort",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Google Tag Manager"
      ],
      "articleBody": "Measurelab is officially Google Tag Manager certified\n\nWe are proud to announce that, following a rigorous testing process, Google have approved Measurelab to be certified partners for Google Tag Manager – re-affirming our position as one of the UK’s top Google Analytics consultancies, specifically when it comes to using Google Tag Manager.\n\n\nWhy this certification matters\n\nAs well as demonstrable advanced technical skills with Google Tag Manager implementations, a pre-requisite of the certification was that we are active members of the specialist Google Analytics Certified Partner Program. This certification confirms Google’s confidence in our expertise with Google Analytics and Google Tag Manager.\n\n\nEnsuring smooth integration with Google Analytics\n\nGoogle Tag Manager and Google Analytics play nicely together. But the transition to Google Tag Manager needs to be well considered to ensure consistency of your data collection and reporting.\n\n\nSupporting your team with training and mentoring\n\nWhilst we can help with the implementation of Google Analytics and Google Tag Manager for your organisation, we are always keen to facilitate your own learning and adoption of Google Tag Manager and Google Analytics - and provide mentoring and training for your team, alongside our ongoing consultative support.\n\n\nAccess to exclusive Google resources\n\nAs certified Google Tag Manager and Google Analytics partners, we have access to fantastic source of inside knowledge of these products - with direct access to the product teams at Google, as well as an excellent global community of other certified partners. By extension, your team will have access to this wealth of knowledge and expertise - as we work closely with your developers to ensure data is passed from your internal systems to Google Tag Manager in a structured and scalable manner.\n\n\nTime to take advantage of Google Tag Manager\n\nIf you've not yet experienced the advantage of using Google Tag Manager with Google Analytics, then now is the time to do so. The two products are stable and can scale well for any organisation's needs. Just get in touch :)\n\n\nMaximise your existing setup\n\nLikewise, if you are already using Google Tag Manager with Google Analytics but want to make the most of this happy union - speak to us today!"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/google-tag-manager-training-courses-measurelab-team-now-available/#article",
      "headline": "Google Tag Manager training course now available from Measurelab",
      "description": "Google Tag Manager training is now live\n\nRight, folks, it’s happening! Our new Google Tag Manager training workshops are now live and ready to be booked!\n\nThank you! Thank you!\n\nIt has taken a bit of thinking and planning but we’ve finally decided to go ahead with it and we’re pretty pleased with the end results.\n\n\nWhat the workshop covers\n\nWe’ll take you from the very basics - what’s a tag management system and how it works - to the more techy stuff such as how to deploy different vendors and c",
      "url": "https://www.measurelab.co.uk/insights/blog/google-tag-manager-training-courses-measurelab-team-now-available/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/google-tag-manager-training-courses-measurelab-team-now-available/#webpage"
      },
      "datePublished": "2015-10-02T11:52:57.000+00:00",
      "dateModified": "2025-12-22T14:21:15.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/12/gtm.png",
      "author": {
        "@type": "Person",
        "name": "Juan Barros",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Google Tag Manager",
        "Debugging"
      ],
      "articleBody": "Google Tag Manager training is now live\n\nRight, folks, it’s happening! Our new Google Tag Manager training workshops are now live and ready to be booked!\n\nThank you! Thank you!\n\nIt has taken a bit of thinking and planning but we’ve finally decided to go ahead with it and we’re pretty pleased with the end results.\n\n\nWhat the workshop covers\n\nWe’ll take you from the very basics - what’s a tag management system and how it works - to the more techy stuff such as how to deploy different vendors and custom HTML tags, while keeping things flexible to adapt to the group’s needs.\n\n\nHands-on practical exercises\n\nThe agenda for the workshop - which you can see here - comprises practical exercises too, so you walk away with a good understanding of how the whole process works and knowing how to create, deploy and debug containers and tags by yourself.\n\n\nSmall group sessions for better learning\n\nAs usual, our courses will be organised for small groups - no more than 10 people - as we like to encourage participation from delegates and allow time for questions and discussions.\n\n\nVenue and locations\n\nThey’ll be taking place on the same venue where our current Google Analytics courses are being held. Wallace Space in Covent Garden.\n\n\nRemote and in-house training options\n\nIf none of the dates that we’ve chosen suits you or your team, remember that we also have our remote training and mentoring programs and our custom and in-house training which we can organise at any time you want (well, almost..).\n\n\nJoin a training event soon\n\nThanks for reading and hope to see you soon at one of our training events!"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/fun-with-balance-balls/#article",
      "headline": "fun with balance balls",
      "description": "\t\t\t<iframe src=\"https://vine.co/v/enV3IZqxQ1a/embed/simple\" width=\"600\" height=\"600\" frameborder=\"0\"></iframe>\n\n\nBrightlocal, the company with whom we share an office, are very keen on balance balls. This has now spread to us, with Juan and Dara both abandoning their chairs for them (Mark and I both tried and decided against). Balance balls, though, are by nature quite bouncy. This leads to a lot of... the kind of thing in the vine above.",
      "url": "https://www.measurelab.co.uk/insights/blog/fun-with-balance-balls/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/fun-with-balance-balls/#webpage"
      },
      "datePublished": "2015-07-09T16:07:03.000+00:00",
      "dateModified": "2025-07-31T20:37:41.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/beard.jpg",
      "author": {
        "@type": "Person",
        "name": "Adam Englebright",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "articleBody": "\t\t\t<iframe src=\"https://vine.co/v/enV3IZqxQ1a/embed/simple\" width=\"600\" height=\"600\" frameborder=\"0\"></iframe>\n\n\nBrightlocal, the company with whom we share an office, are very keen on balance balls. This has now spread to us, with Juan and Dara both abandoning their chairs for them (Mark and I both tried and decided against). Balance balls, though, are by nature quite bouncy. This leads to a lot of... the kind of thing in the vine above."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/extract/#article",
      "headline": "Extract conference highlights: key takeaways & insights",
      "description": "\n\n\n\n\n\n\nHeading to extract conference\n\nIt was a bit miserable last Friday morning; the kind of day when you don’t want to get out of bed. Not only did I get up, I got up early, as bringing me from Brighton, downcast under slate-grey skies, to London, land of steel and glass, and in particular the dull purple glow of the trendy The Brewery’s rave-lit interior, was Extract, a conference by web data company import.io, billed as “data stories worth sharing”.\n\n\nFirst impressions of The Brewery\n\nThe Br",
      "url": "https://www.measurelab.co.uk/insights/blog/extract/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/extract/#webpage"
      },
      "datePublished": "2015-06-03T14:23:06.000+00:00",
      "dateModified": "2025-12-22T13:46:09.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/2015-05-29-10-33-29-scaled.jpg",
      "author": {
        "@type": "Person",
        "name": "Adam Englebright",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "articleBody": "\n\n\n\n\n\n\nHeading to extract conference\n\nIt was a bit miserable last Friday morning; the kind of day when you don’t want to get out of bed. Not only did I get up, I got up early, as bringing me from Brighton, downcast under slate-grey skies, to London, land of steel and glass, and in particular the dull purple glow of the trendy The Brewery’s rave-lit interior, was Extract, a conference by web data company import.io, billed as “data stories worth sharing”.\n\n\nFirst impressions of The Brewery\n\nThe Brewery was a classier venue than I’m used to for this sort of thing, with break-time snacks that were so fancy they went straight to being interesting without being particularly concerned about being nice (witness the passionfruit, raspberry and basil marshmallow lollipops). Their toilet signs (below) also made me feel like I'd fallen into hipster hell. The lunch (I had the beef) was delicious, though, and everything was agreeably well-presented.\n\n\nKeynote by David Spiegelhalter\n\nAfter some milling-around and croissant-eating, we all moved into the main hall and David White, import.io founder and CEO did the introduction (but I must confess I was too distracted by his resemblance to Gavin Belson, the evil Hooli CEO from HBO’s Silicon Valley to listen to much of what he was saying (for real, look at this)). This lead into the keynote talk was from the (very enthusiastic) Cambridge academic and celebrity statistician David Spiegelhalter, and was, in the nicest way possible, a pitch for his book. That said, it was a very good pitch, and I do now want to go and read his book. He made laudable attempts to make it relevant to the audience, and was fun, interesting, engaging. Apologies to my statistics lecturers: I wish he’d been my statistics lecturer.\n\n\nTalks that stood out\n\nThe rest of the talks were, regrettably, a bit of a mixed bag – some suffered from technical issues, some a paucity of interesting content and some an overabundance of it (one in particular went on over twice as long as scheduled).\n\n\nSpotify, Microsoft, and Lyst highlights\n\nThere were, however, a few highlights which stood out for me. Samantha Mandel-Dallal from Spotify showed some really fascinating data about when people listen to their music, from what source – playlist, artist page, etc. Microsoft evangelist Andrew Fryer had to rush his talk a little but delivered what I found an interesting consideration of the ethical treatment of data, something that doesn’t get talked about often enough. Eddie Bell of Lyst, who had lots of good chat about colour recognition and colour spaces and the challenges of auto-listing clothes when the colours had incredibly abstruse names and auto-recognition was very difficult.\n\n\nReflections on the day\n\nThese were the best talks of the day, the stories that really made me think about how we could (and should) be using our data, and likewise how we should be advising out clients, but in the end they were just too few and far between. The rest of the time, I applaud the team for playing the hand they were dealt as best they could, struggling valiantly with technical issues and illness, as these marred an otherwise promising set of speakers' presentations. Sadly, parts of the day were somewhat of a slog, but I'm sure this will be remedied in future, and I look forward to the next event all the same.\n"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/dara-fitzgerald-international-super-star/#article",
      "headline": "Dara Fitzgerald: international analytics conference speaker",
      "description": "Dara at ADWorld experience\n\nLast week Dara was speaking at ADWorld Experience, in Bologna, about Enhanced Ecommerce in Google Analytics. On his return, Dara rather sheepishly let slip that he was awarded \"Most Voted Speech\" for the event. Well done, Dara!\n\n@measurelab @darafitzgerald demonstrating the wonders of enhanced ecommerce analytics #adwexp pic.twitter.com/NmwydFPqmV\n\n\n— Alan Coleman (@AlanCWolfgang) April 17, 2015\n\nIf you would like to book the internationally acclaimed Dara Fitzgerald ",
      "url": "https://www.measurelab.co.uk/insights/blog/dara-fitzgerald-international-super-star/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/dara-fitzgerald-international-super-star/#webpage"
      },
      "datePublished": "2015-04-24T21:42:37.000+00:00",
      "dateModified": "2026-01-27T11:25:09.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/12/adworld-experience.jpg",
      "author": {
        "@type": "Person",
        "name": "Steven Elliott",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Ecommerce"
      ],
      "articleBody": "Dara at ADWorld experience\n\nLast week Dara was speaking at ADWorld Experience, in Bologna, about Enhanced Ecommerce in Google Analytics. On his return, Dara rather sheepishly let slip that he was awarded \"Most Voted Speech\" for the event. Well done, Dara!\n\n@measurelab @darafitzgerald demonstrating the wonders of enhanced ecommerce analytics #adwexp pic.twitter.com/NmwydFPqmV\n\n\n— Alan Coleman (@AlanCWolfgang) April 17, 2015\n\nIf you would like to book the internationally acclaimed Dara Fitzgerald for your event, wedding or birthday party - contact us today!"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/r-analytics-beginners-guide-part-4/#article",
      "headline": "R for analytics beginners: part 4 – building graphs and analysing data",
      "description": "Earlier in this series we reviewed several R libraries for Google Analytics. Then we started using RGA. Next we pulled data from Google Analytics using RGA. What now? I’m reaching for my university notes, because we’re getting into proper R territory.\n\n\nDiving into graphs with R\n\nLet’s start with graphs! Who doesn’t love a good graph? It just so happens there’s a lovely R library called ggplot2 that does really excellent graphs of all shapes and sizes1. We’re probably best looking at a few speci",
      "url": "https://www.measurelab.co.uk/insights/blog/r-analytics-beginners-guide-part-4/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/r-analytics-beginners-guide-part-4/#webpage"
      },
      "datePublished": "2015-02-19T12:09:43.000+00:00",
      "dateModified": "2025-12-23T10:19:19.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/rfabg4.png",
      "author": {
        "@type": "Person",
        "name": "Adam Englebright",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "How-to",
        "Google Analytics",
        "Data Analysis"
      ],
      "articleBody": "Earlier in this series we reviewed several R libraries for Google Analytics. Then we started using RGA. Next we pulled data from Google Analytics using RGA. What now? I’m reaching for my university notes, because we’re getting into proper R territory.\n\n\nDiving into graphs with R\n\nLet’s start with graphs! Who doesn’t love a good graph? It just so happens there’s a lovely R library called ggplot2 that does really excellent graphs of all shapes and sizes1. We’re probably best looking at a few specific graphs, so I’ll go for bar graphs, pie charts and line graphs (and scatterplots too, but not with ggplot2)\n\ninstall.packages(\"ggplot2\")\n\nThere are a few things you need to watch out for, as the library is designed for analysing big data sets, and some things that you might think should be simple can be a bit more complicated than you might imagine. For instance, some methods assume by default that the data needs binning and gets rather confused. I’ll try to point out where I’ve managed to dodge things like that, but StackOverflow and the like are full of clever folk with solutions to problems like yours, so if you encounter something unexpected, you should be able to find a solution.\n\n\nCreating bar charts\n\nYou make a bar chart like this\nggplot(ga_data,aes(x=date,y=sessions)) + geom_bar(stat=\"identity\")\nwhere “ga_data” is the data set you’re using for the graph, x and y are (obviously) x and y and stat=“identity” means it’s using the values as-given rather than trying to bin stuff. It gives us an output like this:\n\n\nPie charts in R\n\nNext, pie charts – they’re a little funny, because they’re constructed as bar charts, but mapped in polar co-ordinates (further reading on that here, but if you don’t know/care, just go with it)\npie <- ggplot(device_cat_jan, aes(x = \"\", y = sessions, fill = deviceCategory)) + geom_bar(width = 1, stat = \"identity\")\npie + coord_polar(theta = \"y\")\nSo you want “y” to be whatever the metric is (sessions, transactions, whatever) and “fill” to be whatever the dimension is (here it’s device category).\n\n\nLine graphs made simple\n\nLine graphs are pretty easy, similar to bar charts:\nline_plot <- ggplot(transactions_2015, aes(x=date, y=transactions))\nline_plot + geom_line()\n\n\n\nTesting correlation between variables\n\nSo, graphs are pretty straightforward. We can also test the correlation of two continuous sets of data, using Pearson’s product-moment correlation coefficient, which is like Bigby’s Icy Grasp but for correlation rather than for creating magical floating hands of ice. Also, an at-will, not a daily power. Um. Where was I? Oh yeah. The input will be something like this:\nwith(sess_ad, cor.test(sessions, adCost))\n(we’re doing the correlation between sessions and ad cost) and the output will look something like:\nPearson's product-moment correlation\ndata: sessions and adCost\nt = 21.4583, df = 333, p-value < 2.2e-16\nalternative hypothesis: true correlation is not equal to 0\n95 percent confidence interval:\n0.7128185 0.8033630\nsample estimates:\ncor\n0.7617863\n\n\nRelevant value here is that last one, which ranges from -1 (totally negatively linearly related) to +1 (totally positively linearly related). 0 would be no correlation at all – so you can see that, with a value of ~.76, ad cost and sessions are pretty strongly correlated.\n\n\nExploring linear regression\n\nYou might also want to try some linear regression. Haven’t heard of linear regression? It’s not actually all that complicated, it’s just modelling the relationship between two (or more) variables. The formula is “lm(y ~ x)” where y is the dependent variable, and x is the independent variable, or in English, y is the variable whose change is predicted by x.\n\n\nFitting the model\n\n\nfit <- lm(sessions ~ adCost, data=sess_ad)\nsummary(fit)\n\n\n\nInterpreting the results\n\nSo, say we wanted to look at the relationship between sessions and ad spend again, to see how well one predicts the other, and if we can model that. Here, “sessions” would be the dependent variable, and ad cost the independent variable – because we want to see how sessions vary with ad cost.\nCall:\nlm(formula = sessions ~ adCost, data = sess_ad)\nResiduals:\nMin 1Q Median 3Q Max\n-4516.7 -1029.6 -326.1 908.6 10545.4\nCoefficients:\nEstimate Std. Error t value Pr(>|t|)\n(Intercept) 4.018e+03 2.713e+02 14.81 <2e-16 ***\nadCost 3.910e-01 1.822e-02 21.46 <2e-16 ***\n\nSignif. codes: 0 ‘’ 0.001 ‘’ 0.01 ‘’ 0.05 ‘.’ 0.1 ‘ ’ 1\nResidual standard error: 1656 on 333 degrees of freedom\nMultiple R-squared: 0.5803, Adjusted R-squared: 0.5791\nF-statistic: 460.5 on 1 and 333 DF, p-value: < 2.2e-16\nRelevant value here is the multiple R-squared value, which tells you how well x predicts y, with values from 0 (not at all) to 1.0 (perfectly). A value of ~.58 would suggest that it’s a decent, but not great predictor. We can graph this on a scatterplot too:\nplot(sessions,adCost)\n> abline(lm(sessions~adCost))\n\n\n\nPlotting and checking model fit\n\nOther things you can use to determine how good the model is plotting\n> plot(fit)\n\n\nWhat you're looking for here is the top-left (residuals vs fits) plot to have the points be randomly distributed, and the bottom-left (Q-Q plot) to be 'normal' (follow the diagonal as closely as possible). Our example here isn't bad, but it still looks like the model has some issues.\n\n\nThe session equation and next steps\n\nThe equation itself can be found by entering\ncoefficients(fit)\nwhich gives\n(Intercept) adCost\n4017.9343547 0.3910074\nand the equation therefore takes the form\nsessions = 4017.93 + adCost*0.39\nWhich probably isn’t that reliable a model, but it’s a start. If you wanted to increase the accuracy, you could start modifying the values with logs, polynomials, etc – or possibly even go into other types of regression – nonlinear or multivariate, but that’s slightly above the pay grade of this article. If you’re looking for further reading, there’s a wealth of information on this stuff online – start with something like this and investigate from there (yes, I am telling you to google it, I’ve exhausted myself writing and editing this).\n\n\nWrapping up the series\n\nThis is the final post in the series – there will be a recap/master reference post at some point, and possibly also some follow-up, but for now, thank you very much for reading, and good luck using R!\n\n1. it is possible to do graphs without ggplot2 – even, in some cases, more easily – but ggplot2 is, in my opinion, more versatile when you try to do more complicated stuff. Also, it’s what I was taught, and I’m the one writing the tutorial.↩"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/r-analytics-beginners-guide-part-3/#article",
      "headline": "R For Analytics: A Beginner’s Guide, Part 3",
      "description": "\t\t\t<strong>IMPORTANT: THE PACKAGE HAS BEEN UPDATED BUT ADAM HASN'T HAD TIME TO UPDATE THIS YET! PROCEED AT YOUR PERIL!</strong>\n\n\nLast time, we had a look at how we could use RGA to pull in account details and suchlike. It’s not essential, but I’d suggest you go back and read through it, as it might make some of what we do next a little easier – and, of course, if you haven’t done so already, read the first piece too and follow the instructions enumerated therein to allow you to do, well, any of",
      "url": "https://www.measurelab.co.uk/insights/blog/r-analytics-beginners-guide-part-3/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/r-analytics-beginners-guide-part-3/#webpage"
      },
      "datePublished": "2015-02-04T12:03:33.000+00:00",
      "dateModified": "2025-07-31T20:38:20.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/rfabg3.png",
      "author": {
        "@type": "Person",
        "name": "Adam Englebright",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "How-to",
        "BigQuery",
        "AI & ML"
      ],
      "articleBody": "\t\t\t<strong>IMPORTANT: THE PACKAGE HAS BEEN UPDATED BUT ADAM HASN'T HAD TIME TO UPDATE THIS YET! PROCEED AT YOUR PERIL!</strong>\n\n\nLast time, we had a look at how we could use RGA to pull in account details and suchlike. It’s not essential, but I’d suggest you go back and read through it, as it might make some of what we do next a little easier – and, of course, if you haven’t done so already, read the first piece too and follow the instructions enumerated therein to allow you to do, well, any of this.\n\n\nData frames\n\nSomething about R that I should introduce you to is the idea of data frames. In maths terms, they’re lists of equal-length vectors, which is to say, basically, tables. If you run commands like the ones we looked out last week, the output will be printed to the console, but if you prepend it with something like account_list <- [get_ accounts command]you’ll get a data frame of all your accounts, which should be visible under the ‘data’ bit of the ‘environment’ window on the top-right of RStudio. If you click on it, you’ll be able to view it in the source viewer that occupies the upper-left quadrant of the screen.\n\nFurther, you can now output this stuff as, e.g. a .csv, which you’d do like so:\nwrite.csv(account_list, file = “exported_account_list.csv”)\nThis may not be particularly useful for account lists, but it will be very useful if you want to get your data out of R. This exports the data to the working directory, by the way, which, unless you’ve specified otherwise will be the user root (on Mac, at least). This will come in especially useful as we look at the real issue here: how to get data out of GA.\n\n\nget_ga\n\nNow for the main course – actually getting data out of GA. This is actually in some pretty similar to using the spreadsheet plugin or query explorer, in that you have to outline several parameters and can then kick back and let the library do its work.\n\nYou’ll be building a query that looks something like this:\nga_data <- get_ga(profile.id = XXXXXXXXX, start.date = “dd/mm/yyyy”, end.date = “dd/mm/yyyy”, metrics = \"ga:users,ga:sessions,ga:pageviews\", dimensions = NULL, sort = NULL, filters = NULL, segment = NULL, start.index = NULL, max.results = NULL, token, verbose = getOption(\"rga.verbose\", FALSE))\nSome of those things you’ll want to fiddle with, some of them you won’t. You can leave null or just completely remove any of the things you’re not using (sort, filters, segment, start index etc) – they’re just included so you can see the kind of stuff you can do.\n\nOne thing that might be useful is paginating results, which allows you to run a bunch of queries for consecutive days and then stitch that back together, the code for which is:\ndates <- seq(as.Date(\"2012-01-01\"), as.Date(\"2012-02-01\"), by = \"days\")\nga_data <- aggregate(. ~ keyword, FUN = sum, data = do.call(rbind, lapply(dates,function(d) {get_ga(profile.id = XXXXXXXX, start.date = d, end.date = d,metrics = \"ga:sessions\", dimensions = \"ga:keyword”,filter = \"ga:medium==organic;ga:keyword!=(not provided);ga:keyword!=(not set)”)})))\n(obviously, substituting out whatever dates you want in the first line). This is great for pulling unsampled data, but if you’re not careful it can be a recipe for eating through a bunch of API queries really quickly (see below). It’s also worth noting that you do, in fact, have to provide a dimension in order to paginate the data like this – where it says “aggregate(. ~ keyword”, the keyword is the name of the dimension (sans ga: prefix).\n\nAn example of a query, in this case using pagination, might look something like:\nga_data <- aggregate(. ~ date, FUN = sum, data = do.call(rbind, lapply(dates,function(d) {get_ga(profile.id = 12345678, start.date = d, end.date = d,metrics = \"ga:sessions\",dimensions = \"ga:date\")})))\n\nand bring back results like:\n\nIt is also possibly, using the get_mcf and get_rt commands to get multi-channel funnel and realtime data. I’ve never found this necessary, but I’m mentioning it anyway for the sake of completeness. The commands can be found in the plugin itself (click on the name of the plugin in the plugin bit in the bottom-left).\n\n\nWhat you can do is different to what you should do.\n\nA further word of caution is necessary – one of the great benefits of R is its ability to pull large amounts of data, but you must also be vigilant. There are limits. It must also be remembered that R is not a panacea for data retrieval. Where it excels is its ability to pull large amounts of unfiltered data in a form that’s easy to manipulate or export as you wish, or taking many of those and stitching them all together. R is built for handling lots of data, it’s very robust. What it’s not so good at is pulling lots of things where there are many odd conditions applied, especially across a wide date range. Trying to do a big query like this with a multi-condition segment for a client recently, I realised one query by itself had chewed up 1000 queries of the 50,000 daily Analytics API query limit – but, more importantly, 1000 queries of the much more restrictive 10,000 daily view query limit. This is something to watch for. Don’t be overcautious or anything, just make sure you don’t use up your daily allowance if you think you’re going to need to pull data in the afternoon. Google documentation about the API limits is here.\n\n\nWhat can you do with the data once you’ve got it?\n\nYou can export it into a .csv and do stuff with it in Excel or Google Sheets, but you might want to consider what you can do with all that data already in an incredibly powerful and versatile stats package. Next time on R For Analytics: A Beginner’s Guide, we consider what you can do with all that data already in an incredibly powerful and versatile stats package."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/r-analytics-beginners-guide-part-2/#article",
      "headline": "R for analytics beginners: part 2 – authorizing GA access",
      "description": "In Part 1 of this series, I discussed R briefly and explained why it might be useful for people doing analytics work. I also introduced the libraries that allow you to interface R with Google Analytics. At this point, you should have R and RStudio installed on your computer, along with the RGA package. If you have not done this yet, please return to Part 1 and complete these steps first.\n\nNext, we need to authorise the package to access our GA data. You have to go to the Google Developers Consol",
      "url": "https://www.measurelab.co.uk/insights/blog/r-analytics-beginners-guide-part-2/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/r-analytics-beginners-guide-part-2/#webpage"
      },
      "datePublished": "2015-01-29T11:30:57.000+00:00",
      "dateModified": "2025-12-23T10:11:13.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/12/cover-image-2.png",
      "author": {
        "@type": "Person",
        "name": "Adam Englebright",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "How-to",
        "Google Analytics"
      ],
      "articleBody": "In Part 1 of this series, I discussed R briefly and explained why it might be useful for people doing analytics work. I also introduced the libraries that allow you to interface R with Google Analytics. At this point, you should have R and RStudio installed on your computer, along with the RGA package. If you have not done this yet, please return to Part 1 and complete these steps first.\n\nNext, we need to authorise the package to access our GA data. You have to go to the Google Developers Console and set up a new project – it doesn’t really matter what it’s called – then select the ‘APIs’ option from the “APIs & auth” menu on the left-hand-site, enable the Analytics API (click on it, turn it “on”), then go to “Credentials” (below “APIs” on the left-hand menu) and click “Create new Client ID”, and select “Installed application”, and click “Create ID”. This is a bit of a bother, and the Developer Console interface can be a bit sluggish and weird, but it’s preferable to all the messing around with temporary tokens that expire after an hour and that kind of nonsense that you have to do with some of the other libraries.\n\nNow you’ve got the client ID and client “secret”, you can authorise… sorry, authorize* the application, so open RStudio, click on the \"packages\" tab in the bottom-right window if it's not already selected and tick the box next to \"RGA\". Then, give it access to your GA account by entering the following code into the R console:\n\nauthorize(client.id = \"your client id\", client.secret = \"your client secret\")\n\n(quotes included). This will open an OAuth page in your browse asking if you want to allow the app to access your Google Analytics data (you do (obviously)).\n\nNow you have access to the API with R, you can begin to pull in data.\n\nget_accounts: This is a pretty basic command – it lists all the accounts to which you have access.\n\nget_accounts(start.index = NULL, max.results = NULL, verbose = getOption (\"rga.verbose\",FALSE))\n\nYou can also get profiles (views), segments and goals, using similar commands:\n\nget_profiles(account.id = \"~all\", webproperty.id = \"~all\", start.index = NULL, max.results = NULL, verbose = getOption(\"rga.verbose\", FALSE)) get_segments(start.index = NULL, max.results = NULL, token, verbose = getOption(\"rga.verbose\", FALSE)) get_goals(account.id = \"~all\", webproperty.id = \"~all\", profile.id = \"~all\", start.index = NULL, max.results = NULL, verbose = getOption(\"rga.verbose\", FALSE))\n\nFor these, the things you can tweak are pretty similar – account.id, webproperty.id and profile.id for some of them – which just mean that you can get only the results for the accounts, properties and views (profiles) that you’re interested in. Only want the views for, e.g. the Universal Analytics property for an account? Enter the account.id and web property.id in the quotes in place of “all”. Pretty simple.\n\nThis isn’t, it should be emphasised, a comprehensive guide, and there are quite a few other things you can do in this vein – pulling lists of filters on views, for instance – but for that I would suggest you more fully investigate the library itself. As for the meat of the RGA library’s utility – getting analytics data, we’ll be looking at that next time.\n\n * Note to the reader: It’s probably easier to copy and paste a lot of this code, filling in your specific values where necessary. When I was initially experimenting with this stuff, I had the irritating experience of inexplicable non-functionality – and after [far more time than I’m comfortable to admitting to] I realised that my error had been introduced due to my attempting to type out the code (a useful discipline I picked up doing Zed A Shaw’s excellent Python The Hard Way course) but I had neglected the fact that, like all good British things – football, Doctor Who, etc – the spelling of the word ‘authorise’ has been ruined by Americans, – a ‘z’ not an ’s’."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/r-analytics-beginners-guide-part-1/#article",
      "headline": "R for analytics beginners: part 1 – getting started",
      "description": "Two years ago, or thereabouts: I was introduced in my statistics lectures to a programming language and software environment called R. I took to it immediately, preferring it by far to the simpler software we’d used before, and also to the proprietary software (SAS, SPSS) we used in addition.\n\nFlash forward to:\n\nA couple of months ago, sitting in the audience for the talks at MeasureFest, and then we had what was, I think, by broad agreement, the best talk by Ela Osterberger, about using R with ",
      "url": "https://www.measurelab.co.uk/insights/blog/r-analytics-beginners-guide-part-1/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/r-analytics-beginners-guide-part-1/#webpage"
      },
      "datePublished": "2015-01-22T09:34:04.000+00:00",
      "dateModified": "2025-12-11T03:53:31.000+00:00",
      "author": {
        "@type": "Person",
        "name": "Adam Englebright",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "How-to",
        "Google Analytics",
        "Data Analysis"
      ],
      "articleBody": "Two years ago, or thereabouts: I was introduced in my statistics lectures to a programming language and software environment called R. I took to it immediately, preferring it by far to the simpler software we’d used before, and also to the proprietary software (SAS, SPSS) we used in addition.\n\nFlash forward to:\n\nA couple of months ago, sitting in the audience for the talks at MeasureFest, and then we had what was, I think, by broad agreement, the best talk by Ela Osterberger, about using R with the Google Analytics API. It was nice to see someone talking about this, as I’d spent a fair bit of time in the months leading up to it doing exactly this. The talk was excellent, and the slide design was sumptuous, but to the best of my knowledge, none of it was put up online.\n\nFlash forward to:\n\nMe, right now, writing this (I’m actually writing this on Friday but we’ll probably be publishing next week for better numbers). A little while ago, I was asked for some unsampled data from GA. This can be quite annoying, especially when you bump up against the API limits, and running a million enquiries with the spreadsheets extension or query explorer is just a lengthy, tedious slog. However, there is an easier way!\n\nOnce you get the hang of R, you can use it for both simple and complex tasks. That said, it’s also free software, and suffers somewhat from the newcomer-hostility that free software is prone to. I learnt R through a command-line interface, but I already had a little bit of programming experience to smooth the way – some of the other people learning alongside me found it heavier going. However, it can, through judicious use of additional tools, be made much friendlier.\n\nFirst, you need to download and install the package itself from any of the innumerable mirrors, and then I’d suggest, to ameliorate some of that user-unfriendliness, that you download RStudio, an IDE (integrated development environment) that provides a graphical user interface. In fact, even if you don’t care\n\n\n\n*\n\n\n\n, it’s probably a good thing to have, as it makes a fair few things easier to do.\n\nOnce you’ve installed those two, you need to pick your R Google Analytics package. It may surprise you (it surprised me) to learn there are several of these. They are:\n\n1): RGoogleAnalytics\n\nThe package that was most easily discoverable when I was researching this a while back was R Google Analytics, developed by Google employees so arguably the most “official”. Regrettably, I found it at a point when it was rather better-documented than it was now, with the user guide for some reason having been removed from the (there’s still a step-by-step on Daniel Waisberg’s site) but I’ve never been able to get this particular extension working as it should, especially with regards to paginating results so as to bypass the API query limits.\n\n2). rga (lower-case)\n\nrga is much better-documented, and seemed as though it would do everything I wanted it to. Regrettably, I couldn’t get it going (though I know several people who were able to, and swear by it, so your mileage may vary).\n\n3). RGA (upper-case)\n\nTook me a little while to notice this one, because as you can imagine, given that the name is exactly the same but for case, it’s not the easiest thing to search for. This is the one that I’ve settled on for the moment, because it seems to be the one that (for me, anyway) allows easiest access to the data, with the least amount of fuss. It also allows you to query the metadata, management, real-time reporting and multi-channel funnels APIs too, so it has a great deal of versatility and additional functionality.\n\nOnce you’ve downloaded R and R Studio, you need to install RGA, which you do by entering into the RStudio console:\n\ninstall.packages(\"RGA\")\n\nNext time, we’ll be looking at how to actually use the extension.\n\n*though if that’s the case and you’re willing to tackle the command-line interface, this is probably a bit basic for you"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/google-analytics-training-2015/#article",
      "headline": "Google Analytics training 2015 – master your analytics skills",
      "description": "Join our Google Analytics training\n\nIf you have ever attended one of Dara's talks or workshops, you know the allure of his beard and Irish accent. Now you can spend a full day learning from Dara (aka “Data”, yes, that name’s courtesy of predictive text). Register now for one of our Google Analytics Training days in Covent Garden, London.\n\n\nGoogle Analytics training course dates - 2015 (until June)\n\n\n\n\n\n\nDescription\nDate\nTime\nLocation\nPrice\nBook online\n\n\nStandard Google Analytics Training Course\n",
      "url": "https://www.measurelab.co.uk/insights/blog/google-analytics-training-2015/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/google-analytics-training-2015/#webpage"
      },
      "datePublished": "2015-01-06T17:55:41.000+00:00",
      "dateModified": "2025-12-15T04:18:15.000+00:00",
      "author": {
        "@type": "Person",
        "name": "Mark Rochefort",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics"
      ],
      "articleBody": "Join our Google Analytics training\n\nIf you have ever attended one of Dara's talks or workshops, you know the allure of his beard and Irish accent. Now you can spend a full day learning from Dara (aka “Data”, yes, that name’s courtesy of predictive text). Register now for one of our Google Analytics Training days in Covent Garden, London.\n\n\nGoogle Analytics training course dates - 2015 (until June)\n\n\n\n\n\n\nDescription\nDate\nTime\nLocation\nPrice\nBook online\n\n\nStandard Google Analytics Training Course\nThursday 19th February 2015\n10am to 4pm\nCovent Garden, London\n         £400 (+VAT) pp\n» Register now\n\n\nAdvanced GA Techniques\nFriday 20th February 2015\n10am to 4pm\nCovent Garden, London\n         £400 (+VAT) pp\n» Register now\n\n\nStandard Google Analytics Training Course\nThursday 23rd April 2015\n10am to 4pm\nCovent Garden, London\n£400 £300 (+VAT) pp\n» Register now\n\n\nAdvanced GA Techniques\nFriday 24th April 2015\n10am to 4pm\nCovent Garden, London\n£400 £300 (+VAT) pp\n» Register now\n\n\nStandard Google Analytics Training Course\nThursday 18th June 2015\n10am to 4pm\nCovent Garden, London\n£400 £300 (+VAT) pp\n» Register now\n\n\nAdvanced GA Techniques\nFriday 19th June 2015\n10am to 4pm\nCovent Garden, London\n£400 £300 (+VAT) pp\n» Register now\n\n\n\n\n\n\nFind out more about the Google Analytics training course - such as the venue and what to expect from the day."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/gaiq-prepared-passed/#article",
      "headline": "GAIQ: How I prepared...and passed it!",
      "description": "\t\t\tIt’s been exactly a month since I started to work at Measurelab, and so far it has been an amazing experience. Much of the industry jargon and tools are starting to sound familiar and I can make tea or coffee for almost anyone in the team without having to ask how they take it.\n\n\nIn order to celebrate the fact that I had survived for a whole month, Mark suggested me to have a go at the Google Analytics Individual Qualification, (which I did..and passed!)\n\nFor those of you that are not familia",
      "url": "https://www.measurelab.co.uk/insights/blog/gaiq-prepared-passed/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/gaiq-prepared-passed/#webpage"
      },
      "datePublished": "2014-12-02T17:07:22.000+00:00",
      "dateModified": "2025-07-31T20:39:04.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/google-analytics.jpg",
      "author": {
        "@type": "Person",
        "name": "Juan Barros",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Google Tag Manager",
        "Conversion Tracking",
        "Ecommerce"
      ],
      "articleBody": "\t\t\tIt’s been exactly a month since I started to work at Measurelab, and so far it has been an amazing experience. Much of the industry jargon and tools are starting to sound familiar and I can make tea or coffee for almost anyone in the team without having to ask how they take it.\n\n\nIn order to celebrate the fact that I had survived for a whole month, Mark suggested me to have a go at the Google Analytics Individual Qualification, (which I did..and passed!)\n\nFor those of you that are not familiar with it, the GAIQ is the test that Google has made available to demonstrate proficiency in the use of Google Analytics. It used to cost $50 to take it but this has now changed and anyone can take it and get a certification of completion by visiting the Google Partners page.\n\nAnd so last week I started to prepare for it and agreed for Tuesday 2nd of December to be the D-day.\n\nBefore I crack on explaining how I prepared myself for the exam, I’ll point out a few of basics and also some of the updates that the test has had recently:\n\nRemains the same:\n\n * 70 Questions\n * 90 mins to complete the entire test\n * Need to get 80% to pass (56 questions)\n\nRecent changes:\n\n * You are no longer allowed to pause the exam (hit panic attack button now)\n * You can’t mark or review questions\n * I didn’t came across any multiple choice questions although found a few with “all/none/some of these answers are correct”\n\nAlso, although there were a couple of questions regarding Google Tag Manager, none of the ones that I had to answer covered the new Mobile App Fundamentals Course (but I’d would recommend you go through it if you are thinking about taking it!).\n\nSo if you are thinking about taking the test any time soon, here are my recommendations:\n\n1- The basics: The courses already available in the Google Academy are the bulk of what you need to get down to pass the exam, I personally think that by being really comfortable with these you already stand a good chance of passing the test. The ones I did (watched the videos, read the text version and completed the activities) are:\n\n * Google Analytics Fundamentals\n * Google Analytics Platform Principles\n * Ecommerce Analytics: From Data to Decisions\n\nAlthough the pause exam option is no longer available, 90mins it’s still enough time to check and/or look for information in regards to some of the questions if you are not 100% sure. I created bookmarks for every single page of the course, as well as the text version, sample tests and glossary. Crtl+F-ing through these can be really helpful if you get stuck with a question.\n\nI can’t emphasize enough how helpful it was to do the sample tests at the end of each lesson as well as the final assessment at the of each course, most of the questions in the exam are taken word for word from these!\n\n2- Some “tricky” bits: There are a few aspects of the course that I think are worth nailing down before taking the test, as a lot of the questions relate to these topics:\n\n * The main hierarchies of GA:\n   \n   * Account > Property > View\n   * User> Session >Hit\n   \n\n * Understand the differences between Source and Medium - there are quite a few questions about these\n * Goals and Ecommerce: differences, similarities, uses and how to implement them\n * Compulsory and optional campaign parameters (and that the order of these in the url is does not affect its functionality)\n * Adding data to GA: Measurement Protocol, Dimension Widening and Cost Data Import, when and how to use them\n\n3- Key reports: Apart from the basic ones, there are a few of the most “recent” ones that I would recommend you are confident with, such as:\n\n * Real-Time: to check recent added content and whether the GA codes are working or not among other functionalities\n * Intelligence Reports: Automatic and Custom Alerts and when to use them\n * Site Search Report: which helps immensely with keyword discovery..\n * Site Speed Report: what can you measure with this test?\n * Goal Flow Report: and how it can help you to improve the performance of pages and conversion rate\n\n4- Attribution and Attribution Models: Knowing how each one works and when is preferable to use them would prove useful when taking the test. Multichannel Funnels, Assisted Conversions and the different roles that they can play in the conversion path.\n\n5- Relax and take the exam when and where you feel more comfortable: The test is not meant to trick you, most of the time the obvious answer is the correct one, but you’ll want to ensure that you are at the peak of your mental capabilities when taking it. I’m an early bird and work better in the mornings and when the office is quiet - and because this never happens, the office being quiet, that is- I did the exam in the meeting room, with a cup of coffee and meditation music on the background, whilst the rest of the team were listening to Christmas carols full blast in the office.\n\nAnd that’s it! It is not a complicated test and I got most of the study done in a couple of days - although I have spent the last month navigating through the reporting interface - but, if time allows, I’d recommend watching the videos whilst taking notes and then reading the text version too.\n\nThanks once again for reading and if you are taking the exam any time soon...best of luck!\n\nAlso, if you have any questions regarding the exam or any of the tips above, do not hesitate to get in touch.\n\nHasta la vista!"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/google-analytics-health-check-part-2-third-week-measurelab/#article",
      "headline": "Google Analytics health check: Part 2: third week guide",
      "description": "Continuing the GA health check\n\nLast week, I covered the first few steps of our Google Analytics Health Check, as one of the first, and most important steps when putting together a measurement plan. To recap a bit, the main aim of a Health Check is to ensure that we are collecting the right information, filtering out any undesired data, to allow us to create actionable reports for the stakeholders that, at the same time, help them to make informed business decisions.\n\n\nChecking goals and funnels",
      "url": "https://www.measurelab.co.uk/insights/blog/google-analytics-health-check-part-2-third-week-measurelab/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/google-analytics-health-check-part-2-third-week-measurelab/#webpage"
      },
      "datePublished": "2014-11-24T15:02:06.000+00:00",
      "dateModified": "2025-12-22T14:13:39.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/12/cover-image-1.png",
      "author": {
        "@type": "Person",
        "name": "Juan Barros",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Debugging",
        "Ecommerce",
        "How-to"
      ],
      "articleBody": "Continuing the GA health check\n\nLast week, I covered the first few steps of our Google Analytics Health Check, as one of the first, and most important steps when putting together a measurement plan. To recap a bit, the main aim of a Health Check is to ensure that we are collecting the right information, filtering out any undesired data, to allow us to create actionable reports for the stakeholders that, at the same time, help them to make informed business decisions.\n\n\nChecking goals and funnels\n\nOnce we have gone through the overall implementation details, the Web Property set up and reporting Views and Filters, the next stage to tackle would be checking that both Goals and Funnels, have been properly set up. So, let’s get to it!\n\n\n4- Goal and Funnels\n\nGoals are a fundamental part of a measurement plan, as they are an easy and versatile way of measuring if you are actually fulfilling your KPIs and therefore your business objectives.\n\nImproper goal setup can lead to inaccurate data and negatively impact business decisions. When checking goals, we normally cover aspects such as:\n\n * The type of goal is correctly chosen to befit the tracking purpose\n * The goal description is clean and follows the naming convention (if present)\n * The destination page’s url is correctly defined (remember that using the Real Time view is always very helpful when setting up goals)\n * Has a monetary value been assigned to it and if so, is it representative?\n\n\nSetting up funnels\n\nSetting up funnels is an option that Google Analytics gives you when you set up a goal. A funnel allows you to track the path, or set of pages, that a user goes through before getting to the goal page. It is important to bear in mind that when a funnel is set up, it’ll restrict the goals’ completion to only those pages that follow the defined path.\n\nWhen checking funnels, the things we would normally look at are:\n\n * Are all the steps (pages) recording pageviews?\n * If RegEx is being used to define the pages that are part of the funnel, has it been properly implemented?\n\n\n5- E-Commerce\n\nE-Commerce reporting is one of the most valuable features of GA. It allows you to measure the number of transactions that take place in a website (or app) as well as the monetary value. E-Commerce is also probably one of the trickiest parts to set up in Google Analytics and in many cases, it will require the help of an experienced web developer to set it up.\n\nSome of the key checks to run through an E-Commerce set up are:\n\n * Has the code been implemented correctly and does it has all the elements required?\n * Has the E-Commerce plug in loaded properly?\n * Are there any duplicate transaction calls issues (i.e.:when an user revisits/reloads the confirmation page)?\n * Correct use of E-Commerce product taxonomy\n\n\n6- Event tracking\n\nEvent tracking allows you to track and measure the interaction of the users with the different elements of the website, giving us invaluable information regarding specific site interactions.\n\nIt’s always important to check:\n\n * Is the Event Tracking code syntax correct?\n * Are the Event Category, Action, Label and Category set up and follow the naming convention (if there is one)?\n * Check whether the events are firing by using the GA Debug tool or Real Time Reports\n\n\nWrapping up week three\n\nWith the above points, together with the ones covered last week, we should have a clear idea of what are the main implementation issues and priorities to start putting together a Measurement Plan.\n\nThe depth of the Health Check will always depend of the size and measurement needs for a particular website. However, it’s important to link things back to a Measurement Plan - using data to set and achieve KPIs.\n\nAnd that’s about it folks! I’ll return next week to tell you all about my adventures and hopefully, we’ll cover some interesting topics too. ;)\n\nThanks for reading and as usual, give us a shout if you have any questions or comments!"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/google-analytics-health-check-part-1-second-week-measurelab/#article",
      "headline": "Google Analytics health check – Part 1: second week guide",
      "description": "Diving into GA health checks\n\nRight, now that some of the basic concepts and industry jargon are starting to sound a bit more familiar, things are starting to get interesting – not that last week was boring but this week I’ve been having a go at one of the most important parts of a piece of “initial discovery” for a client: A Google Analytics Health Check.\n\n\nOur approach to health checks\n\nIn this document, which the team creates for every single one of our clients, we run a detailed audit of the",
      "url": "https://www.measurelab.co.uk/insights/blog/google-analytics-health-check-part-1-second-week-measurelab/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/google-analytics-health-check-part-1-second-week-measurelab/#webpage"
      },
      "datePublished": "2014-11-17T14:18:19.000+00:00",
      "dateModified": "2025-12-22T14:11:48.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/12/cover-image.png",
      "author": {
        "@type": "Person",
        "name": "Juan Barros",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Privacy",
        "Ecommerce",
        "AI & ML",
        "Google Ads",
        "How-to"
      ],
      "articleBody": "Diving into GA health checks\n\nRight, now that some of the basic concepts and industry jargon are starting to sound a bit more familiar, things are starting to get interesting – not that last week was boring but this week I’ve been having a go at one of the most important parts of a piece of “initial discovery” for a client: A Google Analytics Health Check.\n\n\nOur approach to health checks\n\nIn this document, which the team creates for every single one of our clients, we run a detailed audit of the client’s data collection and report configurations - and make all the necessary recommendations to ensure that:\n\n 1. The account collects the right information to better understand visitor behaviour\n 2. We and/or the client can create actionable reports for key stakeholders\n 3. Any inaccurate data is properly filtered out to avoid contamination\n\nAll the above might sound pretty obvious but there are so many little details (e.g. snippets of JavaScript code, settings here and there) that one needs to get right for the whole thing to work.\n\n\nWhat’s included in a health check\n\nSo, to cut the chase, what do we normally include in a Health Check?!\n\n(drumroll please)\n\nThe contents of each Health Check will normally depend on a client’s measurement requirements and specific business needs…BUT these are the bits that are normally covered:\n\n\n1- Overall implementation\n\nHere, we try to answer questions regarding the general implementation of the account. For example:\n\n * Is the GA code properly implemented and present in all pages?\n * Is the code duplicated or contains any errors?\n * If needed, is cross domain linking and tracking implemented and functioning properly?\n * Are there any tag containers being used and if so, are they properly implemented?\n * Are Event and Campaign tracking in place and pulling data?\n\nThe aim in this section is to clarify whether the data is being collected accurately and appropriately so it can be processed and analysed properly later on. I can’t tell you how many times this week I’ve been asking the team about JavaScript codes, cookies – the internet ones – and so on.\n\n\n2- Web Properties\n\nHere, we list the Web Properties that have been created or we have been granted access to and review some of the most important aspects each Web Property - for example:\n\n * Any data limits being breached?\n * Is the industry category properly set? – This bit is really important for the benchmarking reports\n * Is Enhance Link Attribution enabled? – Key aspect for improved click-through data in the in-page reports\n * Are the Social Plugins implemented and tracking properly?\n\nSo, basically, it’s about fine-tuning the data gathering! The more data we have, the better, as we can always worry about filtering during the next steps.\n\n\n3- Reporting Views and Filters\n\nGreat, so the data is coming in nicely, now we just need to tidy it up, make sure that we are only getting what we need.\n\n * Is the Reporting View configured and collecting data?\n * Is the website address and time zone set correctly?\n * URL Query Parameters excluded (if required)\n * E-commerce tracking enabled? – Or Enhanced E-commerce if the client is already on Universal Analytics\n * Are Google Webmaster Tools and Google Adwords accounts linked?\n * Are View filters set up as required?\n\nBy now we should have a clear idea of the state of the account and whether there are any issues that need to be addressed urgently. Ensuring that the data is being gathered appropriately is probably the top priority during the first steps of the health check, as this will guarantee that once the Measurement Plan starts to take shape, we have as much information as possible to meet our needs.\n\n\nWrapping up week two\n\nAnd that’s it for now folks! Next week I’ll wrap it up by covering the final steps of the Health Check. In the meantime, if you have any questions, comments – or advice – please do not hesitate to get in touch or leave a comment below. :)"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/scroll-depth-floods-lots-coffee-first-week-measurelab/#article",
      "headline": "Floods, Scroll Depth, Bonfire and lots of coffee: My first week at Measurelab",
      "description": "\t\t\t<p class=\"p1\"><span class=\"s1\">It’s been, without a doubt, an unusual first week. Upon arrival to the mind-blowing <a href=\"https://www.measurelab.co.ukcontact/\"><span class=\"s2\">Old Candlemakers</span></a> building in central Lewes, I walked into the office to see the team running up and down trying to clean up the mess: one of the roof windows was left open during the weekend and we ended up with a meeting room that looked more like a fish pond than a place to catch-up or meet clients. Fort",
      "url": "https://www.measurelab.co.uk/insights/blog/scroll-depth-floods-lots-coffee-first-week-measurelab/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/scroll-depth-floods-lots-coffee-first-week-measurelab/#webpage"
      },
      "datePublished": "2014-11-10T12:12:46.000+00:00",
      "dateModified": "2025-07-31T20:39:36.000+00:00",
      "author": {
        "@type": "Person",
        "name": "Juan Barros",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Google Tag Manager",
        "How-to"
      ],
      "articleBody": "\t\t\t<p class=\"p1\"><span class=\"s1\">It’s been, without a doubt, an unusual first week. Upon arrival to the mind-blowing <a href=\"https://www.measurelab.co.ukcontact/\"><span class=\"s2\">Old Candlemakers</span></a> building in central Lewes, I walked into the office to see the team running up and down trying to clean up the mess: one of the roof windows was left open during the weekend and we ended up with a meeting room that looked more like a fish pond than a place to catch-up or meet clients. Fortunately, the guys were pretty quick and were able to fix things up fairly quickly and get cracking with the caffeine consumption and inbox clearing.</span></p>\n\n\nBeing Web Analytics something relatively new for me, I started the week doing some reading and watching some videos of Justin Cutroni to refresh some of the basics and start prepping for the Google Analytics Individual Qualification - which I was kindly invited to take within a month of my start at Measurelab..no pressure..\n\nHowever, by Wednesday, one of the first challenges came up (not weather-related this time): having seen the good performance of some of our how-to guides in our blog, Mark suggested to include scroll depth tracking into the blog so we could see how far down the page people were getting on each page and therefore be able to crosscheck with the visit duration to have a better understanding of the blog’s content performance. Sounds easy, doesn't it? Well, surprisingly, it was, because despite the fact that I’m not really familiar with Google Tag Manager I was able to get the whole thing up and running in “just” a couple of hours thanks to this great guide by Andy Gibson. If you have a basic knowledge of Google Analytics and Google Tag Manager, you should be able to get this done in just a few minutes though!\n\nI should perhaps mention the fact that all this was done from home, as it was suggested to us to not get close to Lewes if we were not planning to stay for Bonfire Night. Apparently the locals love to set things on fire during the 5th of November and you are either in, or out. A little taste below:\n\nThe rest of the week was fairly smooth, involving more of the Digital Fundamentals and Platform Principles videos in preparation for the GAIQ, Google Tag Manager and also a first go at a client’s GA account health check -or audit- which helped me realise the vast amount of information that can be extracted from a website with the correct implementation of GA and GTM. Coming from a Marketing/PR background, it’s fairly easy for me to see how all this information, if it’s well processed and digested, could be of invaluable help to take those data-driven decisions that could take a business to the next level.\n\nAnd that’s about it..oh, sorry, the coffee bit…we have a nespresso coffee machine at work which, being a coffee addict as I am, it’s one of the reasons why I accepted the job. One tip though, stay away from the Caramelito and Vanillo capsules..\n\nIf you are on top of your work and have a couple of minutes to spare towards the end of the week, stay tuned for the next update, I’d be looking at shifting the conversation from coffee to web analytics as I get more acquainted with the trade ;)\n\nP.S.: I don’t know who you are, but I will find you and check how much have you read of this post..thanks to scroll depth."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/google-tag-manager-overhaul-released-public-beta-new-interface-features-api/#article",
      "headline": "GTM’s new interface: public‑beta update, API & feature changes",
      "description": "Things move fast in the digital world. Even more so when the might of Google is behind a product. Even so, a complete overhaul of the Google Tag Manager interface is quite a leap - considering how accustomed we have become to seeing incremental changes in product development. This morning I was using Google Tag Manager as usual, this afternoon I noticed that an import/export feature had become available. That was great news in itself, as it opens up all sorts of possibilities - for example, link",
      "url": "https://www.measurelab.co.uk/insights/blog/google-tag-manager-overhaul-released-public-beta-new-interface-features-api/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/google-tag-manager-overhaul-released-public-beta-new-interface-features-api/#webpage"
      },
      "datePublished": "2014-10-15T18:14:20.000+00:00",
      "dateModified": "2025-12-10T01:05:20.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/2014-10-15_18-29-56.png",
      "author": {
        "@type": "Person",
        "name": "Mark Rochefort",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Tag Manager",
        "Google Analytics",
        "Looker Studio"
      ],
      "articleBody": "Things move fast in the digital world. Even more so when the might of Google is behind a product. Even so, a complete overhaul of the Google Tag Manager interface is quite a leap - considering how accustomed we have become to seeing incremental changes in product development. This morning I was using Google Tag Manager as usual, this afternoon I noticed that an import/export feature had become available. That was great news in itself, as it opens up all sorts of possibilities - for example, linking tag container configurations to deployment procedures or starting new containers with base-level configurations. On digging into this new feature a little deeper I noticed that GTM was right in the middle of an update - with their much mentioned \"v2\" being released as a public beta. The import / export feature was a consequence of a much wider roll out - the tip of the containerberg, as it were.\n\nHere's how it looks:\n\n\nSo what's new and what does it all mean?\n\n\nNew User Interface\n\nIf you are already using GTM (v1), you will still have to use the \"old\" User Interface for a few months (estimated January 2015) before your account and container all gets migrated over. You will have access to the import / export feature though (see below).\n\nIf you are creating a new account and container tag, you can go to the new public beta at tagmanager.google.com and start straight away! You will notice similarities with some Google Plus interface components and with the navigational layout more akin to that of Google Analytics. Everything is arranged in a much more colourful and informative way - following a visual grid for accounts and containers, allowing for more detail about each to be viewed at a glance. This is useful if, like us, you are managing many containers across many accounts. Within a particular container, the interface has also been updated, bringing recent activity to the fore to create a useful dashboard overview of the container.\n\n\nRules have been renamed \"triggers\" - and Auto-Event Listener Tags are not needed\n\nIts not just a name change. Even though the function of \"triggers\" remains the same, how they are created has been broken into two steps: select a type (such as a page view, click or link click) and then apply a set of filters. The result is the same as the \"rules\" in v1 but in a much more ordered manner.\n\nFurthermore, the cumbersome and frankly awkward Auto-Event Listener Tags are no longer needed in v2. Instead, if you select a \"trigger\" type to be a \"click\", for example, then GTM takes care of the code insertion required to enable the auto-event listeners for that.\n\n\nMacros have been renamed \"variables\" - and you get to choose which built-in ones you want to see\n\nThis makes a lot of sense - it encourages you to think of the returned output, rather than the function. If you create \"variable\" makes for a simpler naming convention for all to follow. Also, you get to choose which \"variables\" to show in the interface - meaning things don't get cluttered up by all those system generated ones that kept appearing (e..g. \"New History Fragment\") if you don't need them.\n\n\nImport / export Containers\n\nAs mentioned earlier - this is now available in v1 as well as v2 and can make life much simpler for those concerned with versioning, deployments or base-level configurations.\n\n\nGetting happy with the API\n\nMy favourite feature by far and the one I'm itching to play with. The new Google Tag Manager API exposes configuration entities:\n\nAll of these things can now be managed programmatically via the API. This makes me happy :)\n\n\nFeatures not yet added to the new interface\n\nBefore you get too keen, some features are not yet available in the new interface. They’ll be added before going from beta to full launch (before January 2015):\n\n * Support for mobile containers\n * Doubleclick integration and approval workflows\n * Non-English translations of the user interface\n\n\nMigrating to the new interface\n\n\"Soon\" Google will be enabling the migration of v1 accounts and containers to the new v2 interface. In January 2015, all users will have their accounts and containers migrated to the new interface, after which the old interface will no longer be available."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/google-analytics-embed-api/#article",
      "headline": "How to use the Google Analytics Embed API: guide & examples",
      "description": "When I started at Measurelab, way back in July, one of the items on my List Of Things To Do was to look into new and exciting ways of visualising data for clients. A few weeks ago I spent some time experimenting with\n\n\n\ndc.js\n\n\n\nbut then, Mark and Dara went to MeasureCamp in London (I was going to go but I had other commitments) and came back bearing glad tidings of great joy for all analytics consultants, because unto Google, in the town of Mountain View, was born an API, and the angel Justin C",
      "url": "https://www.measurelab.co.uk/insights/blog/google-analytics-embed-api/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/google-analytics-embed-api/#webpage"
      },
      "datePublished": "2014-10-01T15:39:04.000+00:00",
      "dateModified": "2025-12-22T14:06:46.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/12/embed-api-1.png",
      "author": {
        "@type": "Person",
        "name": "Adam Englebright",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Looker Studio",
        "Data Analysis",
        "How-to"
      ],
      "articleBody": "When I started at Measurelab, way back in July, one of the items on my List Of Things To Do was to look into new and exciting ways of visualising data for clients. A few weeks ago I spent some time experimenting with\n\n\n\ndc.js\n\n\n\nbut then, Mark and Dara went to MeasureCamp in London (I was going to go but I had other commitments) and came back bearing glad tidings of great joy for all analytics consultants, because unto Google, in the town of Mountain View, was born an API, and the angel Justin Cutroni said to call it Embed.\n\n\n\nSo, there's a new! exciting! JavaScript library in town that allows you to Embed (see, that’s its name!) charts and tables from Google Analytics of the kind that you’d find in custom dashboards onto third-party sites. It’s interesting – quite new, with a few rough edges and still rather scant documentation, and after having spent the week playing around with it, I’ll try and outline some of the good stuff, some of the not-so-good stuff, and why you should care. Let’s go with that first, actually.\n\n\n\n\n\nWhy is this exciting? There are clear advantages for both us and our clients. We can build branded dashboards on our own site, complete with our logo, and still track the data. We also gain more flexibility for visualization: you can use third‑party chart libraries or the standard Google charts. This makes dashboards cleaner and more manageable than the old “export to spreadsheet and draw charts manually” method. Additionally, you can view the same chart using different data views, and even compare multiple views side‑by‑side.\n\n\n\n\n\nThe demo site showcases a lot of the site’s features. If you want to have a look at my efforts so far, I've made a little example dashboard that you can find over here.\n\n\n\n\n\nThe dashboards I made were mostly based the ‘pure HTML’ Polymer.js framework from the sixth example page. I was mostly trying to recreate client dashboards, but I threw together a few other things. The construction process is remarkably simple – you can just plug in the various components, adjusting them to your needs, and go. A few modifications are required here and there, but with a little effort (and judicious appropriation of resources from the demo site) you can have something up and running very quickly. An easy-ish guide follows:\n\n\n\n\nHow-to\n\n\n\n(this is for non-experts, if it seems insultingly easy, you probably don’t need it)\n\n\n\n\n\nFirst up, grab the code from the Github page. You’ll also need an OAuth2.0 client ID from Google – instructions are here and seem to be for an older version of the Dev Console site – but as long as you create a new project, enable the Analytics API and generate new client ID credentials (remember to use http://localhost:8888/, or wherever you’re hosting it as the Authorised Javascript Origin (though if you’ve got a dev server or something you probably don’t need me to tell you this) you should be fine. Copy the contents of the “site” folder into a folder in your MAMP host directory (or whatever you’re using). Open any of the numbered html files in a text editor, substitute your client ID for the one listed, and have a play around. You’ll need to add the folder path to the asset references before you try to load the pages, but once you’ve done that the pages should work fine. I’d recommend getting the early pages working, and once you’ve got things working, have a look at 6, which has a very clear format that you can easily tweak to create the sort of dashboard you need. The components reference the core reporting API, so as long as you're familiar with that (which you will be if you've made much use of the GA spreadsheet addon), you should have no problem.\n\n\n\n\nThings I can’t find written anywhere:\n\n\n\n * Despite saying it can’t (under ‘possible options’ in the chart.type string here you definitely can use other kinds of charts – f’rinstance, I made a pie chart by setting chart type to PIE, which it doesn’t say you can do but it turns out you can. Experiment, and see what other unlisted chart types are possible!\n * As far as I can tell, you can’t have more than 10 widgets on a page. This is a little annoying, because one of the reasons I was so excited about Embed was not having to split client’s dashboards over multiple pages. I can’t find anything about this in the documentation, so I’m not sure exactly what’s going on there.\n\n\n\n\nMy To-Do list\n\n * Get third-party visualisations working\n * prettify\n * I’m also quite interested to see whether I can pull data from the Management API, because that’s something else that’s been on my R&D research list for a little while (though I haven’t yet had the chance to do it)\n\nHave any of you had a chance to look at the Embed API yet? Maybe butted up against the same 10-widget-on-a-page limit as I did, or have come up with your own novel implementation? Comments and links below would be welcome!"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/enhanced-ecommerce-data-import-brightonseo-slides/#article",
      "headline": "Enhanced Ecommerce & Data Import - #BrightonSEO slides",
      "description": "\t\t\tOn Friday the Measurelab team attended <a href=\"http://www.brightonseo.com/\">BrightonSEO</a>&nbsp;and I did a talk on two exciting features of GA: Enhanced Ecommerce and Data Import. Here is the deck for those who are interested, as well as the Twitter feed that followed the talk.\n\n\nEnhanced Ecommerce & Data Import for GA - #BrightonSEO Sept 2014 from darafitzgerald\n\nThe advanced Google Analytics training course was an eye opener and really helpful! thanks @darafitzgerald #BrightonSEO\n\n\n— Man",
      "url": "https://www.measurelab.co.uk/insights/blog/enhanced-ecommerce-data-import-brightonseo-slides/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/enhanced-ecommerce-data-import-brightonseo-slides/#webpage"
      },
      "datePublished": "2014-09-15T10:28:12.000+00:00",
      "dateModified": "2025-07-31T20:39:37.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/aht3oqji-jpeg.jpg",
      "author": {
        "@type": "Person",
        "name": "Dara Fitzgerald",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Ecommerce"
      ],
      "articleBody": "\t\t\tOn Friday the Measurelab team attended <a href=\"http://www.brightonseo.com/\">BrightonSEO</a>&nbsp;and I did a talk on two exciting features of GA: Enhanced Ecommerce and Data Import. Here is the deck for those who are interested, as well as the Twitter feed that followed the talk.\n\n\nEnhanced Ecommerce & Data Import for GA - #BrightonSEO Sept 2014 from darafitzgerald\n\nThe advanced Google Analytics training course was an eye opener and really helpful! thanks @darafitzgerald #BrightonSEO\n\n\n— Manil Fernando (@ManilDFernando) September 11, 2014\n\nEnjoying my final Studio session with host @DecibelPhil & speakers @darafitzgerald @LukaszZelezny @AnalyticsGirl @adamlofting #BrightonSEO — Natalie Lloyd (@natalie_l_lloyd) September 12, 2014\n\nOk, @darafitzgerald has convinced me, enhanced ecommerce tracking in GA looks so much better, go try it people #BrightonSEO\n\n\n— Charlie Williams (@pagesauce) September 12, 2014\n\nInteresting info from @darafitzgerald on Enhanced Ecommerce and tracking at individual checkout points #BrightonSEO p.s. love the beard — HeadRed (@headredmedia) September 12, 2014\n\nSo ridiculously impressed with #EnhancedEcommerce @darafitzgerald #BrightonSEO #Analytics pic.twitter.com/5b6ahPQmEA\n\n\n— Siobhan Harris (@SioHarris) September 12, 2014\n\nFantastic afternoon at #BrightonSEO, thanks to @lukaszzelezny @darafitzgerald @adamlofting. — StrategiQ Marketing (@strategiQmedia) September 12, 2014\n\n@darafitzgerald I think a better twitter handle for you would have been @datafitzgerald #BrightonSEO #missedopportunity\n\n\n— Shine Search (@ShineSearch) September 12, 2014\n\nBEARD SPOTTED #BrightonSEO — Measurelab (@measurelab) September 12, 2014"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/better-living-universal-analytics/#article",
      "headline": "Key universal analytics insights: lessons for a GA transition",
      "description": "The conference bit of BrightonSEO is happening tomorrow, and for those who aren't going along we thought it might be nice to post the little piece I wrote for the newspapers they're distributing at the conference this year. If you are going, look out for us and say hi, and make sure to come along to Dara's talk in the afternoon!\n\nWhen Universal Analytics came out of beta earlier this year, many were overwhelmed by the plethora of new features. Not a day goes by without a client asking us \"how do",
      "url": "https://www.measurelab.co.uk/insights/blog/better-living-universal-analytics/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/better-living-universal-analytics/#webpage"
      },
      "datePublished": "2014-09-11T13:57:22.000+00:00",
      "dateModified": "2026-01-27T17:34:28.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/brighton_seo.jpg",
      "author": {
        "@type": "Person",
        "name": "Adam Englebright",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics"
      ],
      "articleBody": "The conference bit of BrightonSEO is happening tomorrow, and for those who aren't going along we thought it might be nice to post the little piece I wrote for the newspapers they're distributing at the conference this year. If you are going, look out for us and say hi, and make sure to come along to Dara's talk in the afternoon!\n\nWhen Universal Analytics came out of beta earlier this year, many were overwhelmed by the plethora of new features. Not a day goes by without a client asking us \"how does this Data Import business work then, eh?\" or \"Enhanced Ecommerce? What's all that about?\" If you feel like you might be the person on the other end of that telephone, help is at hand, and in this very article! Read on for five of the hottest Google Analytics features for online businesses introduced (or improved) by the introduction of Universal Analytics.\n\n\nUser ID\n\nIn 'classic' reporting, users were measured by a Client ID. This meant that if the same user visited a site from their laptop one day and a tablet the next, those would be assigned different IDs and treated separately. You can immediately see the problems with this approach. Universal Analytics introduces a solution that's clearly not perfect, but is certainly less wrong – provided the user is authenticated or logged in, they get assigned a User ID, allowing you to track the user's behaviour across devices (though cross-device reports are only available in User ID views, which you'll need to create).\n\n\nCustom Dimensions\n\nEvery business is different, and every business' website is different, with each having a different set of goals – some want to drive sales, some want to generate leads, etc. Custom dimensions allow you to create your own measurements, and although they require a bit of code tinkering, they allow for measurement of things which are specifically useful to you – for instance, if you're an online retailer you could divide up customers by regularity of purchase. The one downside is that at the moment custom dimensions don't have their own 'report view', and need to be added as secondary dimensions or have custom reports created for them.\n\n\nData Import\n\nAs the name suggests, you can import data gathered elsewhere into Google Analytics. Adwords, as a Google product, has account linking for some time, but now you can upload cost data (easily, in a .csv, rather than with an API as was the old way). You can also import product data and things you wouldn't want on public display – profit, or cost per unit etc – and refunds (full and partial), allowing easier analysis of product returns within Google Analytics. You could also import custom data sets, like offline revenue, or lifetime value you've calculated based on customer IDs. It also introduces the possibility of 'dimension widening' – adding additional information to existing data points, e.g. adding an 'author' dimension to a blog's analytics. Be aware though, once dimensions have been 'widened' they can't be 'narrowed' - the process is irreversible.\n\n\nEnhanced Ecommerce\n\nThis is brand new and exciting, but also a bit more complicated (and still in beta - but that shouldn’t stop the more adventurous among you). It adds support for far more granular ecommerce analysis, with product-level reporting and checkout behaviour (who does what, and who jumps off where?), or to more easily determine which products are being driven by SEO. You can see impressions per product against product added to cart, who viewed the product detail page, and all sorts of interesting stuff, without having to resort to event tracking or more cumbersome solutions alone.\n\n\nSegmentation & Remarketing\n\nRemarket to segments based on data in Google Analytics, including segments based on custom dimensions and imported data. The interface allows you to easily drill down into data, very easily (one-click) e.g. use segment to find people abandoning cart and very quickly use that segment to remarket to those people – don't lose the money you spent getting them to the cart in the first place. For more depth and detail on this subject, might I suggest you attend the excellent talk the brilliant, charming (and definitely not my boss) Dara Fitzgerald will be giving today."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/measurelab-moved/#article",
      "headline": "Measurelab has moved!",
      "description": "\t\t\tLast Friday afternoon, instead of the usual <del datetime=\"2014-09-01T09:27:54+00:00\">slacking off</del> hard work right up to the end of the day, Measurelab (and our good friends at <a href=\"http://www.brightlocal.com/\">Brightlocal</a>) were emptying cupboards and bookshelves, taking the legs off desks and disposing of never-watered plants, in preparation to load all the&nbsp;gear into cars and bus it down the road to the new office! Measurelab Manor has served well for the first year of so ",
      "url": "https://www.measurelab.co.uk/insights/blog/measurelab-moved/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/measurelab-moved/#webpage"
      },
      "datePublished": "2014-09-01T11:03:12.000+00:00",
      "dateModified": "2026-01-27T17:33:24.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/2014-09-01-09-16-37-scaled.jpg",
      "author": {
        "@type": "Person",
        "name": "Adam Englebright",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Measurelab"
      ],
      "articleBody": "\t\t\tLast Friday afternoon, instead of the usual <del datetime=\"2014-09-01T09:27:54+00:00\">slacking off</del> hard work right up to the end of the day, Measurelab (and our good friends at <a href=\"http://www.brightlocal.com/\">Brightlocal</a>) were emptying cupboards and bookshelves, taking the legs off desks and disposing of never-watered plants, in preparation to load all the&nbsp;gear into cars and bus it down the road to the new office! Measurelab Manor has served well for the first year of so of Measurelab's existence (and my first 2 months of employment), but as we grow (<a href=\"http://measurelab2.wpengine.com/jobs/graduate-analytics-consultant/\">graduate position still open for a few more weeks!</a>) we need more space, and so we've moved into the loft space above <a href=\"http://www.needlemakers.co.uk/\">The Needlemakers</a> (our bit is called the The Old Candlemakers). This building is a former hypodermic needle factory and candle workshop - now filled with a cafe, shops and lots of interesting businesses (including ours).\n\n\nMeasurelab Towers has got bags of space (as you can see below), exposed beams and lovely views out over Lewes (above). Now we just need to get back to work and stop being distracted by the people hang-gliding off Mount Caburn."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/adams-analytics-adventure-week-5/#article",
      "headline": "Adam's Analytics Adventure: Week 5",
      "description": "\t\t\t<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img src=\"http://measurelab2.wpengine.com/wp-content/uploads/2014-07-01-14.30.281-1024x768.jpg\" class=\"kg-image\" alt=\"View from the hill, 1 month ago.\" loading=\"lazy\" width=\"1024\" height=\"768\"><figcaption>View from the castle, 1 month ago.</figcaption></figure>\n\n\nI started working for Measurelab a month ago today (has it really been that long?) and fortunately I'm still really enjoying myself. However, it's no longer the urgent exciteme",
      "url": "https://www.measurelab.co.uk/insights/blog/adams-analytics-adventure-week-5/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/adams-analytics-adventure-week-5/#webpage"
      },
      "datePublished": "2014-08-01T16:46:31.000+00:00",
      "dateModified": "2026-01-27T17:30:39.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/2014-08-01-12-03-03-scaled.jpg",
      "author": {
        "@type": "Person",
        "name": "Adam Englebright",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Measurelab"
      ],
      "articleBody": "\t\t\t<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img src=\"http://measurelab2.wpengine.com/wp-content/uploads/2014-07-01-14.30.281-1024x768.jpg\" class=\"kg-image\" alt=\"View from the hill, 1 month ago.\" loading=\"lazy\" width=\"1024\" height=\"768\"><figcaption>View from the castle, 1 month ago.</figcaption></figure>\n\n\nI started working for Measurelab a month ago today (has it really been that long?) and fortunately I'm still really enjoying myself. However, it's no longer the urgent excitement of oh boy! I have a job, like a grown-up! but a rather more comfortable groove of ahhh, spreadsheets and analysis, this is a jolly pleasant thing to get paid to do, and as everything stops being so new and shiny, and I can't find novelty value in writing about the stuff I'm doing (or am prevented by the fact that all the interesting details are in some way tied up with confidential informations about a client) the format of my weekly updates here is going to shift a bit1. I'm envisioning something a bit like the old Berg weeknotes but we'll see what happens. I also have some ideas for other things to do with the blog, but we'll see where we get with that.\n\nAs it happens, this week has been a bit quiet on the anecdotes front – lots of plugging away on spreadsheets, chopping and changing and fixing and mending. The only really interesting thing was, as I mentioned would happen last time, I graduated on Monday2:\n\nSo, I'm now Adam Englebright B.Sc. (Hons) Farewell, academia3, you've been great fun.\n\n\nCoffeewatch\n\nA month's worth of coffee habit! However, due to the half-day on Monday, I was only in 4 days this week, and only had had one coffee a day (2 Vanillo, 2 Cioccatino). Is this backsliding?\n\nIt's been a good month, all told. Right now, though, I've got to return an overdue library book and eat a burger. Thanks for reading, and I'll be back with more coffee and nonsense next week. Over and out.\n\n1. though one could argue that it a) has been anyway and b) wasn't established well enough in the first place to justify a statement of this kind↩\n2. I also received my first paycheque so I'm spending my out-of-work hours resisting the urge to order things on Amazon because I can get free next-day delivery with Prime.↩\n\n3. at least until I get tired of the 9-5 and decide to do a masters↩"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/adams-analytics-adventure-week-4/#article",
      "headline": "Adam's Analytics Adventure: Week 4",
      "description": "\t\t\t<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img src=\"http://measurelab2.wpengine.com/wp-content/uploads/2014-07-19-15.22.35-1024x768.jpg\" class=\"kg-image\" alt=\"Went for a wander around Lewes itself over the weekend. The images aren't super-relevant, but they're quite nice. This one is down near the Priory.\" loading=\"lazy\" width=\"1024\" height=\"768\"><figcaption>Went for a wander around Lewes itself over the weekend. The images aren't super-relevant, but they're quite nice. This on",
      "url": "https://www.measurelab.co.uk/insights/blog/adams-analytics-adventure-week-4/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/adams-analytics-adventure-week-4/#webpage"
      },
      "datePublished": "2014-07-25T15:52:31.000+00:00",
      "dateModified": "2025-07-31T20:39:37.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/2014-07-24-11-09-44-scaled.jpg",
      "author": {
        "@type": "Person",
        "name": "Adam Englebright",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Tag Manager"
      ],
      "articleBody": "\t\t\t<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img src=\"http://measurelab2.wpengine.com/wp-content/uploads/2014-07-19-15.22.35-1024x768.jpg\" class=\"kg-image\" alt=\"Went for a wander around Lewes itself over the weekend. The images aren't super-relevant, but they're quite nice. This one is down near the Priory.\" loading=\"lazy\" width=\"1024\" height=\"768\"><figcaption>Went for a wander around Lewes itself over the weekend. The images aren't super-relevant, but they're quite nice. This one is down near the Priory.</figcaption></figure>\n\n\n\nGosh, fourth week already? I've been here nearly a month – not only am I graduating on Monday, I'll also be receiving my first paycheque! Doesn't time fly? Anyway, another quick one this week, as I've eaten up some of my blogging time doing *gasp* actual work, and we're finishing slightly early today, so let's goooooo...\n\n\nWeek of code\n\nThis week's been quite nice in several ways – my days have been a bit more diverse in terms of activities, and I've spent a lot of my time attempting to do some code stuff, both some pretty rudimentary Javascript stuff from one of Mark's templates in Google Tag Manager and also some slightly more involved stuff because I needed to retrieve and wrangle larger amounts of data than the Spreadsheets add-on or the interface itself would allow.\n\nFortunately, there's a package for everyone's favourite free software cross-platform statistical programming language that allows you to retrieve data with only a little fuss and bother (it took me all of Wednesday to get the damn thing working, but I got it sorted in the end). I haven't done anything with R since I used it for a bit of a coursework at the beginning of the year (for which I got 88%, so I'm basically an expert) and most of the challenge was working out how to import the data (the code provided by the package people was not completely clear) which is not where most of my R skills lie, having always been given nice, clean, well-formatted .csv's for ease of importing at uni.\n\nOnce I had the data, however, it was all good. Sadly, I didn't get to do any of the interesting analysis/visualisation stuff, as the client just wanted it to compare with some internal numbers – however, knowing now how to get the data in, that stuff should be no problem when we do want to do something fun and interesting with a large data set. It's nice, as always, to be able to make use of some of that stuff I spent the last three years learning. I'm also interested to look into the use of PHP and fast Fourier transforms (yeah, I'm interested in looking at Fourier transforms. I didn't even say that when I doing my degree) outlined by friend of Measurelab Jason Bailey over here, but that's something for another week.\n\n\ncoffeewatch 2k14\n\nTuesday and Thursday I had one 'Livanto' (my preferred Nespresso\n\n™ pod style\n\nso far), but today I not only ventured into the slightly odd territory of 'Ciocattino' and 'Vanillo' (Livanto but flavoured with chocolate and vanilla, respectively) I had two cups of coffee.\n\nMy habit is developing, and my mean heart rate, no doubt, is slowly increasing. Over and out"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/adams-analytics-adventure-week-3/#article",
      "headline": "Adam's Analytics Adventure: Week 3",
      "description": "\t\t\t<h1 style=\"color: #141412;\">New Laptop!</h1>\n\n\nNew laptop finally arrived!\n\nIt’s so shiny!\n\naaaaaaaaaahhhhhh\n\n\nahem. Bit shorter than usual this week, as the time I’d usually use for blogging has been spent installing/configuring the laptop which just arrived. On top of that, it's been a busy week, but not one in which the majority of my activities lend themselves to interesting anecdotes – I spent Monday just looking at spreadsheets. Fun for me, but not very interesting for you to read about",
      "url": "https://www.measurelab.co.uk/insights/blog/adams-analytics-adventure-week-3/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/adams-analytics-adventure-week-3/#webpage"
      },
      "datePublished": "2014-07-18T16:39:55.000+00:00",
      "dateModified": "2026-01-23T11:01:29.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/2014-07-15-10-25-40-scaled.jpg",
      "author": {
        "@type": "Person",
        "name": "Adam Englebright",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Measurelab"
      ],
      "articleBody": "\t\t\t<h1 style=\"color: #141412;\">New Laptop!</h1>\n\n\nNew laptop finally arrived!\n\nIt’s so shiny!\n\naaaaaaaaaahhhhhh\n\n\nahem. Bit shorter than usual this week, as the time I’d usually use for blogging has been spent installing/configuring the laptop which just arrived. On top of that, it's been a busy week, but not one in which the majority of my activities lend themselves to interesting anecdotes – I spent Monday just looking at spreadsheets. Fun for me, but not very interesting for you to read about. Anyway, onward!\n\n\nNew Analytics!\n\nThere’s not a tremendous amount for me to talk about on the analytics front, beyond “I’m continuing to get to grips with the quirks of the interface”. I’m still more comfortable with spreadsheets (and as I said before, spent all of Monday happily messing around with one), and tend to feel at my most useful when Mark or Dara throw me something to pick apart in spreadsheet form, though I was able to construct a series of dashboards and segments for a client (I won’t tell you who the client was, but if I drop the hint that it was a prominent quantity surveyor, I think you’ll guess) and was happy with the result. Think I’m slowly starting to get the hang of it.\n\n\nNew Offices!\n\nAs I mentioned a while ago, Measurelab (and our lovely pals and officemates at Brightlocal) are moving offices in a few months time. Measurelab Manor (pictured above, in the glorious sunshine1) is lovely, and affords me the luxury of, e.g. sitting in the garden to write this (selfie below…)\n\nbut at the same time, the space we have within it is getting too small (there’s only space for me in the office on 2-3 days of the week most of the time) so we’re heading off to Measurelab Towers, in the heart of Lewes! It’s a loft space, affording us panoramic views of the town. Here is one of those views:\n\n\nNew Drinking Habits!\n\nCoffeewatch, week 2: I was in the office 3 days this week, and on 2 of these days I had coffee – on Tuesday it was ‘Arpeggio’, on Thursday it was 'Livanto' (a more balanced and caramel flavour than the stronger Arpeggio, or so the Nespresso website tells me). This was the Arpeggio:\n\nMore next week. Over and out.\n\n1: It’s been a week of extreme weather here on the (mostly) sunny south-east coast. We’ve chiefly been enjoying blazing sunshine, but last night there was a very loud and impressive thunderstorm.↩"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/adams-analytics-adventure-week-2/#article",
      "headline": "Adam's Analytics Adventure: Week 2",
      "description": "\t\t\t<em>Because of the way events transpired this week, I’m going to go through a few notable things rather than a day-by-day (because that would be boring) and give them all pithy-ish subheads, like I’m a newspaper columnist or something.</em>\n\n\n\nCoffee habit\n\nNow that I work in a hip web 2.0 dotcom startup dealie, I clearly need to develop a coffee habit. I had my first cup from the office Nespresso machine (nary a burr grinder in sight - a disgrace) this afternoon – a purple pod marked ‘Arpegg",
      "url": "https://www.measurelab.co.uk/insights/blog/adams-analytics-adventure-week-2/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/adams-analytics-adventure-week-2/#webpage"
      },
      "datePublished": "2014-07-11T16:39:22.000+00:00",
      "dateModified": "2026-01-27T17:32:41.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/2014-07-11-13-37-16-scaled.jpg",
      "author": {
        "@type": "Person",
        "name": "Adam Englebright",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Measurelab"
      ],
      "articleBody": "\t\t\t<em>Because of the way events transpired this week, I’m going to go through a few notable things rather than a day-by-day (because that would be boring) and give them all pithy-ish subheads, like I’m a newspaper columnist or something.</em>\n\n\n\nCoffee habit\n\nNow that I work in a hip web 2.0 dotcom startup dealie, I clearly need to develop a coffee habit. I had my first cup from the office Nespresso machine (nary a burr grinder in sight - a disgrace) this afternoon – a purple pod marked ‘Arpeggio’, with 4 spoonfuls of sugar to mitigate the taste. I will keep you apprised of my coffee adventures as the weeks go by.\n\n\nI for one welcome our new Google overlords\n\nOne of the things I mentioned last time was how Google Analytics seems to be the tool of choice for our industry. This brings with it a few interesting issues. One of the things I was looking at this week was Google Tag Manager, which allows the user to (surprise!) manage the tags you have on the website. This is very useful for us, because it allows us to modify tags without having to change the website itself, something which, as an outside company, is jolly useful because we don’t have to pester our client’s in-house web development team (or worse, their out-of-house web dev team). However, before Google decided they wanted to get into the tag manager game, there were a rich host of third-party tag management solutions – some good, some not so good, but most of which plugged into Google Analytics.\n\nThen Google came along, with their better, free alternative to the third parties, which also happened to be natively integrated with Google Analytics, and just like that, the market for third-party tag managers was, to say the least, severely curtailed. Some have lived on in a diminished form, others have been bought by companies who aren’t so keen on Google running all that stuff for them, but for the most part they’ve pivoted or died away.\n\nI mention it because one of the things that’s been on my mind a fair bit this week is the dependence of a large section of this industry on Google, and how the work I’ve been doing both with Tag Manager and butting up against the ‘not provided’ problem keeps reminding me that anything from small details to the very nature of the business could be changed on the whim of a chap in Mountain View. I feel like a character in Warren Ellis’ Trees – living in the shadow of this vast, unknowable edifice, which will periodically release a load of toxic gunge and kill everyone in the vicinity. Except they offer certification and have conferences every year.\n\n\nProblem solving\n\nOne of the things STEM graduates (and maths graduates in particular) often put on our CVs is that we’re good at problem-solving. This is, in one sense, true – we have to be good at solving the problems given to us by our lecturers, else we’ll fail the course. But in the more nebulous sense usually meant by the employer, it’s a bit more difficult to determine, since the way the subjects are taught most of the time doesn’t particularly incline the learner toward open-ended thinking about how to tackle problems, but rather strict adherence to certain methods. This is not necessarily to criticise the system, but rather to observe that when we do encounter problems of the genuine (as opposed to the contrived) variety – as I have been over the course of the last week – it’s rather a pleasant change of pace, and it allows one to exercise mental muscles that might otherwise go mostly unused.\n\nFor instance: one of our clients wanted a spreadsheet report that auto-updated in a few specific ways, so I had to try and puzzle out how to make everything work together in line with client requirements. One of the things was making it update monthly – but, specifically, to update only when the month had passed. There are doubtless many ways to do it, and I stumbled through several of them, including a messy agglomeration of if-statements that would return the number of days in the present month (which I then had to modify to give the number of days in the previous month, and it all ended up getting a bit messy and complex). In the end, I realised that I could just use the day of the month function I was already using to subtract from the present date, and that would always give me the last day of the previous month. It did everything I needed but without a bunch of unnecessary dependencies and in a single line – but I had to go through the process to get to that point, and the experience itself was useful and, if you can believe it, quite fun (which might say something about me, actually).\n\n\n“...and they pay me for it!”\n\nMy father asked me how my job was going the other day.\n\n“Brilliant!” I said. “I get to lounge around my room and mess around with spreadsheets and stuff all day!”\n\n“And they pay you for it…”\n\n“...and they pay me for it!”\n\nThey pay me to blog as well, which is a pretty sweet deal if you ask me. And on Friday afternoons, too. Lovely way to end the week"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/adams-analytics-adventure-week-1/#article",
      "headline": "Adam's Analytics Adventure: Week 1",
      "description": "\t\t\t<h1>Day One</h1>\n\n\nUpon alighting from the bus as I arrived for my first day of work, I found myself crossing the road next to a group with whom I immediately felt a degree of kinship – casually dressed (but not overly so), a scattering of black-plastic-rimmed glasses – the sort of people who, upon immediate visual inspection, you might peg as the employees of some kind of dotcom, web 2.0 startup. Such proved to be the case, in fact, as they all funneled into the shared office space where I w",
      "url": "https://www.measurelab.co.uk/insights/blog/adams-analytics-adventure-week-1/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/adams-analytics-adventure-week-1/#webpage"
      },
      "datePublished": "2014-07-04T16:11:28.000+00:00",
      "dateModified": "2026-01-27T17:30:54.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/2014-06-10-09-38-39-scaled.jpg",
      "author": {
        "@type": "Person",
        "name": "Adam Englebright",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Measurelab"
      ],
      "articleBody": "\t\t\t<h1>Day One</h1>\n\n\nUpon alighting from the bus as I arrived for my first day of work, I found myself crossing the road next to a group with whom I immediately felt a degree of kinship – casually dressed (but not overly so), a scattering of black-plastic-rimmed glasses – the sort of people who, upon immediate visual inspection, you might peg as the employees of some kind of dotcom, web 2.0 startup. Such proved to be the case, in fact, as they all funneled into the shared office space where I was about to start work. After entering myself, I was taken into an open-plan office, and offered the use of a desk with a balance ball to sit on. Aahhh. Here we go.\n\nAfter a cup of tea and a few minutes enjoying bouncing on the ball, Mark and Dara (my paymasters) arrived, handed me a box of business cards (subtle off white colouring, tasteful thickness, &c.&c.&c.) and took me out for coffee to explain what will be occupying my first few weeks here at Measurelab. A brief aside: this probably isn’t what Mark was expecting when he tasked me with recording my first few weeks on the job, familiarising myself with the tools of the digital analytics trade; however, I feel there’s a degree of value – and entertainment, hopefully – in including a narrative account of working for a small tech business as employee #1. With any luck, in a few years Yahoo1 will buy us and I can become a British Marco Arment and spend my time writing long posts about burr grinders or whatever. On the other hand, if it all goes to pot it’ll be something I can draw on for what will no doubt be a cracking post on Medium a couple of years down the line.\n\nAhem. Digital analytics, then. My background is more in the ‘analytics’ side of things – I’ve just finished a mathematics degree with quite a heavy statistical component – so the heavy lifting for me here will be familiarising myself with the tools and the lingo of the trade. Google Analytics appears to be the tool of choice for us here at Measurelab and (as near as I can tell) the digital analytics community as a whole, so I’ve been cracking on with the courses Google so thoughtfully provides, starting with the baby-steps basics of Digital Analytics Fundamentals. I’ve also been familiarising myself with some of the client work – seeing the company’s workflow, how everything slots together, and all the different tools and systems at we use – Google Docs for client-facing stuff, Trello for project management, Harvest for tracking time spent, and so on. Fortunately, I’m already familiar with these tools to a greater or lesser extent, which speeds things along somewhat.\n\nEventually, I’m going to have to take the Google Analytics Individual Qualification (turns out even if you think you’ve left full-time education behind you can never escape tests) but that’s not for a few weeks yet. So far I’ve completed the first few units and gained some basic grounding in the concepts of digital analytics.\n\n\nDays 2&3\n\nMeasurelab is a growing company – growing too large for the office space it currently shares with sister company Playlab, and moving to a new space at the beginning of September – which is to say I’m only in the office a few days a week. The rest of the time I’m working from my delightful home office (tr: ‘the part of my bedroom not occupied by bed or discarded clothes’) with support from Mark and Dara via Skype (talking to employers on Skype is a lot more chill than you might imagine). It seems like I stopped at quite an appropriate point on Day 1, as when I started again there followed a transition from the theory stuff to the process – ‘how do you get Google Analytics to do this’ rather than first principles ‘what is a dimension, what is a metric’ kind of stuff.\n\nBefore I started work,I said to a friend of mine that I suspected the job was going to get inside my head and end up changing the way I thought about the internet, and such is proving to be the case. For instance, have you ever looked up at the url bar and instead of a clean ‘.com’ or ‘.co.uk’ at the end of the address, seen some mess like “/?utm_medium=email&utm_source=email_signature&utm_campaign=email_adam&utm_content=email_signature_text”? I know what that means now2! It’s like being able to see the Matrix3. I find myself browsing to flashy dynamic websites that don’t paginate things and wondering just how they’ve got their event tracking implemented.\n\nThe courses are fairly straightforward, and I got ~70% on the final assessments, which, coming from an academic environment, is very good, but apparently I’m going to need to get 80%+ on the GAIQ. Erk. In my defense, the questions I got wrong were along the lines of ‘which of these are ways you can do x’, which I don’t usually think about in those terms, I just kinda do them. Still, have a bit of work to do before I’m ready for the GAIQ.\n\n\nDay 4\n\nHaving completed the courses, I was given access to some data and told to go hog-wild see whether I could draw useful conclusions in certain areas. I was also introduced to the Analytics addon for Google Docs, which is a godsend to someone like me because it allows me to drag the analytics data into the comforting environment of a spreadsheet, where I can make it jump through hoops.\n\nExploring the data was an interesting exercise. Some things are very immediately obvious – “you’re not getting any hits at all from Adwords”, for instance, really jumped out, but you have to drill down a bit more to get other insights. Introducing a new feature may look like it boosted goal conversion in the short-term, comparing it to the previous month, but it’s actually a decline compared to the same period last year… however, at that time, the goal might actually have been different, rendering such direct comparison useless.\n\nThere’s a lot to take in, a lot to think about. But it’s interesting, and sitting here on a balance ball, a gentle breeze coming in through the window to the sun-drenched brick courtyard outside, I can’t help but think I’m probably going to enjoy it here. Join me next week for the next thrilling installment of Adam’s Analytics Adventure. I might even can the chattiness and talk about some actual analytics stuff4!\n\n1. sorry, Yahoo!↩\n\n2. I stole this one from my email signature. It says it’s come from an email I sent, specifically the text in my email signature (there’s a separate url for the company logo picture).↩\n\n3. well, sort of.↩\n\n4. nah, it’s not happening↩"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/migrating-analytics-enhanced-e-commerce-reports-5-easy-steps/#article",
      "headline": "How to set up Google Analytics Enhanced Ecommerce (5 easy steps)",
      "description": "If you are anything like me, you will have seen the fandangled new “enhanced” e-commerce reports that are starting to become available in Google Analytics accounts (N.B. - Universal web properties only) and thought “yes, I’ll have some of that”.\n\nThe reports allow for much deeper analysis of shopping behaviour - to understand things like influence of product impressions on conversion - as well as providing much anticipated refund and voucher/ affiliate code support.\n\nIn the spirit of catchy blog",
      "url": "https://www.measurelab.co.uk/insights/blog/migrating-analytics-enhanced-e-commerce-reports-5-easy-steps/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/migrating-analytics-enhanced-e-commerce-reports-5-easy-steps/#webpage"
      },
      "datePublished": "2014-06-30T13:35:06.000+00:00",
      "dateModified": "2025-12-11T03:47:48.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/image01.png",
      "author": {
        "@type": "Person",
        "name": "Mark Rochefort",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Tag Manager",
        "Google Analytics",
        "Debugging",
        "Ecommerce",
        "How-to"
      ],
      "articleBody": "If you are anything like me, you will have seen the fandangled new “enhanced” e-commerce reports that are starting to become available in Google Analytics accounts (N.B. - Universal web properties only) and thought “yes, I’ll have some of that”.\n\nThe reports allow for much deeper analysis of shopping behaviour - to understand things like influence of product impressions on conversion - as well as providing much anticipated refund and voucher/ affiliate code support.\n\nIn the spirit of catchy blog titles, I’m describing five “easy” steps to setting this all up but, as we well know, things are never that straightforward! But with the steps outlined below you will be well on your way to using the new reports. It also has to be said that, at the time of writing, this feature is still in “beta”.\n\n\nStep 1) Universal Analytics / Google Tag Manager / dataLayer\n\nOkay, so this isn’t strictly the first step - it’s more of a prerequisite check to ensure your setup is as intended to align with the following steps.\n\nYou will need to be running Universal Analytics - inserted via Google Tag Manager - with the values for your existing e-commerce transactions being populated by values set in a dataLayer, according to the documentation for GTM and e-commerce. These steps detailed assume that you are already running things in this way and takes you through the process of migrating from this particular setup. As each setup is likely to be different, please check how this relates to you before stepping through the process.\n\n\nStep 2) Enable “Enhanced Ecommerce Settings”\n\nEnabling the reports is a simple matter of toggling a switch in the appropriate View:\n\nLeave the options to label your funnel steps for now - these will depend on what code you can place on the site for particular steps in the funnel and will be populated with the default values of “Step 1”, “Step 2”, etc.\n\nEnabling these reports hides the “old” style e-commerce reports and reveals the “enhanced” (beta) e-commerce reports in the left-hand navigation, under “Conversions”:\n\nIf you have already been collecting e-commerce data under this particular View, with the old style reports, then you will see that same data appear within the reports for Overview, Product Performance, and Sales Performance instead - with no values (yet) populated for things like refunds, and shopping behaviour:\n\n\nStep 3) Switch out e-commerce transaction code\n\nTo be able to send additional data to Analytics about a particular action, like a transaction, the call to Analytics needs to use the new Universal data model and e-commerce tracking API. This means that there’s an entirely new way of sending data to Analytics - that relies on a plugin called ec.js. Google Tag Manager makes it straightforward to enable this part of things - it is a check box provided to send such “actions” alongside events or pageviews:\n\nThis effectively writes the following code - after the initialisation of the tracker object but before any e-commerce specific code:\n\nga('require','ec','ec.js');\n\n\n\n\n\n\nNote that your existing Universal Analytics e-commerce code (that will rely on a plugin called ecommerce.js) will still work with the new reports but will not allow you to add any of the extra data now available to be added alongside transactions etc.If you send transactions to Analytics with the new ec.js methods, you should not be doing so with ecommerce.js as well as it will create duplicate transactions in the reports.\n\n\n\n\n\n\nWith the new model, you will be sending single “actions” (for impression data, product data, promotion data, and action data) to Analytics alongside pageviews or events. You will therefore need to remove the existing e-commerce transaction tag template in Google Tag Manager - that would previously have been using a dataLayer to populate the values for product items, revenue etc, and firing based on a rule for your thank-you page, for example.\n\nWhen you enable the “Enhanced Ecommerce Features” in Google Tag Manager, a checkbox is available to “Use data layer”.\n\nHowever, the syntax of the expected dataLayer values are completely different to the previous format required when implementing a tag with type of “transaction” in Google Tag Manager.\n\nIf you, like we have recommended for many of our clients, have recently migrated to Universal Analytics and Google Tag Manager - you will have added a dataLayer on your thank-you pages that is now no longer going to work with these new features when implementing with Google Tag Manager!\n\n\n\n\n\n\nIf you cannot update your dataLayer on the server-side, you will need to create a macro that “maps” the data from the previous dataLayer format into the new.\n\n\n\n\n\n\nHere’s the code for such a macro that is retrieving just the required fields and mapping them into an object in the format required by Google Tag Manager (thanks to +PhilPearce and +AlWightman for various flavours of code that contributed towards this): // A custom JavaScript macro that uses ecommerce dataLayer to return an ecommerceData object // in format required by Enhanced Ecommerce integration in GTM\n\nfunction() {\n\nvar eCommProducts = [];\nvar transProducts = {{dataLayer.transactionProducts}};\nfor (var i=0;i<transProducts.length;i++) {\neCommProducts.push({\n'id': transProducts[i].sku,\n'name': transProducts[i].name,\n'price': transProducts[i].price,\n'quantity': transProducts[i].quantity\n});\n}\n\nvar ecommerceData = {\n'ecommerce': {\n'currencyCode': {{dataLayer.transactionCurrency}},\n'purchase': {\n'actionField': {\n'id': {{dataLayer.transactionId}},\n'revenue': {{dataLayer.transactionTotal}}\n},\n'products': eCommProducts\n}\n}\n};\n\nreturn ecommerceData;\n}\n\n\n\n\n\n\n\nNote that this macro itself references other macros, used to retrieve specific dataLayer values. You will need to create these too.\nHopefully it is obvious from the names used within the code what they should be!\n\n\n\n\n\n\nIn the debug console, you should see now the transaction data being sent as part of your pageview - instead of a separate transaction / item level hit:\n\n\nStep 4) Add funnel steps, refunds etc\n\nHere’s where things get interesting… Obviously this will depend on your exact setup but let’s look at adding Funnel Steps, as an example.\n\nWe will create another pageview tag, check the “use data layer” but have the pageview tag fire on the gtm.load event - so that we can run a little script before hand to create our required dataLayer (assuming we can’t create it server-side). And the script to run is a custom HTML tag that contains a piece of Javascript to push to the dataLayer the appropriate values (in this case just a number for the funnel step - which is actually determined by a Lookup Table macro that uses URL path):\n\n// <![CDATA[ /** * A generic script to create a dataLayer in the required format for funnel steps etc * created before ecommerce data has been sent to Google Analytics. */ dataLayer.push({ 'event': 'checkout', 'ecommerce': { 'checkout': { 'actionField': {'step': {{Checkout funnel steps}}} } } }); // ]]>\n\nAnd then look out for this in the debug console:\n\n\nNow go back and add the labels for these steps.\n\nThis is the simplest example I could think of to demonstrate how to send data alongside a pageview / event call to Analytics, within Google Tag Manager. I’m imagining all sorts of uses and implementations - please don’t take anything in this step as prescriptive. It is merely intended as an example to get you thinking.\n\n\nStep 5) Start using reports\n\nNeed I say more? Start using these fancy new reports to better understand how your users are behaving for the complete e-commerce purchase cycle - and help your clients sell more stuff :)\n\nI’d love to hear your feedback on how you are finding implementing the new enhanced e-commerce code and reports. Add your comments below!"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/universal-analytics-beta-now-brightonseo-talk-slides/#article",
      "headline": "Universal Analytics is out of Beta... So What Now? #brightonseo talk slides",
      "description": "\t\t\tYesterday, at BrightonSEO, <a href=\"http://measurelab2.wpengine.com/blog/author/dara/\">Dara</a>&nbsp;(our Analytics Director) gave a talk on the state of Universal Analytics now that it is out of beta. It was well received by all (see Twitter feed below). Here's the slides (on <a href=\"http://www.slideshare.net/darafitzgerald/universal-analytics-out-of-beta-brightonseo\" target=\"_blank\" rel=\"noopener noreferrer\">Slideshare</a>) from the presentation in case you missed it or wanted to view them",
      "url": "https://www.measurelab.co.uk/insights/blog/universal-analytics-beta-now-brightonseo-talk-slides/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/universal-analytics-beta-now-brightonseo-talk-slides/#webpage"
      },
      "datePublished": "2014-04-25T11:41:12.000+00:00",
      "dateModified": "2026-01-22T10:59:17.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/darafitzgerald_universal_analytics_brightonseo_april2014.jpg",
      "author": {
        "@type": "Person",
        "name": "Mark Rochefort",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "articleBody": "\t\t\tYesterday, at BrightonSEO, <a href=\"http://measurelab2.wpengine.com/blog/author/dara/\">Dara</a>&nbsp;(our Analytics Director) gave a talk on the state of Universal Analytics now that it is out of beta. It was well received by all (see Twitter feed below). Here's the slides (on <a href=\"http://www.slideshare.net/darafitzgerald/universal-analytics-out-of-beta-brightonseo\" target=\"_blank\" rel=\"noopener noreferrer\">Slideshare</a>) from the presentation in case you missed it or wanted to view them again:\n\n\nAfter about 18 months in beta, Universal Analytics is now fully available with complete feature parity compared to Classic GA. This presentation runs through the current state of play with Universal, the key benefits to us as marketers and practical examples of how to start making the most of the new tracking library.\n\n\nTwitter feed from #BrightonSEO\n\nLoved @darafitzgerald's talk on Universal Analytics. Third time seeing him talk and by far one of my favourite speakers! #brightonseo\n\n\n— Gemma Holloway (@koozai_gemma) April 24, 2014\n\n\n\n\none great (informative and very useful) talk from @darafitzgerald about Universal Analytics #brightonseo\n\n\n— Joanna Langier (@JoannaLangier) April 24, 2014\n\n\n\n\n@darafitzgerald that talk at Brighton seo was great! Definitely encapsulated key things people need to know\n\n\n— Guy Andrews (@Guy_Andrews) April 24, 2014\n\n\n\n\nReally useful Universal Analytics talk by @darafitzgerald just now, thank you! #brightonseo\n\n\n— Victoria Taylor (@major_look_) April 24, 2014\n\n\n\n\nUseful talk on Universal Analytics from @darafitzgerald at #brightonseo. Thanks!\n\n\n— Kirsten Shaw (@ContentKaizen) April 24, 2014\n\n\n\n\nGo @darafitzgerald #brightonseo pic.twitter.com/LvnWl1Zn6A\n\n\n— Sara Mac (@sara__mac) April 24, 2014\n\n\n\n\n'Dara' autocorrects to 'Data' seems to make a bit of sense cc @darafitzgerald #brightonseo\n\n\n— Mark Fleming (@MarkFlemingUK) April 24, 2014"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/universal-analytics-beta-brightonseo-talk/#article",
      "headline": "Universal Analytics is out of Beta...BrightonSEO talk (coming up)",
      "description": "\t\t\tIn line with the announcement on Wednesday that Universal Analytics is <a href=\"http://analytics.blogspot.co.uk/2014/04/universal-analytics-out-of-beta-into.html\" target=\"_blank\" rel=\"noopener noreferrer\">coming out of Beta</a>, I changed my upcoming talk at <a href=\"http://www.brightonseo.com/agenda-2/\" target=\"_blank\" rel=\"noopener noreferrer\">BrightonSEO</a> to focus entirely on this.\n\n\nWhen I spoke at events previously about Universal Analytics, there was still a lack of parity with Class",
      "url": "https://www.measurelab.co.uk/insights/blog/universal-analytics-beta-brightonseo-talk/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/universal-analytics-beta-brightonseo-talk/#webpage"
      },
      "datePublished": "2014-04-04T16:17:07.000+00:00",
      "dateModified": "2026-01-27T17:29:18.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/universal-analytics.png",
      "author": {
        "@type": "Person",
        "name": "Dara Fitzgerald",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics"
      ],
      "articleBody": "\t\t\tIn line with the announcement on Wednesday that Universal Analytics is <a href=\"http://analytics.blogspot.co.uk/2014/04/universal-analytics-out-of-beta-into.html\" target=\"_blank\" rel=\"noopener noreferrer\">coming out of Beta</a>, I changed my upcoming talk at <a href=\"http://www.brightonseo.com/agenda-2/\" target=\"_blank\" rel=\"noopener noreferrer\">BrightonSEO</a> to focus entirely on this.\n\n\nWhen I spoke at events previously about Universal Analytics, there was still a lack of parity with Classic GA and many of the benefits were yet to be fully explored and documented. So this time around, I will be providing an overview of the current state of play with Universal Analytics and giving some practical examples of how to take full advantage of the new tracking library.\n\nFor anyone who can’t make it to BrightonSEO, rest assured I will be sharing the slides afterwards here on our blog and on Twitter."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/import-cost-data-ga-new-free-uploader/#article",
      "headline": "Import your Cost Data to GA with our new (Free!) Uploader",
      "description": "\t\t\t<blockquote>Please note that this app is no longer relevant as Google have provided their own cost uploader tool!</blockquote>\n\n\nGA has long since allowed you to import AdWords cost data with a few simple button clicks. However other cost data - Bing/Yahoo paid search activity, affiliate marketing, email, Facebook advertising, etc. - were not catered for until about 18 months ago when GA released the Cost Data Import tool in beta.\n\nThis Cost Data Import tool, which feeds data into a new repor",
      "url": "https://www.measurelab.co.uk/insights/blog/import-cost-data-ga-new-free-uploader/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/import-cost-data-ga-new-free-uploader/#webpage"
      },
      "datePublished": "2014-04-04T15:40:19.000+00:00",
      "dateModified": "2026-01-27T17:29:04.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/screen-shot-2014-04-04-at-16-22-30.png",
      "author": {
        "@type": "Person",
        "name": "Dara Fitzgerald",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Ads"
      ],
      "articleBody": "\t\t\t<blockquote>Please note that this app is no longer relevant as Google have provided their own cost uploader tool!</blockquote>\n\n\nGA has long since allowed you to import AdWords cost data with a few simple button clicks. However other cost data - Bing/Yahoo paid search activity, affiliate marketing, email, Facebook advertising, etc. - were not catered for until about 18 months ago when GA released the Cost Data Import tool in beta.\n\nThis Cost Data Import tool, which feeds data into a new report in GA called Cost Analysis and also into the Attribution Modelling Tool, was a welcome release but it is not quite straightforward for all users to actually make use of it. As a result a lot of people we speak to have not been able to take advantage of this feature yet. This is because the upload needs to be performed via a self-service API, rather than simply being able to upload a CSV within the GA interface.\n\nA number of independent solutions have been created since the release of the Cost Data Import tool but at Measurelab we like to have more control over the tools we use wherever possible... so we created our own. This allows you to batch upload your cost data in a single CSV file, which can contain costs, click volumes and impressions for any channel, campaign or even keyword.\n\nThe CSV does need to be formatted correctly and the official Google documentation for the Cost Data Upload tool can be found here. More importantly though, the Measurelab Cost Upload tool, allowing you to easily import your cost data into GA without needing to worry about APIs, can be found at costuploader.measurelab.co.uk. All we ask for in return for access to this is your email address - a small price to pay :)\n\nWe welcome feedback on this so please email us at hello@measurelab.co.uk with any comments or suggestions about our Cost Uploader."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/brightonanalytics/#article",
      "headline": "#brightonanalytics",
      "description": "\t\t\t<blockquote class=\"twitter-tweet\" lang=\"en\">We're kicking off <a href=\"https://twitter.com/search?q=%23brightonanalytics&amp;src=hash\">#brightonanalytics</a> again - Thurs 3rd April from 6.30pm in the Evening Star. Pass it on all you <a href=\"https://twitter.com/search?q=%23measure&amp;src=hash\">#measure</a> types in <a href=\"https://twitter.com/search?q=%23brighton&amp;src=hash\">#brighton</a>\n\n\n— measurelab (@measurelab) March 25, 2014\n\n\nMore at Brighton Analytics",
      "url": "https://www.measurelab.co.uk/insights/blog/brightonanalytics/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/brightonanalytics/#webpage"
      },
      "datePublished": "2014-03-25T15:52:09.000+00:00",
      "dateModified": "2026-01-22T10:59:37.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/brighton-analytics.png",
      "author": {
        "@type": "Person",
        "name": "Mark Rochefort",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Measurelab"
      ],
      "articleBody": "\t\t\t<blockquote class=\"twitter-tweet\" lang=\"en\">We're kicking off <a href=\"https://twitter.com/search?q=%23brightonanalytics&amp;src=hash\">#brightonanalytics</a> again - Thurs 3rd April from 6.30pm in the Evening Star. Pass it on all you <a href=\"https://twitter.com/search?q=%23measure&amp;src=hash\">#measure</a> types in <a href=\"https://twitter.com/search?q=%23brighton&amp;src=hash\">#brighton</a>\n\n\n— measurelab (@measurelab) March 25, 2014\n\n\nMore at Brighton Analytics"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/creating-effective-measurement-plan/#article",
      "headline": "Creating an effective Measurement Plan",
      "description": "\t\t\tWhen helping clients with their analytics implementations, we often run Measurement Planning workshops - bringing together stakeholders to better understand their measurement requirements. This video (part of the excellent <a href=\"https://analyticsacademy.withgoogle.com/\">Analytics Academy</a> series) demonstrates a typical measurement planning and implementation process - closely aligned to the <a href=\"http://measurelab2.wpengine.com/blog/analytics-planning-is-at-the-heart-of-a-truly-measu",
      "url": "https://www.measurelab.co.uk/insights/blog/creating-effective-measurement-plan/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/creating-effective-measurement-plan/#webpage"
      },
      "datePublished": "2014-01-17T10:16:32.000+00:00",
      "dateModified": "2026-01-22T10:59:55.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/measurement_planning.png",
      "author": {
        "@type": "Person",
        "name": "Mark Rochefort",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "How-to"
      ],
      "articleBody": "\t\t\tWhen helping clients with their analytics implementations, we often run Measurement Planning workshops - bringing together stakeholders to better understand their measurement requirements. This video (part of the excellent <a href=\"https://analyticsacademy.withgoogle.com/\">Analytics Academy</a> series) demonstrates a typical measurement planning and implementation process - closely aligned to the <a href=\"http://measurelab2.wpengine.com/blog/analytics-planning-is-at-the-heart-of-a-truly-measurable-digital-strategy/\">analytics planning</a> approach we take - and usefully outlines some of the things to expect along the way.\n"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/useful-tags-macros-rules-google-analytics-event-tracking-google-tag-manager/#article",
      "headline": "Google Tag Manager auto-event tracking - useful Tags, Macros and Rules for Google Analytics events",
      "description": "\t\t\tThe recent introduction of <a href=\"http://analytics.blogspot.co.uk/2013/10/no-code-required-auto-event-tracking.html\" target=\"_blank\" rel=\"noopener noreferrer\">auto-event tracking</a>&nbsp;for <a href=\"http://www.google.com/tagmanager/\" target=\"_blank\" rel=\"noopener noreferrer\">Google Tag Manager</a>&nbsp;was a welcome piece of news for many of us keen to remove custom jQuery from within the container. But it quickly became apparent that, to make real use of the auto-event tracking feature, ",
      "url": "https://www.measurelab.co.uk/insights/blog/useful-tags-macros-rules-google-analytics-event-tracking-google-tag-manager/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/useful-tags-macros-rules-google-analytics-event-tracking-google-tag-manager/#webpage"
      },
      "datePublished": "2013-11-25T21:32:52.000+00:00",
      "dateModified": "2025-07-31T20:44:23.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/gtm.png",
      "author": {
        "@type": "Person",
        "name": "Mark Rochefort",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Google Tag Manager"
      ],
      "articleBody": "\t\t\tThe recent introduction of <a href=\"http://analytics.blogspot.co.uk/2013/10/no-code-required-auto-event-tracking.html\" target=\"_blank\" rel=\"noopener noreferrer\">auto-event tracking</a>&nbsp;for <a href=\"http://www.google.com/tagmanager/\" target=\"_blank\" rel=\"noopener noreferrer\">Google Tag Manager</a>&nbsp;was a welcome piece of news for many of us keen to remove custom jQuery from within the container. But it quickly became apparent that, to make real use of the auto-event tracking feature, a few hoops needed to be jumped through - to get things just as one might expect. Over the last few weeks, we've started to repeat certain implementations - particularly for GA event tracking - and so I thought I'd share these here. The three common GA events being - outbound link tracking, file download tracking and form submission tracking.&nbsp;In putting together these, I came across &nbsp;a&nbsp;<a href=\"http://www.fourthsource.com/web-development/google-tag-manager-series-4-tips-tricks-setting-google-analytics-implementation-google-tag-manager-16156\" target=\"_blank\" rel=\"noopener noreferrer\">similar recent post from Rachel Sweeney</a>&nbsp;(thanks Rachel!) - you will notice some overlap:\n\n\n\nMacros\n\nMacro Name: getDomain Macro Type: URL Component: hostname (tick strip \"www\") What this does:  Returns hostname without www (there's already a default one called \"url hostname\" - leave this as it will also come in handy, although you might want to rename it to getFullDomain or something)\n\nMacro Name: getFilename\nMacro Type: Custom JavaScript\nCustom JavaScript:\n\nfunction() { var fileName = {{gtm.elementUrl}}.split('?').shift().split('/').pop(); return fileName.toLowerCase(); }\n\nWhat this does:  Removes query strings, searches for the last slash, keeps everything after it. Returns a clean document filename and extension.\n\nMacro Name: getFiletype\nMacro Type: Custom JavaScript\nCustom JavaScript:\n\nfunction() { var extension = (/[.]/.exec({{getFilename}})) ? /[^.]+$/.exec({{getFilename}}) : undefined; return extension; }\n\nWhat this does:  Uses our getFilename macro and some regex to grab file extension and return.\n\nMacro Name: isOutboundUrl\nMacro Type: Custom JavaScript\nCustom JavaScript:\n\nfunction(){ return ( ({{gtm.elementUrl}}.match(/^https?\\:/i)) && ({{gtm.elementUrl}}.indexOf(\"{{getDomain}}\")<0) ); }\n\nWhat this does:  Returns true if link starts with http or https AND link does not contain current hostname (sub-domains included) - otherwise returns false.\n\nMacro Name: gtm.elementUrl\nMacro Type: Auto-Event Variable\nVariable Type:\nElement URL\nWhat this does:  The value is determined by reading the 'gtm.elementUrl' key from the data layer. If populated by an Auto-Event, the result will be the 'href' or 'action' attribute of the DOM element that triggered the event, depending on the type of element.\n\nMacro Name: gtm.elementId\nMacro Type: Auto-Event Variable\nVariable Type:\nElement ID\nWhat this does:  The value is determined by reading the 'gtm.elementId' key from the data layer. If populated by an Auto-Event, the result will be the 'id' attribute of the DOM element that triggered the event.\n\n\nRULES\n\nRule Name: event is form submit Conditions:{{event}} equals gtm.formSubmit\n\nRule Name: event is link clicked to download file\nConditions:\n{{gtm.elementUrl}} matches RegEx (ignore case) .(txt|svg|png|jpg|eps|vsd|mov|avi|wmv|zip|rar|exe|pdf|doc*|xls*|ppt*|mp3)$\nAND\n{{event}} equals gtm.linkClick\n\nRule Name: event is link clicked to outbound\nConditions:\n{{event}} equals gtm.linkClick\nAND\n{{isOutboundUrl}} equals true\n\n\nTAGS\n\nTag name: GA auto-events - Form submitted Tag type: Google Analytics Track Type: Event - category: Form- action: submitted: {{gtm.elementId}}- label: on: {{url}}Firing rules: event is form submit\n\nTag name: GA auto-events - Download links\nTag type: Google Analytics\nTrack Type: Event\n\n * category: Download\n * action: type: {{getFiletype}}\n * label: file: {{getFilename}}\n   Firing rules: event is link clicked to download file\n   Notes: bug in GTM currently prevent these macros from being used on their own in event tracking fields. Adding a string prefix (like “type: “) seems to fix that\n\nTag name: GA auto-events - Outbound links\nTag type: Google Analytics\nTrack Type: Event\n\n * category: Outbound\n * action: link: {{gtm.elementUrl}}\n * label: on: {{url}}\n   Firing rules: event is link clicked to outbound"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/analytics-planning-is-at-the-heart-of-a-truly-measurable-digital-strategy/#article",
      "headline": "Analytics planning: the heart of a truly measurable digital strategy",
      "description": "Google Analytics is free and that’s a wonderful thing. But it does mean people can often undervalue the reports and the benefits that a truly structured approach to analytics brings to a business.\n\nSadly, more often than not, a developer or webmaster adds the default Google Analytics tracking code to a website and leaves it at that. Trawling through the reports to find any kind of insight is left up to an analyst or marketing executive – who, later, attempts to find some kind of meaning in this ",
      "url": "https://www.measurelab.co.uk/insights/blog/analytics-planning-is-at-the-heart-of-a-truly-measurable-digital-strategy/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/analytics-planning-is-at-the-heart-of-a-truly-measurable-digital-strategy/#webpage"
      },
      "datePublished": "2013-11-21T14:41:45.000+00:00",
      "dateModified": "2026-01-27T11:25:09.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/tube_map_planning.png",
      "author": {
        "@type": "Person",
        "name": "Mark Rochefort",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics"
      ],
      "articleBody": "Google Analytics is free and that’s a wonderful thing. But it does mean people can often undervalue the reports and the benefits that a truly structured approach to analytics brings to a business.\n\nSadly, more often than not, a developer or webmaster adds the default Google Analytics tracking code to a website and leaves it at that. Trawling through the reports to find any kind of insight is left up to an analyst or marketing executive – who, later, attempts to find some kind of meaning in this sea of data – without any understanding of the overall business strategy.\n\nHaving worked with companies of all sizes, I’ve consistently seen this lack of planning as a major roadblock to the success of an analytics implementation – which, in turn, affects the visibility you have around your digital strategy. Without an understanding of business goals and distilling these into KPIs that can be used to measure them, you have no targets – and you have no clarity on the way forward. To put it simply – analytics planning is at the heart of a truly measurable digital strategy.\n\nAt Measurelab we follow a tried and tested process that places a Measurement Framework at the centre of your digital strategies. This Measurement Framework is based on work from Stéphane Hamel’s research paper titled The Web Analytics Maturity Model, where we ask the following questions:\n\n\n1) Overall business strategy\n\nWhat is your business or organisation trying to accomplish? How does your website contribute to this?\n\n\n2) Goals and objectives\n\nWhat are the short and long term objectives to achieve the strategy?\n\n\n3) Key business drivers\n\nWhat are the important execution steps to meet the goals & objectives?\n\n\n4) Key Performance Indicators\n\nWhat measures of success are tied to the drivers?\n\n\n5) Supporting metrics\n\nWhat are the detailed measures that feed and augment the KPIs?\n\nWorking through these questions with you, we are able to develop a Measurement Framework for your digital strategy – consisting of Goals, KPIs, and Targets, among other things. With web analytics providing the basis for our insights and recommendations, we are then able to continually enhance your site based on these measurable objectives. This ongoing process should apply not only to the traditionally more marketing-led area of conversion optimisation but to your entire business strategy.\n\nIt is important to identify goals, with attributable value, throughout the site that reflect the business objectives. Typically these are “conversions” – like a lead acquisition or a sale – but can also be attributed to softer objectives, such as an improved user experience or increased perception of the brand. We call these Macro and Micro Conversions – where Macro Conversions often reflect revenue and Micro Conversions reflect more nebulous factors like “engagement”. By identifying measurable goals for all our business objectives, we can be sure to distilling the essence of your ongoing digital strategies into a Measurement Framework that is a point of continued reference for the evolution of your website.\n\nSo – get in touch today to talk about how we can help bring some structure to your analytics planning and start to see measurable success in your digital strategy and ongoing website enhancement."
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/ga-segment-builder-cart-abandonment-screencast/#article",
      "headline": "Cart Abandonment Segments - GA Screencast",
      "description": "\t\t\tThe new segment builder in GA (available to all users now!) offers one major improvement to the previous Advanced Segments feature. It was previously possible to segment based on visit data only, which made cross-session segmentation and analysis impossible by default.\n\n\nThe new segment builder allows conditions and sequences to be defined based on both visit\n\nand\n\nuser data. This takes segmentation in GA from being an underused and limited feature to being a swiss army knife for intelligent ",
      "url": "https://www.measurelab.co.uk/insights/blog/ga-segment-builder-cart-abandonment-screencast/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/ga-segment-builder-cart-abandonment-screencast/#webpage"
      },
      "datePublished": "2013-11-14T15:46:21.000+00:00",
      "dateModified": "2025-11-17T14:18:02.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/2013-11-18_23-02-45.png",
      "author": {
        "@type": "Person",
        "name": "Dara Fitzgerald",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Ecommerce"
      ],
      "articleBody": "\t\t\tThe new segment builder in GA (available to all users now!) offers one major improvement to the previous Advanced Segments feature. It was previously possible to segment based on visit data only, which made cross-session segmentation and analysis impossible by default.\n\n\nThe new segment builder allows conditions and sequences to be defined based on both visit\n\nand\n\nuser data. This takes segmentation in GA from being an underused and limited feature to being a swiss army knife for intelligent analysis.\n\nOne of my own favourite use cases for the new segment builder is for cart abandonment analysis. In the following screencast I run through the process for creating two different types of cart abandonment segments.\n\nBelow the video there are links to the segments I create in the screencast for you to import and use for yourself.\n\nCart abandonment (visit)Cart abandonment (user)\n\nPlease note: these segments assume the URL for the cart page on your site contains /cart. If this is not the case you will need to edit the conditions in both segments to suit your actual cart URL.\n\nTo get your hands on exclusive free assets including additional user segments, why not sign up for our email updates?"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/google-tag-manager-migrate-jquery-based-event-listeners-gtm-auto-event-listeners/#article",
      "headline": "Migrate jQuery event listeners to GTM auto‑event listeners: a better way",
      "description": "Tag Containers are great. In a former life I was developer and I can really appreciate how much help they can be to people wanting to just add a \"bit of code\" to a website. But, as said former developer, I can also appreciate what a potential disaster it is to give the marketing guys the ability to add code to a website - outside of your carefully considered source control mechanisms and deployment routines. So - the recent announcement (there's quite a few on that link) from the team at Google ",
      "url": "https://www.measurelab.co.uk/insights/blog/google-tag-manager-migrate-jquery-based-event-listeners-gtm-auto-event-listeners/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/google-tag-manager-migrate-jquery-based-event-listeners-gtm-auto-event-listeners/#webpage"
      },
      "datePublished": "2013-10-10T19:36:08.000+00:00",
      "dateModified": "2025-12-10T02:38:10.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/41dfe3d59d8c0255877cf71a20c8cf19-jpeg.jpg",
      "author": {
        "@type": "Person",
        "name": "Mark Rochefort",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Google Tag Manager",
        "Debugging"
      ],
      "articleBody": "Tag Containers are great. In a former life I was developer and I can really appreciate how much help they can be to people wanting to just add a \"bit of code\" to a website. But, as said former developer, I can also appreciate what a potential disaster it is to give the marketing guys the ability to add code to a website - outside of your carefully considered source control mechanisms and deployment routines. So - the recent announcement (there's quite a few on that link) from the team at Google Analytics concerning auto-event tracking (also see this summary post) in Google Tag Manager was a welcome one then. It promises to reduce the reliance on coding within Google Tag Manager - particularly if you are adding tags that require event binding / listeners that many would have used jQuery to implement. It's not perfect - but, as we should all know by now, Google Tag Manager is a work in progress. Particularly, I would like to see a more visual DOM element selector (nod to Satellite's \"Rover\", now Adobe's Dynamic Tag Management) and continual onsite error checking (nod to BrightTag). But - it really is getting there.\n\nWell - we have a big button on our site that was using jQuery to send click events into Google Analytics:\n\nThe jQuery that binds the required event listeners to clicks on this were coded directly into Google Tag Manager looked like this:\n\nAs you can see - this is pushing name / value pairs into the dataLayer JSON object - which in turn is monitored rules that trigger Google Analytics Event Tracking code, using macros to extract the required parameters:\n\nHow you have set things up will be different to the above, of course. But hopefully you can see that there's already a level of abstraction going on with the use of the dataLayer JSON object acting as our controller - and that the anomaly in the set up is the existence of the jQuery to do the event binding in the first place.\n\nThe presence of javascript code here disturbs me - as it sits outside of any of our procedures used for quality control. Especially as all we are looking to do is bind an event listener to a click event! Enter Auto Event Listeners… how do we do it?\n\n\n1) Create click listener tag\n\nThe first step then is to create a tag that starts to listen for all types of clicks, when fired. Given we want to listen for all potential clicks on all elements on all our pages - we select “click listener” as the Tag Type and simply set it to fire on all pages:\n\nNB - the element we want to be tracking clicks on is a button, without a true link or URL.\n\n\n2) Create Rules\n\nTo correspond with the jQuery, we need to create rules that match against the conditions required. In our case we are matching on the when there is a “click” event pushed to the dataLayer AND when the class of the element clicked contains “quote-now”. So that would be {{event}} equals gtm.click AND where {{element classes}} contains quote-now. To make this a bit more complicated for this post, we’ve actually re-named the macros to identify them more easily in GTM:\n\nBut hopefully you get the point!\n\n\n3) Google Analytics Event Tracking\n\nFinally we want to add replace our event tracking. So that instead of pushing to the dataLayer on click, as we did in jQuery - we can use the event tracking tag directly:\n\n\n4) Preview / debug / publish\n\nBish bash bosh...\n\nAny questions?"
    },
    {
      "@type": "BlogPosting",
      "@id": "https://www.measurelab.co.uk/insights/blog/ga-steams-ahead-updates-gasummit-2013/#article",
      "headline": "GA Summit 2013: Key Google Analytics updates & insights",
      "description": "The theme of this years summit is a focus on helping customers in three areas: Access, Empower, Act. The slide above was shown by the GA team to summarise the 3 part theme.\n\nBabak Pahlavan (Director of Product Management, Google Analytics) let the crowd know that GA have made 70+ releases in 2013 so far, which makes sense on reflection given how busy the year has been. This has included major updates such as the global roll out of Universal Analytics, the introduction of the Attribution Modellin",
      "url": "https://www.measurelab.co.uk/insights/blog/ga-steams-ahead-updates-gasummit-2013/",
      "mainEntityOfPage": {
        "@id": "https://www.measurelab.co.uk/insights/blog/ga-steams-ahead-updates-gasummit-2013/#webpage"
      },
      "datePublished": "2013-10-02T22:37:24.000+00:00",
      "dateModified": "2025-12-11T04:22:13.000+00:00",
      "image": "https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2025/07/2013-10-01_18-10-29.png",
      "author": {
        "@type": "Person",
        "name": "Dara Fitzgerald",
        "worksFor": {
          "@id": "https://www.measurelab.co.uk/#organization"
        }
      },
      "publisher": {
        "@id": "https://www.measurelab.co.uk/#organization"
      },
      "isPartOf": {
        "@id": "https://www.measurelab.co.uk/#website"
      },
      "inLanguage": "en-GB",
      "keywords": [
        "Google Analytics",
        "Google Tag Manager",
        "Data Analysis",
        "How-to"
      ],
      "articleBody": "The theme of this years summit is a focus on helping customers in three areas: Access, Empower, Act. The slide above was shown by the GA team to summarise the 3 part theme.\n\nBabak Pahlavan (Director of Product Management, Google Analytics) let the crowd know that GA have made 70+ releases in 2013 so far, which makes sense on reflection given how busy the year has been. This has included major updates such as the global roll out of Universal Analytics, the introduction of the Attribution Modelling Tool to standard GA accounts and improved User Access Controls. Babak then announced that he had a further 14 announcements to make.\n\n\nAuto-event tracking in Google Tag Manager\n\nThe first I will cover in this post is the release of auto-event tracking in Google Tag Manager (GTM). Previously event tracking via GTM has required either hard coding of elements on pages to place the event data into the dataLayer and push to GTM, or custom jquery to identify elements using DOM attributes and then track as events in GA. With this release, it is now possible to add event listener tags in GTM (including click listener, form submit listener, link click listener and timer listener). When these tags are fired, GTM begins listening for the type of action corresponding to the listener tag selected (i.e. any click, form submit, link click or time based intervals). Taking the click listener as an example, when a click occurs, a GTM event gtm.click is generated. You can then check for this event in rule conditions, using {{event}} equals gtm.click. To check whether a specific element was clicked, such as the “add to cart” button, you can add a rule like {{element id}} equals addToCart.\n\nThis is a welcome release for keen users of Google Tag Manager who want more flexibility and control in terms of adding event tracking on the fly without requiring on site code changes.\n\n\nGA Premium SLA extension for Google Tag Manager (GTM)\n\nSticking with GTM, Babak also announced an SLA extension for GA Premium customers to cover Google Tag Manager. This is expected to roll out to Premium customers during Q4 of this year. This SLA expansion is a logical move to reassure Premium customers that Google Tag Manager is up to the task of managing their analytics implementation and with Google’s powerful infrastructure behind it - along with regular improvements to the container system itself (e.g. the recent support of document.write tags and the brand new auto-event tracking covered above) – this may well give other tag management providers something to worry about.\n\n\nUniversal Analytics upgrade option\n\nUniversal Analytics was announced at last year’s summit and has been available in BETA for all GA accounts since Q2 2013. The advice up to this point has been for existing GA users to run a Universal Analytics web property in parallel to their existing GA property if they are interested in exploring the possibilities with Universal (e.g. custom dimensions & metrics). For those creating new web properties (e.g. for a new website) then Universal Analytics has been recommended.\n\nHowever Universal Analytics does not support all features available in standard GA, most notably content experiments and the remarketing integration. Although these features are still not supported (hopefully coming soon), the good news is GA are soon to release an upgrade option for existing GA properties. This will allow GA users to upgrade existing web properties to Universal Analytics without losing historical data. Another feature of Universal Analytics which is hopefully due in the near future is the visitor ID override. This will enable cross device/browser tracking capabilities on sites featuring a user log in.\n\n\nAudience Reporting (including demographics)\n\nAnother one of my favourite announcements is the introduction of user demographics in the new Audience Reports. Although there has been a ‘Demographics’ report category in GA for some time, this has to date only included language (actually browser language settings) and geographical location information. This announcement was exciting as age, gender and interest data will soon be included to allow you to gain a better understanding of your most valuable user segments, and in turn target these segments through the Google Display Network. In addition to this data appearing within the new Audience Reports, it will also be possible to use this in the new Unified Segments (see below) and in Remarketing Lists.\n\n\nUnified Segments\n\nAdvanced Segments have been an incredible (yet often underused!) feature of GA for some time now. However one notable limitation has been the fact that segments were based on visit (or session) data only. As mentioned above regarding audience demographics, it is important for marketers to be able to understand which audience segments are of most value to them so they can spend effectively at acquiring and retaining these profitable user groups. Furthermore Universal Analytics promises to shift the perspective from session-centric to user-centric (a very welcome change indeed). In line with this shift to a user-centric view, the new Unified Segments allow segments to be created based on user behaviour data. Taking this a step further, it is also possible to build very clever, sequential and cross-session segments to really hone in on a granular level. Proper audience segmentation is the key to nailing your customer acquisition strategies and optimising for lifetime value.\n\n\nAcquisition, Behaviours, Conversions (ABCs)\n\nThe Traffic Source reports are undergoing a complete revamp in line with a name change to ‘Acquisition’. The new Acquisition report category will aim to make the data more intuitive and group metrics into 3 key groups: acquisition, behaviours and conversions (or ABCs). The following sneak preview was shared on the official GA blog.\n\nIn addition to the renaming and the categorisation of key user metrics to reflect the ABC cycle, this update will also make channel tracking more flexible.\n\n\nEnterprise APIs\n\nGA recently rolled out the new User Access controls, improving the level of control account owners have over users. This introduced additional access levels and also allows access to be granted on 3 levels: account, property and view (formerly called profile). GA are taking this one step further with the announcement of a new User Permissions API. This is aimed at large companies to allow easy management of permissions across all accounts but not only that, these enterprise APIs will also allow programmatic control of account configuration. These features are currently in closed beta but access can be requested from the APIs for Large Companies page.\n\n\nGA Premium BigQuery Integration\n\nAnother update for GA Premium customers is the upcoming BigQuery integration. This will allow Premium users to access unsampled session and hit level data from GA within Google BigQuery, a web service for analysing huge datasets (up to trillions of rows). To encourage use of this integration, GA will also be offering $500 monthly credit for BigQuery to Premium customers.\n\n\nOther Integrations\n\nTwo other integrations announced are Doubleclick Campaign Manager (formerly DFA) and Google Play. The DCM integration will bring more impression data into GA. Aside from the benefit of having this data in GA to compare against other channel metrics, a positive knock-on effect of this additional data is that it can help reach the minimum data requirements for data-driven attribution modelling (data-driven models are a Premium only feature unfortunately at present).\n\nThe Google Play integration will complete the picture for measuring and analysing app users. This is the first and only way to see the complete view of user acquisition from views and clicks in the Google Play store to installs and active users of your apps.\n\n\nAnalytics Academy\n\nAll announcements covered above relate to new and/or improved features of GA but as mentioned at the beginning, with 70+ releases already in 2013 plus these additional updates, the evolution of GA is a constantly moving beast. For dedicated analysts who are using GA every day, these changes are responding to requests from the industry as a whole making it an exciting time to be in analytics. However for marketers, execs and business owners it is becoming increasing difficult to keep up with the speed of change in GA.\n\nTherefore the final two updates I will cover in this post relate to product education. Within the interface itself you will start to notice (if you haven’t already) help videos appearing at the top of reports. Once you have watched a video in a given section you can close it down so it won’t bother you again – unless you want it in which case you can click the academic hat icon to drop the education section back down into view.\n\nFor those looking to take their learning further, the Analytics Academy is launching. This is a new learning platform or MOOC (Massive, open, online course) and will feature instructor led courses (also including instructional videos, a course forum, G+ community and Hangouts with analytics experts). The Digital Analytics Fundamentals course begins on 8th October."
    }
  ]
}