Attribution Windows
Attribution windows determine how long clicks remain valid for matching to app installs. LinkForty gives you per-link control that competitors charge thousands for.
What is an Attribution Window?
An attribution window is the time period during which a click can be matched to an app install.
Example Flow:
-
Monday 10:00 AM - User clicks your short link
- LinkForty creates device fingerprint
- Stores click event with timestamp
-
Wednesday 3:00 PM - User installs your app (65 hours later)
- App opens and SDK initializes
- SDK sends fingerprint to LinkForty
-
Attribution Check
- Time since click: 65 hours
- Attribution window: 168 hours (7 days)
- Result: Match found (65h < 168h)
-
Deep Link Delivered
- SDK receives original link parameters
- App navigates user to specific content
- Install attributed to your campaign
If the user had installed on Sunday (160 hours later), still within 168h window — match.
If the user had installed next Monday (168+ hours later), exceeds window — no match.
Two Windows: Install vs Event
LinkForty has two independent attribution windows, both configurable per link:
| Window | What it bounds | Field |
|---|---|---|
| Install attribution window | How long a click stays eligible to match an install | attributionWindowHours |
| Event (conversion) attribution window | How long after the click an in-app event still attributes to the link | eventAttributionWindowHours |
Everything above on this page describes the install window. The event window governs the down-funnel: once an install is attributed, how long do that install's subsequent in-app events (purchases, subscriptions, level-ups) keep counting toward the originating link?
Example: A user clicks a Black Friday link and installs the next day (within the install window). Three weeks later they make a purchase. Whether that purchase is credited to the Black Friday link depends on the event attribution window, not the install window.
Defaults and fallback
The event window resolves in this order:
- The link's own
eventAttributionWindowHours, if set - Otherwise the link's template default (
defaultEventAttributionWindowHours) - Otherwise the system default of 168 hours (7 days)
Unlike the install window, the event window is left unset (null) by default so the system default applies at read time. The same 1 to 2,160 hour range applies.
{
"title": "Subscription Campaign",
"attributionWindowHours": 168, // install must happen within 7 days of click
"eventAttributionWindowHours": 720 // events count for 30 days after the click
}
How it's applied
When App Analytics rolls up down-funnel events, each in-app event is included only if it occurred within the attributed link's event window of the original click. Events outside the window still exist in your data — they just aren't credited to that link's funnel. screen_view events from automatic screen tracking are excluded from this conversion rollup.
Set a longer event window (30–90 days) for apps where revenue arrives well after install — subscriptions, considered purchases, B2B. Keep it short for impulse-driven funnels where a late purchase probably wasn't driven by the original link.
Why Attribution Windows Matter
Conversion Rate Impact
Longer windows catch more installs but may reduce accuracy:
| Window Length | Typical Match Rate | Accuracy | Best For |
|---|---|---|---|
| 1 hour | 5-10% | Very High | Immediate actions |
| 24 hours | 15-25% | High | Direct response |
| 7 days | 35-50% | Balanced | Industry standard |
| 30 days | 45-60% | Lower | Brand awareness |
| 90 days | 50-70% | Lowest | Long consideration |
The Trade-off:
- Shorter windows = Higher confidence in attribution, fewer matches
- Longer windows = More matches, but some may be coincidental
Business Impact
E-commerce App (7-day window)
- 1,000 clicks from Instagram ad
- 350 installs within 7 days (35% conversion)
- Cost: $500 ad spend
- CPI: $1.43
Same campaign with 1-hour window:
- 1,000 clicks
- 75 installs within 1 hour (7.5% conversion)
- Cost: $500 ad spend
- CPI: $6.67 (looks way more expensive!)
Shorter windows under-report true performance. Longer windows may over-attribute.
LinkForty's Competitive Advantage
Per-Link Attribution Windows
LinkForty: Configure attribution window for every individual link
{
"title": "Flash Sale - 24h Only",
"attributionWindowHours": 24,
"originalUrl": "https://example.com/flash-sale"
}
AppsFlyer: Organization-wide setting only. One size fits all campaigns.
Branch: Requires SDK changes to modify windows.
Impact: You can optimize each campaign independently.
Granular Control (1 to 2,160 Hours)
LinkForty: Any value from 1 hour to 90 days (2,160 hours)
{
"attributionWindowHours": 127 // Exactly 127 hours
}
AppsFlyer: Fixed presets (1, 3, 7, 14, 30 days)
Adjust: Fixed presets only (1, 7, 30 days)
Impact: Match your window to customer behavior patterns, not platform limitations.
Platform Availability
LinkForty:
- Available on all tiers (Free, Pro, Self-hosted)
- Full control over attribution windows
- No restrictions or approvals needed
Other Platforms:
- Often limited to enterprise tiers
- May require account manager approval
- Typically organization-wide settings only
Choosing the Right Window
Campaign Type Matrix
| Campaign Type | Recommended Window | Reasoning |
|---|---|---|
| Flash Sales | 1-24 hours | Short decision cycle, immediate action |
| Direct Response Ads | 24-72 hours | Users install quickly or not at all |
| Product Launches | 7-14 days | Need time for awareness to build |
| Content Marketing | 7-30 days | Longer consideration, education needed |
| Referral Programs | 30-90 days | Friend recommendations take time |
| Brand Awareness | 14-30 days | Building familiarity over time |
| Retargeting | 14-30 days | Re-engaging previous visitors |
| Influencer Campaigns | 7-14 days | Audience acts within days |
| Email Campaigns | 3-7 days | Readers act within week |
| SMS/Push | 1-6 hours | Immediate channel |
| Print/QR Codes | 7-30 days | Offline-to-online delay |
Industry Benchmarks
| Industry | Typical Decision Cycle | Recommended Window |
|---|---|---|
| Food Delivery | Minutes to hours | 1-24 hours |
| E-commerce | Hours to days | 3-7 days |
| Finance Apps | Days to weeks | 7-30 days |
| Dating Apps | Hours to days | 24-72 hours |
| Productivity Tools | Days to weeks | 7-14 days |
| Games | Minutes to days | 24-72 hours |
| Health & Fitness | Days to weeks | 7-30 days |
| Real Estate | Weeks to months | 30-90 days |
| B2B SaaS | Weeks to months | 30-90 days |
| Travel | Days to weeks | 14-30 days |
Platform Behavior Patterns
iOS Users:
- Longer consideration time
- More research before install
- Recommended: +3-7 days vs Android
Android Users:
- Faster install decisions
- More impulsive downloads
- Recommended: Shorter windows
Example:
// iOS link
{
"title": "iOS Campaign",
"iosUrl": "https://apps.apple.com/app/id123",
"attributionWindowHours": 336 // 14 days
}
// Android link
{
"title": "Android Campaign",
"androidUrl": "https://play.google.com/store/apps/details?id=com.app",
"attributionWindowHours": 168 // 7 days
}
Setting Attribution Windows
Via Dashboard
Creating New Link:
- Click "Create Link"
- Fill in basic details
- Find "Attribution Window" dropdown
- Select from presets:
- 1 hour (privacy-focused)
- 24 hours (direct response)
- 72 hours (short campaigns)
- 168 hours (7 days) ← Default
- 336 hours (14 days)
- 720 hours (30 days)
- 2160 hours (90 days)
- Click "Create Link"
Editing Existing Link:
- Go to Links page
- Click link you want to edit
- Click "Edit" button
- Change "Attribution Window" value
- Click "Save"
Note: Changing attribution window applies to new clicks only. Existing fingerprints retain original window.
Via API
Creating Link with Custom Window:
curl -X POST https://api.linkforty.com/api/links \
-H "Authorization: Bearer $LINKFORTY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"templateId": "550e8400-e29b-41d4-a716-446655440000",
"originalUrl": "https://example.com/product",
"attributionWindowHours": 336
}'
Updating Window:
curl -X PUT https://api.linkforty.com/api/links/abc123 \
-H "Authorization: Bearer $LINKFORTY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"attributionWindowHours": 720
}'
Bulk Update:
curl -X POST https://api.linkforty.com/api/links/bulk-update \
-H "Authorization: Bearer $LINKFORTY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"linkIds": [
"link_abc123",
"link_def456",
"link_ghi789"
],
"updates": {
"attributionWindowHours": 168
}
}'
Via Link Templates
Set default windows for all links from a template:
curl -X POST https://api.linkforty.com/api/templates \
-H "Authorization: Bearer $LINKFORTY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Social Media Template",
"attributionWindowHours": 168,
"iosUrl": "https://apps.apple.com/app/id123",
"androidUrl": "https://play.google.com/store/apps/details?id=com.app"
}'
All links created from this template inherit 168-hour window (overridable).
Advanced Strategies
Dynamic Windows by Traffic Source
Different channels need different windows:
// Programmatic link creation
const ATTRIBUTION_WINDOWS = {
sms: 6, // 6 hours - immediate channel
push: 12, // 12 hours - notification urgency
email: 168, // 7 days - read at leisure
social: 168, // 7 days - discovery browsing
search: 72, // 3 days - high intent
display: 720, // 30 days - brand awareness
influencer: 336 // 14 days - trust building
};
function createCampaignLink(source, url) {
return fetch('https://api.linkforty.com/api/links', {
method: 'POST',
headers: {
'Authorization': `Bearer ${API_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
templateId: TEMPLATE_ID,
originalUrl: url,
attributionWindowHours: ATTRIBUTION_WINDOWS[source],
utmParameters: {
utm_source: source
}
})
});
}
A/B Testing Attribution Windows
Test different windows to optimize for your audience:
Test Setup:
// Variant A: Short window (high confidence)
{
"title": "Instagram Ad - Variant A",
"customCode": "insta-test-a",
"attributionWindowHours": 72,
"utmContent": "variant-a"
}
// Variant B: Long window (high volume)
{
"title": "Instagram Ad - Variant B",
"customCode": "insta-test-b",
"attributionWindowHours": 336,
"utmContent": "variant-b"
}
Analysis:
-- Compare conversion rates
SELECT
utm_content as variant,
COUNT(DISTINCT click_id) as clicks,
COUNT(DISTINCT CASE WHEN installed_at IS NOT NULL THEN user_id END) as installs,
ROUND(100.0 * COUNT(DISTINCT CASE WHEN installed_at IS NOT NULL THEN user_id END) /
COUNT(DISTINCT click_id), 2) as conversion_rate,
AVG(EXTRACT(EPOCH FROM (installed_at - clicked_at))/3600) as avg_time_to_install_hours
FROM click_events
WHERE utm_campaign = 'instagram-test'
GROUP BY utm_content;
Decision criteria:
- If similar conversion rates → Use shorter window (higher confidence)
- If significantly different → Use longer window (captures more value)
- Monitor
avg_time_to_install_hoursto set optimal window
Seasonal Adjustments
Adjust windows based on seasonality:
function getSeasonalWindow(baseWindow) {
const month = new Date().getMonth();
// Holiday shopping (Nov-Dec): Users delay installs, shopping around
if (month >= 10) {
return baseWindow * 1.5; // +50% longer
}
// Summer (Jun-Aug): Faster decisions, vacation browsing
if (month >= 5 && month <= 7) {
return baseWindow * 0.75; // -25% shorter
}
// Back to school (Aug-Sep): Research-heavy
if (month >= 7 && month <= 8) {
return baseWindow * 1.25; // +25% longer
}
return baseWindow;
}
// Use: getSeasonalWindow(168) → 252 hours in November
Fraud Prevention with Short Windows
Prevent attribution fraud with aggressive windows:
Problem: Malicious actors click links, install later, claim referral rewards
Solution: Short windows reduce fraud window
{
"title": "Referral Program Link",
"attributionWindowHours": 24, // Must install within 24h
"utmSource": "referral"
}
Additional protection:
- Require email verification before reward
- Check fingerprint quality score
- Validate IP address isn't VPN/proxy
- Monitor for suspicious patterns
Monitoring Attribution Performance
Dashboard Analytics
View attribution metrics:
- Go to Analytics → Links
- Select your link
- View "Attribution Performance" section:
- Total clicks
- Attributed installs
- Average time to install
- Attribution rate (% of clicks that install)
Time-to-install distribution:
| Time Range | Installs | Percentage |
|---|---|---|
| 0-1 hours | 45 | 15% |
| 1-24 hours | 90 | 30% |
| 1-3 days | 75 | 25% |
| 3-7 days | 60 | 20% |
| 7-14 days | 30 | 10% |
Insight: 70% install within 24 hours → Could reduce window from 14 days to 3 days without losing much volume.
API Analytics
curl https://api.linkforty.com/api/analytics/links/abc123 \
-H "Authorization: Bearer $LINKFORTY_API_KEY"
Response:
{
"linkId": "abc123",
"totalClicks": 1000,
"attributedInstalls": 350,
"attributionRate": 0.35,
"avgTimeToInstallHours": 42.5,
"timeToInstallDistribution": {
"0-1h": 150,
"1-24h": 100,
"1-3d": 60,
"3-7d": 30,
"7-14d": 10
},
"attributionWindowHours": 168
}
Optimization Recommendations
If avgTimeToInstallHours is much less than attributionWindowHours:
avg: 42 hours
window: 336 hours (14 days)
→ Recommendation: Reduce window to 72 hours (saves server resources)
If many installs near end of window:
7-14d range: 30% of installs
window: 336 hours (14 days)
→ Recommendation: Increase window to 720 hours (30 days) to capture more
Comparison with Competitors
| Feature | LinkForty | AppsFlyer | Branch | Adjust |
|---|---|---|---|---|
| Per-Link Windows | Free | Enterprise only | Paid plans | Org-level only |
| Granular Control | 1-2160 hours | Fixed presets | Fixed presets | Fixed presets |
| Tier Availability | All tiers | Enterprise | Paid | Enterprise |
| API Updates | Instant | Instant | Delayed | SDK required |
| Bulk Updates | Yes | Yes (Enterprise) | No | No |
| Historical Changes | Planned | Yes | Limited | Limited |
| Template Defaults | Yes | Yes (Enterprise) | No | No |
| Window Range | 1h - 90d | 1d - 30d | 1d - 30d | 1d - 30d |
Best Practices Summary
-
Start with 7 days (168 hours) - Industry standard, balanced approach
-
Match window to customer journey:
- Impulse purchases → 24-72 hours
- Considered purchases → 7-30 days
- Enterprise/B2B → 30-90 days
-
Monitor time-to-install metrics - Adjust windows based on actual behavior
-
Use shorter windows for:
- Fraud-prone campaigns (referrals)
- Immediate action campaigns (flash sales)
- Privacy-conscious users
-
Use longer windows for:
- Brand awareness campaigns
- Expensive products (high consideration)
- Referral programs (trust building)
-
Platform-specific windows:
- iOS: +3-7 days vs Android
- Web: Shorter (users use mobile more)
-
Test and optimize:
- A/B test different windows
- Analyze conversion rates vs confidence
- Adjust based on data, not assumptions
-
Template-based defaults:
- Create templates for common use cases
- Override for specific campaigns
Troubleshooting
Low Attribution Rates
Symptom: Very few installs attributed despite high click volume
Possible Causes:
-
Attribution window too short
- Solution: Increase window to 7-14 days
-
Users installing much later than expected
- Check analytics: "Time to Install Distribution"
- Increase window to cover 80% of installs
-
Fingerprint matching issues
- See Deferred Deep Linking for details on fingerprint matching
Over-Attribution
Symptom: Attribution rate >70% seems unrealistic
Possible Causes:
-
Attribution window too long
- Solution: Reduce window to increase confidence
-
Coincidental installs being attributed
- Users may have discovered app elsewhere
- Reduce window to 1-3 days for high-confidence only
Installs Not Being Attributed
Symptom: Users report installing from your link, but no attribution
Possible Causes:
-
Installed after attribution window expired
- Check
clicked_atvsinstalled_attimestamps - Increase window if pattern detected
- Check
-
SDK not initialized properly
-
Different device/network for click vs install
- Fingerprint won't match (expected behavior)
- Consider device ID matching (requires SDK)
Next Steps
- SDK Integration - Set up mobile SDK for attribution
- Deferred Deep Linking - How attribution works under the hood
- Analytics Dashboard - Monitor attribution performance
- Link Templates - Set default windows per template