Private Reply to Comment
Send the one private DM Meta allows in answer to a Facebook or Instagram comment, with an optional public reply posted under it.
Getting here
Automate → Workflows, open a workflow built on the Comment received trigger, click + on the canvas, then pick Private Reply to Comment under Add Steps.
Before you start
- An owner, admin or agent can add this step and save the workflow. Publishing — the thing that makes it run on live comments — is an owner or admin action.
- Building and running workflows depends on your plan; see pricing.
- A Facebook Page or Instagram account connected as a channel, and a flow whose trigger is Comment received — this step only has a comment to answer when that is how the run started.
Set up
- Build (or open) a workflow on the Comment received trigger, optionally scoped to specific posts or keywords.
- Click + and pick Private Reply to Comment under Add Steps.
- Write the message sent privately to the commenter.
{{comment.*}}variables (the comment text, the commenter's name) are always available; other fields such as{{contact.*}}only fill in when the commenter already has an open conversation — see How it works. - Optionally, write one or more lines under Public reply under the comment — each comment that gets a public reply gets one line, chosen at random.
- Save the step, then publish the workflow.
Fields
- Private reply text
- The direct message sent to the person who commented — the one Meta allows for that comment.
- Public reply under the comment
- Optional. Posted publicly under the comment, on Facebook and Instagram, after the DM goes out, so other people reading the post see you answered.
- Default: empty — nothing is posted publicly
- Limits: One reply per line: each comment that gets a public reply gets one line, picked at random, so the comments section does not fill up with the same sentence. A failed public post never fails the step.
How it works
- The step sends the one private reply Meta allows for a comment, addressed to the comment's id, as a DM to the person who wrote it — not a message into an existing conversation thread.
- Whether the rest of the flow runs alongside it depends on whether the commenter already has an open conversation with you on this channel. Comments are not conversation-scoped, so the engine only dispatches the Comment received trigger when the commenter's id already maps to an existing open thread (common on Instagram, where the comment author id doubles as the messaging id; rare on Facebook, where it usually does not).
- When there is no matching open conversation — the common case, a person commenting for the first time — the engine never runs this workflow for that comment. Instead, a separate piece of Inchat's comment-handling code reads this step straight out of your published flow, takes only its private-reply text and its optional public reply, and sends them the moment the comment arrives. Nothing else in the flow — no step placed after this one in the same lane — runs for that commenter. This direct-send path has no conversation to read fields from yet: only
comment.*,channel.*and the trigger name are filled in, so a variable like{{contact.first_name}}resolves to nothing and reaches the commenter as a blank — write the DM using only{{comment.*}}if the flow can take this path. - When the commenter does have an open conversation already, the engine runs the whole flow as normal, this step included, and whatever follows it in the same lane executes too — and every field the run started with (contact, conversation, and comment fields) is available to interpolate.
- The public reply, when set, always goes out after the private one, and only once the DM has been sent — a failed DM is not followed by a public post.
- A comment-origin note is written only on the engine path, right after the DM sends — that is, only when the commenter already had an open conversation, never on a first-time commenter's direct-send path. A first-time commenter's conversation is created later, the normal way, the moment they reply to the DM; nothing about how it opened is carried over from this step.
When it fails
- This run has no comment to answer (the flow was reached some other way — a hand-off from another workflow, a manual test run): the step is skipped, not failed. It sends nothing and the run continues.
- The comment is older than Meta's 7-day private-reply window: on the ENGINE path only (a returning commenter with an open conversation), Facebook's comment payload carries a timestamp and the step skips before trying, nothing sent. The direct-send path (a first-time commenter) has no age check of any kind, on either platform — an old comment still gets a send attempt there, and if Meta refuses it, that failure reaches only Inchat's server logs (see the row below), never the workflow's Activity tab. On Instagram, whose comment payload carries no timestamp, even the engine path has no age check and relies on Meta's own refusal.
- Meta refuses the send (the comment already used its one reply, a permissions problem, any other Graph error) while the whole flow is running (an open conversation already existed): the step fails. This step has no failure branch of its own, so — like any step with none — the run continues to the next step in the same lane, and the reason is in the workflow's Activity tab, under Execution log, on that step's line.
- Delivery cannot be confirmed one way or the other (an engine-path send only): the run stops after this step even though there is no failure branch set — later steps are not attempted on top of a DM whose outcome is unknown.
- Meta refuses the send when there was no open conversation — the direct-send path handled it instead: the failure is only written to Inchat's own server logs. Nothing appears in the workflow's Activity tab, because the engine never ran for that comment.
- The text resolves to nothing once its variables are filled in: on the engine path the step fails without sending; on the direct-send path an all-variable message that resolves empty falls back to the channel's comment auto-reply text (or, if the channel has none, the workspace's), and sends nothing if neither is set — a blank DM is never sent.
- A returning commenter (one with an open conversation, so this hands off to the engine path) can get silently no reply at all: dispatch skips starting the run before any step exists if this workflow already ran for this comment in the last ten minutes, or — with Trigger once per contact set — has ever run for this contact before. Nothing appears in the Activity tab, because there is no run to show one on.
Limits
- It does not remember, on its own, whether it has already replied to a comment — Meta enforces the one-reply-per-comment rule. Running this step (or a retry) twice for the same comment gets the second attempt refused by Meta, not stopped by Inchat in advance.
- It only exists on Facebook and Instagram comments. A conversation on any other channel type fails the step outright.
- For a first-time commenter with no open conversation yet, anything placed after this step in the same lane does not run — no tag, no further message, no assignment. Only a returning commenter, who already has an open thread, gets the rest of the flow (see How it works).
- When more than one published Comment received workflow could match the same comment, the two paths disagree on how many run. On the direct-send path (no open conversation yet — the common, first-time case), only the first matching workflow's first Private Reply to Comment step (found by searching Condition, Date & Time and Branch lanes in order) is used at all; a second matching workflow never runs, not even its non-reply steps. On the engine path (an open conversation already exists), every matching workflow runs in full — a second workflow's own private-reply attempt is refused by Meta's one-reply limit, but its other steps (tags, assignments, anything else) still execute.
- The public reply is best-effort: if it fails to post, the step still counts as succeeded, because the DM is the part Meta guarantees you get to send.
Best practices
- Keep this step first, or as close to first as the flow allows, in the lane a Comment received trigger runs. A step placed after it may never execute for a first-time commenter — see Limits.
- Write more than one line into the public reply box so people scrolling the comments do not see the exact same sentence under every reply.
- Scope the Comment received trigger to the post (or a keyword) rather than leaving it open, or every comment on every post answers the same way.
FAQ and troubleshooting
- Does the rest of the workflow run after this step?
- Only if the commenter already has an open conversation with you on this channel. For a first-time commenter, Inchat sends this step's private reply (and its public reply, if any) the moment the comment arrives, and nothing else in that flow runs for them.
- Can I send a private reply to the same comment twice?
- No. Meta allows exactly one private reply per comment, ever, and enforces that on their side. If this step somehow runs twice for the same comment, the second attempt is refused.
- Why didn't my private reply go out?
- It depends which path handled the comment (see How it works). If the whole flow ran, the reason is in the workflow's Activity tab, under Execution log. If it was sent directly because the commenter was new, there is no execution log entry for it at all — right now that failure only reaches Inchat's own server logs, not anywhere in the product you can check. For a returning commenter, it can also be that dispatch skipped starting the run entirely — a repeat within ten minutes, or (with Trigger once per contact set) any earlier run for this contact — which likewise leaves no Activity tab entry to check.
- Can I reply to a comment from last week?
- Not reliably, and it depends which path handles it. Meta's private-reply window is 7 days. Only the engine path (a returning commenter with an open conversation) checks a Facebook comment's age and skips it before trying — a first-time commenter's direct-send path has no age check at all, on either platform, so an old comment still gets a send attempt; a refusal there only reaches server logs. On Instagram, even the engine path has no age check, and Meta's own refusal is what stops a stale one.
Related
- Check Instagram Follow — Ask Instagram whether this person follows your account, so a later Condition step can route follower-only offers.
- Workflow triggers — The 34 events a workflow can start from — what each one actually watches, what it exposes to conditions and messages, and where it quietly does nothing.
- Condition — Split the run into up to twelve lanes plus a None lane, checked top to bottom — the first lane whose conditions all pass wins, and Condition tests one field against one value at a time.
- Workflows: how a flow runs — A workflow is one trigger, optional conditions and an ordered list of steps; only a published workflow runs, and this article explains how a run starts, forks, pauses, fails and stops.
Reading this with an AI assistant? Plain Markdown version.