Deeplinkly

Glossary/Attribution mechanics

Click injection

Definition

Click injection is install fraud in which a malicious app detects that another app is being installed on the same device and fires a click at that moment, so the fraudster is credited for an install that was already under way.

It is the most surgical form of install fraud, because it wastes almost nothing: the fraudster does not buy traffic or fake devices, only the last instant before an install completes. It is also, unusually, one of the few fraud types with a clean arithmetic detection — the install referrer carries two timestamps, and injected clicks land in a place real clicks almost never do.

How the attack works

Historically, Android broadcast INSTALL_REFERRER and package-install intents that any app on the device could receive. A malicious app listens for the signal that an install has started, looks up which package it is, and immediately fires a click for that app through an ad network. The click arrives seconds before the first open, so a last-touch model credits it.

  1. The user taps a genuine ad, or opens the Play Store directly, and the download begins.
  2. A malicious app already on the device observes the install starting.
  3. It fires a click for that exact package through a network it monetises.
  4. The install completes and the app opens for the first time.
  5. Last-touch attribution sees the injected click as the most recent touch and credits it.
  6. The real source — organic, or another network — is recorded as having caused nothing.

The victim is usually the organic column or a legitimate network, not the user, which is what makes it survive for so long unnoticed. Spend does not increase; it moves. A channel with implausibly good conversion rates and implausibly cheap installs is the symptom.

This is an Android-specific attack, and Google narrowed it

iOS has never had a broadcast that lets one app observe another's installation, so click injection in this form does not exist there. On Android, the implicit broadcast route was closed and the Play Install Referrer API replaced it, which removed the easiest version of the attack — but injection through other install-time observations, and the older long tail of devices, keep the detection worth running.

The timestamps that give it away

The Play install referrer returns two clocks alongside the referrer string. referrerClickTimestampSeconds is when the click that Google attributes happened; installBeginTimestampSeconds is when the download started. An honest click precedes the download. An injected one does not.

What each timestamp relationship implies.
RelationshipMeaningVerdict
click < install_begin, gap of minutesUser clicked, then the store downloadedNormal
click ≈ install_begin, gap under a secondClick fired as the install startedInjection suspected
click > install_beginClick happened after download beganInjection — a click cannot cause a download that preceded it
click very old, install_begin recentLong consideration, or a stale attributed clickCheck the attribution window
Referrer absent entirelySideload, pre-install, or no referrer at allUnattributable, not fraudulent
Reading both timestamps at first open
val client = InstallReferrerClient.newBuilder(context).build()
client.startConnection(object : InstallReferrerStateListener {
    override fun onInstallReferrerSetupFinished(responseCode: Int) {
        if (responseCode != InstallReferrerClient.InstallReferrerResponse.OK) return
        val details: ReferrerDetails = client.installReferrer

        val clickAt   = details.referrerClickTimestampSeconds
        val beginAt   = details.installBeginTimestampSeconds
        val gapSeconds = beginAt - clickAt

        // Negative or near-zero gap: the click did not precede the download.
        // Report it; do not silently drop the install, or you lose the row
        // that proves the pattern exists.
        reportInstall(
            referrer = details.installReferrer,
            clickAt = clickAt,
            beginAt = beginAt,
            injectionSuspected = gapSeconds < 2,
        )
        client.endConnection()
    }

    override fun onInstallReferrerServiceDisconnected() { /* retry later */ }
})

Note the injectionSuspected flag rather than a filter. Dropping the install client-side destroys the evidence and makes the pattern invisible in aggregate; flagging it lets you argue the case with a network using their own data.

Injection versus spamming, which are often confused

Two different attacks with two different signatures.
Click injectionClick spamming
Requires an app on the deviceYesNo
Click volumeTiny — one per real installEnormous — millions of blind clicks
CTIT signatureNear zero, sometimes negativeVery long tail, flat distribution
Conversion rate reportedAbsurdly highAbsurdly low
PlatformAndroidBoth
DetectionReferrer timestamp arithmeticCTIT distribution shape

The CTIT rows are the practical tell. Injection compresses click-to-install time to almost nothing; spamming stretches it. A channel whose CTIT histogram has a spike in the first ten seconds is not a channel with unusually decisive users.

What to do about it

  1. Capture both referrer timestamps on every Android install and store them raw, forever.
  2. Compute the click-to-install gap per install and chart its distribution per source, not per campaign average.
  3. Flag negative and sub-second gaps rather than dropping them, so the evidence survives.
  4. Take the flagged share to the network with their own referrer data attached — this is a claim that can be settled, unlike most fraud disputes.
  5. Recheck after every SDK upgrade, since a regression that stops reading the referrer looks exactly like fraud disappearing.

The organic line is the number that should recover. If flagged installs fall and organic rises by roughly the same amount, the injection was moving credit rather than creating installs — which is the expected result, and the argument for why the spend was never buying anything.

Android SDK docs

Detection depends entirely on capturing both install referrer timestamps at first open and forwarding them raw. The Android SDK reference covers the referrer connection, the response codes worth retrying, and the fields to persist so the arithmetic is still available months later.

Open the android sdk docs

Frequently asked questions

What is click injection?
It is a form of mobile install fraud where a malicious app already on the device detects that another app is being installed and immediately fires a click for it, so a last-touch attribution model credits the fraudster for an install that was already happening. The fraudster buys no traffic and creates no installs; they only intercept credit at the last possible moment.
How do you detect click injection?
Compare the two timestamps in the Android install referrer. An honest click has referrerClickTimestampSeconds well before installBeginTimestampSeconds, usually by minutes. An injected click lands at or after the moment the download began, producing a gap near zero or negative, which is arithmetically impossible for a click that actually caused the install.
Does click injection affect iOS?
Not in this form. The attack depends on one app being able to observe another app being installed, which Android historically exposed through install broadcasts and iOS has never offered. iOS install fraud takes other shapes, such as click spamming or SDK spoofing, but the specific injection pattern detected by referrer timestamps is Android-only.
What is the difference between click injection and click spamming?
Click injection fires one precisely timed click per real install from an app on the device, producing an extremely short click-to-install time and an implausibly high conversion rate. Click spamming fires enormous volumes of blind clicks for users who were never shown an ad, producing a very long, flat click-to-install distribution and an implausibly low conversion rate.
Should I discard installs flagged as click injection?
Flag them rather than dropping them. Discarding the record removes the evidence you need to argue the case, and it makes the pattern invisible in aggregate reporting. Keep the raw timestamps, report the flagged share per source, and use it to reassign credit and dispute invoices rather than to silently delete rows.

Related terms

  • Click spammingClick spamming is install fraud in which a party reports large volumes of clicks that no user ever made, so that any install occurring later inside the attribution window is credited to them.
  • Click-to-install timeClick-to-install time is the elapsed time between the click on an ad and the first open of the installed app, measured per install and analysed as a distribution rather than an average.
  • Play Install ReferrerThe Play Install Referrer is a Google Play API that lets a newly installed Android app read the referrer string and click timestamps recorded when the user arrived at its Play Store listing.
  • Unattributed installsAn install is unattributed when no signal linking it to a prior ad click or link tap survived the journey through the app store, which can mean the install was organic or that the signal existed and was lost.