// 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
OB Banner.jpg

CREATING COMMUNITY

CONTENT

THROUGH

OwnersBox Video Examples 1
OwnersBox Video Examples 2
OwnersBox Content Team
Skippers Logo

FANTASY BASEBALL PODCAST

SKIPPERS

Skippers is the OwnersBox baseball content brand. Tune in weekly to hear our experts give out advice to help you become the best fantasy baseball player!

Black-Background-2.jpg

CHECK OUT OUR

LATEST VIDEOS

How can the leafs fix their early season mishaps? #leafs #nhl #nhlhockey
00:56
NBA picks for the Monday slate #nba #nbapicks #nbaprops
00:49
Can Matt Stanford win NFL MVP this season? #nfl #nflmvp #nflfootball #rams #larams
00:30
WEEK 8 OF THE NFL SGP+ CHALLENGE! #nfl #nflfootball
00:56
Can you name the 2 South African-born NHL Players? #nhl #nhlhockey #nhltrivia #hockey
00:55
Babs is back with his favorite Fantasy Football plays for NFL week 8!
01:01
Can We Guess MLB Cities?
27:50
Ranking Every NHL Team 3 Weeks Into the 2025-26 Season
21:34
TikTok Screenshot Left
TikTok Screenshot Right
TikTok Icon

@OWNERSBOX

The OwnersBox TikTok is the #1 destination for short-form sports content! New content is posted daily and will keep you up to date on all the top stories and trends in the sports world.

Join The Community

ENGAGE WITH US

We offer exclusive promotions, along with other community-involved events, exclusively on Discord. Come & join 1000+ members and chat with us today!

Discord Icon
DFS UI Laptop
DFS UI Phone
bottom of page