> ## Documentation Index
> Fetch the complete documentation index at: https://docs.introw.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Campaign Registration & ROI

> Partners register the campaigns they launch from a kit, keep them up to date themselves, and log the deals each one produces, so you see what is live and what it returned.

export const Headless = ({children, intro = true}) => {
  const [copied, setCopied] = useState(null);
  const copy = event => {
    const row = event.target.closest("li");
    if (!row) return;
    const text = row.textContent.trim();
    try {
      navigator.clipboard?.writeText(text);
    } catch {}
    setCopied(text);
    setTimeout(() => setCopied(null), 1600);
  };
  return <>
      {intro ? <p>
          Introw is <strong>headless</strong> by design: run everything here in plain language from Claude, ChatGPT,
          Slack, Teams, or your own CRM through Introw's <a href="/features/developer/mcp">MCP server</a>, with every
          action written straight back to your CRM source of truth. The portal is one surface, never the only one.
        </p> : null}

      {children ? <div className="not-prose" data-prompts="block">
          <div data-prompts="head">
            <span>{copied ? "Copied" : "Try it from your LLM"}</span>
          </div>
          <div data-prompts="rows" onClick={copy}>
            {children}
          </div>
          <a href="/headless/prompts" data-prompts="more">
            See all prompts
          </a>
        </div> : <Card title="See the headless motion" icon="wand-magic-sparkles" href="/headless">
          The agentic motion - lifecycle deep dives and a Claude Code skill library that run your partner program from
          Claude, ChatGPT, Slack, and your CRM.
        </Card>}
    </>;
};

export const Tour = ({children}) => {
  const [active, setActive] = useState(0);
  const wrappers = (Array.isArray(children) ? children : [children]).filter(c => c && c.props);
  const frames = wrappers.length === 1 && Array.isArray(wrappers[0].props.children) ? wrappers[0].props.children.filter(c => c && c.props) : [];
  if (frames.length < 2) {
    return <div className="not-prose" data-overview="tour">
        {children}
      </div>;
  }
  const thumb = (frame, index) => <button key={index} type="button" onClick={() => setActive(index)} aria-label={`Frame ${index + 1}`} data-active={index === active ? "true" : "false"} data-index={index + 1}>
      {frame}
    </button>;
  return <div className="not-prose" data-overview="tour">
      <div data-tour="hero">{frames[active] ?? frames[0]}</div>
      <div data-tour="strip">{frames.map((frame, index) => thumb(frame, index))}</div>
    </div>;
};

export const Impact = ({children}) => <div className="not-prose" data-overview="impact">
    {children}
  </div>;

export const Personas = ({children}) => <div className="not-prose" data-overview="personas">
    {children}
  </div>;

export const Pains = ({children}) => <div className="not-prose" data-overview="pains">
    {children}
  </div>;

> Partners register every campaign they launch from a kit, keep it current themselves, and log the deals it produces. You see which campaigns are live, what they cost and what they returned, in your CRM.

## The problem it solves

<Pains>
  | Without Introw | With Introw |
  | - | - |
  | You cannot see which campaigns are live | Partners register each one |
  | Campaign details go stale in a spreadsheet | Partners update their own record |
  | Deals never trace back to a campaign | Each deal lands on the campaign |
  | You cannot show finance what a fund returned | ROI counts itself, against the budget |
</Pains>

## Impact

Partners run campaigns in their own tools, which is why they run more of them. Registration is the one step that keeps you in the loop, and it takes them a form, not a report.

<Impact>
  for your business

  * **In your CRM**
    Every registered campaign is a record in your CRM, with its owner, dates, status and budget, next to the deals it produced
  * **Trustworthy**
    ROI counts the deals each campaign created, so the number you show finance comes from your CRM, not from a partner's slide

  for your partners

  * **Self-serve**
    They register a campaign in one form and see its status in the portal, without emailing you
  * **Enabled**
    They see their budget, what is approved and what is left before they commit to a campaign
  * **Efficient**
    A deal they log on the campaign lands in your CRM with them attached, so they enter it once

  [A day in the life of a co-sell partner](/days-in-the-life/co-sell-partner)
</Impact>

<Personas>
  * **Partner Marketing** - every live campaign, in one list
  * **Partner Operations** - campaign records in the CRM, not a spreadsheet
  * **Finance** - what each fund returned
  * **Partner marketers** - register once, update it themselves
