A production-ready dbt package that transforms raw Facebook Ads data integrated with Windsor.ai into clean, analytics-ready tables in BigQuery following standardized architecture patterns.
You can find a complete list of available Facebook Ads fields here.
- Multi-level data modeling: Structured models for campaigns, ads, insights, and audience data.
- Audience analytics: Demographic and location-based performance metrics.
- Business KPIs out of the box: Pre-calculated metrics like CTR, CPC, ROAS, and conversion rates.
- Reusable macros: 5 modular macros for consistent metric calculation and data transformation.
- Custom tests: 4 built-in tests to ensure data quality and prevent duplicates.
- Type safety: Safe and consistent casting of strings to numeric types using
safe_cast. - Performance optimized: Designed for BigQuery efficiency with native data types and filter logic.
- Built for Windsor.ai: Tailored to Windsor.ai's Facebook Ads schema and sync behavior.
- Currency normalization: Built-in exchange rate support for multi-currency reporting.
Before using this package, you have to integrate Facebook Ads data into BigQuery using the Windsor.ai connector to ensure the schema matches the expected format:
- Sign up for Windsor.ai's free trial.
- Connect your Facebook Ads account(s).
- Choose BigQuery as a data destination.
- Create and run a destination task for each of the 5 required tables by selecting specific fields. You can use the Report Presets dropdown to automatically select the necessary fields for each model (ad, campaign, location or user).
These tables must be created with the field structure defined in the sources.yml file:
-
facebook_ads_windsor_campaignsUse Campaign preset from the Report Presets dropdown
Campaign-level info such as objectives, budgets, and status
Key fields:
account_id,campaign_id,campaign_name,campaign_objective,campaign_status,campaign_budget_* -
facebook_ads_windsor_adsUse Ad preset from the Report Presets dropdown
Ad creative metadata and configuration
Key fields:
actor_id,ad_id,ad_name,adset_id,title,body,link_url,thumbnail_url -
facebook_ads_windsor_insightsRequired Fields: Account currency, Account ID, Account Name, Action Values Purchase, Actions Purchase, Ad ID, Ad Name, Campaign, Campaign ID, Campaign Objective, Campaign Status, Clicks, CPC, CPM, CTR, Date, Frequency, Impressions, Ad Placement, Reach, Amount Spent, Ad Status.
Daily ad performance metrics
Key fields:
date,account_id,campaign_id,ad_id,impressions,clicks,spend,actions_purchase -
facebook_ads_windsor_audience_locationUse User preset from the Report Presets dropdown
Audience performance segmented by demographics (age and gender)
Key fields:
date,age,gender,clicks,frequency,impressions,reach -
facebook_ads_windsor_audience_demographicsUse Location preset from the Report Presets dropdown
Audience metrics segmented by location (country and region)
Key fields:
date,country,region,clicks,frequency,impressions,reach
Windsor.ai will stream your Facebook Ads data to your BigQuery project in minutes. After verifying that the data is present, you're ready to start transforming it using this dbt package.
- Configure your dbt_project.yml:
vars:
facebook_ads_source_table: 'your-project.raw_data.facebook_ads_windsor_campaigns'
facebook_ads_start_date: '2024-01-01'
exclude_test_campaigns: true
min_spend_threshold: 0
min_impressions_threshold: 1- Make sure these source tables are available in your BigQuery project:
facebook_ads_windsor_campaignsfacebook_ads_windsor_adsfacebook_ads_windsor_insightsfacebook_ads_windsor_audience_locationfacebook_ads_windsor_audience_demographics
- Run the models:
# Run all models
dbt run
# Run specific layers
dbt run --select +stg_facebook_ads # Staging only
dbt run --select +int_facebook_ads # Staging + Intermediate
dbt run --select +facebook_ads # All models
# Run tests
dbt test| Model | Source table | Grain | Description |
|---|---|---|---|
stg_facebook_ads__campaigns |
facebook_ads_windsor_campaigns |
Campaign | Campaign-level metadata and hierarchy |
stg_facebook_ads__ads |
facebook_ads_windsor_ads |
Ad | Ad-level creative and metadata |
stg_facebook_ads__insights |
facebook_ads_windsor_insights |
Date + Account + Campaign + Ad | Daily performance metrics with deduplication |
| Model | Grain | Description |
|---|---|---|
int_facebook_ads__currency_normalized |
Date + Account + Campaign + Ad | Currency conversion and normalization layer |
int_facebook_ads__daily_metrics |
Date + Account + Campaign + Ad | Enhanced metrics with performance tiers and quality flags |
| Model | Grain | Description |
|---|---|---|
facebook_ads__base_spend |
Date + Account + Campaign + Ad | Core spend tracking with ROI-focused metrics |
facebook_ads__ad_performance_daily |
Date + Account + Campaign + Ad | Performance clustering and enhanced metric breakdown |
facebook_ads__campaign_summary |
Date + Campaign | Aggregated campaign metrics with ad-level insights |
facebook_ads__audience_metrics |
Date + Audience Type + Segment | Audience-level insights by demographic and location |
models/
βββ staging/
β βββ facebook_ads/
β βββ stg_facebook_ads__campaigns.sql # Campaign entities
β βββ stg_facebook_ads__ads.sql # Ad creative entities
β βββ stg_facebook_ads__insights.sql # Performance insights
β βββ sources.yml # Source table definitions
β βββ schema.yml # Model documentation & tests
βββ intermediate/
β βββ facebook_ads/
β βββ int_facebook_ads__currency_normalized.sql # Currency conversion
β βββ int_facebook_ads__daily_metrics.sql # Enhanced metrics
β βββ schema.yml # Model documentation & tests
βββ marts/
β βββ facebook_ads/
β βββ facebook_ads__base_spend.sql # Core spend tracking
β βββ facebook_ads__ad_performance_daily.sql # Full performance suite
β βββ facebook_ads__campaign_summary.sql # Campaign aggregated metrics
β βββ facebook_ads__audience_metrics.sql # Audience analytics
β βββ schema.yml # Model documentation & tests
analysis/
βββ docs/
β βββ package_capabilities.md # Package capabilities and features documentation
β βββ field_mapping.md # Field mapping reference
β βββ macros_documentation.md # Macros and custom tests documentation
βββ validation_row_count_consistency.sql # Row count validation
βββ validation_spend_totals.sql # Spend totals validation
βββ validation_key_field_consistency.sql # Key field validation
βββ validation_metric_consistency.sql # Metric consistency validation
βββ validation_data_quality.sql # Data quality validation
βββ validation_business_logic.sql # Business logic validation
βββ windsor_data_profiling.sql # Data profiling queries
data/
βββ exchange_rates.csv # Sample exchange rate data
tests/
βββ assert_facebook_ads_data_quality.sql # Data quality test
βββ assert_campaign_summary_aggregation.sql # Campaign aggregation validation
| Variable | Default | Description |
|---|---|---|
| facebook_ads_start_date | 2024-01-01 | Start date for data processing |
| exclude_test_campaigns | true | Filter out test campaigns/ads |
| min_spend_threshold | 0 | Minimum spend to include records |
| min_impressions_threshold | 1 | Minimum impressions to include records |
- Deduplication: Removal of duplicate records by grain.
- Type conversion: Safe string to numeric casting for purchase fields.
- Null handling: Coalesce logic for missing data.
- Test coverage: dbt tests for data validation.
Located in analysis/, these tests help monitor data consistency.
- Uniqueness: Ensures grain uniqueness across models.
- Not null: Validates required fields.
- Referential integrity: Checks hierarchical relationships.
- Business logic: Validates calculated metrics (ROAS, CPC, etc.).
- Data quality: Flags invalid or suspicious data.
Located in analysis/ for ongoing data consistency monitoring:
- Row count consistency: Validates identical record counts between mart models.
- Spend totals validation: Ensures spend amounts match when aggregated.
- Key field consistency: Checks for missing records between models.
- Metric consistency: Validates that calculated metrics are identical.
- Data quality validation: Checks for duplicates and invalid values.
- Business logic validation: Validates business rules and metric calculations.
Run tests and validations:
# Run all tests
dbt test
# Run validation queries
dbt compile --select analysis/validation_*
# Then execute the compiled SQL in your BigQuery console- Click-Through Rate:
clicks / impressions * 100 - Cost Per Click:
spend / clicks - Cost Per Mille:
spend / impressions * 1000
- Cost Per Conversion:
spend / conversions - Return on Ad Spend:
conversion_value / spend - Conversion Rate:
conversions / clicks * 100
- String conversion errors: The package uses
safe_cast()to handle string-to-numeric conversions for fields likeactions_purchase,action_values_purchase, andctr. - Duplicate records: The insights model includes deduplication logic that retains the record with the highest
spendorimpressionsper grain. - Test failures: Check the
return_on_ad_spend_consistencytest, which handles cases where conversion data may not be available.
This package includes 5 utility macros and 4 custom tests designed specifically for Facebook Ads data:
calculate_performance_metrics: Calculate CTR, CPC, CPM, conversion rate, ROAS, and cost per conversion.classify_performance_tier: Classify performance into tiers (High/Good/Average/Poor/No Spend).standardize_campaign_objective: Standardize Facebook campaign objectives to consistent names.validate_facebook_ads_data: Generate data quality validation flags.generate_facebook_ads_surrogate_key: Generate consistent surrogate keys for different grains.
facebook_ads_ctr_range: Test CTR values are within the 0-100% range.facebook_ads_metric_consistency: Test clicks never exceed impressions.facebook_ads_spend_consistency: Test spend consistency with activity.facebook_ads_performance_tier_valid: Test performance tier values are valid.
Usage example:
select
date_day,
campaign_id,
impressions,
clicks,
spend,
{{ calculate_performance_metrics('impressions', 'clicks', 'spend') }},
{{ classify_performance_tier('click_through_rate') }} as performance_tier
from my_facebook_ads_data- Package capabilities: Review
analysis/docs/package_capabilities.mdfor feature documentation. - Field mapping: Review
analysis/docs/field_mapping.mdfor field documentation. - Macros documentation: Review
analysis/docs/macros_documentation.mdfor detailed macro usage and examples. - Data profiling: Use
analysis/windsor_data_profiling.sqlto understand your data. - Source documentation: Review
models/staging/facebook_ads/sources.ymlfor field definitions. - Model documentation: Check schema.yml files in each layer for model and column documentation.
- Facebook Ads to BigQuery integration documentation: Read this guide https://windsor.ai/how-to-integrate-facebook-ads-into-bigquery/ for available integration methods.
- Validation queries: Use
analysis/validation_*.sqlfiles for ongoing data consistency monitoring.
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests for new functionality
- Submit a pull request
The data/exchange_rates.csv file contains sample exchange rate data that has been generated for demonstration and testing purposes. This data should not be used for production financial calculations or real-world currency conversions.
For production use, please replace with actual exchange rate data from authoritative financial sources.
