Wicked Smart Data
LearnInsightsAboutContact
Sign InLet's Build
LearnInsightsAboutContact
Sign InLet's Build
Wicked Smart Data

Intelligence, automation, and expert execution — plus an elite library of free knowledge. We turn complexity into competitive advantage.

Start a conversation

Platform

  • Learning Paths
  • Insights
  • RSS Feed

Company

  • About
  • Contact
  • Work With Us

Legal

  • Privacy Policy
  • Terms of Service

© 2026 Wicked Smart Data. All rights reserved.

Intelligence · Automation · Advantage

All Insights
Microsoft Fabric

Scheduling and Automating Fabric Data Pipeline Runs with Activity-Level Retries, Alerts, and Email Notifications

Learn how to turn a basic Fabric pipeline into a production-grade, self-healing automation. This lesson covers schedule triggers, activity-level retry policies, workspace alerts, and custom email notifications with dynamic content — everything you need to stop monitoring pipelines manually.

🌱 Foundation18 min readSep 22, 2026Updated Sep 22, 2026
Scheduling and Automating Fabric Data Pipeline Runs with Activity-Level Retries, Alerts, and Email Notifications
On this page
  • Introduction
  • Prerequisites
  • Understanding the Automation Stack
  • Setting Up a Schedule Trigger
  • Understanding Recurrence vs. Fixed Time
  • Activity-Level Retry Policies: Building Self-Healing Pipelines
  • Configuring Retries on a Copy Activity
  • How Retries Interact with the Activity Timeout
  • Pipeline-Level Alerts in Fabric
  • Creating a Pipeline Alert
  • Alert Emails: What They Contain
  • Sending Custom Email Notifications from Inside the Pipeline
  • Adding an Office 365 Outlook Activity
  • Using Dynamic Expressions in Email Content
  • Building Success and Failure Notification Paths
  • The Pattern
  • Capturing Failure Details in the Failure Email
  • Hands-On Exercise
  • Common Mistakes and Troubleshooting
  • Summary and Next Steps

Scheduling and Automating Fabric Data Pipeline Runs with Activity-Level Retries, Alerts, and Email Notifications

Introduction

Picture this: your company runs a nightly ETL process that pulls sales data from a REST API, transforms it in a Spark notebook, and loads it into a lakehouse table that feeds the executive dashboard. Everything works great — until one Wednesday at 2 AM when the source API times out, the pipeline fails silently, and your CFO opens a report Thursday morning that's showing Tuesday's numbers. Nobody notices until the weekly review meeting. That's an uncomfortable conversation.

The answer isn't better luck. It's better automation. Scheduling a pipeline is just the beginning — production-grade orchestration means the pipeline runs on its own, retries transient failures automatically, alerts the right people when something genuinely goes wrong, and sends a confirmation email when the nightly load succeeds. By the end of this lesson, you'll have all of that working in Microsoft Fabric.

What you'll learn:

  • How to schedule a Fabric data pipeline to run on a recurring trigger
  • How to configure activity-level retry policies so transient failures don't kill your pipeline
  • How to set pipeline-level alerts that fire on success, failure, or cancellation
  • How to use the Office 365 Outlook activity to send structured email notifications from inside a pipeline
  • How to combine conditions and notifications into a reliable, self-healing automation pattern

Prerequisites

Before diving in, you should be comfortable with the basics of building a Fabric data pipeline — creating Copy activities, chaining activities together, and understanding the pipeline canvas. If you're new to that, work through Orchestrating Loads with Fabric Data Pipelines: Copy Activities, Parameters, and Schedules first, then come back here.

You'll also want a Fabric workspace to practice in. If you haven't set one up yet, Fabric Capacities and Workspaces: F SKUs, Trials, and Setting Up Your First Workspace walks you through that process.


Understanding the Automation Stack

Before touching any buttons, let's clarify what "automating" a pipeline actually involves. There are three distinct layers, and they work together:

  1. Scheduling — telling Fabric when to start the pipeline (time-based triggers)
  2. Resilience — telling individual activities what to do when they fail (retry policies)
  3. Observability — telling people what happened after the run (alerts and email notifications)

Most beginners set up the schedule and stop there. The result is a pipeline that runs on time but fails silently whenever anything goes wrong. Real production automation requires all three layers.

Key insight

A scheduled pipeline that fails silently is often worse than no automation at all. At least with manual runs, someone notices the data hasn't arrived. Silent failures create stale data that looks current — the most dangerous kind of data problem.


Setting Up a Schedule Trigger

