Click-to-Instagram-Direct ads — how to route paid ad-taps into per-campaign DMs
CTM ads are Meta's highest-converting format for IG creators, but most operators waste the moment by sending a generic DM that doesn't address what the ad promised. Here's how to route each ad-tap to a tailored DM (or carousel) per campaign, with sub-second latency.
Click-to-Instagram-Direct ads — how to route paid ad-taps into per-campaign DMs
Meta has been quietly making Click-to-Instagram-Direct (CTM) ads the highest-converting paid format for IG creators for about two years. The premise is simple: instead of sending paid traffic to a landing page (where mobile users abandon at ~70%), your ad has a Send Message button that opens a DM thread directly inside the IG app. No webview, no app-switching, no abandoned cart.
Conversion rates on CTM ads consistently beat link-out ads by 2-4x in our customer data, especially for creator-led brands and DTC businesses with strong mobile audiences.
The catch: when 200 people tap your ad's Send Message button on a Tuesday, they all open a fresh DM thread on your IG handle. If your DM doesn't immediately address what the ad promised, you've burned the warmest part of the funnel. Generic "Hi! Thanks for reaching out 👋" destroys the conversion.
The fix is per-campaign DM routing. Each ad gets its own scripted DM (or carousel). The right thing lands in the user's inbox in under 3 seconds. Let's walk through how it works.
Why generic DMs lose the moment
When someone taps a CTM ad's Send Message button, here's their mental model:
- They saw a specific creative — a product, a promo code, a content hook
- They tapped because the ad promised something specific
- They expect the DM to deliver on that promise immediately
If the DM says "Hi! How can I help you today?", the user has to re-state what brought them. They lose the context. They abandon. Conversion drops 60-80% versus a DM that opens with "Hey! Here's the link to the [exact thing the ad promised]."
This isn't a marketing-speak observation. It's measurable in the DM-to-purchase rate per ad in any decent attribution system.
How Meta tells you which ad they tapped
When a CTM ad-tap fires, Meta sends a messaging_referral webhook event to whichever app you have connected. The event includes:
referral.source = "ADS"— confirms this is an ad-driven thread, not organicreferral.ad_id— the numeric ad_id from your Ads Manager- (sometimes)
referral.ads_context_data— post_id, creative metadata, headline
You can look at ad_id and decide which scripted DM to send. The same webhook handles two adjacent surfaces:
- m.me shortlinks — a
m.me/<handle>?ref=PARAMlink firesreferral.source = "SHORTLINK"with yourrefvalue. Useful for cross-channel attribution: put a uniquerefon each link in your email campaigns, on YouTube descriptions, on a Linktree, and route each one differently. - Ice Breaker chips (when the user has no prior thread) — a chip tap fires
referral.source = "ICEBREAKER"with the chip's payload string.
All three sources land on the same messaging_referral webhook. One trigger handles all of them.
Routing logic that scales beyond 1-2 campaigns
The simplest case is one CTM campaign + one DM. That's:
- Set up the ad in Meta Ads Manager (objective: Engagement → Send Message; destination: Instagram Direct)
- Note the ad_id (15-17 digit number)
- Create one automation in your DM tool that fires when
referral.ad_idmatches that number - Done
What about when you're running 5-10 campaigns simultaneously? You need:
- Campaign-specific DMs for the top 3 highest-volume campaigns (each with its own DM and CTAs)
- A catch-all for less-trafficked campaigns and edge cases
ReplyAtlas's Ad / link trigger handles this with a best-match precedence:
- Both
adIdsnon-empty ANDrefMatchmatches → most specific, picks first adIdsnon-empty, norefMatch, ad_id in list → nextadIdsempty,refMatchmatches → nextadIdsempty, norefMatch→ catch-all, fires when nothing else matches
This means you can ship 3-5 highly specific automations + 1 catch-all and the routing just works.
What to put in the DM (templates that convert)
Some patterns we've seen consistently outperform:
For product ads: Lead with the link, then a 2-line follow-up.
Hey {{firstName}}! Here's the link to [exact product from ad]: [your-shortlink]
Worth grabbing while it's still in stock — let me know if you have questions about sizing.
For lead-gen / educational content: Acknowledge what they came for, deliver, soft CTA.
Hey {{firstName}}! Saw you tapped my "[ad headline]" ad 🚀 Here's the [free resource / guide / etc]: [link]
Reply with what you're working on and I'll send the most relevant follow-ups.
For high-touch / consultative sale: Open with a single question that qualifies them.
Hey {{firstName}}! Quick question first — are you looking for [option A] or [option B]? Based on your answer, I'll send the right pricing breakdown.
For e-commerce with a catalog: Skip text, send a carousel.
The carousel-DM combo
Text DMs work, but for product-heavy campaigns the win is sending a carousel instead. Up to 10 image cards, each with up to 3 buttons, each button able to deep-link or open a postback.
Example carousel for an apparel ad:
- Card 1: hero image of the featured product → "Shop the look" button
- Card 2: alt color → "See alt color" button
- Card 3: best-sellers from the same drop → "Browse best sellers" button
- Card 4: customer review screenshot → "Read more reviews" button
- Card 5: size guide → "Find my size" button
Same trigger (Ad / link), same per-campaign matching — just dmFormat: CAROUSEL instead of TEXT. Each button's URL gets click-tracked individually so you can A/B-test which card converts.
The full carousel walkthrough: /tutorials/carousel-dms.
Pairing with drip sequences for non-converters
Most ad-driven leads don't convert on the initial DM. The best operators recover ~30% of non-converters by following up at Day 3 and Day 7 — automatically.
Drip sequences let you script those follow-ups once and they enroll every ad-tap automatically. The Day-3 DM might be a soft "Hey, did you have a chance to check that link?" The Day-7 might be a stronger CTA or a different offer.
Critically, drip stops the moment the lead replies (STOPPED_ON_REPLY) or is marked converted (STOPPED_ON_CONVERSION). So you're not pestering converters or people already in conversation. The full drip walkthrough: /tutorials/drip-sequences.
What you need to set this up
On the Meta side:
- A Meta Ads Manager account (you're already running ads, so probably yes)
- A Click-to-Instagram-Direct ad campaign live (objective: Send Message → Instagram Direct as destination)
- The numeric ad_id of the campaign(s) you want to route — visible in Ads Manager under each ad
On the tool side:
- An IG Business account connected to a tool that supports the
messaging_referralwebhook (which meansinstagram_business_manage_messagespermission, which means a Meta-approved app) - A DM template (or carousel) drafted
ReplyAtlas's Ad / link trigger is on the Pro+ plan. The full walkthrough is at /tutorials/ad-funnels. Set up time: about 5 minutes per campaign once your ad is live in Ads Manager.
Common gotchas
The webhook hasn't subscribed. When you (or your tool) connect to a Meta App, the app has to be subscribed to the messaging_referral webhook field at the App Dashboard level. If only the comments field is subscribed, ad-taps don't deliver. Tools usually do this on connect; check the tool's docs.
App in Development mode. While the Meta App is unpublished (pre-App-Review), Meta only delivers test webhooks from the Dashboard's "Test Webhooks" button. Real ad-taps don't fire until the app is approved and flipped to Live. This is the single biggest blocker for new IG-DM tools — Meta App Review is 5-14 business days, plus iteration.
Wrong ad_id. The ad_id is the ad id, not the campaign id, not the ad set id. Easy to confuse in Ads Manager. Numeric, 15-17 digits.
Account in Personal mode. Personal IG accounts don't receive messaging_referral events at all. Switch to Business or Creator and reconnect.
FAQ
Does this work with Reels ads?
Yes. Any ad with the "Send Message → Instagram Direct" destination fires messaging_referral regardless of placement (Reels, feed, stories, Explore).
Can I send the DM from the same account I'm running the ad to, or do I need a separate IG account? Same account. The ad is on your IG handle; the DM lands on your IG handle from the user. No separate sender needed.
How fast does the DM land after the ad tap? Usually 2-5 seconds. Webhook delivery from Meta to ReplyAtlas: ~1-2 sec. Cloud Tasks dispatch: ~500ms. IG Send API call: ~500-1000ms. Total: well under 5 sec on a normal day.
What's the difference between this and ManyChat's CTM flow? Mostly pricing and integration. ManyChat is the legacy leader; their pricing tops out at $145/mo for higher tiers. ReplyAtlas's Pro+ is $99/mo at this writing with the same trigger. The integration is simpler if you're also using ReplyAtlas for other automation surfaces (carousel DMs, drip, lead pipeline). We're cheaper if you don't need ManyChat's broader Messenger / WhatsApp / SMS reach.
Does the DM have a 24-hour reply window like other auto-DMs? Yes — the standard 24-hour rule from Meta applies. After 24 hours, you can't send another freeform message to that user without the HUMAN_AGENT tag (which extends to 7 days, available on Pro+). For most ad funnels, 24 hours is plenty since the conversion happens in the first session anyway.
Can I A/B test different DMs per ad? Yes — A/B testing is supported on every automation type (50/50 deterministic split, auto-promote winner at ≥100 sends/variant ≥20% CTR delta). Worth setting up for high-spend campaigns.
If you're spending $1k+/month on CTM ads and currently using a generic DM, swapping to per-campaign routing is one of the highest-leverage changes you can make this quarter. ReplyAtlas's Pro+ plan includes the Ad / link trigger plus the full Carousel + Drip stack the strategy depends on.
Ready to try it on your own Instagram?
Free Starter plan · 1,000 DMs/month · No credit card · Setup in 60 seconds.
Get started — free