---
id: "brand/quickstart/setup-program"
type: "doc"
url: "https://affitor.com/docs/brand/quickstart/setup-program"
kind: "quickstart"
updated: "2026-10-16"
---
# Set Up Your Program

> Complete the five setup steps (Business, Commission, Tracking, Payments, Go live) and publish your program on the marketplace.

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`.

<PageMeta
  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. Connecting Stripe needs the program owner.' },
    { label: 'Outcome', value: 'Your program is live on the marketplace, with its commission and payments set' },
  ]}
/>

## The flow at a glance

<Flow>
  <FlowStep>**Business**: business name, website, program URL and an optional logo.</FlowStep>
  <FlowStep>**Commission**: what partners earn, the attribution window, the hold period and how new partners join.</FlowStep>
  <FlowStep>**Tracking**: install the click tracker on your site. Optional for Go live.</FlowStep>
  <FlowStep>**Payments**: connect Stripe, or send one sale from your server.</FlowStep>
  <FlowStep>**Go live**: publish the program once Business, Commission and Payments are done.</FlowStep>
</Flow>

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** 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

The **Business** step (**Your business**) sets what partners see first.

| Field | Required | Notes |
|-------|----------|-------|
| **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/<handle>`. 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 |

**Continue** saves only the fields you changed and moves on once every save succeeds; an error shows under its field. The step is done once the program has a business name and a website.

## Step 2: Set your commission

The **Commission** step sets what partners earn and how they join.

![Setup step 2 of 5, Commission: type (one-time, recurring or lifetime), rate and months, attribution window, hold period, and whether new partners are approved automatically or reviewed one by one, with a preview of what partners see](/docs/brand/setup-commission.png)

| Field | Required | Notes |
|-------|----------|-------|
| **Type** | Yes | **One-time** pays on the first payment, **Recurring** monthly for the months in **For**, **Lifetime** on every payment |
| **Rate** | Yes | Percent of the payment, 0 to 100 with up to 2 decimals |
| **For** | Yes, for **Recurring** | How many months the partner keeps earning: a whole number from 1 to 36. Shown only for **Recurring** |
| **Attribution window** | Yes | How long after a click a signup still counts: 1 to 365 days |
| **Hold period** | Yes | Days until a commission is payable, to cover refunds: 0 to 31 |
| **New partners** | Yes | **Approve all** approves every application; **Review each** lets you review each one |

Once the rate is valid, a line shows what a $100 payment gives the partner, for example "$20 to the partner, monthly for 12 months". If your saved terms are ones this form cannot show exactly (for example a fixed amount), the step shows them as **Current terms** and keeps them unless you select **Set new terms**.

The step is done once a sale commission is saved and a **New partners** choice is set. To pay some partners a different rate, use [groups](/docs/brand/groups).

## Step 3: Install tracking

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. 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 `<head>` 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 (also shown on **Business**, with **Copy**):

```html
<!-- Include Affitor Tracking Script -->
<script
  src="https://api.affitor.com/js/affitor-tracker.js"
  data-affitor-program-id="YOUR_PROGRAM_ID"
  data-affitor-debug="false">
</script>
```

```bash
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/affitor-provider.tsx (a client component)
'use client';
import { AffitorProvider } from '@affitor/sdk/react';

export function Providers({ children }: { children: React.ReactNode }) {
  return <AffitorProvider programId="YOUR_PROGRAM_ID">{children}</AffitorProvider>;
}
```

```tsx
// app/layout.tsx (Next.js App Router): render it once around your app
import { Providers } from './affitor-provider';

export default function RootLayout({ children }: { children: React.ReactNode }) {
  return (
    <html lang="en">
      <body>
        <Providers>{children}</Providers>
      </body>
    </html>
  );
}
```

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**, **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 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."

| Card | States | What to do |
|--------|-------------|------------|
| **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:

```bash
curl -X POST https://api.affitor.com/api/v1/track/sale \
  -H "Authorization: Bearer YOUR_PROGRAM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "click_id": "clk_abc123",
    "customer_key": "user_123",
    "amount_cents": 4900,
    "currency": "usd",
    "transaction_id": "txn_test_001",
    "livemode": false
  }'
```

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 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

**Go live** publishes your program on the marketplace. The page lists four rows:

| Row | Needed to go live | Done when |
|-----|-------------------|-----------|
| **Business** | Yes | the program has a business name and a website (the logo is optional) |
| **Commission** | Yes | a sale commission is saved |
| **Click tracking** | No | Affitor finds the tracker on your website or receives real events; until then the row reads "Optional · no visit seen yet" |
| **Payments** | Yes | Affitor can record your sales (see below) |

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 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.

Click and signup tracking are not required to go live. Install them before you invite partners so their traffic is attributed.

If the program is paused for an overdue invoice, Go live stays blocked: selecting **Go live** shows the overdue notice with **Open billing**. Pay the invoice first.

Once live, the page says your program is live and shows its link with **Copy link**, plus **Open dashboard** and **Invite partners**.

## Before you invite partners

<Checklist
  items={[
    { text: 'Install click tracking on every page partner traffic lands on', href: '/docs/brand/tracking/click-tracking' },
    { text: 'Add signup tracking with a stable internal customer ID', href: '/docs/brand/tracking/lead-tracking-signup' },
    { text: 'Test click, signup and sale end to end', href: '/docs/brand/tracking/testing-integration' },
  ]}
/>

## Verify it worked

Open **Settings** → **Program settings** and check that each page kept what you saved:

<VerifySuccess
  dashboard={[
    "Business shows your business name, website, program URL and logo",
    "Commission shows your type, rate and, for Recurring, the months, plus Approve all or Review each, whichever you picked",
    "Payments shows Stripe Connected, or Received for the Server API",
    "Until the program is live, Quick start in the top bar shows how many setup steps are left; once it is live, Go live in Program settings reads Status",
  ]}
  ifNotWorking={[
    "A page shows old values? Business and Commission save only when you select Continue, Save or Save and exit: reopen the page, re-enter, and save again",
    "Go live stays off? Each row that is not done has Fix, which opens the step it needs",
    "Set up with the CLI instead? Run npx affitor status from your project root. It prints your program card (name, domain, program ID). For payments, trust the Payments page: it is what Go live counts",
    "Click tracking not done yet? It turns done once Affitor finds the tracker on your website or receives real events, which the tracking quickstart covers next",
  ]}
/>

<NextStep
  title="Install tracking"
  description="Once your program is set up, move into the tracking quickstart to capture clicks, signups, and payments end to end."
  href="/docs/brand/tracking/quickstart-integration"
  ctaLabel="Open tracking quickstart"
/>