A schedule trigger tells Fabric to start your pipeline automatically at specified times. Think of it like a digital alarm clock that rings and automatically kicks off your pipeline instead of waking you up.

To add a schedule trigger to an existing pipeline:

  1. Open your pipeline in the Fabric workspace.
  2. On the pipeline canvas, click the Schedule button in the top toolbar. It looks like a clock icon and lives next to the Run button.
  3. A panel slides in from the right. Toggle the Scheduled run switch from Off to On.
  4. Set your Repeat frequency. Your options are: Minute, Hour, Day, Week, Month. For most ETL workloads, you'll choose Day or Hour.
  5. Set the Start time — this is the datetime when the trigger becomes active. Always use UTC unless you're extremely disciplined about timezone management across your team.
  6. Set the End time if the schedule should eventually stop (useful for project-specific pipelines). Leave it blank for indefinitely recurring pipelines.
  7. If you selected Week, checkboxes appear for each day of the week. Select only the days when data is actually available from the source. There's no point running a Monday–Saturday ETL on Sunday if the source system is offline.

Click Apply to save the schedule. The pipeline now has an active trigger. You'll see a small calendar icon appear on the pipeline tile in the workspace view.

Tip

Stagger your pipeline start times. If you have five pipelines all scheduled for midnight, they'll compete for capacity simultaneously. Offset them by 5–15 minutes (12:00 AM, 12:05 AM, 12:15 AM, etc.) and your Fabric capacity will thank you. You can monitor capacity pressure in the Monitoring Hub.

Understanding Recurrence vs. Fixed Time

The Repeat: Minute and Repeat: Hour options include an Interval field. Setting Repeat to Hour with Interval 4 means "run every 4 hours starting from the start time." This is different from listing specific hours — it's a rolling cadence. If your start time is 6:00 AM and interval is 4 hours, you get 6 AM, 10 AM, 2 PM, 6 PM, and 10 PM.

For daily pipelines where timing precision matters (like "run at 11:30 PM every weeknight"), use Day with the specific time set in the time picker.


Activity-Level Retry Policies: Building Self-Healing Pipelines

Schedules get the pipeline started. Retry policies handle what happens when an individual activity inside the pipeline hits a temporary problem.

A retry policy is a set of instructions that says: "If this activity fails, wait a moment and try again, up to N times, before officially giving up." This is crucial because many failures are transient — a brief network hiccup, a momentary timeout from a source API, a temporary lock on a database table. Without a retry, that 0.5-second network blip kills your entire pipeline. With a retry, the pipeline pauses, waits 30 seconds, and succeeds on the second attempt without anyone noticing.

Configuring Retries on a Copy Activity