</Personas>

## See it work

<Tour>
  * ![The fund's Request Fund step, with the intake form partners fill in, the acceptance steps and the decision timeline.](https://assets.introw.io/docs/features/tcma/campaign-roi/guides/register-partner-campaigns-with-mdf/steps/03.png)

    **Shape the registration**

    One fund, one form partners fill in when a campaign goes out.

  * ![The Marketing tab in the experience builder, with the Register a deal banner above the fund's budget summary, its requests and the Fund a campaign button.](https://assets.introw.io/docs/features/tcma/campaign-roi/guides/register-partner-campaigns-with-mdf/steps/11.png)

    **Put it under the kit**

    Partners register or fund a campaign from the same tab as the kit.

  * ![The Real-time tracking settings on the fund's ROI step: the object type to count, an optional filter, Count or Sum of property, and the amount each object is worth.](https://assets.introw.io/docs/features/tcma/campaign-roi/guides/log-campaign-deals-as-roi/steps/04.png)

    **Count what it produces**

    Every object logged as ROI counts toward the campaign, at a value you set.

  * ![An accepted market development fund request opened in Introw, with its ROI tile comparing the ROI logged against the approved budget.](https://assets.introw.io/docs/features/tcma/campaign-roi/guides/log-campaign-deals-as-roi/steps/08.png)

    **ROI against budget**

    Each registered campaign shows what it returned against what it cost.
</Tour>

## How it works

A partner registers a campaign at the moment it goes out.
The registration is a request on a marketing fund: the partner names the campaign, its dates, its channel and the budget they need, and you approve it like any other request.
A fund does not have to pay anything back.
Switch off its Claims and Invoices steps and it becomes a place partners register campaigns, with the budget at zero or used only as an approval limit.

Once a campaign is approved, the partner follows it from the portal.
They see it next to their budget with its status, and log the deals it produces through the campaign's ROI form.
Each deal they log is created in your CRM and counted toward that campaign, so the campaign's ROI rises as deals come in.
Introw shows the return against the approved budget, and reports can group deals by fund.

Some programs want a campaign record without any fund at all.
For those, a registration form can create a record of any type in your CRM, such as a Salesforce Campaign or a HubSpot custom object.
The portal shows partners their own records, and they update the fields you open up, such as status, end date or audience size.
Linking a later deal registration to one of those records is not something a form does today, so programs that need campaign ROI on deals use the fund route.

Clicks and signups from a partner's campaign are tracked separately, through affiliate links, and give you the top of the funnel the registered deals do not.

```mermaid theme={"theme":{"light":"github-light","dark":"github-dark"}}
flowchart LR
  kit["Partner launches from a kit"] --> register["Registers the campaign"]
  register --> approve["You approve it"]
  approve --> manage["Partner keeps it current"]
  manage --> deals["Logs the deals it creates"]
  deals --> roi["ROI against the budget"]
```

## Run it from your AI assistant

<Headless>
  * Which partner campaigns are approved and running this quarter?
  * Show me the marketing fund requests for Apple and their status.
  * Register a webinar campaign for us on the 2026 fund, running November 3 to December 12.
</Headless>

## Going deeper

<CardGroup cols={2}>
  <Card title="How to" icon="screwdriver-wrench" href="./technical">
    Setup, configuration, and all how-to guides.
  </Card>

  <Card title="API reference" icon="code" href="/general/introduction">
    Endpoints and code.
  </Card>
</CardGroup>

**Works with**

<CardGroup cols={2}>
  <Card title="Campaign Kits" icon="bullhorn" href="/features/tcma/campaign-kits">
    Partners register the campaign they launch from a kit.
  </Card>

  <Card title="ROI" icon="sack-dollar" href="/features/mdf/roi">
    Real-time ROI counts the deals a registered campaign produces.
  </Card>

  <Card title="Funds & Allocation" icon="sack-dollar" href="/features/mdf/funds-allocation">
    A fund is where partners register and fund their campaigns.
  </Card>

  <Card title="Campaign Attribution" icon="bullhorn" href="/features/tcma/attribution">
    Clicks and conversions add the top of the funnel to the deals logged here.
  </Card>

  <Card title="CRM Automations" icon="table-list" href="/features/forms/crm-automations">
    A registration form writes the campaign record into your CRM.
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.