{"id":642,"date":"2026-03-31T13:00:00","date_gmt":"2026-03-31T18:00:00","guid":{"rendered":"https:\/\/tolinku.com\/blog\/?p=642"},"modified":"2026-03-07T03:33:10","modified_gmt":"2026-03-07T08:33:10","slug":"banner-targeting-by-device","status":"publish","type":"post","link":"https:\/\/tolinku.com\/blog\/banner-targeting-by-device\/","title":{"rendered":"Targeting Smart Banners by Device, OS, and Browser"},"content":{"rendered":"\n<p>A smart banner that ignores who is looking at it is leaving conversions on the table. An iPhone user does not have the same app store, the same browser behavior, or the same interaction patterns as an Android user. A first-time visitor needs different copy than someone who has visited your site ten times and still has not installed.<\/p>\n\n\n\n<p>Targeting bridges this gap. By defining rules that control who sees which banner, you increase relevance, reduce banner fatigue, and make better use of the impressions you get.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why Targeting Matters<\/h2>\n\n\n\n<p>Generic banners treat all mobile visitors as a single audience. The result is a banner that is mediocre for everyone: it uses App Store language on Android devices, shows &quot;Get the App&quot; to people who already have it, and runs on browsers that cannot actually support the deep link format you are using.<\/p>\n\n\n\n<p>Targeted banners fix each of these problems individually:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Show App Store links only on iOS; Google Play links only on Android<\/li>\n<li>Skip the banner entirely for users who have already clicked it three times without converting<\/li>\n<li>Show a different value proposition to users who arrived from paid search versus organic<\/li>\n<li>Stop showing the banner to users who opened the app last week (they already have it)<\/li>\n<\/ul>\n\n\n\n<p>Each targeting rule eliminates a wasted impression and replaces it with either no banner (preserving goodwill) or a more relevant banner (improving conversion).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Device Detection<\/h2>\n\n\n\n<p>The first targeting decision is whether to show the banner at all on a given device. The primary split is between mobile phones, tablets, and desktop.<\/p>\n\n\n\n<p>Most apps benefit from showing banners only on mobile phones. Tablet users have a larger screen and may prefer the web experience. Desktop users cannot use a phone app store link at all.<\/p>\n\n\n\n<p>The standard approach reads the <code>User-Agent<\/code> header server-side or the <code>navigator.userAgent<\/code> string client-side:<\/p>\n\n\n\n<pre><code class=\"language-javascript\">function getDeviceType() {\n  const ua = navigator.userAgent;\n  if (\/iPad\/i.test(ua)) return &#39;tablet&#39;;\n  if (\/iPhone|iPod|Android\/i.test(ua)) {\n    \/\/ Check for Android tablets (large screen devices)\n    if (\/Android\/i.test(ua) &amp;&amp; !\/Mobile\/i.test(ua)) return &#39;tablet&#39;;\n    return &#39;mobile&#39;;\n  }\n  return &#39;desktop&#39;;\n}\n<\/code><\/pre>\n\n\n\n<p>The Android tablet detection relies on the fact that Android phones include &quot;Mobile&quot; in their user agent string, while many Android tablets do not. This is not perfect (some Android tablets do include &quot;Mobile&quot;), but it covers the majority of cases.<\/p>\n\n\n\n<p>For server-side detection, libraries like <a href=\"https:\/\/github.com\/faisalman\/ua-parser-js\" rel=\"nofollow noopener\" target=\"_blank\">ua-parser-js<\/a> provide more reliable parsing with a maintained device database.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">OS Detection and Platform-Specific Banners<\/h2>\n\n\n\n<p><img decoding=\"async\" src=\"https:\/\/tolinku.com\/blog\/wp-content\/uploads\/2026\/03\/platform-platform-audiences.png\" alt=\"Tolinku audience segmentation for targeted banner delivery\"><\/p>\n\n\n\n<p>iOS and Android users need different banner configurations because:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>The app store links are different (itunes.apple.com vs. play.google.com or a universal link vs. an App Link)<\/li>\n<li>The app store names are different (&quot;App Store&quot; vs. &quot;Google Play&quot;)<\/li>\n<li>Deep link behavior differs: iOS uses Universal Links, Android uses App Links<\/li>\n<li>Some UI conventions differ (iOS users expect the banner at the top; Android users are more accustomed to bottom sheets)<\/li>\n<\/ol>\n\n\n\n<p>A targeting rule detects the OS and serves the appropriate configuration:<\/p>\n\n\n\n<pre><code class=\"language-javascript\">function getMobilePlatform() {\n  const ua = navigator.userAgent;\n  if (\/iPhone|iPad|iPod\/i.test(ua)) return &#39;ios&#39;;\n  if (\/Android\/i.test(ua)) return &#39;android&#39;;\n  return null;\n}\n\nconst platform = getMobilePlatform();\n\nif (platform === &#39;ios&#39;) {\n  \/\/ Show iOS-specific banner with App Store link\n  showBanner({\n    ctaText: &#39;Get it on the App Store&#39;,\n    storeLink: &#39;https:\/\/apps.apple.com\/app\/yourapp\/id123456789&#39;,\n    deepLinkScheme: &#39;yourapp:\/\/&#39;,\n  });\n} else if (platform === &#39;android&#39;) {\n  \/\/ Show Android-specific banner with Play Store link\n  showBanner({\n    ctaText: &#39;Get it on Google Play&#39;,\n    storeLink: &#39;https:\/\/play.google.com\/store\/apps\/details?id=com.yourapp&#39;,\n    deepLinkScheme: &#39;yourapp:\/\/&#39;,\n  });\n}\n<\/code><\/pre>\n\n\n\n<p><a href=\"https:\/\/developer.apple.com\/documentation\/xcode\/supporting-universal-links-in-your-app\" rel=\"nofollow noopener\" target=\"_blank\">Apple&#39;s Universal Links documentation<\/a> and <a href=\"https:\/\/developer.android.com\/training\/app-links\" rel=\"nofollow noopener\" target=\"_blank\">Google&#39;s App Links documentation<\/a> explain the technical requirements for each platform&#39;s deep linking system.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Browser Targeting<\/h2>\n\n\n\n<p>Not all mobile browsers handle deep links the same way. Safari on iOS handles Universal Links natively. Chrome on Android handles App Links via intent URLs. In-app browsers (Facebook, Instagram, TikTok, LinkedIn) often block deep link navigation entirely.<\/p>\n\n\n\n<p>Targeting by browser lets you:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Show a banner with Universal Link behavior to Safari users<\/li>\n<li>Show a banner with an intent URL to Chrome on Android<\/li>\n<li>Show a simplified banner (store link only, no deep link attempt) to in-app browser users<\/li>\n<\/ul>\n\n\n\n<p>Detecting the browser:<\/p>\n\n\n\n<pre><code class=\"language-javascript\">function getMobileBrowser() {\n  const ua = navigator.userAgent;\n\n  \/\/ In-app browsers\n  if (\/FBAN|FBAV\/i.test(ua)) return &#39;facebook&#39;;\n  if (\/Instagram\/i.test(ua)) return &#39;instagram&#39;;\n  if (\/TikTok\/i.test(ua)) return &#39;tiktok&#39;;\n  if (\/LinkedInApp\/i.test(ua)) return &#39;linkedin&#39;;\n\n  \/\/ System browsers\n  if (\/CriOS\/i.test(ua)) return &#39;chrome-ios&#39;;\n  if (\/FxiOS\/i.test(ua)) return &#39;firefox-ios&#39;;\n  if (\/Safari\/i.test(ua) &amp;&amp; \/Version\/i.test(ua)) return &#39;safari&#39;;\n  if (\/Chrome\/i.test(ua)) return &#39;chrome-android&#39;;\n\n  return &#39;other&#39;;\n}\n<\/code><\/pre>\n\n\n\n<p>For in-app browsers, deep links frequently fail because these browsers do not honor Universal Links or App Links. The safest fallback is to send users to the appropriate app store directly, skip the deep link attempt entirely, and adjust the banner copy to set expectations: &quot;Open in Safari to launch the app&quot; or just &quot;Download our app.&quot;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">OS Version Targeting<\/h2>\n\n\n\n<p>Some deep link behaviors changed between OS versions. For example:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Universal Links gained changes in iOS 13 and iOS 15 that affected how they behave after the user manually switches back to the browser<\/li>\n<li>Android App Links behavior has evolved across Android versions<\/li>\n<\/ul>\n\n\n\n<p>If your app requires a minimum OS version, exclude users on older versions from seeing a banner that would produce a broken experience. Show them a fallback message instead: &quot;Update your OS to use the app&quot; or simply do not show the banner.<\/p>\n\n\n\n<p>Detecting OS version from the user agent:<\/p>\n\n\n\n<pre><code class=\"language-javascript\">function getIOSVersion() {\n  const match = navigator.userAgent.match(\/OS (\\d+)_(\\d+)\/);\n  if (!match) return null;\n  return parseInt(match[1], 10);\n}\n\nconst iosVersion = getIOSVersion();\nif (iosVersion !== null &amp;&amp; iosVersion &lt; 15) {\n  \/\/ Show a simplified banner or skip it\n}\n<\/code><\/pre>\n\n\n\n<p><a href=\"https:\/\/tolinku.com\/docs\/user-guide\/smart-banners\/targeting-and-scheduling\/\">Tolinku&#39;s targeting rules<\/a> let you set OS version conditions without writing this detection logic manually.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">User Segment Targeting<\/h2>\n\n\n\n<p>Device and OS targeting handles the technical requirements. User segment targeting handles the messaging strategy.<\/p>\n\n\n\n<p>Common segment rules:<\/p>\n\n\n\n<p><strong>New vs. returning visitors<\/strong>\nA visitor on their first session sees &quot;Discover what the app can do.&quot; A visitor on their fifth session, who clearly has some interest but has not installed, sees &quot;Still browsing? The app has features the site doesn&#39;t.&quot;<\/p>\n\n\n\n<p><strong>Source channel<\/strong>\nUsers arriving from a paid campaign with a specific discount code should see a banner that references that discount: &quot;Use your 20% off code in the app.&quot; Users from organic search need a more general value proposition.<\/p>\n\n\n\n<p><strong>Page context<\/strong>\nA user reading a product page should see a banner about completing the purchase in the app. A user reading a support article should see a banner about getting faster help through the app&#39;s chat feature.<\/p>\n\n\n\n<p><strong>Existing app users<\/strong>\nUsers who have already installed the app should not see an &quot;install&quot; banner. Instead, show them an &quot;open in app&quot; banner, or no banner at all. Tracking this requires a signal from the app (a cookie set on first launch, for example) that the web page can read.<\/p>\n\n\n\n<p>The <a href=\"https:\/\/tolinku.com\/docs\/user-guide\/audiences\/\">Tolinku audiences feature<\/a> lets you build reusable audience definitions that feed into your banner targeting rules, so you define a segment once and apply it across multiple banners.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Scheduling: Time-Based Targeting<\/h2>\n\n\n\n<p>Targeting does not only mean &quot;who.&quot; It also means &quot;when.&quot;<\/p>\n\n\n\n<p>Some scheduling rules that work well:<\/p>\n\n\n\n<p><strong>Time of day:<\/strong> A food delivery app might show a &quot;Order dinner in the app&quot; banner between 4pm and 9pm, and a &quot;Plan your lunch&quot; banner between 10am and 1pm.<\/p>\n\n\n\n<p><strong>Day of week:<\/strong> A retail app might increase banner aggressiveness on Friday and Saturday, when purchase intent is higher for many categories.<\/p>\n\n\n\n<p><strong>Post-event:<\/strong> After a user completes a purchase on the web, show a banner that invites them to track their order in the app. This is a high-intent moment.<\/p>\n\n\n\n<p><strong>Campaign windows:<\/strong> Show a specific banner only during a sale period. Schedule it to start and end at exact times so you do not have to manually disable it.<\/p>\n\n\n\n<p>The <a href=\"https:\/\/tolinku.com\/docs\/user-guide\/smart-banners\/targeting-and-scheduling\/\">Tolinku targeting and scheduling documentation<\/a> covers the full scheduling rule syntax, including relative time rules (e.g., &quot;show this banner for 48 hours after user registration&quot;).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Combining Rules<\/h2>\n\n\n\n<p><img decoding=\"async\" src=\"https:\/\/tolinku.com\/blog\/wp-content\/uploads\/2026\/03\/platform-platform-banners.png\" alt=\"Tolinku smart banner configuration in the dashboard\"><\/p>\n\n\n\n<p>Targeting rules compound. A well-configured banner might have rules that say:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Show only on iOS devices, Safari browser, version 15 or higher<\/li>\n<li>Only to users who have not installed the app (no install cookie present)<\/li>\n<li>Only on product and category pages (not on checkout or confirmation pages)<\/li>\n<li>Only between 7am and 11pm in the user&#39;s local timezone<\/li>\n<li>With copy personalized to the page category (pulled from a page-level data attribute)<\/li>\n<\/ul>\n\n\n\n<p>None of these rules individually requires complex engineering. Together, they produce a banner experience that feels relevant to each user, which is the core driver of higher click-through and install rates.<\/p>\n\n\n\n<p>The <a href=\"https:\/\/tolinku.com\/docs\/user-guide\/smart-banners\/\">Tolinku smart banners overview<\/a> and <a href=\"https:\/\/tolinku.com\/features\/smart-banners\">features page<\/a> cover how to configure combined targeting rules through the dashboard UI, which lets non-engineers update targeting rules without a code deploy.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Showing the same banner to every mobile visitor wastes impressions. Device, OS, and browser targeting lets you show the right message to the right user at the right moment, which means fewer annoyed users and more installs.<\/p>\n","protected":false},"author":2,"featured_media":641,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"rank_math_title":"Targeting Smart Banners by Device, OS, and Browser","rank_math_description":"Learn how to target smart banners by device type, iOS vs Android, browser, and user segments. Includes scheduling rules and Tolinku audience configuration.","rank_math_focus_keyword":"banner targeting","rank_math_canonical_url":"","rank_math_facebook_title":"","rank_math_facebook_description":"","rank_math_facebook_image":"https:\/\/tolinku.com\/blog\/wp-content\/uploads\/2026\/03\/og-banner-targeting-by-device.png","rank_math_facebook_image_id":"","rank_math_twitter_title":"","rank_math_twitter_description":"","rank_math_twitter_image":"https:\/\/tolinku.com\/blog\/wp-content\/uploads\/2026\/03\/og-banner-targeting-by-device.png","footnotes":""},"categories":[16],"tags":[25,24,29,43,40,133],"class_list":["post-642","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-marketing","tag-android","tag-ios","tag-mobile-marketing","tag-personalization","tag-smart-banners","tag-targeting"],"_links":{"self":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/642","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/comments?post=642"}],"version-history":[{"count":1,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/642\/revisions"}],"predecessor-version":[{"id":643,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/642\/revisions\/643"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/media\/641"}],"wp:attachment":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/media?parent=642"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/categories?post=642"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/tags?post=642"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}