From f5fb195927201e48f7ff1a0109bb94e935ffa3a1 Mon Sep 17 00:00:00 2001 From: martbost Date: Thu, 10 Sep 2026 15:30:10 -0500 Subject: [PATCH] Promo tools: 'Your links' block with the invite link + five angle links (who each is for, copy, share) Co-Authored-By: Claude Fable 5.1 --- chatbot.js | 3 ++- public/assets/promo.js | 32 ++++++++++++++++++++++++++++++++ public/assets/site.css | 10 ++++++++++ public/my.html | 15 ++++++++++----- 4 files changed, 54 insertions(+), 6 deletions(-) diff --git a/chatbot.js b/chatbot.js index b62c2a7..648d32f 100644 --- a/chatbot.js +++ b/chatbot.js @@ -34,7 +34,7 @@ const CANNED = [ { re: /(need (a )?wallet|crypto experience|metamask|how (do i|to) join|sign ?up|register)/i, a: 'Join free with just your email at https://instantadpay.com/my, no wallet and no password needed. Your wallet only comes out when you buy a package or switch on payouts, and the site walks you through it.' }, { re: /(referral link|invite link|share link|refer)/i, - a: 'You get your share link the moment you sign in, free members included. One tip: switch on payouts (one free wallet step in Members) before your people start buying, because the contract locks each buyer to their sponsor at their first purchase.' }, + a: 'You get your share link the moment you sign in, free members included. Open Members > Promo tools: the "Your links" block at the top lists your invite link plus five angle versions (Instant, Ad spend, Free, Ledger, Two), each with a note on who it is for and Copy and Share buttons. They are the same link with a code on the end, so every join and purchase credits you; only the first page the person sees changes. One tip: switch on payouts (one free wallet step in Members) before your people start buying, because the contract locks each buyer to their sponsor at their first purchase.' }, { re: /(promo tools?|social posts?|email swipes?|banners?|text a friend|objection|share buttons?)/i, a: 'Promo tools (Members > Promo tools) has pill menus for each kit: Social posts (X, Facebook, LinkedIn, Telegram or WhatsApp, with post and share buttons), Text a friend (SMS-sized messages with Text it, WhatsApp, Telegram and Copy), Email swipes (short, standard, long, follow-up), Banners (every standard ad size plus square, story and Telegram sizes, download or copy URL), your Banner wall link, and an Objection handling bank with the truth plus a ready-to-send reply. Everything is personalized with your invite link.' }, { re: /(drain (my|your) wallet|stop and go back|trust wallet.*(warn|block|red)|wallet (warning|blocked))/i, @@ -63,6 +63,7 @@ function systemPrompt() { FACTS: - Free to join with email only (6-digit code sign-in, no passwords). Wallet appears only at purchase or payout activation. Every new member gets a small welcome batch of ad credits — unlocked by the WELCOME TOUR on first sign-in: they visit their upline's line-banner sites (up to 3, 10 seconds each — the same 3 levels the contract pays), then claim the credits. Members with no upline banners get the credits instantly. +- YOUR LINKS (top of Members > Promo tools): the plain invite link plus five angle links (?v=instant paid-in-seconds, ?v=adspend you-buy-ads-anyway, ?v=free costs-nothing-to-try, ?v=ledger no-back-office, ?v=two two-buyers-open-level-two), each with a who-it-is-for note, Copy and Share. Same credit either way; only the first page differs. Link stats (Coaching pane) shows views/joins/buyers per angle. - PROMO TOOLS (Members > Promo tools, pill menu): Social posts for X/Facebook/LinkedIn/Telegram-WhatsApp with post/share buttons; Text a friend (5 SMS-sized messages with Text it / WhatsApp / Telegram / Copy); Email swipes (short, standard, long, follow-up); Banners in every standard ad size plus 1080x1080, 1080x1920 and 1280x720 (download or copy URL); the member's Banner wall link; an Objection handling bank (truth + ready-to-send reply); a Videos tab (hook videos in production). Every piece carries the member's invite link; angle links add ?v=instant|adspend|free|ledger. Members who want copy in their own voice can use mybrandedvoice.com. - INVITE PAGES: a member's link instantadpay.com/join/ opens a lead-capture page (email first, wallet later); add ?v=instant|adspend|free|ledger|two for an angle-matched headline. New free members get a short getting-started email series over the first week (unsubscribe link in every email; the admin edits the sequence in /admin > Settings). - WALLET DRAIN WARNING: Trust Wallet hard-blocks any purchase that spends most of the wallet's POL ("this transaction will drain your wallet", only "Stop and go back"). It is a balance-proportion heuristic, not a contract issue (there are no token approvals; a buy is one native-POL payable call). Advice: smaller package first, or add POL so the buy is well under half the balance, or use MetaMask/Phantom/SafePal (no hard block). The dashboard warns Trust Wallet users before sending when a buy would use more than ~55% of the balance; other wallets are not prompted. After a blocked attempt the WalletConnect session may be dead: Wallet tab > Disconnect > Connect again. diff --git a/public/assets/promo.js b/public/assets/promo.js index a4aa4d9..cae57c2 100644 --- a/public/assets/promo.js +++ b/public/assets/promo.js @@ -90,6 +90,15 @@ window.IAPPromo = (function () { { angle: 'ledger', title: 'No back office. No payday.', hook: 'Your last affiliate program paid you on the fifteenth. If it paid you.', caption: 'Your last affiliate program paid you on the fifteenth. If it paid you. Here the payroll is the blockchain: every payout is a public transaction, nothing is held, nobody can change the split. Open the ledger, then join free: {{LINK:ledger}}' }, { angle: 'two', title: 'Two buyers open level two', hook: 'Two buyers. Then five. That is the whole ladder.', caption: 'Two buyers. Then five. That is the whole ladder. Level 1 pays from your first buyer, two qualifying buyers open level 2, five open level 3, all in the same transaction, straight to your wallet. Free to join: {{LINK:two}}' } ]; + // the six front doors: the plain invite link plus one page per hook angle + const ANGLES = [ + { angle: '', name: 'General', hook: 'The whole picture', use: 'What InstantAdPay is, the payment split, join free. Use it when you have not said anything specific yet.' }, + { angle: 'instant', name: 'Instant', hook: 'Paid before the page reloads', use: 'For anyone burned by pending commissions. The page opens on the on-chain payout that lands in seconds.' }, + { angle: 'adspend', name: 'Ad spend', hook: 'You buy ads anyway', use: 'For marketers who already pay for traffic. Frames it as advertising that also pays your line when they buy.' }, + { angle: 'free', name: 'Free', hook: 'Costs nothing to try', use: 'For skeptics and beginners. Join free, earn credits by viewing, run a first campaign without spending.' }, + { angle: 'ledger', name: 'Ledger', hook: 'No back office, no payday', use: 'For people who have waited on a payout. Every payment is public on Polygonscan and nothing is ever held.' }, + { angle: 'two', name: 'Two', hook: 'Two buyers open level two', use: 'For team builders. The 2-then-5 qualification ladder and how a line stacks under you.' } + ]; function fill(link, me) { const token = (me && (me.username || me.refCode || me.memberId)) || ''; // invite strip @@ -97,6 +106,29 @@ window.IAPPromo = (function () { if ($('promoLinkCopy')) $('promoLinkCopy').onclick = async () => { try { await navigator.clipboard.writeText(link); status('Link copied.', 'ok'); } catch (e) { status('Copy failed.', 'bad'); } }; + // angle links: one row per front door, copy + share + const al = $('promoAngles'); + if (al && al.dataset.filled !== link) { + al.dataset.filled = link; al.innerHTML = ''; + for (const a of ANGLES) { + const url = angleLink(link, a.angle); + const hasVideo = VIDEOS.some(v => v.angle === a.angle); + const row = document.createElement('div'); + row.className = 'angle-row'; + row.innerHTML = '
' + esc(a.name) + '' + esc(a.hook) + '' + + (hasVideo ? 'video' : '') + '
' + + '
' + esc(a.use) + '
' + + '
' + esc(url) + '
' + + '
'; + const [copyBtn, shareBtn] = row.querySelectorAll('button'); + copyBtn.onclick = async () => { try { await navigator.clipboard.writeText(url); status((a.name === 'General' ? 'Invite' : a.name) + ' link copied.', 'ok'); } catch (e) { status('Copy failed.', 'bad'); } }; + shareBtn.onclick = async () => { + if (navigator.share) { try { await navigator.share({ title: 'InstantAdPay', text: a.hook, url }); return; } catch (e) { if (e && e.name === 'AbortError') return; } } + try { await navigator.clipboard.writeText(url); status('No share sheet here, so the link is copied.', 'ok'); } catch (e) { status('Copy failed.', 'bad'); } + }; + al.appendChild(row); + } + } // posts const posts = $('promoPosts'); if (posts && posts.dataset.filled !== link) { diff --git a/public/assets/site.css b/public/assets/site.css index 405f755..98e981b 100644 --- a/public/assets/site.css +++ b/public/assets/site.css @@ -627,6 +627,16 @@ img{max-width:100%} /* ── promo tools (2026-09-09) ── */ .promo-strip{display:flex;justify-content:space-between;align-items:center;gap:14px;flex-wrap:wrap;padding:16px 20px} +.angle-list{display:flex;flex-direction:column} +.angle-row{display:flex;justify-content:space-between;align-items:center;gap:14px;flex-wrap:wrap;padding:12px 0;border-top:1px solid var(--line)} +.angle-row .angle-txt{flex:1 1 320px;min-width:0} +.angle-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:3px} +.angle-name{font-family:var(--disp);font-weight:700;font-size:15px} +.angle-hook{color:var(--mint);font-size:13px} +.angle-tag{font-family:var(--mono);font-size:10px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);border:1px solid var(--line-strong);border-radius:999px;padding:1px 7px} +.angle-url{overflow-wrap:anywhere;margin-top:4px} +.angle-btns{display:flex;gap:8px;flex-wrap:wrap} +.angle-btns .btn{margin-top:0} .promo-pills{margin:4px 0 14px} .promo-block .pb-head{display:flex;gap:8px;align-items:center;margin-bottom:8px;font-size:13.5px} .promo-block .pb-net{font-family:var(--mono);font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--mint)} diff --git a/public/my.html b/public/my.html index 5b255d5..5b1ae70 100644 --- a/public/my.html +++ b/public/my.html @@ -5,7 +5,7 @@ Member area | InstantAdPay - + @@ -625,9 +625,14 @@