Skip to content
Tolinku
Tolinku
Sign In Start Free
Use Cases · · 5 min read

Onboarding Deep Link Parameters: What Data to Pass

By Tolinku Staff
|
Tolinku e commerce deep linking dashboard screenshot for use cases blog posts

Deep links that drive app installs carry parameters through the install process via deferred deep linking. These parameters determine what the user sees during onboarding, which steps they skip, and what context personalizes their experience. Choosing the right parameters is the difference between a personalized onboarding and a generic one.

For personalization strategies, see Personalized Onboarding Flows with Deep Link Data. For invite-specific flows, see Invite Link Onboarding: From Invitation to Active User. For a broader guide to deep link parameter design, see Deep Link Parameters: A Complete Guide.

Parameter Categories

1. Attribution Parameters

These identify where the user came from:

Parameter Example Value Purpose
utm_source instagram, google, newsletter Traffic source
utm_medium social, cpc, email Marketing channel
utm_campaign summer_sale_2026 Campaign name
utm_content hero_banner_v2 Creative variant
utm_term running+shoes Search keyword
https://go.yourapp.com/signup?utm_source=instagram&utm_medium=social&utm_campaign=summer_sale

These parameters don't directly affect onboarding screens, but they're essential for measuring which acquisition channels produce the most engaged users.

2. Referral Parameters

These connect the new user to an existing user:

Parameter Example Value Purpose
ref user_abc123 Referrer's user ID
referrer_name Sarah Referrer's display name
referral_code SARAH-2026 Human-readable referral code
reward 10 Reward amount
reward_type credit Reward type (credit, discount, etc.)
https://go.yourapp.com/refer/SARAH-2026?ref=user_abc123&referrer_name=Sarah&reward=10

3. Content Parameters

These point to specific content the user was interested in:

Parameter Example Value Purpose
product_id prod_xyz789 Specific product
category running Product category
content_id article_456 Specific article or content piece
content_type playlist Type of content
collection_id coll_abc Collection or list
https://go.yourapp.com/product/prod_xyz789?category=running

4. Promotional Parameters

These carry offer and discount information:

Parameter Example Value Purpose
promo SUMMER50 Promo code
discount 20 Discount percentage
offer_id offer_123 Server-side offer reference
trial_days 14 Extended trial period
plan premium Pre-selected plan
https://go.yourapp.com/signup?promo=SUMMER50&discount=20&plan=premium

5. Context Parameters

These provide situational context:

Parameter Example Value Purpose
role seller, buyer User type for marketplace apps
team_id team_abc Team to join
event_id evt_123 Event context
partner shopify Partner integration source
locale es_MX Preferred language
source_screen pricing_page Where on your website they clicked
https://go.yourapp.com/join?team_id=team_abc&role=member&partner=slack

What NOT to Put in Parameters

Never Include

Data Why Not Alternative
Email addresses PII in URLs, logged everywhere Use a session token
Passwords Security risk Never pass credentials in URLs
SSNs, account numbers Regulatory violation Use encrypted server-side lookup
Full names PII concerns Use first name only or referral code
Phone numbers PII, regulatory Use a session token
Payment info PCI compliance violation Never expose in URLs

Use Tokens Instead

For sensitive data, use an opaque token that maps to server-side data:

// Bad
const link = `https://go.yourapp.com/[email protected]&name=Jane+Smith`;

// Good
const sessionToken = await createPreSignupSession({
  email: '[email protected]',
  name: 'Jane Smith',
  preferences: { category: 'fitness' },
});

const link = `https://go.yourapp.com/signup?session=${sessionToken}`;

The app fetches the pre-filled data from your server using the token, keeping PII out of the URL.

Parameter Design Rules

1. Keep Parameter Names Short and Consistent

// Good: short, consistent naming
const params = {
  ref: 'user_abc',      // referrer
  src: 'instagram',      // source (alias for utm_source)
  cat: 'running',        // category
  pid: 'prod_xyz',       // product ID
  promo: 'SUMMER50',     // promo code
};

// Bad: verbose, inconsistent
const params = {
  referrer_user_id: 'user_abc',
  trafficSource: 'instagram',
  product_category: 'running',
  productId: 'prod_xyz',
  promotional_code: 'SUMMER50',
};

Short parameter names reduce URL length (important for SMS and social sharing where character limits exist).

2. Use IDs, Not Names

// Good: IDs are stable
const link = `https://go.yourapp.com/refer?ref=user_abc123`;

