Skip to main content
Social mediaBy SendURL team11 min read

Instagram Story Link Sticker Clicks: How to Track Them

Part of the Social media handbook

Track Instagram Story link sticker clicks with one short link per frame: taps versus visits, the first 24 hours by hour, Highlights, expiry and password links for Close Friends.

To track Instagram Story link sticker clicks, put a short link in the sticker instead of the plain URL, one link per Story frame. Instagram's Story insights count link taps inside the app; the short link counts the clicks that reached your site, hour by hour, with the country and device of each, and keeps counting when the Story lives on in Highlights.

This guide is part of Instagram link tracking, in the social media handbook.

Track a Story link in 5 steps

  1. Create a short link for the frame. Tag the destination with UTMs if you use GA4, then shorten it with a slug that names the date and frame, such as snu.to/autumn26-st-1014a.
  2. Add the sticker. In the Story editor, tap the sticker icon, choose Link, paste the short link, and set the sticker text (Instagram's examples: "shop the look", "read the recipe").
  3. Post, and note the time. Clicks are read against it.
  4. Watch the first 24 hours. The link's page in the SendURL console lists each click as soon as it's recorded (reload to see new ones); the script below groups them by hour.
  5. Compare with Instagram. After the Story expires, open its insights and set the link taps next to your clicks.

Every account, with two exceptions. Instagram opened the sticker to all accounts on 27 October 2021, replacing the old swipe-up link that needed 10,000 followers or a verified badge (Hootsuite). New accounts and accounts that "repeatedly share things like hate speech and misinformation" don't get it (Instagram, 27 Oct 2021).

One limit matters for paid reach: a Story with a link sticker can't be boosted. To run a Story as an ad, the link goes in an action button added during ad creation, and the Story must not already carry a link sticker (Instagram Help Centre). Ads are better tracked with a tagged URL and Meta's own parameters than with a short link; the Instagram guide explains why.

Taps, clicks and visits

Three numbers describe one Story, and they will differ:

NumberCounted byWhat it is
Link tapsInstagram, under the Story's InteractionsA tap on the sticker inside the app
ClicksSendURLA request that reached snu.to/<slug> and was redirected
SessionsGA4 (or your site's analytics)A page that loaded, with the tag allowed to run

Taps can exceed clicks: someone taps and backs out before the request completes, or loses signal. Clicks can exceed taps: the same link is opened from a Highlight after the Story's insights stopped, shared in a DM, or copied into another app, and every request counts, because SendURL counts total clicks, not unique people. Sessions are usually the lowest, since consent banners, blockers and impatient visitors all stop analytics from recording.

None of these says who. Instagram shows your Story's viewers, but not which of them tapped, and SendURL records country, device and browser, not identity.

One link per Story frame

A Story is usually several frames. If each frame with a sticker has its own link, you learn which frame people acted on:

FrameSticker textSlugutm_content
14 Oct, A: product shotShop the saleautumn26-st-1014astory-1014-a
14 Oct, B: price close-upSee pricesautumn26-st-1014bstory-1014-b
15 Oct, A: customer repostShop the saleautumn26-st-1015astory-1015-a
17 Oct, A: last day reminderEnds tonightautumn26-st-1017astory-1017-a

The pattern <campaign>-st-<mmdd><frame> keeps slugs short (Story sticker text is what people see, but a short slug is easier to check), sortable and unique across snu.to. Slugs are case-sensitive and can't be renamed later, so use lowercase. If a sequence of frames tells one story with one call to action, one link for the sequence is fine; split only what you want to compare.

The destination behind autumn26-st-1014a, tagged for GA4:

DestinationText
https://example.com/autumn-sale?utm_source=instagram&utm_medium=social&utm_campaign=2026-10-autumn-sale&utm_content=story-1014-a

Read the first 24 hours

A Story's clicks come in a burst. For a quick daily view, the API returns each link's clicks per day (UTC):

Clicks per dayShell
curl "https://api.sendurl.to/api/v1/links/$LINK_ID/stats" \
  -H "Authorization: Bearer $SENDURL_API_KEY"
ResponseJSON
[
  { "date": "2026-10-14", "count": 41 },
  { "date": "2026-10-15", "count": 9 }
]

Days are too coarse for a Story. This script compares several frames hour by hour from the moment each was posted. Pass each link's id (it is in the link's console address, console.sendurl.to/links/<id>) with its posting time (install requests first with pip install requests):

story_hours.pyPython
"""Clicks per hour after posting, for several Story links side by side.

Usage: python3 story_hours.py <link-id>@2026-10-14T17:30:00Z <link-id>@2026-10-14T17:31:00Z
"""
import os, sys, time
from collections import Counter
from datetime import datetime

import requests

API = "https://api.sendurl.to/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['SENDURL_API_KEY']}"}

def parse(ts):
    return datetime.fromisoformat(ts.replace("Z", "+00:00"))

def clicks(link_id):
    params = {"limit": 10}
    while True:
        r = requests.get(f"{API}/links/{link_id}/clicks", headers=HEADERS, params=params, timeout=10)
        r.raise_for_status()
        page = r.json()
        yield from page["clicks"]
        if not page["pagination"]["hasMore"]:
            return
        params["cursor"] = page["pagination"]["nextCursor"]
        time.sleep(0.25)

