To track sales from Instagram DMs, put a tagged link or a discount code in each automated message, then read orders where your store counts them. Instagram reports who replied, not who bought, so the tag or the code is the only thread joining a conversation to an order. Neither method catches every sale.
This page is about orders. If you only want to count taps on a link, tracking clicks on a link sent in an Instagram DM covers that, and it is the first half of the chain below. Instagram facts come from Meta's developer documentation, analytics facts from Google's Analytics Help, and discount code details from Shopify's and Stripe's help pages, all read on 13 October 2026.
What does Instagram report about a sale that started in a DM?
Instagram reports nothing about a sale. Meta's list of what a connected tool can be told about (page updated 23 September 2026) covers comments, mentions, messages, reactions, read status, taps on buttons a tool sent and a few more. A tap on a link and a purchase are not on it, so no Instagram report can say a DM led to an order.
Meta does pass along two clues about where a conversation began. For a conversation that starts from a click-to-DM ad, it tells the connected tool which ad. For an ig.me link, it passes a ref value if the link carries one. Whether a tool reads those is for the tool to say, and for ads, what click-to-DM ads report is the better place to start.
How does Instagram DM attribution work from comment to order?
Attribution here is a chain of four steps recorded in three places, and a label on the link or a code at checkout is the only join. A link carries only what is written into it, so the join has to be written there.
| Step | What happens | Who records it | What identifies it |
|---|---|---|---|
| Comment | Someone comments your keyword | Your DM tool | The keyword |
| DM | The private reply is delivered | Your DM tool | The automation |
| Visit | They open your page | Google Analytics | The tag on the link |
| Order | They pay | Your store | The tag or the code |
The cleanest way to make the three records line up is to give them one name. A DM automation is built around one keyword, and one keyword belongs to one automation, so use the keyword as the campaign name in the link and in the code. Then the number your DM tool shows for LINEN, the visits Google shows for linen and the orders your store shows for LINEN10 all describe the same post.
How do I use UTM links in Instagram DMs?
A UTM link is your normal link with a few tags added after a question mark, and Google Analytics reads those tags to learn where a visit came from. Google's Analytics Help says to always use utm_source, utm_medium and utm_campaign. Google also lists utm_id, utm_term for a paid keyword, and utm_content for telling apart two links in one place.
Here is a scheme that suits DMs. Set the source to instagram and the medium to dm. Set the campaign to the keyword, and the content to what started the conversation: comment, story or message. A finished link looks like this:
https://example.com/linen-set?utm_source=instagram&utm_medium=dm&utm_campaign=linen&utm_content=comment
Write every value in lowercase. Google says parameter values are case sensitive, so Instagram and instagram count as two different sources and split your numbers. Keep names and email addresses out of tags: the address is visible to the buyer.
Paste the finished link into the message, then test it. Send yourself the DM, tap the link and check that the tags are still in the address bar. A tool that rewrites addresses can drop them.
To read the result in Google Analytics 4, open Reports, then Acquisition, then Traffic acquisition. Google's page for that report describes Session source / medium and Session campaign as columns you can read, along with key event counts. An order shows up against a campaign only when your checkout sends a purchase event to Analytics and you have marked that event as a key event.
One trap: Google's page on default channel groups files traffic under Organic Social when the source is on a list of social sites, or the medium is social or a close variant. The page does not print that list, so we cannot say where dm lands. Read Session source / medium and ignore the channel name.
Can discount codes in an Instagram DM tell me what sold?
Yes, and a code catches sales a link misses. A code survives a screenshot, a switch from phone to laptop and a purchase days later, because the buyer types it at checkout. Your store counts it. Shopify's help page says its Sales by discount report shows how often your discount codes are used.
Use the same name as the keyword, so LINEN becomes LINEN10, and put the end date in the message. Both services we checked give you controls worth setting:
- Shopify lets you set the dates a code is valid, limit how many times it can be used and set a maximum of one use per customer. Its page also advises avoiding special characters in a code name, so stay with letters and numbers.
- Stripe promotion codes can be limited to first-time orders, given a minimum order value, set to expire and capped at a number of redemptions. Stripe says the code itself is not case sensitive, so linen10 works as well as LINEN10.
A code is shared by everyone who triggers the automation. Stripe can restrict a promotion code to one named customer, but a DM tool that sends the same text to every commenter cannot create a different code for each person. If you need single-use codes, generate them in your store and keep a pool of them yourself.
Should I use a tagged link, a code, or both?
Use both, because each one catches what the other misses. The tag tells you which post sent the visitor. The code tells you the sale happened even when the link was lost. Read them together:
- Tag and code both appear. The cleanest case. The sale is the DM's.
- Code with no tag. The buyer likely typed the code after a screenshot or on another device. Count the sale for that campaign.
- Tag with no code. Someone arrived from the DM and bought at full price. Count it as well.
- Neither. Add one line after purchase, such as "How did you find us?", and read the answers by hand.
What should I compare once orders arrive?
Compare automations with each other, not against a total you hoped for. Every method here misses some orders in the same way, so a campaign that sold twice as much as another is a safer finding than a claim about the exact revenue DMs produced. For each automation put three numbers side by side: DMs delivered, visits and orders. A number that drops sharply at one step tells you which step to fix.
Wait until each campaign has enough orders that one extra sale would not change the ranking. We give no minimum, because the right size depends on your volume.
What does inDM record, and what does it not?
On every plan, inDM records how many times each automation fired, how many DMs were delivered and how many people became contacts, by automation. Growth adds seeing who clicks your links and where they are. When someone taps a link, inDM forwards them to the address exactly as you saved it, tags included, and adds nothing of its own.
inDM does not produce a sales report, create a different discount code for each person, or read which ad started a conversation. The orders live in your store and your analytics, and the shared name is what lets you read them beside the DM numbers. For a free start, the first comment-to-DM automation is a few minutes of setup.
Where this stops working
- Some sales carry no label. A buyer who screenshots your link and types the address later arrives as direct traffic. A buyer who taps on a phone and finishes on a laptop opens your page without the tags, so that order carries no label, though a code still catches it.
- A tap is not a person. The click numbers a DM tool shows are requests to its redirect, as the click tracking page explains, and they can differ from visits in Analytics without either being wrong.
- A code proves a code was used. A redeemed code does not prove the DM caused the sale, and codes travel. Set an end date and a redemption limit.
- Things we could not verify. Where Google files a dm medium in its default channel groups, whether Instagram has any report of sales that began in a DM (we found none on the pages we read), and any typical rate at which DM links turn into orders. We left all three out.
- Terms move. Menu names and limits in Google, Shopify and Stripe change, so treat 13 October 2026 as the date these were checked.
Before your next automation goes live, write its keyword, its tag and its code on one line in a note. When the orders come in, that line tells you which post sold.
Sources
All read on 13 October 2026.
- Meta's list of Instagram notification fields, "Updated: Sep 23, 2026": what a connected tool can be told about, with no link tap or purchase.
- Meta's examples of Instagram notifications, "Updated: Sep 16, 2026": the ad and ig.me referral details.
- Collect campaign data with custom URLs: the tags, the three to always use, and case sensitivity.
- Traffic acquisition report: the menu path, Session source / medium, Session campaign and key events.
- Default channel group: the Organic Social conditions.
- Shopify discount codes: valid dates, usage limits, one use per customer, code names and the Sales by discount report.
- Stripe coupons and promotion codes: promotion code limits and case handling.