Technology
Data Engineering
Cost Optimization
DevOps

From dbt Cloud to Core: How a Tech Company Saved $100K+ and Got the Flexibility dbt Cloud Couldn't Offer

Zero-downtime migration with better tooling on the other side

TZ

Tony Zeljkovic

2025-04-15

Case study

How Narona Data migrated a high-growth tech company from dbt Cloud to dbt Core with zero downtime, saving over $100K annually while delivering custom tooling that dbt Cloud couldn't match.

Industry
Technology
Duration
~2 months
Stack
dbt Core, VS Code devcontainers, custom CLI wrapper, YAML linter, pytest, CI/CD
>$100K annual savings
30% faster development
zero downtime

Discovery

Audit & Team Assessment

The engagement started with an audit of the existing dbt Cloud setup, team interviews, and security policy review.

Key Findings

  • dbt Cloud couldn't meet the team's development environment requirements — VPN access, lineage integration, custom querying
  • The team preferred local development over another managed cloud environment
  • No mechanism existed to enforce best practices (defer commands, blocking expensive upstream builds)
  • YAML configuration quality was inconsistent — errors caught in production, not during development
  • Existing tools (dbt-checkpoint) lacked the extensibility the team needed for custom governance

Migration Strategy

A phased approach was chosen: devcontainer first (foundation), then CLI wrapper (best practices), then YAML tooling (governance). Each phase was sequenced so the team always had a working environment — zero downtime was a hard requirement.

Week 1-2Engagement KickoffAudit dbt Cloud setup, team interviews, security policy review

Result unlocked here

Created the foundation for the next discovery move.
Audit dbt Cloud setup, team interviews, security policy review

Build

VS Code Devcontainer

The foundation of the migration: a custom development environment that matched or exceeded dbt Cloud's capabilities.

What Was Built

A VS Code devcontainer with warehouse connection through VPN, lineage tracking, and database query tools. Compatible with both local machines and GitHub Codespaces for flexibility.

Why devcontainers over alternatives: The team needed a reproducible environment that worked identically across machines, supported VPN, and didn't require each engineer to maintain their own dbt setup. Devcontainers encapsulated everything — one setup, every machine.

What This Enabled

The team could develop dbt models locally with full warehouse access, lineage visibility, and query capabilities — things that had required workarounds or were impossible in dbt Cloud.

Week 2-4VS Code DevcontainerReady-made dbt environment with warehouse connection, VPN support, lineage, and query tools

Result unlocked here

Created the foundation for the next build move.
Ready-made dbt environment with warehouse connection, VPN support, lineage, and query tools
Week 5-7Custom dbt CLI WrapperExtendable CLI enforcing defer commands, blocking expensive upstream builds

Result unlocked here

Created the foundation for the next build move.
Extendable CLI enforcing defer commands, blocking expensive upstream builds
Week 6-8YAML Linter & Pytest FrameworkReal-time YAML validation, manifest-based custom governance tests in CI/CD

Result unlocked here

Created the foundation for the next build move.
Real-time YAML validation, manifest-based custom governance tests in CI/CD

Enable

Team Onboarding

With the devcontainer ready, each team member needed to be set up and comfortable before the old environment was retired.

Onboarding Approach

Documentation was written for the new environment, and scheduled 1:1 sessions were held with each team member to get them set up. This wasn't a group demo — each engineer's machine and workflow had specific considerations.

Why individual sessions: Engineers had different local setups, VPN configurations, and workflow habits. Group training would have papered over individual issues. One-on-one sessions ensured everyone was actually productive, not just "onboarded."

This phase ran in parallel with the CLI wrapper work — onboarding didn't block the next build phase.

Week 4-6Team OnboardingDocumentation, scheduled sessions with each team member to get set up

Result unlocked here

Created the foundation for the next enable move.
Documentation, scheduled sessions with each team member to get set up

Deliver

Migration Complete

The migration was complete with zero downtime — the team transitioned seamlessly from dbt Cloud to dbt Core with custom tooling.

MetricBeforeAfter
Annual platform costdbt Cloud licensing>$100K saved
Development speedSlowed by workarounds30% faster
Migration downtimeZero
Best practice enforcementManualAutomated via CLI
YAML qualityCaught in prodReal-time linting + CI/CD

What Made It Work

Three factors combined:

  1. Phased migration with zero downtime — The team always had a working environment. No "dark period" where productivity dropped.
  2. Custom tooling that exceeded dbt Cloud — The devcontainer, CLI wrapper, and YAML linter weren't just replacements — they were upgrades. The team was more productive after the migration, not just cheaper.
  3. Iterative refinement — The CLI wrapper rules and governance tests were tuned through experimentation with the team, not imposed top-down. Adoption was natural because the tools fit the team's actual workflow.
Week 8ResultMigration Complete>$100K annual savings, 30% faster development, zero downtime

Result unlocked here

>$100K annual savings
30% faster development
zero downtime

Closing readout

The migration became a self-service analytics platform.

The dashboard migration removed the immediate Looker cost and backlog pressure. The metadata captured along the way became the stronger asset: a verified semantic layer and agent loop that keeps improving with actual stakeholder use.

Talk through a similar migration