From 15766ad414c215a0240a3b995222f4f316e560b1 Mon Sep 17 00:00:00 2001 From: sonpiaz Date: Fri, 16 Oct 2026 16:54:44 -0700 Subject: [PATCH] docs: brand settings follow today's ship: Program ID, two payment cards, partner link parameter, attribution window Co-Authored-By: Claude Opus 5.5 (1M context) --- content/docs/api-reference/attribution.mdx | 10 ++--- content/docs/api-reference/errors.mdx | 4 +- .../api-reference/integrations/fastify.mdx | 4 +- .../integrations/nextjs-clerk.mdx | 4 +- .../integrations/nextjs-nextauth.mdx | 4 +- .../integrations/nextjs-supabase.mdx | 4 +- .../api-reference/integrations/nextjs.mdx | 4 +- .../integrations/node-express.mdx | 4 +- .../docs/api-reference/integrations/polar.mdx | 4 +- .../api-reference/integrations/stripe.mdx | 4 +- .../brand/quickstart/inviting-partners.mdx | 4 +- .../docs/brand/quickstart/setup-program.mdx | 37 ++++++++++--------- content/docs/brand/settings.mdx | 10 ++--- .../docs/brand/tracking/click-tracking.mdx | 5 ++- .../brand/tracking/quickstart-integration.mdx | 4 +- .../docs/brand/tracking/tracking-overview.mdx | 4 +- content/docs/support/glossary.mdx | 6 +-- public/docs/skill.md | 2 +- 18 files changed, 61 insertions(+), 57 deletions(-) diff --git a/content/docs/api-reference/attribution.mdx b/content/docs/api-reference/attribution.mdx index 3ff1d17c..b64535f3 100644 --- a/content/docs/api-reference/attribution.mdx +++ b/content/docs/api-reference/attribution.mdx @@ -2,7 +2,7 @@ title: Attribution Mechanics description: How Affitor assigns credit to partners — the cookie, the click ID, the attribution windows, and what happens on re-click. kind: concept -last_updated: 2026-09-24 +last_updated: 2026-10-16 --- > **Beta** — The Affitor SDKs and CLI are in active development. The documented happy-path works; edge cases may change. Report issues on GitHub. @@ -25,7 +25,7 @@ Program settings have no option for last-click or multi-touch (linear) credit. C ## The `affitor_click_id` cookie -When a visitor lands on a URL containing `?aff=`, the SDK calls `POST /api/v1/track/click` and stores two first-party cookies: +When a visitor lands on a URL containing `?aff=` or `?via=` (the program's **Partner link parameter**; `?aff=` wins if both are present), the SDK calls `POST /api/v1/track/click` and stores two first-party cookies: | Cookie | Purpose | |--------|---------| @@ -69,11 +69,11 @@ If a visitor already has an `affitor_click_id` cookie and clicks a **different** | Scenario | Outcome | |----------|---------| -| No existing cookie, `?aff=` present | New click tracked, new customer created, new `affitor_click_id` written | +| No existing cookie, `?aff=` or `?via=` present | New click tracked, new customer created, new `affitor_click_id` written | | Same partner link clicked again | Existing cookie reused — no new click event | | Different partner link clicked | New click counted for the new partner; the customer and its `click_id` stay with the original partner | -| No `?aff=` in URL, cookie present | Existing attribution restored from cookie silently | -| No `?aff=` in URL, no cookie | No `click_id`. A lead call without a `click_id` or a known `customer_key` returns `400` and nothing is recorded | +| No partner parameter in URL, cookie present | Existing attribution restored from cookie silently | +| No partner parameter in URL, no cookie | No `click_id`. A lead call without a `click_id` or a known `customer_key` returns `400` and nothing is recorded | --- diff --git a/content/docs/api-reference/errors.mdx b/content/docs/api-reference/errors.mdx index 6a5b35e3..bf027448 100644 --- a/content/docs/api-reference/errors.mdx +++ b/content/docs/api-reference/errors.mdx @@ -2,7 +2,7 @@ title: Errors & Troubleshooting description: All API error codes, their causes, and how to fix common integration problems. kind: reference -last_updated: 2026-10-15 +last_updated: 2026-10-16 --- > **Beta** — The Affitor SDKs and CLI are in active development. The documented happy-path works; edge cases may change. Report issues on GitHub. @@ -501,7 +501,7 @@ The tracking API (`api.affitor.com`) must allow your site's origin for browser-m ### Attribution window edge cases -The attribution window defaults to 60 days and is set per program (`cookie_window_days`). The actual value is returned in the click response: +The attribution window defaults to 60 days and is set per program (`attribution_window_days`, shown as **Attribution window** in the dashboard). The click response returns the value as `cookie_window_days`: ```json { diff --git a/content/docs/api-reference/integrations/fastify.mdx b/content/docs/api-reference/integrations/fastify.mdx index cbe403a6..fcecfee2 100644 --- a/content/docs/api-reference/integrations/fastify.mdx +++ b/content/docs/api-reference/integrations/fastify.mdx @@ -2,7 +2,7 @@ title: "Fastify" description: "Server-side Affitor integration with @affitor/sdk/server — track signups and sales from your Fastify backend, including a raw-body Stripe webhook." kind: guide -last_updated: 2026-09-24 +last_updated: 2026-10-16 --- This guide wires Affitor into a Fastify app. Because Fastify is a pure server runtime, the click is captured by a frontend script tag, then the `affitor_click_id` is forwarded to your server so all tracking calls — lead and sale — happen server-side with `@affitor/sdk/server`. The sale is tracked from your Stripe webhook handler, which needs the **raw request body** for signature verification. @@ -15,7 +15,7 @@ The `@affitor/sdk` package is **Beta**. The documented happy-path works; report ## Prerequisites -- Your **program ID** (dashboard → program settings) +- Your **program ID** (**Settings** → **Program settings** → **Business**) - A **program API key** for server-side calls (dashboard → API keys) - `@affitor/sdk` and `stripe` installed in your backend diff --git a/content/docs/api-reference/integrations/nextjs-clerk.mdx b/content/docs/api-reference/integrations/nextjs-clerk.mdx index 3b4a4f3a..91d74e0a 100644 --- a/content/docs/api-reference/integrations/nextjs-clerk.mdx +++ b/content/docs/api-reference/integrations/nextjs-clerk.mdx @@ -2,7 +2,7 @@ title: "Next.js + Clerk" description: "Add Affitor tracking to a Next.js (App Router) app that uses Clerk for authentication." kind: guide -last_updated: 2026-10-14 +last_updated: 2026-10-16 --- This guide covers the auth-specific parts of an Affitor integration when your Next.js app uses Clerk. Steps 1 (capture the click) and 3 (track the sale) are identical to the [base Next.js guide](/docs/api-reference/integrations/nextjs) — this guide focuses on **Step 2: tracking the signup** with Clerk's identity model. @@ -15,7 +15,7 @@ The `@affitor/sdk` package is **Beta**. The documented happy-path works; report ## Prerequisites -- Your **program ID** (dashboard → program settings) +- Your **program ID** (**Settings** → **Program settings** → **Business**) - A **program API key** for server-side calls (leads and sales) - A Next.js App Router app with **Clerk** configured diff --git a/content/docs/api-reference/integrations/nextjs-nextauth.mdx b/content/docs/api-reference/integrations/nextjs-nextauth.mdx index 0d7813d5..7bd29e57 100644 --- a/content/docs/api-reference/integrations/nextjs-nextauth.mdx +++ b/content/docs/api-reference/integrations/nextjs-nextauth.mdx @@ -2,7 +2,7 @@ title: "Next.js + NextAuth" description: "Add Affitor lead tracking to a Next.js app using NextAuth (Auth.js) — handle the click-id cookie gap correctly." kind: guide -last_updated: 2026-10-14 +last_updated: 2026-10-16 --- This guide covers the signup step when your Next.js app uses **NextAuth (Auth.js)** for authentication. Steps 1 (capture click) and 3 (track sale) are identical to the [base Next.js guide](/docs/api-reference/integrations/nextjs) — this page focuses on what is different: wiring the lead call to NextAuth's auth lifecycle without losing the click attribution. @@ -15,7 +15,7 @@ The `@affitor/sdk` package is **Beta**. The documented happy-path works; report ## Prerequisites -- Your **program ID** (dashboard → program settings) +- Your **program ID** (**Settings** → **Program settings** → **Business**) - A **program API key** for server-side calls - A Next.js App Router app with NextAuth (Auth.js) configured diff --git a/content/docs/api-reference/integrations/nextjs-supabase.mdx b/content/docs/api-reference/integrations/nextjs-supabase.mdx index 500a6593..cb52e093 100644 --- a/content/docs/api-reference/integrations/nextjs-supabase.mdx +++ b/content/docs/api-reference/integrations/nextjs-supabase.mdx @@ -2,7 +2,7 @@ title: "Next.js + Supabase Auth" description: "Add Affitor tracking to a Next.js app that uses Supabase Auth — clicks, signups, and sales." kind: guide -last_updated: 2026-10-14 +last_updated: 2026-10-16 --- This guide covers the Supabase-specific signup step. Steps 1 (capture the click) and 3 (track the sale) are identical to the [base Next.js guide](/docs/api-reference/integrations/nextjs) — refer there for full detail. @@ -15,7 +15,7 @@ The `@affitor/sdk` package is **Beta**. The documented happy-path works; report ## Prerequisites -- Your **program ID** (dashboard → program settings) +- Your **program ID** (**Settings** → **Program settings** → **Business**) - A **program API key** for server-side calls (leads and sales) - A Next.js app with **Supabase Auth** configured diff --git a/content/docs/api-reference/integrations/nextjs.mdx b/content/docs/api-reference/integrations/nextjs.mdx index 53f6d3a2..639605eb 100644 --- a/content/docs/api-reference/integrations/nextjs.mdx +++ b/content/docs/api-reference/integrations/nextjs.mdx @@ -2,7 +2,7 @@ title: "Next.js" description: "Add Affitor tracking to a Next.js (App Router) app — clicks, signups, and sales." kind: guide -last_updated: 2026-10-14 +last_updated: 2026-10-16 --- This guide wires Affitor into a Next.js App Router app with the three moves every integration needs: **capture the click**, **track the signup**, **track the sale**. @@ -15,7 +15,7 @@ The `@affitor/sdk` package is **Beta**. The documented happy-path works; report ## Prerequisites -- Your **program ID** (dashboard → program settings) +- Your **program ID** (**Settings** → **Program settings** → **Business**) - A **program API key** for server-side calls (leads and sales) - A Next.js app on the **App Router** diff --git a/content/docs/api-reference/integrations/node-express.mdx b/content/docs/api-reference/integrations/node-express.mdx index 57bfc7f9..562f689b 100644 --- a/content/docs/api-reference/integrations/node-express.mdx +++ b/content/docs/api-reference/integrations/node-express.mdx @@ -2,7 +2,7 @@ title: "Node / Express" description: "Server-side Affitor integration with @affitor/sdk/server — track signups and sales from your Express backend." kind: guide -last_updated: 2026-09-24 +last_updated: 2026-10-16 --- This guide wires Affitor into a Node.js / Express app. Because Express is a pure server runtime, the click is captured by a frontend script tag, then the `affitor_click_id` is forwarded to your server so all tracking calls — lead and sale — happen server-side with `@affitor/sdk/server`. @@ -15,7 +15,7 @@ The `@affitor/sdk` package is **Beta**. The documented happy-path works; report ## Prerequisites -- Your **program ID** (dashboard → program settings) +- Your **program ID** (**Settings** → **Program settings** → **Business**) - A **program API key** for server-side calls (dashboard → API keys) - `@affitor/sdk` installed in your backend diff --git a/content/docs/api-reference/integrations/polar.mdx b/content/docs/api-reference/integrations/polar.mdx index bd2bbea5..20b89243 100644 --- a/content/docs/api-reference/integrations/polar.mdx +++ b/content/docs/api-reference/integrations/polar.mdx @@ -2,7 +2,7 @@ title: "Polar" description: "Canonical recipe for attributing Polar payments to Affitor partners — one-time, subscriptions, renewals, and refunds. No Stripe account needed." kind: guide -last_updated: 2026-10-15 +last_updated: 2026-10-16 --- This guide is the **canonical reference for the Polar sale path**. Polar is a merchant of record, so there is no Stripe account to connect — instead, your app hosts a small webhook route that reports every paid order to Affitor. @@ -15,7 +15,7 @@ The `@affitor/sdk` package is **Beta**. The documented happy-path works; report ## Prerequisites -- Your **program ID** and a **program API key** (run `npx affitor init`, or dashboard → program settings) +- Your **program ID** and a **program API key** (run `npx affitor init`, or **Settings** → **Program settings** → **Business** for the ID and **Developers** → **API keys** for the key) - A Polar organization with checkout working in your app - Access to your Polar organization's webhook settings. Sandbox is a separate environment with its own tokens and its own webhook endpoints (`sandbox-api.polar.sh`). diff --git a/content/docs/api-reference/integrations/stripe.mdx b/content/docs/api-reference/integrations/stripe.mdx index 2e586cfa..1f8a2f33 100644 --- a/content/docs/api-reference/integrations/stripe.mdx +++ b/content/docs/api-reference/integrations/stripe.mdx @@ -2,7 +2,7 @@ title: "Stripe" description: "Canonical recipe for attributing Stripe payments to Affitor partners — one-time and recurring." kind: guide -last_updated: 2026-09-24 +last_updated: 2026-10-16 --- This guide is the **canonical reference for the Stripe sale path**. Other framework guides (Next.js, Express, etc.) link here for Step 3. If you need click capture or signup tracking first, start with the [Next.js guide](/docs/api-reference/integrations/nextjs) or the framework guide for your stack. @@ -15,7 +15,7 @@ The `@affitor/sdk` package is **Beta**. The documented happy-path works; report ## Prerequisites -- Your **program ID** (dashboard → program settings) +- Your **program ID** (**Settings** → **Program settings** → **Business**) - A **program API key** (dashboard → program settings → API keys) - Stripe Checkout or Stripe Billing already working in your app - Affitor receiving your Stripe webhooks (dashboard → program settings → Stripe connect) diff --git a/content/docs/brand/quickstart/inviting-partners.mdx b/content/docs/brand/quickstart/inviting-partners.mdx index 193115e2..f1fb0f23 100644 --- a/content/docs/brand/quickstart/inviting-partners.mdx +++ b/content/docs/brand/quickstart/inviting-partners.mdx @@ -2,7 +2,7 @@ title: Inviting Partners description: Recruit affiliates by email or from your other programs, with an invitation written from your program's real terms kind: quickstart -last_updated: 2026-07-06 +last_updated: 2026-10-16 --- The fastest way to grow a young program is to invite people yourself — creators you already know, customers who love the product, or partners performing well in your other programs. Affitor turns that into a two-step flow: pick recipients, send an email that's already written for you. @@ -73,5 +73,5 @@ Send one invite to your own email before the real batch: ## Tips - **Groups first.** If you plan different commission tiers (e.g. VIPs vs. newsletter partners), create the groups before inviting, so each batch lands in the right one. -- **Keep the terms honest.** The generated email quotes your live program settings — if the commission or cookie window changes later, new invites pick the new terms up automatically. +- **Keep the terms honest.** The generated email quotes your live program settings: if the commission or attribution window changes later, new invites pick the new terms up automatically. - **Invite in passes.** Start with the 5–10 people most likely to accept; their early links and sales make the program look alive for everyone who applies after. diff --git a/content/docs/brand/quickstart/setup-program.mdx b/content/docs/brand/quickstart/setup-program.mdx index 072aa288..025c7b37 100644 --- a/content/docs/brand/quickstart/setup-program.mdx +++ b/content/docs/brand/quickstart/setup-program.mdx @@ -2,7 +2,7 @@ title: Set Up Your Program description: Complete the five setup steps (Business, Commission, Tracking, Payments, Go live) and publish your program on the marketplace. kind: quickstart -last_updated: 2026-10-15 +last_updated: 2026-10-16 --- Setup takes your program from created to live in five steps: **Business**, **Commission**, **Tracking**, **Payments** and **Go live**. It opens at the Business step as soon as you [create your program](/docs/brand/quickstart/create-account), at `affitor.com/brand/setup/business`. @@ -11,7 +11,7 @@ Setup takes your program from created to live in five steps: **Business**, **Com items={[ { label: 'Who this is for', value: 'Brand owners and operators' }, { label: 'Time required', value: '10–15 minutes' }, - { label: 'Prerequisites', value: 'A brand account with a program. Choosing the payment method needs the program owner.' }, + { label: 'Prerequisites', value: 'A brand account with a program. Connecting Stripe needs the program owner.' }, { label: 'Outcome', value: 'Your program is live on the marketplace, with its commission and payments set' }, ]} /> @@ -28,7 +28,7 @@ Setup takes your program from created to live in five steps: **Business**, **Com The top of each step shows **Step N of 5** and **Save and exit**. **Continue** saves the step and opens the next one. **Save and exit** saves Business or Commission first, then opens that page in Settings; the other steps have nothing to save and open their Settings page directly. On a wide screen the step list sits on the left, where a done step shows a check (Business also shows your website, Commission your rate), and **What partners see** previews your program card on the right. -The same five pages are also **Settings** → **Program settings**, so anything you set here stays editable there. Until the program is live, Program settings shows how many of the five steps are done. After launch the pages have no **Back** or **Continue**: **Business** and **Commission** have **Save**, **Payments** saves when you pick a method, and **Go live** is named **Status**. +The same five pages are also **Settings** → **Program settings**, so anything you set here stays editable there. Until the program is live, Program settings shows how many of the five steps are done. After launch the pages have no **Back** or **Continue**: **Business** and **Commission** have **Save**, **Payments** has nothing to save, the **Partner link parameter** on **Tracking** saves when you pick it, and **Go live** is named **Status**. ## Step 1: Describe your business @@ -39,6 +39,7 @@ The **Business** step (**Your business**) sets what partners see first. | **Business name** | Yes | 1 to 80 characters | | **Website** | Yes | Your product or site URL. `example.com` is saved as `https://example.com` | | **Program URL** | Yes | Your public program page, `affitor.com/marketplace/`. Lowercase letters, numbers and dashes, up to 48 characters. You can change it later | +| **Program ID** | Shown, not edited | Used by the tracking script, the API and AI agents. **Copy** copies it | | **Logo** | No | PNG, JPG or SVG, square, under 5 MB | | **Tagline** | No | In Settings only (**Program settings** → **Business**): one line on your marketplace card, up to 160 characters | @@ -67,11 +68,11 @@ The step is done once a sale commission is saved and a **New partners** choice i The **Tracking** step (**Install tracking**) puts the click tracker on your site. Pick an **Install method**: -- **Your agent**: select **Connect your AI** to connect Claude, Cursor or another AI app and let it add the tracker. Shown only when AI agents are available for your program. +- **Your agent**: select **Connect your AI** to connect Claude, Cursor or another AI app and let it add the tracker. The last step gives you a prompt to paste to your agent; it first checks that the agent sees this program's ID. Shown only when AI agents are available for your program. - **Script tag**: paste the tag in `` on every page of your site. - **npm**: install the SDK and wrap your app in the provider. -The snippets on the page already carry your Program ID: +The snippets on the page already carry your Program ID (also shown on **Business**, with **Copy**): ```html @@ -89,7 +90,7 @@ npm install @affitor/sdk On Next.js App Router, put the provider in a client component and render it once in your layout: ```tsx -// app/providers.tsx (a client component) +// app/affitor-provider.tsx (a client component) 'use client'; import { AffitorProvider } from '@affitor/sdk/react'; @@ -100,7 +101,7 @@ export function Providers({ children }: { children: React.ReactNode }) { ```tsx // app/layout.tsx (Next.js App Router): render it once around your app -import { Providers } from './providers'; +import { Providers } from './affitor-provider'; export default function RootLayout({ children }: { children: React.ReactNode }) { return ( @@ -115,20 +116,22 @@ export default function RootLayout({ children }: { children: React.ReactNode }) The provider runs in the browser, so it lives in a client component: in the App Router, `layout.tsx` is a Server Component. With the Pages Router, wrap your app in `AffitorProvider` in `pages/_app.tsx`. -Below the snippets, **Tracker on** your site shows **Waiting for the first visit**, **Tracker not found on your site yet**, or **First click** and how long ago it arrived. **Check now** asks Affitor to look for the tracker on your website again. Nothing is saved on this step: **Continue** turns on after the first click, and **Skip for now** moves on to Payments. +Below the snippets, **Tracker on** your site shows **Waiting for the first visit**, **Checking…**, **Tracker not found on your site yet**, **Tracker found on** your site, **Receiving events**, **Couldn't load** your site, or **First click** and how long ago it arrived. **Check now** asks Affitor to look for the tracker on your website again; it is gone once a first click arrives. **Continue** turns on once the step is done (see below) or a first click arrives, and **Skip for now** moves on to Payments. + +**Partner link parameter** sets how partner links name the partner: `yoursite.com/?via=PARTNER` or `yoursite.com/?aff=PARTNER`. The tracker reads both. Programs created from October 16, 2026 (UTC) use `?via=` unless you pick `?aff=`; older programs keep `?aff=`. If you change it, links partners already shared keep working. If your own server reads the partner code, read both `?aff=` and `?via=`. The step is done once Affitor finds the tracker on your website or receives real tracking events. Signup tracking is a separate install: see [signup tracking](/docs/brand/tracking/lead-tracking-signup), and [click tracking](/docs/brand/tracking/click-tracking) for the full click guide. ## Step 4: Connect payments -The **Payments** step (**Connect payments**) sets how Affitor records your sales. Choosing an option saves it right away. Only the program owner can choose the method or connect Stripe; other members see its state and "Only the program owner can connect payments." - -![Setup step 4 of 5, Connect payments: choose Stripe (one click, no checkout code) or the Server API, then connect; a note explains how refunds and chargebacks reverse commissions](/docs/brand/setup-payments.png) +The **Payments** step sets how Affitor records your sales: **Connect Stripe, your server, or both.** It shows two cards, each with its own state, and there is no method to choose. Only the program owner can connect Stripe; other members see "Only the program owner can connect Stripe." -| Option | On the page | What to do | +| Card | States | What to do | |--------|-------------|------------| -| **Stripe** | One click. No checkout code. | Select **Connect Stripe**. Stripe opens in a new tab; finish there and this page updates when you come back. If you started and did not finish, the button reads **Finish in Stripe**. Once connected, the page shows **Connected** | -| **Server API** | Your backend sends each sale. | Run the test sale below once from your server. The page shows **Waiting for a test sale from your server** until it arrives, then **Received**. **Check again** reads the status now | +| **Stripe** | **Not connected**, **Not finished**, **Connected** | Select **Connect Stripe**. Stripe opens in a new tab; finish there and this page updates when you come back. If you started and did not finish, the button reads **Finish in Stripe** | +| **Server API** | **No sale yet**, **Received** | Select **Send a test sale** to see the call, then run it once from your server. **Check again** reads the status now | + +If Stripe is connected and your server has also sent a sale, the page warns that sending the same purchase through both can count it twice: use one source per purchase. The Server API test sale uses your program API key ([where to find it](/docs/brand/settings#step-2-find-your-api-key)). With `"livemode": false` it is a test sale and creates no commission: @@ -146,11 +149,11 @@ curl -X POST https://api.affitor.com/api/v1/track/sale \ }' ``` -Once payments are connected, **Check Affitor's tracking** offers **Run check**: Affitor sends a test click, signup and sale through your program and shows each as **Matched**, **Not matched**, **Wrong partner** or **Waiting**. It is a pipeline check and does not count toward Go live. +Once payments are connected, **Check Affitor's tracking** offers **Run check**: Affitor sends a test click, signup and sale through your program and shows each as **Matched**, **Not matched**, **Wrong partner** or **Waiting**. It is a pipeline check: it does not complete either card and does not count toward Go live. **Refunds and chargebacks**: with Stripe, Affitor reads refunds and disputes from your connected account. With the Server API, report each refund with [Track a refund](/docs/api-reference/track-refund). -The step is done when Stripe is connected, or, with the Server API, when Affitor has received a sale from your server. **Skip for now** moves on to Go live, which shows what is still missing. +The step is done when either card is: Stripe is connected, or Affitor has received a sale from your server. **Skip for now** moves on to Go live, which shows what is still missing. ## Step 5: Go live @@ -165,7 +168,7 @@ The step is done when Stripe is connected, or, with the Server API, when Affitor A row that is not done has **Fix** (**Set up** for click tracking), which opens its step. The page also shows the address your program page opens at. **Go live** turns on once the three required rows are done, and Affitor checks them again when you select it. -Payments counts as connected in one of two ways, matching the method you chose on the **Payments** step: +Payments counts as connected when either card on the **Payments** step is done: - **Stripe**: your Stripe account is connected to the program. - **Server API**: your server has sent at least one sale for this program to `POST /api/v1/track/sale`. A test sale counts (send it with `"livemode": false`), so you can go live before your first real customer. **Run check** does not count; the sale has to come from your server. diff --git a/content/docs/brand/settings.mdx b/content/docs/brand/settings.mdx index d6c2aa76..a4e8e815 100644 --- a/content/docs/brand/settings.mdx +++ b/content/docs/brand/settings.mdx @@ -2,7 +2,7 @@ title: Manage program settings and your API key description: Edit your program's terms after launch and find, copy, or regenerate the per-program API key that authenticates your tracking integration. kind: guide -last_updated: 2026-10-15 +last_updated: 2026-10-16 --- Everything you configured in the [setup wizard](/docs/brand/quickstart/setup-program) stays editable after launch, and Settings also hold the API key that every server-side [tracking call](/docs/api-reference/overview) authenticates with. This guide shows where each setting lives, how to change terms safely, and how to rotate the key with the shortest possible gap in tracking. @@ -28,10 +28,10 @@ Settings belong to the program selected in the program menu. Open the program me | Page | What you edit there | |---------|--------------------| -| **Business** | Business name, website, program URL (your public page), tagline and logo, with a **Branding** section for how your program page looks in the marketplace | +| **Business** | Business name, website, program URL (your public page), tagline and logo, with a **Branding** section for how your program page looks in the marketplace. **Program ID** is shown read-only with **Copy** | | **Commission** | Commission type, rate and duration, attribution window, hold period, and how new partners join (**Approve all** or **Review each**) | -| **Tracking** | Click and signup (lead) tracking on your website | -| **Payments** | How sales are counted: Stripe connected, or sales sent from your server | +| **Tracking** | Click and signup (lead) tracking on your website, and the **Partner link parameter** (`?via=` or `?aff=`) | +| **Payments** | How sales are counted: two cards, **Stripe** and **Server API**, each with its own state. Either one is enough | | **Go live** (**Status** once the program is live) | What the program still needs to go live, and its live state | The rest of the Settings menu: @@ -42,7 +42,7 @@ The rest of the Settings menu: | **Team** | **Members** | Who can work on the program | | **Billing** | **Invoices** | Platform-fee invoices | | **Personal** | **Your account** | Your own profile and sign-in, shared with the partner side | -| **Explore** | **Refer a brand** | Your link for referring brands to Affitor | +| **Explore** | **Refer a brand** | Your link for referring brands to Affitor, **Invite via email**, and the brands you referred ([how it works](/docs/partners/quickstart/get-your-referral-link#refer-a-brand-to-affitor)) | ## Step 1: Edit program terms after launch diff --git a/content/docs/brand/tracking/click-tracking.mdx b/content/docs/brand/tracking/click-tracking.mdx index 7d741480..d0ef5aa2 100644 --- a/content/docs/brand/tracking/click-tracking.mdx +++ b/content/docs/brand/tracking/click-tracking.mdx @@ -2,7 +2,7 @@ title: Click Tracking description: Track affiliate visits with the Affitor tracker SDK or script tag kind: guide -last_updated: 2026-09-24 +last_updated: 2026-10-16 --- Click tracking is the first step in every Affitor integration. It detects affiliate visits, creates the click/customer relationship, and stores the browser identifier used by later signup and sale attribution. @@ -14,12 +14,13 @@ Click tracking is the first step in every Affitor integration. It detects affili When someone lands on your site through an affiliate link such as: ```text +https://yoursite.com?via=PARTNER123 https://yoursite.com?aff=PARTNER123 ``` the tracker: -1. detects the `?aff=` parameter +1. detects the `?via=` or `?aff=` parameter (which one your links use is the **Partner link parameter** on **Tracking**; the tracker reads both) 2. sends click data to Affitor 3. creates or updates the tracked customer relationship 4. stores `affitor_click_id` in a first-party cookie diff --git a/content/docs/brand/tracking/quickstart-integration.mdx b/content/docs/brand/tracking/quickstart-integration.mdx index f75cfe35..e07d75c0 100644 --- a/content/docs/brand/tracking/quickstart-integration.mdx +++ b/content/docs/brand/tracking/quickstart-integration.mdx @@ -2,7 +2,7 @@ title: 3-Step Integration Guide description: Get Affitor tracking live with the supported click, signup, and server-side tracking flows kind: quickstart -last_updated: 2026-10-15 +last_updated: 2026-10-16 --- Three steps get Affitor tracking live: clicks → signups → sales. Steps 1 and 2 establish attribution; step 3 records revenue. @@ -50,7 +50,7 @@ Once the tracker is live on your public site, Affitor detects it automatically, ``` -Replace `YOUR_PROGRAM_ID` with the program ID from your dashboard. +Replace `YOUR_PROGRAM_ID` with your program ID (**Settings** → **Program settings** → **Business** → **Program ID**, **Copy**). ### What this does diff --git a/content/docs/brand/tracking/tracking-overview.mdx b/content/docs/brand/tracking/tracking-overview.mdx index d0ea6af6..4bcd3a8d 100644 --- a/content/docs/brand/tracking/tracking-overview.mdx +++ b/content/docs/brand/tracking/tracking-overview.mdx @@ -2,7 +2,7 @@ title: Tracking Overview description: How Affitor links clicks, signups, and sales together kind: concept -last_updated: 2026-10-14 +last_updated: 2026-10-16 --- Affitor tracking links three events into one attribution chain: @@ -57,7 +57,7 @@ Identifier consistency matters more than any single code snippet. Install the tracker so affiliate visits are detected automatically: -- Detects `?aff=` +- Detects `?via=` or `?aff=` - Stores `affitor_click_id` - Creates the initial relationship Affitor needs for attribution diff --git a/content/docs/support/glossary.mdx b/content/docs/support/glossary.mdx index 3974d3a9..7afabe18 100644 --- a/content/docs/support/glossary.mdx +++ b/content/docs/support/glossary.mdx @@ -2,7 +2,7 @@ title: Glossary description: Common terms used across Affitor docs — server-side tracking, Stripe integration, invoice billing, and more kind: reference -last_updated: 2026-10-14 +last_updated: 2026-10-16 --- ## A @@ -11,7 +11,7 @@ last_updated: 2026-10-14 The company running an affiliate program in Affitor. ### Affiliate Link -A partner-specific referral link that includes tracking information, typically through the `?aff=` parameter. +A partner-specific referral link that includes tracking information, through the `?via=` or `?aff=` parameter (the program's **Partner link parameter**). ### Attribution The process of crediting a conversion to the correct partner. Current public docs describe first-party tracking with a 60-day default window and first-click attribution: the partner whose click first brings in a customer keeps that customer. @@ -58,7 +58,7 @@ A pricing model where fees are tied to partner-generated revenue rather than a m Affitor's fee on partner-generated revenue: $0 until a program's affiliate-driven revenue reaches $10,000, then 3.5% of each affiliate-driven sale. The threshold is counted per program. ### Program ID -The identifier for your Affitor program. It is used in tracker setup, test flows, and Stripe metadata. You can find your program ID in the Affitor dashboard after creating your program. +The identifier for your Affitor program. It is used in tracker setup, test flows, and Stripe metadata. Find it under **Settings** → **Program settings** → **Business**, where **Program ID** is shown with **Copy**. ## R diff --git a/public/docs/skill.md b/public/docs/skill.md index 6f2eb9c9..6ebe6f7a 100644 --- a/public/docs/skill.md +++ b/public/docs/skill.md @@ -65,7 +65,7 @@ npm i @affitor/sdk ## 4. Click tracking (browser) -Load the tracker on **every page** so `?aff=` visits are captured into the `affitor_click_id` first-party cookie. **Always pass `API_BASE`** when it is not prod. +Load the tracker on **every page** so `?via=` and `?aff=` visits are captured into the `affitor_click_id` first-party cookie. **Always pass `API_BASE`** when it is not prod. ### 4a. Next.js — App Router