// Bad: names can change and have encoding issues
const link = `https://go.yourapp.com/refer?referrer_name=María%20García`;

Look up names server-side using the ID.

3. Validate All Parameters on Receipt

async function processDeepLinkParams(params) {
  const validated = {};

  // Validate referrer exists
  if (params.ref) {
    const referrer = await getUser(params.ref);
    if (referrer) {
      validated.referrer = referrer;
    }
  }

  // Validate product exists
  if (params.pid) {
    const product = await getProduct(params.pid);
    if (product && product.isActive) {
      validated.product = product;
    }
  }

  // Validate promo code
  if (params.promo) {
    const promo = await validatePromoCode(params.promo);
    if (promo && promo.isActive) {
      validated.promo = promo;
    }
  }

  // Sanitize string params
  if (params.referrer_name) {
    validated.referrerName = sanitize(params.referrer_name);
  }

  return validated;
}

4. Set Defaults for Missing Parameters

function getOnboardingConfig(params) {
  return {
    source: params.utm_source || 'organic',
    campaign: params.utm_campaign || null,
    referrer: params.ref || null,
    product: params.pid || null,
    promoCode: params.promo || null,
    role: params.role || 'buyer', // Default role
    locale: params.locale || getDeviceLocale(),
    flow: params.ref ? 'referral' : params.pid ? 'product' : 'default',
  };
}

Parameter Combinations

const linkTemplates = {
  referral: {
    path: '/refer/{code}',
    requiredParams: ['ref', 'referrer_name'],
    optionalParams: ['reward', 'reward_type'],
    example: '/refer/SARAH-2026?ref=user_abc&referrer_name=Sarah&reward=10',
  },

  productAd: {
    path: '/product/{id}',
    requiredParams: ['utm_source', 'utm_campaign'],
    optionalParams: ['promo', 'category'],
    example: '/product/prod_xyz?utm_source=facebook&utm_campaign=summer_sale&promo=SUMMER50',
  },

  teamInvite: {
    path: '/join/{team_id}',
    requiredParams: ['team_id', 'role'],
    optionalParams: ['inviter_name', 'inviter_id'],
    example: '/join/team_abc?role=member&inviter_name=Alex',
  },

  contentShare: {
    path: '/share/{type}/{id}',
    requiredParams: ['content_type', 'content_id'],
    optionalParams: ['sharer_name', 'ref'],
    example: '/share/playlist/pl_123?sharer_name=Mike&ref=user_def',
  },
};

How Parameters Map to Onboarding Steps

For a complete guide to using these parameters for contextual routing, see Contextual Deep Linking Guide.

Parameters Present Onboarding Effect
ref + referrer_name Show referral welcome, acknowledge referrer
pid + category Skip category selection, show product first
promo + discount Show promo banner, pre-apply discount
team_id + role Skip role selection, auto-join team
utm_source=ad + utm_campaign Show campaign-specific landing
None (organic) Full standard onboarding

Debugging Parameters

Logging

Log parameters on receipt for debugging (but sanitize sensitive data):

function logDeepLinkParams(params) {
  const sanitized = { ...params };

  // Mask any potential PII
  if (sanitized.email) sanitized.email = '***@***.***';
  if (sanitized.session) sanitized.session = sanitized.session.slice(0, 8) + '...';

  console.log('Deep link params received:', sanitized);

  analytics.track('deep_link_params_received', {
    paramCount: Object.keys(params).length,
    hasReferral: params.ref ? true : false,
    hasProduct: params.pid ? true : false,
    hasPromo: params.promo ? true : false,
    source: params.utm_source || 'none',
  });
}

Testing Parameter Flows

Create test links with different parameter combinations and verify each onboarding path:

const testLinks = [
  { name: 'Referral', url: 'https://go.yourapp.com/refer/TEST?ref=test_user&referrer_name=Test' },
  { name: 'Product', url: 'https://go.yourapp.com/product/test_prod?category=test' },
  { name: 'Campaign', url: 'https://go.yourapp.com/signup?utm_source=test&utm_campaign=test_campaign' },
  { name: 'Team invite', url: 'https://go.yourapp.com/join/test_team?role=member' },
  { name: 'Organic', url: 'https://go.yourapp.com/' },
];

For dynamic routes, see the dynamic routes documentation. For deep linking features, see Tolinku deep linking. For onboarding use cases, see the onboarding documentation.

Get deep linking tips in your inbox

One email per week. No spam.

Ready to add deep linking to your app?

Set up Universal Links, App Links, deferred deep linking, and analytics in minutes. Free to start.