Home / Case studies
Case studies · GA4 · GTM · Firebase · Meta CAPI · Consent Mode
Case studies: how I fix analytics in e-commerce, apps, FinTech and B2B
17 example projects where the data stopped adding up or marketing needed support: what was broken, what I changed and what the client got out of it. Some descriptions are anonymised, because I also work white-label for agencies and under NDA.
- 11+ years in analytics and online marketing
- 150+ brands I have delivered projects for
- I used to run B2B campaigns in Google Ads, Meta Ads and LinkedIn Ads, today I focus on analytics
- Projects in English, Polish and German-speaking markets
Choose an area
Which of these challenges applies to your company?
I have grouped the projects by industry and type of problem. Pick the area that applies to you and jump straight to the examples.
Group 1 of 5 · E-commerce
E-commerce: every purchase counted once, every market separately
Conversion deduplication, a tidy GTM and Consent Mode setup, and data split by market. Without that, campaigns learn from the wrong data.
GA4, GTM and Consent Mode audit for a store selling in Poland and Germany
After the audit, each market has its own GA4 property connected to its own Google Ads account, and the BigQuery export lets the client join orders with CRM data by transaction_id.
Problem
The store sold to businesses and consumers on two domains: .pl and .de. Customers in the two countries did not overlap, and the company had separate Google Ads accounts for Poland and Germany. Yet all data went into one GA4 property, Consent Mode was faulty, and over the years the GTM container had filled up with tags nobody could explain.
What I did
- a full technical audit of Google Tag Manager, GA4 and Consent Mode
- split the data into two GA4 properties, one for .pl and one for .de, each connected to the Google Ads account for its market
- fixed the Consent Mode implementation
- GA4 export to BigQuery, so the client can join order data with their CRM by transaction_id
- a dataLayer specification for the IT team, ready to implement without guesswork
Separate GA4 properties make sense when markets have different domains, different customers and separate ad accounts. A single GA4 property then mixes the data and makes campaign optimisation harder.
Delivered white-label, as a subcontractor to a marketing agency.
- GA4
- GTM
- BigQuery
- Consent Mode
- Google Ads
Related service: GA4 and Google Tag Manager audit · BigQuery and reporting
Meta Conversions API with deduplication: EMQ from below 4 to above 6.5, and above 9 for Purchase
A fashion store on WooCommerce had no event deduplication between the Pixel and Conversions API. After an implementation where the Purchase event sends the order number (transaction_id) instead of event_id, Event Match Quality (EMQ) rose from below 4 to above 6.5, and above 9 for purchases.
Problem
The Meta Pixel and Conversions API sent the same purchases without a shared identifier, so Meta could not pair them. EMQ was below 4 and campaigns were learning from incomplete and duplicated data.
What I did
- implemented deduplication: for Purchase, the Pixel and Conversions API send transaction_id instead of event_id
- conversion value sent to Meta without shipping costs
- cleaned up the Google Tag Manager environment
- configured Consent Mode
EMQ (Event Match Quality) is a 0 to 10 score of how well Meta matches a website event to a specific person. The more contact data, the higher the score. Most visitors do not log in or leave an email or phone number, so browsing events have lower EMQ. At purchase the customer provides this data, which is why Purchase can exceed 9. A store with many logged-in users also gets higher EMQ for events such as AddToCart and InitiateCheckout.
- Meta Pixel
- Conversions API
- transaction_id
- GTM
- WooCommerce
Related service: Meta Conversions API implementation · Server-side tracking
Group 2 of 5 · Mobile apps
Mobile apps: Firebase that shows the whole user journey
Event mapping, in-app payments, push, cohorts and sign-up funnels. App analytics is my specialty, and I also train teams in it.
Blinkee: Firebase, push and one report for the app, ads and many cities
After mapping events in Firebase and connecting them with Facebook Ads and Google Ads data, Blinkee sees in one report which campaigns and push notifications lead to sessions and purchases.
Problem
App data did not match the ad platforms, and every channel had its own separate report. Group ride events distorted the Firebase statistics. The app operates in selected cities in Poland and abroad, and data from these markets did not flow into one reporting ecosystem.
What I did
- a Firebase event architecture mapped to Facebook Ads and Google Ads data
- fixed Group Rides tracking, which was distorting the statistics
- push campaigns for user segments, such as group rides and contests, with click, session and purchase measurement
- Firebase cohorts, such as users active after 2 rentals and uninstalls, for better ad targeting
- one data collection standard for all cities and reports combining Firebase, Facebook Ads and Google Ads
- Firebase
- GA4
- Facebook Ads
- Google Ads
- push
- cohorts
Related service: Mobile app analytics
Diet catering platform: the path from choosing a diet to payment and renewal
Events in the iOS and Android app cover the whole journey from choosing a diet to purchase, including BLIK and Google Pay payments and diet renewals, and they are consistent with website data, so the company sees in one report where it loses orders.
Problem
The path from choosing a diet to purchase in the app was only partly measured. The website had been collecting data for years and the client wanted to keep continuity, so the app had to speak the same language. Mobile payments such as BLIK or Google Pay can complete with a delay or fail, and the subscription model needed separate events for renewals.
What I did
- a specification and event mapping in Firebase for iOS and Android, from choosing a diet to purchase, consistent with the website’s long-running data so the client kept continuity
- purchase, purchase_wait and purchase_fail events that reflect how mobile payments behave
- DIET_RENEWAL_START and DIET_EXTEND_START for diet renewals and extensions
- VIEW_ITEM_LIST_ZERO, which shows when filters return no diets at all
- cohorts, such as users after 2 orders, and one report combining the app with the website
The client’s name and details are covered by an NDA.
- Firebase
- GA4
- iOS
- Android
- BLIK
- cohorts
Related service: Mobile app analytics
StethoMe: GDPR-compliant analytics from scratch for a Shopify store and a medical app
StethoMe got working tracking for its Shopify store and app dashboard in GTM, Google Analytics and Facebook Ads, one Consent Mode consent for the domain and subdomain, and one UTM standard that lets sales be attributed to a specific channel.
Problem
The Shopify store and the app dashboard had no consistent analytics, and they ran on a domain and a subdomain. Native, display and social campaigns were tagged inconsistently, so there was no way to compare which channel sold. On top of that, a medical app required particular care when collecting user data.
What I did
- set up GTM, Google Analytics and Facebook Ads from scratch for the Shopify store and the app dashboard
- one Consent Mode consent shared by the domain and subdomain, so users do not have to click the banner twice
- a UTM campaign tagging standard for native, display and social (source, medium, campaign)
- analytics configured with GDPR requirements for medical app data in mind
- technical support adapting display and responsive ad creatives to Google and Meta requirements
This describes the setup during my time working with the client.
- GTM
- Google Analytics
- Facebook Ads
- Shopify
- Consent Mode
- UTM
Related service: GA4 implementation · Consent Mode v2 and CMP
Event audit in a navigation app and the points where users drop off
The audit identified errors in the data layer and the points where users abandon sign-up and licence purchase, so the team knows what to fix first.
Problem
The navigation app’s maker was not sure app events were being collected correctly. Without that, analysis of the sign-up and licence purchase funnel led to questionable conclusions.
What I did
- a review of the event implementation in the app
- drop-off analysis in sign-up and licence purchase
- a list of data layer errors to fix
The client’s name and details are covered by an NDA.
- app events
- funnel
- retention
- audit
Related service: Web and app analytics audit · Mobile app analytics
Do you see one of these problems in your own data?Describe it in 2 or 3 sentences. The first 30 minutes are free, and I usually reply within 48 hours.
Book a free 30-min consultationGroup 3 of 5 · FinTech and lead generation
FinTech and lead generation: every lead with its source
Calculators, forms and contact requests measured step by step, with personal data protected in line with GDPR.
SPA insurance calculator: a gap-free dataLayer, hashed personal data and leads from callback requests
The insurance calculator got one dataLayer for every step of the single-page app, personal data is SHA256-hashed before sending, and every contact request records the step it came from.
Problem
The calculator ran as a single-page application, so moving between steps generated no page views and the data had gaps. The form collected email addresses and phone numbers, which must not be sent to external systems in plain text. Callback requests landed in one bucket, with no information about which stage they came from.
What I did
- specified and implemented a full SPA dataLayer, consistent across every calculator step
- normalised and SHA256-hashed email and phone before sending them to external systems
- a generate_lead event with a lead_source parameter showing the step where the contact request was made
- excluded the company’s employees from GA4 data with a user property
SHA256 hashing turns, for example, an email address into an irreversible string. An ad platform can match it to a user, but never sees the address itself.
The client’s name and details are covered by an NDA.
- dataLayer
- SPA
- SHA256
- GTM
- user property
Related service: Google Tag Manager and dataLayer · GA4 implementation
// SPA calculator, step 3
dataLayer.push({
event: 'generate_lead',
lead_source: 'calc step 3',
email_sha256: '9f86d08…'
});
A step-by-step calculator funnel, a conflict-free consent banner and alerts on data drops
A dashboard shows progress through calculator steps 1 to 4, including drop-offs caused by errors in external databases such as CEPiK (the Polish vehicle register), and the team gets an alert when the number of events drops unusually.
Problem
Cookie banner conflicts blocked some users mid-process and held back scripts such as remarketing tags. The team could not see at which calculator step people dropped off, or that some drop-offs were caused by external database outages. Email campaigns had no consistent UTMs, and tracking failures surfaced late.
What I did
- integrated the cookie banner with GTM and Consent Mode v2 and removed UX conflicts along the path
- a step 1 to 4 funnel dashboard with drop-offs caused by external database problems, such as CEPiK
- a UTM tagging strategy for email marketing
- self-audit dashboards: event trends and automatic alerts on drops
- Consent Mode v2
- CMP
- UTM
- GA4
- dashboards
Related service: Consent Mode v2 and CMP · Free UTM link builder
Leads instead of form spam
Together with the sales team I analysed which form submissions were spam. Based on that, I had the developers implement an invisible reCAPTCHA that cut the spam, and I optimised campaigns for real leads.
- reCAPTCHA
- lead analysis
- Google Ads
Enhanced conversions in diet catering: SHA-256 instead of SHA-1 and phone numbers in E.164
On a diet catering website, Google Ads reported a critical enhanced conversions error for purchase and add to cart. The user data source was missing, and the data was hashed with the outdated SHA-1 instead of the required SHA-256.
On another catering platform, the dataLayer was missing the sha256_phone_number parameter. A phone number must first be normalised to E.164 format (for example +48500100200) and only then hashed with SHA-256.
You can check your hashes in the SHA-256 tester for enhanced conversions.
- Google Ads
- enhanced conversions
- SHA-256
- E.164
- dataLayer
Group 4 of 5 · B2B and marketing continuity
B2B: compliant tracking, niche campaigns and marketing without downtime
In B2B every enquiry counts. These projects cover cookie consent, campaigns in a narrow niche and keeping marketing running when the company is short of people.
Cookie-Script and GA4 after a website migration: scripts load only after consent
After the move to a new website I implemented GA4 together with Consent Mode and Cookie-Script, so marketing scripts such as LinkedIn load only after the user consents, and GA4 collects data according to their choice.
Problem
After the company moved to a new website, the Cookie-Script banner behaved inconsistently. It blocked scripts such as LinkedIn, but did not always enable them after acceptance, and GA4 was missing data.
What I did
- scanned the website and identified cookie conflicts
- conditional script loading based on the selected consent category
- a correct GA4 implementation with Consent Mode after the migration
- Cookie-Script
- GTM
- GA4
- Consent Mode
Related service: Consent Mode v2 and CMP · GA4 and Google Tag Manager audit
A Google Ads campaign for an EU-funded green loan in a B2B niche: from creatives to landing page
A Google Ads campaign promoting grants for drive system upgrades launched in line with Google’s guidelines, and the landing page got a lead-focused structure built around audit sign-ups.
Problem
The client wanted to launch a campaign fast in a narrow niche: grants from the EU-funded FENG programme for upgrading drive systems. The image creatives did not meet Google Ads standards for dimensions, formats and amount of text, and the landing page was not built for B2B conversion.
What I did
- a full technical spec for creatives: responsive display ads in 300×250, 1200×628 and 900×1600 formats
- landing page guidelines based on B2B best practice: headline, CTA, social proof and UX
- technical review of the image creatives supplied by the client
- ongoing campaign budget management
- Google Ads
- display
- responsive ads
- landing page
Related service: Consulting · B2B analytics implementation
Marketing without downtime when the company lost its specialist
While the client’s specialist was away, I took over Google Analytics and Google Ads, so campaigns kept running and the team learned to manage them on their own.
Problem
The client had no one responsible for campaigns. Marketing risked grinding to a halt, and nobody in the company knew the ad accounts or analytics well.
What I did
- took over the Google Analytics and Google Ads accounts
- ongoing consulting and technical support for website changes
- trained the client’s staff to manage the campaigns
- Google Ads
- Google Analytics
- consulting
- training
Related service: Analytics consulting
Group 5 of 5 · Audits and automation
Audits and automation: less data debt, less manual work
I fix tools nobody trusts and replace manual reports with ones that arrive on their own.
GDPR-compliant Microsoft Clarity: heatmaps work again after Consent Mode went live
After the client implemented Consent Mode, Microsoft Clarity heatmaps stopped working properly. I connected Clarity to their consent banner (CMP), so recordings and heatmaps are collected again, but only from people who agreed.
Problem
The earlier consent banner setup was not GDPR-compliant: behaviour analysis tools recorded users before they consented. When the client implemented Consent Mode, Clarity heatmaps stopped working properly and the team lost its data for UX optimisation.
What I did
- diagnosed why Clarity stopped collecting data properly after Consent Mode was implemented
- integrated Clarity with the client’s consent banner, so recordings and heatmaps start only after consent
- managed the Clarity script through Google Tag Manager
For heatmaps and session recordings I use Microsoft Clarity day to day, and Hotjar when needed.
- Microsoft Clarity
- CMP
- Consent Mode
- GTM
Related service: Consent Mode v2 and CMP · Google Tag Manager and dataLayer
Recordings only from people who consented, and heatmaps you can compare again.
An event model from scratch and email reports with real CAC and LTV
Combining product analytics with CRM data in a BigQuery warehouse revealed the real cost of acquiring a customer and their value over time. The agency running the campaigns and the client get these numbers weekly and monthly in an email report.
Problem
A fast-growing startup could not see the user journey in its app. The conversion was sometimes sign-up and sometimes payment, so every report said something different. Without one definition there was no way to judge how much could be spent on acquiring a customer.
What I did
- designed an event model from scratch, with one definition of sign-up and payment
- combined web analytics with user database (CRM) data in a BigQuery warehouse
- weekly and monthly email reports with customer acquisition cost and lifetime value, for the agency running the campaigns and for the client
CAC (Customer Acquisition Cost) is the cost of acquiring one paying customer. LTV (Lifetime Value) is the revenue a customer brings over the whole time they use the product.
- GA4
- CRM
- BigQuery
- event model
- email reports
Related service: BigQuery and reporting · GA4 implementation
Year-on-year comparisons after a store platform change
After an e-commerce platform change, I translated the historical data format into the new structure so year-on-year reports kept telling the truth.
- GA4
- data migration
- e-commerce
A dashboard instead of a manual Excel report
I replaced manual Excel reporting with an automated Data Studio dashboard that pulls data through APIs and from BigQuery. The client no longer wastes time copying numbers.
- Data Studio
- BigQuery
- API
How I work
Every one of these projects went through the same 4 steps
I start with a diagnosis, not with adding more tags. That way I fix the cause, not the symptom.
Free 30-minute consultation
You tell me what does not add up in your data. I tell you where to start and whether you need an implementation at all.
Audit on your accounts
I check GTM, GA4, Consent Mode and ad pixels. I work in your accounts and the data stays with you.
Plan and spec for IT
You get a list of fixes and a dataLayer specification your developer can implement without guesswork.
Implementation, testing and monitoring
I implement changes in GTM, test them before publishing and set up checks that catch the next failure.
FAQ
Questions about these case studies and working together
Why do some case studies not name the client?
Because I deliver some projects white-label for agencies and others under a non-disclosure agreement (NDA). For those projects I describe the industry, problem, solution and result without data that could identify the company. Some of the brands I have worked with are on the client list.
Are these all your projects?
No. These are selected examples that show typical data problems well. I have delivered projects for more than 150 brands.
Do you work white-label for agencies?
Yes. The agency stays in contact with the client, and I deliver the analytics audit or implementation as a subcontractor. The first case study, a store selling in Poland and Germany, is an example.
Do you also analyse mobile apps?
Yes. I have implemented and audited app analytics in Firebase, including for Blinkee, StethoMe, a diet catering platform and a navigation app under NDA. I also train teams in app analytics.
How do you protect personal data sent to Meta and Google?
I normalise and SHA256-hash email addresses, phone numbers and other identifiers before sending, and fire tags according to Consent Mode v2. That is how the insurance calculator project worked.
Do you need access to the website code?
Not always. I do most of the work in Google Tag Manager, GA4 and the ad platforms. Code-side changes, for example in the dataLayer, go into a specification for your developer.
Can you take over marketing while an employee is away?
Yes. I can take over Google Analytics and Google Ads, support website changes and train your team, as in one of the B2B projects above.
How much does a project like this cost?
It depends on the scope. A GA4 implementation starts from €190 excl. VAT, Consent Mode v2 with a CMP from €225, Meta Conversions API from €225, and consulting from €67 per hour. Full pricing is on the services page.
How can I check whether my analytics has similar problems?
Book a free 30-minute consultation. Send your website URL and 2 or 3 sentences about what does not add up. After the call you know where to start and whether you need an implementation at all.
Who is behind these projects
Marcin Miłowski, GA4, GTM and BigQuery consultant
I have worked in analytics and online marketing for more than 11 years and delivered projects for over 150 brands, from one-person businesses to Inter Cars and Vercom. Before I started fixing analytics, I ran Google Ads and Facebook Ads campaigns myself, so I know what data a marketing team needs.
I spoke about GA4 on stage at the Sprawny Marketing conference, and I have trained the Orange Polska and 4F teams in Firebase app analytics.
Tell me about your data problem
Send your website URL and 2 or 3 sentences about what does not add up. The first 30 minutes on Google Meet are free and with no obligation. I usually reply within 48 hours.
Services from these case studies