frames = []
for arg in sys.argv[1:]:
    link_id, posted = arg.split("@")
    hours = Counter()
    for c in clicks(link_id):
        if "facebookexternalhit" in (c["userAgent"] or ""):
            continue  # Meta's preview fetcher, not a person
        h = int((parse(c["clickedAt"]) - parse(posted)).total_seconds() // 3600)
        if 0 <= h < 24:
            hours[h] += 1
    frames.append((link_id[:8], hours))

print("hour " + " ".join(f"{name:>9}" for name, _ in frames))
for h in range(24):
    print(f"{h:>4} " + " ".join(f"{hours[h]:>9}" for _, hours in frames))
print(" sum " + " ".join(f"{sum(hours.values()):>9}" for _, hours in frames))

What to look for:

  • Where the clicks fall. A Story sits in viewers' trays for 24 hours. Clicks bunched in the first hours mean your followers saw it soon after posting; clicks spread across the day mean they came to it later, which is worth knowing before you schedule the next one.
  • Frame A against frame B. Same Story, same audience, minutes apart: the difference is the frame and its sticker text. With small numbers (a handful of clicks each), don't read much into it; run the comparison over several Stories.
  • Posting time. Post comparable Stories at different times of day and compare their first 24 hours. That is a better guide to your audience than published "best time to post" tables, which measure engagement rather than clicks (best time to post from link clicks).
  • Clicks after hour 24. They come from Highlights, shares or copies, not from the Story tray.

Free lists 7 days of analytics history and Pro 30; the link page and the API cover every click.

Highlights, expiry and passwords

Stories expire after 24 hours, but "Highlights … stay there until you remove them" (Instagram), and the link sticker goes with them. A sale Story saved to Highlights keeps sending people to the sale page in December.

Three ways to handle that:

  • Set an expiry on the link. After it, the short link shows a "Link expired" page (HTTP 410) and records no click. You can extend or remove the expiry later, which brings the link back.
  • Change where it points. Through the API, PATCH /links/:id with a new destinationUrl sends the Highlight's link to the next offer or an evergreen page.
  • Disable it. A disabled link shows "Link not found" (HTTP 404) and keeps its history; enable it again any time.

Expiry can be set when the link is created. Through the API (pick your own end time; the API refuses a time in the past):

A Story link that stops at the end of the offerShell
curl -X POST https://api.sendurl.to/api/v1/links \
  -H "Authorization: Bearer $SENDURL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "destinationUrl": "https://example.com/autumn-sale?utm_source=instagram&utm_medium=social&utm_campaign=2026-10-autumn-sale&utm_content=story-1017-a",
    "title": "Autumn sale: Story 17 Oct A",
    "expiresAt": "2030-01-31T23:59:59Z"
  }'

With no slug in the body, SendURL picks a random one, so this runs as written; add "slug": "autumn26-st-1017a" to name it. The full option list is in the create link reference, and link expiry and visit limits explains what visitors see.

For a Close Friends Story, a password-protected link adds a gate. Visitors see a password page first (not counted as a click); the right password redirects them and counts the click. Passwords are 6 to 128 characters, wrong attempts are limited per link and per visitor's network, and anyone who knows the password can pass it on, so it suits early access and members' offers, not secrets. Password-protected links covers the details.

Troubleshooting

  • No Link option in the sticker tray. Instagram withholds the sticker from new accounts and from accounts with repeated violations. Update the app and check again later.
  • Link taps in Insights, but no clicks. Open the short link in a browser. A 404 page means the link is disabled; a 410 page means it expired or reached its visit limit; a password page means clicks count only after the password. Insights numbers can also lag: Instagram notes that "reported numbers may be delayed".
  • Clicks but no link taps. The clicks came from elsewhere: a Highlight, a DM share, a copy of the link. The click records show it: a click opened inside Instagram has browser: "Instagram" and browserType: "inapp"; one from Safari or Chrome came from outside the app.
  • A burst of clicks within seconds of sharing in a DM. Instagram and Messenger fetch links to build previews, with Meta's crawler, facebookexternalhit. SendURL counts those requests. Bot clicks and link previews shows how to filter them.
  • GA4 shows the visits as Direct. The destination isn't tagged, or the tag has a typo. utm_source=instagram&utm_medium=social files the visit under Organic Social (UTM parameters guide).

Checklist

  • One short link per Story frame you want to compare, slug <campaign>-st-<mmdd><frame>
  • Destination tagged with utm_content=story-<mmdd>-<frame>
  • Sticker text set, and the short link tested once on a phone before posting (that test is a click)
  • Posting time noted for each frame
  • Expiry set on links for offers that end, if the Story goes into Highlights
  • Password link for Close Friends offers, with the password in the Story itself
  • First-24-hour comparison run per frame, previews skipped
  • Link taps from Insights recorded next to clicks after the Story expires

Make the link for your next Story on the SendURL home page, or read the Instagram link tracking guide for the bio, DMs, ads and creators.

Frequently asked questions

How do I see link clicks on my Instagram Story?

Open the Story, tap Activity, then Insights. Link taps are counted under Interactions. For the clicks that reached your site, with the time, country and device of each, put a short link in the sticker and read its click count.

Can you see who clicked the link on your Instagram Story?

No. Instagram shows how many taps the sticker got, not who tapped, and a short link records the request (time, country, device), not the person. Story viewers are visible to you, but a view is not a click.

Do you need 10,000 followers to add a link to an Instagram Story?

No. Instagram opened the link sticker to all accounts on 27 October 2021. New accounts and accounts that repeatedly share content such as hate speech or misinformation don't get it.

Do Instagram Story links work after 24 hours?

The Story disappears from your profile after 24 hours, but a Story saved to Highlights keeps its link sticker until you remove the Highlight. The link itself keeps working until you disable it or it expires, so set an expiry on links for offers that end.

Start tracking links free.

Create your first short link with click analytics in seconds. No credit card, no sign-up to start.

Shorten a link