Instagram Comment to DM: How My AI Decides Between Public Reply and Private DM
I built OT1-Pro because I lost a 4,200 EGP clothing order to a comment I answered too late. A customer wrote "بكام؟" under a reel at 11:40pm, and by the time my social media girl replied the next morning, she had bought from a competitor. The comment was public. The money was private. I had no system connecting the two. That gap is exactly what instagram comment to dm automation closes, and I spent four months getting the public-versus-private decision right.
Most tools treat a comment reply and a DM as the same job. They are opposite jobs. The public reply shows every lurker this store answers fast. The DM closes one human with prices and a payment step. When I mixed those jobs, my bot posted order links in public and wrote "check your DM" inside the actual DM. This post breaks down the three settings that decide, the four-stage pipeline, and the bug that taught me to use two prompts instead of one.
If you are still fighting Meta permissions to get Instagram connected at all, read my winner guide first: Meta App Verification 2026: A Founder's Guide. Without instagram_basic and instagram_manage_messages on Advanced Access, no auto-reply tool can touch your comments or DMs.
Why Instagram comment to DM is where sales actually happen
I track where my paying customers first touch us, and for fashion, cosmetics, and food stores in Egypt and the Gulf, the answer keeps coming back the same: 60 to 70 percent start as a public comment, not a DM and not WhatsApp. They write "price?", "عندكم شحن للسعودية؟", or just tag a friend. They will not DM you first because DMing a store feels like commitment. Commenting feels free.
That creates a brutal math problem. A reel that hits 50,000 views pulls 300 to 600 comments in 48 hours. My team of two could answer 80 a day before quality collapsed. Every unanswered "how much?" thread tells the next 10 lurkers nobody answers here. I watched conversion on a viral abaya reel drop from 3.1 percent to 0.9 percent between day one and day three for exactly this reason.
The fix is an instagram comment to dm system that answers every comment in public within a minute and moves buyers into DMs before they cool off. Public speed protects the post. Private depth closes the wallet.
The two inboxes: what the public sees vs what closes
I want to make the split concrete because every misconfiguration I have seen comes from blurring it. The public comment reply has three jobs: acknowledge the human by name, answer the surface question in one line, and point toward the DM without leaking anything sensitive. Example: "Sara, the linen set is 1,450 EGP — I sent you the size chart and order link in DM!" That reply sells to Sara and to the 200 people reading over her shoulder.
The DM has the opposite job: no audience, just closing. It carries the size chart, color photos, the shipping quote, the payment link, and one follow-up question. None of that belongs in public. When I posted order links publicly in our first version, competitors scraped my prices within a day and customers stopped opening the DM. My DM open rate fell to 31 percent that week; after I moved specifics into the DM, it recovered to 74 percent.
The rule I run now: public replies never contain full prices, phone numbers, payment links, or discount codes. DMs never contain the phrase "check your DM." Each message knows which room it is standing in.
How I built the decision: reply_mode, dm_mode and on_purchase_intent
Every Instagram account on OT1-Pro gets three settings that together decide who gets what. I designed them after watching store owners argue opposite needs: one wanted everything public for social proof, another wanted everything private to hide prices. Both were right for their niche, so I stopped hardcoding and exposed the decision.
reply_mode controls the public side. It has three values: ai lets the AI write a fresh one-line reply per comment, keyword only replies when the comment matches one of your triggers and stays silent otherwise, and off disables public replies entirely while keeping DM logic alive. Fashion stores with heavy traffic run ai. Electronics stores hiding margins run keyword with five triggers. One perfume client runs off during wholesale launches because he does not want retail buyers piling on.
dm_mode controls the private side independently: always sends a DM to every commenter, on_keyword only DMs on trigger matches, and off never DMs. I default new stores to on_keyword because always on a viral post means 500 DMs in a night, and Meta rate-limits aggressive DM bursts from new senders. You earn always after two quiet weeks.
on_purchase_intent is the override that ties them together. When the classifier scores a comment as buying intent — "how much", "بكام", "اريد اطلب", "شحن", "available?", a size question, a tag plus "I want this" — this flag forces the combo: public reply plus DM with details, regardless of the quieter modes. A praise comment like "love this" gets a public thanks and no DM. A purchase-intent comment always gets both. That single flag is responsible for most of our recovered revenue, because it is the only path where the AI is allowed to be pushy. Learn the broader DM sales flow it feeds into at OT1-Pro Instagram DM automation, and compare the cost logic on OT1-Pro pricing before you copy my defaults.
Inside the pipeline: CommentFilterService to SendAiCommentReplyJob
Settings mean nothing without a pipeline that runs them in order, and mine has four stages. I am naming the real classes because there is no magic step where "AI decides everything."
Stage one is CommentFilterService. It runs synchronously on every webhook and throws away what should never get a reply: our own comments, banned users, duplicates Meta delivers twice, and obvious spam by pattern. Filtered comments never create jobs. This stage alone cut our AI spend by 22 percent.
Stage two is IngestCommentJob. It normalizes the text (Arabic dialect included — "بكام" and "بكم" and "how much" all map to a price question), attaches the media ID and working-hours state, then pushes to classification. If the same user commented three times in two minutes, ingest merges them into one decision so we do not send three DMs.
Stage three is ClassifyCommentJob. It returns a label — purchase_intent, question, praise, tag, complaint, spam — plus a confidence score and the matched keyword. Low-confidence purchase_intent (under 0.55) gets treated as a plain question: public reply, no DM. I would rather miss one DM than spam fifty strangers.
Stage four is SendAiCommentReplyJob. It reads reply_mode, dm_mode, on_purchase_intent, and the label, then emits zero, one, or two messages. Every send is logged with the label and prompt version so I can audit why any customer got what she got.
The routing table I run on every comment
I keep this table taped to my monitor because support tickets drop when owners understand it before launch. This is the exact behavior of an instagram comment to dm setup on OT1-Pro with my recommended defaults (reply_mode=ai, dm_mode=on_keyword, on_purchase_intent enabled):
| Comment type | Public action | DM action |
|---|---|---|
| Purchase intent ("how much?", "بكام؟", "I want to order") | AI public reply with teaser + DM pointer | Full DM with price, variants, photos, order link |
| Product question (sizes, shipping, material) | One-line public answer | DM with details only if keyword matched |
| Praise ("love this", emojis only) | Short public thanks | No DM |
| Friend tag ("@sara check this") | Public welcome to both users | No DM unless tag includes buying words |
| Complaint ("order late", "wrong size") | Public apology + ticket number, no specifics | DM with support handoff and human escalation |
| Spam / scam / link drop | Nothing, hidden if policy allows | Nothing, ever |
| Out-of-hours comment | Public reply noting reopening time | Queued DM delivered at opening |
Two rows cause arguments. Tags: owners always want to DM every tagged friend, and I refuse as default because tagged friends did not opt in — cold DMs tank your quality rating with Meta. Complaints: never put order specifics in public. I once posted a replacement date publicly and ten strangers demanded the same for unrelated orders. Private specifics, public courtesy.
If you want the sibling flow that covers stories as well as feed posts, read Instagram auto-reply for story, comment and DM next — it shares the same classifier but adds story-mention triggers.
Purchase-intent comments: public reply plus DM with details
Purchase intent is the money row. When ClassifyCommentJob tags a comment as purchase_intent above threshold, SendAiCommentReplyJob fires twice: a short public reply and a rich DM. The public reply follows a strict template — name, one-line teaser, DM pointer. "Mariam, the mascara is 620 EGP — shades and order link in your DM!" The DM carries the payload: shades with photos, bundle price, shipping, cash-on-delivery terms, one closing question.
Keyword triggers backstop the classifier so obvious buyers never depend on model mood. My starter set: price, how much, بكام, بكم, سعر, order, اطلب, شراء, available, متوفر, shipping, شحن, توصيل, size, مقاس, discount, خصم. On Arabic-heavy accounts, triggers catch 18 percent of buyers the classifier scored under threshold, mostly dialect spellings.
If the buyer does not reply within 24 hours, OT1-Pro sends one human-approved nudge, then stops. Two nudges max. I tested three and the block rate doubled. Fast first DM, one polite nudge, then silence.
Spam dies quietly: why we never post a visible bot reply
Early on I let the bot reply to everything, including spam, because a busy comment section looked alive in sales calls. Then a crypto scammer dropped a wallet link under a client's bridal post, my bot replied "Thanks for your interest!", and the screenshot ended up in a 40,000-member Facebook group. That client churned the same week. I rewrote the policy that night.
The rule is absolute: spam is filtered silently and never receives a visible bot reply. CommentFilterService kills pattern spam before jobs exist; ClassifyCommentJob labels the gray cases. Either path ends the same way — no public reply, no DM, optional hide. After I enabled silent filtering across ten pilot stores, replies-per-post fell 14 percent and DM-initiated checkouts rose 27 percent. Fewer visible comments, more money.
Working hours and keyword triggers that keep you out of trouble
An instagram comment to dm bot with no clock is a liability. Before working-hours gating, the bot told a midnight commenter "your order ships tomorrow morning!" The warehouse shipped in three days. She posted the screenshot. After the gate, the same comment at 3am gets "Thanks Laila! We reopen at 10am — details in DM, team confirms shipping then." Out-of-hours DMs queue and deliver at opening.
Configuration is boring on purpose: open and close hours, a timezone, a Friday prayer-break toggle for Egypt/Gulf stores, a holiday list. The pipeline reads the gate in IngestCommentJob, before classification, so we do not burn AI budget on messages that wait six hours. Complaints override the queue with a ticket number because silence on anger reads as guilt.
I cap starter stores at 20 triggers and review weekly: any trigger firing 30+ times with under 10 percent DM replies gets deleted. "Hi" as a trigger was my worst mistake — 400 casual greeters DM'd in a weekend, account rate-limited 48 hours. Triggers are buying words, never greetings.
The "check your DM" bug and the split-prompt fix
Here is the failure mode, told exactly as it happened. For our first six weeks, public replies and DMs shared one prompt with one instruction block called reply_instructions: "always mention check your DM." Public replies looked great. Then a customer forwarded her DM: "Hi Dina! Check your DM for details!" She was already in the DM. There was nowhere left to check.
The leak ran both ways. DMs contained "as I said in my public reply..." to customers who never saw it, and public replies leaked DM-only discount codes. My DM-to-order rate that month was 9 percent and "confused" tickets tripled.
The fix was to split the prompt in two inside SendAiCommentReplyJob. The public prompt receives reply_instructions and must include exactly one DM pointer. The DM prompt never receives reply_instructions — the field is stripped before the call — and bans any outward pointer. The DM must be self-contained: greeting, answer, photos, link, closing question. The leak vanished from logs within 48 hours; DM-to-order climbed from 9 to 21 percent over five weeks on the same traffic.
Setup in 7 steps and what ManyChat charges extra for
I will give you the exact setup I run for new stores, because vague "connect and go" advice is why most comment automation underperforms. Budget 45 minutes:
- Connect Instagram as Business/Creator linked to a Facebook Page, with
instagram_basicandinstagram_manage_messagesapproved. DIY App Review takes weeks; our managed onboarding skips it — the bureaucracy is the same one I documented in Meta App Verification 2026: A Founder's Guide. - Set reply_mode to
aiand dm_mode toon_keywordfor week one. Enable on_purchase_intent. You can graduate to dm_mode=always after two quiet weeks. - Enter 12 to 20 keyword triggers from your last 200 comments: buying words first, product words second, never greetings. Include Arabic dialect spellings your customers actually type.
- Set working hours, timezone, and the out-of-hours message. Write the reopening time into both the public template and the queued DM so neither side overpromises.
- Write the DM payload: price list, 3 to 5 photos, shipping table, payment link, one closing question. The AI personalizes around this payload; it never invents prices without it.
- Test with three comments from a second account: a price question (expect public + DM), a praise emoji (expect public only), a spam link (expect silence). Check the SendAiCommentReplyJob log for the label on each.
- Go live on one post, review the log nightly for a week, promote a trigger to the DM payload or demote a noisy trigger every Friday. Automation that nobody audits rots within a month.
On pricing honesty: ManyChat and Chatfuel sell comment-to-DM above their base plans — ManyChat behind Pro from ~$15/month plus per-contact overages past 1,000 contacts, Chatfuel behind higher bundles with similar scaling. A 5,000-contact store easily pays $50–$145/month before AI tokens. OT1-Pro includes classification, public AI replies, DM automation, and the split-prompt logic on Pro with no per-contact meter — compare on OT1-Pro pricing and OT1-Pro vs WATI, then create your free OT1-Pro account and run the three-comment test on your best post.
What I would do differently if I started over
I would ship the silent-spam rule on day one, cap triggers at buying words from the start, and split the prompts before the first customer. And I would open the SendAiCommentReplyJob log nightly for the first month and ask "would I have sent this myself?" The stores that do that Friday review end month one with a bot that sounds like their best salesperson.
Stop losing the leads you already earned
OT1-Pro transcribes voice notes, reads customer photos, scores every lead hot/warm/cold, and replies across WhatsApp, Instagram, Messenger, Telegram, and email — in Arabic or English, with every AI credit receipted in a transparent ledger. Free plan, no credit card.
Start free → · Sales follow-up automation · Lead follow-up software · Pricing · vs WATI · Talk to the founder on WhatsApp
جاهز للتجربة OT1-Pro?
اربط واتساب وإنستغرام وفيسبوك وتيليجرام مع ذكاء اصطناعي يبيع نيابةً عنك.
ابدأ مجاناً