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
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 | ✅ Audit log | ✅ 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
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
- 🎯 Fingerprint Matching - How attribution works under the hood
- 📊 Analytics Dashboard - Monitor attribution performance
- 📋 Link Templates - Set default windows per template