---
title: "Why is my campaign not replying?"
description: "Work through the causes of a silent campaign in order, then read the execution history to tell a campaign that never started from one that failed mid-run."
canonical: https://docs.afp.monster/start/troubleshooting
updated: 2026-08-19
pageType: start
---

Check the campaign's own state first, then the page it is bound to, then the execution history. Four causes are worth ruling out before anything else: the campaign is switched off, the graph you edited was never saved, the campaign is bound to a different page than the one being commented on, or the message never matched the condition. The execution history then separates a campaign that never started from one that started and failed.

## What you need

- The campaign open on the canvas, so you can see the **Active** toggle, the page in the header, and the **Executions** view.
- The page listed on **Accounts**, so you can see whether its stored access is still working.
- Someone other than the page itself to comment or send the DM. AFP ignores events whose sender is the page, so commenting as the page never starts an execution.

## Which checks come first?

Work down this list rather than jumping to the section that sounds like your problem. It is ordered by how much each check costs you: the first seven are answered by looking at the canvas, and the rest need the execution history or a second test.

| # | Check | How to tell | Fix |
|---|---|---|---|
| 1 | The campaign is off | The **Active** toggle reads off in the canvas header or on the campaign list | Switch it on. AFP matches incoming events only against active campaigns |
| 2 | Your edits were never saved | The canvas still shows unsaved changes | Click **Save**. Only the version saved last starts new executions |
| 3 | The saved graph has no trigger node | Reopen the campaign — the canvas loads the saved version, so what you see is what runs | Add a trigger node and save |
| 4 | The campaign is bound to another page | The page named in the canvas header is not the page you commented on | Rebind the campaign to that page and save |
| 5 | The event came from the page itself | You commented or replied while posting as the page | Comment from a personal account, or ask someone else to |
| 6 | The trigger type does not match the event | A comment trigger with a DM sent to the page, or a DM trigger with a comment | Use the trigger that matches the event you are producing |
| 7 | The trigger is scoped to one post | The trigger's post setting names a specific post instead of all posts | Comment on that post, or switch the trigger back to all posts |
| 8 | The message did not match the condition | An execution exists and ends without sending anything | Widen the match, or connect the condition's **No Match** output to something |
| 9 | That person already has an execution in progress | An earlier execution for the same person is still active on this campaign | Wait for it to finish, or use a different account |
| 10 | The trigger runs once per person | The trigger's once-per-person setting is on and this person has triggered it before | Test with a different account  |
| 11 | The page's stored access has expired | **Accounts** flags the page, or the profile that owns it, as expired | Re-authorise the profile, then retest |

## Why is an active campaign still not firing?

An active campaign only fires through the graph version you saved last. AFP looks for trigger nodes that belong to the campaign's current version, so a trigger that exists only in an unsaved canvas or in an older version never starts anything.

Switching the toggle on from the campaign list applies immediately and does not check the graph. A campaign whose current version holds no trigger node matches nothing while still reading as active, which is the most misleading state a campaign can be in.

Switching a campaign off does not stop events reaching the page. Other campaigns on the same page keep working, and every campaign whose trigger matches an event gets its own execution — so a page carrying several campaigns can look half-broken when only one of them is off.

The campaign also has to match the platform of the page. AFP derives that from the page itself when you save, so a campaign moved between a Facebook page and a standalone Instagram account picks the platform up from the new page rather than keeping the old one.

## Is the campaign bound to the page you are testing on?

A campaign is bound to exactly one page, and AFP matches an incoming event against the campaigns on the page that produced it. Commenting on a page the campaign is not bound to produces no execution at all — not a failed one.

The page name in the canvas header is the whole answer. Compare it with the page you commented on before looking at anything else, because this cause and a genuinely broken graph look identical from the outside: nothing happens.

Rebinding a campaign to a different page leaves the graph untouched. The nodes, their settings and their connections all survive the move; only which page's events reach the trigger changes.

## Has the page's access expired?

**Accounts** is where an expired page shows up: the page, and the profile that owns it, are flagged as expired instead of active. AFP stores the access it was granted for each page, and once that access stops working every action the campaign tries to take on that page fails.

An expired page produces failed executions rather than missing ones. The execution starts, reaches the first node that has to reach Facebook or Instagram, and records an error on that node instead of sending.

| Page type | How to restore access |
|---|---|
| A Facebook page, or an Instagram account reached through one | Refresh the access on the Facebook profile that owns the page. AFP sends you to Facebook to consent again, and clears the expired flag when you come back |
| A standalone Instagram business account | Refresh the access on that account. AFP sends you to Instagram to authorise it again, and stores the new access when you come back |

Declining the consent screen leaves the page exactly as it was, still flagged as expired. [Connect a page](/start/connect-a-page) covers what each status on **Accounts** means.

## Why did the condition send the execution down No Match?

A condition routes every execution down one of two outputs — **Match** or **No Match** — and an output with nothing connected to it ends the execution there. A condition that takes **No Match** on a graph where only **Match** is wired up produces an execution that completes without sending anything.

That is the shape to look for in the execution history: an execution that visited the trigger and the condition, completed, and never reached the send-DM node.

