Instagram DM automations
Someone comments a keyword on your post, Zippy DMs them back — and the link in that DM springs the real native app instead of dying in Instagram's in-app browser, so you finally see who actually opened it.
Instagram DM automations
Say "comment LINK" in your caption. Someone comments LINK. Zippy DMs them your link, optionally replies under their comment, and tags them.
That part is table stakes — ManyChat has done it for years. Here's the part that isn't: the link in the DM is always a Zippy link, so the tap springs the real native app instead of Instagram's in-app browser, and the app-open lands in your stats. A comment-to-DM tool's report ends at the tap. This one carries on past it — and no other DM tool can act on that outcome per person, sending the follower who got stranded last time different words and a different link.
DM automations are a Legend feature.
Not connectable yet — Meta hasn't approved us
This whole surface is built, tested, and switched off. There is no Meta app to connect to yet, and App Review hasn't been submitted. Read Instagram setup → What actually works today for the unvarnished status before you plan around it.
Want the outcome today, with no approval from anyone? Keep your existing ManyChat flow and swap the raw URL for a Zippy link — the ManyChat recipe. Same webview escape, same app-open stats, works on any plan, right now.
How do I auto-DM people who comment on my Instagram post?
Once you're connected, in Instagram → New automation:
- Pick the trigger. "Someone comments on my post" is the 90% case.
- Set the keywords.
LINK,PRICES,SEND IT— up to 10, matched case-insensitively. Choose contains (the comment includes one of your words) or is exactly (the whole comment is one of them). Leave the keywords empty and it fires on every comment, which is a real setting and not a mistake. - Optionally pin it to one post so a rule only listens to a single reel.
- Write the DM. Just the words — see below for why you don't type the link.
- Attach the link. Pick one of your Zippy links from the dropdown.
- Optionally add a public reply ("check your DMs 💌") and tags for everyone the rule replies to.
The builder shows you a live preview of the exact message your follower receives and a one-line summary of when it fires, both rendered by the same code the server uses — so what you see cannot drift from what gets sent.
Up to 25 rules per connected account.
What are the four triggers?
| Trigger | Fires when | Typical keyword |
|---|---|---|
| Someone comments on my post | They comment on a post or reel | LINK |
| Someone DMs me a word | They message you directly | PRICES |
| Someone replies to my story | Any story reply comes in | SEND IT |
| Someone mentions me in their story | They tag you in their story | (usually blank — great for UGC thank-yous) |
All four use the same keyword matching and the same DM composer. The difference is which Instagram surface starts them, and — importantly — which reply window Instagram gives you.
Why can't I type a link into the DM text?
Because a raw URL in a DM is exactly the leak this feature exists to plug.
Tap a bare https://… inside Instagram and it opens in Instagram's in-app browser: a
webview where your follower is logged into nothing, Apple Pay doesn't exist, and cookies
are walled off from the pixel you're paying for. The DM landed. The checkout didn't. And
the tap reports nothing back to you.
So the link is attached, not typed. You pick a Zippy link; Zippy appends its short URL to your message at send time. If you paste a raw URL into the DM text anyway, saving the rule fails with a message explaining why, and even if a rule somehow got saved that way the send itself refuses. That's deliberate: we'd rather skip one DM than ship one that can't open the app and can't be measured.
The Deep Link Debugger shows you the difference on your own destination, side by side.
When will Instagram not let my automation send?
Instagram restricts unsolicited messaging hard, and an account it restricts is not something anyone can hand back to you. So Zippy refuses to send whenever the rules are unclear, and tells you rather than failing quietly.
| Situation | What happens |
|---|---|
| They DM'd you more than 24 hours ago | Skipped — Instagram's standard reply window closed |
| The comment is more than 7 days old | Skipped — that's Instagram's private-reply window |
| Another rule already replied to that comment | Skipped — Instagram allows exactly one DM per comment |
| It's a comment on a live video | Skipped — only allowed while the live is running, which we can't verify |
| Instagram didn't tell us when it happened | Skipped — we won't guess our way outside a window |
| You're sending very fast | Skipped — we throttle below Instagram's limit so we stop you before they do |
| Your connection lapsed, or you downgraded | Skipped — with the reason, and nothing is lost |
Every skip is a row in the automation's history with that explanation in plain English — never a raw Meta error code, never silence.
One structural guarantee worth stating: every DM Zippy sends is a reply to a specific person who just interacted with you. There is no way to point this at a list. There is no audience field to fill in. That isn't a policy we promise to follow, it's the shape of the thing.
How do I know if my DM automation actually worked?
Two numbers, and the second one is the whole point.
Sends — how many DMs went out, how many were skipped, how many failed, and how many distinct people you reached. Every comment-to-DM tool has this.
App opens — of the people who tapped the link in that DM, how many landed in the real native app versus the in-app browser versus nowhere useful. Zippy's redirect engine records what happened after the tap, so a rule's report reads:
- opened — they reached the real app. Logged in, cards saved, pixel alive.
- browser — the webview won.
- broken — the hand-off went nowhere useful.
That's the answer to "my DM automation gets clicks but no sales", and it's the number a click counter structurally cannot produce.
App-open rates are a sampled estimate and are labelled as such, and they are iOS-only
— an Android tap is recorded as unmeasured and counted in neither the top nor the bottom of
the rate. A rule whose link has no measured taps yet reports no rate at all rather than a
misleading 0%.
One link per rule
Give every automation its own Zippy link. The stats are per-link, so a dedicated link is what turns "did my DM traffic open the app?" into a question with an answer per rule. Tags and folders keep them tidy.
Can I see the whole funnel, from the comment to the opened app?
Yes — four steps, and only the first two exist in any other comment-to-DM tool:
| # | Step | Where the number comes from |
|---|---|---|
| 1 | commented | Exact. Every comment that matched your trigger. |
| 2 | DM sent | Exact. The sends that actually went out. |
| 3 | tapped the link | Sampled. Measured taps on the Zippy link in the DM. |
| 4 | OPENED THE APP | Sampled. The people who landed inside the real native app. |
Every rival's funnel stops at step 2, because the link they send is a plain URL that dies in Instagram's in-app browser and reports nothing back. Steps 3 and 4 exist here only because the DM carries an engine-backed Zippy link.
The gap between step 3 and step 4 is the number to stare at. Those are people who wanted what you offered enough to tap, and then got stranded in a logged-out webview with no saved cards and no pixel. Zippy prints that count in plain words underneath the funnel, because it is the audience you already paid to reach and then lost at the door.
What the funnel will not do
- It will not pad itself. A step Zippy cannot measure reads unavailable, never
0. Three things cause that, and each says which: the rule sends no link, analytics isn't connected, or the rule sends personal links whose taps we can't total yet. - It will not invent a drop-off across a step it couldn't measure. If step 3 is unavailable, there is no "lost between 3 and 4" figure.
- A brand-new rule gets a sentence, not a funnel of zeros.
- Steps 1–2 and steps 3–4 are not the same kind of number and are never presented as
one ledger. The first two are exact database counts; the last two are sampled and
extrapolated, marked
sampledon the step itself, and always shown as whole numbers — a decimal there would be false precision.
Can I share it?
There's a one-tap share card: a single image drawing all four steps, with the count of people who opened the real app as the headline. Nobody else can post that picture.
The card is all-or-nothing on purpose. It renders only when all four steps are real numbers and somebody actually opened the app; otherwise you get a message explaining which step is missing. An image travels without the page that framed it, so a funnel drawn with a hole in it would read to strangers as a complete one. The sampling note is printed on the card itself for the same reason.
Can I do more with the people who replied?
Yes — that's what the tags are for. A rule stamps its tags on everyone it replies to, so "everyone who commented DROP on the launch reel" becomes a group you can act on rather than a number you watched go by.
From there:
- Audience segments slice the resulting taps by country, device, and outcome — a segment filtered to opened is your true-fan list.
- Email capture turns those taps into contacts you own, off Instagram entirely. Instagram can restrict your reach tomorrow; an email list can't be restricted by anyone.
- Webhooks push
app.opened/app.browser/app.brokento your own stack the moment a DM tap resolves — no polling.
How do I say something different to people who didn't open the app?
Add a condition. This is the one thing on this page that no other DM tool can do.
Every Zippy link reports whether the tap sprang the real native app or died in Instagram's in-app browser. Because we already know that, per person, a rule can act on it:
If they tapped last time but got stuck in the in-app browser → send them the store link instead, with different words.
ManyChat can branch on a tag. It can't branch on whether the app actually launched, because the raw URL it sends reports nothing back. We're not the only tool that measures app opens — URL Genius reports an app-arrival percentage too — we're the one that lets a DM rule act on it per person.
Read the Android caveat before you build one of these
The app-open outcome comes from a page-visibility inference, not a report from the app,
and on Android it cannot be inferred at all: Chrome fires the identical signal whether the
app launched or the hand-off failed. So our interstitial registers no Android outcome —
those taps are recorded as unmeasured and counted in neither the top nor the bottom
of any rate. Every app-open number here is an iOS number. If your audience is
Android-heavy, most of your traffic will have no app-open outcome to branch on at all.
Full mechanism and failure modes: Limits.
In the builder, under Say it differently to some people, add up to 3 lines. Each line is one condition, one message, and optionally a different link. They're read top to bottom, first match wins, and everyone the lines miss gets your main message.
What can I branch on?
| Condition | What it means |
|---|---|
| Last tap: opened the real app | Our page went hidden after firing the app — read as a launch. iOS only. |
| Last tap: stayed in Instagram's browser | Our page was still visible nine seconds after firing the app, or they left it. iOS only. |
| Last tap: hit a broken app link | The app link fired and failed. iOS only. |
| Last tap: nothing we could measure | Every Android tap lands here, alongside anyone we've sent a link to who hasn't tapped yet. Don't write this branch as "you never clicked" — many of these people tapped, and may well have opened the app. |
| Follows you / doesn't follow you | Changes your wording only — see below. |
| A tag they already have | Tags your earlier automations stamped on them. |
The app-open conditions only apply to links we sent that person directly. Public taps by anyone else stay anonymous — see the identity join.
A condition can never hold your link back
Conditions change what you say, never whether the link goes out. A condition line with no link of its own sends the same link as everyone else — there is no setting anywhere that means "send them nothing".
This matters most for the follow condition. "Follow me to get the link" is prohibited by Instagram's own Community Standards, and enforcement lands on your account, not ours — which we could never give back to you. Other tools ship it anyway. We built follow-awareness instead: warmer words for a follower, a friendly invitation for someone new, and the link you promised in both.
Which condition worked?
Open Results on the rule. Under the headline numbers there's a row per condition — how many people took it, how many people that was, and that branch's own app-open rate.
That last column is the point. If your "stuck in the browser" line sends a different link, you can see whether it actually lands those people in the app more often than the one it replaced. Everyone the conditions missed shows up as Everyone else, so the rows always add up to the rule's total.
Rates are whole numbers from sampled click data over 90 days, same as everywhere else in Zippy. A branch that's never fired shows as empty, not as 0%.
Do not act on a few points of difference between two branches. The underlying signal is
a page-visibility inference with known false readings — a phone lock mid-launch reads as
opened, a cold start slower than nine seconds reads as browser — the counts are sampled,
and every rate here is an iOS rate, because Android taps are unmeasured and sit in neither
the top nor the bottom of it. Compare branches with a clear gap, never a decimal. How the number is made and where it lies.
Buttons
Your link can ride as words — Instagram turns it into a tap — or it can be a button. A button is one tap instead of two, and it's the only way to find out which offer people took.
Under 5. Add buttons, each button is three fields: what it does, what it says, and (for a link button) which of your links it opens. The builder lets you add three, which is Instagram's cap on the shape a link button has to use — see the two shapes for when the real ceiling is higher.
| Button | What happens |
|---|---|
| A button that opens a link | Opens one of your Zippy links. Each button carries its own link, so each one gets its own app-open rate. |
| A button that tags them | No link — a tap just tags that person with the button's own words. Your next automation can then answer them differently with the A tag they already have condition. |
| Ask for their email | Instagram offers them their own address and one tap hands it over. It lands in Audience with the same consent wording your fallback page shows. |
Labels stop at 20 characters, because that's where Instagram cuts them off.
You still can't type a link into a button
Same rule as the message body, for the same reason: a typed-out link opens in Instagram's
in-app browser — logged out, no Apple Pay, nothing reported back. So a button has no URL
field at all. It points at one of your links, and a link-shaped label (bit.ly/x,
mybrand.com/sale) is refused too. Twenty characters is plenty of room to type a URL, and
Instagram would happily auto-link it.
Why do my buttons look different sometimes?
Because Instagram has two different controls, and a message can only ever use one of them. Zippy picks for you and never mixes the two, so what you build is what goes out.
| Shape | What it looks like | How many | When you get it |
|---|---|---|---|
| Button template | Buttons stacked under a card of your message text | 3 | Your rule has a link button and your message fits 640 characters |
| Quick replies | Tappable chips in a row along the bottom of the thread | 13 | Everything else |
Both numbers are Instagram's, not ours. Three is all a button template holds; thirteen is all one message can carry in quick replies. Zippy stores up to 13 buttons on a rule and applies whichever ceiling the shape it picked actually has.
Two consequences worth knowing before you build a rule:
- A long message drops your link buttons. The template's text tops out at 640 characters, but a DM can be 1,000. Write past 640 and Zippy sends your full words rather than truncating them — which means the quick-reply shape, which holds no link buttons. Your link is still in the message, because it always is.
- The email ask and a link button never appear together. A button template can't carry an email ask at all, so if the message went out as a template, the ask is dropped. Put the email ask on a rule with no link button and it ships as a quick reply.
What happens when someone taps a quick reply?
- A tag button stamps that person with the button's own words, lowercased — "Send me the
guide" becomes the tag
send me the guide. Instagram hands us back a payload we wrote ourselves, so a chip from somebody else's tool can't tag your people by accident. Your next automation can then answer them with the A tag they already have condition. - The email ask hands over the address they picked, and it lands in Audience. Instagram writes this button's label itself and forbids us from setting one, so the label you type on it is only there to help you tell your buttons apart — your follower never sees it. That's also why the consent wording sits in the message body rather than on the button: 20 characters is nowhere near enough room for words someone can meaningfully agree to, and Instagram allows no label here anyway.
Either way the tap arrives as an ordinary message in the thread, so it also opens Instagram's 24-hour reply window — the same window every other rule of yours works inside.
Two places buttons don't appear
Both are Instagram's limits, not ours, and neither one can leave someone stuck:
- On desktop. Instagram doesn't draw buttons in its web DMs at all.
- On the DM that answers a comment. Instagram only documents plain text there, so we send plain text. Buttons work on every other trigger — keyword, story reply, story mention — because those all open the standard 24-hour reply window.
In both cases your link is still in the words. If your rule has its own link, that's the one. If the only link you attached is on a button, we put that one in the message too. So the worst case is that someone reads a message and taps a link, which is exactly what happened before buttons existed.
Which button opened the app?
Open Results on the rule. Under the per-condition table there's a row per button — its label, what kind it is, and its own app-open rate.
This is the column a tap counter can't give you. Two buttons can get the same number of taps and land wildly different numbers of people inside the real app, because they point at different destinations. A button that carries no link (a tag button, or the email ask) shows as empty rather than 0% — it has nothing to measure, and pretending otherwise would be a lie.
Same honesty rules as everywhere: whole numbers, sampled clicks, 90 days, iOS only
(Android taps are unmeasured and score in nothing), and
a heuristic underneath.
Compare buttons with a clear gap, never a decimal.
Notes
- Legend plan. Downgrade and your rules go read-only, never deleted. Links you already DM'd keep redirecting forever.
- Nothing is sent to your followers while our Meta app is unapproved — see setup.
- Same rules, both surfaces. Web and mobile read the same trigger copy, the same preview, and the same skip explanations from one source, so they can't tell you two different things.
- Your token is never readable back, not even once. See how Zippy stores your Instagram access.
Related
- Instagram setup — the prerequisites, the permissions, and the honest approval status.
- ManyChat — the version that works today, on any plan, with zero approval.
- Deep Link Debugger — watch a link escape the in-app browser before you attach it to a rule.
- Webhooks · n8n — push the outcome into your own automation.
- Audience segments · Email capture — what to do with the audience a rule builds.
- UTM builder · A/B split testing — attribute and race the links your DMs carry.
- Blog: ManyChat DMs a link that dies in the in-app browser
- Blog: Branch on whether the app actually opened
- Blog: Every button is a measured spring
- Blog: The funnel that ends at the opened app
- Changelog: Instagram DM automations and keyword, story reply & story mention triggers and conditions that branch on app-open and buttons with per-button app-open rates and the comment-to-app-open funnel
Instagram setup
What you need before Zippy can reply to your Instagram comments and DMs — a Professional account and message access turned on, with no Facebook Page required — plus the honest status of Meta's three gates (development mode, App Review, and Business Verification) and what each means for you today.
Streaming services
Zippy opens two music services natively — Spotify and Apple Music. Exact per-OS behaviour, plus the URL shapes and services that get a plain redirect instead.