ServicesData warehouse & pipelinesAutomated dashboardsAI insight layerReview intelligenceAnalytics auditsWhite-label for agencies
PortfolioBlogPricingAboutWhatsAppBook a call
Data warehouse & pipelines

One clean model every channel feeds into.

Shopify, Amazon, your ad platforms and GA4, pulled on a schedule into a single documented BigQuery dataset. It's the foundation every dashboard and every AI insight sits on — and it lives in your Google Cloud account, not mine.

analytics_prod.orders_fact

1.28M rows2.4 GBSynced 04:00
Field nameTypeModeDescription
order_dateDATEREQUIREDpartition key
channelSTRINGREQUIREDshopify | amazon
order_idSTRINGREQUIREDdeduplicated
gross_revenueNUMERICREQUIREDbefore returns
net_revenueNUMERICREQUIREDafter returns
cogsNUMERICNULLABLEjoined from cogs_daily
ad_spend_allocNUMERICNULLABLEallocated by channel
contribution_marginNUMERICNULLABLEcomputed
skuSTRINGREQUIREDjoined to product_dim
customer_idSTRINGNULLABLEhashed
Field nameTypeModeDescription
spend_dateDATEREQUIREDpartition key
platformSTRINGREQUIREDmeta | google | tiktok
campaign_idSTRINGREQUIRED
campaign_nameSTRINGNULLABLE
spendNUMERICREQUIRED
impressionsINTEGERNULLABLE
clicksINTEGERNULLABLE
platform_conversionsNUMERICNULLABLEas the platform counts them
Field nameTypeModeDescription
skuSTRINGREQUIREDprimary key
product_titleSTRINGREQUIRED
categorySTRINGNULLABLE
unit_costNUMERICREQUIREDfrom cogs_daily
launched_atDATENULLABLE
activeBOOLREQUIRED
Field nameTypeModeDescription
customer_idSTRINGREQUIREDhashed, primary key
first_order_atDATENULLABLE
orders_countINTEGERREQUIRED
lifetime_revenueNUMERICREQUIRED
acquisition_channelSTRINGNULLABLEfirst touch
Field nameTypeModeDescription
raw_sourceSTRINGREQUIRED
raw_mediumSTRINGNULLABLE
channelSTRINGREQUIREDthe name used everywhere else
paidBOOLREQUIRED
Field nameTypeModeDescription
cost_dateDATEREQUIREDpartition key
skuSTRINGREQUIRED
unit_costNUMERICREQUIRED
landed_costNUMERICNULLABLEincl. freight and duty
Scheduled query · daily 04:00 UTClast run 41s
SELECT
  order_date, channel, sku,
  SUM(net_revenue)                        AS revenue,
  SUM(cogs + ad_spend_alloc)              AS cost,
  SAFE_DIVIDE(
    SUM(net_revenue - cogs - ad_spend_alloc),
    SUM(net_revenue))                      AS contribution_margin
FROM analytics_prod.orders_fact
WHERE order_date >= DATE_SUB(CURRENT_DATE(), INTERVAL 400 DAY)
GROUP BY 1, 2, 3
First rows6 of 1,284,116
order_datechannelorder_idnet_revenuecogsmargin
2026-06-09shopifySH-884121,248.00512.3031.4%
2026-06-09amazonAM-31907864.50402.1028.9%
2026-06-08shopifySH-883612,110.75881.2033.1%
2026-06-08shopifySH-88344648.00254.6030.2%
2026-06-08amazonAM-318821,392.20640.8027.6%
2026-06-07shopifySH-88290978.40388.9032.0%
ROWS
1.28M
EARLIEST
2024-01-02
NULLS IN KEY COLS
0clean
Where this table comes from
raw_shopify.orders
Shopify Admin API · hourly
→ staging
raw_amazon.orders
Amazon SP-API · hourly
→ staging
staging.orders_dedup
deduplicated on order_id
→ fact
analytics_prod.orders_fact
this table
6 downstream views

Example output · illustrative data · runs in your own accounts

Typical timeline2–4 weeks
InvestmentScoped on the call
Runs inYour own accounts
Lock-inNone — cancel anytime
Who it's for

You'll get the most out of this if…

  • You're pulling numbers from four or more platforms and they never agree.
  • Someone rebuilds the same spreadsheet every Monday from CSV exports.
  • You've outgrown platform-native reporting but nobody wants to own a warehouse.
  • You want the data in your own cloud, not locked inside another SaaS tool.
The problem

Exports aren't a data strategy.

Most ecommerce reporting starts the same way: someone downloads a CSV from Shopify, another from Meta, another from Amazon Seller Central, and joins them by hand in a spreadsheet. It works until the business gets big enough that it takes a day, and by then the month it describes is already over.

The deeper problem is that nothing reconciles. Each platform counts a conversion its own way and none of them know about the others, so there is no single figure anyone can defend in a meeting. Decisions get made on whichever number was open at the time.

A warehouse fixes the cause rather than the symptom. Every source lands raw, gets modelled once into a schema you can point at, and every report downstream reads from that one place.

What you get

Delivered, not described.

01

Every source connected

Shopify, Amazon SP-API, Meta Ads, Google Ads, TikTok Ads, GA4, Klaviyo and QuickBooks where relevant. Read-only access throughout.

02

Scheduled ingestion

Automated pulls on a schedule you choose. Raw data lands untouched, so the original figures are always recoverable.

03

A modelled layer

Raw becomes staging becomes fact tables. Deduplicated, blended, and documented — one schema every channel agrees on.

04

Historical backfill

As far back as each platform's API allows, so you have a real baseline rather than starting from today.

05

Documentation and handover

Every table and every metric definition written down. You can hand it to another analyst and they'll understand it.

How it works

What actually happens.

Access

You give read-only API access and a Google Cloud project. I'll create one if you don't have it.

Audit

Week one is finding where your numbers currently disagree and why. You get that written up either way.

Build

Ingestion, staging, fact tables. You'll see the first unified view within days, not at the end.

Handover

Documentation, access, and a walkthrough. It's your warehouse from that point on.

Proof

He really is the Looker Studio Guru that he says he is. The only person I found that could help me figure out why those issues were happening.

VERIFIED CLIENT REVIEW · UPWORK · JAN 2024
Questions

Asked on nearly every call.

Why BigQuery and not a managed reporting tool?

Because it's yours. A managed tool rents you a view of your own data and stops the day you stop paying. BigQuery sits in your Google Cloud account, costs very little at ecommerce data volumes, and every other tool can read from it.

What does it cost to run?

For most single-brand setups, storage and query costs land in single-digit dollars a month. I'll size it against your actual data volumes before you commit to anything.

Do we need an engineer?

No. That's the point. You provide access; everything else is on me, including the maintenance if you take the monthly retainer.

What happens if we stop working together?

Nothing breaks. The warehouse, the pipelines and the documentation are in your account and stay there.

Want this on your own numbers?

Fifteen minutes, no pitch. Bring the figure you least trust and I'll tell you what's likely behind it.

Book a 15-minute call
Fen here. What's the one number in your business you trust least?