Maximize your marketing ROI with deep linking campaigns that provide seamless user experiences and detailed attribution tracking. Learn how to create, track, and optimize marketing campaigns that drive real results.
Traditional marketing campaigns often lose users in the transition from ad click to app install. Deep linking bridges this gap, providing seamless experiences that maintain context and drive higher conversion rates. With proper attribution tracking, you can measure the true ROI of your marketing efforts.
Create targeted campaigns for Facebook, Instagram, Twitter, TikTok, and other social platforms:
Design email campaigns that drive app installs and engagement:
Collaborate with influencers to reach new audiences:
Create campaign-specific links with detailed tracking parameters:
app.post('/api/create-campaign-link', async (req, res) => {
try {
const {
campaignName,
targetUrl,
source,
medium,
content,
term,
metadata = {}
} = req.body;
// 1. Generate unique campaign slug
const campaignSlug = generateCampaignSlug(campaignName);
// 2. Create campaign link with UTM parameters
const campaignLink = await createCampaignLink({
slug: campaignSlug,
target: targetUrl,
metadata: {
campaign: campaignName,
source: source,
medium: medium,
content: content,
term: term,
...metadata
}
});
// 3. Store campaign in database
await storeCampaign({
name: campaignName,
slug: campaignSlug,
link: campaignLink,
source: source,
medium: medium,
status: 'active',
created_at: new Date()
});
res.json({
success: true,
campaignLink: campaignLink,
campaignId: campaignSlug,
trackingUrl: `${campaignLink}?utm_source=${source}&utm_medium=${medium}&utm_campaign=${campaignName}`
});
} catch (error) {
console.error('Campaign creation error:', error);
res.status(500).json({ error: 'Failed to create campaign' });
}
});
async function createCampaignLink({ slug, target, metadata }) {
try {
const response = await redirectly.post('/links', {
slug: slug,
target: target,
metadata: metadata
});
return response.data.url;
} catch (error) {
console.error('Failed to create campaign link:', error);
throw new Error('Failed to create campaign link');
}
}
function generateCampaignSlug(campaignName) {
const timestamp = Date.now();
const cleanName = campaignName.toLowerCase()
.replace(/[^a-z0-9]/g, '-')
.replace(/-+/g, '-')
.replace(/^-|-$/g, '');
return `${cleanName}-${timestamp}`;
}Track campaign performance in your Flutter app:
class CampaignTrackingService {
static final FlutterRedirectly _redirectly = FlutterRedirectly();
static Future<void> initialize() async {
await _redirectly.initialize(RedirectlyConfig(
apiKey: 'YOUR_API_KEY',
baseUrl: 'https://redirectly.app',
enableDebugLogging: true,
));
// Listen for campaign link clicks
_redirectly.onLinkClick.listen(_handleCampaignClick);
// Listen for app installs from campaigns
_redirectly.onAppInstalled.listen(_handleCampaignInstall);
}
static void _handleCampaignClick(LinkClickEvent event) {
if (event.error != null) return;
final uri = Uri.parse(event.originalUrl);
final campaignData = _extractCampaignData(uri);
if (campaignData != null) {
// Store campaign attribution
_storeCampaignAttribution(campaignData);
// Track campaign click
_trackCampaignEvent('click', campaignData);
}
}
static void _handleCampaignInstall(AppInstallEvent event) {
if (event.matched && event.link != null) {
final campaignData = _extractCampaignDataFromLink(event.link!);
if (campaignData != null) {
// Track successful campaign conversion
_trackCampaignEvent('install', campaignData);
// Show campaign-specific onboarding
_showCampaignOnboarding(campaignData);
}
}
}
static Map<String, String>? _extractCampaignData(Uri uri) {
final utmSource = uri.queryParameters['utm_source'];
final utmMedium = uri.queryParameters['utm_medium'];
final utmCampaign = uri.queryParameters['utm_campaign'];
final utmContent = uri.queryParameters['utm_content'];
final utmTerm = uri.queryParameters['utm_term'];
if (utmSource != null && utmMedium != null && utmCampaign != null) {
return {
'source': utmSource,
'medium': utmMedium,
'campaign': utmCampaign,
'content': utmContent ?? '',
'term': utmTerm ?? '',
'timestamp': DateTime.now().toIso8601String(),
};
}
return null;
}
static Future<void> _trackCampaignEvent(String eventType, Map<String, String> campaignData) async {
try {
await http.post(
Uri.parse('${ApiConfig.baseUrl}/api/track-campaign-event'),
headers: {'Content-Type': 'application/json'},
body: jsonEncode({
'eventType': eventType,
'campaignData': campaignData,
'deviceInfo': await _getDeviceInfo(),
}),
);
} catch (e) {
print('Campaign tracking error: $e');
}
}
static void _showCampaignOnboarding(Map<String, String> campaignData) {
// Show campaign-specific welcome message
final campaignName = campaignData['campaign'] ?? 'Unknown Campaign';
Get.snackbar(
'Welcome!',
'Thanks for joining from our $campaignName campaign!',
backgroundColor: Colors.blue,
colorText: Colors.white,
duration: Duration(seconds: 5),
);
// Navigate to campaign-specific onboarding flow
Get.toNamed('/onboarding', arguments: {
'campaign': campaignData,
'source': 'campaign'
});
}
}Create comprehensive campaign analytics:
app.get('/api/campaign-analytics', async (req, res) => {
try {
const {
campaignId,
timeRange = '30d',
source,
medium
} = req.query;
const analytics = await getCampaignAnalytics({
campaignId,
timeRange,
source,
medium
});
res.json({
success: true,
analytics: {
overview: analytics.overview,
performance: analytics.performance,
sources: analytics.sources,
devices: analytics.devices,
geographic: analytics.geographic,
trends: analytics.trends
}
});
} catch (error) {
console.error('Campaign analytics error:', error);
res.status(500).json({ error: 'Failed to fetch analytics' });
}
});
async function getCampaignAnalytics({ campaignId, timeRange, source, medium }) {
const startDate = getStartDate(timeRange);
const filters = buildFilters({ campaignId, source, medium, startDate });
const [
clicks,
installs,
conversions,
revenue,
sources,
devices,
geographic
] = await Promise.all([
getCampaignClicks(filters),
getCampaignInstalls(filters),
getCampaignConversions(filters),
getCampaignRevenue(filters),
getSourceBreakdown(filters),
getDeviceBreakdown(filters),
getGeographicBreakdown(filters)
]);
return {
overview: {
totalClicks: clicks.total,
totalInstalls: installs.total,
conversionRate: clicks.total > 0 ? (installs.total / clicks.total) * 100 : 0,
totalRevenue: revenue.total,
roas: revenue.total / (clicks.total * 0.5), // Assuming $0.50 per click
cpa: installs.total > 0 ? (clicks.total * 0.5) / installs.total : 0
},
performance: {
dailyClicks: clicks.daily,
dailyInstalls: installs.daily,
dailyRevenue: revenue.daily
},
sources: sources,
devices: devices,
geographic: geographic,
trends: {
clickTrend: calculateTrend(clicks.daily),
installTrend: calculateTrend(installs.daily),
revenueTrend: calculateTrend(revenue.daily)
}
};
}You now have a complete marketing campaign system with deep linking, comprehensive tracking, and optimization tools. This setup will help you maximize your marketing ROI and drive meaningful user acquisition.