> For the complete documentation index, see [llms.txt](https://docs.shortcutco.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.shortcutco.com/readme/automations/troubleshooting-an-automation-didnt-fire.md).

# Troubleshooting: an automation didn't fire

Find out exactly why a campaign or built-in automation didn't message a customer, using health, Activity, run details, and receipts.

If a customer didn't get a message you expected, work through these checks in order. For campaigns, Shortcut records the reason for nearly everything, so you rarely have to guess.

{% stepper %}
{% step %}

### Find the automation on the list

Open [Automations](https://shortcutco.com/settings/automations) and search for it. Check the badge:

* **No badge**: a campaign. Keep going with these steps.
* **Library** or **Legacy**: a built-in or older automation. Skip to [Library and legacy automations](#library-and-legacy-automations).
* **Built-in**: Review requests. See [Review requests](/readme/automations/review-requests.md).
  {% endstep %}

{% step %}

### Check its status and health

* **Status** needs to be **Live**. A **Draft** has never been started. A **Stopped** or **Archived** campaign isn't taking anyone new.
* **Health** tells you if something went wrong. **N needs attention** means a run failed, or a message failed, bounced, was blocked, or has an unknown outcome.

The **Needs attention** tab lists every campaign that has at least one of these.
{% endstep %}

{% step %}

### Did the start happen after it went live?

Campaigns only react to what happens **after** they go live. For example, a campaign that starts on **Visit scheduled** won't remind anyone about visits that were already on the calendar when you published it.

If the campaign starts **When customers meet conditions**, customers who already matched when you published are left out, unless you ticked **Include existing matches from audience starts** on the first publish.
{% endstep %}

{% step %}

### Look for the customer in Activity

Open the campaign → **Activity**.

* **Event starts** shows every time a matching event happened and what Shortcut decided:
  * **Started**: a run began.
  * **Did not match**: the conditions weren't met, or the customer already met one of the campaign's exits.
  * **Repeat limit**: they already went through, or are inside the cooldown. Check **Run settings**.
  * **Already running**: they're partway through a run for the same record, so a second one didn't start.
  * **Before activation**: it happened before the campaign went live.
  * **Needs attention**: Shortcut didn't have the information to decide. See **Start checks** on **Overview**.
* **Runs**: open **Advanced filters**, type the **Customer name**, and click **Apply filters**. Click **›** on their run to open it.

Some reasons show as short codes, like `stale_date`. Look them up under [Common reason codes](#common-reason-codes) at the end of this page.
{% endstep %}

{% step %}

### Read the run

The run drawer shows **Started**, **Ended**, **Reason**, the **Version** it ran on, and **Steps so far**.

* **Still active?** The last row under **Steps so far** shows **Waiting** and what it's waiting for: a **Delay**, a **Date wait**, a **Sending window**, a **Wait for event**, or a text held until 8:00 AM. It carries on when that's done.
* **Stopped?** Check the **Reason**: the campaign was stopped or archived, someone stopped this run, an exit matched (for example, the invoice was paid), or the date it was waiting for passed or moved.
* **Running an older version?** Runs finish on the version they started with. A fix you published later only applies to new runs.
  {% endstep %}

{% step %}

### Open the receipt

Click **Receipt** on the message (or **›** on it in **Messages**). The status tells you where it stopped:

* **Skipped**: it didn't apply. The reason is shown; see [Common reason codes](#common-reason-codes) if it's a short code.
* **Accepted by provider** / **Awaiting confirmation**: it was handed off. The provider hasn't confirmed delivery yet.
* **Delivered**: the provider confirmed it reached the customer's email or phone. Ask them to check spam, or their messages from your number.
* **Bounced** or **Failed**: it didn't get there. Check the address, fix it on the customer's record, and **Retry** if the button is there.
* **Outcome unknown**: Shortcut can't tell if it went. It won't retry on its own, so check with the customer before sending anything else.

The receipt shows **exactly** what was sent and where, so you can confirm the address and wording.
{% endstep %}

{% step %}

### Check the customer's contact details and opt-outs

* No email or mobile number on file means nothing to send. That shows as **Skipped**.
* A customer who replied **STOP** isn't texted by any automation. Neither is a number your team has blocked. Only the customer can undo it, by texting **START**. Email is unaffected.
* An email address that bounced or marked you as spam shows a badge on the customer's record, and emails are held until the address is fixed. A customer can also turn off billing, marketing, or service emails from you. That shows no badge, so check their profile under **⋯ → Email preferences**. Which kind a campaign email counts as depends on what started the run. For example, an overdue-invoice campaign sends billing emails and a seasonal offer sends marketing emails. See [Which kind a campaign email is](/readme/finances-invoices-and-payments/customer-email-preferences.md#which-kind-a-campaign-email-is).
  {% endstep %}

{% step %}

### Check the timing

* Campaign texts to customers only go out between 8:00 AM and 8:00 PM in the campaign's timezone. A text that reaches its step overnight shows **Waiting**, then goes at 8:00 AM.
* Emails, and texts to your team, go out as soon as their step is reached. A **Sending window** is the only thing that holds them.
* A **Date wait** on a visit or due date counts from the start of that day. "1 day before" means just after midnight the day before, then any sending window after it.
* A reminder set **before** a date is dropped once that date arrives. A visit booked for tomorrow still gets its reminder if there's sending-window time left today; one booked for today doesn't. A Monday–Friday window after a "before" wait drops reminders for Sunday and Monday visits.
* Everything uses the timezone in the campaign's **Run settings**.
  {% endstep %}

{% step %}

### If a customer got a message they shouldn't have

* **Two messages for the same thing?** A campaign and a Library automation may be doing the same job, for example **Overdue invoice recovery** and **Invoice Overdue**. **Deactivate** one.
* **A customer you'd deactivated?** Campaigns don't check that on their own. Add **Customer account status** **is** **active** to the start's conditions.
* **Paid by cash or check but still reminded?** [Mark the invoice as paid](/readme/finances-invoices-and-payments/mark-an-invoice-as-paid-manual.md) so the invoice exit and balance checks see it.
  {% endstep %}
  {% endstepper %}

## Library and legacy automations

Built-in and older automations don't have receipts or run drawers. Check these instead:

* **Is it on?** The row should show **Live** and **Healthy**. If it shows **Stopped**, open **⋮ → Activate**.
* **Is it the right one?** **Proposal Reminder** only follows a proposal that was already sent. **Job Rescheduled** only runs when a scheduled visit moves. **Invoice Overdue** only runs once an invoice is past due by the set number of days.
* **Did the trigger still apply when it was due?** **Proposal Reminder** skips proposals that have been accepted. **Payment Failed** won't send if a newer payment on that invoice is going through or has already succeeded.
* **Delays and send windows.** Open it and check any **After...** or **Wait until...** steps.
* **Day-Before Reminder stopped sending?** If your company published a campaign that starts on **Day before service (grouped per customer)**, that campaign replaced it for good. The Library row may still say **Live**. Check the campaign instead.

## Common reason codes

<details>

<summary>What the short codes on Activity rows and receipts mean</summary>

| Code                                                                             | Meaning                                                                                                                                                                            |
| -------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `sms_opted_out`                                                                  | The customer replied STOP.                                                                                                                                                         |
| `sms_blocked`                                                                    | Your team blocked this number.                                                                                                                                                     |
| `billing_email_disabled` / `service_email_disabled` / `marketing_email_disabled` | The customer turned off that kind of email from you. Check **⋯ → Email preferences** on their profile.                                                                             |
| `complaint` / `hard_bounce`                                                      | The customer marked an earlier email as spam, or the address bounced. Fix the address on the customer's record.                                                                    |
| `tenant_suppressed` / `policy_paused`                                            | Shortcut has paused email for your company. Email us.                                                                                                                              |
| `email_complaint_suppressed`                                                     | Shown on older messages. Shortcut held the email for one of the reasons above. Check **⋯ → Email preferences** on their profile.                                                   |
| `recipient_unavailable`                                                          | No usable email or mobile number for this recipient.                                                                                                                               |
| `visit_group_no_eligible_visits` / `visit_group_stale`                           | The visits for the day-before reminder were canceled, moved, or completed before it sent.                                                                                          |
| `invoice_payment_pending` / `invoice_payment_failure_superseded`                 | A payment is going through, so the failure or overdue message was held back.                                                                                                       |
| `stale_date`                                                                     | The message was out of date by the time it could go: the date it was waiting for had arrived, passed, or moved.                                                                    |
| `provider_rejected`                                                              | The email or text provider refused it. **Retry** may be offered.                                                                                                                   |
| `provider_outcome_unknown`                                                       | Shortcut couldn't confirm whether it went. It won't retry automatically.                                                                                                           |
| `automation_stopped` / `automation_archived`                                     | The campaign was stopped or archived while this run was in progress.                                                                                                               |
| `run_stopped_by_admin`                                                           | Someone clicked **Stop this run**.                                                                                                                                                 |
| `quiet_hours_hold`                                                               | A text to the customer reached its step outside 8:00 AM–8:00 PM. It's waiting until 8:00 AM.                                                                                       |
| `quiet_hours_released`                                                           | A held text was released at 8:00 AM. Its delivery shows on the text's own row.                                                                                                     |
| `subject_deleted`                                                                | The visit this run was about was deleted, for example when a series was rescheduled or the job was edited, so the run ended.                                                       |
| `occurrence_closed_as_handled`                                                   | Someone used **Mark handled** on the visit in Dispatch. Campaign steps about a visit closed that way are skipped: nothing messages the customer, tags them, or notifies your team. |
| `delay_pending` / `window_pending` / `date_wait_pending` / `condition_pending`   | The run is waiting on a Delay, Sending window, Date wait, or Wait for event step.                                                                                                  |

</details>

{% hint style="info" %}
Still stuck?

Email **<hello@shortcutco.com>** with:

* the campaign or automation name
* the customer name
* what you expected to happen and when
* a screenshot of the run drawer or receipt (or, for a Library automation, of its settings)
  {% endhint %}
