Client: MeshCommerce
How MeshCommerce turned a 13-week BI build into a $1.8M annual revenue line
MeshCommerce's 4,200 merchants kept asking for analytics. We shipped a multi-tenant embedded BI platform on Snowflake + dbt + Cube in 13 weeks — and gave MeshCommerce a brand-new premium tier that now generates $1.8M/year.
13 weeks
Kickoff to production
$42k
Fixed-price engagement
$1.8M
Year-1 ARR uplift
4,200
Merchants served by day 30
Services delivered
Tech stack
The brief
MeshCommerce is a US-based e-commerce platform powering 4,200+ DTC merchants — think a focused Shopify alternative for mid-market SMB. Their merchants ran their stores from MeshCommerce's admin all day. And almost every customer-success call ended the same way: "Can you send me a report on…?"
Merchants wanted real analytics. Not just "sales today" — they wanted cohort retention, SKU profitability, channel-attribution, supplier lead-times. MeshCommerce's ops team was running ~340 ad-hoc CSV exports a week to keep merchants happy. The product team kept punting the build because it was big, complex, and didn't have a clear ROI yet.
Then their head of product realized: "If we built this properly and charged for it, this is a new pricing tier." They needed a senior business intelligence team that could ship embedded analytics — fast, multi-tenant, and good enough to be the centerpiece of a paid Pro plan.
The constraints
- Multi-tenant from day 1. 4,200 merchants, each only sees their own data.
- Embedded UX, not iframe. Dashboards live inside MeshCommerce's admin, branded as MeshCommerce.
- Real-time enough. Yesterday's data is fine; last-month's data is not.
- Custom metrics per merchant tier. Free tier = 4 dashboards. Pro tier = 12 dashboards + custom report builder.
- White-label embed for enterprise. The top-200 merchants wanted to embed MeshCommerce analytics in their own internal tools.
- 13-week deadline. Tied to their Q2 earnings narrative.
The architecture
We picked the modern data stack — boring on purpose, because the value was in the product UX, not the infra.
- Warehouse: Snowflake (already in use for internal ops, easy adoption)
- Ingestion: Airbyte cloud connectors from their operational Postgres + Stripe + Shopify-Apps + Klaviyo
- Transformation: dbt for layered models (raw → staging → mart), tested CI/CD via dbt Cloud
- Semantic layer: Cube — single source of truth for metric definitions, multi-tenant via JWT + row-level security
- Frontend: custom React 19 + Next.js 14, charting via Tremor + Recharts, branded as MeshCommerce
- Embed-for-enterprise: a signed iframe + JWT pattern that white-labels the dashboard, used by ~40 of MeshCommerce's biggest merchants
The Cube semantic-layer decision
The biggest call we made early on was using Cube as the semantic layer rather than letting each dashboard query Snowflake directly. Three reasons:
- Metric definitions in one place. "Active customer" is defined once in Cube, used in every dashboard. No more "why does retention here say 73% and the board deck say 68%?" conversations.
- Multi-tenant out of the box. Cube's JWT-scoped queries meant every dashboard query was automatically filtered by merchant ID — impossible to leak another merchant's data even if the frontend had a bug.
- Snowflake costs stayed bounded. Cube's query caching cut our Snowflake warehouse usage by ~62% vs the naive approach.
The 13-week timeline
Total: $42,000 fixed-price, 13 weeks from kickoff to production. Phases:
- Weeks 1–2: Discovery, KPI catalog, data audit, scope locked
- Weeks 3–5: Snowflake setup, Airbyte ingestion, first dbt models, base metrics defined in Cube
- Weeks 6–8: Free-tier dashboards (4 dashboards × 4,200 merchants), multi-tenant smoke tests at scale
- Weeks 9–11: Pro-tier dashboards + custom report builder + white-label embed
- Week 12: Load test, security review, RLS pen test (no merchant can ever see another's data)
- Week 13: Production launch, training session for MeshCommerce's ops + customer-success teams
The product launch
MeshCommerce launched the analytics feature as a free upgrade for all merchants AND as the anchor feature of a new Pro plan ($89/month). Within 30 days:
- 4,200 merchants had used the new dashboards at least once
- 1,140 merchants (27%) had upgraded to the Pro plan
- 40 enterprise merchants activated the white-label embed
- $1.8M ARR run-rate generated by the Pro plan within 6 months
- 340 → 12 weekly ad-hoc CSV requests (97% reduction)
We spent 2 years saying "we should build analytics." Paisol shipped it in 13 weeks — for less than what we'd pay one senior engineer for 6 months — and we sold it back to our own merchants as a new pricing tier. Best ROI move we've made this year.
— Head of Product, MeshCommerce
The 4-layer dbt model
For the data engineers reading this — the dbt layering we used:
models/
├── staging/ # 1-to-1 with source systems, lightly cleaned
│ ├── stg_stripe_charges.sql
│ ├── stg_shopify_orders.sql
│ └── stg_merchant_metadata.sql
├── intermediate/ # Business logic, denormalized
│ ├── int_orders_attributed.sql
│ └── int_customer_lifetime_value.sql
├── marts/ # What dashboards query (via Cube)
│ ├── core/
│ │ ├── dim_merchants.sql
│ │ ├── fct_orders.sql
│ │ └── fct_revenue_daily.sql
│ └── analytics/
│ ├── mart_cohort_retention.sql
│ └── mart_sku_profitability.sql
└── metrics/ # dbt metrics layer, mirrored into CubeEvery model is tested with dbt tests (unique, not_null, relationships, accepted_values), and the marts layer has merchant-id-presence tests that fail the build if any model could possibly leak cross-merchant data. RLS by construction, not by configuration.
What we'd do differently next time
- Cube earlier, dbt later. We spent weeks 3–5 on dbt models before bringing Cube in. In hindsight, defining the semantic layer first would have saved 6–8 days of model re-shaping.
- Performance budgets on every dashboard. We did load testing in week 12. Next time, every dashboard ships with a P95 latency budget from day 1 — and gets blocked from merging if it exceeds.
- Ship the report builder later. The custom report builder was 30% of the engineering effort but only 8% of usage in the first 90 days. We'd cut it from v1 and phase it.
Numbers for the math nerds
- Build cost: $42,000 (fixed)
- Annual infrastructure (Snowflake + Cube + Airbyte): ~$48,000
- Annual maintenance retainer (months 1–12): $48,000
- Year-1 total cost: ~$138,000
- Year-1 revenue from new Pro plan: $1,800,000
- Year-1 ROI on the build: 13×
- Payback period: 28 days from launch
Want embedded analytics shipped like this?
Book a free 30-minute strategy call. We'll look at your data sources, your merchants, your pricing model, and tell you what a multi-tenant BI build would cost in writing within 48 hours. Or read the related guides: What does a SaaS MVP cost in 2026 · our BI service overview.
Want results like MeshCommerce?
Book a free 30-minute strategy call.
No pitch. Walk away with a clear scope, a fixed-price quote, and a 90-day delivery date — even if you don't hire us.
Book My Strategy CallMore case studies
Wealth Management
6 weeks → 4 days
compliance reporting cycle reduced by 95%
How Helios Wealth cut their compliance reporting cycle from 6 weeks to 4 days
Read case studyLogistics SaaS
73%
of support tickets auto-resolved in 90 days
