Goal: run a query on a schedule and land results somewhere useful.

Create (console, bq CLI, or API):
- The scheduled query needs a service identity with bigquery.jobs.create (to run) and read access on source datasets plus write access on the destination dataset.
- To CREATE the schedule you need bigquery.transfers.get; to run it needs bigquery.jobs.create and dataset permissions.

Destination options:
- Write to a table (append or truncate) for downstream dashboards.
- Export results to GCS (CSV/Parquet) for external consumers.

Schedule syntax is cron-like; pick intervals that match data freshness needs, not "every 5 minutes just in case". Each run bills like a normal query.

Traps:
- Location: the scheduled query runs in a location; it must match the source dataset location. Cross-location scheduled queries fail.
- The service account BigQuery Transfer Service uses must have all the data permissions. "It works when I run it manually" means YOUR user has them, not the scheduler identity.
- Long queries timing out: scheduled runs have limits; break huge transforms into staged queries writing intermediate tables.
- Notification: configure run notifications or monitor transfer run history; silent failures are the default if you never look.

Verify: trigger a manual run first, check the destination table row count and schema, then enable the schedule and watch the first two automatic runs.