Myls

Marketing & Consumer Engagement

Marketing Analytics

Success stories

Myls Cuts Multi-Client Reporting from Days to Minutes with BigQuery, dbt, and Superset

Myls AG is a Swiss marketing agency that helps small and medium businesses across the country get found online by managing Google Business Profiles, building websites, running Google Ads and Meta Ads campaigns, and keeping business listings in sync across more than 50 directories, including Google Maps and Apple Maps.

Myls does not run marketing for one business. It runs it for many clients at once. Every client has its own ad accounts and website traffic, and every client expects to see its own results and nothing else.

‍

The Challenge

Each client's data sat across separate platforms that did not talk to each other:

  • Google Ads: ad performance
  • GA4: website behavior
  • Meta Ads: social campaigns
  • WooCommerce: online sales

Answering a simple question, like which channel brought in the most valuable customers for one client, meant exporting data from every platform by hand, cleaning it, and combining it in a spreadsheet before anyone could trust the numbers.

Before: every client rebuilt by hand. After: one shared platform, separate results for every client.

‍

Why It Mattered

  • Hours per client, days overall. One client report took hours. Across the full portfolio, it took three to five days every cycle.
  • No shared system. Every client was handled as its own manual project, repeated every reporting cycle.
  • Errors from rebuilding. Reports rebuilt by hand let small errors creep in, so metrics were not calculated the same way every time.
  • Growth meant more manual work. Onboarding a new client meant starting the whole manual process again from scratch.

‍

What We Built

Datum Labs designed a single data platform that serves every Myls client from one shared foundation while keeping each client's data fully separate.

  • Source audit first: before writing any pipeline, the team identified the exact Google and Meta API endpoints needed to capture spend, clicks, impressions, conversions, and revenue accurately. This mapping became the blueprint for the build.
  • Automated ingestion with Airbyte: connectors for GA4, Google Ads, Meta Ads, and WooCommerce pull fresh data on a set schedule, authenticated through service accounts. Nobody exports a CSV anymore.
  • Custom ingestion for Google Business Profile: a custom Python script pulls data from the GBP APIs. Google Search Console is also included as a client source.
  • One warehouse in BigQuery: all raw data lands in one place, with a schema defined at setup so structure stays consistent as sources and clients are added.
  • Transformation in dbt: one dbt project runs the same modeling logic for every client.
  • Client dashboards in Apache Superset: self-hosted, one dashboard per client, with Metabase used alongside it.
  • Automated client provisioning: a Python script scheduled with Dagster scans BigQuery, creates users, assigns roles, and sends login credentials through Slack.

‍

How It Works

1. Ingestion

Airbyte runs one pipeline per client, using OAuth and service account authentication, and loads raw data into that client's own raw schema in BigQuery. Google Business Profile data comes in through a custom Python script.

2. Cleaning and modeling in dbt

  • Staging models: remove duplicates, fix inconsistent date formats, and standardize metric names, so a click means the same thing whether it came from Google or Meta.
  • Core models: calculate the numbers an agency actually needs, including blended return on ad spend (ROAS) and customer acquisition cost (CAC) across every channel a client runs.

3. Client isolation

Every client has its own raw schema and its own analytics schema in BigQuery. A single dbt project runs for all clients, passing the client name as a variable, so the same logic applies everywhere while no client's numbers ever mix with another's.

One shared model, fully separate data for every client.

‍

4. Dashboards

Each client has its own user account and permissions, and sees only its own campaigns, spend, and results. Key metrics carry a simple status signal that flags what needs attention, so a client knows in seconds whether a campaign should keep running or needs a second look.

A client dashboard with at-a-glance status signals (sample data).

‍

5. Automated onboarding

A Python script scheduled through Dagster scans BigQuery for client datasets, creates Superset users, assigns roles, and sends each new user their credentials by Slack. Adding a client is now a new schema and a new login.

‍

Tech Stack

Myls multi-client architecture, from source to client dashboard.

LayerTechnologyRole
SourcesGoogle Ads, GA4, Meta Ads, WooCommerce, Google Search Console, Google Business ProfileAds, website behavior, social campaigns, online sales, search, local listings
IngestionAirbyte, custom Python (GBP APIs)Scheduled extraction, one pipeline per client
WarehouseGoogle BigQuerySeparate raw and analytics schemas per client
TransformationdbtStaging and core models; blended ROAS and CAC
BIApache Superset, MetabasePer-client dashboards with status signals
AutomationPython, Dagster, SlackUser creation, role assignment, credential delivery

Before and After

AreaBeforeAfter
Reporting time3 to 5 days per cycleUnder 15 minutes
Data collectionManual CSV exports from every platformAutomated, scheduled ingestion
Metric consistencyRebuilt by hand, small errors crept inCalculated the same way every time
Client reportingSpreadsheets per clientOwn login and dashboard per client
New client onboardingWhole manual process from scratchNew schema and new login

Results

  • Days to minutes: reporting that took three to five days now takes under fifteen minutes and runs automatically for every client.
  • Consistent metrics: every client's numbers are calculated the same way every time, removing manual errors.
  • Clear client view: each client logs in to see only its own campaigns, spend, and results, with status signals showing what needs attention.
  • Simple onboarding: a new client is a new schema and a new login inside a system that already works.
  • Growth without extra workload: Myls can grow its client roster without growing manual reporting at the same rate, and every client gets reliable reporting from day one.

‍

Conclusion

A multi-client business does not need a bigger team to handle more reporting. It needs one well-designed data foundation that can carry every client on it. The key decisions here were isolating each client by schema and running one dbt project for all of them, so the platform scales by configuration, not by headcount. This is the kind of system we build for agencies and platforms that serve many customers through one shared architecture.

If every new client adds another manual report to your week, the problem is not your team size. It is the missing foundation underneath.

Featured Insights

October 29, 2026
Datum Labs
Myls AG is a Swiss marketing agency. Datum Labs built one shared data platform with separate dashboards per client, cutting reporting from days to minutes.

Myls