A session pop-up that says what InstantAdPay actually is

The dashboard card was too easy to scroll past, so this is a real overlay: once
per browser session, on every page that loads common.js, dismissed with the X,
Escape or the backdrop.

It leads with the mechanic rather than the promotion, because the ask was to
remind people what the site is about: the ad spend in your line pays you, in the
same transaction. Five Dollar Friday rides underneath as the reason to act, and
the copy is driven by the live /api/friday, so it reads "tomorrow", "today" or
nothing at all without anyone editing text on a Friday morning.

Not shown on /join or /admin: an overlay in the middle of signing up costs
sign-ups, and staff do not need reminding what the product is.

QA: the overlay appears after an async fetch, so hiding it at load time missed
it and every click in the harness timed out. The harness now pre-sets the same
sessionStorage flag a real dismissal uses, before page scripts run. Green again,
0 bugs.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
martbost
2026-09-24 15:54:33 -05:00
parent fd08af36ba
commit 3f9dc3cc94
19 changed files with 3206 additions and 3087 deletions
+1 -1
View File
@@ -510,7 +510,7 @@
</div>
</div>
<script src="/assets/common.js?v=20260923b"></script>
<script src="/assets/common.js?v=20260923b"></script><script src="/assets/welcome.js?v=20260923b"></script>
<script src="/assets/admin.js?v=20260923b"></script>
</body>
</html>
+115
View File
@@ -0,0 +1,115 @@
/* InstantAdPay session pop-up (Marty, 2026-09-24).
One card, once per browser session, on every page that loads common.js. It exists because the
dashboard card was too easy to scroll past: this one is a proper overlay you have to dismiss.
It leads with WHAT THE SITE IS, not the promotion, because the ask was "remind them what it is
about". Five Dollar Friday rides along underneath as the reason to act this week, and the card
reads the live /api/friday so it says "tomorrow", "today" or nothing at all without anyone
editing copy.
Rules it follows:
- once per SESSION, not per day: sessionStorage, so closing the tab resets it
- a new `key` (change of promo, new campaign) shows it again even in the same session
- never on the sign-up or sign-in flow: an overlay in the middle of joining costs sign-ups
- Escape and the backdrop both close it, and focus is trapped while it is open
- if sessionStorage is unavailable (private mode) it simply shows once and does not throw
*/
(function () {
var KEY = 'iap.welcome.v1';
// Pages where an overlay would get in the way of something more important.
// /join is the sign-up flow and /admin is staff only; an overlay on either is pure friction.
var SKIP = /^\/(join|signup|register|login|auth|admin)(\/|$)/i;
function seen() { try { return sessionStorage.getItem(KEY) === '1'; } catch (e) { return false; } }
function mark() { try { sessionStorage.setItem(KEY, '1'); } catch (e) {} }
function fridayLine(f) {
if (!f || !f.on) return null;
if (f.live) return { tag: 'TODAY', text: 'It is Five Dollar Friday right now. Every package of $5 or more gets <b>20% bonus credits</b>, automatically, until midnight Central.' };
if (f.nextLabel) return { tag: f.nextLabel, text: 'Five Dollar Friday: any package of $5 or more gets <b>' + (f.pct || 20) + '% bonus credits</b>, automatically. No code, nothing to claim.' };
return null;
}
function show(f) {
if (document.querySelector('.iap-welcome')) return;
var fri = fridayLine(f);
var back = document.createElement('div');
back.className = 'iap-welcome';
back.setAttribute('role', 'dialog');
back.setAttribute('aria-modal', 'true');
back.setAttribute('aria-label', 'About InstantAdPay');
back.style.cssText = 'position:fixed;inset:0;z-index:400;background:rgba(2,6,5,.72);' +
'display:flex;align-items:center;justify-content:center;padding:18px;overflow:auto;' +
'-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);';
var card = document.createElement('div');
card.style.cssText = 'position:relative;width:100%;max-width:470px;background:#0b1512;color:#eef7f3;' +
'border:1px solid rgba(67,232,195,.28);border-radius:18px;padding:26px 24px 22px;' +
'box-shadow:0 26px 70px rgba(0,0,0,.6);font-size:15px;line-height:1.55;';
var html =
'<button type="button" class="iap-w-x" aria-label="Close" style="position:absolute;top:10px;right:12px;' +
'background:none;border:0;color:#8ba69c;font-size:26px;line-height:1;cursor:pointer;padding:4px 8px;">&times;</button>' +
'<div style="letter-spacing:2px;text-transform:uppercase;font-size:11px;font-weight:700;color:#43e8c3;">InstantAdPay</div>' +
'<h2 style="margin:8px 0 12px;font-size:25px;line-height:1.25;color:#fff;">The ad spend in your line pays you, in the same transaction.</h2>' +
'<p style="margin:0 0 14px;color:#c8d6e2;">You buy advertising you were going to buy anyway. When someone in your line buys a package, the contract splits it and your share lands in your wallet before the page reloads. No back office, no payday to wait for.</p>' +
'<ul style="margin:0 0 16px;padding-left:18px;color:#c8d6e2;">' +
'<li style="margin-bottom:5px;">Every payout is on the public ledger, and you can read it yourself.</li>' +
'<li style="margin-bottom:5px;">Free members earn ad credits by viewing ads, videos and visits.</li>' +
'<li>Credits buy your own advertising. They are delivery, not a balance to hoard.</li>' +
'</ul>';
if (fri) {
html += '<div style="margin:0 0 16px;padding:12px 14px;border:1px solid rgba(255,178,56,.38);' +
'background:rgba(255,178,56,.08);border-radius:12px;color:#eef7f3;">' +
'<div style="font-weight:800;color:#ffb238;font-size:12px;letter-spacing:1.4px;text-transform:uppercase;margin-bottom:4px;">' + fri.tag + '</div>' +
'<div>' + fri.text + '</div></div>';
}
html += '<div style="display:flex;gap:9px;flex-wrap:wrap;">' +
'<a class="iap-w-go" href="/my#buy" style="flex:1 1 auto;text-align:center;text-decoration:none;background:linear-gradient(180deg,#5ff0cf,#43e8c3);color:#04120e;font-weight:800;padding:12px 16px;border-radius:11px;">See the packages</a>' +
'<a class="iap-w-go" href="/ledger" style="flex:0 1 auto;text-align:center;text-decoration:none;border:1px solid rgba(67,232,195,.4);color:#43e8c3;font-weight:700;padding:12px 16px;border-radius:11px;">Live ledger</a>' +
'</div>';
card.innerHTML = html;
back.appendChild(card);
document.body.appendChild(back);
mark();
var prev = document.activeElement;
var closeBtn = card.querySelector('.iap-w-x');
function close() {
back.remove();
document.removeEventListener('keydown', onKey);
try { if (prev && prev.focus) prev.focus(); } catch (e) {}
}
function onKey(e) {
if (e.key === 'Escape') { close(); return; }
if (e.key !== 'Tab') return;
var f = card.querySelectorAll('button,a[href]');
if (!f.length) return;
var first = f[0], last = f[f.length - 1];
if (e.shiftKey && document.activeElement === first) { e.preventDefault(); last.focus(); }
else if (!e.shiftKey && document.activeElement === last) { e.preventDefault(); first.focus(); }
}
closeBtn.addEventListener('click', close);
back.addEventListener('click', function (e) { if (e.target === back) close(); });
// following a link is a deliberate exit, so let it through but tidy up
card.querySelectorAll('.iap-w-go').forEach(function (a) { a.addEventListener('click', close); });
document.addEventListener('keydown', onKey);
try { closeBtn.focus(); } catch (e) {}
}
function boot() {
if (seen() || SKIP.test(location.pathname)) return;
// the Friday state decides one paragraph; a failure there must not stop the card
fetch('/api/friday').then(function (r) { return r.ok ? r.json() : null; })
.catch(function () { return null; })
.then(function (f) { show(f); });
}
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', boot);
else boot();
})();
+148 -148
View File
@@ -1,148 +1,148 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>The contract | InstantAdPay</title>
<meta name="description" content="Plain-language review of the InstantAdPay settlement contract: what it does, what nobody can change, what the operator can and cannot touch, and how to verify all of it yourself.">
<link rel="canonical" href="https://instantadpay.com/contract">
<meta property="og:type" content="website"><meta property="og:site_name" content="InstantAdPay">
<meta property="og:url" content="https://instantadpay.com/contract">
<meta property="og:title" content="InstantAdPay — the contract, in plain language">
<meta property="og:description" content="What the settlement contract does, what nobody can change, and how to verify all of it yourself.">
<meta property="og:image" content="https://instantadpay.com/banners/iap-hero-1200x630.png">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="InstantAdPay — the contract, in plain language">
<meta name="twitter:description" content="Immutable 50-20-10 splits, no withdrawal button, verify it yourself.">
<meta name="twitter:image" content="https://instantadpay.com/banners/iap-hero-1200x630.png">
<meta name="theme-color" content="#043b2f">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Sora:wght@600;700;800&display=swap">
<link rel="icon" type="image/png" href="/logo-icon.png">
<link rel="stylesheet" href="/assets/site.css?v=20260910h">
</head>
<body>
<div class="wrap">
<section class="hero" style="padding-bottom:24px">
<h1>The contract, <em>in plain language</em>.</h1>
<p class="lead">Every dollar on this platform moves through one smart contract. This page explains
what it does, what nobody can change, and exactly what powers we kept. Verify every claim
yourself. That is the point.</p>
<p>
<span class="badge">address: <span class="mono" id="cAddr">…</span></span>
<span class="badge" id="cChain">…</span>
</p>
<p style="margin-top:16px">
<a class="btn sec small" id="lnkExplorer" target="_blank" rel="noopener">Raw contract on the explorer ↗</a>
<a class="btn sec small" id="lnkSource" target="_blank" rel="noopener">Verified source code ↗</a>
</p>
</section>
<div class="card">
<h3>The six laws the code enforces</h3>
<ul class="checks">
<li><b>It never holds funds.</b> Every purchase is fully paid out in the same transaction. The contract balance is zero after every sale. There is nothing to freeze, drain, or run away with.</li>
<li><b>The compensation rules are constants.</b> 50 percent, 20 percent, 10 percent, 20 percent platform. They are compiled into the bytecode. No function exists to change them.</li>
<li><b>No upgrade path, no pause switch, no self-destruct.</b> The deployed bytecode is the program forever.</li>
<li><b>Purchased credits only ever go down by delivering your ads.</b> No function reduces them for any other reason, and nothing can mint them except a purchase.</li>
<li><b>Qualification is earned, never bought.</b> Deeper levels unlock only by referring real buyers of $20 or more. No spend-based shortcuts exist.</li>
<li><b>Everything is observable.</b> Every state change emits a public event. The website is a mirror of the chain, never the source of truth for money.</li>
</ul>
</div>
<div class="grid c2">
<div class="card">
<h3>What the operator CAN do</h3>
<ul class="checks">
<li>Add ad packages to the catalog (price floor $1, ceiling $500)</li>
<li>Queue a price change, which waits behind a public 24-hour timelock before anyone can apply it</li>
<li>Retire a package from sale, and reactivate it later</li>
<li>Rotate the fee-receiver, ad-engine, and owner addresses (key-loss insurance)</li>
<li>The ad engine can burn credits, but only as your campaigns consume delivery</li>
</ul>
</div>
<div class="card">
<h3>What the operator CANNOT do</h3>
<ul class="checks">
<li>Change any split percentage or qualification threshold</li>
<li>Pause, upgrade, or replace the contract</li>
<li>Hold, redirect, or claw back anyone's payout</li>
<li>Mint credits, take credits, or touch anyone's membership record</li>
<li>Move a price outside the $1 to $500 bounds, or skip the 24-hour notice</li>
</ul>
</div>
</div>
<div class="card">
<h3>Where every purchase goes</h3>
<div class="split">
<div class="s50">50%<br>direct sponsor</div>
<div class="s20">20%<br>level 2</div>
<div class="s10">10%<br>level 3</div>
<div class="sa">20%<br>platform</div>
</div>
<p class="muted small">On a $20 package: $10.00 to the direct sponsor, $4.00 to level 2, $2.00 to level 3,
$4.00 to the platform. Rounding dust of a few billionths of a cent goes to the platform wallet so the
books always balance to zero. When a level has no qualified recipient, that share visibly passes up
to the next qualified person; if none exists within 25 candidates, it goes to the platform. Every one
of these movements is an event on the <a href="/ledger">live ledger</a>.</p>
</div>
<div class="grid c2">
<div class="card">
<h3>Dollar prices, POL settlement</h3>
<p class="muted small">Packages are priced in dollars and settled in POL using the Chainlink POL/USD
oracle at the moment of purchase. If you send slightly too much because the rate moved, the excess
refunds to you in the same transaction. If the oracle ever goes quiet, the contract keeps selling
at its last fresh price for up to 24 hours, then new purchases pause until the feed returns.
Settled money, credits, and memberships are never affected by an oracle outage.</p>
</div>
<div class="card">
<h3>Nobody can stall it</h3>
<p class="muted small">Payouts are pushed with a strict gas allowance. A wallet that refuses to
accept payment is simply treated as unqualified and its share passes up. No escrow forms, no
purchase reverts, nobody waits on anybody. One practical note: use a normal wallet address for
payouts. Some exotic smart-contract wallets cost more gas to receive than the allowance and would
be passed over.</p>
</div>
</div>
<div class="card">
<h3>How it was tested</h3>
<p class="muted small">Before deployment the contract passed a suite of 24 tests covering every split
scenario, the pass-up walk to its exact 25-candidate boundary, oracle outages and price swings,
refunds, hostile recipient wallets, and catalog rules. On top of that, an invariant fuzzer ran
128,000 randomized transactions and confirmed after every single one: the contract balance stayed
zero, every wei in equaled every wei out, credits equaled purchases minus delivery, and nobody was
qualified without earning it. The full specification was then audited line by line against the code.
The source you see at the verified-source link is byte-for-byte what runs on chain.</p>
</div>
<div class="closer">
<div>
<h2>Do not trust this page. Check it.</h2>
<p class="muted" style="margin:0 0 22px">The whole reason this platform exists is that you should
not have to take anyone's word, including ours. Open the source, open the ledger, click a
transaction.</p>
<a class="btn" id="lnkSource2" target="_blank" rel="noopener">Read the verified source</a>
<a class="btn sec" href="/ledger">Open the live ledger</a>
</div>
<div class="mockup">
<div class="bar"><i></i><i></i><i></i><span class="addr" id="mockAddr">contract</span></div>
<div class="body">
<div class="mrow"><span>compiler check</span><span>exact match</span></div>
<div class="mrow"><span>bytecode check</span><span>exact match</span></div>
<div class="mrow dim"><span>upgrade path</span><span>none</span></div>
<div class="mrow dim"><span>pause switch</span><span>none</span></div>
</div>
</div>
</div>
<footer>
<div>InstantAdPay · <a href="/">how it works</a> · <a href="/ledger">live ledger</a></div>
<div class="small">Advertising services with a performance referral program. Not an investment product; no income guarantees. Crypto transactions are irreversible. Never spend what you cannot afford.</div>
</footer>
</div>
<script src="/assets/common.js?v=20260923b"></script>
<script src="/assets/contract.js?v=20260908p"></script>
<script src="/assets/chat.js?v=20260906m"></script>
</body>
</html>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>The contract | InstantAdPay</title>
<meta name="description" content="Plain-language review of the InstantAdPay settlement contract: what it does, what nobody can change, what the operator can and cannot touch, and how to verify all of it yourself.">
<link rel="canonical" href="https://instantadpay.com/contract">
<meta property="og:type" content="website"><meta property="og:site_name" content="InstantAdPay">
<meta property="og:url" content="https://instantadpay.com/contract">
<meta property="og:title" content="InstantAdPay — the contract, in plain language">
<meta property="og:description" content="What the settlement contract does, what nobody can change, and how to verify all of it yourself.">
<meta property="og:image" content="https://instantadpay.com/banners/iap-hero-1200x630.png">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="InstantAdPay — the contract, in plain language">
<meta name="twitter:description" content="Immutable 50-20-10 splits, no withdrawal button, verify it yourself.">
<meta name="twitter:image" content="https://instantadpay.com/banners/iap-hero-1200x630.png">
<meta name="theme-color" content="#043b2f">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Sora:wght@600;700;800&display=swap">
<link rel="icon" type="image/png" href="/logo-icon.png">
<link rel="stylesheet" href="/assets/site.css?v=20260910h">
</head>
<body>
<div class="wrap">
<section class="hero" style="padding-bottom:24px">
<h1>The contract, <em>in plain language</em>.</h1>
<p class="lead">Every dollar on this platform moves through one smart contract. This page explains
what it does, what nobody can change, and exactly what powers we kept. Verify every claim
yourself. That is the point.</p>
<p>
<span class="badge">address: <span class="mono" id="cAddr">…</span></span>
<span class="badge" id="cChain">…</span>
</p>
<p style="margin-top:16px">
<a class="btn sec small" id="lnkExplorer" target="_blank" rel="noopener">Raw contract on the explorer ↗</a>
<a class="btn sec small" id="lnkSource" target="_blank" rel="noopener">Verified source code ↗</a>
</p>
</section>
<div class="card">
<h3>The six laws the code enforces</h3>
<ul class="checks">
<li><b>It never holds funds.</b> Every purchase is fully paid out in the same transaction. The contract balance is zero after every sale. There is nothing to freeze, drain, or run away with.</li>
<li><b>The compensation rules are constants.</b> 50 percent, 20 percent, 10 percent, 20 percent platform. They are compiled into the bytecode. No function exists to change them.</li>
<li><b>No upgrade path, no pause switch, no self-destruct.</b> The deployed bytecode is the program forever.</li>
<li><b>Purchased credits only ever go down by delivering your ads.</b> No function reduces them for any other reason, and nothing can mint them except a purchase.</li>
<li><b>Qualification is earned, never bought.</b> Deeper levels unlock only by referring real buyers of $20 or more. No spend-based shortcuts exist.</li>
<li><b>Everything is observable.</b> Every state change emits a public event. The website is a mirror of the chain, never the source of truth for money.</li>
</ul>
</div>
<div class="grid c2">
<div class="card">
<h3>What the operator CAN do</h3>
<ul class="checks">
<li>Add ad packages to the catalog (price floor $1, ceiling $500)</li>
<li>Queue a price change, which waits behind a public 24-hour timelock before anyone can apply it</li>
<li>Retire a package from sale, and reactivate it later</li>
<li>Rotate the fee-receiver, ad-engine, and owner addresses (key-loss insurance)</li>
<li>The ad engine can burn credits, but only as your campaigns consume delivery</li>
</ul>
</div>
<div class="card">
<h3>What the operator CANNOT do</h3>
<ul class="checks">
<li>Change any split percentage or qualification threshold</li>
<li>Pause, upgrade, or replace the contract</li>
<li>Hold, redirect, or claw back anyone's payout</li>
<li>Mint credits, take credits, or touch anyone's membership record</li>
<li>Move a price outside the $1 to $500 bounds, or skip the 24-hour notice</li>
</ul>
</div>
</div>
<div class="card">
<h3>Where every purchase goes</h3>
<div class="split">
<div class="s50">50%<br>direct sponsor</div>
<div class="s20">20%<br>level 2</div>
<div class="s10">10%<br>level 3</div>
<div class="sa">20%<br>platform</div>
</div>
<p class="muted small">On a $20 package: $10.00 to the direct sponsor, $4.00 to level 2, $2.00 to level 3,
$4.00 to the platform. Rounding dust of a few billionths of a cent goes to the platform wallet so the
books always balance to zero. When a level has no qualified recipient, that share visibly passes up
to the next qualified person; if none exists within 25 candidates, it goes to the platform. Every one
of these movements is an event on the <a href="/ledger">live ledger</a>.</p>
</div>
<div class="grid c2">
<div class="card">
<h3>Dollar prices, POL settlement</h3>
<p class="muted small">Packages are priced in dollars and settled in POL using the Chainlink POL/USD
oracle at the moment of purchase. If you send slightly too much because the rate moved, the excess
refunds to you in the same transaction. If the oracle ever goes quiet, the contract keeps selling
at its last fresh price for up to 24 hours, then new purchases pause until the feed returns.
Settled money, credits, and memberships are never affected by an oracle outage.</p>
</div>
<div class="card">
<h3>Nobody can stall it</h3>
<p class="muted small">Payouts are pushed with a strict gas allowance. A wallet that refuses to
accept payment is simply treated as unqualified and its share passes up. No escrow forms, no
purchase reverts, nobody waits on anybody. One practical note: use a normal wallet address for
payouts. Some exotic smart-contract wallets cost more gas to receive than the allowance and would
be passed over.</p>
</div>
</div>
<div class="card">
<h3>How it was tested</h3>
<p class="muted small">Before deployment the contract passed a suite of 24 tests covering every split
scenario, the pass-up walk to its exact 25-candidate boundary, oracle outages and price swings,
refunds, hostile recipient wallets, and catalog rules. On top of that, an invariant fuzzer ran
128,000 randomized transactions and confirmed after every single one: the contract balance stayed
zero, every wei in equaled every wei out, credits equaled purchases minus delivery, and nobody was
qualified without earning it. The full specification was then audited line by line against the code.
The source you see at the verified-source link is byte-for-byte what runs on chain.</p>
</div>
<div class="closer">
<div>
<h2>Do not trust this page. Check it.</h2>
<p class="muted" style="margin:0 0 22px">The whole reason this platform exists is that you should
not have to take anyone's word, including ours. Open the source, open the ledger, click a
transaction.</p>
<a class="btn" id="lnkSource2" target="_blank" rel="noopener">Read the verified source</a>
<a class="btn sec" href="/ledger">Open the live ledger</a>
</div>
<div class="mockup">
<div class="bar"><i></i><i></i><i></i><span class="addr" id="mockAddr">contract</span></div>
<div class="body">
<div class="mrow"><span>compiler check</span><span>exact match</span></div>
<div class="mrow"><span>bytecode check</span><span>exact match</span></div>
<div class="mrow dim"><span>upgrade path</span><span>none</span></div>
<div class="mrow dim"><span>pause switch</span><span>none</span></div>
</div>
</div>
</div>
<footer>
<div>InstantAdPay · <a href="/">how it works</a> · <a href="/ledger">live ledger</a></div>
<div class="small">Advertising services with a performance referral program. Not an investment product; no income guarantees. Crypto transactions are irreversible. Never spend what you cannot afford.</div>
</footer>
</div>
<script src="/assets/common.js?v=20260923b"></script><script src="/assets/welcome.js?v=20260923b"></script>
<script src="/assets/contract.js?v=20260908p"></script>
<script src="/assets/chat.js?v=20260906m"></script>
</body>
</html>
+32 -32
View File
@@ -1,32 +1,32 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Disclaimer | InstantAdPay</title>
<link rel="icon" type="image/png" href="/logo-icon.png">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Sora:wght@600;700;800&display=swap">
<link rel="stylesheet" href="/assets/site.css?v=20260910h">
</head>
<body>
<div id="nav"></div>
<section><div class="wrap" style="max-width:820px">
<div class="sectionhead" style="text-align:left"><h2>Risk &amp; Earnings Disclaimer</h2><p class="muted small">Last updated: September 2026</p></div>
<div class="card">
<h3>No income guarantee</h3>
<p class="muted small">InstantAdPay is an advertising service with a referral program. It is not an investment, a security, or a passive-income scheme. We do not promise, project, or guarantee any earnings. Any figures shown in examples or sample creatives are illustrations only, not typical or expected results. Most participants should expect to earn little or nothing unless real advertising is purchased in their line.</p>
<h3>Not financial or legal advice</h3>
<p class="muted small">Nothing on the Platform is investment, financial, tax, or legal advice. Do your own research and consult a professional before spending money.</p>
<h3>Crypto risk</h3>
<p class="muted small">Purchases settle on a public blockchain using a volatile network token. On-chain transactions are final and irreversible: there are no refunds, chargebacks, or reversals. You are responsible for your wallet, your keys, network fees, and the tax treatment of your activity.</p>
<h3>Live on Polygon</h3>
<p class="muted small">The Platform is live on the Polygon mainnet. Purchases and payouts use POL, a real cryptocurrency with real monetary value. Every transaction is real and final — this is not a simulation or test environment.</p>
<h3>Advertising</h3>
<p class="muted small">Ads are member-created and auto-approved for speed. InstantAdPay does not endorse and is not responsible for advertised products, sites, or claims. Use your judgment, and report anything broken or inappropriate.</p>
<h3>Your responsibility</h3>
<p class="muted small">You decide whether, and how much, to spend. Never spend more than you can afford to lose.</p>
</div>
</div></section>
<script src="/assets/common.js?v=20260923b"></script>
<script src="/assets/legal.js?v=20260908a"></script>
</body>
</html>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Disclaimer | InstantAdPay</title>
<link rel="icon" type="image/png" href="/logo-icon.png">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Sora:wght@600;700;800&display=swap">
<link rel="stylesheet" href="/assets/site.css?v=20260910h">
</head>
<body>
<div id="nav"></div>
<section><div class="wrap" style="max-width:820px">
<div class="sectionhead" style="text-align:left"><h2>Risk &amp; Earnings Disclaimer</h2><p class="muted small">Last updated: September 2026</p></div>
<div class="card">
<h3>No income guarantee</h3>
<p class="muted small">InstantAdPay is an advertising service with a referral program. It is not an investment, a security, or a passive-income scheme. We do not promise, project, or guarantee any earnings. Any figures shown in examples or sample creatives are illustrations only, not typical or expected results. Most participants should expect to earn little or nothing unless real advertising is purchased in their line.</p>
<h3>Not financial or legal advice</h3>
<p class="muted small">Nothing on the Platform is investment, financial, tax, or legal advice. Do your own research and consult a professional before spending money.</p>
<h3>Crypto risk</h3>
<p class="muted small">Purchases settle on a public blockchain using a volatile network token. On-chain transactions are final and irreversible: there are no refunds, chargebacks, or reversals. You are responsible for your wallet, your keys, network fees, and the tax treatment of your activity.</p>
<h3>Live on Polygon</h3>
<p class="muted small">The Platform is live on the Polygon mainnet. Purchases and payouts use POL, a real cryptocurrency with real monetary value. Every transaction is real and final — this is not a simulation or test environment.</p>
<h3>Advertising</h3>
<p class="muted small">Ads are member-created and auto-approved for speed. InstantAdPay does not endorse and is not responsible for advertised products, sites, or claims. Use your judgment, and report anything broken or inappropriate.</p>
<h3>Your responsibility</h3>
<p class="muted small">You decide whether, and how much, to spend. Never spend more than you can afford to lose.</p>
</div>
</div></section>
<script src="/assets/common.js?v=20260923b"></script><script src="/assets/welcome.js?v=20260923b"></script>
<script src="/assets/legal.js?v=20260908a"></script>
</body>
</html>
+88 -88
View File
@@ -1,88 +1,88 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>How earning works: credits and POL payouts | InstantAdPay</title>
<meta name="description" content="The two ways members earn on InstantAdPay: ad credits (the daily set, the claim streak, visits, videos, inbox ads, sign-in bonus, milestones) and POL paid to your wallet from ad packages bought in your line, on chain, in the same transaction.">
<meta name="robots" content="noindex">
<meta name="theme-color" content="#043b2f">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Sora:wght@600;700;800&display=swap">
<link rel="icon" type="image/png" href="/logo-icon.png">
<link rel="stylesheet" href="/assets/site.css?v=20260912b">
<style>
.eg{max-width:820px}
.eg h2{font-size:23px;margin:40px 0 10px;padding-top:18px;border-top:1px solid var(--line)}
.eg p,.eg li{max-width:68ch}
.eg ul,.eg ol{margin:0 0 14px 20px;padding:0} .eg li{margin:7px 0}
table{border-collapse:collapse;width:100%;max-width:560px;margin:10px 0 16px;font-variant-numeric:tabular-nums;font-size:15px}
th,td{text-align:left;padding:8px 10px;border-bottom:1px solid var(--line)} th{color:var(--muted);font-family:var(--mono);font-size:11px;letter-spacing:.08em;text-transform:uppercase;font-weight:500}
td:last-child,th:last-child{text-align:right}
.rule{border-left:4px solid var(--mint);background:rgba(67,232,195,.07);padding:14px 18px;border-radius:0 12px 12px 0;margin:0 0 20px}
.rule b{font-family:var(--disp);display:block;margin-bottom:4px}
</style>
</head>
<body>
<div class="wrap eg">
<section class="hero" style="padding:60px 0 14px">
<p class="eyebrow">Member guide</p>
<h1>How earning works: <em>credits</em>, and POL to your wallet.</h1>
<p class="lead">Every free way to earn ad credits, the claim streak, and the one thing that makes the credits worth anything: spending them on a campaign.</p>
</section>
<div class="rule"><b>This page is about credits, which every member earns.</b> POL, the crypto the contract pays to your wallet when your referrals buy packages, is separate: activate with the $20 starter package and switch on payouts, and level 1 pays 50 percent of every package your directs buy.</div>
<div class="rule"><b>One credit is one cent of ad delivery.</b> Credits are not money and cannot be withdrawn. They buy impressions, clicks and visits for your own campaigns across InstantAdPay and the partner network. Payouts in POL come only from packages people in your line buy.</div>
<h2>1. The daily set</h2>
<p>Earn credits &rsaquo; Watch ads. Five ads a day. Each one opens full screen, a 10-second countdown runs while you look, you pass a quick click-the-icon check, and you earn 1 credit. Finish all five and the Claim button appears.</p>
<h2>2. The claim streak</h2>
<p>The claim pays more the more days in a row you claim it. Miss a day and it restarts at day 1.</p>
<table>
<tr><th>Consecutive day</th><th>Claim pays</th></tr>
<tr><td>Day 1</td><td>5 credits</td></tr>
<tr><td>Day 2</td><td>7 credits</td></tr>
<tr><td>Day 3 and on</td><td>10 credits</td></tr>
<tr><td>Every 7th day in a row</td><td>25 credits</td></tr>
</table>
<p>The hint under the set always tells you which day you are on and what tomorrow's claim pays. Days are counted in UTC, so the set resets at 7 PM Central.</p>
<h2>3. After the set: verified visits</h2>
<p>When the set is claimed, the done screen offers verified visits: up to 20 a day, 1 credit each. You open a member's site in a new tab, stay for the dwell, and the visit counts. Each visit is unique per site per day, so it is 20 different sites, not one site 20 times.</p>
<h2>4. Videos and inbox ads</h2>
<ul>
<li><b>Videos.</b> Earn credits &rsaquo; Watch videos. You are credited only when the video plays to the end. Up to 6 a day, and the reward depends on the video's length.</li>
<li><b>Inbox solo ads.</b> Earn credits &rsaquo; Inbox Ads. Open the message, visit the advertiser's link, then claim 2 credits. Once per message.</li>
</ul>
<h2>5. The sign-in bonus and milestones</h2>
<p>Signing in pays 5 credits a day, rising by one for each consecutive day up to 10. Milestone badges pay too: Spark when payouts are on, Surge at your first qualifying buyer, Circuit at two, Nexus at five.</p>
<h2>6. Now spend it</h2>
<p>Credits sitting in your balance do nothing. Campaigns &rsaquo; New campaign: pick a banner or a text ad, give it a name and a budget in credits, point it at your own invite link or wall, and launch. Banner and text ads also push out to the partner network, so a 100-credit campaign is a hundred cents of real delivery. The done screen has a one-tap button for this after every claim.</p>
<p>Two things to know: a campaign reserves its whole budget the moment you start it, so your available balance drops right away and never surprises you later, and login ads are the one format that needs purchased credits.</p>
<h2>7. The other earning: POL paid to your wallet</h2>
<p>Everything above is about <b>credits</b>, the currency that runs your advertising. The second kind of earning is <b>POL</b>, real money sent to your own wallet, and it comes from one place: ad packages bought by people in your line.</p>
<p>When anyone buys a package, the smart contract splits the price in the same transaction: <b>50%</b> to the buyer's sponsor (level 1), <b>20%</b> to the sponsor's sponsor (level 2), <b>10%</b> to the one above that (level 3), and 20% to the platform. There is no balance to withdraw and no request to make. The POL lands in the wallet on your account before the buyer's page has finished refreshing, and every payout carries a link you can open on Polygon.</p>
<h3>What has to be true for a share to reach you</h3>
<ul>
<li><b>Payouts are switched on.</b> Wallet tab: link your wallet and switch on payouts, which puts your member number on the contract. Until then a share meant for you passes up to the next payable person above you, and it is never paid to you later.</li>
<li><b>Level 1 pays from the moment payouts are on.</b> Every direct referral's package pays you 50%, whatever the size.</li>
<li><b>Level 2 opens at two qualifying buyers, level 3 at five.</b> A qualifying buyer is a direct referral who bought a package of $20 or more. Qualification never expires and cannot be bought. It is counted at the block the purchase happens in, so a buy that lands forty minutes before you qualify is passed up, not held.</li>
<li><b>Passed-up shares go to the next qualified person above.</b> That is why the people who qualify early collect what the people below them are not yet set up to receive.</li>
</ul>
<h3>Who is your sponsor</h3>
<p>The invite link you opened most recently before creating your account sets your sponsor, and it locks the moment the account exists. Linked positions from Qualified Start count toward your badges, and their purchases pay your main position at level 1.</p>
<h3>Where to see it</h3>
<p><a href="/my#earnings">Earnings</a> shows three cards: payouts sent to your wallet, referral events in your line, and your purchases, every row with its Polygon link. If a share you expected is missing, use <b>Trace a payment</b> on that tab: it shows, purchase by purchase, who was paid at each level and why a level was skipped. The usual answers are not yet qualified at that block, a Qualified Start position buying under its own main wallet, or payouts not switched on. The <a href="/ledger">live ledger</a> shows the whole network's payouts as they happen.</p>
<p class="muted small" style="margin-top:30px">No income is guaranteed. Results depend on your effort. Cryptocurrency involves risk of loss. InstantAdPay sells advertising; it is not an investment.</p>
<footer>
<div>InstantAdPay · <a href="/my#earn">Earn credits</a> · <a href="/my#campaigns">Campaigns</a> · <a href="/my#training">back to Training</a></div>
<div class="small">Advertising services with a performance referral program. Not an investment product; no income guarantees.</div>
</footer>
</div>
<script src="/assets/common.js?v=20260923b"></script>
</body>
</html>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>How earning works: credits and POL payouts | InstantAdPay</title>
<meta name="description" content="The two ways members earn on InstantAdPay: ad credits (the daily set, the claim streak, visits, videos, inbox ads, sign-in bonus, milestones) and POL paid to your wallet from ad packages bought in your line, on chain, in the same transaction.">
<meta name="robots" content="noindex">
<meta name="theme-color" content="#043b2f">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Sora:wght@600;700;800&display=swap">
<link rel="icon" type="image/png" href="/logo-icon.png">
<link rel="stylesheet" href="/assets/site.css?v=20260912b">
<style>
.eg{max-width:820px}
.eg h2{font-size:23px;margin:40px 0 10px;padding-top:18px;border-top:1px solid var(--line)}
.eg p,.eg li{max-width:68ch}
.eg ul,.eg ol{margin:0 0 14px 20px;padding:0} .eg li{margin:7px 0}
table{border-collapse:collapse;width:100%;max-width:560px;margin:10px 0 16px;font-variant-numeric:tabular-nums;font-size:15px}
th,td{text-align:left;padding:8px 10px;border-bottom:1px solid var(--line)} th{color:var(--muted);font-family:var(--mono);font-size:11px;letter-spacing:.08em;text-transform:uppercase;font-weight:500}
td:last-child,th:last-child{text-align:right}
.rule{border-left:4px solid var(--mint);background:rgba(67,232,195,.07);padding:14px 18px;border-radius:0 12px 12px 0;margin:0 0 20px}
.rule b{font-family:var(--disp);display:block;margin-bottom:4px}
</style>
</head>
<body>
<div class="wrap eg">
<section class="hero" style="padding:60px 0 14px">
<p class="eyebrow">Member guide</p>
<h1>How earning works: <em>credits</em>, and POL to your wallet.</h1>
<p class="lead">Every free way to earn ad credits, the claim streak, and the one thing that makes the credits worth anything: spending them on a campaign.</p>
</section>
<div class="rule"><b>This page is about credits, which every member earns.</b> POL, the crypto the contract pays to your wallet when your referrals buy packages, is separate: activate with the $20 starter package and switch on payouts, and level 1 pays 50 percent of every package your directs buy.</div>
<div class="rule"><b>One credit is one cent of ad delivery.</b> Credits are not money and cannot be withdrawn. They buy impressions, clicks and visits for your own campaigns across InstantAdPay and the partner network. Payouts in POL come only from packages people in your line buy.</div>
<h2>1. The daily set</h2>
<p>Earn credits &rsaquo; Watch ads. Five ads a day. Each one opens full screen, a 10-second countdown runs while you look, you pass a quick click-the-icon check, and you earn 1 credit. Finish all five and the Claim button appears.</p>
<h2>2. The claim streak</h2>
<p>The claim pays more the more days in a row you claim it. Miss a day and it restarts at day 1.</p>
<table>
<tr><th>Consecutive day</th><th>Claim pays</th></tr>
<tr><td>Day 1</td><td>5 credits</td></tr>
<tr><td>Day 2</td><td>7 credits</td></tr>
<tr><td>Day 3 and on</td><td>10 credits</td></tr>
<tr><td>Every 7th day in a row</td><td>25 credits</td></tr>
</table>
<p>The hint under the set always tells you which day you are on and what tomorrow's claim pays. Days are counted in UTC, so the set resets at 7 PM Central.</p>
<h2>3. After the set: verified visits</h2>
<p>When the set is claimed, the done screen offers verified visits: up to 20 a day, 1 credit each. You open a member's site in a new tab, stay for the dwell, and the visit counts. Each visit is unique per site per day, so it is 20 different sites, not one site 20 times.</p>
<h2>4. Videos and inbox ads</h2>
<ul>
<li><b>Videos.</b> Earn credits &rsaquo; Watch videos. You are credited only when the video plays to the end. Up to 6 a day, and the reward depends on the video's length.</li>
<li><b>Inbox solo ads.</b> Earn credits &rsaquo; Inbox Ads. Open the message, visit the advertiser's link, then claim 2 credits. Once per message.</li>
</ul>
<h2>5. The sign-in bonus and milestones</h2>
<p>Signing in pays 5 credits a day, rising by one for each consecutive day up to 10. Milestone badges pay too: Spark when payouts are on, Surge at your first qualifying buyer, Circuit at two, Nexus at five.</p>
<h2>6. Now spend it</h2>
<p>Credits sitting in your balance do nothing. Campaigns &rsaquo; New campaign: pick a banner or a text ad, give it a name and a budget in credits, point it at your own invite link or wall, and launch. Banner and text ads also push out to the partner network, so a 100-credit campaign is a hundred cents of real delivery. The done screen has a one-tap button for this after every claim.</p>
<p>Two things to know: a campaign reserves its whole budget the moment you start it, so your available balance drops right away and never surprises you later, and login ads are the one format that needs purchased credits.</p>
<h2>7. The other earning: POL paid to your wallet</h2>
<p>Everything above is about <b>credits</b>, the currency that runs your advertising. The second kind of earning is <b>POL</b>, real money sent to your own wallet, and it comes from one place: ad packages bought by people in your line.</p>
<p>When anyone buys a package, the smart contract splits the price in the same transaction: <b>50%</b> to the buyer's sponsor (level 1), <b>20%</b> to the sponsor's sponsor (level 2), <b>10%</b> to the one above that (level 3), and 20% to the platform. There is no balance to withdraw and no request to make. The POL lands in the wallet on your account before the buyer's page has finished refreshing, and every payout carries a link you can open on Polygon.</p>
<h3>What has to be true for a share to reach you</h3>
<ul>
<li><b>Payouts are switched on.</b> Wallet tab: link your wallet and switch on payouts, which puts your member number on the contract. Until then a share meant for you passes up to the next payable person above you, and it is never paid to you later.</li>
<li><b>Level 1 pays from the moment payouts are on.</b> Every direct referral's package pays you 50%, whatever the size.</li>
<li><b>Level 2 opens at two qualifying buyers, level 3 at five.</b> A qualifying buyer is a direct referral who bought a package of $20 or more. Qualification never expires and cannot be bought. It is counted at the block the purchase happens in, so a buy that lands forty minutes before you qualify is passed up, not held.</li>
<li><b>Passed-up shares go to the next qualified person above.</b> That is why the people who qualify early collect what the people below them are not yet set up to receive.</li>
</ul>
<h3>Who is your sponsor</h3>
<p>The invite link you opened most recently before creating your account sets your sponsor, and it locks the moment the account exists. Linked positions from Qualified Start count toward your badges, and their purchases pay your main position at level 1.</p>
<h3>Where to see it</h3>
<p><a href="/my#earnings">Earnings</a> shows three cards: payouts sent to your wallet, referral events in your line, and your purchases, every row with its Polygon link. If a share you expected is missing, use <b>Trace a payment</b> on that tab: it shows, purchase by purchase, who was paid at each level and why a level was skipped. The usual answers are not yet qualified at that block, a Qualified Start position buying under its own main wallet, or payouts not switched on. The <a href="/ledger">live ledger</a> shows the whole network's payouts as they happen.</p>
<p class="muted small" style="margin-top:30px">No income is guaranteed. Results depend on your effort. Cryptocurrency involves risk of loss. InstantAdPay sells advertising; it is not an investment.</p>
<footer>
<div>InstantAdPay · <a href="/my#earn">Earn credits</a> · <a href="/my#campaigns">Campaigns</a> · <a href="/my#training">back to Training</a></div>
<div class="small">Advertising services with a performance referral program. Not an investment product; no income guarantees.</div>
</footer>
</div>
<script src="/assets/common.js?v=20260923b"></script><script src="/assets/welcome.js?v=20260923b"></script>
</body>
</html>
+503 -503
View File
File diff suppressed because it is too large Load Diff
+163 -163
View File
@@ -1,163 +1,163 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="robots" content="noindex,follow">
<title>You're invited | InstantAdPay</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Sora:wght@600;700;800&display=swap">
<link rel="icon" type="image/png" href="/logo-icon.png">
<link rel="stylesheet" href="/assets/site.css?v=20260910h">
<style>
.jn-nav{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;padding:16px 0}
.jn-nav>a{white-space:nowrap;flex:0 0 auto;padding-top:8px}
.jn-nav .logo-wrap{min-width:0}
@media (max-width:480px){.jn-nav .byline{white-space:normal}}
.jn-hero{padding:14px 0 4px;text-align:left}
.jn-brand{font-family:var(--disp);font-weight:800;font-size:20px;margin:0 0 4px;color:var(--ink)}
.jn-brand em{font-style:normal;color:var(--mint)}
.jn-brand span{font-weight:500;font-size:14px;color:var(--muted)}
.jn-strip{margin-top:22px}
.jn-strip .jn-chips{margin:0}
.jn-hero h1{font-size:clamp(26px,3.6vw,40px);line-height:1.08;margin:4px 0 8px;max-width:760px;text-align:left;letter-spacing:-.015em}
.jn-hero h1 em{font-style:normal;color:var(--mint)}
.jn-hero p.lead{margin:0 0 12px;text-align:left;max-width:620px;font-size:15.5px}
.jn-grid{display:grid;grid-template-columns:1.15fr .85fr;gap:22px;align-items:start;margin-top:4px}
#jnVideo{width:100%;aspect-ratio:16/9;display:block;border-radius:16px;border:1px solid var(--line-strong);background:#000}
/* angle pages (?v=) are squeeze pages: hook, video, one call to action. The full page is for the plain link. */
body.squeeze .jn-hero{max-width:720px;margin:0 auto;text-align:center;padding-top:6px}
body.squeeze .jn-hero h1,body.squeeze .jn-hero p.lead{text-align:center;margin-left:auto;margin-right:auto}
body.squeeze .jn-hero h1{font-size:clamp(30px,4.4vw,46px)}
body.squeeze .jn-spon,body.squeeze .jn-brand{justify-content:center}
body.squeeze .jn-grid{display:flex;flex-direction:column;max-width:720px;margin:0 auto;gap:18px}
body.squeeze .jn-grid>div:first-child>p{display:none}
body.squeeze .jn-cap{position:static;box-shadow:0 0 80px rgba(67,232,195,.16)}
body.squeeze .jn-cap h3{font-size:22px}
body.squeeze #jnMock,body.squeeze .jn-strip,body.squeeze .jn-full{display:none}
body.squeeze .jn-points{max-width:720px;margin:4px auto 0}
body.squeeze .jn-foot{margin-top:28px}
.jn-points{list-style:none;margin:14px 0 0;padding:0;display:flex;flex-direction:column;gap:10px}
.jn-points li{position:relative;padding-left:26px;font-size:15px;line-height:1.45}
.jn-points li::before{content:"✓";position:absolute;left:0;top:0;color:var(--mint);font-weight:800}
@media(max-width:860px){.jn-grid{grid-template-columns:1fr}}
.jn-cap{border-color:var(--mint);box-shadow:0 0 60px rgba(67,232,195,.12);position:sticky;top:18px}
@media(max-width:860px){.jn-cap{position:static}}
.jn-grid>div:first-child .mockup{margin:0}
.jn-cap h3{margin:0 0 6px}
.jn-cap input{width:100%}
.jn-cap .btn{width:100%;text-align:center}
.jn-chips{display:flex;gap:8px;flex-wrap:wrap;margin:0 0 18px}
.jn-chips span{border:1px solid var(--line-strong);border-radius:999px;padding:6px 14px;font-size:13px;color:var(--muted)}
.jn-chips span b{color:var(--mint);font-weight:700}
.jn-spon{display:flex;align-items:center;gap:10px;margin:0 0 6px}
.jn-spon img{width:34px;height:34px;border-radius:50%;object-fit:cover;border:1px solid var(--line-strong)}
.jn-full{margin-top:26px}
.jn-h{display:flex;justify-content:space-between;align-items:baseline;gap:16px;flex-wrap:wrap;margin:0 0 14px}
.jn-h h2{font-size:26px;margin:0}
.jn-h p{margin:0;font-size:14.5px}
.jn-steps{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}
.jn-steps .card h3{font-size:19px;margin:8px 0 8px;min-height:2.4em}
.jn-steps .card p{margin:0}
@media(max-width:700px){.jn-steps{grid-template-columns:1fr}}
.jn-steps .card{margin:0}
.jn-steps .n{font-family:var(--mono);color:var(--mint);font-size:12px;letter-spacing:.1em}
.jn-ladder{display:grid;grid-template-columns:repeat(5,1fr);gap:12px}
@media(max-width:900px){.jn-ladder{grid-template-columns:repeat(3,1fr)}}
@media(max-width:560px){.jn-ladder{grid-template-columns:repeat(2,1fr)}}
.jn-pk{border:1px solid var(--line);border-radius:12px;padding:14px;text-align:center;background:var(--panel)}
.jn-pk .p{font-family:var(--disp);font-size:26px;font-weight:800}
.jn-pk .c{color:var(--mint);font-weight:700;font-size:13.5px}
.jn-pk .n{color:var(--muted);font-size:11.5px;text-transform:uppercase;letter-spacing:.1em}
.jn-foot{color:var(--muted);font-size:13px;border-top:1px solid var(--line);margin-top:40px;padding:22px 0 50px}
.jn-err{color:var(--bad)}
.jn-spon.cobrand{border:1px solid rgba(67,232,195,.4);border-radius:14px;padding:10px 14px;margin-bottom:12px}.jn-spon.cobrand img{width:56px;height:56px;border-radius:50%}.jn-bio{display:block;margin-top:4px;color:var(--ink);font-size:14px;max-width:60ch}
</style>
</head>
<body>
<div class="wrap">
<div class="jn-nav">
<span class="logo-wrap"><a href="/"><img src="/logo.png" alt="InstantAdPay" style="height:34px;display:block"></a><span class="byline">Brought to you by the <b>Crypto Team Build Network</b></span></span>
<a class="small muted" href="/my">Already a member? Sign in</a>
</div>
<section class="jn-hero">
<div class="jn-spon" id="jnSpon" hidden><img id="jnSponImg" alt="" hidden><span class="small muted">Personal invitation from <b id="jnSponName" style="color:var(--mint)"></b><br><span id="jnSponBio" class="jn-bio" hidden></span></span></div>
<p class="jn-brand">Instant<em>AdPay</em> <span id="jnEyebrow">· Advertise and earn on Polygon</span></p>
<p class="jn-hello" id="jnHello" hidden style="margin:8px 0 12px;padding:10px 14px;border:1px solid var(--mint);border-radius:12px;color:var(--mint);font-weight:700"></p>
<h1 id="jnHead">Advertise and earn.<br><em>Paid on-chain, instantly.</em></h1>
<p class="lead" id="jnLead">Every ad package splits to real wallets in the same transaction it sells. No pending payouts, no withdraw button, and every payment is public.</p>
</section>
<div class="jn-grid">
<div>
<div id="jnAngle" hidden>
<video id="jnVideo" controls playsinline preload="metadata"></video>
</div>
<div id="jnMock">
<div class="mockup" aria-label="worked example of one purchase">
<div class="bar"><i></i><i></i><i></i><span class="addr">instantadpay.com/ledger · worked example</span></div>
<div class="body">
<div class="mrow"><span>🧾 member #7 bought package #2 ($20.00)</span><span>paid</span></div>
<div class="mrow"><span>💸 level 1 payout → member #3 (50%)</span><span>same block</span></div>
<div class="mrow"><span>💸 level 2 payout → member #2 (20%)</span><span>same block</span></div>
<div class="mrow"><span>💸 level 3 payout → member #1 (10%)</span><span>same block</span></div>
<div class="mrow dim"><span>🏛 platform fee settled (20%)</span><span>same block</span></div>
<div class="mrow dim"><span>⭐ member #3 now has 2 qualifying buyers</span><span>level 2 ✓</span></div>
</div>
</div>
</div>
<p class="small muted" style="margin:10px 0 0">One purchase, one transaction, four payments. <a href="/ledger" target="_blank" rel="noopener">Open the real ledger →</a> <span id="jnStats"></span></p>
</div>
<div class="card jn-cap" id="jnCap">
<h3 id="jnCapH">Join free</h3>
<p class="muted small" style="margin:0 0 12px" id="jnCapSub">Type your email and we send a 6-digit code. No password, no wallet needed today.</p>
<p><input id="jnEmail" type="email" placeholder="Your email" autocomplete="email"></p>
<input id="jnWebsite" class="hp-field" type="text" name="hp_field_x9" tabindex="-1" autocomplete="off" aria-hidden="true">
<div id="jnCheck" hidden></div>
<p id="jnCodeRow" hidden><input id="jnCode" inputmode="numeric" placeholder="6-digit code from your inbox"></p>
<p id="jnUnder" class="small muted" hidden style="margin:-4px 0 12px"></p>
<label class="small muted" style="display:flex;gap:8px;align-items:flex-start;margin:0 0 12px;cursor:pointer">
<input type="checkbox" id="jnNews" checked style="margin-top:3px;width:auto">
<span>Send me the getting-started emails (a few short ones over the first week). Unsubscribe any time.</span>
</label>
<p id="jnErr" class="small jn-err" hidden></p>
<button class="btn" id="jnSend" type="button">Email me a code</button>
<button class="btn" id="jnVerify" type="button" hidden>Create my free account</button>
<button class="btn sec small" id="jnResend" type="button" hidden style="margin-top:8px">Send a fresh code</button>
<p class="small muted" style="margin:14px 0 0">Advertising, not investing. No income is guaranteed; results depend on your effort. Crypto carries risk of loss.</p>
</div>
<ul class="jn-points" id="jnPoints" hidden></ul>
</div>
<div class="jn-strip">
<div class="jn-chips">
<span><b>Paid in POL</b>, Polygon's own coin, to your wallet</span>
<span><b>Same transaction</b> payouts</span>
<span><b>Public ledger</b> on Polygon</span>
<span><b>Free</b> to join by email</span>
</div>
<p class="small muted" style="margin:10px 0 0">The one crypto here is <b style="color:var(--ink)">POL on the Polygon network</b>: packages are paid in POL and every payout arrives as POL in your own wallet. Any Polygon wallet works (MetaMask, SafePal, Phantom, Coinbase Wallet). Never held crypto? Buy POL with a card inside the member area.</p>
</div>
<section class="jn-full">
<div class="jn-h"><h2>How it works</h2><p class="muted">Three steps. The first one takes a minute and costs nothing.</p></div>
<div class="jn-steps">
<div class="card"><div class="n">STEP 1</div><h3>Join free by email</h3><p class="muted small">A 6-digit code, no password. You get an invite link and welcome credits to try real ads.</p></div>
<div class="card"><div class="n">STEP 2</div><h3>Advertise or earn</h3><p class="muted small">Seven ad formats. View ads to earn credits, or buy a package from $5 when you want reach.</p></div>
<div class="card"><div class="n">STEP 3</div><h3>Get paid in the same transaction</h3><p class="muted small">Activate with the $20 starter package and switch on payouts, and anyone who buys through your link pays you 50 percent, on-chain, the moment it happens.</p></div>
</div>
</section>
<section class="jn-full">
<div class="jn-h"><h2>The packages</h2><p class="muted">Priced in dollars, settled in POL at the live rate. One credit is one cent of ad delivery.</p></div>
<div class="jn-ladder" id="jnLadder"></div>
<p class="small muted" style="margin:14px 0 0;text-align:center">Every package pays 50 / 20 / 10 up the line the moment it sells, on a public ledger. <a href="#jnCap">Join free</a> and look around first.</p>
</section>
<div class="jn-foot">
InstantAdPay · <a href="/contract">Contract</a> · <a href="/terms">Terms</a> · <a href="/privacy">Privacy</a> · <a href="/disclaimer">Disclaimer</a>
</div>
</div>
<script src="/assets/common.js?v=20260923b"></script>
<script src="/assets/join.js?v=20260914a"></script>
</body>
</html>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="robots" content="noindex,follow">
<title>You're invited | InstantAdPay</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Sora:wght@600;700;800&display=swap">
<link rel="icon" type="image/png" href="/logo-icon.png">
<link rel="stylesheet" href="/assets/site.css?v=20260910h">
<style>
.jn-nav{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;padding:16px 0}
.jn-nav>a{white-space:nowrap;flex:0 0 auto;padding-top:8px}
.jn-nav .logo-wrap{min-width:0}
@media (max-width:480px){.jn-nav .byline{white-space:normal}}
.jn-hero{padding:14px 0 4px;text-align:left}
.jn-brand{font-family:var(--disp);font-weight:800;font-size:20px;margin:0 0 4px;color:var(--ink)}
.jn-brand em{font-style:normal;color:var(--mint)}
.jn-brand span{font-weight:500;font-size:14px;color:var(--muted)}
.jn-strip{margin-top:22px}
.jn-strip .jn-chips{margin:0}
.jn-hero h1{font-size:clamp(26px,3.6vw,40px);line-height:1.08;margin:4px 0 8px;max-width:760px;text-align:left;letter-spacing:-.015em}
.jn-hero h1 em{font-style:normal;color:var(--mint)}
.jn-hero p.lead{margin:0 0 12px;text-align:left;max-width:620px;font-size:15.5px}
.jn-grid{display:grid;grid-template-columns:1.15fr .85fr;gap:22px;align-items:start;margin-top:4px}
#jnVideo{width:100%;aspect-ratio:16/9;display:block;border-radius:16px;border:1px solid var(--line-strong);background:#000}
/* angle pages (?v=) are squeeze pages: hook, video, one call to action. The full page is for the plain link. */
body.squeeze .jn-hero{max-width:720px;margin:0 auto;text-align:center;padding-top:6px}
body.squeeze .jn-hero h1,body.squeeze .jn-hero p.lead{text-align:center;margin-left:auto;margin-right:auto}
body.squeeze .jn-hero h1{font-size:clamp(30px,4.4vw,46px)}
body.squeeze .jn-spon,body.squeeze .jn-brand{justify-content:center}
body.squeeze .jn-grid{display:flex;flex-direction:column;max-width:720px;margin:0 auto;gap:18px}
body.squeeze .jn-grid>div:first-child>p{display:none}
body.squeeze .jn-cap{position:static;box-shadow:0 0 80px rgba(67,232,195,.16)}
body.squeeze .jn-cap h3{font-size:22px}
body.squeeze #jnMock,body.squeeze .jn-strip,body.squeeze .jn-full{display:none}
body.squeeze .jn-points{max-width:720px;margin:4px auto 0}
body.squeeze .jn-foot{margin-top:28px}
.jn-points{list-style:none;margin:14px 0 0;padding:0;display:flex;flex-direction:column;gap:10px}
.jn-points li{position:relative;padding-left:26px;font-size:15px;line-height:1.45}
.jn-points li::before{content:"✓";position:absolute;left:0;top:0;color:var(--mint);font-weight:800}
@media(max-width:860px){.jn-grid{grid-template-columns:1fr}}
.jn-cap{border-color:var(--mint);box-shadow:0 0 60px rgba(67,232,195,.12);position:sticky;top:18px}
@media(max-width:860px){.jn-cap{position:static}}
.jn-grid>div:first-child .mockup{margin:0}
.jn-cap h3{margin:0 0 6px}
.jn-cap input{width:100%}
.jn-cap .btn{width:100%;text-align:center}
.jn-chips{display:flex;gap:8px;flex-wrap:wrap;margin:0 0 18px}
.jn-chips span{border:1px solid var(--line-strong);border-radius:999px;padding:6px 14px;font-size:13px;color:var(--muted)}
.jn-chips span b{color:var(--mint);font-weight:700}
.jn-spon{display:flex;align-items:center;gap:10px;margin:0 0 6px}
.jn-spon img{width:34px;height:34px;border-radius:50%;object-fit:cover;border:1px solid var(--line-strong)}
.jn-full{margin-top:26px}
.jn-h{display:flex;justify-content:space-between;align-items:baseline;gap:16px;flex-wrap:wrap;margin:0 0 14px}
.jn-h h2{font-size:26px;margin:0}
.jn-h p{margin:0;font-size:14.5px}
.jn-steps{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}
.jn-steps .card h3{font-size:19px;margin:8px 0 8px;min-height:2.4em}
.jn-steps .card p{margin:0}
@media(max-width:700px){.jn-steps{grid-template-columns:1fr}}
.jn-steps .card{margin:0}
.jn-steps .n{font-family:var(--mono);color:var(--mint);font-size:12px;letter-spacing:.1em}
.jn-ladder{display:grid;grid-template-columns:repeat(5,1fr);gap:12px}
@media(max-width:900px){.jn-ladder{grid-template-columns:repeat(3,1fr)}}
@media(max-width:560px){.jn-ladder{grid-template-columns:repeat(2,1fr)}}
.jn-pk{border:1px solid var(--line);border-radius:12px;padding:14px;text-align:center;background:var(--panel)}
.jn-pk .p{font-family:var(--disp);font-size:26px;font-weight:800}
.jn-pk .c{color:var(--mint);font-weight:700;font-size:13.5px}
.jn-pk .n{color:var(--muted);font-size:11.5px;text-transform:uppercase;letter-spacing:.1em}
.jn-foot{color:var(--muted);font-size:13px;border-top:1px solid var(--line);margin-top:40px;padding:22px 0 50px}
.jn-err{color:var(--bad)}
.jn-spon.cobrand{border:1px solid rgba(67,232,195,.4);border-radius:14px;padding:10px 14px;margin-bottom:12px}.jn-spon.cobrand img{width:56px;height:56px;border-radius:50%}.jn-bio{display:block;margin-top:4px;color:var(--ink);font-size:14px;max-width:60ch}
</style>
</head>
<body>
<div class="wrap">
<div class="jn-nav">
<span class="logo-wrap"><a href="/"><img src="/logo.png" alt="InstantAdPay" style="height:34px;display:block"></a><span class="byline">Brought to you by the <b>Crypto Team Build Network</b></span></span>
<a class="small muted" href="/my">Already a member? Sign in</a>
</div>
<section class="jn-hero">
<div class="jn-spon" id="jnSpon" hidden><img id="jnSponImg" alt="" hidden><span class="small muted">Personal invitation from <b id="jnSponName" style="color:var(--mint)"></b><br><span id="jnSponBio" class="jn-bio" hidden></span></span></div>
<p class="jn-brand">Instant<em>AdPay</em> <span id="jnEyebrow">· Advertise and earn on Polygon</span></p>
<p class="jn-hello" id="jnHello" hidden style="margin:8px 0 12px;padding:10px 14px;border:1px solid var(--mint);border-radius:12px;color:var(--mint);font-weight:700"></p>
<h1 id="jnHead">Advertise and earn.<br><em>Paid on-chain, instantly.</em></h1>
<p class="lead" id="jnLead">Every ad package splits to real wallets in the same transaction it sells. No pending payouts, no withdraw button, and every payment is public.</p>
</section>
<div class="jn-grid">
<div>
<div id="jnAngle" hidden>
<video id="jnVideo" controls playsinline preload="metadata"></video>
</div>
<div id="jnMock">
<div class="mockup" aria-label="worked example of one purchase">
<div class="bar"><i></i><i></i><i></i><span class="addr">instantadpay.com/ledger · worked example</span></div>
<div class="body">
<div class="mrow"><span>🧾 member #7 bought package #2 ($20.00)</span><span>paid</span></div>
<div class="mrow"><span>💸 level 1 payout → member #3 (50%)</span><span>same block</span></div>
<div class="mrow"><span>💸 level 2 payout → member #2 (20%)</span><span>same block</span></div>
<div class="mrow"><span>💸 level 3 payout → member #1 (10%)</span><span>same block</span></div>
<div class="mrow dim"><span>🏛 platform fee settled (20%)</span><span>same block</span></div>
<div class="mrow dim"><span>⭐ member #3 now has 2 qualifying buyers</span><span>level 2 ✓</span></div>
</div>
</div>
</div>
<p class="small muted" style="margin:10px 0 0">One purchase, one transaction, four payments. <a href="/ledger" target="_blank" rel="noopener">Open the real ledger →</a> <span id="jnStats"></span></p>
</div>
<div class="card jn-cap" id="jnCap">
<h3 id="jnCapH">Join free</h3>
<p class="muted small" style="margin:0 0 12px" id="jnCapSub">Type your email and we send a 6-digit code. No password, no wallet needed today.</p>
<p><input id="jnEmail" type="email" placeholder="Your email" autocomplete="email"></p>
<input id="jnWebsite" class="hp-field" type="text" name="hp_field_x9" tabindex="-1" autocomplete="off" aria-hidden="true">
<div id="jnCheck" hidden></div>
<p id="jnCodeRow" hidden><input id="jnCode" inputmode="numeric" placeholder="6-digit code from your inbox"></p>
<p id="jnUnder" class="small muted" hidden style="margin:-4px 0 12px"></p>
<label class="small muted" style="display:flex;gap:8px;align-items:flex-start;margin:0 0 12px;cursor:pointer">
<input type="checkbox" id="jnNews" checked style="margin-top:3px;width:auto">
<span>Send me the getting-started emails (a few short ones over the first week). Unsubscribe any time.</span>
</label>
<p id="jnErr" class="small jn-err" hidden></p>
<button class="btn" id="jnSend" type="button">Email me a code</button>
<button class="btn" id="jnVerify" type="button" hidden>Create my free account</button>
<button class="btn sec small" id="jnResend" type="button" hidden style="margin-top:8px">Send a fresh code</button>
<p class="small muted" style="margin:14px 0 0">Advertising, not investing. No income is guaranteed; results depend on your effort. Crypto carries risk of loss.</p>
</div>
<ul class="jn-points" id="jnPoints" hidden></ul>
</div>
<div class="jn-strip">
<div class="jn-chips">
<span><b>Paid in POL</b>, Polygon's own coin, to your wallet</span>
<span><b>Same transaction</b> payouts</span>
<span><b>Public ledger</b> on Polygon</span>
<span><b>Free</b> to join by email</span>
</div>
<p class="small muted" style="margin:10px 0 0">The one crypto here is <b style="color:var(--ink)">POL on the Polygon network</b>: packages are paid in POL and every payout arrives as POL in your own wallet. Any Polygon wallet works (MetaMask, SafePal, Phantom, Coinbase Wallet). Never held crypto? Buy POL with a card inside the member area.</p>
</div>
<section class="jn-full">
<div class="jn-h"><h2>How it works</h2><p class="muted">Three steps. The first one takes a minute and costs nothing.</p></div>
<div class="jn-steps">
<div class="card"><div class="n">STEP 1</div><h3>Join free by email</h3><p class="muted small">A 6-digit code, no password. You get an invite link and welcome credits to try real ads.</p></div>
<div class="card"><div class="n">STEP 2</div><h3>Advertise or earn</h3><p class="muted small">Seven ad formats. View ads to earn credits, or buy a package from $5 when you want reach.</p></div>
<div class="card"><div class="n">STEP 3</div><h3>Get paid in the same transaction</h3><p class="muted small">Activate with the $20 starter package and switch on payouts, and anyone who buys through your link pays you 50 percent, on-chain, the moment it happens.</p></div>
</div>
</section>
<section class="jn-full">
<div class="jn-h"><h2>The packages</h2><p class="muted">Priced in dollars, settled in POL at the live rate. One credit is one cent of ad delivery.</p></div>
<div class="jn-ladder" id="jnLadder"></div>
<p class="small muted" style="margin:14px 0 0;text-align:center">Every package pays 50 / 20 / 10 up the line the moment it sells, on a public ledger. <a href="#jnCap">Join free</a> and look around first.</p>
</section>
<div class="jn-foot">
InstantAdPay · <a href="/contract">Contract</a> · <a href="/terms">Terms</a> · <a href="/privacy">Privacy</a> · <a href="/disclaimer">Disclaimer</a>
</div>
</div>
<script src="/assets/common.js?v=20260923b"></script><script src="/assets/welcome.js?v=20260923b"></script>
<script src="/assets/join.js?v=20260914a"></script>
</body>
</html>
+110 -110
View File
@@ -1,110 +1,110 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Founding week checklist | InstantAdPay</title>
<meta name="description" content="The eight things a leader gets done before launch, and why the order matters. Member training.">
<meta name="robots" content="noindex">
<meta name="theme-color" content="#043b2f">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Sora:wght@600;700;800&display=swap">
<link rel="icon" type="image/png" href="/logo-icon.png">
<link rel="stylesheet" href="/assets/site.css?v=20260911c">
<style>
.lw-rule{border-left:4px solid #f2c94c;background:rgba(242,201,76,.08);padding:16px 20px;border-radius:0 12px 12px 0;margin:0 0 24px}
.lw-rule b{font-family:var(--disp);font-size:17px;display:block;margin-bottom:6px}
.lw-top{display:flex;justify-content:space-between;align-items:center;gap:16px;flex-wrap:wrap;margin:0 0 18px}
.lw-count{font-family:var(--disp);font-weight:800;font-size:15px}
.lw-count b{color:var(--mint);font-size:22px}
.lw-bar{height:10px;border-radius:99px;background:rgba(255,255,255,.06);overflow:hidden;margin:8px 0 0;width:100%}
.lw-bar i{display:block;height:100%;background:linear-gradient(90deg,var(--mint),#9ff2dc);width:0;transition:width .4s}
.lw-when{font-family:var(--mono);font-size:12px;color:var(--muted)}
.lw-when b{color:var(--ink);font-family:var(--disp);font-size:18px;display:block}
.chk{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:10px}
.chk li{display:grid;grid-template-columns:34px 1fr auto;gap:14px;align-items:start;background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:14px 16px}
.chk li.done{border-color:rgba(67,232,195,.45)}
.chk .box{width:30px;height:30px;border-radius:9px;border:2px solid var(--line-strong);display:flex;align-items:center;justify-content:center;font-weight:800;color:var(--mint);font-size:18px}
.chk li.done .box{background:rgba(67,232,195,.14);border-color:var(--mint)}
.chk h3{margin:0 0 3px;font-size:16px}
.chk p{margin:0;color:var(--muted);font-size:14px}
.chk .why{margin-top:6px;font-size:13px;color:var(--ink)}
.chk .act{white-space:nowrap}
.chk .act .btn{margin-top:0}
.days{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}
.days>div{background:rgba(4,8,7,.45);border:1px solid var(--line);border-radius:10px;padding:12px 14px;font-size:14px}
.days .k{font-family:var(--disp);font-weight:800;color:var(--mint);margin-bottom:6px}
.days ul{margin:0;padding-left:18px}
blockquote{margin:0 0 10px;background:rgba(4,8,7,.45);border:1px solid var(--line);border-radius:10px;padding:12px 16px;color:var(--muted)}
blockquote span{display:block;font-family:var(--mono);font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--mint);margin-bottom:6px}
.swipe{margin:0 0 12px;background:rgba(4,8,7,.45);border:1px solid var(--line);border-radius:10px;padding:12px 16px}
.swipe .cap{font-family:var(--mono);font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--mint);margin-bottom:6px;display:flex;justify-content:space-between;gap:10px;align-items:center}
.swipe .subj{font-weight:700;margin:0 0 8px}
.swipe pre{white-space:pre-wrap;font:inherit;color:var(--muted);margin:0;line-height:1.5}
.swipe .btn{font-size:12px;padding:5px 10px}
.lg-imgs{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin:0 0 14px} .lg-imgs figure{margin:0} .lg-imgs img{width:100%;height:auto;border-radius:10px;border:1px solid var(--line)} .lg-imgs figcaption{font-size:12px;color:var(--muted);margin-top:6px} .lg-imgs a{color:var(--mint)}
@media (max-width:640px){.lg-imgs{grid-template-columns:1fr}}
h2{margin:34px 0 10px;font-size:26px}
#gate{display:none}
@media (max-width:720px){.days{grid-template-columns:1fr 1fr}.chk li{grid-template-columns:34px 1fr}.chk .act{grid-column:2}}
@media print{body{background:#fff;color:#000}.jn-nav,nav,footer,.act,#printBtn{display:none!important}.chk li{border-color:#999}.chk p,.chk .why{color:#000}}
</style>
</head>
<body>
<div class="wrap">
<section class="hero" style="padding:70px 0 20px">
<p class="eyebrow">Leaders · founding week</p>
<h1>Eight things before <em>launch day</em>.</h1>
<p class="lead">Get these done this week, in this order, and your first commissions land in your wallet instead of climbing past you. Everything here reads from your live account.</p>
</section>
<div class="card" id="gate"><h3>Members only</h3><p class="muted small">Sign in to your member area to open the checklist. <a href="/my">Sign in</a></p></div>
<div id="body">
<div class="lw-top">
<div style="flex:1 1 300px"><div class="lw-count"><b id="lwDone">0</b> of 8 ready</div><div class="lw-bar"><i id="lwBar"></i></div></div>
<div class="lw-when" id="lwWhen" hidden>Launch<b id="lwWhenAt"></b><span id="lwWhenIn"></span></div>
<button class="btn small sec" id="printBtn" type="button">Print</button>
</div>
<div class="lw-rule">
<b>The one rule that makes this week matter: unqualified levels pass up.</b>
Level 2 pays you only after two of your people have bought a $20 or more package. Level 3 only after five. If your team's team starts buying before you are qualified, those 20% and 10% payments climb to the next qualified member above you, or to the platform, and they never come back. Qualify first, then open the doors.
</div>
<ol class="chk" id="chk"></ol>
<h2>The week, day by day</h2>
<div class="days">
<div><div class="k">Day 1</div><ul><li>Items 1 to 3 done in one sitting.</li><li>Decide your play, and whether you are going for level 2 or all three.</li></ul></div>
<div><div class="k">Days 2 to 3</div><ul><li>Qualify: two real buyers, or Qualified Start. Leaders: go to five and open level 3.</li><li>Line banner uploaded.</li></ul></div>
<div><div class="k">Days 4 to 6</div><ul><li>Place your first two personally.</li><li>Walk them through items 1 to 3 on their accounts.</li></ul></div>
<div><div class="k">Launch day</div><ul><li>Everyone releases links at the same time.</li><li>Watch the ledger and the Telegram proof feed fill.</li></ul></div>
</div>
<h2>What to send your two this week</h2>
<blockquote><span>Text or DM · before launch</span>I'm bringing a small group in early on something before it opens publicly next week. Free to join, real advertising, and every payment lands in your own wallet the second it happens. I want you positioned before the doors open. Set up takes five minutes: <span data-link>your link</span></blockquote>
<blockquote><span>Text or DM · after they join</span>Three quick things before launch so your first commission lands with you and not past you: pick your username, link your wallet, switch on payouts. All on the Wallet and Profile tabs. Then send me your two names and we'll get them placed.</blockquote>
<h2 id="share">Launch graphics and posts</h2>
<p class="small muted" style="margin:0 0 10px">Two images, no text on them but the headline, so they work anywhere. Post one with the day's line below it; your link and the FOUNDER code are already in each line.</p>
<div class="lg-imgs">
<figure><img src="/banners/iap-launch-doors-1200x630.jpg" alt="Doors open Monday" loading="lazy"><figcaption>Wide, 1200x630 · for X, Facebook, LinkedIn, link previews <a href="/banners/iap-launch-doors-1200x630.jpg" download>Download</a></figcaption></figure>
<figure><img src="/banners/iap-launch-doors-1080x1080.jpg" alt="Doors open Monday" loading="lazy"><figcaption>Square, 1080x1080 · for Instagram, Telegram, WhatsApp <a href="/banners/iap-launch-doors-1080x1080.jpg" download>Download</a></figcaption></figure>
</div>
<div id="postList"></div>
<h2 id="swipes">Launch week swipes: four emails for your list</h2>
<p class="small muted" style="margin:0 0 10px">Send one a day to your own list or contacts, in this order. Your invite link and the FOUNDER code (500 free credits for anyone who joins before Monday 9 AM Central) are already filled in. Copy, paste, send from your own email. Edit anything you like.</p>
<div id="swipeList"></div>
<p class="small muted" style="margin:26px 0 0">No income is guaranteed. Results depend on your effort. Crypto carries risk of loss. InstantAdPay sells advertising; it is not an investment.</p>
</div>
<footer>
<div>InstantAdPay · <a href="/my#training">back to Training</a> · <a href="/plays">team-building plays</a> · <a href="/wallets">wallets and buying POL</a></div>
<div class="small">Advertising services with a performance referral program. Not an investment product; no income guarantees.</div>
</footer>
</div>
<script src="/assets/common.js?v=20260923b"></script>
<script src="/assets/launch.js?v=20260915b"></script>
</body>
</html>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Founding week checklist | InstantAdPay</title>
<meta name="description" content="The eight things a leader gets done before launch, and why the order matters. Member training.">
<meta name="robots" content="noindex">
<meta name="theme-color" content="#043b2f">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Sora:wght@600;700;800&display=swap">
<link rel="icon" type="image/png" href="/logo-icon.png">
<link rel="stylesheet" href="/assets/site.css?v=20260911c">
<style>
.lw-rule{border-left:4px solid #f2c94c;background:rgba(242,201,76,.08);padding:16px 20px;border-radius:0 12px 12px 0;margin:0 0 24px}
.lw-rule b{font-family:var(--disp);font-size:17px;display:block;margin-bottom:6px}
.lw-top{display:flex;justify-content:space-between;align-items:center;gap:16px;flex-wrap:wrap;margin:0 0 18px}
.lw-count{font-family:var(--disp);font-weight:800;font-size:15px}
.lw-count b{color:var(--mint);font-size:22px}
.lw-bar{height:10px;border-radius:99px;background:rgba(255,255,255,.06);overflow:hidden;margin:8px 0 0;width:100%}
.lw-bar i{display:block;height:100%;background:linear-gradient(90deg,var(--mint),#9ff2dc);width:0;transition:width .4s}
.lw-when{font-family:var(--mono);font-size:12px;color:var(--muted)}
.lw-when b{color:var(--ink);font-family:var(--disp);font-size:18px;display:block}
.chk{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:10px}
.chk li{display:grid;grid-template-columns:34px 1fr auto;gap:14px;align-items:start;background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:14px 16px}
.chk li.done{border-color:rgba(67,232,195,.45)}
.chk .box{width:30px;height:30px;border-radius:9px;border:2px solid var(--line-strong);display:flex;align-items:center;justify-content:center;font-weight:800;color:var(--mint);font-size:18px}
.chk li.done .box{background:rgba(67,232,195,.14);border-color:var(--mint)}
.chk h3{margin:0 0 3px;font-size:16px}
.chk p{margin:0;color:var(--muted);font-size:14px}
.chk .why{margin-top:6px;font-size:13px;color:var(--ink)}
.chk .act{white-space:nowrap}
.chk .act .btn{margin-top:0}
.days{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}
.days>div{background:rgba(4,8,7,.45);border:1px solid var(--line);border-radius:10px;padding:12px 14px;font-size:14px}
.days .k{font-family:var(--disp);font-weight:800;color:var(--mint);margin-bottom:6px}
.days ul{margin:0;padding-left:18px}
blockquote{margin:0 0 10px;background:rgba(4,8,7,.45);border:1px solid var(--line);border-radius:10px;padding:12px 16px;color:var(--muted)}
blockquote span{display:block;font-family:var(--mono);font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--mint);margin-bottom:6px}
.swipe{margin:0 0 12px;background:rgba(4,8,7,.45);border:1px solid var(--line);border-radius:10px;padding:12px 16px}
.swipe .cap{font-family:var(--mono);font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--mint);margin-bottom:6px;display:flex;justify-content:space-between;gap:10px;align-items:center}
.swipe .subj{font-weight:700;margin:0 0 8px}
.swipe pre{white-space:pre-wrap;font:inherit;color:var(--muted);margin:0;line-height:1.5}
.swipe .btn{font-size:12px;padding:5px 10px}
.lg-imgs{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin:0 0 14px} .lg-imgs figure{margin:0} .lg-imgs img{width:100%;height:auto;border-radius:10px;border:1px solid var(--line)} .lg-imgs figcaption{font-size:12px;color:var(--muted);margin-top:6px} .lg-imgs a{color:var(--mint)}
@media (max-width:640px){.lg-imgs{grid-template-columns:1fr}}
h2{margin:34px 0 10px;font-size:26px}
#gate{display:none}
@media (max-width:720px){.days{grid-template-columns:1fr 1fr}.chk li{grid-template-columns:34px 1fr}.chk .act{grid-column:2}}
@media print{body{background:#fff;color:#000}.jn-nav,nav,footer,.act,#printBtn{display:none!important}.chk li{border-color:#999}.chk p,.chk .why{color:#000}}
</style>
</head>
<body>
<div class="wrap">
<section class="hero" style="padding:70px 0 20px">
<p class="eyebrow">Leaders · founding week</p>
<h1>Eight things before <em>launch day</em>.</h1>
<p class="lead">Get these done this week, in this order, and your first commissions land in your wallet instead of climbing past you. Everything here reads from your live account.</p>
</section>
<div class="card" id="gate"><h3>Members only</h3><p class="muted small">Sign in to your member area to open the checklist. <a href="/my">Sign in</a></p></div>
<div id="body">
<div class="lw-top">
<div style="flex:1 1 300px"><div class="lw-count"><b id="lwDone">0</b> of 8 ready</div><div class="lw-bar"><i id="lwBar"></i></div></div>
<div class="lw-when" id="lwWhen" hidden>Launch<b id="lwWhenAt"></b><span id="lwWhenIn"></span></div>
<button class="btn small sec" id="printBtn" type="button">Print</button>
</div>
<div class="lw-rule">
<b>The one rule that makes this week matter: unqualified levels pass up.</b>
Level 2 pays you only after two of your people have bought a $20 or more package. Level 3 only after five. If your team's team starts buying before you are qualified, those 20% and 10% payments climb to the next qualified member above you, or to the platform, and they never come back. Qualify first, then open the doors.
</div>
<ol class="chk" id="chk"></ol>
<h2>The week, day by day</h2>
<div class="days">
<div><div class="k">Day 1</div><ul><li>Items 1 to 3 done in one sitting.</li><li>Decide your play, and whether you are going for level 2 or all three.</li></ul></div>
<div><div class="k">Days 2 to 3</div><ul><li>Qualify: two real buyers, or Qualified Start. Leaders: go to five and open level 3.</li><li>Line banner uploaded.</li></ul></div>
<div><div class="k">Days 4 to 6</div><ul><li>Place your first two personally.</li><li>Walk them through items 1 to 3 on their accounts.</li></ul></div>
<div><div class="k">Launch day</div><ul><li>Everyone releases links at the same time.</li><li>Watch the ledger and the Telegram proof feed fill.</li></ul></div>
</div>
<h2>What to send your two this week</h2>
<blockquote><span>Text or DM · before launch</span>I'm bringing a small group in early on something before it opens publicly next week. Free to join, real advertising, and every payment lands in your own wallet the second it happens. I want you positioned before the doors open. Set up takes five minutes: <span data-link>your link</span></blockquote>
<blockquote><span>Text or DM · after they join</span>Three quick things before launch so your first commission lands with you and not past you: pick your username, link your wallet, switch on payouts. All on the Wallet and Profile tabs. Then send me your two names and we'll get them placed.</blockquote>
<h2 id="share">Launch graphics and posts</h2>
<p class="small muted" style="margin:0 0 10px">Two images, no text on them but the headline, so they work anywhere. Post one with the day's line below it; your link and the FOUNDER code are already in each line.</p>
<div class="lg-imgs">
<figure><img src="/banners/iap-launch-doors-1200x630.jpg" alt="Doors open Monday" loading="lazy"><figcaption>Wide, 1200x630 · for X, Facebook, LinkedIn, link previews <a href="/banners/iap-launch-doors-1200x630.jpg" download>Download</a></figcaption></figure>
<figure><img src="/banners/iap-launch-doors-1080x1080.jpg" alt="Doors open Monday" loading="lazy"><figcaption>Square, 1080x1080 · for Instagram, Telegram, WhatsApp <a href="/banners/iap-launch-doors-1080x1080.jpg" download>Download</a></figcaption></figure>
</div>
<div id="postList"></div>
<h2 id="swipes">Launch week swipes: four emails for your list</h2>
<p class="small muted" style="margin:0 0 10px">Send one a day to your own list or contacts, in this order. Your invite link and the FOUNDER code (500 free credits for anyone who joins before Monday 9 AM Central) are already filled in. Copy, paste, send from your own email. Edit anything you like.</p>
<div id="swipeList"></div>
<p class="small muted" style="margin:26px 0 0">No income is guaranteed. Results depend on your effort. Crypto carries risk of loss. InstantAdPay sells advertising; it is not an investment.</p>
</div>
<footer>
<div>InstantAdPay · <a href="/my#training">back to Training</a> · <a href="/plays">team-building plays</a> · <a href="/wallets">wallets and buying POL</a></div>
<div class="small">Advertising services with a performance referral program. Not an investment product; no income guarantees.</div>
</footer>
</div>
<script src="/assets/common.js?v=20260923b"></script><script src="/assets/welcome.js?v=20260923b"></script>
<script src="/assets/launch.js?v=20260915b"></script>
</body>
</html>
+47 -47
View File
@@ -1,47 +1,47 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Live ledger | InstantAdPay</title>
<meta name="description" content="Every purchase, payout, and pass-up on InstantAdPay, streamed straight from the blockchain with a verify link on every line.">
<link rel="canonical" href="https://instantadpay.com/ledger">
<meta property="og:type" content="website"><meta property="og:site_name" content="InstantAdPay">
<meta property="og:url" content="https://instantadpay.com/ledger">
<meta property="og:title" content="InstantAdPay — the live payout ledger">
<meta property="og:description" content="Watch real ad purchases split into instant on-chain payouts, live. Every line links to the raw transaction.">
<meta property="og:image" content="https://instantadpay.com/banners/iap-hero-1200x630.png">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="InstantAdPay — the live payout ledger">
<meta name="twitter:description" content="Real ad purchases splitting into instant on-chain payouts, live and verifiable.">
<meta name="twitter:image" content="https://instantadpay.com/banners/iap-hero-1200x630.png">
<meta name="theme-color" content="#043b2f">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Sora:wght@600;700;800&display=swap">
<link rel="icon" type="image/png" href="/logo-icon.png">
<link rel="stylesheet" href="/assets/site.css?v=20260910h">
</head>
<body>
<div class="wrap">
<section class="hero" style="padding-bottom:20px">
<h1>The ledger <em>does not lie</em>.</h1>
<p class="lead">This page streams every payment the contract has ever made. If it is not here,
it did not happen. Every line carries a verify link straight to the block explorer. Go click one.</p>
<p><span class="badge" id="liveBadge">connecting…</span>
<span class="small muted" id="statLine"></span></p>
</section>
<div class="card" id="adSlotBanner" hidden></div>
<div class="card" style="padding:0">
<div data-ph-slot="0" style="margin:0 0 10px"></div>
<div class="feed" id="feed"><div class="row muted">Loading recent history…</div></div>
<div class="nas-zone" style="max-width:728px;margin:22px auto 0;overflow:hidden;text-align:center"><!-- nas-ledger --><script src="https://www.networkadspace.com/showadss.php?w=728&h=90&n=1&bw=728&bh=90&c=999"></script></div>
</div>
<div class="card small" id="adSlotText" hidden></div>
<footer>
<div>InstantAdPay · <a href="/">how it works</a> · <a id="contractLink" href="#" target="_blank" rel="noopener">contract source ↗</a></div>
</footer>
</div>
<script src="/assets/common.js?v=20260923b"></script>
<script src="/assets/ledger.js?v=20260906m"></script>
<script src="https://polhunter.com/embed.js" data-slots="1" async></script>
<script src="/assets/chat.js?v=20260906m"></script>
</body>
</html>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Live ledger | InstantAdPay</title>
<meta name="description" content="Every purchase, payout, and pass-up on InstantAdPay, streamed straight from the blockchain with a verify link on every line.">
<link rel="canonical" href="https://instantadpay.com/ledger">
<meta property="og:type" content="website"><meta property="og:site_name" content="InstantAdPay">
<meta property="og:url" content="https://instantadpay.com/ledger">
<meta property="og:title" content="InstantAdPay — the live payout ledger">
<meta property="og:description" content="Watch real ad purchases split into instant on-chain payouts, live. Every line links to the raw transaction.">
<meta property="og:image" content="https://instantadpay.com/banners/iap-hero-1200x630.png">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="InstantAdPay — the live payout ledger">
<meta name="twitter:description" content="Real ad purchases splitting into instant on-chain payouts, live and verifiable.">
<meta name="twitter:image" content="https://instantadpay.com/banners/iap-hero-1200x630.png">
<meta name="theme-color" content="#043b2f">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Sora:wght@600;700;800&display=swap">
<link rel="icon" type="image/png" href="/logo-icon.png">
<link rel="stylesheet" href="/assets/site.css?v=20260910h">
</head>
<body>
<div class="wrap">
<section class="hero" style="padding-bottom:20px">
<h1>The ledger <em>does not lie</em>.</h1>
<p class="lead">This page streams every payment the contract has ever made. If it is not here,
it did not happen. Every line carries a verify link straight to the block explorer. Go click one.</p>
<p><span class="badge" id="liveBadge">connecting…</span>
<span class="small muted" id="statLine"></span></p>
</section>
<div class="card" id="adSlotBanner" hidden></div>
<div class="card" style="padding:0">
<div data-ph-slot="0" style="margin:0 0 10px"></div>
<div class="feed" id="feed"><div class="row muted">Loading recent history…</div></div>
<div class="nas-zone" style="max-width:728px;margin:22px auto 0;overflow:hidden;text-align:center"><!-- nas-ledger --><script src="https://www.networkadspace.com/showadss.php?w=728&h=90&n=1&bw=728&bh=90&c=999"></script></div>
</div>
<div class="card small" id="adSlotText" hidden></div>
<footer>
<div>InstantAdPay · <a href="/">how it works</a> · <a id="contractLink" href="#" target="_blank" rel="noopener">contract source ↗</a></div>
</footer>
</div>
<script src="/assets/common.js?v=20260923b"></script><script src="/assets/welcome.js?v=20260923b"></script>
<script src="/assets/ledger.js?v=20260906m"></script>
<script src="https://polhunter.com/embed.js" data-slots="1" async></script>
<script src="/assets/chat.js?v=20260906m"></script>
</body>
</html>
+1079 -1079
View File
File diff suppressed because it is too large Load Diff
+134 -134
View File
@@ -1,134 +1,134 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>For site owners | InstantAdPay</title>
<meta name="description" content="Marty's partner kit for site owners who run a downline builder: the platform in three minutes, how the money moves, what your members get, and what you get for listing InstantAdPay.">
<meta name="robots" content="noindex">
<meta name="theme-color" content="#043b2f">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Sora:wght@600;700;800&display=swap">
<link rel="icon" type="image/png" href="/logo-icon.png">
<link rel="stylesheet" href="/assets/site.css?v=20260910h">
<style>
.pk{max-width:820px}
.pk h2{font-size:24px;margin:44px 0 12px;padding-top:20px;border-top:1px solid var(--line)}
.pk p{max-width:68ch}
.pk ul{margin:0 0 14px 20px;padding:0;max-width:68ch} .pk li{margin:7px 0}
.pk ol{margin:0 0 14px 20px;padding:0;max-width:68ch} .pk ol li{margin:9px 0}
.hello{display:none;margin:0 0 18px;padding:12px 16px;border:1px solid var(--mint);border-radius:12px;color:var(--mint);font-weight:700}
.vid{background:#000;border:1px solid var(--line);border-radius:14px;overflow:hidden;margin:18px 0 8px}
.vid video{display:block;width:100%;aspect-ratio:16/9}
.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px;margin:16px 0}
.grid .card{margin:0;padding:16px} .grid .card h3{margin:0 0 6px;font-size:16px} .grid .card p{margin:0;font-size:14px;color:var(--muted)}
.split{display:grid;grid-template-columns:5fr 2fr 1fr 2fr;gap:8px;margin:16px 0 8px;text-align:center}
.split>div{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:14px 8px;font-size:13px;color:var(--muted)}
.split .n{font-family:var(--disp);font-size:26px;font-weight:800;color:var(--mint)}
table{border-collapse:collapse;width:100%;margin:10px 0 18px;font-variant-numeric:tabular-nums;font-size:15px}
th,td{text-align:left;padding:9px 10px;border-bottom:1px solid var(--line)} th{color:var(--muted);font-family:var(--mono);font-size:11px;letter-spacing:.08em;text-transform:uppercase;font-weight:500}
td:nth-child(2),td:nth-child(3),th:nth-child(2),th:nth-child(3){text-align:right}
.get{border:1px solid #f2c94c;background:rgba(242,201,76,.08);border-radius:14px;padding:18px 22px;margin:16px 0}
.get h3{color:#f2c94c;margin:0 0 8px}
.cta{margin:26px 0 8px;padding:22px;border:1px solid var(--mint);border-radius:14px;background:rgba(67,232,195,.06)}
.cta .btn{margin-top:10px}
code{background:rgba(4,8,7,.6);padding:2px 7px;border-radius:6px;font-size:13.5px;word-break:break-all}
@media (max-width:640px){.split{grid-template-columns:1fr 1fr}}
</style>
</head>
<body>
<div class="wrap pk">
<section class="hero" style="padding:60px 0 10px">
<p class="eyebrow">For site owners with a downline builder</p>
<h1>I built the ad platform I always wanted to run. <em>I want it in your builder.</em></h1>
<p class="lead">A note from me, plus everything you need to list InstantAdPay in your builder and hand your members free ad credits with a code of your own.</p>
</section>
<p class="hello" id="pkHello"></p>
<div class="vid"><video id="pkVideo" controls playsinline preload="metadata" poster="/promo/partner-overview.jpg" src="https://coolify-saasytop.nyc3.digitaloceanspaces.com/promo/partner-overview.mp4"></video></div>
<p class="muted small">Watch first: the whole platform in about five minutes. Free and paid members, the seven ad formats, how people get paid, and the offer for your builder.</p>
<h2>Why I built it</h2>
<p>You know I've been running ad sites for years, the kind your members already know: buy a package, run banners and text ads, click for credits. Two of mine, Faucet Wave and Tier One Ads, ran on a licensed script. The vendor went out of business, their license server went dark, and it crippled licenses that were fully paid. The sites died overnight and nothing I could do would bring them back.</p>
<p>So I built InstantAdPay from scratch as part of the Crypto Team Build Network. No vendor, no license server, and the part that always went wrong on ad sites, the money, is handled by a verified smart contract on Polygon instead of by me. When a package sells, the contract splits the payment and sends it in the same transaction. I never hold member funds, so there is no back office, no payday, and nothing anyone can switch off.</p>
<p class="muted">Marty Bostick · Crypto Team Build Network</p>
<h2>What InstantAdPay is</h2>
<p>An advertising platform where the ad spend in your line pays you. Members join free with an email address, no password and no wallet on day one. They earn credits by viewing ads and can run their first campaign for zero dollars. When they want more reach they buy an ad package, and every package that sells is split by the contract the moment it sells.</p>
<div class="grid">
<div class="card"><h3>Seven ad formats</h3><p>Banners, text ads, login ads, solo ads to member inboxes, video, featured links and verified visits. Views are timed on the server, so a real person saw the ad.</p></div>
<div class="card"><h3>Beyond the site</h3><p>Banner and text ads also push out to Network Ad Space, a partner rotation across other member sites. Those impressions count in the member's stats.</p></div>
<div class="card"><h3>WalletConnect built in</h3><p>Full WalletConnect integration: members link MetaMask, Trust, Phantom, SafePal or any WalletConnect wallet with one tap, sign once, and buy or get paid straight from that wallet. No custody on my side.</p></div>
<div class="card"><h3>Public, verified, immutable</h3><p>Every payout is a public transaction on Polygon. The split percentages and qualification rules are constants in a verified contract that the operator cannot change.</p></div>
</div>
<h2>How the money moves</h2>
<p>Every ad package splits the same way, in the same transaction it sells in:</p>
<div class="split">
<div><div class="n">50%</div>direct sponsor</div>
<div><div class="n">20%</div>level 2</div>
<div><div class="n">10%</div>level 3</div>
<div><div class="n">20%</div>platform</div>
</div>
<p class="muted small">On a $20 package: $10 to the direct sponsor, $4 to level 2, $2 to level 3, $4 to the platform. If a level has no qualified member, that share passes up to the next qualified person above.</p>
<p>Qualification is earned, never bought. Every direct buyer pays their sponsor 50% from their very first package. Two qualifying buyers, people who bought a $20 or larger package, open level 2. Five open level 3. Until a level opens, its share climbs to the next qualified member above, which is why the plan rewards the people who actually build.</p>
<table>
<tr><th>Package</th><th>Price</th><th>Credits</th></tr>
<tr><td>Micro</td><td>$5</td><td>500</td></tr>
<tr><td>Activation, the qualifying buy</td><td>$20</td><td>2,000</td></tr>
<tr><td>Builder</td><td>$50</td><td>5,500</td></tr>
<tr><td>Growth</td><td>$100</td><td>12,000</td></tr>
<tr><td>Leader</td><td>$250</td><td>32,500</td></tr>
</table>
<h2>What your members get</h2>
<ul>
<li><b>A free start.</b> Join by email, view a few ads, earn credits, run a real banner or text campaign for nothing.</li>
<li><b>Your promo credits on top.</b> Members who arrive with your code get free ad credits added the moment they join, in addition to everything else.</li>
<li><b>Instant, public payouts.</b> When anyone in their line buys ads, the contract pays them in POL to their own wallet in the same transaction. They can check every payment on Polygonscan.</li>
<li><b>A seamless wallet step.</b> Full WalletConnect integration means linking a wallet is one tap and one free signature from any major wallet app, and purchases confirm inside the wallet they already use.</li>
<li><b>Tools that do the work.</b> A ready-to-send invite message, social posts, email swipes, a full banner kit, objection answers, and a public profile wall with their own banner slots.</li>
<li><b>Training that keeps growing.</b> A video series that walks the whole member area, plus written plays for building a line.</li>
<li><b>A holding tank.</b> Members who arrive without a sponsor are not lost. Qualified builders adopt them, first come, first served.</li>
<li><b>Coaching built in.</b> A next-move card on every dashboard, nudges when a referral stalls, and a live payments topic on Telegram where every payout posts as it lands.</li>
</ul>
<div class="get">
<h3>What you get for listing it in your builder</h3>
<ul>
<li><b>Your spot at the top.</b> You join directly under the company at the top, no sponsor in between. All it takes to claim that spot is activating your account with at least the $20 package, and that locks you in at the top of your own line from day one.</li>
<li><b>Your own promo code.</b> A reusable code that adds free ad credits for every member who redeems it, on your builder link or in the dashboard. I set the credit amount, an optional cap and an optional expiry. One redemption per account, every redemption logged, and you can see uses any time.</li>
<li><b>Your own line.</b> Every member who comes through your builder link lands under you. Each one who buys pays you 50% of their first package and every package after it, and their buyers open your level 2 and level 3 shares.</li>
<li><b>Ready-made creatives.</b> Banners in every builder size (468x60, 728x90, 300x250, 160x600, 120x600, 1200x630), text ad copy, email swipes and a program description you can paste into your listing.</li>
<li><b>A bridge page for your brand, on request.</b> A landing page in this design that names your site, explains the connection, and carries your code.</li>
<li><b>Attribution you can check.</b> Signups and buyers are tagged with the source they came from, and the promo code report shows exactly who redeemed yours.</li>
</ul>
</div>
<h2>Setting it up takes about fifteen minutes</h2>
<ol>
<li>Claim your spot with the button below. It places you directly under the company at the top. Join with your email and pick your username; your own invite link is live immediately: <code>instantadpay.com/join/yourname</code>.</li>
<li>Send me your username and the site you are listing it on. I mint your code with the credit amount we agree on.</li>
<li>Add InstantAdPay to your downline builder with your link plus the code: <code id="pkExample">https://instantadpay.com/join/yourname?promo=YOURCODE</code>. Members who click it land under you and their credits apply the moment their account exists.</li>
<li>Use the banners and text ads from the kit. Members who already have an account can type the code into the "Have a promo code?" box on their Overview.</li>
<li>Link a wallet, switch on payouts, and activate with at least the $20 package. That claims your spot at the top and makes you a qualifying buyer in your own right.</li>
</ol>
<div class="cta">
<b id="pkCtaHead">Claim your spot at the top</b>
<p class="muted small" id="pkCtaSub" style="margin:6px 0 0">Free account by email. No password, no wallet today. The link below places you directly under the company.</p>
<a class="btn" id="pkCta" href="/join/company">Claim my spot</a>
</div>
<h2>The honest part</h2>
<p>InstantAdPay sells advertising. Members earn from the ad packages people in their line buy, and nothing else. There is no earn-without-referring option, on purpose, because sites that pay you just for buying in are the ones that collapse. No income is guaranteed, results depend on effort, and cryptocurrency involves risk of loss. The contract, the ledger and every payout are public, so you never have to take my word for any of it.</p>
<p>Marty Bostick · <a href="mailto:marty@marketingwithmarty.com">marty@marketingwithmarty.com</a> · <a href="https://t.me/cryptoteambuild">t.me/cryptoteambuild</a></p>
<footer>
<div>InstantAdPay · <a href="/">home</a> · <a href="/ledger">live ledger</a> · <a href="/contract">the contract</a></div>
<div class="small">Advertising services with a performance referral program. Not an investment product; no income guarantees. Crypto transactions are irreversible. Never spend what you cannot afford to lose.</div>
</footer>
</div>
<script src="/assets/common.js?v=20260923b"></script>
<script src="/assets/partners.js?v=20260914a"></script>
</body>
</html>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>For site owners | InstantAdPay</title>
<meta name="description" content="Marty's partner kit for site owners who run a downline builder: the platform in three minutes, how the money moves, what your members get, and what you get for listing InstantAdPay.">
<meta name="robots" content="noindex">
<meta name="theme-color" content="#043b2f">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Sora:wght@600;700;800&display=swap">
<link rel="icon" type="image/png" href="/logo-icon.png">
<link rel="stylesheet" href="/assets/site.css?v=20260910h">
<style>
.pk{max-width:820px}
.pk h2{font-size:24px;margin:44px 0 12px;padding-top:20px;border-top:1px solid var(--line)}
.pk p{max-width:68ch}
.pk ul{margin:0 0 14px 20px;padding:0;max-width:68ch} .pk li{margin:7px 0}
.pk ol{margin:0 0 14px 20px;padding:0;max-width:68ch} .pk ol li{margin:9px 0}
.hello{display:none;margin:0 0 18px;padding:12px 16px;border:1px solid var(--mint);border-radius:12px;color:var(--mint);font-weight:700}
.vid{background:#000;border:1px solid var(--line);border-radius:14px;overflow:hidden;margin:18px 0 8px}
.vid video{display:block;width:100%;aspect-ratio:16/9}
.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px;margin:16px 0}
.grid .card{margin:0;padding:16px} .grid .card h3{margin:0 0 6px;font-size:16px} .grid .card p{margin:0;font-size:14px;color:var(--muted)}
.split{display:grid;grid-template-columns:5fr 2fr 1fr 2fr;gap:8px;margin:16px 0 8px;text-align:center}
.split>div{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:14px 8px;font-size:13px;color:var(--muted)}
.split .n{font-family:var(--disp);font-size:26px;font-weight:800;color:var(--mint)}
table{border-collapse:collapse;width:100%;margin:10px 0 18px;font-variant-numeric:tabular-nums;font-size:15px}
th,td{text-align:left;padding:9px 10px;border-bottom:1px solid var(--line)} th{color:var(--muted);font-family:var(--mono);font-size:11px;letter-spacing:.08em;text-transform:uppercase;font-weight:500}
td:nth-child(2),td:nth-child(3),th:nth-child(2),th:nth-child(3){text-align:right}
.get{border:1px solid #f2c94c;background:rgba(242,201,76,.08);border-radius:14px;padding:18px 22px;margin:16px 0}
.get h3{color:#f2c94c;margin:0 0 8px}
.cta{margin:26px 0 8px;padding:22px;border:1px solid var(--mint);border-radius:14px;background:rgba(67,232,195,.06)}
.cta .btn{margin-top:10px}
code{background:rgba(4,8,7,.6);padding:2px 7px;border-radius:6px;font-size:13.5px;word-break:break-all}
@media (max-width:640px){.split{grid-template-columns:1fr 1fr}}
</style>
</head>
<body>
<div class="wrap pk">
<section class="hero" style="padding:60px 0 10px">
<p class="eyebrow">For site owners with a downline builder</p>
<h1>I built the ad platform I always wanted to run. <em>I want it in your builder.</em></h1>
<p class="lead">A note from me, plus everything you need to list InstantAdPay in your builder and hand your members free ad credits with a code of your own.</p>
</section>
<p class="hello" id="pkHello"></p>
<div class="vid"><video id="pkVideo" controls playsinline preload="metadata" poster="/promo/partner-overview.jpg" src="https://coolify-saasytop.nyc3.digitaloceanspaces.com/promo/partner-overview.mp4"></video></div>
<p class="muted small">Watch first: the whole platform in about five minutes. Free and paid members, the seven ad formats, how people get paid, and the offer for your builder.</p>
<h2>Why I built it</h2>
<p>You know I've been running ad sites for years, the kind your members already know: buy a package, run banners and text ads, click for credits. Two of mine, Faucet Wave and Tier One Ads, ran on a licensed script. The vendor went out of business, their license server went dark, and it crippled licenses that were fully paid. The sites died overnight and nothing I could do would bring them back.</p>
<p>So I built InstantAdPay from scratch as part of the Crypto Team Build Network. No vendor, no license server, and the part that always went wrong on ad sites, the money, is handled by a verified smart contract on Polygon instead of by me. When a package sells, the contract splits the payment and sends it in the same transaction. I never hold member funds, so there is no back office, no payday, and nothing anyone can switch off.</p>
<p class="muted">Marty Bostick · Crypto Team Build Network</p>
<h2>What InstantAdPay is</h2>
<p>An advertising platform where the ad spend in your line pays you. Members join free with an email address, no password and no wallet on day one. They earn credits by viewing ads and can run their first campaign for zero dollars. When they want more reach they buy an ad package, and every package that sells is split by the contract the moment it sells.</p>
<div class="grid">
<div class="card"><h3>Seven ad formats</h3><p>Banners, text ads, login ads, solo ads to member inboxes, video, featured links and verified visits. Views are timed on the server, so a real person saw the ad.</p></div>
<div class="card"><h3>Beyond the site</h3><p>Banner and text ads also push out to Network Ad Space, a partner rotation across other member sites. Those impressions count in the member's stats.</p></div>
<div class="card"><h3>WalletConnect built in</h3><p>Full WalletConnect integration: members link MetaMask, Trust, Phantom, SafePal or any WalletConnect wallet with one tap, sign once, and buy or get paid straight from that wallet. No custody on my side.</p></div>
<div class="card"><h3>Public, verified, immutable</h3><p>Every payout is a public transaction on Polygon. The split percentages and qualification rules are constants in a verified contract that the operator cannot change.</p></div>
</div>
<h2>How the money moves</h2>
<p>Every ad package splits the same way, in the same transaction it sells in:</p>
<div class="split">
<div><div class="n">50%</div>direct sponsor</div>
<div><div class="n">20%</div>level 2</div>
<div><div class="n">10%</div>level 3</div>
<div><div class="n">20%</div>platform</div>
</div>
<p class="muted small">On a $20 package: $10 to the direct sponsor, $4 to level 2, $2 to level 3, $4 to the platform. If a level has no qualified member, that share passes up to the next qualified person above.</p>
<p>Qualification is earned, never bought. Every direct buyer pays their sponsor 50% from their very first package. Two qualifying buyers, people who bought a $20 or larger package, open level 2. Five open level 3. Until a level opens, its share climbs to the next qualified member above, which is why the plan rewards the people who actually build.</p>
<table>
<tr><th>Package</th><th>Price</th><th>Credits</th></tr>
<tr><td>Micro</td><td>$5</td><td>500</td></tr>
<tr><td>Activation, the qualifying buy</td><td>$20</td><td>2,000</td></tr>
<tr><td>Builder</td><td>$50</td><td>5,500</td></tr>
<tr><td>Growth</td><td>$100</td><td>12,000</td></tr>
<tr><td>Leader</td><td>$250</td><td>32,500</td></tr>
</table>
<h2>What your members get</h2>
<ul>
<li><b>A free start.</b> Join by email, view a few ads, earn credits, run a real banner or text campaign for nothing.</li>
<li><b>Your promo credits on top.</b> Members who arrive with your code get free ad credits added the moment they join, in addition to everything else.</li>
<li><b>Instant, public payouts.</b> When anyone in their line buys ads, the contract pays them in POL to their own wallet in the same transaction. They can check every payment on Polygonscan.</li>
<li><b>A seamless wallet step.</b> Full WalletConnect integration means linking a wallet is one tap and one free signature from any major wallet app, and purchases confirm inside the wallet they already use.</li>
<li><b>Tools that do the work.</b> A ready-to-send invite message, social posts, email swipes, a full banner kit, objection answers, and a public profile wall with their own banner slots.</li>
<li><b>Training that keeps growing.</b> A video series that walks the whole member area, plus written plays for building a line.</li>
<li><b>A holding tank.</b> Members who arrive without a sponsor are not lost. Qualified builders adopt them, first come, first served.</li>
<li><b>Coaching built in.</b> A next-move card on every dashboard, nudges when a referral stalls, and a live payments topic on Telegram where every payout posts as it lands.</li>
</ul>
<div class="get">
<h3>What you get for listing it in your builder</h3>
<ul>
<li><b>Your spot at the top.</b> You join directly under the company at the top, no sponsor in between. All it takes to claim that spot is activating your account with at least the $20 package, and that locks you in at the top of your own line from day one.</li>
<li><b>Your own promo code.</b> A reusable code that adds free ad credits for every member who redeems it, on your builder link or in the dashboard. I set the credit amount, an optional cap and an optional expiry. One redemption per account, every redemption logged, and you can see uses any time.</li>
<li><b>Your own line.</b> Every member who comes through your builder link lands under you. Each one who buys pays you 50% of their first package and every package after it, and their buyers open your level 2 and level 3 shares.</li>
<li><b>Ready-made creatives.</b> Banners in every builder size (468x60, 728x90, 300x250, 160x600, 120x600, 1200x630), text ad copy, email swipes and a program description you can paste into your listing.</li>
<li><b>A bridge page for your brand, on request.</b> A landing page in this design that names your site, explains the connection, and carries your code.</li>
<li><b>Attribution you can check.</b> Signups and buyers are tagged with the source they came from, and the promo code report shows exactly who redeemed yours.</li>
</ul>
</div>
<h2>Setting it up takes about fifteen minutes</h2>
<ol>
<li>Claim your spot with the button below. It places you directly under the company at the top. Join with your email and pick your username; your own invite link is live immediately: <code>instantadpay.com/join/yourname</code>.</li>
<li>Send me your username and the site you are listing it on. I mint your code with the credit amount we agree on.</li>
<li>Add InstantAdPay to your downline builder with your link plus the code: <code id="pkExample">https://instantadpay.com/join/yourname?promo=YOURCODE</code>. Members who click it land under you and their credits apply the moment their account exists.</li>
<li>Use the banners and text ads from the kit. Members who already have an account can type the code into the "Have a promo code?" box on their Overview.</li>
<li>Link a wallet, switch on payouts, and activate with at least the $20 package. That claims your spot at the top and makes you a qualifying buyer in your own right.</li>
</ol>
<div class="cta">
<b id="pkCtaHead">Claim your spot at the top</b>
<p class="muted small" id="pkCtaSub" style="margin:6px 0 0">Free account by email. No password, no wallet today. The link below places you directly under the company.</p>
<a class="btn" id="pkCta" href="/join/company">Claim my spot</a>
</div>
<h2>The honest part</h2>
<p>InstantAdPay sells advertising. Members earn from the ad packages people in their line buy, and nothing else. There is no earn-without-referring option, on purpose, because sites that pay you just for buying in are the ones that collapse. No income is guaranteed, results depend on effort, and cryptocurrency involves risk of loss. The contract, the ledger and every payout are public, so you never have to take my word for any of it.</p>
<p>Marty Bostick · <a href="mailto:marty@marketingwithmarty.com">marty@marketingwithmarty.com</a> · <a href="https://t.me/cryptoteambuild">t.me/cryptoteambuild</a></p>
<footer>
<div>InstantAdPay · <a href="/">home</a> · <a href="/ledger">live ledger</a> · <a href="/contract">the contract</a></div>
<div class="small">Advertising services with a performance referral program. Not an investment product; no income guarantees. Crypto transactions are irreversible. Never spend what you cannot afford to lose.</div>
</footer>
</div>
<script src="/assets/common.js?v=20260923b"></script><script src="/assets/welcome.js?v=20260923b"></script>
<script src="/assets/partners.js?v=20260914a"></script>
</body>
</html>
+198 -198
View File
@@ -1,198 +1,198 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Team-building plays | InstantAdPay</title>
<meta name="description" content="Three ways to build your InstantAdPay line, plus the Qualified Start opening move. Member training.">
<meta name="robots" content="noindex">
<meta name="theme-color" content="#043b2f">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Sora:wght@600;700;800&display=swap">
<link rel="icon" type="image/png" href="/logo-icon.png">
<link rel="stylesheet" href="/assets/site.css?v=20260910h">
<style>
.pl-rule{border-left:4px solid #f2c94c;background:rgba(242,201,76,.08);padding:16px 20px;border-radius:0 12px 12px 0;margin:0 0 28px}
.pl-rule b{font-family:var(--disp);font-size:17px;display:block;margin-bottom:6px}
.pl-split{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin:0 0 10px}
.pl-split>div{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:14px 10px;text-align:center}
.pl-split .n{font-family:var(--disp);font-size:28px;font-weight:800;color:var(--mint);font-variant-numeric:tabular-nums}
.pl-split .l{font-size:12px;color:var(--muted);text-transform:uppercase;letter-spacing:.06em;margin-top:2px}
.pl-ladder{display:grid;grid-template-columns:repeat(5,1fr);border:1px solid var(--line);border-radius:12px;overflow:hidden;background:var(--panel);margin:0 0 34px}
.pl-ladder>div{padding:12px 10px;border-right:1px solid var(--line);font-size:13.5px}
.pl-ladder>div:last-child{border-right:0}
.pl-ladder .k{font-family:var(--mono);font-size:11px;color:var(--muted);letter-spacing:.08em;text-transform:uppercase}
.pl-ladder .v{font-weight:700;margin-top:2px}
.pl-ladder .b{color:var(--mint);font-size:12.5px}
.play header{display:flex;align-items:baseline;gap:12px;flex-wrap:wrap;margin-bottom:6px}
.play h2{font-size:24px;margin:0}
.play .tag{font-family:var(--mono);font-size:11.5px;color:var(--mint);border:1px solid rgba(67,232,195,.4);border-radius:999px;padding:3px 10px}
.play ol{margin:0 0 14px 20px;padding:0;line-height:1.6}
.play ol li{margin:0 0 8px}
.meta{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-top:12px}
.meta>div{background:rgba(4,8,7,.45);border:1px solid var(--line);border-radius:10px;padding:12px 14px;font-size:14px}
.meta .k{font-family:var(--mono);font-size:11px;color:var(--muted);letter-spacing:.08em;text-transform:uppercase;margin-bottom:4px}
.rec{border-color:var(--mint)}
.cal{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}
.cal>div{background:rgba(4,8,7,.45);border:1px solid var(--line);border-radius:10px;padding:12px 14px;font-size:14px}
.cal .k{font-family:var(--disp);font-weight:800;color:var(--mint);margin-bottom:6px}
blockquote{margin:0 0 10px;background:rgba(4,8,7,.45);border:1px solid var(--line);border-radius:10px;padding:12px 16px;color:var(--muted);font-style:italic}
blockquote span{display:block;font-style:normal;font-family:var(--mono);font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--mint);margin-bottom:4px}
.fit-table th{text-align:left;color:var(--muted);font-family:var(--mono);font-size:11px;letter-spacing:.08em;text-transform:uppercase;font-weight:500}
.fit-table td,.fit-table th{padding:9px 10px;border-bottom:1px solid var(--line);vertical-align:top}
#gate{display:none}
#printable{display:none}
@media print{ body{background:#fff;color:#000} .wrap>*{display:none!important} #printable{display:block!important;color:#000} #printable h2,#printable h3{color:#000;font-family:Georgia,serif} #printable li{margin:6px 0} }
@media (max-width:720px){.pl-split{grid-template-columns:repeat(2,1fr)}.pl-ladder{grid-template-columns:1fr}.pl-ladder>div{border-right:0;border-bottom:1px solid var(--line)}.meta,.cal{grid-template-columns:1fr}}
</style>
</head>
<body>
<div class="wrap">
<section class="hero" style="padding:70px 0 24px">
<p class="eyebrow">Member training</p>
<h1>Three ways to <em>build a line</em>.</h1>
<p class="lead">Pick one and run it. Every number here comes from the live contract and the rate table, not from a slide.</p>
</section>
<div class="card" id="gate"><h3>Members only</h3><p class="muted small">Sign in to your member area to read the plays. <a href="/my">Sign in</a></p></div>
<div id="body">
<div class="pl-rule">
<b>The one rule under all three plays: unqualified levels pass up.</b>
If someone on your level 2 buys before you have two qualifying buyers, that 20% does not wait for you. It goes to the next qualified sponsor above you, or to the platform. Same for level 3 and five. Whatever play you run, the first job is the same: get qualified before your line gets busy.
</div>
<p class="eyebrow">How a package splits, the moment it sells</p>
<div class="pl-split">
<div><div class="n">50%</div><div class="l">Direct sponsor</div></div>
<div><div class="n">20%</div><div class="l">Level 2 · needs 2</div></div>
<div><div class="n">10%</div><div class="l">Level 3 · needs 5</div></div>
<div><div class="n">20%</div><div class="l">Platform</div></div>
</div>
<p class="eyebrow" style="margin-top:18px">The ladder on your Overview, and what each rung unlocks</p>
<div class="pl-ladder">
<div><div class="k">Rung 1</div><div class="v">Joined</div><div class="b">Welcome tour: 25 credits</div></div>
<div><div class="k">Rung 2</div><div class="v">Payouts on</div><div class="b">Spark badge · 10 credits</div></div>
<div><div class="k">Rung 3</div><div class="v">First buyer</div><div class="b">Surge · 25 credits · 50% starts</div></div>
<div><div class="k">Rung 4</div><div class="v">2 qualifying</div><div class="b">Circuit · 50 credits · level 2 · wall position 2</div></div>
<div><div class="k">Rung 5</div><div class="v">5 qualifying</div><div class="b">Nexus · 100 credits · level 3 · wall position 3</div></div>
</div>
<div class="card play">
<header><h2>Opening move · Qualified Start</h2><span class="tag">works with any play</span></header>
<p class="muted"><b>Fits:</b> anyone who would rather start qualified than wait for their first two buyers.</p>
<p>Qualification is earned by buyers, never bought. But you can be your own first buyers, openly. Under <a href="/my#buy">Buy packages</a>, link a second wallet you own as a <b>position</b>. When it buys a $20 package the contract counts it as a qualifying buyer, half the purchase comes straight back to your main wallet, and its credits pool with yours. Two positions open level 2 the same day; five open level 3. Then run whichever play fits you with the ladder already climbed. The three Qualified Start videos in <a href="/my#training">Training</a> show every click.</p>
<div class="meta">
<div><div class="k">Net cost</div>Level 2: about $20 net for $40 of ad credits. Level 3: about $50 net for $100 of credits. Plus a little POL for gas in each wallet.</div>
<div><div class="k">Say it plainly</div>Your own money, your own wallets, a faster start. Never an income promise: qualification only pays on future purchases in your line.</div>
</div>
</div>
<div class="card play">
<header><h2>Play 1 · Wide and teach</h2><span class="tag">the fifty play</span></header>
<p class="muted"><b>Fits:</b> someone with an audience, a list, a group, or traffic they can point somewhere.</p>
<p>Every direct who buys is 50% to you, instantly, forever. Directs are the only thing that qualifies you. The teaching is what fills levels 2 and 3 without extra work from you: your directs' buyers are your 20%, their buyers are your 10%.</p>
<ol>
<li><b>One new conversation a day, minimum.</b> Text a friend and Social posts in Promo tools already carry your link.</li>
<li><b>Send paid traffic to an angle lander, not the bare link.</b> Add <span class="mono">?v=adspend</span> for advertisers, <span class="mono">?v=free</span> for freebie seekers, <span class="mono">?v=instant</span> for the crypto-curious.</li>
<li><b>Every new direct gets the same three sentences inside 24 hours</b> (sponsor chat or the daily broadcast): pick your username, link your wallet and switch on payouts, send your link to one person today. That is the whole teaching. They pass it down.</li>
<li><b>Run the network's own ads at your link.</b> Buy a package or claim the daily 5 credits, then spend credits on a Featured link (40 credits a day) or a text ad pointed at your angle lander.</li>
</ol>
<div class="meta">
<div><div class="k">Scoreboard</div>Joined your line climbing daily · Qualifying buyers 2, then 5 · level 2 and 3 rows appearing in My line</div>
<div><div class="k">Ceiling and weakness</div>No ceiling on width. Shallow lines churn if you skip step 3.</div>
</div>
</div>
<div class="card play">
<header><h2>Play 2 · Two, then down</h2><span class="tag">the depth play</span></header>
<p class="muted"><b>Fits:</b> someone with a small circle who would rather coach two people well than pitch twenty.</p>
<p>Two qualifying buyers open level 2, wall position 2, the Circuit badge and 50 bonus credits. From there every person your two bring in pays you 20%, and every person those people bring in pays you 10% once you reach five. Your effort goes into two relationships instead of a funnel.</p>
<ol>
<li><b>Get two directs to a $20+ package.</b> Sit with them on the buy if you have to. Trust Wallet needs a POL cushion; SafePal or MetaMask are smoother.</li>
<li><b>Coach them to their two.</b> Sponsor chat daily for the first week. One broadcast a day to your directs with a single ask each time.</li>
<li><b>Set your line banner to your team's meeting place</b> (a Telegram group, a training page). Every new member three levels down meets it on their welcome tour.</li>
<li><b>Keep adding directs until you have five.</b> This is the catch: level 3 only opens on five qualifying directs of your own. Two deep, coached well, earns a healthy 20% level. It does not open the 10% level.</li>
</ol>
<div class="meta">
<div><div class="k">Scoreboard</div>Qualifying buyers 2 · level 2 count in My line rising · your directs' own qualifying counts</div>
<div><div class="k">Ceiling and strength</div>Level 2 income until you personally hit five. The stickiest lines come from this play.</div>
</div>
</div>
<div class="card play rec">
<p class="eyebrow" style="margin:0 0 6px">Recommended default</p>
<header><h2>Play 3 · Five and wide</h2><span class="tag">the combination</span></header>
<p class="muted"><b>Fits:</b> anyone willing to do both. This is the play the dashboard ladder is actually built for.</p>
<ol>
<li><b>Sprint to five qualifying directs.</b> Nothing else matters until level 3 is open: Nexus, wall position 3 (your whole public page runs your own links), 100 bonus credits, and the full 50 / 20 / 10.</li>
<li><b>Then split the day.</b> Mornings wide: one new conversation, one post, one ad running. Evenings deep: read My line, message the three newest directs, send the broadcast.</li>
<li><b>Coach the 2-then-5 rule down the line.</b> Each of your five gets pushed to two (your level 2 fills), then to five (your level 3 fills). Use the achievements Share links; people copy what they see rewarded.</li>
<li><b>Book the featured strip for 7 days</b> whenever you have 280 credits spare. Ten slots a day, every member sees it.</li>
</ol>
<div class="meta">
<div><div class="k">Scoreboard</div>All four Overview tiles, plus Earning levels: buyers referred, level open, how many to next</div>
<div><div class="k">Why it wins</div>Width qualifies you. Depth pays you on other people's effort. Only this play does both on purpose.</div>
</div>
</div>
<div class="card">
<h3>Which play fits you</h3>
<div class="tablewrap"><table class="fit-table">
<tr><th>You have</th><th>Run</th><th>First target</th></tr>
<tr><td>A list, a group, or ad budget</td><td>Wide and teach</td><td>Five qualifying directs in 30 days</td></tr>
<tr><td>A few close people and patience</td><td>Two, then down</td><td>Two qualifying directs in 14 days, both coached to their two</td></tr>
<tr><td>An hour a day and a phone</td><td>Five and wide</td><td>Five qualifying, then one wide and one deep action every day</td></tr>
</table></div>
</div>
<div class="card">
<h3>First 30 days, any play</h3>
<div class="cal">
<div><div class="k">Day 1</div>Username. Wallet linked. Payouts on. Welcome tour done (25 credits). Link sent to one person.</div>
<div><div class="k">Days 2 to 7</div>One conversation a day. Claim the daily 5 credits. First buyer (25 bonus credits).</div>
<div><div class="k">Days 8 to 14</div>Second qualifying buyer. Level 2 open. Line banner set. First broadcast sent.</div>
<div><div class="k">Days 15 to 30</div>Coach the two to their two. Add directs three, four, five. Level 3 open by day 30 is the stretch goal.</div>
</div>
</div>
<div class="card">
<h3>Messages that fit each play</h3>
<blockquote><span>Wide</span>I run ads anyway. This one pays me in the same transaction the buyer's package sells, on a public ledger. Free to join by email: <span class="mono" data-link>your link</span></blockquote>
<blockquote><span>Depth</span>I need two people who will actually do this with me, not twenty who will look at it. You are one of the two I thought of. <span class="mono" data-link>your link</span></blockquote>
<blockquote><span>Combination · to a new direct</span>Three things today: username, wallet on, one person. I will check in tomorrow.</blockquote>
</div>
<p class="muted small">No income is guaranteed. Results depend on your effort. Cryptocurrency involves risk of loss. InstantAdPay sells advertising; it is not an investment.</p>
<p><button class="btn sec" type="button" id="printBtn">Print the Qualified Start checklist and 30-day calendar</button></p>
<div class="card" id="adSlotPlays" hidden style="text-align:center"></div>
</div>
<div id="printable">
<h2>InstantAdPay: Qualified Start checklist</h2>
<ol>
<li>Username chosen (Profile tab). It is permanent: it becomes your invite link.</li>
<li>Main wallet linked (Wallet tab, one free signature).</li>
<li>Payouts switched on (Wallet tab, one free transaction).</li>
<li>Extra wallet accounts created in your wallet app: IAP Position 2, 3, 4, 5.</li>
<li>Each extra account funded with enough POL for a $20 package plus gas.</li>
<li>Buy packages: Add a position, tick only the new account, sign once.</li>
<li>Buy from: choose the position, Buy $20, confirm in the wallet.</li>
<li>Repeat. Two positions open level 2. Five open level 3 and the Nexus badge.</li>
</ol>
<h2>First 30 days, any play</h2>
<h3>Day 1</h3><ul><li>Username, wallet linked, payouts on, welcome tour done.</li><li>Link sent to one person.</li></ul>
<h3>Days 2 to 7</h3><ul><li>One conversation a day.</li><li>Claim the daily 5 credits.</li><li>First buyer.</li></ul>
<h3>Days 8 to 14</h3><ul><li>Second qualifying buyer. Level 2 open.</li><li>Line banner set. First broadcast sent.</li></ul>
<h3>Days 15 to 30</h3><ul><li>Coach the two to their two.</li><li>Add directs three, four, five. Level 3 open by day 30 is the stretch goal.</li></ul>
<p>My invite link: <span data-link>__________________________</span></p>
<p style="font-size:12px">No income is guaranteed. Results depend on your effort. Cryptocurrency involves risk of loss. InstantAdPay sells advertising; it is not an investment.</p>
</div>
<footer>
<div>InstantAdPay · <a href="/my#training">back to Training</a> · <a href="/ledger">live ledger</a></div>
<div class="small">Advertising services with a performance referral program. Not an investment product; no income guarantees. Crypto transactions are irreversible. Never spend what you cannot afford.</div>
</footer>
</div>
<script src="/assets/common.js?v=20260923b"></script>
<script src="/assets/plays.js?v=20260910b"></script>
</body>
</html>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Team-building plays | InstantAdPay</title>
<meta name="description" content="Three ways to build your InstantAdPay line, plus the Qualified Start opening move. Member training.">
<meta name="robots" content="noindex">
<meta name="theme-color" content="#043b2f">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Sora:wght@600;700;800&display=swap">
<link rel="icon" type="image/png" href="/logo-icon.png">
<link rel="stylesheet" href="/assets/site.css?v=20260910h">
<style>
.pl-rule{border-left:4px solid #f2c94c;background:rgba(242,201,76,.08);padding:16px 20px;border-radius:0 12px 12px 0;margin:0 0 28px}
.pl-rule b{font-family:var(--disp);font-size:17px;display:block;margin-bottom:6px}
.pl-split{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin:0 0 10px}
.pl-split>div{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:14px 10px;text-align:center}
.pl-split .n{font-family:var(--disp);font-size:28px;font-weight:800;color:var(--mint);font-variant-numeric:tabular-nums}
.pl-split .l{font-size:12px;color:var(--muted);text-transform:uppercase;letter-spacing:.06em;margin-top:2px}
.pl-ladder{display:grid;grid-template-columns:repeat(5,1fr);border:1px solid var(--line);border-radius:12px;overflow:hidden;background:var(--panel);margin:0 0 34px}
.pl-ladder>div{padding:12px 10px;border-right:1px solid var(--line);font-size:13.5px}
.pl-ladder>div:last-child{border-right:0}
.pl-ladder .k{font-family:var(--mono);font-size:11px;color:var(--muted);letter-spacing:.08em;text-transform:uppercase}
.pl-ladder .v{font-weight:700;margin-top:2px}
.pl-ladder .b{color:var(--mint);font-size:12.5px}
.play header{display:flex;align-items:baseline;gap:12px;flex-wrap:wrap;margin-bottom:6px}
.play h2{font-size:24px;margin:0}
.play .tag{font-family:var(--mono);font-size:11.5px;color:var(--mint);border:1px solid rgba(67,232,195,.4);border-radius:999px;padding:3px 10px}
.play ol{margin:0 0 14px 20px;padding:0;line-height:1.6}
.play ol li{margin:0 0 8px}
.meta{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-top:12px}
.meta>div{background:rgba(4,8,7,.45);border:1px solid var(--line);border-radius:10px;padding:12px 14px;font-size:14px}
.meta .k{font-family:var(--mono);font-size:11px;color:var(--muted);letter-spacing:.08em;text-transform:uppercase;margin-bottom:4px}
.rec{border-color:var(--mint)}
.cal{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}
.cal>div{background:rgba(4,8,7,.45);border:1px solid var(--line);border-radius:10px;padding:12px 14px;font-size:14px}
.cal .k{font-family:var(--disp);font-weight:800;color:var(--mint);margin-bottom:6px}
blockquote{margin:0 0 10px;background:rgba(4,8,7,.45);border:1px solid var(--line);border-radius:10px;padding:12px 16px;color:var(--muted);font-style:italic}
blockquote span{display:block;font-style:normal;font-family:var(--mono);font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--mint);margin-bottom:4px}
.fit-table th{text-align:left;color:var(--muted);font-family:var(--mono);font-size:11px;letter-spacing:.08em;text-transform:uppercase;font-weight:500}
.fit-table td,.fit-table th{padding:9px 10px;border-bottom:1px solid var(--line);vertical-align:top}
#gate{display:none}
#printable{display:none}
@media print{ body{background:#fff;color:#000} .wrap>*{display:none!important} #printable{display:block!important;color:#000} #printable h2,#printable h3{color:#000;font-family:Georgia,serif} #printable li{margin:6px 0} }
@media (max-width:720px){.pl-split{grid-template-columns:repeat(2,1fr)}.pl-ladder{grid-template-columns:1fr}.pl-ladder>div{border-right:0;border-bottom:1px solid var(--line)}.meta,.cal{grid-template-columns:1fr}}
</style>
</head>
<body>
<div class="wrap">
<section class="hero" style="padding:70px 0 24px">
<p class="eyebrow">Member training</p>
<h1>Three ways to <em>build a line</em>.</h1>
<p class="lead">Pick one and run it. Every number here comes from the live contract and the rate table, not from a slide.</p>
</section>
<div class="card" id="gate"><h3>Members only</h3><p class="muted small">Sign in to your member area to read the plays. <a href="/my">Sign in</a></p></div>
<div id="body">
<div class="pl-rule">
<b>The one rule under all three plays: unqualified levels pass up.</b>
If someone on your level 2 buys before you have two qualifying buyers, that 20% does not wait for you. It goes to the next qualified sponsor above you, or to the platform. Same for level 3 and five. Whatever play you run, the first job is the same: get qualified before your line gets busy.
</div>
<p class="eyebrow">How a package splits, the moment it sells</p>
<div class="pl-split">
<div><div class="n">50%</div><div class="l">Direct sponsor</div></div>
<div><div class="n">20%</div><div class="l">Level 2 · needs 2</div></div>
<div><div class="n">10%</div><div class="l">Level 3 · needs 5</div></div>
<div><div class="n">20%</div><div class="l">Platform</div></div>
</div>
<p class="eyebrow" style="margin-top:18px">The ladder on your Overview, and what each rung unlocks</p>
<div class="pl-ladder">
<div><div class="k">Rung 1</div><div class="v">Joined</div><div class="b">Welcome tour: 25 credits</div></div>
<div><div class="k">Rung 2</div><div class="v">Payouts on</div><div class="b">Spark badge · 10 credits</div></div>
<div><div class="k">Rung 3</div><div class="v">First buyer</div><div class="b">Surge · 25 credits · 50% starts</div></div>
<div><div class="k">Rung 4</div><div class="v">2 qualifying</div><div class="b">Circuit · 50 credits · level 2 · wall position 2</div></div>
<div><div class="k">Rung 5</div><div class="v">5 qualifying</div><div class="b">Nexus · 100 credits · level 3 · wall position 3</div></div>
</div>
<div class="card play">
<header><h2>Opening move · Qualified Start</h2><span class="tag">works with any play</span></header>
<p class="muted"><b>Fits:</b> anyone who would rather start qualified than wait for their first two buyers.</p>
<p>Qualification is earned by buyers, never bought. But you can be your own first buyers, openly. Under <a href="/my#buy">Buy packages</a>, link a second wallet you own as a <b>position</b>. When it buys a $20 package the contract counts it as a qualifying buyer, half the purchase comes straight back to your main wallet, and its credits pool with yours. Two positions open level 2 the same day; five open level 3. Then run whichever play fits you with the ladder already climbed. The three Qualified Start videos in <a href="/my#training">Training</a> show every click.</p>
<div class="meta">
<div><div class="k">Net cost</div>Level 2: about $20 net for $40 of ad credits. Level 3: about $50 net for $100 of credits. Plus a little POL for gas in each wallet.</div>
<div><div class="k">Say it plainly</div>Your own money, your own wallets, a faster start. Never an income promise: qualification only pays on future purchases in your line.</div>
</div>
</div>
<div class="card play">
<header><h2>Play 1 · Wide and teach</h2><span class="tag">the fifty play</span></header>
<p class="muted"><b>Fits:</b> someone with an audience, a list, a group, or traffic they can point somewhere.</p>
<p>Every direct who buys is 50% to you, instantly, forever. Directs are the only thing that qualifies you. The teaching is what fills levels 2 and 3 without extra work from you: your directs' buyers are your 20%, their buyers are your 10%.</p>
<ol>
<li><b>One new conversation a day, minimum.</b> Text a friend and Social posts in Promo tools already carry your link.</li>
<li><b>Send paid traffic to an angle lander, not the bare link.</b> Add <span class="mono">?v=adspend</span> for advertisers, <span class="mono">?v=free</span> for freebie seekers, <span class="mono">?v=instant</span> for the crypto-curious.</li>
<li><b>Every new direct gets the same three sentences inside 24 hours</b> (sponsor chat or the daily broadcast): pick your username, link your wallet and switch on payouts, send your link to one person today. That is the whole teaching. They pass it down.</li>
<li><b>Run the network's own ads at your link.</b> Buy a package or claim the daily 5 credits, then spend credits on a Featured link (40 credits a day) or a text ad pointed at your angle lander.</li>
</ol>
<div class="meta">
<div><div class="k">Scoreboard</div>Joined your line climbing daily · Qualifying buyers 2, then 5 · level 2 and 3 rows appearing in My line</div>
<div><div class="k">Ceiling and weakness</div>No ceiling on width. Shallow lines churn if you skip step 3.</div>
</div>
</div>
<div class="card play">
<header><h2>Play 2 · Two, then down</h2><span class="tag">the depth play</span></header>
<p class="muted"><b>Fits:</b> someone with a small circle who would rather coach two people well than pitch twenty.</p>
<p>Two qualifying buyers open level 2, wall position 2, the Circuit badge and 50 bonus credits. From there every person your two bring in pays you 20%, and every person those people bring in pays you 10% once you reach five. Your effort goes into two relationships instead of a funnel.</p>
<ol>
<li><b>Get two directs to a $20+ package.</b> Sit with them on the buy if you have to. Trust Wallet needs a POL cushion; SafePal or MetaMask are smoother.</li>
<li><b>Coach them to their two.</b> Sponsor chat daily for the first week. One broadcast a day to your directs with a single ask each time.</li>
<li><b>Set your line banner to your team's meeting place</b> (a Telegram group, a training page). Every new member three levels down meets it on their welcome tour.</li>
<li><b>Keep adding directs until you have five.</b> This is the catch: level 3 only opens on five qualifying directs of your own. Two deep, coached well, earns a healthy 20% level. It does not open the 10% level.</li>
</ol>
<div class="meta">
<div><div class="k">Scoreboard</div>Qualifying buyers 2 · level 2 count in My line rising · your directs' own qualifying counts</div>
<div><div class="k">Ceiling and strength</div>Level 2 income until you personally hit five. The stickiest lines come from this play.</div>
</div>
</div>
<div class="card play rec">
<p class="eyebrow" style="margin:0 0 6px">Recommended default</p>
<header><h2>Play 3 · Five and wide</h2><span class="tag">the combination</span></header>
<p class="muted"><b>Fits:</b> anyone willing to do both. This is the play the dashboard ladder is actually built for.</p>
<ol>
<li><b>Sprint to five qualifying directs.</b> Nothing else matters until level 3 is open: Nexus, wall position 3 (your whole public page runs your own links), 100 bonus credits, and the full 50 / 20 / 10.</li>
<li><b>Then split the day.</b> Mornings wide: one new conversation, one post, one ad running. Evenings deep: read My line, message the three newest directs, send the broadcast.</li>
<li><b>Coach the 2-then-5 rule down the line.</b> Each of your five gets pushed to two (your level 2 fills), then to five (your level 3 fills). Use the achievements Share links; people copy what they see rewarded.</li>
<li><b>Book the featured strip for 7 days</b> whenever you have 280 credits spare. Ten slots a day, every member sees it.</li>
</ol>
<div class="meta">
<div><div class="k">Scoreboard</div>All four Overview tiles, plus Earning levels: buyers referred, level open, how many to next</div>
<div><div class="k">Why it wins</div>Width qualifies you. Depth pays you on other people's effort. Only this play does both on purpose.</div>
</div>
</div>
<div class="card">
<h3>Which play fits you</h3>
<div class="tablewrap"><table class="fit-table">
<tr><th>You have</th><th>Run</th><th>First target</th></tr>
<tr><td>A list, a group, or ad budget</td><td>Wide and teach</td><td>Five qualifying directs in 30 days</td></tr>
<tr><td>A few close people and patience</td><td>Two, then down</td><td>Two qualifying directs in 14 days, both coached to their two</td></tr>
<tr><td>An hour a day and a phone</td><td>Five and wide</td><td>Five qualifying, then one wide and one deep action every day</td></tr>
</table></div>
</div>
<div class="card">
<h3>First 30 days, any play</h3>
<div class="cal">
<div><div class="k">Day 1</div>Username. Wallet linked. Payouts on. Welcome tour done (25 credits). Link sent to one person.</div>
<div><div class="k">Days 2 to 7</div>One conversation a day. Claim the daily 5 credits. First buyer (25 bonus credits).</div>
<div><div class="k">Days 8 to 14</div>Second qualifying buyer. Level 2 open. Line banner set. First broadcast sent.</div>
<div><div class="k">Days 15 to 30</div>Coach the two to their two. Add directs three, four, five. Level 3 open by day 30 is the stretch goal.</div>
</div>
</div>
<div class="card">
<h3>Messages that fit each play</h3>
<blockquote><span>Wide</span>I run ads anyway. This one pays me in the same transaction the buyer's package sells, on a public ledger. Free to join by email: <span class="mono" data-link>your link</span></blockquote>
<blockquote><span>Depth</span>I need two people who will actually do this with me, not twenty who will look at it. You are one of the two I thought of. <span class="mono" data-link>your link</span></blockquote>
<blockquote><span>Combination · to a new direct</span>Three things today: username, wallet on, one person. I will check in tomorrow.</blockquote>
</div>
<p class="muted small">No income is guaranteed. Results depend on your effort. Cryptocurrency involves risk of loss. InstantAdPay sells advertising; it is not an investment.</p>
<p><button class="btn sec" type="button" id="printBtn">Print the Qualified Start checklist and 30-day calendar</button></p>
<div class="card" id="adSlotPlays" hidden style="text-align:center"></div>
</div>
<div id="printable">
<h2>InstantAdPay: Qualified Start checklist</h2>
<ol>
<li>Username chosen (Profile tab). It is permanent: it becomes your invite link.</li>
<li>Main wallet linked (Wallet tab, one free signature).</li>
<li>Payouts switched on (Wallet tab, one free transaction).</li>
<li>Extra wallet accounts created in your wallet app: IAP Position 2, 3, 4, 5.</li>
<li>Each extra account funded with enough POL for a $20 package plus gas.</li>
<li>Buy packages: Add a position, tick only the new account, sign once.</li>
<li>Buy from: choose the position, Buy $20, confirm in the wallet.</li>
<li>Repeat. Two positions open level 2. Five open level 3 and the Nexus badge.</li>
</ol>
<h2>First 30 days, any play</h2>
<h3>Day 1</h3><ul><li>Username, wallet linked, payouts on, welcome tour done.</li><li>Link sent to one person.</li></ul>
<h3>Days 2 to 7</h3><ul><li>One conversation a day.</li><li>Claim the daily 5 credits.</li><li>First buyer.</li></ul>
<h3>Days 8 to 14</h3><ul><li>Second qualifying buyer. Level 2 open.</li><li>Line banner set. First broadcast sent.</li></ul>
<h3>Days 15 to 30</h3><ul><li>Coach the two to their two.</li><li>Add directs three, four, five. Level 3 open by day 30 is the stretch goal.</li></ul>
<p>My invite link: <span data-link>__________________________</span></p>
<p style="font-size:12px">No income is guaranteed. Results depend on your effort. Cryptocurrency involves risk of loss. InstantAdPay sells advertising; it is not an investment.</p>
</div>
<footer>
<div>InstantAdPay · <a href="/my#training">back to Training</a> · <a href="/ledger">live ledger</a></div>
<div class="small">Advertising services with a performance referral program. Not an investment product; no income guarantees. Crypto transactions are irreversible. Never spend what you cannot afford.</div>
</footer>
</div>
<script src="/assets/common.js?v=20260923b"></script><script src="/assets/welcome.js?v=20260923b"></script>
<script src="/assets/plays.js?v=20260910b"></script>
</body>
</html>
+35 -35
View File
@@ -1,35 +1,35 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Privacy Policy | InstantAdPay</title>
<link rel="icon" type="image/png" href="/logo-icon.png">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Sora:wght@600;700;800&display=swap">
<link rel="stylesheet" href="/assets/site.css?v=20260910h">
</head>
<body>
<div id="nav"></div>
<section><div class="wrap" style="max-width:820px">
<div class="sectionhead" style="text-align:left"><h2>Privacy Policy</h2><p class="muted small">Last updated: September 2026</p></div>
<div class="card">
<h3>What we collect</h3>
<p class="muted small">A minimal set: the email you sign up with, a username and any profile details you choose to add (avatar, bio, social links), and, only if you link one, your public wallet address. Campaign content you create and reports you submit are stored to run the service. We also read on-chain activity that is already public on the blockchain.</p>
<h3>What we do not collect</h3>
<p class="muted small">We never take custody of your funds or private keys, and we do not sell your personal data.</p>
<h3>How we use it</h3>
<p class="muted small">To run your account, deliver and measure ads, attribute referrals, send service and notification emails (payouts, messages, onboarding), and keep the Platform secure. You can set your email and chat notification preferences in your dashboard.</p>
<h3>Cookies</h3>
<p class="muted small">We use a session cookie to keep you signed in, a referral cookie to credit the sponsor whose link you arrived through, and a browser identifier cookie used only to enforce one account per person. No third-party ad-tracking cookies.</p>
<p class="muted small"><strong>Abuse prevention.</strong> When you create an account and when you sign in we record your IP address, browser type and the browser identifier. We use them to detect duplicate accounts and self-referral, which the Terms prohibit, and for nothing else. They are visible to the site administrator only and are not sold or shared.</p>
<h3>Sharing</h3>
<p class="muted small">Your username, public profile, and public wall are visible to others by design, and on-chain transactions are public by nature. We share data with infrastructure providers (hosting, email delivery) only as needed to operate the service, and when required by law.</p>
<h3>Your choices</h3>
<p class="muted small">You can edit your profile, adjust notification and chat settings, and request account deletion by contacting us. Note that on-chain records cannot be deleted by anyone.</p>
<h3>Security</h3>
<p class="muted small">We use reasonable safeguards, but no system is perfectly secure. Protect your email and your wallet.</p>
</div>
</div></section>
<script src="/assets/common.js?v=20260923b"></script>
<script src="/assets/legal.js?v=20260908a"></script>
</body>
</html>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Privacy Policy | InstantAdPay</title>
<link rel="icon" type="image/png" href="/logo-icon.png">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Sora:wght@600;700;800&display=swap">
<link rel="stylesheet" href="/assets/site.css?v=20260910h">
</head>
<body>
<div id="nav"></div>
<section><div class="wrap" style="max-width:820px">
<div class="sectionhead" style="text-align:left"><h2>Privacy Policy</h2><p class="muted small">Last updated: September 2026</p></div>
<div class="card">
<h3>What we collect</h3>
<p class="muted small">A minimal set: the email you sign up with, a username and any profile details you choose to add (avatar, bio, social links), and, only if you link one, your public wallet address. Campaign content you create and reports you submit are stored to run the service. We also read on-chain activity that is already public on the blockchain.</p>
<h3>What we do not collect</h3>
<p class="muted small">We never take custody of your funds or private keys, and we do not sell your personal data.</p>
<h3>How we use it</h3>
<p class="muted small">To run your account, deliver and measure ads, attribute referrals, send service and notification emails (payouts, messages, onboarding), and keep the Platform secure. You can set your email and chat notification preferences in your dashboard.</p>
<h3>Cookies</h3>
<p class="muted small">We use a session cookie to keep you signed in, a referral cookie to credit the sponsor whose link you arrived through, and a browser identifier cookie used only to enforce one account per person. No third-party ad-tracking cookies.</p>
<p class="muted small"><strong>Abuse prevention.</strong> When you create an account and when you sign in we record your IP address, browser type and the browser identifier. We use them to detect duplicate accounts and self-referral, which the Terms prohibit, and for nothing else. They are visible to the site administrator only and are not sold or shared.</p>
<h3>Sharing</h3>
<p class="muted small">Your username, public profile, and public wall are visible to others by design, and on-chain transactions are public by nature. We share data with infrastructure providers (hosting, email delivery) only as needed to operate the service, and when required by law.</p>
<h3>Your choices</h3>
<p class="muted small">You can edit your profile, adjust notification and chat settings, and request account deletion by contacting us. Note that on-chain records cannot be deleted by anyone.</p>
<h3>Security</h3>
<p class="muted small">We use reasonable safeguards, but no system is perfectly secure. Protect your email and your wallet.</p>
</div>
</div></section>
<script src="/assets/common.js?v=20260923b"></script><script src="/assets/welcome.js?v=20260923b"></script>
<script src="/assets/legal.js?v=20260908a"></script>
</body>
</html>
+43 -43
View File
@@ -1,43 +1,43 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Terms of Service | InstantAdPay</title>
<link rel="icon" type="image/png" href="/logo-icon.png">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Sora:wght@600;700;800&display=swap">
<link rel="stylesheet" href="/assets/site.css?v=20260910h">
</head>
<body>
<div id="nav"></div>
<section><div class="wrap" style="max-width:820px">
<div class="sectionhead" style="text-align:left"><h2>Terms of Service</h2><p class="muted small">Last updated: September 2026</p></div>
<div class="card">
<p class="muted small">Please read these Terms carefully. By creating an account or using InstantAdPay ("the Platform"), you agree to them. If you do not agree, do not use the Platform.</p>
<h3>1. What InstantAdPay is</h3>
<p class="muted small">InstantAdPay is an advertising platform with a referral program. Members buy advertising packages that mint on-chain ad credits and are delivered as banner, text, video, solo, featured, and verified-visit placements. Payments between members are split by an immutable smart contract and settle directly to members' own wallets. InstantAdPay is not a bank, an investment product, a security, or a money-transmission service.</p>
<h3>2. Eligibility</h3>
<p class="muted small">You must be at least 18 and legally able to enter contracts where you live. You are responsible for complying with the laws of your jurisdiction, including any that restrict crypto activity. You may not use the Platform where doing so is unlawful.</p>
<h3>3. Accounts</h3>
<p class="muted small">You join free with an email. Keep your access secure; you are responsible for activity under your account. Your wallet is your own. We never hold, custody, or control your funds or private keys.</p>
<p class="muted small"><strong>One account per person.</strong> Each person may hold exactly one InstantAdPay account. Opening or operating a second account, under any email, name or wallet, is not allowed, and neither is referring yourself through another account. The one sanctioned way to hold more than one position is Qualified Start: extra wallets linked <em>inside your single account</em>, where they are visible as yours. Duplicate accounts may be merged, suspended or closed at our discretion; credits, prizes and contest rankings earned through a duplicate account are forfeited. On-chain payments already made by the contract cannot be reversed by anyone, including us.</p>
<h3>4. Purchases and the smart contract</h3>
<p class="muted small">Package purchases execute on the blockchain. On-chain transactions are final and irreversible. Prices are shown in USD and settled in the network token at the live rate at the moment of purchase. The contract splits each purchase and pays members' wallets in the same transaction; InstantAdPay never touches the money. You are responsible for network fees.</p>
<h3>5. Referrals and qualification</h3>
<p class="muted small">Referral earnings depend on real purchases in your line and on the qualification rules published on the site and enforced by the contract. Nobody earns unless real advertising is bought. We do not promise or guarantee any income.</p>
<h3>6. Advertising rules</h3>
<p class="muted small">Ads you submit must be lawful and must not be deceptive, adult, hateful, malicious, or infringing. Ads are auto-approved for speed; we may remove or pause any ad or campaign at any time, and members can report ads for review. You are solely responsible for the ads you run and the sites they point to.</p>
<h3>7. Acceptable use</h3>
<p class="muted small">No fraud, bots, fake traffic, self-dealing to farm rewards, multiple or duplicate accounts, self-referral through another account, attempts to manipulate the contract, or abuse of other members. We may suspend or terminate accounts that break these rules.</p>
<h3>8. No warranty</h3>
<p class="muted small">The Platform is provided "as is," without warranties of any kind. Blockchains, wallets, oracles, and third-party sites can fail or behave unexpectedly. We do not guarantee uptime, delivery volumes, or results.</p>
<h3>9. Limitation of liability</h3>
<p class="muted small">To the fullest extent permitted by law, InstantAdPay and its operators are not liable for indirect, incidental, or consequential damages, or for losses arising from crypto volatility, irreversible transactions, third-party sites, or your own decisions.</p>
<h3>10. Changes and termination</h3>
<p class="muted small">We may update these Terms and the Platform, and continued use means you accept the changes. We may discontinue features. The immutable contract's rules cannot be changed by anyone, including us.</p>
<p class="muted small" style="margin-top:18px">See also the <a href="/disclaimer">Disclaimer</a> and <a href="/privacy">Privacy Policy</a>.</p>
</div>
</div></section>
<script src="/assets/common.js?v=20260923b"></script>
<script src="/assets/legal.js?v=20260908a"></script>
</body>
</html>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Terms of Service | InstantAdPay</title>
<link rel="icon" type="image/png" href="/logo-icon.png">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Sora:wght@600;700;800&display=swap">
<link rel="stylesheet" href="/assets/site.css?v=20260910h">
</head>
<body>
<div id="nav"></div>
<section><div class="wrap" style="max-width:820px">
<div class="sectionhead" style="text-align:left"><h2>Terms of Service</h2><p class="muted small">Last updated: September 2026</p></div>
<div class="card">
<p class="muted small">Please read these Terms carefully. By creating an account or using InstantAdPay ("the Platform"), you agree to them. If you do not agree, do not use the Platform.</p>
<h3>1. What InstantAdPay is</h3>
<p class="muted small">InstantAdPay is an advertising platform with a referral program. Members buy advertising packages that mint on-chain ad credits and are delivered as banner, text, video, solo, featured, and verified-visit placements. Payments between members are split by an immutable smart contract and settle directly to members' own wallets. InstantAdPay is not a bank, an investment product, a security, or a money-transmission service.</p>
<h3>2. Eligibility</h3>
<p class="muted small">You must be at least 18 and legally able to enter contracts where you live. You are responsible for complying with the laws of your jurisdiction, including any that restrict crypto activity. You may not use the Platform where doing so is unlawful.</p>
<h3>3. Accounts</h3>
<p class="muted small">You join free with an email. Keep your access secure; you are responsible for activity under your account. Your wallet is your own. We never hold, custody, or control your funds or private keys.</p>
<p class="muted small"><strong>One account per person.</strong> Each person may hold exactly one InstantAdPay account. Opening or operating a second account, under any email, name or wallet, is not allowed, and neither is referring yourself through another account. The one sanctioned way to hold more than one position is Qualified Start: extra wallets linked <em>inside your single account</em>, where they are visible as yours. Duplicate accounts may be merged, suspended or closed at our discretion; credits, prizes and contest rankings earned through a duplicate account are forfeited. On-chain payments already made by the contract cannot be reversed by anyone, including us.</p>
<h3>4. Purchases and the smart contract</h3>
<p class="muted small">Package purchases execute on the blockchain. On-chain transactions are final and irreversible. Prices are shown in USD and settled in the network token at the live rate at the moment of purchase. The contract splits each purchase and pays members' wallets in the same transaction; InstantAdPay never touches the money. You are responsible for network fees.</p>
<h3>5. Referrals and qualification</h3>
<p class="muted small">Referral earnings depend on real purchases in your line and on the qualification rules published on the site and enforced by the contract. Nobody earns unless real advertising is bought. We do not promise or guarantee any income.</p>
<h3>6. Advertising rules</h3>
<p class="muted small">Ads you submit must be lawful and must not be deceptive, adult, hateful, malicious, or infringing. Ads are auto-approved for speed; we may remove or pause any ad or campaign at any time, and members can report ads for review. You are solely responsible for the ads you run and the sites they point to.</p>
<h3>7. Acceptable use</h3>
<p class="muted small">No fraud, bots, fake traffic, self-dealing to farm rewards, multiple or duplicate accounts, self-referral through another account, attempts to manipulate the contract, or abuse of other members. We may suspend or terminate accounts that break these rules.</p>
<h3>8. No warranty</h3>
<p class="muted small">The Platform is provided "as is," without warranties of any kind. Blockchains, wallets, oracles, and third-party sites can fail or behave unexpectedly. We do not guarantee uptime, delivery volumes, or results.</p>
<h3>9. Limitation of liability</h3>
<p class="muted small">To the fullest extent permitted by law, InstantAdPay and its operators are not liable for indirect, incidental, or consequential damages, or for losses arising from crypto volatility, irreversible transactions, third-party sites, or your own decisions.</p>
<h3>10. Changes and termination</h3>
<p class="muted small">We may update these Terms and the Platform, and continued use means you accept the changes. We may discontinue features. The immutable contract's rules cannot be changed by anyone, including us.</p>
<p class="muted small" style="margin-top:18px">See also the <a href="/disclaimer">Disclaimer</a> and <a href="/privacy">Privacy Policy</a>.</p>
</div>
</div></section>
<script src="/assets/common.js?v=20260923b"></script><script src="/assets/welcome.js?v=20260923b"></script>
<script src="/assets/legal.js?v=20260908a"></script>
</body>
</html>
+40 -40
View File
@@ -1,40 +1,40 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Transaction | InstantAdPay</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Sora:wght@600;700;800&display=swap">
<link rel="icon" type="image/png" href="/logo-icon.png">
<link rel="stylesheet" href="/assets/site.css?v=20260910h">
</head>
<body>
<div id="nav"></div>
<section>
<div class="wrap" style="max-width:860px">
<div class="sectionhead" style="text-align:left">
<h2>One transaction, <em>fully public</em></h2>
<p>Pulled straight from the chain this site settles on. Every field below is read from the node,
not from our database.</p>
</div>
<div class="card">
<p><span class="badge" id="txStatus">looking it up…</span>
<span class="small muted" id="txChain"></span></p>
<p class="mono small" id="txHash" style="overflow-wrap:anywhere"></p>
<div class="tablewrap"><table id="txTable" hidden>
<tbody></tbody>
</table></div>
<p class="small muted" id="txHint" hidden>Nothing under that hash on this chain yet. If the
transaction just happened, give the next block a moment and refresh.</p>
</div>
<div class="card" id="evCard" hidden>
<h3>What this transaction did</h3>
<p class="muted small">The contract events inside it, decoded to plain language.</p>
<div class="feed" id="evFeed"></div>
</div>
<p><a href="/ledger">← Back to the live ledger</a> · <a href="/contract">Read the contract review</a></p>
</div>
</section>
<script src="/assets/common.js?v=20260923b"></script>
<script src="/assets/tx.js?v=20260906m"></script>
</body>
</html>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Transaction | InstantAdPay</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Sora:wght@600;700;800&display=swap">
<link rel="icon" type="image/png" href="/logo-icon.png">
<link rel="stylesheet" href="/assets/site.css?v=20260910h">
</head>
<body>
<div id="nav"></div>
<section>
<div class="wrap" style="max-width:860px">
<div class="sectionhead" style="text-align:left">
<h2>One transaction, <em>fully public</em></h2>
<p>Pulled straight from the chain this site settles on. Every field below is read from the node,
not from our database.</p>
</div>
<div class="card">
<p><span class="badge" id="txStatus">looking it up…</span>
<span class="small muted" id="txChain"></span></p>
<p class="mono small" id="txHash" style="overflow-wrap:anywhere"></p>
<div class="tablewrap"><table id="txTable" hidden>
<tbody></tbody>
</table></div>
<p class="small muted" id="txHint" hidden>Nothing under that hash on this chain yet. If the
transaction just happened, give the next block a moment and refresh.</p>
</div>
<div class="card" id="evCard" hidden>
<h3>What this transaction did</h3>
<p class="muted small">The contract events inside it, decoded to plain language.</p>
<div class="feed" id="evFeed"></div>
</div>
<p><a href="/ledger">← Back to the live ledger</a> · <a href="/contract">Read the contract review</a></p>
</div>
</section>
<script src="/assets/common.js?v=20260923b"></script><script src="/assets/welcome.js?v=20260923b"></script>
<script src="/assets/tx.js?v=20260906m"></script>
</body>
</html>
+53 -53
View File
@@ -1,53 +1,53 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Banner wall | InstantAdPay</title>
<!--OG-->
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Sora:wght@600;700;800&display=swap">
<link rel="icon" type="image/png" href="/logo-icon.png">
<link rel="stylesheet" href="/assets/site.css?v=20260911w">
</head>
<body>
<div id="nav"></div>
<section>
<div class="wrap" style="max-width:920px">
<div class="wall-hero" style="text-align:center;padding:26px 0 18px">
<p style="margin:0 0 8px;font-family:var(--disp);font-weight:800;font-size:clamp(22px,3vw,30px);color:var(--ink);letter-spacing:-.01em">Instant<span style="color:var(--mint)">AdPay</span> <span style="font-weight:500;font-size:.62em;color:var(--muted)">member wall</span></p>
<h1 style="font-size:clamp(28px,4.4vw,44px);margin:0 0 10px;line-height:1.1">Advertise and earn. <em style="font-style:normal;color:var(--mint)">Paid on-chain, instantly.</em></h1>
<p class="muted" style="max-width:640px;margin:0 auto;font-size:15.5px">Real ad packages from $5. Every payout arrives as <b style="color:var(--ink)">POL on Polygon</b> in your own wallet, in the same transaction the package sells, on a public ledger. Free to join by email, and <span id="wallHost">this member</span> is your sponsor if you join from here.</p>
</div>
<div class="bio-head" id="bioHead" hidden>
<img id="bioAvatar" class="bio-avatar" alt="" hidden>
<img id="bioBadge" class="bio-badge" alt="achievement badge" hidden>
<div class="bio-meta">
<p class="eyebrow">Your sponsor on InstantAdPay</p>
<h2 id="wallTitle" style="margin:.1em 0">Loading…</h2>
<p id="bioText" class="lead" style="font-size:16px"></p>
<div id="bioSocials" class="bio-socials"></div>
</div>
<div class="bio-qr"><img id="bioQr" alt="Join QR code" width="150" height="150"><div class="small muted" style="text-align:center">scan to join</div></div>
</div>
<div class="bio-video" id="bioVideo" hidden></div>
<div class="sectionhead" style="text-align:left;margin-top:10px">
<h3 style="margin:0">The line, three levels deep</h3>
<p>Three positions, three levels — the exact levels the contract pays. Every banner here belongs
to a real member of this line, and every payment between them settles on-chain, instantly.</p>
</div>
<div class="grid c3" id="wallGrid"></div>
<div class="card" id="adSlotWallText" hidden style="margin-top:16px"></div>
<div class="card" id="adSlotWallBanner" hidden></div>
<div class="card" style="margin-top:22px;text-align:center">
<h3 id="wallCtaHead">Join this line</h3>
<p class="muted small">Free to join with just an email. Your wallet only comes out if you buy —
and payments go straight to member wallets, never through an admin.</p>
<p id="wallGate" class="small" style="color:var(--amber);font-weight:600" hidden></p>
<p><a class="btn" id="wallJoin">Join free through this wall</a></p>
<p class="small muted"><a href="/ledger">Watch the live ledger</a> · <a href="/contract">Read the contract</a></p>
</div>
</div>
</section>
<script src="/assets/common.js?v=20260923b"></script>
<script src="/assets/wall.js?v=20260911v"></script>
</body>
</html>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Banner wall | InstantAdPay</title>
<!--OG-->
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Sora:wght@600;700;800&display=swap">
<link rel="icon" type="image/png" href="/logo-icon.png">
<link rel="stylesheet" href="/assets/site.css?v=20260911w">
</head>
<body>
<div id="nav"></div>
<section>
<div class="wrap" style="max-width:920px">
<div class="wall-hero" style="text-align:center;padding:26px 0 18px">
<p style="margin:0 0 8px;font-family:var(--disp);font-weight:800;font-size:clamp(22px,3vw,30px);color:var(--ink);letter-spacing:-.01em">Instant<span style="color:var(--mint)">AdPay</span> <span style="font-weight:500;font-size:.62em;color:var(--muted)">member wall</span></p>
<h1 style="font-size:clamp(28px,4.4vw,44px);margin:0 0 10px;line-height:1.1">Advertise and earn. <em style="font-style:normal;color:var(--mint)">Paid on-chain, instantly.</em></h1>
<p class="muted" style="max-width:640px;margin:0 auto;font-size:15.5px">Real ad packages from $5. Every payout arrives as <b style="color:var(--ink)">POL on Polygon</b> in your own wallet, in the same transaction the package sells, on a public ledger. Free to join by email, and <span id="wallHost">this member</span> is your sponsor if you join from here.</p>
</div>
<div class="bio-head" id="bioHead" hidden>
<img id="bioAvatar" class="bio-avatar" alt="" hidden>
<img id="bioBadge" class="bio-badge" alt="achievement badge" hidden>
<div class="bio-meta">
<p class="eyebrow">Your sponsor on InstantAdPay</p>
<h2 id="wallTitle" style="margin:.1em 0">Loading…</h2>
<p id="bioText" class="lead" style="font-size:16px"></p>
<div id="bioSocials" class="bio-socials"></div>
</div>
<div class="bio-qr"><img id="bioQr" alt="Join QR code" width="150" height="150"><div class="small muted" style="text-align:center">scan to join</div></div>
</div>
<div class="bio-video" id="bioVideo" hidden></div>
<div class="sectionhead" style="text-align:left;margin-top:10px">
<h3 style="margin:0">The line, three levels deep</h3>
<p>Three positions, three levels — the exact levels the contract pays. Every banner here belongs
to a real member of this line, and every payment between them settles on-chain, instantly.</p>
</div>
<div class="grid c3" id="wallGrid"></div>
<div class="card" id="adSlotWallText" hidden style="margin-top:16px"></div>
<div class="card" id="adSlotWallBanner" hidden></div>
<div class="card" style="margin-top:22px;text-align:center">
<h3 id="wallCtaHead">Join this line</h3>
<p class="muted small">Free to join with just an email. Your wallet only comes out if you buy —
and payments go straight to member wallets, never through an admin.</p>
<p id="wallGate" class="small" style="color:var(--amber);font-weight:600" hidden></p>
<p><a class="btn" id="wallJoin">Join free through this wall</a></p>
<p class="small muted"><a href="/ledger">Watch the live ledger</a> · <a href="/contract">Read the contract</a></p>
</div>
</div>
</section>
<script src="/assets/common.js?v=20260923b"></script><script src="/assets/welcome.js?v=20260923b"></script>
<script src="/assets/wall.js?v=20260911v"></script>
</body>
</html>
+127 -127
View File
@@ -1,127 +1,127 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Wallets and buying POL | InstantAdPay</title>
<meta name="description" content="Which wallets to use with InstantAdPay, how to set one up, and how to buy POL with a card through MoonPay. Member training.">
<meta name="robots" content="noindex">
<meta name="theme-color" content="#043b2f">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Sora:wght@600;700;800&display=swap">
<link rel="icon" type="image/png" href="/logo-icon.png">
<link rel="stylesheet" href="/assets/site.css?v=20260910j">
<style>
.wl-rule{border-left:4px solid #f2c94c;background:rgba(242,201,76,.08);padding:16px 20px;border-radius:0 12px 12px 0;margin:0 0 28px}
.wl-rule b{font-family:var(--disp);font-size:17px;display:block;margin-bottom:6px}
.wl-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:12px;margin:0 0 8px}
.wl-grid>div{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:16px 18px}
.wl-grid h3{margin:0 0 4px;font-size:18px}
.wl-grid .tag{font-family:var(--mono);font-size:11px;color:var(--mint);border:1px solid rgba(67,232,195,.4);border-radius:999px;padding:2px 9px;margin-left:8px;vertical-align:middle}
.wl-grid .tag.warn{color:#f2c94c;border-color:rgba(242,201,76,.5)}
.wl-grid p{margin:6px 0 0;font-size:14px;color:var(--muted)}
.wl-grid .rec{border-color:var(--mint);box-shadow:0 0 40px rgba(67,232,195,.1)}
.steps{counter-reset:s;margin:0;padding:0;list-style:none}
.steps li{counter-increment:s;position:relative;padding:0 0 16px 46px;font-size:15px;line-height:1.5}
.steps li::before{content:counter(s);position:absolute;left:0;top:0;width:32px;height:32px;border-radius:50%;background:rgba(67,232,195,.12);border:1px solid rgba(67,232,195,.45);color:var(--mint);font-family:var(--disp);font-weight:800;display:flex;align-items:center;justify-content:center;font-size:14px}
.steps li b{color:var(--ink)}
.wl-links{margin:10px 0 0;display:flex;gap:6px;flex-wrap:wrap}
.wl-links .btn{margin-top:0}
.note{background:rgba(4,8,7,.45);border:1px solid var(--line);border-radius:10px;padding:12px 16px;font-size:14px;color:var(--muted);margin:0 0 12px}
.note b{color:var(--ink)}
h2{margin:34px 0 10px;font-size:26px}
.faq details{margin:0 0 8px}
#gate{display:none}
@media (max-width:720px){.wl-grid{grid-template-columns:1fr}}
</style>
</head>
<body>
<div class="wrap">
<section class="hero" style="padding:70px 0 24px">
<p class="eyebrow">Member training</p>
<h1>Wallets, and <em>buying POL</em>.</h1>
<p class="lead">Which wallet to use, how to set it up in five minutes, and how to buy POL with a debit or credit card through MoonPay so it lands in your own wallet.</p>
</section>
<div class="card" id="gate"><h3>Members only</h3><p class="muted small">Sign in to your member area to read this guide. <a href="/my">Sign in</a></p></div>
<div id="body">
<div class="wl-rule">
<b>One coin, one network: POL on Polygon.</b>
Packages are paid in POL and every payout arrives as POL in your own wallet. Nothing else is used. When you buy, choose <b>POL</b> on the <b>Polygon</b> network, never MATIC on Ethereum and never another chain. The site never holds your money: you pay the contract from your wallet and the contract pays your line in the same transaction.
</div>
<h2 style="margin-top:0">Preferred wallets</h2>
<p class="muted" style="margin:0 0 14px">Any wallet that supports the Polygon network works. These are the ones we have tested end to end.</p>
<div class="wl-grid">
<div class="rec">
<h3>MetaMask <span class="tag">recommended</span></h3>
<p>Browser extension on desktop, app on phone. The one to use for Qualified Start, because it lets you add extra accounts under the same wallet, one per position. Connects directly on desktop and through WalletConnect on mobile.</p>
<p class="wl-links"><a class="btn small sec" href="https://metamask.io/download" target="_blank" rel="noopener">Website</a> <a class="btn small sec" href="https://apps.apple.com/app/id1438144202" target="_blank" rel="noopener">App Store</a> <a class="btn small sec" href="https://play.google.com/store/apps/details?id=io.metamask" target="_blank" rel="noopener">Google Play</a> <a class="btn small sec" href="https://metamask.io/download" target="_blank" rel="noopener">Browser extension</a></p>
</div>
<div>
<h3>Phantom</h3>
<p>Clean phone and desktop apps, no purchase-size block. Good choice if you are new and only ever plan to run one position. <b>One setup step:</b> Phantom ships with Polygon switched off. Open Settings, then Active Networks (Developer Settings on some versions), and turn Polygon on before you connect. Until it is on, the connect and buy buttons here will fail or show the wrong network.</p>
<p class="wl-links"><a class="btn small sec" href="https://phantom.com/download" target="_blank" rel="noopener">Website</a> <a class="btn small sec" href="https://apps.apple.com/app/id1598432977" target="_blank" rel="noopener">App Store</a> <a class="btn small sec" href="https://play.google.com/store/apps/details?id=app.phantom" target="_blank" rel="noopener">Google Play</a> <a class="btn small sec" href="https://phantom.com/download" target="_blank" rel="noopener">Browser extension</a></p>
</div>
<div>
<h3>SafePal</h3>
<p>Phone app with a built-in card purchase option for POL. Connects through WalletConnect. Works well for members who do everything on a phone.</p>
<p class="wl-links"><a class="btn small sec" href="https://www.safepal.com/download" target="_blank" rel="noopener">Website</a> <a class="btn small sec" href="https://apps.apple.com/app/id1548297139" target="_blank" rel="noopener">App Store</a> <a class="btn small sec" href="https://play.google.com/store/apps/details?id=io.safepal.wallet" target="_blank" rel="noopener">Google Play</a></p>
</div>
<div>
<h3>Coinbase Wallet</h3>
<p>The self-custody wallet from Coinbase, not the exchange account. Handy if you already buy crypto on Coinbase: buy POL there and send it to this wallet on the Polygon network.</p>
<p class="wl-links"><a class="btn small sec" href="https://www.coinbase.com/wallet" target="_blank" rel="noopener">Website</a> <a class="btn small sec" href="https://apps.apple.com/app/id1278383455" target="_blank" rel="noopener">App Store</a> <a class="btn small sec" href="https://play.google.com/store/apps/details?id=org.toshi" target="_blank" rel="noopener">Google Play</a> <a class="btn small sec" href="https://www.coinbase.com/wallet" target="_blank" rel="noopener">Browser extension</a></p>
</div>
<div style="grid-column:1/-1">
<h3>Trust Wallet <span class="tag warn">works, with one catch</span></h3>
<p>Trust Wallet blocks any purchase that would spend most of the POL in the wallet. You see a red "this transaction will drain your wallet" screen with no way past it. If you use Trust, keep about <b>twice the package cost</b> in POL, or buy a smaller package first. The extra POL stays yours. If a blocked attempt leaves the connection dead, open Wallet, tap Disconnect, then Connect again.</p>
<p class="wl-links"><a class="btn small sec" href="https://trustwallet.com/download" target="_blank" rel="noopener">Website</a> <a class="btn small sec" href="https://apps.apple.com/app/id1288339409" target="_blank" rel="noopener">App Store</a> <a class="btn small sec" href="https://play.google.com/store/apps/details?id=com.wallet.crypto.trustapp" target="_blank" rel="noopener">Google Play</a> <a class="btn small sec" href="https://trustwallet.com/download" target="_blank" rel="noopener">Browser extension</a></p>
</div>
</div>
<h2>Set up a wallet in five minutes</h2>
<ol class="steps">
<li><b>Install it from the official source only.</b> MetaMask: metamask.io. Phantom: phantom.app. SafePal: safepal.io. Coinbase Wallet: wallet.coinbase.com. On a phone, use the app store listing those sites point to.</li>
<li><b>Create a new wallet</b> and set a device password or PIN.</li>
<li><b>Write down the recovery phrase</b> (12 or 24 words) on paper and keep it offline. Anyone who has those words has your money. Nobody from InstantAdPay will ever ask for them, and the site never sees them.</li>
<li><b>Make sure Polygon is available.</b> MetaMask asks to switch to Polygon the first time InstantAdPay needs it; approve that. SafePal and Coinbase Wallet include Polygon already. Phantom has Polygon built in but switched off by default: Settings, then Active Networks, turn on Polygon.</li>
<li><b>Copy your address.</b> It starts with 0x and is the same on every EVM network. This is where your POL goes and where your payouts arrive.</li>
<li><b>Link it in Members</b>: open the Wallet tab, tap Connect, and sign the free message. Then <b>Switch on payouts</b>, one small transaction that registers your address with the contract. Do both before your people start buying, so their first purchase pays you.</li>
</ol>
<h2>Buy POL with a card through MoonPay</h2>
<p class="muted" style="margin:0 0 14px">MoonPay is a licensed card-to-crypto service. You pay them, they send POL to your wallet. InstantAdPay is never in the middle of that payment.</p>
<p style="margin:0 0 18px"><button class="btn" id="wlMoonpay" type="button">💳 Buy POL with a card (MoonPay)</button> <span class="small muted" id="wlMoonpayNote">Opens in a new tab with POL on Polygon selected.</span></p>
<ol class="steps">
<li><b>Have your wallet connected first</b> (Wallet tab). Then open <b>Buy packages</b> and look at the live POL price for the package you want. Plan to buy that amount <b>plus 2 or 3 POL</b> for network fees. Trust Wallet users: buy about double.</li>
<li><b>Tap "Buy POL with a card"</b> under the packages. MoonPay opens in a new tab with <b>POL on Polygon</b> selected and <b>your own wallet address filled in</b>. If for any reason it is not filled in, choose POL (Polygon) yourself and paste your address from step 5 above.</li>
<li><b>Enter the amount</b> in dollars or POL and pay with a debit card, credit card, Apple Pay or Google Pay. MoonPay has a minimum order, usually around $30, so the $5 package on its own is below it. Buy enough for the package you actually want.</li>
<li><b>First time only: identity check.</b> MoonPay asks for your email, phone and a photo ID. This is their legal requirement, not ours. It normally takes a few minutes; occasionally a review takes longer, and MoonPay emails you when it clears.</li>
<li><b>Wait for the POL to land.</b> Usually a few minutes. Your wallet balance shows on the Wallet tab and next to your positions.</li>
<li><b>Go back to Buy packages</b> and buy. The wallet asks you to confirm one transaction. The moment it settles, your credits are minted and your line is paid.</li>
</ol>
<div class="note"><b>Already own crypto on an exchange?</b> Coinbase, Kraken, Binance and most others sell POL. Withdraw it to your wallet address and pick the <b>Polygon</b> network on the withdrawal screen. Sending on the wrong network can lose the funds.</div>
<div class="note"><b>Prefer to buy inside the wallet?</b> MetaMask, Trust, SafePal and Phantom all have a Buy button that uses MoonPay or a similar provider. Same rule: POL, Polygon network, your own address.</div>
<h2>Common questions</h2>
<div class="faq">
<details><summary>Do I need a wallet to join?</summary><p>No. Join with your email. The wallet comes out only when you buy a package or switch on payouts.</p></details>
<details><summary>How much POL do I need?</summary><p>The Buy packages tab shows the live POL cost of each package. Buy that plus 2 or 3 POL for fees. There is no other cost.</p></details>
<details><summary>Why did MoonPay decline my card?</summary><p>Some banks block crypto purchases. Try a different card, Apple Pay or Google Pay, or buy on an exchange and withdraw to your wallet on Polygon.</p></details>
<details><summary>Can I use the same wallet for more than one position?</summary><p>One address is one position on the contract. For Qualified Start, add extra accounts inside MetaMask, each with its own address, and link them on the Buy packages tab. The three Qualified Start videos in Training walk through it.</p></details>
<details><summary>Where do my payouts go?</summary><p>To the wallet address you switched payouts on with, in the same transaction as the purchase that earned them. Nothing is held on the site.</p></details>
</div>
<p class="small muted" style="margin:26px 0 0">Advertising, not investing. No income is guaranteed; results depend on your effort. Crypto transactions are irreversible and carry risk of loss. MoonPay is an independent, licensed provider; its fees and limits are its own.</p>
</div>
<footer>
<div>InstantAdPay · <a href="/my#training">back to Training</a> · <a href="/my#buy">Buy packages</a> · <a href="/my#wallet">Wallet</a></div>
<div class="small">Advertising services with a performance referral program. Not an investment product; no income guarantees. Crypto transactions are irreversible. Never share your recovery phrase.</div>
</footer>
</div>
<script src="/assets/common.js?v=20260923b"></script>
<script src="/assets/wallets.js?v=20260911b"></script>
</body>
</html>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Wallets and buying POL | InstantAdPay</title>
<meta name="description" content="Which wallets to use with InstantAdPay, how to set one up, and how to buy POL with a card through MoonPay. Member training.">
<meta name="robots" content="noindex">
<meta name="theme-color" content="#043b2f">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Sora:wght@600;700;800&display=swap">
<link rel="icon" type="image/png" href="/logo-icon.png">
<link rel="stylesheet" href="/assets/site.css?v=20260910j">
<style>
.wl-rule{border-left:4px solid #f2c94c;background:rgba(242,201,76,.08);padding:16px 20px;border-radius:0 12px 12px 0;margin:0 0 28px}
.wl-rule b{font-family:var(--disp);font-size:17px;display:block;margin-bottom:6px}
.wl-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:12px;margin:0 0 8px}
.wl-grid>div{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:16px 18px}
.wl-grid h3{margin:0 0 4px;font-size:18px}
.wl-grid .tag{font-family:var(--mono);font-size:11px;color:var(--mint);border:1px solid rgba(67,232,195,.4);border-radius:999px;padding:2px 9px;margin-left:8px;vertical-align:middle}
.wl-grid .tag.warn{color:#f2c94c;border-color:rgba(242,201,76,.5)}
.wl-grid p{margin:6px 0 0;font-size:14px;color:var(--muted)}
.wl-grid .rec{border-color:var(--mint);box-shadow:0 0 40px rgba(67,232,195,.1)}
.steps{counter-reset:s;margin:0;padding:0;list-style:none}
.steps li{counter-increment:s;position:relative;padding:0 0 16px 46px;font-size:15px;line-height:1.5}
.steps li::before{content:counter(s);position:absolute;left:0;top:0;width:32px;height:32px;border-radius:50%;background:rgba(67,232,195,.12);border:1px solid rgba(67,232,195,.45);color:var(--mint);font-family:var(--disp);font-weight:800;display:flex;align-items:center;justify-content:center;font-size:14px}
.steps li b{color:var(--ink)}
.wl-links{margin:10px 0 0;display:flex;gap:6px;flex-wrap:wrap}
.wl-links .btn{margin-top:0}
.note{background:rgba(4,8,7,.45);border:1px solid var(--line);border-radius:10px;padding:12px 16px;font-size:14px;color:var(--muted);margin:0 0 12px}
.note b{color:var(--ink)}
h2{margin:34px 0 10px;font-size:26px}
.faq details{margin:0 0 8px}
#gate{display:none}
@media (max-width:720px){.wl-grid{grid-template-columns:1fr}}
</style>
</head>
<body>
<div class="wrap">
<section class="hero" style="padding:70px 0 24px">
<p class="eyebrow">Member training</p>
<h1>Wallets, and <em>buying POL</em>.</h1>
<p class="lead">Which wallet to use, how to set it up in five minutes, and how to buy POL with a debit or credit card through MoonPay so it lands in your own wallet.</p>
</section>
<div class="card" id="gate"><h3>Members only</h3><p class="muted small">Sign in to your member area to read this guide. <a href="/my">Sign in</a></p></div>
<div id="body">
<div class="wl-rule">
<b>One coin, one network: POL on Polygon.</b>
Packages are paid in POL and every payout arrives as POL in your own wallet. Nothing else is used. When you buy, choose <b>POL</b> on the <b>Polygon</b> network, never MATIC on Ethereum and never another chain. The site never holds your money: you pay the contract from your wallet and the contract pays your line in the same transaction.
</div>
<h2 style="margin-top:0">Preferred wallets</h2>
<p class="muted" style="margin:0 0 14px">Any wallet that supports the Polygon network works. These are the ones we have tested end to end.</p>
<div class="wl-grid">
<div class="rec">
<h3>MetaMask <span class="tag">recommended</span></h3>
<p>Browser extension on desktop, app on phone. The one to use for Qualified Start, because it lets you add extra accounts under the same wallet, one per position. Connects directly on desktop and through WalletConnect on mobile.</p>
<p class="wl-links"><a class="btn small sec" href="https://metamask.io/download" target="_blank" rel="noopener">Website</a> <a class="btn small sec" href="https://apps.apple.com/app/id1438144202" target="_blank" rel="noopener">App Store</a> <a class="btn small sec" href="https://play.google.com/store/apps/details?id=io.metamask" target="_blank" rel="noopener">Google Play</a> <a class="btn small sec" href="https://metamask.io/download" target="_blank" rel="noopener">Browser extension</a></p>
</div>
<div>
<h3>Phantom</h3>
<p>Clean phone and desktop apps, no purchase-size block. Good choice if you are new and only ever plan to run one position. <b>One setup step:</b> Phantom ships with Polygon switched off. Open Settings, then Active Networks (Developer Settings on some versions), and turn Polygon on before you connect. Until it is on, the connect and buy buttons here will fail or show the wrong network.</p>
<p class="wl-links"><a class="btn small sec" href="https://phantom.com/download" target="_blank" rel="noopener">Website</a> <a class="btn small sec" href="https://apps.apple.com/app/id1598432977" target="_blank" rel="noopener">App Store</a> <a class="btn small sec" href="https://play.google.com/store/apps/details?id=app.phantom" target="_blank" rel="noopener">Google Play</a> <a class="btn small sec" href="https://phantom.com/download" target="_blank" rel="noopener">Browser extension</a></p>
</div>
<div>
<h3>SafePal</h3>
<p>Phone app with a built-in card purchase option for POL. Connects through WalletConnect. Works well for members who do everything on a phone.</p>
<p class="wl-links"><a class="btn small sec" href="https://www.safepal.com/download" target="_blank" rel="noopener">Website</a> <a class="btn small sec" href="https://apps.apple.com/app/id1548297139" target="_blank" rel="noopener">App Store</a> <a class="btn small sec" href="https://play.google.com/store/apps/details?id=io.safepal.wallet" target="_blank" rel="noopener">Google Play</a></p>
</div>
<div>
<h3>Coinbase Wallet</h3>
<p>The self-custody wallet from Coinbase, not the exchange account. Handy if you already buy crypto on Coinbase: buy POL there and send it to this wallet on the Polygon network.</p>
<p class="wl-links"><a class="btn small sec" href="https://www.coinbase.com/wallet" target="_blank" rel="noopener">Website</a> <a class="btn small sec" href="https://apps.apple.com/app/id1278383455" target="_blank" rel="noopener">App Store</a> <a class="btn small sec" href="https://play.google.com/store/apps/details?id=org.toshi" target="_blank" rel="noopener">Google Play</a> <a class="btn small sec" href="https://www.coinbase.com/wallet" target="_blank" rel="noopener">Browser extension</a></p>
</div>
<div style="grid-column:1/-1">
<h3>Trust Wallet <span class="tag warn">works, with one catch</span></h3>
<p>Trust Wallet blocks any purchase that would spend most of the POL in the wallet. You see a red "this transaction will drain your wallet" screen with no way past it. If you use Trust, keep about <b>twice the package cost</b> in POL, or buy a smaller package first. The extra POL stays yours. If a blocked attempt leaves the connection dead, open Wallet, tap Disconnect, then Connect again.</p>
<p class="wl-links"><a class="btn small sec" href="https://trustwallet.com/download" target="_blank" rel="noopener">Website</a> <a class="btn small sec" href="https://apps.apple.com/app/id1288339409" target="_blank" rel="noopener">App Store</a> <a class="btn small sec" href="https://play.google.com/store/apps/details?id=com.wallet.crypto.trustapp" target="_blank" rel="noopener">Google Play</a> <a class="btn small sec" href="https://trustwallet.com/download" target="_blank" rel="noopener">Browser extension</a></p>
</div>
</div>
<h2>Set up a wallet in five minutes</h2>
<ol class="steps">
<li><b>Install it from the official source only.</b> MetaMask: metamask.io. Phantom: phantom.app. SafePal: safepal.io. Coinbase Wallet: wallet.coinbase.com. On a phone, use the app store listing those sites point to.</li>
<li><b>Create a new wallet</b> and set a device password or PIN.</li>
<li><b>Write down the recovery phrase</b> (12 or 24 words) on paper and keep it offline. Anyone who has those words has your money. Nobody from InstantAdPay will ever ask for them, and the site never sees them.</li>
<li><b>Make sure Polygon is available.</b> MetaMask asks to switch to Polygon the first time InstantAdPay needs it; approve that. SafePal and Coinbase Wallet include Polygon already. Phantom has Polygon built in but switched off by default: Settings, then Active Networks, turn on Polygon.</li>
<li><b>Copy your address.</b> It starts with 0x and is the same on every EVM network. This is where your POL goes and where your payouts arrive.</li>
<li><b>Link it in Members</b>: open the Wallet tab, tap Connect, and sign the free message. Then <b>Switch on payouts</b>, one small transaction that registers your address with the contract. Do both before your people start buying, so their first purchase pays you.</li>
</ol>
<h2>Buy POL with a card through MoonPay</h2>
<p class="muted" style="margin:0 0 14px">MoonPay is a licensed card-to-crypto service. You pay them, they send POL to your wallet. InstantAdPay is never in the middle of that payment.</p>
<p style="margin:0 0 18px"><button class="btn" id="wlMoonpay" type="button">💳 Buy POL with a card (MoonPay)</button> <span class="small muted" id="wlMoonpayNote">Opens in a new tab with POL on Polygon selected.</span></p>
<ol class="steps">
<li><b>Have your wallet connected first</b> (Wallet tab). Then open <b>Buy packages</b> and look at the live POL price for the package you want. Plan to buy that amount <b>plus 2 or 3 POL</b> for network fees. Trust Wallet users: buy about double.</li>
<li><b>Tap "Buy POL with a card"</b> under the packages. MoonPay opens in a new tab with <b>POL on Polygon</b> selected and <b>your own wallet address filled in</b>. If for any reason it is not filled in, choose POL (Polygon) yourself and paste your address from step 5 above.</li>
<li><b>Enter the amount</b> in dollars or POL and pay with a debit card, credit card, Apple Pay or Google Pay. MoonPay has a minimum order, usually around $30, so the $5 package on its own is below it. Buy enough for the package you actually want.</li>
<li><b>First time only: identity check.</b> MoonPay asks for your email, phone and a photo ID. This is their legal requirement, not ours. It normally takes a few minutes; occasionally a review takes longer, and MoonPay emails you when it clears.</li>
<li><b>Wait for the POL to land.</b> Usually a few minutes. Your wallet balance shows on the Wallet tab and next to your positions.</li>
<li><b>Go back to Buy packages</b> and buy. The wallet asks you to confirm one transaction. The moment it settles, your credits are minted and your line is paid.</li>
</ol>
<div class="note"><b>Already own crypto on an exchange?</b> Coinbase, Kraken, Binance and most others sell POL. Withdraw it to your wallet address and pick the <b>Polygon</b> network on the withdrawal screen. Sending on the wrong network can lose the funds.</div>
<div class="note"><b>Prefer to buy inside the wallet?</b> MetaMask, Trust, SafePal and Phantom all have a Buy button that uses MoonPay or a similar provider. Same rule: POL, Polygon network, your own address.</div>
<h2>Common questions</h2>
<div class="faq">
<details><summary>Do I need a wallet to join?</summary><p>No. Join with your email. The wallet comes out only when you buy a package or switch on payouts.</p></details>
<details><summary>How much POL do I need?</summary><p>The Buy packages tab shows the live POL cost of each package. Buy that plus 2 or 3 POL for fees. There is no other cost.</p></details>
<details><summary>Why did MoonPay decline my card?</summary><p>Some banks block crypto purchases. Try a different card, Apple Pay or Google Pay, or buy on an exchange and withdraw to your wallet on Polygon.</p></details>
<details><summary>Can I use the same wallet for more than one position?</summary><p>One address is one position on the contract. For Qualified Start, add extra accounts inside MetaMask, each with its own address, and link them on the Buy packages tab. The three Qualified Start videos in Training walk through it.</p></details>
<details><summary>Where do my payouts go?</summary><p>To the wallet address you switched payouts on with, in the same transaction as the purchase that earned them. Nothing is held on the site.</p></details>
</div>
<p class="small muted" style="margin:26px 0 0">Advertising, not investing. No income is guaranteed; results depend on your effort. Crypto transactions are irreversible and carry risk of loss. MoonPay is an independent, licensed provider; its fees and limits are its own.</p>
</div>
<footer>
<div>InstantAdPay · <a href="/my#training">back to Training</a> · <a href="/my#buy">Buy packages</a> · <a href="/my#wallet">Wallet</a></div>
<div class="small">Advertising services with a performance referral program. Not an investment product; no income guarantees. Crypto transactions are irreversible. Never share your recovery phrase.</div>
</footer>
</div>
<script src="/assets/common.js?v=20260923b"></script><script src="/assets/welcome.js?v=20260923b"></script>
<script src="/assets/wallets.js?v=20260911b"></script>
</body>
</html>
+120 -119
View File
@@ -1,119 +1,120 @@
// InstantAdPay QA harness: earning flows, driven end to end on a LOCAL copy.
// node qa/earn.mjs
// Seeds house ads through the admin API (needs ADMIN_PASSWORD of the local server), signs in a fresh
// member, then runs: Watch ads x5 (incl. one wrong captcha pick) + daily claim, Watch videos, Verified
// visits, Inbox solo read + claim. Reports credited amounts and any trip-ups (e.g. a check button
// covered by the overlay's close button). Dwell timers run for real, so allow ~2 minutes.
// Env: LOCAL (default http://127.0.0.1:8797), ADMIN_PASSWORD (default localtest), OUT, PW
// Exit code 1 when a flow that had inventory failed to credit.
import { pathToFileURL } from 'node:url';
import fs from 'node:fs';
const PW = process.env.PW || 'D:/Projects/MarketingAgent/qa-tester/node_modules/playwright';
const { chromium } = (await import(pathToFileURL(PW + '/index.js').href)).default;
const B = process.env.LOCAL || 'http://127.0.0.1:8797';
const OUT = process.env.OUT || 'qa/out';
const ADMIN = process.env.ADMIN_PASSWORD || 'localtest';
fs.mkdirSync(OUT, { recursive: true });
const CAP = { rocket: '🚀', 'lightning bolt': '⚡', key: '🔑', target: '🎯', wave: '🌊', flame: '🔥', diamond: '💎', magnet: '🧲', bell: '🔔', moon: '🌙' };
const lines = []; const log = (...a) => { const s = a.join(' '); console.log(s); lines.push(s); };
const problems = [];
const browser = await chromium.launch();
const ctx = await browser.newContext({ viewport: { width: 1280, height: 950 } });
const page = await ctx.newPage();
page.on('dialog', d => d.accept());
const api = async (p, body) => (await page.request.fetch(B + p, body ? { method: 'POST', data: body } : {})).json();
// seeds: targets must be public and frameable (rmcircle.team sends frame-ancestors *)
const seeds = [
{ type: 'text', name: 'QA text 1', targetUrl: 'https://rmcircle.team/', title: 'Text one', body: 'Body one', budget: 1000 },
{ type: 'text', name: 'QA text 2', targetUrl: 'https://rmcircle.team/how-pay-works', title: 'Text two', body: 'Body two', budget: 1000 },
{ type: 'banner', name: 'QA banner', targetUrl: 'https://rmcircle.team/start', imageUrl: 'https://rmcircle.team/banners/rmc-728x90-v1.png', size: '728x90', budget: 1000 },
{ type: 'video', name: 'QA video', targetUrl: 'https://rmcircle.team/', videoUrl: process.env.QA_VIDEO_URL || 'https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.webm', videoW: 960, videoH: 540, watchSecs: 10, title: 'QA clip', budget: 1000 },
{ type: 'visits', name: 'QA visits', targetUrl: 'https://rmcircle.team/contract', title: 'Visit the contract page', count: 20 },
{ type: 'solo', name: 'QA solo', targetUrl: 'https://rmcircle.team/contract', title: 'QA solo subject line', body: '<p>This is a QA solo ad body with enough characters to pass validation for the inbox test run.</p>', ctaLabel: 'See it', budget: 100 }
];
for (const sd of seeds) {
const r = await (await page.request.post(B + '/api/admin/campaigns', { headers: { Authorization: 'Bearer ' + ADMIN }, data: sd })).json();
log('seed', sd.type, r.ok ? '#' + r.campaign.id + ' ' + r.campaign.status : 'FAIL ' + r.error);
if (!r.ok) problems.push('seed ' + sd.type + ': ' + r.error);
}
await page.goto(B + '/my', { waitUntil: 'networkidle' });
await page.fill('#mcEmail', 'qa-earn@example.com'); await page.click('#mcSendBtn'); await page.waitForSelector('#mcVerifyBtn:not([hidden])'); await page.click('#mcVerifyBtn'); await page.waitForTimeout(2000);
if (await page.$('#onboardModal:not([hidden])')) { await page.fill('#obUsername', 'qaearner'); await page.click('#obSave'); await page.waitForTimeout(1000); }
await page.evaluate(() => { document.querySelectorAll('.modal-back,.lgate').forEach(m => m.hidden = true); });
const start = await api('/api/my/earn'); log('start:', JSON.stringify(start));
// Watch ads
await page.click('.bo-menu [data-pane="earn"]'); await page.waitForTimeout(800);
await page.click('.subtabs [data-earn="watch"]'); await page.waitForTimeout(500);
let credited = 0;
for (let i = 0; i < 5; i++) {
await page.click('#earnStartBtn'); await page.waitForTimeout(1200);
const fr = page.frames().find(f => f.url().includes('/view/'));
if (!fr) { log('AD ' + (i + 1) + ': viewer did not open; box says:', (await page.textContent('#earnAdBox')).trim()); problems.push('watch: viewer did not open'); break; }
const t0 = Date.now();
try { await fr.waitForSelector('#vCheck.on', { timeout: 30000 }); } catch (e) { log('AD ' + (i + 1) + ': check never appeared:', await fr.textContent('#vMsg')); problems.push('watch: check never appeared'); break; }
const secs = ((Date.now() - t0) / 1000).toFixed(1);
if (i === 1) { // trip-up: wrong pick first
const name = ((await fr.textContent('#vPrompt')).match(/Click the (.+):/) || [])[1];
for (const o of await fr.$$('#vOpts button')) { if ((await o.textContent()) !== CAP[name]) { await o.click(); break; } }
await fr.waitForTimeout(700); log(' wrong pick handled:', (await fr.textContent('#vMsg')).trim());
}
const name2 = ((await fr.textContent('#vPrompt')).match(/Click the (.+):/) || [])[1];
const hit = await fr.evaluate(want => { const b = [...document.querySelectorAll('#vOpts button')].find(x => x.textContent === want); if (!b) return null; const r = b.getBoundingClientRect(); const top = document.elementFromPoint(r.left + r.width / 2, r.top + r.height / 2); const covered = !!(top && top !== b && !b.contains(top)); b.click(); return { covered, by: covered ? top.tagName + '#' + top.id : '' }; }, CAP[name2]);
if (hit && hit.covered) { log(' TRIP-UP: correct answer button covered by', hit.by); problems.push('watch: answer button covered by ' + hit.by); }
await fr.waitForTimeout(900);
const timer = await fr.textContent('#vTimer'); if (/credited/.test(timer)) credited++;
log('AD ' + (i + 1) + ': check after ' + secs + 's | ' + timer + ' | ' + (await fr.textContent('#vMsg')).trim());
await page.evaluate(() => { const o = document.getElementById('adOverlay'); if (o) o.querySelector('button').click(); }); await page.waitForTimeout(700);
}
await page.waitForTimeout(800);
log('after set:', await page.textContent('#earnProgress'), '| claim visible:', !!(await page.$('#earnClaimBtn:not([hidden])')));
if (await page.$('#earnStartBtn:not([hidden])')) { await page.click('#earnStartBtn'); await page.waitForTimeout(900); log('view-after-complete says:', (await page.textContent('#earnAdBox')).trim()); }
else log('view button hidden after the set (done screen with claim), as designed since 2026-09-12');
if (await page.$('#earnClaimBtn:not([hidden])')) { await page.click('#earnClaimBtn'); await page.waitForTimeout(1000); log('claimed; balance:', await page.textContent('#earnBalance')); }
else if (credited === 5) problems.push('watch: 5 views credited but claim button not shown');
// Watch videos
await page.click('.subtabs [data-earn="videos"]'); await page.waitForTimeout(800);
await page.click('#vidStartBtn'); await page.waitForTimeout(2500);
const v1 = await page.evaluate(() => { const p = document.getElementById('vidPlayer'); return { paused: p.paused, t: p.currentTime, timer: document.getElementById('vidTimer').textContent }; });
log('video after 2.5s:', JSON.stringify(v1));
await page.waitForTimeout(23000);
const v2 = await page.evaluate(() => { const p = document.getElementById('vidPlayer'); return { t: p.currentTime, timer: document.getElementById('vidTimer').textContent, progress: document.getElementById('vidProgress').textContent }; });
log('video after 25s:', JSON.stringify(v2), v2.t < 10 ? '(clip stalled in headless; verify on live with a real video)' : '');
// Verified visits
await page.click('.subtabs [data-earn="visits"]'); await page.waitForTimeout(800);
await page.click('#vsStartBtn'); await page.waitForTimeout(800);
log('visit loaded:', (await page.textContent('#vsBox')).trim().slice(0, 80));
let popup = null;
if (await page.$('#vsVisit:not([hidden])')) {
[popup] = await Promise.all([ctx.waitForEvent('page', { timeout: 5000 }).catch(() => null), page.click('#vsVisit')]);
await page.waitForTimeout(10500);
const vp = (await page.textContent('#vsPrompt')) || ''; const vname = (vp.match(/Click the (.+):/) || [])[1];
if (vname) { for (const b of await page.$$('#vsOpts button')) { if ((await b.textContent()) === CAP[vname]) { await b.click(); break; } } await page.waitForTimeout(900); }
const hint = (await page.textContent('#vsHint')).trim(); log('visit result:', hint, '|', await page.textContent('#vsProgress'));
if (!/credit/.test(hint)) problems.push('visits: not credited: ' + hint);
if (popup) await popup.close();
} else { log('visits: nothing served'); problems.push('visits: nothing served'); }
// Inbox
await page.click('.subtabs [data-earn="inbox"]'); await page.waitForTimeout(1200);
const rows = await page.$$('#ibList .ib-row'); log('inbox rows:', rows.length);
if (rows.length) {
await rows[0].click(); await page.waitForTimeout(900);
const [p2] = await Promise.all([ctx.waitForEvent('page', { timeout: 5000 }).catch(() => null), page.click('#ibVisit')]); if (p2) await p2.close();
await page.bringToFront(); await page.waitForTimeout(12000);
const dis = await page.$eval('#ibClaimBtn', b => b.disabled); log('after 12s: claim btn =', await page.textContent('#ibClaimBtn'), '| disabled =', dis);
if (!dis) { await page.click('#ibClaimBtn'); await page.waitForTimeout(900); log('inbox claim:', (await page.textContent('#ibHint')).trim()); }
else problems.push('inbox: claim still disabled after dwell');
} else problems.push('inbox: no solo delivered');
const fin = await api('/api/my/earn'); log('FINAL:', JSON.stringify(fin));
await page.screenshot({ path: OUT + '/earn-final.png' }).catch(() => {});
await browser.close();
log('===== EARN FLOWS ' + new Date().toISOString() + ' =====');
log(problems.length ? 'PROBLEMS: ' + problems.join(' | ') : 'ALL EARN FLOWS OK (video needs a real clip on live)');
fs.writeFileSync(OUT + '/earn-report.txt', lines.join('\n') + '\n');
process.exit(problems.length ? 1 : 0);
// InstantAdPay QA harness: earning flows, driven end to end on a LOCAL copy.
// node qa/earn.mjs
// Seeds house ads through the admin API (needs ADMIN_PASSWORD of the local server), signs in a fresh
// member, then runs: Watch ads x5 (incl. one wrong captcha pick) + daily claim, Watch videos, Verified
// visits, Inbox solo read + claim. Reports credited amounts and any trip-ups (e.g. a check button
// covered by the overlay's close button). Dwell timers run for real, so allow ~2 minutes.
// Env: LOCAL (default http://127.0.0.1:8797), ADMIN_PASSWORD (default localtest), OUT, PW
// Exit code 1 when a flow that had inventory failed to credit.
import { pathToFileURL } from 'node:url';
import fs from 'node:fs';
const PW = process.env.PW || 'D:/Projects/MarketingAgent/qa-tester/node_modules/playwright';
const { chromium } = (await import(pathToFileURL(PW + '/index.js').href)).default;
const B = process.env.LOCAL || 'http://127.0.0.1:8797';
const OUT = process.env.OUT || 'qa/out';
const ADMIN = process.env.ADMIN_PASSWORD || 'localtest';
fs.mkdirSync(OUT, { recursive: true });
const CAP = { rocket: '🚀', 'lightning bolt': '⚡', key: '🔑', target: '🎯', wave: '🌊', flame: '🔥', diamond: '💎', magnet: '🧲', bell: '🔔', moon: '🌙' };
const lines = []; const log = (...a) => { const s = a.join(' '); console.log(s); lines.push(s); };
const problems = [];
const browser = await chromium.launch();
const ctx = await browser.newContext({ viewport: { width: 1280, height: 950 } });
await ctx.addInitScript(() => { try { sessionStorage.setItem('iap.welcome.v1', '1'); } catch (e) {} }); // the session pop-up would block every click in an automated run
const page = await ctx.newPage();
page.on('dialog', d => d.accept());
const api = async (p, body) => (await page.request.fetch(B + p, body ? { method: 'POST', data: body } : {})).json();
// seeds: targets must be public and frameable (rmcircle.team sends frame-ancestors *)
const seeds = [
{ type: 'text', name: 'QA text 1', targetUrl: 'https://rmcircle.team/', title: 'Text one', body: 'Body one', budget: 1000 },
{ type: 'text', name: 'QA text 2', targetUrl: 'https://rmcircle.team/how-pay-works', title: 'Text two', body: 'Body two', budget: 1000 },
{ type: 'banner', name: 'QA banner', targetUrl: 'https://rmcircle.team/start', imageUrl: 'https://rmcircle.team/banners/rmc-728x90-v1.png', size: '728x90', budget: 1000 },
{ type: 'video', name: 'QA video', targetUrl: 'https://rmcircle.team/', videoUrl: process.env.QA_VIDEO_URL || 'https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.webm', videoW: 960, videoH: 540, watchSecs: 10, title: 'QA clip', budget: 1000 },
{ type: 'visits', name: 'QA visits', targetUrl: 'https://rmcircle.team/contract', title: 'Visit the contract page', count: 20 },
{ type: 'solo', name: 'QA solo', targetUrl: 'https://rmcircle.team/contract', title: 'QA solo subject line', body: '<p>This is a QA solo ad body with enough characters to pass validation for the inbox test run.</p>', ctaLabel: 'See it', budget: 100 }
];
for (const sd of seeds) {
const r = await (await page.request.post(B + '/api/admin/campaigns', { headers: { Authorization: 'Bearer ' + ADMIN }, data: sd })).json();
log('seed', sd.type, r.ok ? '#' + r.campaign.id + ' ' + r.campaign.status : 'FAIL ' + r.error);
if (!r.ok) problems.push('seed ' + sd.type + ': ' + r.error);
}
await page.goto(B + '/my', { waitUntil: 'networkidle' });
await page.fill('#mcEmail', 'qa-earn@example.com'); await page.click('#mcSendBtn'); await page.waitForSelector('#mcVerifyBtn:not([hidden])'); await page.click('#mcVerifyBtn'); await page.waitForTimeout(2000);
if (await page.$('#onboardModal:not([hidden])')) { await page.fill('#obUsername', 'qaearner'); await page.click('#obSave'); await page.waitForTimeout(1000); }
await page.evaluate(() => { document.querySelectorAll('.modal-back,.lgate,.iap-welcome').forEach(m => m.hidden = true); });
const start = await api('/api/my/earn'); log('start:', JSON.stringify(start));
// Watch ads
await page.click('.bo-menu [data-pane="earn"]'); await page.waitForTimeout(800);
await page.click('.subtabs [data-earn="watch"]'); await page.waitForTimeout(500);
let credited = 0;
for (let i = 0; i < 5; i++) {
await page.click('#earnStartBtn'); await page.waitForTimeout(1200);
const fr = page.frames().find(f => f.url().includes('/view/'));
if (!fr) { log('AD ' + (i + 1) + ': viewer did not open; box says:', (await page.textContent('#earnAdBox')).trim()); problems.push('watch: viewer did not open'); break; }
const t0 = Date.now();
try { await fr.waitForSelector('#vCheck.on', { timeout: 30000 }); } catch (e) { log('AD ' + (i + 1) + ': check never appeared:', await fr.textContent('#vMsg')); problems.push('watch: check never appeared'); break; }
const secs = ((Date.now() - t0) / 1000).toFixed(1);
if (i === 1) { // trip-up: wrong pick first
const name = ((await fr.textContent('#vPrompt')).match(/Click the (.+):/) || [])[1];
for (const o of await fr.$$('#vOpts button')) { if ((await o.textContent()) !== CAP[name]) { await o.click(); break; } }
await fr.waitForTimeout(700); log(' wrong pick handled:', (await fr.textContent('#vMsg')).trim());
}
const name2 = ((await fr.textContent('#vPrompt')).match(/Click the (.+):/) || [])[1];
const hit = await fr.evaluate(want => { const b = [...document.querySelectorAll('#vOpts button')].find(x => x.textContent === want); if (!b) return null; const r = b.getBoundingClientRect(); const top = document.elementFromPoint(r.left + r.width / 2, r.top + r.height / 2); const covered = !!(top && top !== b && !b.contains(top)); b.click(); return { covered, by: covered ? top.tagName + '#' + top.id : '' }; }, CAP[name2]);
if (hit && hit.covered) { log(' TRIP-UP: correct answer button covered by', hit.by); problems.push('watch: answer button covered by ' + hit.by); }
await fr.waitForTimeout(900);
const timer = await fr.textContent('#vTimer'); if (/credited/.test(timer)) credited++;
log('AD ' + (i + 1) + ': check after ' + secs + 's | ' + timer + ' | ' + (await fr.textContent('#vMsg')).trim());
await page.evaluate(() => { const o = document.getElementById('adOverlay'); if (o) o.querySelector('button').click(); }); await page.waitForTimeout(700);
}
await page.waitForTimeout(800);
log('after set:', await page.textContent('#earnProgress'), '| claim visible:', !!(await page.$('#earnClaimBtn:not([hidden])')));
if (await page.$('#earnStartBtn:not([hidden])')) { await page.click('#earnStartBtn'); await page.waitForTimeout(900); log('view-after-complete says:', (await page.textContent('#earnAdBox')).trim()); }
else log('view button hidden after the set (done screen with claim), as designed since 2026-09-12');
if (await page.$('#earnClaimBtn:not([hidden])')) { await page.click('#earnClaimBtn'); await page.waitForTimeout(1000); log('claimed; balance:', await page.textContent('#earnBalance')); }
else if (credited === 5) problems.push('watch: 5 views credited but claim button not shown');
// Watch videos
await page.click('.subtabs [data-earn="videos"]'); await page.waitForTimeout(800);
await page.click('#vidStartBtn'); await page.waitForTimeout(2500);
const v1 = await page.evaluate(() => { const p = document.getElementById('vidPlayer'); return { paused: p.paused, t: p.currentTime, timer: document.getElementById('vidTimer').textContent }; });
log('video after 2.5s:', JSON.stringify(v1));
await page.waitForTimeout(23000);
const v2 = await page.evaluate(() => { const p = document.getElementById('vidPlayer'); return { t: p.currentTime, timer: document.getElementById('vidTimer').textContent, progress: document.getElementById('vidProgress').textContent }; });
log('video after 25s:', JSON.stringify(v2), v2.t < 10 ? '(clip stalled in headless; verify on live with a real video)' : '');
// Verified visits
await page.click('.subtabs [data-earn="visits"]'); await page.waitForTimeout(800);
await page.click('#vsStartBtn'); await page.waitForTimeout(800);
log('visit loaded:', (await page.textContent('#vsBox')).trim().slice(0, 80));
let popup = null;
if (await page.$('#vsVisit:not([hidden])')) {
[popup] = await Promise.all([ctx.waitForEvent('page', { timeout: 5000 }).catch(() => null), page.click('#vsVisit')]);
await page.waitForTimeout(10500);
const vp = (await page.textContent('#vsPrompt')) || ''; const vname = (vp.match(/Click the (.+):/) || [])[1];
if (vname) { for (const b of await page.$$('#vsOpts button')) { if ((await b.textContent()) === CAP[vname]) { await b.click(); break; } } await page.waitForTimeout(900); }
const hint = (await page.textContent('#vsHint')).trim(); log('visit result:', hint, '|', await page.textContent('#vsProgress'));
if (!/credit/.test(hint)) problems.push('visits: not credited: ' + hint);
if (popup) await popup.close();
} else { log('visits: nothing served'); problems.push('visits: nothing served'); }
// Inbox
await page.click('.subtabs [data-earn="inbox"]'); await page.waitForTimeout(1200);
const rows = await page.$$('#ibList .ib-row'); log('inbox rows:', rows.length);
if (rows.length) {
await rows[0].click(); await page.waitForTimeout(900);
const [p2] = await Promise.all([ctx.waitForEvent('page', { timeout: 5000 }).catch(() => null), page.click('#ibVisit')]); if (p2) await p2.close();
await page.bringToFront(); await page.waitForTimeout(12000);
const dis = await page.$eval('#ibClaimBtn', b => b.disabled); log('after 12s: claim btn =', await page.textContent('#ibClaimBtn'), '| disabled =', dis);
if (!dis) { await page.click('#ibClaimBtn'); await page.waitForTimeout(900); log('inbox claim:', (await page.textContent('#ibHint')).trim()); }
else problems.push('inbox: claim still disabled after dwell');
} else problems.push('inbox: no solo delivered');
const fin = await api('/api/my/earn'); log('FINAL:', JSON.stringify(fin));
await page.screenshot({ path: OUT + '/earn-final.png' }).catch(() => {});
await browser.close();
log('===== EARN FLOWS ' + new Date().toISOString() + ' =====');
log(problems.length ? 'PROBLEMS: ' + problems.join(' | ') : 'ALL EARN FLOWS OK (video needs a real clip on live)');
fs.writeFileSync(OUT + '/earn-report.txt', lines.join('\n') + '\n');
process.exit(problems.length ? 1 : 0);
+170 -167
View File
@@ -1,167 +1,170 @@
// InstantAdPay QA harness: site walk.
// node qa/walk.mjs public -> live public pages (no sign-in): errors, failed requests, broken images, dead links, mobile
// node qa/walk.mjs member -> local copy: sign in, every member pane + sub-tab, every admin pane, forms
// node qa/walk.mjs all -> both
// Env: LIVE (default https://instantadpay.com), LOCAL (default http://127.0.0.1:8796), OUT (report dir),
// PW (playwright package dir; default D:/Projects/MarketingAgent/qa-tester/node_modules/playwright)
// Exit code 1 when any [bug] finding remains after noise filtering.
import { pathToFileURL } from 'node:url';
import fs from 'node:fs';
const PW = process.env.PW || 'D:/Projects/MarketingAgent/qa-tester/node_modules/playwright';
const { chromium } = (await import(pathToFileURL(PW + '/index.js').href)).default;
const MODE = process.argv[2] || 'all';
const LIVE = process.env.LIVE || 'https://instantadpay.com';
const LOCAL = process.env.LOCAL || 'http://127.0.0.1:8796';
const OUT = process.env.OUT || 'qa/out';
fs.mkdirSync(OUT, { recursive: true });
const findings = [];
const note = (sev, where, what) => findings.push({ sev, where, what });
const NOISE = /walletconnect|reown|web3modal|coingecko|fonts\.|\/api\/feed\/live|\/api\/auth\/logout/;
function watch(page, base) {
const bag = { console: [], failed: [], status: [] };
page.on('pageerror', e => bag.console.push('pageerror: ' + e.message));
page.on('console', m => {
if (m.type() !== 'error') return;
const loc = (m.location() && m.location().url) || '';
if (loc && !loc.startsWith(base)) return; // third-party or framed page, not ours
if (/status of (400|401|404)/.test(m.text())) return; // expected API answers surface as console noise
bag.console.push(m.text());
});
page.on('requestfailed', r => { const u = r.url(); if (u.startsWith(base) && !NOISE.test(u)) bag.failed.push(u + ' ' + (r.failure() && r.failure().errorText)); });
page.on('response', r => { const st = r.status(); const u = r.url(); if (st >= 500 && u.startsWith(base)) bag.status.push(st + ' ' + u); });
return bag;
}
function flush(bag, label) {
for (const c of bag.console) note('bug', label, 'console: ' + c.slice(0, 200));
for (const f of bag.failed) note('bug', label, 'request failed: ' + f.slice(0, 200));
for (const s of bag.status) note('bug', label, 'HTTP ' + s.slice(0, 200));
bag.console.length = bag.failed.length = bag.status.length = 0;
}
async function domChecks(page, label) {
const r = await page.evaluate(() => {
const vis = el => el.offsetParent !== null;
const brokenImgs = [...document.images].filter(i => i.complete && i.naturalWidth === 0 && i.src && vis(i)).map(i => i.src);
const unfilled = [...document.querySelectorAll('body *')].filter(el => el.children.length === 0 && (el.textContent || '').trim() === '…' && vis(el)).length;
const overflow = document.documentElement.scrollWidth > document.documentElement.clientWidth + 2;
return { brokenImgs, unfilled, overflow, title: document.title };
});
if (r.brokenImgs.length) note('bug', label, 'broken images: ' + r.brokenImgs.slice(0, 3).join(', '));
if (r.unfilled) note('warn', label, r.unfilled + ' element(s) still showing the loading ellipsis');
if (r.overflow) note('warn', label, 'page scrolls horizontally');
return r;
}
const hide = page => page.evaluate(() => { document.querySelectorAll('.modal-back,.lgate').forEach(m => m.hidden = true); });
const browser = await chromium.launch();
if (MODE === 'public' || MODE === 'all') {
const ctx = await browser.newContext({ viewport: { width: 1280, height: 900 } });
const page = await ctx.newPage(); const bag = watch(page, LIVE);
const PUBLIC = ['/', '/ledger', '/contract', '/terms', '/privacy', '/disclaimer', '/wall/martbost', '/join/martbost',
'/join/martbost?v=instant', '/join/martbost?v=adspend', '/join/martbost?v=free', '/join/martbost?v=ledger', '/join/martbost?v=two',
'/admin', '/my', '/shorts', '/nope-404'];
for (const p of PUBLIC) {
const label = 'LIVE ' + p;
try {
const resp = await page.goto(LIVE + p, { waitUntil: 'domcontentloaded', timeout: 45000 });
await page.waitForTimeout(2500);
const st = resp ? resp.status() : 0;
if (p === '/nope-404') { if (st !== 404) note('warn', label, 'expected 404, got ' + st); }
else if (st >= 400) note('bug', label, 'page HTTP ' + st);
const d = await domChecks(page, label);
const hrefs = await page.evaluate(() => [...new Set([...document.querySelectorAll('a[href]')].map(a => a.href).filter(h => h.startsWith(location.origin) && !h.includes('#') && !h.includes('/api/')))]);
for (const h of hrefs.slice(0, 40)) {
try { const r = await page.request.head(h, { timeout: 15000 }); if (r.status() >= 400) note('bug', label, 'dead link ' + h + ' -> ' + r.status()); }
catch (e) { note('warn', label, 'link check failed ' + h); }
}
flush(bag, label); console.log('ok', label, '|', d.title);
} catch (e) { note('bug', label, 'navigation failed: ' + e.message.slice(0, 160)); flush(bag, label); }
}
const m = await browser.newContext({ viewport: { width: 390, height: 844 }, isMobile: true });
const mp = await m.newPage(); const mbag = watch(mp, LIVE);
for (const p of ['/', '/join/martbost?v=instant', '/wall/martbost', '/my']) {
await mp.goto(LIVE + p, { waitUntil: 'domcontentloaded', timeout: 45000 }).catch(e => note('bug', 'LIVE mobile ' + p, e.message));
await mp.waitForTimeout(2000); await domChecks(mp, 'LIVE mobile ' + p); flush(mbag, 'LIVE mobile ' + p);
await mp.screenshot({ path: OUT + '/mobile' + p.replace(/[^a-z0-9]+/gi, '-') + '.png' }).catch(() => {});
}
await ctx.close(); await m.close();
}
if (MODE === 'member' || MODE === 'all') {
const ctx = await browser.newContext({ viewport: { width: 1280, height: 950 } });
const page = await ctx.newPage(); const bag = watch(page, LOCAL);
page.on('dialog', d => d.accept());
const L = 'LOCAL ';
await page.goto(LOCAL + '/my', { waitUntil: 'networkidle' });
await page.fill('#mcEmail', 'qa-walk@example.com'); await page.click('#mcSendBtn');
await page.waitForSelector('#mcVerifyBtn:not([hidden])'); await page.click('#mcVerifyBtn'); await page.waitForTimeout(2000);
if (await page.$('#onboardModal:not([hidden])')) { await page.fill('#obUsername', 'qawalker'); await page.click('#obSave'); await page.waitForTimeout(1200); }
await hide(page); flush(bag, L + 'sign-in');
const PANES = ['overview', 'line', 'pipeline', 'buy', 'campaigns', 'earn', 'earnings', 'promo', 'training', 'wallet', 'profile'];
for (const pn of PANES) {
const label = L + 'my#' + pn;
await page.click('.bo-menu [data-pane="' + pn + '"]'); await page.waitForTimeout(1200); await hide(page);
const vis = await page.evaluate(id => { const el = document.getElementById('pane-' + id); return el && !el.hidden && el.offsetHeight > 40; }, pn);
if (!vis) note('bug', label, 'pane did not render');
await domChecks(page, label);
const subs = await page.$$('#pane-' + pn + ' .subtabs [data-earn], #pane-' + pn + ' .promo-pills [data-promo]');
for (const s of subs) { try { await s.click(); await page.waitForTimeout(500); } catch (e) {} }
if (subs.length) await domChecks(page, label + ' (sub-tabs)');
flush(bag, label);
await page.screenshot({ path: OUT + '/my-' + pn + '.png' }).catch(() => {});
console.log('ok', label, 'subtabs:', subs.length);
}
await page.click('.bo-menu [data-pane="promo"]'); await page.waitForTimeout(800);
if (!(await page.$$('#promoPosts .promo-block')).length) note('bug', L + 'promo', 'no post cards rendered');
// viral links: the builder renders a ?ref= link; any page + ?ref=<member> redirects clean and sets the sponsor cookie; an unknown ref sets nothing
await page.click('.promo-pills [data-promo="viral"]'); await page.waitForTimeout(1200);
const vl = await page.$eval('#viralLink', e => e.textContent).catch(() => '');
if (!/^https:\/\/instantadpay\.com\/.*[?&]ref=[a-z0-9_]+$/i.test(vl)) note('bug', L + 'promo/viral', 'builder link not rendered: ' + vl);
const me = await page.evaluate(() => fetch('/api/me').then(r => r.json()));
const tok = me.username || me.refCode;
// served in place (no redirect: Facebook drops the name otherwise), cookie on the response, og:url carries the ref
const rr = await page.request.get(LOCAL + '/?ref=' + tok + '&x=1', { maxRedirects: 0 });
const sc = (rr.headersArray().filter(h => h.name.toLowerCase() === 'set-cookie').map(h => h.value)).join('; ');
const rb = await rr.text();
if (rr.status() !== 200 || !/<title>/.test(rb)) note('bug', L + 'viral/inplace', 'expected the page at the decorated address, got ' + rr.status());
if (!new RegExp('iap\\.sponsor=' + tok + ';').test(sc) || !/iap\.angle=page;/.test(sc)) note('bug', L + 'viral/cookie', 'sponsor/angle cookie not set: ' + sc);
if (!new RegExp('property="og:url" content="[^"]*[?&]ref=' + tok + '"').test(rb)) note('bug', L + 'viral/og', 'og:url does not carry the ref');
const ru = await page.request.get(LOCAL + '/?ref=nobody_zz9', { maxRedirects: 0 });
const su = (ru.headersArray().filter(h => h.name.toLowerCase() === 'set-cookie').map(h => h.value)).join('; ');
const ub = await ru.text();
if (ru.status() !== 200 || /iap\.sponsor=/.test(su) || /ref=nobody_zz9/.test(ub)) note('bug', L + 'viral/unknown', 'unknown ref must serve the plain page with no cookie and a clean og:url: ' + ru.status() + ' ' + su);
const rj = await page.request.get(LOCAL + '/join/' + tok + '?ref=' + tok, { maxRedirects: 0 });
if (rj.status() !== 200) note('bug', L + 'viral/join', '/join keeps its own ?ref handling, got ' + rj.status());
console.log('ok viral links: builder + redirect + cookie');
const chat = await page.$('#chatMenuBtn'); if (chat) { await chat.click(); await page.waitForTimeout(800); await domChecks(page, L + 'messages'); flush(bag, L + 'messages'); }
const lo = await page.$('#logoutLink'); if (lo) { await lo.click(); await page.waitForTimeout(1000); }
if (!(await page.$('#authArea:not([hidden])'))) note('bug', L + 'logout', 'auth card not shown after log out');
flush(bag, L + 'logout');
// admin
await page.goto(LOCAL + '/admin', { waitUntil: 'networkidle' });
await page.fill('#adEmail', process.env.ADMIN_EMAIL || 'martybostick@gmail.com'); await page.click('#adSend'); await page.waitForSelector('#adVerify:not([hidden])'); await page.click('#adVerify'); await page.waitForTimeout(1200);
for (const pn of ['overview', 'house', 'campaigns', 'members', 'reports', 'traffic', 'blog', 'releases', 'pnl', 'settings']) {
const label = L + 'admin#' + pn;
await page.click('.bo-menu [data-pane="' + pn + '"]'); await page.waitForTimeout(1200);
const vis = await page.evaluate(id => { const el = document.getElementById('pane-' + id); return el && !el.hidden && el.offsetHeight > 40; }, pn);
if (!vis) note('bug', label, 'pane did not render');
await domChecks(page, label); flush(bag, label);
await page.screenshot({ path: OUT + '/admin-' + pn + '.png' }).catch(() => {});
console.log('ok', label);
}
await page.click('.bo-menu [data-pane="house"]'); await page.waitForTimeout(500);
for (const t of ['banner', 'text', 'login', 'solo', 'video', 'featured', 'visits']) { await page.selectOption('#hType', t); await page.waitForTimeout(120); }
await page.selectOption('#hType', 'text'); await page.click('#hCreate'); await page.waitForTimeout(800);
if (!(await page.$('#hErr:not([hidden])'))) note('warn', L + 'admin house form', 'empty submit showed no validation message');
flush(bag, L + 'admin house form');
await ctx.close();
}
await browser.close();
const bugs = findings.filter(f => f.sev === 'bug'), warns = findings.filter(f => f.sev === 'warn');
const lines = ['===== QA WALK (' + MODE + ') ' + new Date().toISOString() + ' =====', 'bugs: ' + bugs.length + ' | warnings: ' + warns.length,
...findings.map(f => '[' + f.sev + '] ' + f.where + ' :: ' + f.what)];
console.log('\n' + lines.join('\n'));
fs.writeFileSync(OUT + '/walk-report.txt', lines.join('\n') + '\n');
process.exit(bugs.length ? 1 : 0);
// InstantAdPay QA harness: site walk.
// node qa/walk.mjs public -> live public pages (no sign-in): errors, failed requests, broken images, dead links, mobile
// node qa/walk.mjs member -> local copy: sign in, every member pane + sub-tab, every admin pane, forms
// node qa/walk.mjs all -> both
// Env: LIVE (default https://instantadpay.com), LOCAL (default http://127.0.0.1:8796), OUT (report dir),
// PW (playwright package dir; default D:/Projects/MarketingAgent/qa-tester/node_modules/playwright)
// Exit code 1 when any [bug] finding remains after noise filtering.
import { pathToFileURL } from 'node:url';
import fs from 'node:fs';
const PW = process.env.PW || 'D:/Projects/MarketingAgent/qa-tester/node_modules/playwright';
const { chromium } = (await import(pathToFileURL(PW + '/index.js').href)).default;
const MODE = process.argv[2] || 'all';
const LIVE = process.env.LIVE || 'https://instantadpay.com';
const LOCAL = process.env.LOCAL || 'http://127.0.0.1:8796';
const OUT = process.env.OUT || 'qa/out';
fs.mkdirSync(OUT, { recursive: true });
const findings = [];
const note = (sev, where, what) => findings.push({ sev, where, what });
const NOISE = /walletconnect|reown|web3modal|coingecko|fonts\.|\/api\/feed\/live|\/api\/auth\/logout/;
function watch(page, base) {
const bag = { console: [], failed: [], status: [] };
page.on('pageerror', e => bag.console.push('pageerror: ' + e.message));
page.on('console', m => {
if (m.type() !== 'error') return;
const loc = (m.location() && m.location().url) || '';
if (loc && !loc.startsWith(base)) return; // third-party or framed page, not ours
if (/status of (400|401|404)/.test(m.text())) return; // expected API answers surface as console noise
bag.console.push(m.text());
});
page.on('requestfailed', r => { const u = r.url(); if (u.startsWith(base) && !NOISE.test(u)) bag.failed.push(u + ' ' + (r.failure() && r.failure().errorText)); });
page.on('response', r => { const st = r.status(); const u = r.url(); if (st >= 500 && u.startsWith(base)) bag.status.push(st + ' ' + u); });
return bag;
}
function flush(bag, label) {
for (const c of bag.console) note('bug', label, 'console: ' + c.slice(0, 200));
for (const f of bag.failed) note('bug', label, 'request failed: ' + f.slice(0, 200));
for (const s of bag.status) note('bug', label, 'HTTP ' + s.slice(0, 200));
bag.console.length = bag.failed.length = bag.status.length = 0;
}
async function domChecks(page, label) {
const r = await page.evaluate(() => {
const vis = el => el.offsetParent !== null;
const brokenImgs = [...document.images].filter(i => i.complete && i.naturalWidth === 0 && i.src && vis(i)).map(i => i.src);
const unfilled = [...document.querySelectorAll('body *')].filter(el => el.children.length === 0 && (el.textContent || '').trim() === '…' && vis(el)).length;
const overflow = document.documentElement.scrollWidth > document.documentElement.clientWidth + 2;
return { brokenImgs, unfilled, overflow, title: document.title };
});
if (r.brokenImgs.length) note('bug', label, 'broken images: ' + r.brokenImgs.slice(0, 3).join(', '));
if (r.unfilled) note('warn', label, r.unfilled + ' element(s) still showing the loading ellipsis');
if (r.overflow) note('warn', label, 'page scrolls horizontally');
return r;
}
const hide = page => page.evaluate(() => { document.querySelectorAll('.modal-back,.lgate,.iap-welcome').forEach(m => m.hidden = true); });
const browser = await chromium.launch();
if (MODE === 'public' || MODE === 'all') {
const ctx = await browser.newContext({ viewport: { width: 1280, height: 900 } });
await ctx.addInitScript(() => { try { sessionStorage.setItem('iap.welcome.v1', '1'); } catch (e) {} }); // the session pop-up would block every click in an automated run
const page = await ctx.newPage(); const bag = watch(page, LIVE);
const PUBLIC = ['/', '/ledger', '/contract', '/terms', '/privacy', '/disclaimer', '/wall/martbost', '/join/martbost',
'/join/martbost?v=instant', '/join/martbost?v=adspend', '/join/martbost?v=free', '/join/martbost?v=ledger', '/join/martbost?v=two',
'/admin', '/my', '/shorts', '/nope-404'];
for (const p of PUBLIC) {
const label = 'LIVE ' + p;
try {
const resp = await page.goto(LIVE + p, { waitUntil: 'domcontentloaded', timeout: 45000 });
await page.waitForTimeout(2500);
const st = resp ? resp.status() : 0;
if (p === '/nope-404') { if (st !== 404) note('warn', label, 'expected 404, got ' + st); }
else if (st >= 400) note('bug', label, 'page HTTP ' + st);
const d = await domChecks(page, label);
const hrefs = await page.evaluate(() => [...new Set([...document.querySelectorAll('a[href]')].map(a => a.href).filter(h => h.startsWith(location.origin) && !h.includes('#') && !h.includes('/api/')))]);
for (const h of hrefs.slice(0, 40)) {
try { const r = await page.request.head(h, { timeout: 15000 }); if (r.status() >= 400) note('bug', label, 'dead link ' + h + ' -> ' + r.status()); }
catch (e) { note('warn', label, 'link check failed ' + h); }
}
flush(bag, label); console.log('ok', label, '|', d.title);
} catch (e) { note('bug', label, 'navigation failed: ' + e.message.slice(0, 160)); flush(bag, label); }
}
const m = await browser.newContext({ viewport: { width: 390, height: 844 }, isMobile: true });
await m.addInitScript(() => { try { sessionStorage.setItem('iap.welcome.v1', '1'); } catch (e) {} }); // the session pop-up would block every click in an automated run
const mp = await m.newPage(); const mbag = watch(mp, LIVE);
for (const p of ['/', '/join/martbost?v=instant', '/wall/martbost', '/my']) {
await mp.goto(LIVE + p, { waitUntil: 'domcontentloaded', timeout: 45000 }).catch(e => note('bug', 'LIVE mobile ' + p, e.message));
await mp.waitForTimeout(2000); await domChecks(mp, 'LIVE mobile ' + p); flush(mbag, 'LIVE mobile ' + p);
await mp.screenshot({ path: OUT + '/mobile' + p.replace(/[^a-z0-9]+/gi, '-') + '.png' }).catch(() => {});
}
await ctx.close(); await m.close();
}
if (MODE === 'member' || MODE === 'all') {
const ctx = await browser.newContext({ viewport: { width: 1280, height: 950 } });
await ctx.addInitScript(() => { try { sessionStorage.setItem('iap.welcome.v1', '1'); } catch (e) {} }); // the session pop-up would block every click in an automated run
const page = await ctx.newPage(); const bag = watch(page, LOCAL);
page.on('dialog', d => d.accept());
const L = 'LOCAL ';
await page.goto(LOCAL + '/my', { waitUntil: 'networkidle' });
await page.fill('#mcEmail', 'qa-walk@example.com'); await page.click('#mcSendBtn');
await page.waitForSelector('#mcVerifyBtn:not([hidden])'); await page.click('#mcVerifyBtn'); await page.waitForTimeout(2000);
if (await page.$('#onboardModal:not([hidden])')) { await page.fill('#obUsername', 'qawalker'); await page.click('#obSave'); await page.waitForTimeout(1200); }
await hide(page); flush(bag, L + 'sign-in');
const PANES = ['overview', 'line', 'pipeline', 'buy', 'campaigns', 'earn', 'earnings', 'promo', 'training', 'wallet', 'profile'];
for (const pn of PANES) {
const label = L + 'my#' + pn;
await page.click('.bo-menu [data-pane="' + pn + '"]'); await page.waitForTimeout(1200); await hide(page);
const vis = await page.evaluate(id => { const el = document.getElementById('pane-' + id); return el && !el.hidden && el.offsetHeight > 40; }, pn);
if (!vis) note('bug', label, 'pane did not render');
await domChecks(page, label);
const subs = await page.$$('#pane-' + pn + ' .subtabs [data-earn], #pane-' + pn + ' .promo-pills [data-promo]');
for (const s of subs) { try { await s.click(); await page.waitForTimeout(500); } catch (e) {} }
if (subs.length) await domChecks(page, label + ' (sub-tabs)');
flush(bag, label);
await page.screenshot({ path: OUT + '/my-' + pn + '.png' }).catch(() => {});
console.log('ok', label, 'subtabs:', subs.length);
}
await page.click('.bo-menu [data-pane="promo"]'); await page.waitForTimeout(800);
if (!(await page.$$('#promoPosts .promo-block')).length) note('bug', L + 'promo', 'no post cards rendered');
// viral links: the builder renders a ?ref= link; any page + ?ref=<member> redirects clean and sets the sponsor cookie; an unknown ref sets nothing
await page.click('.promo-pills [data-promo="viral"]'); await page.waitForTimeout(1200);
const vl = await page.$eval('#viralLink', e => e.textContent).catch(() => '');
if (!/^https:\/\/instantadpay\.com\/.*[?&]ref=[a-z0-9_]+$/i.test(vl)) note('bug', L + 'promo/viral', 'builder link not rendered: ' + vl);
const me = await page.evaluate(() => fetch('/api/me').then(r => r.json()));
const tok = me.username || me.refCode;
// served in place (no redirect: Facebook drops the name otherwise), cookie on the response, og:url carries the ref
const rr = await page.request.get(LOCAL + '/?ref=' + tok + '&x=1', { maxRedirects: 0 });
const sc = (rr.headersArray().filter(h => h.name.toLowerCase() === 'set-cookie').map(h => h.value)).join('; ');
const rb = await rr.text();
if (rr.status() !== 200 || !/<title>/.test(rb)) note('bug', L + 'viral/inplace', 'expected the page at the decorated address, got ' + rr.status());
if (!new RegExp('iap\\.sponsor=' + tok + ';').test(sc) || !/iap\.angle=page;/.test(sc)) note('bug', L + 'viral/cookie', 'sponsor/angle cookie not set: ' + sc);
if (!new RegExp('property="og:url" content="[^"]*[?&]ref=' + tok + '"').test(rb)) note('bug', L + 'viral/og', 'og:url does not carry the ref');
const ru = await page.request.get(LOCAL + '/?ref=nobody_zz9', { maxRedirects: 0 });
const su = (ru.headersArray().filter(h => h.name.toLowerCase() === 'set-cookie').map(h => h.value)).join('; ');
const ub = await ru.text();
if (ru.status() !== 200 || /iap\.sponsor=/.test(su) || /ref=nobody_zz9/.test(ub)) note('bug', L + 'viral/unknown', 'unknown ref must serve the plain page with no cookie and a clean og:url: ' + ru.status() + ' ' + su);
const rj = await page.request.get(LOCAL + '/join/' + tok + '?ref=' + tok, { maxRedirects: 0 });
if (rj.status() !== 200) note('bug', L + 'viral/join', '/join keeps its own ?ref handling, got ' + rj.status());
console.log('ok viral links: builder + redirect + cookie');
const chat = await page.$('#chatMenuBtn'); if (chat) { await chat.click(); await page.waitForTimeout(800); await domChecks(page, L + 'messages'); flush(bag, L + 'messages'); }
const lo = await page.$('#logoutLink'); if (lo) { await lo.click(); await page.waitForTimeout(1000); }
if (!(await page.$('#authArea:not([hidden])'))) note('bug', L + 'logout', 'auth card not shown after log out');
flush(bag, L + 'logout');
// admin
await page.goto(LOCAL + '/admin', { waitUntil: 'networkidle' });
await page.fill('#adEmail', process.env.ADMIN_EMAIL || 'martybostick@gmail.com'); await page.click('#adSend'); await page.waitForSelector('#adVerify:not([hidden])'); await page.click('#adVerify'); await page.waitForTimeout(1200);
for (const pn of ['overview', 'house', 'campaigns', 'members', 'reports', 'traffic', 'blog', 'releases', 'pnl', 'settings']) {
const label = L + 'admin#' + pn;
await page.click('.bo-menu [data-pane="' + pn + '"]'); await page.waitForTimeout(1200);
const vis = await page.evaluate(id => { const el = document.getElementById('pane-' + id); return el && !el.hidden && el.offsetHeight > 40; }, pn);
if (!vis) note('bug', label, 'pane did not render');
await domChecks(page, label); flush(bag, label);
await page.screenshot({ path: OUT + '/admin-' + pn + '.png' }).catch(() => {});
console.log('ok', label);
}
await page.click('.bo-menu [data-pane="house"]'); await page.waitForTimeout(500);
for (const t of ['banner', 'text', 'login', 'solo', 'video', 'featured', 'visits']) { await page.selectOption('#hType', t); await page.waitForTimeout(120); }
await page.selectOption('#hType', 'text'); await page.click('#hCreate'); await page.waitForTimeout(800);
if (!(await page.$('#hErr:not([hidden])'))) note('warn', L + 'admin house form', 'empty submit showed no validation message');
flush(bag, L + 'admin house form');
await ctx.close();
}
await browser.close();
const bugs = findings.filter(f => f.sev === 'bug'), warns = findings.filter(f => f.sev === 'warn');
const lines = ['===== QA WALK (' + MODE + ') ' + new Date().toISOString() + ' =====', 'bugs: ' + bugs.length + ' | warnings: ' + warns.length,
...findings.map(f => '[' + f.sev + '] ' + f.where + ' :: ' + f.what)];
console.log('\n' + lines.join('\n'));
fs.writeFileSync(OUT + '/walk-report.txt', lines.join('\n') + '\n');
process.exit(bugs.length ? 1 : 0);