Collect the data › Adobe Analytics Tracking Calls
Link Tracking
Page View Calls split tracking into two kinds and went deep on the first, the page view. This section takes the second, the link tracking call, fired in code as s.tl(). You already know why it carries the name it does, a leftover from the era when a page's interactions were mostly links inside anchor tags.
If the naming were being decided today, a more honest label would be something like activity call, or user action call. That is closer to what it captures. A link tracking call is, in practice, everything that is not a page load. A scroll, a click on any interface element, a mouse hover, a video played or paused, a document downloaded, a popup closed, a form opened, a form submitted, and dozens more. None of these is really a link in the old sense, and few are exits to a third party site. They are the actions that define digital performance now.
Why these calls carry the real weight
Think about the questions a business actually asks. How many times was this form submitted? How many times was this important document downloaded? How many times was this video played? That is the insight that pays for the tool. Traffic metrics, the page views and visits, are the primary goal and they matter, but conversion does not happen at that level. Conversion happens here, where a visitor purchases, submits a lead, downloads something, or engages with content. That is conversion in the true sense, and link tracking calls are how you capture it.
How a link call gets made, on the web
As with page views, there are two worlds, the website and the mobile app. On a website, the pattern was set out in the Rules section: for every action that matters, you build a rule. Take a document download. You define a direct call, hand its identifier and the data layer details to the developer, and they populate and trigger it at the right moment. Your rule does the rest, setting the Analytics variables and sending the server call, where the Send Beacon action fires s.tl(). That end of the work, the rule mechanics and how the extension manages your variables, lives in the Rules section. Here the subject is the call itself.
If you are implementing by hand instead, you populate your variables and then call the function. Unlike s.t(), the link call needs a few arguments to describe itself.
// s.tl(linkObject, linkType, linkName, variableOverrides, doneAction) // linkObject : "this" for a real navigating link (resolves its URL, // and holds a brief moment so the beacon fires before // the browser leaves). Use "true" for a non-navigating // interaction such as a popup or a custom action. // linkType : "o" other/custom, "d" download, "e" exit // linkName : your label, up to 100 characters, shown in the report // the last two arguments are optional // A custom action that does not navigate away (a popup opened): s.linkTrackVars = "eVar10,prop10,events"; // required in custom code s.linkTrackEvents = "event5"; // so these get sent s.events = "event5"; s.eVar10 = "newsletter-modal"; s.prop10 = "product-page"; s.tl(true, "o", "Newsletter Modal Opened"); // A real download link, passing the clicked element: s.tl(this, "d", "User Guide PDF");
The linkName is worth care. It is what makes the call findable later in a debugger and meaningful in reports, which is why naming custom links well is treated as a discipline in the Rules section. One technical note that catches people implementing manually: when you set variables in custom code on a link call, you must also list them in s.linkTrackVars and any events in s.linkTrackEvents, or they will not be sent. Page view calls do not need this. When you set variables through the extension's interface instead, it manages both lists for you. The full reasoning is in the Rules section; the point to carry here is that a link call is selective about what it sends by default.
The call that races the page it is leaving
That "holds a brief moment" in the code above deserves more than a comment, because it marks the one place a link call can be perfectly built and still never arrive.
When a click both fires a tracking call and sends the browser somewhere else, two things start at once: the beacon is dispatched, and the new document begins loading. If the navigation wins, the page is torn down and the beacon goes with it. Passing this is what makes AppMeasurement hold the navigation back for a moment, around half a second, so the call gets away first. That is a trade rather than a fix. Every visitor who clicks a tracked outbound link waits through it, and on a slow connection the call can still lose.
Nothing reports the loss. The click happened, the visitor arrived at the other site, and the only trace is a number lower than it should be, which is indistinguishable from a quiet week. The modern answer is s.useBeacon = true, which hands the request to the browser through navigator.sendBeacon. The browser then owns delivery and completes it even while the document is being destroyed, so the delay stops being necessary at all. What you give up is the response: no confirmation and no error, so you cannot verify delivery from the page. That is a fair trade for a call you were previously losing without knowing it.
The three link types, and why they exist
The second argument, the link type, takes one of three values, and the reason there are exactly three goes back to the tool's history. In the early days the product paid special attention to two behaviors: file downloads, and exit links that carried a visitor off the site. Each got its own type and its own report. Everything else was lumped into a third, generic type.
| Type | Code | Feeds the report | How it is usually fired |
|---|---|---|---|
| Custom (other) | "o" | Custom Links | Manually, or by a Launch rule. The workhorse: most interactions use this. |
| Download | "d" | File Downloads | Automatically via trackDownloadLinks and linkDownloadFileTypes, or manually. |
| Exit | "e" | Exit Links | Automatically via trackExternalLinks and linkInternalFilters, or manually. |
In modern practice the download and exit types are less central than they once were. Downloads are often captured as an ordinary custom link paired with a success event, which fits them into the same conversion reporting as everything else. And both downloads and exits can be tracked automatically without you writing an s.tl() at all. Turning on trackDownloadLinks lets AppMeasurement fire a download call whenever a clicked link ends in one of the file extensions you list in linkDownloadFileTypes, such as pdf,zip,doc. Turning on trackExternalLinks does the same for exits, firing a call the moment a visitor clicks a link that leaves your domain. The special types are not obsolete; they simply sit alongside the more common pattern of custom links carrying success events.
What counts as an exit link is decided by linkInternalFilters, a comma-separated list of domains you consider part of your own site. When automatic exit tracking is on, any clicked link that does not match this list is treated as an exit. This is a separate feature from the report suite's Internal URL Filters setting in the Admin console. Those Internal URL Filters exist to support traffic-source dimensions like Referring Domain, deciding which referrers count as internal and are ignored. They do not define exit links. Same word, different jobs: one shapes exit link tracking in the implementation, the other shapes referrer reporting in the report suite.
If automatic download or exit tracking is on and you also fire a manual s.tl() for the same click, Adobe receives two calls for one action. That inflates the numbers and quietly makes the report wrong. Decide per behavior whether it is tracked automatically or by hand, and do not do both for the same link.
How a link call differs from a page call
The two calls are siblings, but they are not interchangeable, and it helps to see them side by side.
s.t() page view | s.tl() link call | |
|---|---|---|
| Increments Page Views | Yes, by one | No, it is a non-page-view hit |
| Reports it feeds | Pages, and page-level dimensions | Custom Links, File Downloads, or Exit Links |
| Typical payload | Page context: page name, section, channel | The interaction, usually with success events and eVars |
| Sends all variables by default | Yes | No, only what linkTrackVars lists in custom code |
| Mobile equivalent | trackState | trackAction |
What usually rides on a link call
There is no rule in the code that forces it, but there is a strong, unwritten pattern: link calls are where your important success events fire. The behaviors above, a form submitted, a document downloaded, a video played, are conversions, and conversions have always been captured with success events and eVars. That is why, as a general practitioner, you will see success events and eVars showing up on s.tl() calls far more than on page views.
One honest caveat, the same one raised in the variables module: the arrival of Workspace blurred the old strict lines between props, eVars, default variables, and events. You can build reports across most of them now. So treat "link calls carry success events and eVars" as the common convention it is, not as a hard boundary. It describes how implementations are usually laid out, not a limit the tool imposes.
The same behavior in a mobile app
As with the page view, the mobile world does not have an s.tl() function, because it does not run JavaScript. Everything that is not a screen load, which is captured with trackState, is captured instead with trackAction. Every interaction a user takes, short of moving to a new screen, is a trackAction call: a button tap, a filter applied, a video started. The syntax differs by platform, but the outcome is the same, data sent to Adobe's servers describing an action. The mechanics of the mobile SDK, including how these map to variables through processing rules, are covered in the Mobile SDK section.
Both calls in this module, the page view and the link call, share one thing underneath: each is a server call sent to Adobe. And server calls are not just the unit of data collection, they are the unit you are billed on. That is the subject of Server Calls and Billing.
Custom Links: Workspace → Dimensions → Custom Link
File Downloads: Workspace → Dimensions → Download Link
Exit Links: Workspace → Dimensions → Exit Link
This article focuses on the concepts, architecture, and practical guidance behind the topic. For the latest UI walkthroughs and step-by-step implementation instructions, use the links below. They leave this site and open Adobe's own documentation in a new tab.