Webhooks

Send install and sign-up attribution to your backend

Receive campaign context as a JSON POST when an install is attributed or a user signs up. Join the events in your own systems without polling for each conversion.

Install and signup webhooks are live on every plan, including Free. Webhooks for other events are built on request.

Requests to your endpoint

TimeCampaignResponse
09:42:43Brand searchsignup200
09:42:36Story adsinstall200
09:42:29Creator adsinstall200
09:42:22Diwali installssignup200
09:42:15Brand searchinstall200
09:42:08Diwali installsinstall200

POSTsignup webhook

09:42:43
content-type: application/jsonlinkrunner-key: ••••••••••••••••
"event_type": "signup","lr_install_id": "7b2d91e0-…","user_id": "u_60417","campaign_name": "Brand search","network_name": "GOOGLE","location_data": { "city": "Pune"}
Your response 200 OK88 ms

Join 400+ growth teams using Linkrunner.

    • ABCoffee logo
    • Alle logo
    • AugustAI logo
    • Bounce Daily logo
    • Buku Warung logo
    • CraftMyPlate logo
    • Eira Club logo
    • Elefant logo
    • Fold logo
    • Fuaark logo
    • Grapevine logo
    • HashFame logo
    • Hypd logo
    • IPF logo
    • Karobar App logo
    • Kulfi logo
    • Lingopanda logo
    • Matiks logo
    • Meatigo logo
    • Omli Kids logo
    • Playo logo
    • Pocketful logo
    • Richie Club logo
    • Saras logo
    • Shopping logo
    • Sid's Farm logo
    • Stratzy logo
    • Stylezen logo
    • Tal Boss logo
    • The Tatva logo
    • Utsav logo
    • Zave logo
What you receive

Get the attribution context alongside the event

Add it under Settings, Data Export, Webhooks, then press Test Webhook.

Join install and signup on one ID

Install fires on attribution, signup fires on signup(), and both carry the same lr_install_id.

install webhook

09:41:12
"event_type": "install","lr_install_id": "e1c0f4a2-…-7a04","user_id": null,

signup webhook

09:44:37
"event_type": "signup","lr_install_id": "e1c0f4a2-…-7a04","user_id": "u_58213",

Your users table

user_id
u_58213
lr_install_id
e1c0f4a2-…

A Slack channel that pings on every conversion

Paste a hooks.slack.com URL to get each install or signup with campaign, network and location.

# installs

Linkrunner9:41 AM

New install

Campaign
Diwali installs
Network
Meta
Ad set
Lookalike 1%
Creative
Festive offer video
Location
Bengaluru, Karnataka

Linkrunner9:44 AM

New signup

Campaign
Diwali installs
User
u_58213

Three attempts, two static IPs

Retries come 1 second after the first failure and 2 seconds after the second, from two static IPs.

Your endpoint

install e1c0f4a2
Attempt 1 of 3POST install webhook
Retry after 1 s
Attempt 2 of 3POST install webhook
Retry after 2 s
Attempt 3 of 3POST install webhook
ResultRetrying
Sent from8.234.94.1888.234.80.204
Delivery rules

Three things your endpoint needs

01

An endpoint you control

Every request carries your project key in linkrunner-key, so use your own server, not a relay.

02

A direct 2xx

Use the final URL, answer 2xx and queue slow work. See the setup guide.

03

Room for retries

Three attempts, then marked failed. Allowlist both static IPs. See the webhooks docs.

A receiver that holds up

Verify the key, answer fast, dedupe

With Agent Skills, npx @linkrunner/skills add webhooks has your coding agent write this receiver.

app.post("/linkrunner-webhook", async (req, res) => {
  // 1. The header carries your project key
  if (req.headers["linkrunner-key"] !== process.env.LINKRUNNER_KEY) {
    return res.status(401).end();
  }

  // 2. Answer with a direct 2xx, no redirects
  res.status(200).json({ received: true });

  // 3. Dedupe, then do the work
  const { event_type, lr_install_id, user_id } = req.body;
  const key = [event_type, lr_install_id, user_id].join(":");
  if (await seen(key)) return;
  await queue.push(req.body);
});
1st attempt
Immediately
2nd attempt
1 second after the first failure
3rd attempt
2 seconds after the second failure
Source IPs
8.234.94.188, 8.234.80.204
By the numbers

Delivery, in plain figures

Events live today: install and signup

2

Delivery attempts per webhook

3

Static source IPs to allowlist

2

Hear from our customers

Trusted by teams that care about more than attribution.

“The level of customisation that Linkrunner was able to offer was unmatched by any of the other competitors we looked at. Their team took the time to understand our exact requirements and delivered a solution that felt tailored to our needs, rather than forcing us into a fixed framework. That flexibility made a significant difference for us and was one of the key reasons Linkrunner stood out.”
Ronald M Thomas

Ronald M Thomas

Digital Marketing, Playo

Playo

34%

CPI reduction in 3 months

₹20.30 → ₹13.39

Google Ads CPI drop (Dec '25 → Feb '26)

Read customer story

Frequently asked questions

Events, security and delivery, answered.

Receive a test attribution webhook

Add your final endpoint URL in Linkrunner, send a test webhook and check your receiver before processing live events.