Appearance
Budget Tables
The budget pacing system uses external tables (linked to Google Sheets), final tables (normalized long format), and a refresh log.
Table Summary
| Table | Type | Rows | Description |
|---|---|---|---|
suse_budget_platform_staging_v2 | External (Sheets) | ~8 | Reads Platform_Budget tab from Google Sheet |
suse_budget_region_staging_v2 | External (Sheets) | ~8 | Reads Region_Budget tab from Google Sheet |
suse_budget_config_staging_v2 | External (Sheets) | ~4 | Reads Quarter_Config tab from Google Sheet |
suse_budget_planned_q1_staging_v2 | External (Sheets) | ~50 | Reads 2026-Q1_Planned tab (granular media plan) |
suse_budget_planned_q2_staging_v2 | External (Sheets) | ~50 | Reads 2026-Q2_Planned tab (granular media plan) |
suse_budget_platform_final_v2 | Table | 24 | Platform × Quarter budgets (long format) |
suse_budget_region_final_v2 | Table | 8 | Region × Quarter budgets (long format) |
suse_budget_config_v2 | Table | 4 | Fiscal quarter date ranges |
suse_budget_planned_final_v2 | Table | 284 | Platform × Region × Product planned budgets (quarterly) |
suse_budget_planned_monthly_v2 | Table | 776 | Platform × Region × Product planned budgets (monthly) |
suse_budget_refresh_log_v2 | Table | -- | Refresh operation tracking |
External Tables (Staging)
These are federated queries — they read directly from Google Sheets without storing data in BigQuery. The authenticated user must have access to the sheet.
Google Sheet: SUSE Budget Tracking
suse_budget_platform_staging_v2
Reads the Platform_Budget tab. Wide format with quarter columns.
| Column | Type | Source |
|---|---|---|
Platform | STRING | Column A |
_2026_Q1 | INTEGER | Column B |
_2026_Q2 | INTEGER | Column C |
_2026_Q3 | INTEGER | Column D |
_2026_Q4 | INTEGER | Column E |
Column Naming
Sheet headers like "2026-Q1" become _2026_Q1 in BigQuery (prefixed underscore, hyphens replaced with underscores).
suse_budget_region_staging_v2
Same structure as platform staging, with Region in column A.
suse_budget_planned_q1_staging_v2 / suse_budget_planned_q2_staging_v2
Reads the 2026-Q1_Planned and 2026-Q2_Planned tabs. Granular media plan budgets at Platform × Region × Product level.
| Column | Type | Source |
|---|---|---|
Platform | STRING | Column A (without " Ads" suffix) |
Region | STRING | Column B (may contain multi-region like "NA + EMEA") |
Product_Line | STRING | Column C |
Product | STRING | Column D |
_2026_Q1 / _2026_Q2 | FLOAT64 | Column E (quarter total) |
_2025_11 ... _2026_04 | FLOAT64 | Columns F-H (monthly breakdown) |
Multi-Region Splitting
Rows with "NA + EMEA" or "EMEA + APAC + LATAM" in the Region column are split evenly across constituent regions during the refresh. The final tables only contain single regions.
suse_budget_config_staging_v2
| Column | Type | Source |
|---|---|---|
Quarter | STRING | "2026-Q1" format |
StartDate | DATE | First day of quarter |
EndDate | DATE | Last day of quarter |
Final Tables
suse_budget_platform_final_v2
Normalized long format. One row per platform per quarter.
| Column | Type | Description |
|---|---|---|
Platform | STRING | Platform name matching unified_performance_v2 |
Quarter | STRING | Fiscal quarter (e.g., "2026-Q1") |
QuarterBudget | FLOAT64 | Budget in USD |
_ingested_at | TIMESTAMP | Last refresh timestamp |
suse_budget_region_final_v2
| Column | Type | Description |
|---|---|---|
Region | STRING | GEO region matching unified_performance_v2 |
Quarter | STRING | Fiscal quarter |
QuarterBudget | FLOAT64 | Budget in USD |
_ingested_at | TIMESTAMP | Last refresh timestamp |
suse_budget_config_v2
| Column | Type | Description |
|---|---|---|
Quarter | STRING | Fiscal quarter |
StartDate | DATE | First day of quarter |
EndDate | DATE | Last day of quarter |
_ingested_at | TIMESTAMP | Last refresh timestamp |
SUSE fiscal year starts November 1:
- Q1: Nov 1 - Jan 31
- Q2: Feb 1 - Apr 30
- Q3: May 1 - Jul 31 (or Aug 31)
- Q4: Aug 1 - Oct 31 (or Sep 1 - Oct 31)
suse_budget_planned_final_v2
Quarterly planned budgets from the media plan. Multi-region rows are split evenly. One row per Platform × Region × Product × Quarter.
| Column | Type | Description |
|---|---|---|
Platform | STRING | Platform name with " Ads" suffix |
Region | STRING | Single region after multi-region split |
ProductLine | STRING | Product line (e.g., AI, Linux, Edge) |
Product | STRING | Product or campaign focus |
Quarter | STRING | Fiscal quarter |
PlannedBudget | FLOAT64 | Planned budget in USD (split evenly if multi-region) |
_ingested_at | TIMESTAMP | Last refresh timestamp |
suse_budget_planned_monthly_v2
Monthly planned budgets for monthly drill-down pacing. Same multi-region split logic.
| Column | Type | Description |
|---|---|---|
Platform | STRING | Platform name with " Ads" suffix |
Region | STRING | Single region after multi-region split |
ProductLine | STRING | Product line |
Product | STRING | Product or campaign focus |
Quarter | STRING | Fiscal quarter |
Month | DATE | First day of month (e.g., 2025-11-01) |
MonthLabel | STRING | Month in YYYY-MM format |
PlannedBudget | FLOAT64 | Monthly planned budget in USD |
_ingested_at | TIMESTAMP | Last refresh timestamp |
suse_budget_refresh_log_v2
| Column | Type | Description |
|---|---|---|
run_timestamp | TIMESTAMP | When the refresh ran |
table_name | STRING | Which table was refreshed |
rows_written | INT64 | Number of rows written |
status | STRING | SUCCESS or ERROR |
error_message | STRING | Error details if failed |
_ingested_at | TIMESTAMP | Same as run_timestamp |
Refresh Logic
The budget refresh scheduled query runs daily and performs a full replace:
DELETE FROM final WHERE TRUE(tables are tiny, < 30 rows)- Read from external table (Google Sheet)
- UNPIVOT wide → long format
- Filter out TOTAL rows, note text, and empty rows
- INSERT into final table
- Log to refresh log
See Budget Pacing Workflow for full details.