At some point, usually somewhere past ₹1 crore a month in revenue, every scaling Shopify brand runs into the same meeting. Someone pulls up Shopify Analytics and says revenue was ₹1.2 crore. Someone else pulls up the Meta Ads Manager dashboard and says paid social drove ₹58 lakh of that. A third person pulls up Klaviyo and says email drove ₹31 lakh. Google Analytics has a fourth number for sessions and conversions that doesn't match either. Add them up and you're well past ₹1.2 crore — attribution overlap alone accounts for some of it, but not all of it, and nobody in the room can say with confidence which number is actually real. This is not a reporting inconvenience. It's the point at which a brand can no longer trust the numbers it's making six-figure-a-month decisions on, and it's exactly the gap a data warehouse, a dbt modelling layer, and a BI dashboard built for decisions — not vanity metrics — exist to close. This isn't a build every store needs. It's a specific, well-defined piece of infrastructure that earns its cost at a specific stage of scale, and this is what it actually involves, what it costs, and — just as importantly — when you should leave it alone.
The "which number is real" problem
Every platform in a modern D2C stack reports revenue and attribution honestly, by its own definition, and that's exactly the problem. Shopify Analytics reports revenue by order timestamp and whatever attribution window its own reports use. Meta attributes conversions using its own click-and-view windows, which it controls and periodically changes, and which credit Meta for orders it only partially influenced. Google Ads does the same thing under its own model. Klaviyo attributes email and SMS revenue using its own last-touch or multi-touch logic within its own tracking window. None of these systems talk to each other, none of them reconcile against what actually settled in your payment processor, and each one has a structural incentive — even if unintentional — to report generously about its own contribution.
Layer a stack of point-solution reporting apps on top and the problem compounds instead of resolving. Tools like Triple Whale and Lifetimely exist specifically to blend Shopify and ad-platform data into a single "true" dashboard, and for a lot of stores they're genuinely useful — better than reading five tabs separately. But they're still working from each source's attribution logic, applying their own blending model on top, and charging a subscription for the privilege. You end up with a sixth number, produced by a black-box methodology you don't control, that still doesn't match what your accountant sees in Shopify Payments or your bank statement. Add a returns and refunds process, a COD channel with its own reconciliation lag, or more than one currency, and the gap between "reported revenue" and "actual revenue" widens further.
None of this means any single tool is lying. It means each tool is a source, not a source of truth, and past a certain size and complexity, a brand needs exactly one place where "revenue," "CAC," and "LTV" are each defined once, computed the same way every time, and trusted by finance, marketing, and ops equally. That place doesn't exist by default. It has to be built.
What a data pipeline actually is, in plain terms
Strip away the jargon and a data pipeline is just a scheduled, automated process that pulls raw data out of every system that has some of the truth, and lands it in one place before anyone tries to analyze it. For a Shopify D2C brand, that means three kinds of sources at minimum. Shopify's own Admin API supplies orders, line items, customers, refunds, discounts, and inventory — the transactional backbone. Ad-platform APIs — Meta Marketing API, Google Ads API, and increasingly TikTok's and others — supply spend, impressions, clicks, and each platform's own conversion attribution, pulled at the campaign and ad-set level rather than trusted at face value. A CRM, helpdesk, or email/SMS platform — Klaviyo, Gorgias, a custom CRM — supplies customer-level engagement and lifecycle data that neither Shopify nor the ad platforms have any visibility into.
All three land in a warehouse — a database built specifically to hold and query large volumes of raw and modelled data efficiently, as opposed to the transactional databases that run your storefront. The realistic options here are BigQuery, Snowflake, or a well-configured Postgres instance, and which one fits depends mostly on data volume and existing infrastructure rather than any of them being categorically "better." BigQuery bills primarily by query volume, which tends to suit spiky, ad-hoc analysis; Snowflake bills primarily by compute time running, which tends to suit more predictable, scheduled workloads and gives more granular control over cost; Postgres is the cheapest and simplest option and is often enough for a single-brand, moderate-data-volume setup that doesn't need the horizontal scale the other two are built for. None of these is the "right" choice in the abstract — it's a real tradeoff worth a conversation with whoever is building the pipeline, not a decision to make from a blog post.
The pipeline itself is the unglamorous but essential part: connectors that authenticate to each API, extract data on a schedule — usually daily, sometimes more frequently for spend data — handle each source's rate limits and pagination without silently dropping records, and load it into the warehouse in a raw, unmodified form. That raw layer matters more than it sounds like it should. It's the audit trail that lets you answer "why does this number look wrong" six months later, because nothing has been transformed or overwritten yet — transformation is a separate, later step, and keeping it separate is what makes the whole system debuggable instead of a black box.
What dbt actually does
In plain language, for a founder who has no interest in the SQL underneath it: dbt is the layer that turns "we have the data somewhere" into "we trust the number on the dashboard." Raw data landed in a warehouse is not yet usable — Shopify's order export doesn't line up cleanly with Meta's ad-spend export, refunds need to be netted against gross revenue before "revenue" means anything useful, and a customer who exists in Shopify, Klaviyo, and a helpdesk under three slightly different email addresses needs to be recognized as one person before "LTV" means anything at all. dbt is the tool that does that stitching, once, in a documented and repeatable way, instead of every analyst redoing it slightly differently in their own spreadsheet every time someone asks for a number.
For a more technical reader, dbt is specifically a transformation framework that sits between the raw warehouse tables and whatever sits on top — it doesn't extract or load data itself, it takes already-landed raw tables and builds a layered set of version-controlled SQL models on top of them: staging models that clean and standardize each raw source individually, intermediate models that join and reconcile across sources, and final mart models that expose clean, documented metrics — a single definition of "net revenue," "blended CAC," "90-day LTV" — to whatever BI tool queries them. Every model is plain SQL under version control, so metric definitions live in code that gets reviewed and changed deliberately, not silently edited in someone's private spreadsheet. And critically, dbt supports tests: assertions that a given column is never null, that order IDs are unique, that refund amounts never exceed the original order value, that revenue by day falls within an expected range. Those tests run automatically every time the pipeline refreshes, and a broken source — a Meta API schema change, a Shopify webhook that silently stopped firing — fails loudly in a test log instead of quietly shipping a wrong number to an executive dashboard three weeks before a board meeting.
This is also the part of the build that takes the most real engineering judgment, because the modelling decisions — how to define a "new customer," which attribution window to standardize on across channels, how to handle a bundle SKU's margin when it ships across two warehouses — are business decisions disguised as technical ones. Getting them wrong doesn't produce an error. It produces a confident, clean-looking, wrong number, which is worse than an obviously broken one because nobody questions it.
Dashboards built for decisions, not vanity metrics
The distinction that matters here isn't "good dashboard vs. bad dashboard" — it's whether a dashboard changes what anyone does on a Monday morning. A lot of ecommerce reporting, including plenty of native app dashboards, is built around metrics that are easy to compute and satisfying to watch trend upward, without being decision-relevant. Total sessions, total revenue, follower growth, total orders — these are fine as a pulse check, but nobody sits in front of a total-revenue chart and decides to reallocate ₹5 lakh of ad spend from one channel to another. That decision needs a different kind of number.
A blended CAC by channel — built by dividing true, deduplicated ad spend by net new customers acquired, computed consistently across Meta, Google, and any other paid channel from the same underlying warehouse tables rather than each platform's self-reported conversion count — tells you which channel is actually acquiring customers efficiently once double-counted conversions are removed. A cohort LTV curve — tracking what customers acquired in a given month actually spend over their following 3, 6, and 12 months, not a projected or blended average — tells you whether a channel that looks expensive on CAC alone is actually fine once you account for how much those customers keep buying, or whether a channel that looks cheap is quietly acquiring one-time discount shoppers who never return. Margin by SKU after all-in costs — COGS, packaging, payment processing fees, average return rate, and a fair allocation of fulfillment cost, not just the list-price gross margin — tells you which products are actually funding growth and which ones are selling well while losing money on every unit. A marketing efficiency ratio — total revenue over total marketing spend across a period, tracked over time rather than as a single snapshot — tells you whether the whole acquisition engine is getting more or less efficient as spend scales, which a per-channel CAC number alone won't show you.
What all four of these have in common is that they're computed from the dbt layer, not from raw exports — which is the entire reason the modelling step exists. A dashboard built directly on top of raw Shopify and ad-platform data inherits every one of the definitional mismatches described earlier; a dashboard built on top of tested, documented dbt models inherits none of them, because the reconciliation already happened upstream, once, instead of being silently re-decided by whoever built the chart. The BI tool itself — Looker, Metabase, or something else — matters far less than what it's querying. A beautiful dashboard on top of unreconciled data is still an unreconciled number with better formatting.
What this actually costs and how long it takes
A first build — connectors for Shopify plus one or two ad platforms and a CRM, a dbt project modelling the core metrics, and a starter set of dashboards covering the decisions above — realistically runs $8,000 to $20,000 or more, with delivery in four to eight weeks. The wide range isn't padding; it's driven almost entirely by the state of the source data going in, not by the sophistication of what comes out. A brand with clean, consistently tagged UTM parameters, one CRM, and a single currency is a materially smaller build than a brand with three years of untagged campaign history, two overlapping CRM tools doing the same job, multiple currencies, and a COD channel that reconciles on a different schedule than the rest of the business. Untangling the mess in the source data — deciding what "clean" even means for a given business — is usually most of the actual work, not the pipeline plumbing or the dashboard design.
That number is for the initial build, not the whole cost of ownership. Ongoing maintenance — new connectors as you add channels, model changes as your business logic changes (a new bundle strategy, a new fulfillment partner, a new markets expansion), and dashboard iteration as the questions the business asks evolve — is typically a smaller monthly retainer rather than a fixed fee. That's not a sales tactic; it's a structural reality of the system. Source APIs change their schemas without warning. Shopify adds new order properties. Meta deprecates an API version on its own schedule, not yours. A pipeline that isn't maintained doesn't fail cleanly — it drifts, usually silently, until someone notices the dashboard disagrees with the bank statement again, which is the exact problem the whole build was meant to solve in the first place.
When you genuinely don't need this yet
This is worth saying plainly, because the honest answer for most stores reading this is: not yet, and that's fine. Shopify's native analytics, combined with a couple of well-chosen point-solution apps, is genuinely sufficient for the large majority of single-market brands running on one or two ad platforms with a small team that's able to look at the numbers each system reports and mentally reconcile the gap without it changing any real decision. If your team already has an intuitive, shared sense of which number to trust for which purpose — Shopify for true revenue, Meta's own dashboard for a rough read on paid social's directional performance — and nobody is currently making a costly decision off a number that later turns out to be wrong, a warehouse and dbt layer is solving a problem you don't have yet.
The signal that it's time isn't a revenue milestone by itself — it's a specific set of symptoms. More than one person on the team needs the same number and it doesn't match between them. Finance, marketing, and ops are quietly pulling different exports of the same metric and nobody's caught the discrepancy yet, only that the totals never quite tie out. You're blending more than two ad platforms with a CRM and the manual reconciliation that used to take an hour now takes a day, every week. You're heading into a fundraise or board reporting cycle, where an investor asking "what's your real blended CAC" and getting three different answers in the same meeting is a genuinely bad look, and gets noticed fast. Absent those signals, the money is usually better spent on the parts of the funnel Shopify and your existing tools already measure well enough — this is a real tradeoff, not a soft sell toward building something you don't need. Spending $10,000-$20,000 on a warehouse before the business has outgrown its current reporting is $10,000-$20,000 not spent on creative testing, retention programs, or the acquisition channels that are still working fine on the numbers you already have.
Where these builds actually fail
The most common failure isn't a technical bug — it's a beautiful dashboard nobody trusts, built on data that was never validated against reality before it shipped. A team gets excited about a slick new BI dashboard, migrates decisions onto it, and three weeks later someone notices the numbers don't match Shopify Payments for a specific week. Instead of a bug being caught and fixed, quiet skepticism creeps in — people start cross-checking the new dashboard against the old spreadsheet "just to be sure," and within a couple of months, the expensive new system has been demoted back to a nice-to-have while the spreadsheet, with all its known flaws, is trusted again simply because it's familiar. The fix isn't more polish on the dashboard; it's validating the underlying dbt models against known-good numbers — a specific week's bank settlement, a specific month's audited revenue — before anyone is asked to trust the system for a real decision.
The second failure is pipelines shipped without dbt tests, because tests feel like the part of the build you can skip under time pressure without anything visibly breaking — until something does. An ad platform silently changes an API field, a Shopify webhook stops firing after an app update, a currency conversion rate gets applied twice — and without tests catching the anomaly at the model layer, the error propagates cleanly through to the dashboard and gets treated as real. Nobody built this system to lie; it just wasn't built to catch itself when it started to. Untested pipelines don't fail loudly, which is exactly what makes them dangerous — a system that crashes gets fixed immediately, a system that quietly reports a wrong number that looks plausible can run for months.
The third, and probably the most common long-term failure, is treating this as a one-time project instead of an owned, maintained system. A pipeline built once and never revisited degrades the moment any upstream source changes — a new fulfillment partner, a rebranded ad account, a Shopify app migration, a new market with a new currency — because nothing about a dbt model updates itself when the business it's modelling changes. The brands that get real, lasting value from this kind of build are the ones that treat it the way they'd treat any other piece of core infrastructure: owned by someone specific, checked periodically, and budgeted for maintenance from day one — not the ones that treat the initial build as the finish line.
How to actually decide
Start by naming, specifically, which decision is currently being made on a number you don't fully trust. Not "our reporting could be better" in the abstract — a specific number, a specific decision, a specific dollar amount riding on it. If you can point to a real instance — a channel that got more budget because its self-reported ROAS looked strong, when a blended, deduplicated view might tell a different story — that's a concrete case for the investment, with a payback period you can actually estimate against the ad spend it would redirect. If the honest answer is that your team already trusts its current numbers enough to act on them confidently, the infrastructure isn't the constraint yet, and building it now mostly buys peace of mind you're not currently missing.
Either way, this is a scoped, standalone build, not something to bundle into a broader engineering retainer by default — it has its own timeline, its own cost range, and its own maintenance commitment once it's live, and it's worth treating the decision to build it with the same rigor you'd apply to any other six-figure-adjacent infrastructure investment: a clear-eyed look at whether the specific problem it solves is one you actually have right now, not one you're anticipating having eventually.
If any of this sounds like your situation, talk to us. We'll tell you exactly where your revenue is leaking and what it would take to fix it. Explore Strategy & Consulting →