| What the condition is set to | Why a real message can miss it |
|---|---|
| Contains, or exact | The text you commented does not contain, or is not exactly, the phrase configured on the node |
| A keyword list | The comment contains none of the list's keywords |
| A keyword list with the match reversed | The comment contains one of the keywords, which the reversed match sends down **No Match** |

A keyword list you deleted while a condition still pointed at it causes the opposite problem. With no list to look up, the condition stops filtering and matches everything, so the campaign replies to messages it should have ignored. A list left with no keywords in it behaves the same way.

[Match comments with keyword lists](/guides/keyword-lists) covers editing a list and what a reversed match does.

## How do I read the execution history?

Open the campaign and switch the canvas to the **Executions** view. It lists the 20 most recent executions for that campaign, newest first, with tests and real executions together. Each row carries whether it is a test, whether it is still active, the recipient, when it started, when it completed, the node it is currently sitting on, and an error message if it has one.

Selecting an execution overlays it on the canvas: the nodes it visited are marked as visited, the node it stopped on is marked as current, and everything it never reached is dimmed. Each visited node also records what the action did, or the error it raised — which is how you tell a DM node that sent from a DM node that failed.

![An execution overlaid on the campaign canvas: the nodes it visited are highlighted, the node it stopped on is marked current, and the nodes it never reached are dimmed](../../../assets/screenshots/start/troubleshooting/executions-overlay.webp)

```d2 title="Diagnosing a silent campaign from the Executions view, by whether an execution exists and what state it is in" data-wide="true"
direction: down
executions: Open the Executions view
exists: "Is there an execution\nfor that comment?" {shape: diamond}
never: "Never triggered: work\nthrough the checklist"
which: Its state {shape: diamond}
ended: "Ran to the end of a branch:\ncheck which branch it took"
midrun: "Failed mid-run:\nthe action could not be sent"
waiting: "Waiting: parked on a\ncondition or on a delay"
early: "Ended early:\nread the error message"
executions -> exists
exists -> never: None at all
exists -> which: One exists
which -> ended: "Completed, no error"
which -> midrun: "Still active, error\non the last visited node"
which -> waiting: "Still active, no error"
which -> early: "Failed, with an error"
```

| What you see | What it means | What to do |
|---|---|---|
| No execution for the time you commented | The event never reached the campaign | Go back to the checklist — nothing in the graph is at fault |
| Completed, no error, and the send node dimmed | The execution took a branch that ended before the send node | Look at which output the condition took |
| Still active, with an error on the last visited node | An action failed. AFP records the error and does not continue past that node | Fix the cause, then start a fresh execution. This one does not resume by itself |
| Still active, current node is a condition | The condition is waiting for a reply that has not arrived | Reply from the account you tested with, or wait |
| Still active, current node is a delay | The delay has not elapsed yet | Wait, then refresh the panel |
| Failed, with an error about retries being exhausted | AFP retried the step and it kept failing | Check the page's access on **Accounts**, then retest |

An execution left stuck on a failed action does not stay active forever. AFP fails it after an hour if it was waiting on a scheduled step, and after seven days if it was waiting for a reply.

The list does not refresh itself. Use the refresh control on the panel to re-pull an execution that is still active. [Execution states](/reference/execution-states) lists every state an execution can end in.

## How do I run a test execution from the canvas?

A test execution walks the saved graph without contacting Facebook or Instagram, which separates a broken graph from a broken connection in one click.

1. Open the campaign on the canvas and click **Save** if anything is unsaved. A test runs the saved version, not what is on screen.
2. Click **Test**.
3. Type the message the execution should treat as the incoming comment or DM. Leave it empty and the execution behaves as though the text were `test`.
4. Click **Run test**.
5. The canvas switches to the **Executions** view with the new execution at the top. Click it to see the path it took.

Every action node records what it *would* have done instead of doing it. No DM is sent, no comment is replied to, hidden or deleted, and no tag is added or removed. A delay node ends the test there and marks the execution complete, so a test tells you nothing about the nodes after a delay.

| A test execution proves | A test execution cannot prove |
|---|---|
| The graph has a trigger and the nodes are connected | That the campaign is bound to the right page |
| Which branch a given message takes through the conditions | That the page's stored access still works |
| Which nodes are reached, and in what order | That a real comment matches the trigger's post setting |
| That each node's settings are complete enough to execute | That the message actually arrives |

A campaign whose saved version has no trigger node cannot be tested at all: AFP reports the missing trigger instead of creating an execution. That result is itself the answer to check 3 above.

A test that lands on a condition set to wait for a reply parks there and stays active, because no reply can arrive for a test. Read the parked node as "the graph got this far", not as a failure.

## How do I know it worked?

Comment on the page again, from an account that is not the page, with text you know matches the condition. Then check both ends: the DM arrives in that person's inbox on Facebook or Instagram, and a new execution appears at the top of the **Executions** view with a completion time, no error, and the send node marked as visited.

One of those two without the other narrows the problem immediately. A completed execution with no DM points at the page's stored access; a DM with no execution means you are looking at a different campaign than the one that sent it.

## Next

- [Test and debug a campaign](/guides/test-and-debug-campaigns)
