This article zeroes in on dbt Cloud job scheduling and notifications, focusing on the design decisions teams actually wrestle with. You'll come away with a working understanding of UI behavior, when to reach for the API, and the principles behind solid notification design.
We cover the concepts that show up most often on the dbt Analytics Engineer Certification — job components, schedule design, failure notifications, and rerun policy — alongside real-world best practices.
A dbt Cloud job defines a sequence of commands (e.g., dbt build, dbt test) in a specific Environment and is launched by a trigger (schedule, manual, API, or PR/CI). Notifications are configured per job and can be sent to Slack, email, or — depending on your plan — a generic webhook on state changes such as success or failure.
Schedules can be set through the UI or with a cron expression, and steps within a job execute in the order you define them. Model parallelism is controlled by the thread count (--threads) on each command. The API lets you trigger jobs safely at any time, override the Git branch, and attach a cause message.
| Trigger Type | Primary Use | Launch Latency | Notification Behavior |
|---|---|---|---|
| Schedule | Scheduled batches — daily, hourly, weekly | Stable (anchored to base time) | Sends on success / failure / completion |
| Manual / Button | Emergency reruns, validation | Immediate (user-driven) | Follows the job's notification settings |
| API | Calls from upstream orchestrators | Immediate to a few seconds | Follows the job's notification settings |
| PR/CI | Change validation (per branch / PR) | Event-driven (Git webhook) | Typically failure-focused |
Conceptual flow: job execution and notifications
Trigger a job via the API (POST /api/v2/accounts/{account_id}/jobs/{job_id}/run/)
curl -X POST \
-H "Authorization: Token <DBT_CLOUD_API_TOKEN>" \
-H "Content-Type: application/json" \
https://cloud.getdbt.com/api/v2/accounts/<ACCOUNT_ID>/jobs/<JOB_ID>/run/ \
-d '{
"cause": "Triggered from orchestrator",
"git_branch": "main"
}'Start by working backward from data arrival and downstream SLAs to choose your cadence (hourly, daily, weekly, etc.). Incremental-model-heavy workloads typically run hourly or every 30 minutes; snapshots and aggregation closeouts are usually daily. To avoid overlapping runs, keep the interval comfortably longer than the runtime of a single execution.
Order the steps inside a job to match dependencies — for example, dbt deps → seed → build → test → docs generate. Keep seeds and tests to the minimum needed and consider splitting slow tests into a nightly job. The UI scheduler supports both simple selectors and cron expressions, so business-days-only schedules or specific-weekday exclusions are all expressible.
Design notifications around who acts, when, and on what. For production jobs, the common pattern is immediate alerts on failure and aggregated/summary delivery for success. Slack gives you channel-based visibility; email is stronger for audit trails and long-form messages. Webhooks (where your plan supports them) let you plug into external alert management.
Splitting notifications per job keeps the noise down. Send overnight failures to the on-call channel and validation jobs to a dev channel. Include the job name, environment, run ID, and cause in every message — it makes first-pass triage much faster.
1) Verify the Environment and lock down the connection target, permissions, and variables (env vars, dbt_project.yml target, etc.). 2) Create the Job and register the dbt command sequence in Steps. 3) Configure the Schedule (UI selector or cron expression). 4) Wire up Slack, email, or webhooks in Notifications and select which events (success/failure/completion) to send. 5) Run a test execution and verify that run results and artifacts (run results, logs) arrive as expected.
Including environment and cadence in the job name keeps operations clear (e.g., prod-hourly-build). Use --threads and --select/--exclude to tighten the scope of each command, and split slow models or flaky external dependencies into separate jobs.
Representative job step example
dbt deps
# Seed only the critical sets (tag-controlled)
dbt seed --select tag:seed_core --threads 4
# Diff-focused; include upstream change impact
dbt build --select state:modified+ --threads 8
# Keep only the critical tests in the production batch
dbt test --select tag:criticalDesign incremental models for idempotency — reruns should produce the same result. When upstream is delayed and data hasn't arrived, an empty run must not break anything. On failure, isolate the cause first, rerun manually or via API, and always record the cause.
To avoid overlap risk, keep the schedule interval comfortably above the runtime. If runs keep growing longer, split models, adjust threads, or reconsider the scope. Store logs and artifacts systematically and continuously surface metrics — success rate, runtime, and failure reasons.
Remember that a job is the combination of Environment, Steps, Triggers, and Notifications; that schedules support both UI and cron expressions; and that notifications are easiest to control at the job level. PR/CI should be designed independently of production schedules, with separate notification channels.
The common pitfalls are mismatches between runtime and schedule interval, notification noise from over-sending success messages, and traceability issues when the cause note is left blank. Exam questions frequently ask you to pick the right trigger or notification target for a given use case.
Analytics Engineer
問題 1
An hourly production job has an incremental model that occasionally runs longer than 40 minutes and overlaps with the next scheduled run. Notifications go to the on-call Slack channel. Which is the most appropriate response?
正解: A
The right approach to avoiding overlapping runs is to align the interval with actual runtime. To control notification noise, immediate alerts on failure only is appropriate for production. B is over-notification, C misses the SLA, and D introduces contention and double-write risk.
Should I use UI scheduling or a cron expression?
If your requirements are simple (hourly, daily, etc.), the UI scheduler is enough. When you need flexibility — business days only or excluding specific weekdays — a cron expression is the better fit. Either way, design around runtime variability and dependencies, since both affect stable operations.
Can notifications be configured beyond overall job success/failure?
By default, notifications are tied to run state transitions (success, failure, completion). When you need fine-grained conditional logic, the practical approach is to forward events to an external alerting platform via webhook and manage the routing rules there.
What happens if a job is still running when the next scheduled time arrives?
Design to avoid overlapping runs — keep the interval comfortably longer than the runtime. If long durations become the norm, consider splitting models, narrowing the scope, increasing threads, or optimizing queries.
Practice with certification-focused question sets
無料で問題を解いてみるNicheeLab Editorial Team
NicheeLab editorial team focused on data engineering and cloud certification learning. Content is structured around practical study needs and official exam domains.
dbt Models: SQL-Defined Transformation Units (2026)
Model fundamentals — SELECT-based definitions, naming, refs,...
dbt Analytics Engineering Exam: Complete Guide (2026)
Pass the AE Certification — scope, weighting, sample questio...
dbt Cloud vs dbt Core: Feature & Cost Comparison (2026)
Honest comparison of dbt Cloud vs. dbt Core — IDE, scheduler...
dbt Project Structure: models/seeds/macros Layout (2026)
Recommended dbt project layout — models, seeds, macros, snap...
dbt_project.yml Explained: Every Config (2026)
Every dbt_project.yml setting that matters — paths, vars, ma...