// Velo code (Wix Studio) // IDs used below: // Desktop button: #ctaDesktop // Mobile button: #ctaMobile // Username labels: #usernameText (desktop), #usernameTextm (mobile) // Feel free to rename; just keep them consistent here. import wixLocation from 'wix-location'; import wixWindow from 'wix-window'; $w.onReady(function () { const q = wixLocation.query || {}; // Normalize query values (support both r and R, and username aliases if you ever change) const ref = (q.r || q.R || '').toString().trim(); const username = (q.username || q.user || '').toString().trim(); console.log("r = " + ref); console.log("username = " + username); // --- Utilities ------------------------------------------------------------- // Safe element getter (won't throw if element ID not on the page) const maybe = (id) => { try { return $w(id); } catch (e) { return null; } }; // Merge params into a base URL (keeps existing query if present) const buildUrl = (base, params = {}) => { // Handle relative bases (rare here, but safe) const u = base.startsWith('http') ? new URL(base) : new URL(base, 'https://dummy.local'); Object.entries(params).forEach(([k, v]) => { if (v !== undefined && v !== null && v !== '') u.searchParams.set(k, v); }); const out = u.toString(); // Strip dummy origin if we used one return base.startsWith('http') ? out : out.replace('https://dummy.local', ''); }; // Collect & pass through any optional trackers you care about const collectOptional = (keys) => { const obj = {}; keys.forEach((k) => { if (q[k]) obj[k] = q[k]; }); return obj; }; // --- Visual username fill (optional) -------------------------------------- // If you show the username on page, populate either/both text elements if present const usernameTargets = ['#usernameText', '#usernameTextm'] .map(maybe) .filter(Boolean); usernameTargets.forEach(el => { if (username) el.text = username; }); // --- DESTINATIONS ---------------------------------------------------------- // Change these two bases only: const WEB_SIGNUP_BASE = 'https://app.ownersbox.com/wfs/signup'; // desktop web signup page const ONELINK_BASE = 'https://ownersbox.onelink.me/1fLb/rirl6tr4'; // replace XXXX/landing with your real OneLink path // (A) DESKTOP BUTTON: add ?r= to the web signup URL const desktopBtn = maybe('#ctaDesktop'); if (desktopBtn) { const desktopParams = ref ? { r: ref } : {}; // If you also want to propagate other trackers on web: Object.assign(desktopParams, collectOptional(['btag','mbsy','utm_source','utm_medium','utm_campaign'])); const desktopUrl = buildUrl(WEB_SIGNUP_BASE, desktopParams); // Either set the .link or force navigation on click; using .link lets it behave like a normal anchor. desktopBtn.link = desktopUrl; // Optional: ensure most up-to-date link at click time (helpful if you later add dynamic changes) desktopBtn.onClick(() => wixLocation.to(desktopBtn.link)); } // (B) MOBILE BUTTON via AppsFlyer OneLink: // Goal: maintain attribution through install and still deliver `r` into the app and web fallback. // Best practice: // - Put `r` as a regular param AND in af_sub1 (passthrough). // - Put `r` inside your deep link (af_dp) so the app gets it on open. // - Provide af_ios_url / af_android_url fallbacks WITH ?r for users who don’t have the app. // - Keep your deep_link_value consistent with the app routing (“signup” here). const mobileBtn = maybe('#ctaMobile'); if (mobileBtn) { const baseWebWithRef = buildUrl(WEB_SIGNUP_BASE, ref ? { r: ref } : {}); const mobileParams = { // Custom + passthrough values: ...(ref ? { r: ref, af_sub1: ref } : {}), // App deep link (your app must route this; example scheme below) ...(ref ? { af_dp: `ownersbox://signup?r=ref` } : {}), // Deep link routing hint (depends on your app’s logic) deep_link_value: 'signup', // Attribution & fallback safety: af_ios_url: baseWebWithRef, af_android_url: baseWebWithRef, // Optional settings you might already use: // af_xp: 'custom', // pid, c, af_channel, af_ad, etc. can live in your OneLink template, or pass them from q if present. ...collectOptional(['pid','c','af_channel','af_ad','btag','mbsy','utm_source','utm_medium','utm_campaign']) }; const oneLinkUrl = buildUrl(ONELINK_BASE, mobileParams); // As above, set .link and also navigate on click for freshness mobileBtn.link = oneLinkUrl; mobileBtn.onClick(() => wixLocation.to(mobileBtn.link)); } // Optional: Choose which button to show based on form factor. // If you keep both on the page, you can auto-hide the "other" one: const isMobile = wixWindow.formFactor === 'Mobile'; if (desktopBtn) desktopBtn.hidden = isMobile; if (mobileBtn) mobileBtn.hidden = !isMobile; });
top of page
bottom of page