To set a retry policy on an activity:

  1. Click on the activity in the pipeline canvas (for example, a Copy activity that pulls from a REST API).
  2. In the properties panel below the canvas, click the Settings tab (not the Source or Sink tabs — the Settings tab applies to the activity itself).
  3. You'll see the following fields:
    • Retry: The number of retry attempts. Set this to 2 or 3 for most activities.
    • Retry interval (sec): The number of seconds to wait between retry attempts. 30–60 seconds is a reasonable default. For rate-limited APIs, you may need 120 seconds or more.
    • Secure output: Hides the activity output from logs (useful for activities that return sensitive data — unrelated to retries, but worth knowing it's here).
    • Secure input: Same concept for input parameters.

Set Retry to 3 and Retry interval to 60 for a Copy activity hitting an external API. This means the activity will try up to 4 times total (1 initial attempt + 3 retries), waiting 60 seconds between each attempt.

Warning

Don't set retry counts too high on activities that write data without idempotency checks. If a database insert activity runs 4 times due to retries, you might get 4 copies of the same rows. Always design your sink operations to be idempotent (safe to run multiple times) — for example, use UPSERT patterns or truncate-and-reload rather than INSERT-only when enabling retries.

How Retries Interact with the Activity Timeout

Each activity also has a Timeout field in the same Settings tab. This is the maximum time a single attempt can run before Fabric forcibly fails it. If your Copy activity normally takes 3 minutes and you set a 2-minute timeout, every attempt will fail — including retries. Make sure your timeout is comfortably above the normal runtime of the activity, with some headroom for slow days.

A reasonable rule of thumb: set timeout to 3–5x the median runtime of the activity. For a 3-minute activity, set timeout to 10–15 minutes.

Note

The Retry and Timeout settings apply per activity, not to the entire pipeline. You can — and often should — have different retry settings on different activities. A Lookup activity hitting an internal SQL source might need no retries, while a Copy activity hitting an external API needs 3.


Pipeline-Level Alerts in Fabric

Beyond retries (which happen silently inside the pipeline), you need alerts — notifications that reach a human when something important happens. Fabric includes a built-in alerting mechanism for pipelines.

An alert in Fabric is a workspace-level rule that monitors a pipeline's run status and triggers an action (typically an email) when the pipeline succeeds, fails, or is cancelled.

Creating a Pipeline Alert

To set up an alert:

  1. In your Fabric workspace, find the pipeline tile. Don't open the pipeline — just hover over the tile in the workspace view.
  2. Click the ellipsis (...) menu on the pipeline tile.
  3. Select Set alert from the dropdown. This opens the alert configuration panel.
  4. Under Alert condition, choose the trigger:
    • Run failed — fires when a pipeline run ends with a Failed status
    • Run succeeded — fires when a pipeline run ends successfully
    • Run cancelled — fires when a run is manually cancelled or times out at the pipeline level
  5. Under Action, select Send email and enter the email address(es) to notify. You can add multiple recipients separated by commas.
  6. Give the alert a name that makes it self-explanatory: "Nightly Sales ETL — Failure Alert" is far better than "Pipeline Alert 1."
  7. Click Create.

Fabric will now send an email to the specified addresses every time the alert condition is met.

Tip

Create two alerts per critical pipeline: one for failure (so you can investigate and fix issues) and one for success (so you can confirm the nightly run landed before business users start their day). The success alert email acts as a daily "heartbeat" confirmation.

Alert Emails: What They Contain

The automatically generated alert email includes the pipeline name, the workspace it lives in, the run status, the start time, and a link directly into the Fabric monitoring view for that run. It's genuinely useful — you can click the link from your phone, see which activity failed, and get a sense of the error before you're even at your desk.

These built-in alerts are great for simple notifications, but they have limits: you can't customize the email body, you can't attach data, and you can't send to external systems like Teams or Slack. For richer notifications, you build them inside the pipeline itself using the Office 365 Outlook activity.


Sending Custom Email Notifications from Inside the Pipeline

The Office 365 Outlook activity in Fabric data pipelines lets you send a fully custom email as one of the steps in your pipeline. Unlike external alerts, this runs as part of the pipeline logic, which means you can:

  • Include dynamic values (row counts, timestamps, filenames) in the email body
  • Send different emails for success vs. failure paths
  • Format the email body as HTML for readability
  • Trigger the email conditionally based on upstream activity results

Adding an Office 365 Outlook Activity

On the pipeline canvas:

  1. Click Add activity in the toolbar, or click the + button on any activity's success/failure/completion output arrow.
  2. In the activity search, type "Outlook" and select Office 365 Outlook.
  3. Drag it to the appropriate position on the canvas — or connect it from an existing activity's output.

Click on the Office 365 Outlook activity to configure it in the properties panel:

  • Connection: Click New to create an authenticated connection to your Office 365 account. Fabric will prompt you to sign in with your Microsoft 365 credentials. Once authenticated, the connection is saved and can be reused across pipelines. The email will be sent from this account's email address.
  • To: The recipient email address(es). You can hardcode an address, or use a pipeline parameter to make it configurable.
  • Subject: The email subject line. This supports dynamic content.
  • Body: The email body. This also supports dynamic content and HTML.
  • Importance: Low, Normal, or High. Use High sparingly — if everything is high priority, nothing is.

Using Dynamic Expressions in Email Content

The real power of the Outlook activity is injecting pipeline variables and activity outputs into the email. Click the Add dynamic content link (or the expression icon) next to the Subject or Body field to open the expression builder.

Here's an example subject line using dynamic content:

[SUCCESS] Nightly Sales ETL completed at @{formatDateTime(utcNow(), 'yyyy-MM-dd HH:mm')} UTC

And an example HTML body:

<h2>Nightly Sales ETL — Run Complete</h2>
<p><strong>Status:</strong> Success</p>
<p><strong>Pipeline:</strong> @{pipeline().Pipeline}</p>
<p><strong>Run ID:</strong> @{pipeline().RunId}</p>
<p><strong>Completed at:</strong> @{formatDateTime(utcNow(), 'yyyy-MM-dd HH:mm')} UTC</p>
<p>All activities completed successfully. The sales lakehouse table has been updated.</p>
<p>— Automated Notification from Microsoft Fabric</p>

The expressions wrapped in @{...} are evaluated at runtime. pipeline().Pipeline returns the pipeline's name, pipeline().RunId returns the unique identifier for this specific run, and utcNow() returns the current UTC timestamp.

Tip

Always use formatDateTime(utcNow(), 'yyyy-MM-dd HH:mm') instead of raw utcNow() in email subjects. The raw timestamp includes milliseconds and timezone suffixes that make subjects look cluttered. The formatted version reads cleanly.


Building Success and Failure Notification Paths

Here's where the pieces come together into a real pattern. A production pipeline doesn't just do its work and stop — it branches at the end to send a success or failure notification based on what actually happened.

The Pattern

Structure your pipeline like this:

  1. All your real work — Copy activities, Notebook activities, Dataflow activities, etc.
  2. A success path — connected from the last work activity's green "On Success" arrow, leading to a success email Outlook activity
  3. A failure path — connected from one or more critical activities' red "On Failure" arrows, leading to a failure email Outlook activity

To create these connections on the canvas: click on an activity to select it. Small colored circles appear on its edges:

  • Green circle = success output
  • Red circle = failure output
  • Blue circle = completion output (runs regardless of success or failure)

Drag from the appropriate colored circle to your Outlook activity to create the dependency with the correct condition.

Capturing Failure Details in the Failure Email

For failure notifications, it's incredibly helpful to include the name of the activity that failed and the error message. You can reference the output of a specific activity using:

@{activity('Copy Sales Data').error.message}

Replace 'Copy Sales Data' with the exact name of the activity you want to capture errors from. The full failure email body might look like:

<h2>⚠️ Nightly Sales ETL — FAILED</h2>
<p><strong>Pipeline:</strong> @{pipeline().Pipeline}</p>
<p><strong>Run ID:</strong> @{pipeline().RunId}</p>
<p><strong>Failed at:</strong> @{formatDateTime(utcNow(), 'yyyy-MM-dd HH:mm')} UTC</p>
<p><strong>Error message:</strong> @{activity('Copy Sales Data').error.message}</p>
<p>Please investigate via the 
<a href="https://app.fabric.microsoft.com">Fabric Monitoring Hub</a>.</p>

Warning

The activity('ActivityName').error.message expression only evaluates correctly if that activity actually failed. If you use this expression in an email that might also run on the success path, it will throw an expression error. Keep your success and failure email activities separate, with separate bodies.


Hands-On Exercise

Let's build a complete, automated pipeline from scratch. You'll create a pipeline that copies a small CSV file from an HTTP source into a lakehouse, sends a success email, and sends a failure email with error details if anything goes wrong.

Step 1: Create the pipeline

In your Fabric workspace, click New → Data pipeline. Name it Daily Product Feed — Automated.

Step 2: Add a Copy activity

Add a Copy activity to the canvas. Name it Copy Product CSV. Configure the source as an HTTP connection pointing to any publicly available CSV (for example, a sample CSV from GitHub). Configure the sink as a Fabric Lakehouse table in your existing lakehouse. If you don't have a lakehouse yet, Building Your First Lakehouse in Microsoft Fabric will get you set up.

Step 3: Configure retries

Click the Copy Product CSV activity. Go to Settings tab. Set:

  • Retry: 2
  • Retry interval (sec): 30
  • Timeout: 00:10:00 (10 minutes)

Step 4: Add a success email

Drag from the green success circle of Copy Product CSV to a new Office 365 Outlook activity. Name it Email — Success. Configure:

  • To: your own email address
  • Subject: [SUCCESS] Daily Product Feed completed — @{formatDateTime(utcNow(), 'yyyy-MM-dd')}
  • Body: An HTML body confirming the copy completed (use the template from the earlier section)

Step 5: Add a failure email

Drag from the red failure circle of Copy Product CSV to a second Office 365 Outlook activity. Name it Email — Failure. Configure:

  • To: your own email address
  • Subject: [FAILURE] Daily Product Feed — @{formatDateTime(utcNow(), 'yyyy-MM-dd')}
  • Body: An HTML body including @{activity('Copy Product CSV').error.message}

Step 6: Set up the schedule

Click the Schedule button in the toolbar. Enable the scheduled run. Set Repeat to Day, time to your preferred run time, Start date to today. Click Apply.

Step 7: Set up the workspace alert

Close the pipeline. In the workspace view, find the pipeline tile, click the ellipsis, choose Set alert. Create a Run Failed alert sending to your email. Create a second Run Succeeded alert.

Step 8: Test it

Click Run manually on the pipeline canvas. Watch the activity status indicators as it runs. Check your inbox — within a few minutes, a success email should arrive. Then deliberately break the HTTP source URL, run again, and confirm the failure email arrives with the error message.


Common Mistakes and Troubleshooting

The schedule isn't triggering Check that the schedule is actually enabled (the toggle is On, not just saved). Also confirm the Start time is in the past — if you set a start time of tomorrow, the trigger won't fire until then. Verify the pipeline isn't in a Draft state; only published pipelines run on schedule.

Retry attempts aren't happening The retry count applies only to activity-level failures (the activity itself errors out). If the pipeline encounters an expression error or a configuration problem, retries won't help — that's a design-time error, not a transient runtime failure. Use Run History in the Monitoring Hub to see whether retries were attempted.

The Outlook activity throws an authentication error The Office 365 connection authenticates with the credentials of whoever created it. If that person's account loses access to the Office 365 tenant, the activity will fail. Use a shared service account or a team mailbox for the connection if possible, rather than a personal account.

The failure email fires even when the pipeline succeeds This happens when you accidentally connect the Outlook activity via a Completion arrow (blue) instead of a Failure arrow (red). Delete the connection and redraw it specifically from the red failure output circle.

Email body expressions throw errors Double-check that activity names in your expressions exactly match the activity name on the canvas, including spaces and capitalization. activity('Copy Product CSV') and activity('copy product csv') are different things. The expression editor will validate syntax but not name matching — that only surfaces at runtime.

Note

You can dig into every retry attempt and activity error message in the Fabric Monitoring Hub. Navigate to your workspace, click Monitor in the left navigation, and you'll see a full run history with expandable activity details. This is your first stop for any debugging. The article on Monitoring Fabric Capacity Usage and Pipeline Activity with the Monitoring Hub covers this in depth.


Summary and Next Steps

You now have a complete automation pattern for Fabric data pipelines: a schedule that starts the work, retry policies that handle transient failures gracefully, workspace alerts that notify on overall run status, and in-pipeline email notifications with dynamic content that tell the right people exactly what happened.

The mental model to take away: scheduling gets it started, retries make it resilient, alerts and emails make it observable. All three matter. A pipeline without observability is a black box — and black boxes fail quietly.

From here, there are a few natural places to go deeper. If your pipeline orchestrates Spark notebooks for transformation work (as part of a medallion architecture), the same retry and notification patterns apply to your Notebook activities. If you're ingesting data via Dataflow Gen2, those can be wrapped inside a pipeline activity and get the same treatment.

For teams managing multiple pipelines across environments, connecting your pipelines to source control with Fabric Git Integration and Deployment Pipelines means your retry configs and schedules travel with your pipeline definition when you promote from dev to production — so you never have to re-configure automation after a deployment.

Work With Us

From insight to implementation

Reading is the start. When you're ready to build the data, automation, or AI systems behind it, our team turns strategy into shipped results.

Let's Build

Microsoft Fabric Fundamentals

Previous

Monitoring Fabric Capacity Usage and Pipeline Activity with the Monitoring Hub

Next

Writing and Running Your First PySpark Notebook in Microsoft Fabric: Reading Files, Creating Delta Tables, and Saving to the Lakehouse

Related Insights

Microsoft FabricFoundation

Writing Your First PySpark Notebook in Microsoft Fabric: Reading CSV Files from OneLake, Exploring Data with DataFrames, and Saving Results as a Delta Table

16 min
Microsoft FabricFoundation

Writing Your First PySpark Notebook in Microsoft Fabric: Reading CSV Files from OneLake, Transforming Data with DataFrames, and Writing Delta Tables to a Lakehouse

17 min
Microsoft FabricFoundation

Writing Your First PySpark Notebook in Microsoft Fabric: Reading CSV Files from OneLake, Transforming Data with DataFrames, and Saving Results as a Delta Table

14 min

On this page

  • Introduction
  • Prerequisites
  • Understanding the Automation Stack
  • Setting Up a Schedule Trigger
  • Understanding Recurrence vs. Fixed Time
  • Activity-Level Retry Policies: Building Self-Healing Pipelines
  • Configuring Retries on a Copy Activity
  • How Retries Interact with the Activity Timeout
  • Pipeline-Level Alerts in Fabric
  • Creating a Pipeline Alert
  • Alert Emails: What They Contain
  • Sending Custom Email Notifications from Inside the Pipeline
  • Adding an Office 365 Outlook Activity
  • Using Dynamic Expressions in Email Content
  • Building Success and Failure Notification Paths
  • The Pattern
  • Capturing Failure Details in the Failure Email
  • Hands-On Exercise
  • Common Mistakes and Troubleshooting
  • Summary and Next Steps