From ddd2f91ce805cca81d7055c2108577b586325b7c Mon Sep 17 00:00:00 2001 From: sonpiaz Date: Fri, 16 Oct 2026 14:38:52 -0700 Subject: [PATCH] feat: Refer Program terms move to affitor.com/legal/refer-program The terms now have one copy on the dashboard (dash#713). The docs page is removed and /docs/partners/refer-program (and its .md twin, on every host) redirects 301 to https://affitor.com/legal/refer-program. Links in referral-rewards, get-your-referral-link and the changelog entry point there, with the new section anchors. promote-your-link's 'Refer other partners' line was wrong (the program refers brands) and now points at How referral rewards work. Co-Authored-By: Claude Opus 5.5 (1M context) --- content/changelog/refer-program.mdx | 2 +- content/docs/partners/meta.json | 1 - .../quickstart/get-your-referral-link.mdx | 4 +- .../partners/quickstart/promote-your-link.mdx | 4 +- content/docs/partners/refer-program.mdx | 126 ------------------ content/docs/partners/referral-rewards.mdx | 12 +- scripts/check-docs-host-http.mjs | 4 + scripts/check-docs-host.mjs | 9 ++ src/middleware.ts | 16 ++- 9 files changed, 38 insertions(+), 140 deletions(-) delete mode 100644 content/docs/partners/refer-program.mdx diff --git a/content/changelog/refer-program.mdx b/content/changelog/refer-program.mdx index 21bd199..9635a8a 100644 --- a/content/changelog/refer-program.mdx +++ b/content/changelog/refer-program.mdx @@ -9,4 +9,4 @@ description: Partners promote Affitor itself through the Refer Program and earn Affitor has its own affiliate program. Find the **Refer Program** in the marketplace, read the official terms on its landing page, and share your link. You earn $50 when a brand you referred goes live, $350 when its program reaches $10,000 in tracked sales, and 15% of the platform fee it pays for 12 months. -[Read the Refer Program terms](/docs/partners/refer-program) +[Read the Refer Program terms](https://affitor.com/legal/refer-program) diff --git a/content/docs/partners/meta.json b/content/docs/partners/meta.json index a7a6660..ad2916e 100644 --- a/content/docs/partners/meta.json +++ b/content/docs/partners/meta.json @@ -11,7 +11,6 @@ "---Earn---", "dashboard", "payouts", - "refer-program", "referral-rewards", "account-settings", "faq" diff --git a/content/docs/partners/quickstart/get-your-referral-link.mdx b/content/docs/partners/quickstart/get-your-referral-link.mdx index 576d86f..abf81fd 100644 --- a/content/docs/partners/quickstart/get-your-referral-link.mdx +++ b/content/docs/partners/quickstart/get-your-referral-link.mdx @@ -2,7 +2,7 @@ title: "Get Your Referral Link" description: "Find, copy, and share your tracked referral link — generated automatically when you join." kind: quickstart -last_updated: 2026-10-15 +last_updated: 2026-10-16 --- Your referral link is the URL you share. Every click and sale through it is credited to you. Best of all, you don't have to create it — Affitor generates it for you. @@ -42,7 +42,7 @@ Refer a brand has its own link, separate from your program links: `affitor.com/r When you are signed in, the **Affitor Refer Program** card (**Get link**), its slide in the **Featured** strip, and **Get your referral link** on its program page open **Referrals** with your link already loaded. -A brand that opens it lands on Affitor's home page with "**your name** invited you" above an email field to start sign-up. A brand that signs up through it is credited to you under the [Affitor Refer Program terms](/docs/partners/refer-program). +A brand that opens it lands on Affitor's home page with "**your name** invited you" above an email field to start sign-up. A brand that signs up through it is credited to you under the [Affitor Refer Program terms](https://affitor.com/legal/refer-program). ## What happens next diff --git a/content/docs/partners/quickstart/promote-your-link.mdx b/content/docs/partners/quickstart/promote-your-link.mdx index 221180b..8f51cf6 100644 --- a/content/docs/partners/quickstart/promote-your-link.mdx +++ b/content/docs/partners/quickstart/promote-your-link.mdx @@ -2,7 +2,7 @@ title: "Promote Your Link and Earn" description: "Turn your referral link into commissions — where to share it, what converts, and how to read the results in your dashboard." kind: guide -last_updated: 2026-07-06 +last_updated: 2026-10-16 --- Getting your link is step one; earning from it is the real work. This page covers where a referral link actually converts, how to promote it without burning your audience, and how to use your dashboard to double down on what works. @@ -59,4 +59,4 @@ Your **Performance** and **Analytics** views show clicks, signups, and sales ove - [Getting paid](/docs/partners/payouts) — how commissions become a balance and how to withdraw - [Your dashboard](/docs/partners/dashboard) — Performance, Analytics, and referred customers -- [Refer other partners](/docs/partners/refer-program) — earn from partners you bring in +- [Refer a brand](/docs/partners/referral-rewards) — earn from brands you bring to Affitor diff --git a/content/docs/partners/refer-program.mdx b/content/docs/partners/refer-program.mdx deleted file mode 100644 index 3362bea..0000000 --- a/content/docs/partners/refer-program.mdx +++ /dev/null @@ -1,126 +0,0 @@ ---- -title: "Affitor Refer Program — Terms" -description: "Official terms of the Affitor Refer Program: rewards, attribution rules, holds, clawbacks, and eligibility for referring a brand to Affitor." -kind: terms -last_updated: 2026-10-15 ---- - -These are the official terms of the **Affitor Refer Program** — the program where you refer a SaaS brand to Affitor and earn launch bonuses plus a recurring share of Affitor's revenue from that brand. By sharing your referral link, you agree to these terms. - -*Effective date: June 10, 2026. Last updated: October 15, 2026. This page is the canonical version of the program terms; the in-product landing page is a summary of it.* - -## 1. Rewards at a glance - -For worked examples (a brand with several programs, team members, who gets credit), see [How referral rewards work](/docs/partners/referral-rewards). - -| Reward | Amount | When it's earned | -| --- | --- | --- | -| Launch bonus (M1) | **$50** | Your referred brand's program goes live | -| Growth bonus (M2) | **$350** | The referred brand's program reaches **$10,000 in tracked sales** | -| Revenue share | **15% of Affitor's platform fee** from that brand | Recurring, for **12 months** from the first invoice on which the brand pays a platform fee | - -Reward amounts and rates reflect the current program configuration. Changes apply prospectively only — they never reduce rewards for brands already attributed to you (see [Section 11](#11-program-changes)). - -**Your referred brand benefits too.** Every brand on Affitor pays **$0 in platform fees until it has driven $10,000 in affiliate revenue** — so the brand you introduce gets the full product free while it grows. See [pricing](https://affitor.com/pricing). - -## 2. Eligibility - -To participate you must: - -- Have an Affitor partner account in good standing -- Not be subject to U.S. sanctions or located in a sanctioned jurisdiction - -You are responsible for any taxes on amounts you earn under this program. - -## 3. What counts as a qualified referral - -A referral qualifies when **all** of the following are true: - -1. **The brand is new to Affitor.** The referred company becomes an Affitor advertiser for the first time. An existing advertiser adding another program does not qualify. (An existing Affitor *partner* who becomes an advertiser for the first time **does** qualify.) -2. **Not already in our pipeline.** The brand was not already in an active sales conversation with Affitor at the time of the referral. -3. **Attribution is intact** under the rules in [Section 4](#4-attribution--who-gets-credit). -4. **It is not a self-referral** ([Section 5](#5-self-referrals)). - -Affitor may decline to credit any referral that does not meet these conditions, or that it reasonably believes is fraudulent or abusive. - -### Reward checkpoints - -- **M1 ($50)** is earned when the referred brand's program **goes live** (business details, commission and payments connected). Signup alone does not trigger M1. -- **M2 ($350)** is earned when that brand's program crosses **$10,000 in tracked sales** (measured per program). -- **Revenue share (15%)** accrues on each platform-fee invoice the brand actually pays, for 12 months from the first invoice on which the brand pays a platform fee. - -## 4. Attribution — who gets credit - -Only **one partner** earns rewards for a given brand. Credit is resolved in this order: - -1. **Last click wins.** The partner whose referral link the brand clicked **most recently before signing up** receives the attribution. If the person signed up without a referral link, the last link clicked before they create their first program counts. Each click starts a **30-day attribution window**; a newer click by another partner replaces an older one. -2. **One brand, one partner — permanently.** Once a brand is attributed, the link is exclusive and enforced at the database level. It does not change retroactively. -3. **Affitor's tracking system is the authoritative record** of clicks, signups, and attribution. -4. **Backstop.** If a situation cannot be resolved by the rules above (for example, a broken cookie chain across devices), Affitor will determine attribution at its sole discretion, and that determination is final. - -There is no partial or split credit: when two partners claim the same brand, one receives the full reward and the other receives nothing for that brand. - -## 5. Self-referrals - -Self-referrals are void and earn nothing. This includes referring: - -- Yourself, or your own company -- Any entity you own an interest in, work for, or contract with -- Any account you control directly or indirectly - -If a referrer cannot be verified as a distinct person from the referred brand, the referral is not credited. - -## 6. Holds and payouts - -- Every reward (M1, M2, and revenue share) is subject to a **30-day hold** from the moment it's earned. Holds exist to cover refunds, payment disputes, and fraud review. -- After the hold clears, the reward is released to your partner balance and follows the standard [withdrawal process](/docs/partners/payouts). -- Affitor has **no obligation to pay any reward until the underlying revenue has been received and cleared** from the referred brand. Revenue share accrues only on invoices that are actually paid. - -## 7. Clawbacks and payment disputes - -We believe in stating this precisely, because it protects both sides: - -- **If a referred brand disputes a payment** (chargeback), the portion of your rewards funded by that payment is **reversed pro-rata when the dispute opens**. -- **If Affitor wins the dispute**, the reversed amount is **re-credited to you in full**. -- **Partial refunds** reverse rewards pro-rata to the refunded amount. -- Reversals are netted against your balance and future rewards. If your balance is insufficient and the reversed amount was already withdrawn, Affitor may request reimbursement directly. - -## 8. Promotion rules - -You may share your referral link anywhere you genuinely reach SaaS founders and teams — your site, newsletter, social, communities, direct intros. The following are prohibited: - -- Bidding on "Affitor" or confusingly similar terms in paid search, or running ads that compete with Affitor's own advertising -- Registering domains or handles containing "Affitor" or variations of it -- Cookie stuffing, forced clicks, pop-unders, iframe tricks, or any artificial inflation of clicks -- Offering the referred brand cash, rebates, or other incentives to sign up through your link, unless Affitor authorizes it in writing -- Spam, and any misrepresentation of Affitor's pricing, features, or this program's rewards - -Violations may result in removal from the program and **forfeiture of all unpaid rewards, whether or not they relate to the violation**. - -## 9. Term and termination - -- **You can leave anytime**, and Affitor may end your participation with notice. On a good-standing exit, rewards already earned are paid out after their holds clear, and **revenue share on brands you already referred continues through each brand's 12-month window**. -- **Termination for cause** — fraud, self-referral schemes, or violation of these terms — forfeits all unpaid rewards immediately. -- **Finality.** Attribution records and payments are considered final **12 months** after the related event; claims raised later than that won't be reopened. - -## 10. Reward limits - -Affitor reserves the right to set a maximum total reward per partner or per referred brand, and to review unusually high-volume accounts before payout. - -## 11. Program changes - -Affitor may update these terms and the program configuration (amounts, rates, thresholds, hold period). Changes take effect when published on this page and apply **prospectively**: rewards for brands already attributed to you keep the configuration in effect at the time of attribution. Continued participation after a change constitutes acceptance. - -## 12. General - -- Affitor is not liable for tracking errors caused by how a link was shared or used (modified URLs, blocked cookies, etc.), even where this reduces a reward. -- Affitor may reject any referral for any reason, including conflicts with existing relationships. -- These terms supplement the Affitor Terms of Service, which govern your account. - -:::note - -Questions about a specific referral or attribution decision? Contact [team@affitor.com](mailto:team@affitor.com) — include the brand name and the date you made the introduction. - -::: - - diff --git a/content/docs/partners/referral-rewards.mdx b/content/docs/partners/referral-rewards.mdx index 22f46d3..f0f914b 100644 --- a/content/docs/partners/referral-rewards.mdx +++ b/content/docs/partners/referral-rewards.mdx @@ -2,10 +2,10 @@ title: "How referral rewards work" description: "Worked examples of the Affitor Refer Program: which brand earns you $50, $350 and 15%, what happens when a brand runs several programs, and who gets credit." kind: explainer -last_updated: 2026-10-15 +last_updated: 2026-10-16 --- -The [Refer Program terms](/docs/partners/refer-program) are the rules. This page walks through them with examples, so you can predict exactly what a referral pays. +The [Refer Program terms](https://affitor.com/legal/refer-program) are the rules. This page walks through them with examples, so you can predict exactly what a referral pays. ## The three rewards @@ -15,7 +15,7 @@ The [Refer Program terms](/docs/partners/refer-program) are the rules. This page | Growth bonus | **$350** | The brand pays its first platform fee on a program with $10,000 in tracked sales | Once per referred brand | | Revenue share | **15%** of Affitor's platform fee | Every platform-fee invoice the brand pays | For 12 months from the first platform-fee invoice the brand pays | -Rewards are counted per referred brand, which is the person you brought to Affitor, not per program. Each reward is held for the hold period (30 days today) before it reaches your balance (terms, [section 6](/docs/partners/refer-program#6-holds-and-payouts)). +Rewards are counted per referred brand, which is the person you brought to Affitor, not per program. Each reward is held for the hold period (30 days today) before it reaches your balance (terms, [section 6](https://affitor.com/legal/refer-program#holds-and-payouts)). ## Example: one brand, several programs @@ -41,17 +41,17 @@ Credit belongs to the person you referred, who created the brand. When Minh invi - **Last click wins.** If several partners' links were clicked, the partner whose link was clicked last before the person signed up earns the rewards. If they signed up without a link (for example as a partner first), the last link clicked before they create their first program counts. - **30 days.** A click counts for 30 days: the sign-up, or the first program when there was no link at sign-up, has to happen within 30 days of it. - **One brand, one partner.** Once a brand is credited to you, that does not change. -- **No self-referrals.** Your own link used for your own brand earns nothing (terms, [section 5](/docs/partners/refer-program#5-self-referrals)). +- **No self-referrals.** Your own link used for your own brand earns nothing (terms, [section 5](https://affitor.com/legal/refer-program#self-referrals)). ## What never earns - A brand that was already on Affitor, adding another program. - Inviting a partner or a team member to a program. Only your Refer a brand link earns. -- Your own brand: a self-referral (terms, [section 5](/docs/partners/refer-program#5-self-referrals)). +- Your own brand: a self-referral (terms, [section 5](https://affitor.com/legal/refer-program#self-referrals)). diff --git a/scripts/check-docs-host-http.mjs b/scripts/check-docs-host-http.mjs index fe14414..8e17ee9 100644 --- a/scripts/check-docs-host-http.mjs +++ b/scripts/check-docs-host-http.mjs @@ -51,6 +51,10 @@ const ALWAYS = [ [PROXY, '/changelog/rss.xml', 200, null, 'application/rss+xml'], [PROXY, '/changelog/no-such-entry', 404, null], [PROXY, '/docs/changelog', 301, 'https://affitor.com/changelog'], + // The Refer Program terms moved to affitor.com/legal/refer-program (16/10/2026). + [PROXY, '/docs/partners/refer-program', 301, 'https://affitor.com/legal/refer-program'], + [PROXY, '/docs/partners/refer-program.md', 301, 'https://affitor.com/legal/refer-program'], + [DOCS, '/partners/refer-program', 301, 'https://affitor.com/legal/refer-program'], [PROXY, '/docs/changelog.md', 301, 'https://affitor.com/changelog.md'], [PROXY, '/docs/changelog/invite-partners/invite-compose.png', 200, null, 'image/png'], [PROXY, '/docs', 200, null, 'text/html'], diff --git a/scripts/check-docs-host.mjs b/scripts/check-docs-host.mjs index c9c1dc3..f96ceaa 100644 --- a/scripts/check-docs-host.mjs +++ b/scripts/check-docs-host.mjs @@ -106,6 +106,9 @@ function invariants() { ['/changelog/rss.xml', 'https://affitor.com/changelog/rss.xml'], ['/docs/changelog', 'https://affitor.com/changelog'], ['/docs/changelog.md', 'https://affitor.com/changelog.md'], + ['/partners/refer-program', 'https://affitor.com/legal/refer-program'], + ['/partners/refer-program.md', 'https://affitor.com/legal/refer-program'], + ['/docs/partners/refer-program', 'https://affitor.com/legal/refer-program'], ]) check(`docs host ${path} -> 301 ${location}`, redirects(DOCS, path, location)); // Files that moved under /docs: served in place with a canonical Link. for (const [path, internal] of [ @@ -157,6 +160,12 @@ function invariants() { // The old docs changelog moved to the zone: absolute, permanent, on every host. check(`${host}/docs/changelog -> 301 affitor.com/changelog`, redirects(host, '/docs/changelog', 'https://affitor.com/changelog')); check(`${host}/docs/changelog.md -> 301 affitor.com/changelog.md`, redirects(host, '/docs/changelog.md', 'https://affitor.com/changelog.md')); + // The Refer Program terms left the docs for affitor.com/legal (one copy), twin included. + for (const path of ['/docs/partners/refer-program', '/docs/partners/refer-program.md', '/docs/partners/refer-program?x=1']) { + const query = path.includes('?') ? '?x=1' : ''; + check(`${host}${path.replace('?x=1', '')} -> 301 affitor.com/legal/refer-program${query}`, redirects(host, path, `https://affitor.com/legal/refer-program${query}`)); + } + check(`${host}/docs/partners/referral-rewards is not moved`, passes(host, '/docs/partners/referral-rewards')); for (const path of ['/changelog', '/changelog/invite-partners', '/changelog.md', '/changelog/invite-partners.md', '/changelog/rss.xml', '/docs/changelog/invite-partners/invite-compose.png']) { check(`${host}${path} is served by the changelog zone (no redirect)`, passes(host, path)); } diff --git a/src/middleware.ts b/src/middleware.ts index 7cf9495..1438fcf 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -55,6 +55,18 @@ export function changelogMove(path: string, host: string | null): string | null return null; } +// Pages that left the docs for another affitor.com page: absolute and permanent on every host, +// the .md twin included (the dashboard has no twins, so it lands on the page). The Refer Program +// terms have one copy at /legal/refer-program since 16/10/2026 (dashboard src/content/legal). +const MOVED_OUT: Record = { + '/docs/partners/refer-program': 'https://affitor.com/legal/refer-program', +}; + +export function movedOut(path: string, host: string | null): string | null { + const page = path.replace(/(?:\.md|\/)$/, ''); + return MOVED_OUT[host === DOCS_HOST && !/^\/docs(?:\/|$)/.test(page) ? `/docs${page}` : page] ?? null; +} + /** The current path for a renamed page or its .md twin, or null when nothing changed. */ export function currentPath(path: string): string | null { const md = path.endsWith('.md'); @@ -140,8 +152,8 @@ export function middleware(req: NextRequest, event: NextFetchEvent) { } const host = req.headers.get('host'); - const changelog = changelogMove(req.nextUrl.pathname, host); - if (changelog) return NextResponse.redirect(`${changelog}${req.nextUrl.search}`, 301); + const elsewhere = changelogMove(req.nextUrl.pathname, host) ?? movedOut(req.nextUrl.pathname, host); + if (elsewhere) return NextResponse.redirect(`${elsewhere}${req.nextUrl.search}`, 301); if (host === DOCS_HOST) return docsHost(req);