Your First Pipeline¶
A step-by-step walkthrough from empty project to scheduled dashboard — using Google Sheets as an example.
What You'll Build¶
By the end of this tutorial, you'll have:
- A Dango project connected to a Google Sheets data source
- Data synced into DuckDB
- A dbt model transforming your data
- A Metabase dashboard visualizing results
- A scheduled sync keeping everything up to date
Time: ~20 minutes (mostly waiting for OAuth setup in Google Cloud Console)
Prerequisites¶
- Dango installed (Installation Guide)
- Python 3.10+ and Docker Desktop running
- A Google account with a Google Sheet containing data
- Virtual environment activated
Don't have a Google Sheet handy?
Create one with sample data — any spreadsheet with headers in row 1 works. For example, a sales tracker with columns: date, product, quantity, revenue.
Step 1: Initialize Your Project¶
The wizard asks for an admin password — this protects the Web UI and Metabase. Pick something memorable for local development.
Your project structure:
my-analytics/
├── .dango/ # Configuration
├── .dlt/ # dlt credentials (gitignored)
├── dbt/ # Transformation models
└── data/ # DuckDB warehouse
Step 2: Add a Google Sheets Source¶
The interactive wizard walks you through setup. For Google Sheets, the key prompts are:
- Select source type → choose Google Sheets
- Source name → give it a name (e.g.,
sales_data) - OAuth setup → the wizard opens your browser for Google login
- Spreadsheet URL → paste the URL of your Google Sheet
See Adding Sources for the full wizard reference.
OAuth: What to Expect¶
The wizard needs OAuth credentials to access your Google account. If you haven't set them up before:
- Go to Google Cloud Console
- Create a project (or use an existing one)
- Enable the Google Sheets API
- Configure the OAuth consent screen (External type, Testing mode is fine)
- Create OAuth client ID credentials (Desktop app)
- Enter the Client ID and Client Secret when the wizard asks
\"App not verified\" warning
When authorizing, Google shows a warning because your app is in testing mode. Click Advanced → Go to [your app] to continue. This is expected and safe for your own data.
See the OAuth Troubleshooting Guide if you hit issues.
Step 3: Sync Your Data¶
Dango will:
- Fetch data from your Google Sheet via the Sheets API
- Load it into DuckDB (table:
raw_sales_data.*) - Auto-generate dbt staging models
- Run dbt transformations
You'll see progress output as each step completes. After sync:
Step 4: Start the Platform¶
This boots the full stack:
- Metabase dashboard server (via Docker)
- FastAPI web server (monitoring UI at
http://localhost:8800)
Background process
On macOS, dango start runs in the background. Closing the terminal does not stop Dango — the process continues running. Run dango start again at any time to check status or restart if needed.
Wait for the "Platform is ready" message before continuing.
Step 5: Explore in Metabase¶
Open the Web UI:
Click Open Metabase (or go directly to http://localhost:3000). Log in with the admin credentials Dango set up automatically.
In Metabase:
- Click New → Question
- Pick your table (under the schema matching your source name)
- Build a visualization — try a bar chart of revenue by product
Create a Dashboard¶
- Click New → Dashboard
- Give it a name (e.g., "Sales Overview")
- Click + to add your question(s)
- Arrange and resize cards
- Click Save
Save Dashboard Config¶
Export your dashboard to version-controllable YAML:
This creates files in metabase/ that you can commit to Git.
Step 6: Add a dbt Model¶
Create a custom model to transform your data:
The wizard asks:
- Model name → e.g.,
monthly_revenue - Source → select your
sales_datasource - Layer → choose marts (for business-level aggregations)
This creates a SQL file at dbt/models/marts/monthly_revenue.sql. Edit it:
-- dbt/models/marts/monthly_revenue.sql
SELECT
DATE_TRUNC('month', date) AS month,
product,
SUM(quantity) AS total_quantity,
SUM(revenue) AS total_revenue
FROM {{ ref('stg_sales_data__sheet1') }}
GROUP BY 1, 2
ORDER BY 1 DESC
Run the model:
Your new monthly_revenue table now appears in Metabase for dashboarding.
Step 7: Schedule Automatic Syncs¶
Keep your data fresh with a scheduled sync:
The wizard asks:
- Source → select
sales_data - Frequency → e.g., daily at 8:00 AM
- Include dbt? → Yes (runs transformations after sync)
Verify the schedule:
Your pipeline is now fully automated — data syncs daily, transformations run, and Metabase dashboards update automatically.
What You've Built¶
| Component | What it does |
|---|---|
| dlt | Extracts data from Google Sheets into DuckDB |
| DuckDB | Stores all your data locally (single file) |
| dbt | Transforms raw data into analysis-ready models |
| Metabase | Visualizes data as interactive dashboards |
| APScheduler | Runs syncs on a cron schedule |
Next Steps¶
- Add more sources — run
dango source addto connect Stripe, HubSpot, CSV files, APIs, and 30+ more - Write custom models — see Custom Models for intermediate and marts patterns
- Deploy to cloud — see Deployment to run 24/7 on a server
- Monitor data quality — set up Schema Drift and PII Scanning
- Set up webhooks — get notified on sync failures via Webhook Notifications