Comment-to-DM not sending? The causes ranked by how often they actually happen

When a comment-to-DM campaign stops sending, it is usually one of five things: the keyword did not match what somebody typed, the campaign is not covering that post, the Instagram connection has expired, the comment had already used the one private reply Meta allows, or the DM is sitting in a queue rather than being lost. The log row for that comment tells you which, and the order below is the order worth checking.
Check the log before you change any settings. Every DM attempt writes a row with a status and, when something went wrong, the reason. A comment with no row at all is a different problem from a comment with a failed row, and the two have opposite fixes.
Read the log row first
Guessing is expensive here, because most of the causes look identical from the outside: somebody comments and no DM arrives. The statuses split them apart immediately.
| Status | What happened | What to do |
|---|---|---|
| No row at all | No campaign matched the comment, or the comment never arrived | Check the keyword and which posts the campaign covers |
| Pending | Matched and picked up, the send has not finished | Give it a moment and refresh |
| Queued | Over the hourly cap, waiting for its turn | Nothing. It carries a scheduled time |
| Sent | Meta accepted the message | Check with the recipient, not the campaign |
| Failed | Meta refused the send, with a reason on the row | Read the reason. Most are retryable from the logs |
| Skipped, duplicate | Another campaign used the comment's one private reply | Turn off the overlapping campaign |
| Skipped, plan | A monthly DM limit or a plan restriction stopped it | The row names which. Upgrade or free up a slot |
The keyword did not match what somebody typed
This is the least suspected cause, because the person who wrote the keyword knows what they meant by it. Matching is more forgiving than people fear in several ways and stricter in one.
| The comment says | Matches? | Why |
|---|---|---|
| link | Yes | Case is ignored entirely |
| LINK!!! | Yes | Punctuation is turned into a space before matching |
| link please 🔥 | Yes | Emoji are stripped out first |
| send me the link to buy | Yes | The keyword can sit anywhere in the comment |
| linking | No | Whole-word matching is on by default |
| l-i-n-k | No | The hyphens become spaces, so it is four separate letters |
| linkk | No | It is a different word |
Two settings fix it. Turn whole-word matching off, so linking and links count as well, at the cost of matching the word inside others. Or add the variants people actually type as separate keywords, which is safer because you can see what you have agreed to.
The campaign was not covering that post, or was not running
A campaign points at something: this specific post, any post, a story, a live, an ad. Comments only reach the campaigns built for their own kind, so a story campaign never fires on a reel comment, and a live campaign never fires on a post.
One rule surprises nearly everybody. When a campaign is aimed at the exact post somebody commented on, it wins, and any-post campaigns are not consulted for that post at all. An old test campaign pinned to one reel and left switched on will quietly replace your catch-all there. If one post behaves differently from all the others, look for a second campaign pinned to it.
- A paused campaign is skipped and writes no log row, which looks exactly like a keyword that did not match.
- A campaign aimed at a specific story stops when the story expires 24 hours after it was posted, because there is nothing left to reply to.
- A private reply to a live comment is only accepted while the broadcast is running, so a live campaign cannot catch up afterwards.
The plan quietly switched the campaign off
This one has a distinctive signature: everything worked for a fortnight and then stopped on a date, with no settings changed. What changed was the plan. A trial ending drops a workspace to Free, and Free covers one Instagram account and three campaigns.
Campaigns beyond those limits keep their settings, stop sending, and write a skipped row naming the reason: the account is not covered by the plan's number of Instagram accounts, or the campaign is past the plan's active-campaign cap. Features behave the same way, so a campaign built with a product carousel on a trial stops on a plan that does not include carousels.
The connection expired, or somebody revoked it
Instagram access tokens are long-lived rather than permanent, so they are refreshed on a schedule before they run out, which is why most accounts never notice them. Refreshing fails when the account has been switched back to a personal account, when the owner revoked the app from Instagram's settings, or when the password was changed and every session was signed out.
The symptom is total rather than partial. Every campaign on that one Instagram account stops at once while a second connected account carries on, and the log rows say the token has expired or could not be read. Reconnecting the account through Meta's authorisation screen issues a new token and leaves your campaigns and their history alone. If the account was switched to a personal profile, switch it back to Business or Creator first, because a personal account cannot hold the permissions this runs on.
The comment had already used its one private reply
Meta allows one private reply per comment, ever, across every campaign and every tool. When two campaigns match the same comment, only the first can deliver. The second is skipped with the name of the campaign that used the reply, and the DM it would have sent does not exist anywhere.
It happens most often after somebody duplicates a campaign to test a new message and leaves both running. The tell is doubled public comment replies with single DMs, because the public reply goes out per campaign and only the DM is capped.
It is queued rather than lost
Meta documents 750 private replies per hour per Instagram professional account for comments on posts and reels. A reel that travels will pass that inside an hour, and what happens next is the difference between a tool that loses your best night and one that does not.
Past the cap, nothing is dropped. Each DM takes the next place in a queue spaced evenly across the hour, roughly one every five seconds, and the row shows as queued with the time its turn comes. Meta accepts a private reply for seven days after the comment, so a backlog of thousands can clear over an evening, and a DM is only abandoned when its turn would fall after that window closes.
The causes that are not yours to fix
A handful of failures are the recipient's side or the clock, and no setting changes them.
- Meta refuses the send because the requested user cannot be found. A comment can outlive the account that wrote it.
- The person deleted their comment before the DM went out. The private reply is addressed to the comment, so it goes with it.
- Your own comment rules hid or deleted the comment first. If you run automatic comment moderation, a comment removed by a rule has nobody left to reply to, and that is the rule working rather than the campaign failing.
- The seven day window closed. A comment from last week cannot be answered now, and a queued DM whose turn would fall after the deadline is abandoned rather than attempted.
- The message was a follow-up rather than the first DM, and the 24 hour messaging window had closed. That is a different rule from the seven day one, and the error mentions the allowed window.
Symptom to cause, in one table
| What you are seeing | Most likely cause | First thing to do |
|---|---|---|
| No log row for the comment | Keyword mismatch, or the campaign does not cover that post | Paste the exact comment text and compare it to your keywords |
| Public reply went out, no DM | The DM leg failed on its own | Read the error on that row |
| Every campaign on one account stopped at once | Token expired or revoked | Reconnect that Instagram account |
| All accounts stopped on the same date | Plan change, usually a trial ending | Read the reason on a skipped row |
| Early commenters got a DM, later ones did not yet | Hourly cap reached, DMs queued | Nothing. Check the scheduled time on the row |
| Duplicate public replies, single DM | Two campaigns matching one comment | Switch off the overlapping campaign |
| It works on most posts, is wrong on one | A campaign pinned to that specific post | Look for an old test campaign on that post |
| The first DM sends, the follow-up never does | The 24 hour messaging window closed | Move what matters into the first message |
If none of these fit
Comment on your own post from a second account with the exact keyword and watch whether a row appears. A row that appears and fails is a different investigation from no row at all, so that one test halves the list. Then check the account is still a Business or Creator account: it can be switched back from the Instagram app by anyone who manages it, without anybody thinking to mention it, and it stops everything at once.
Questions people ask about this
- Why is my Instagram comment-to-DM automation not working?
- Most often the keyword did not match what the person typed, the campaign is not covering that post, the Instagram connection has expired, another campaign used the comment's one allowed private reply, or the DM is queued behind the hourly cap. Start with the log row for that comment: a row with an error and no row at all point at different causes and have different fixes.
- Why did some commenters get a DM and others did not?
- Usually the hourly cap. Meta documents 750 private replies an hour per Instagram professional account for comments on posts and reels, and a post that does well will pass that. A well-built tool queues the overflow rather than dropping it, spaced across the hour, and Meta accepts a private reply for up to seven days after the comment, so the backlog clears later the same day.
- How do I know if my Instagram token has expired?
- The signature is that every campaign on one connected account stops at the same moment while other connected accounts keep working, and the log rows say the token expired or could not be read. Tokens are long-lived and refreshed automatically, so an expiry normally means the app was revoked in Instagram's settings, the password was changed, or the account was switched back to personal. Reconnecting fixes it without touching your campaigns.
- Why does my comment get a public reply but no DM?
- The public comment reply and the private DM are separate calls, and the public one is deliberately sent first so a DM problem cannot suppress it. Seeing one without the other means the DM leg failed by itself, and the log row carries Meta's reason: the comment's single private reply was already used, the recipient cannot be messaged, or the seven day window had closed.
- Does a paused campaign still log anything?
- No. A paused campaign is not considered for the comment at all, so nothing is attempted and nothing is recorded. That makes a paused campaign look identical to a keyword that did not match, and both show up as a comment with no log row. Check that the campaign is switched on before you start rewriting keywords.