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

# ROI

> Prove the return on co-marketing spend by attributing real CRM deals to the project and tracking partner-reported outcomes live - defend every MDF dollar.

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

> The question every MDF program eventually has to answer is "did it work?" ROI in Introw answers it with real pipeline, not a partner's word: the deals a funded activity created are attributed to the project, and the fund tracks its return live from CRM data.

## The problem it solves

MDF without proven ROI is the first budget cut:

<Pains>
  | Without Introw                    | With Introw                    |
  | --------------------------------- | ------------------------------ |
  | Returns are a year-end guess      | Tracked live from your CRM     |
  | Partners report their own numbers | The real deals it created      |
  | Spend and return live apart       | Both sit on the same record    |
  | Finance cannot see the return     | It reports like direct revenue |
</Pains>

## Impact

A partner who can show their marketing worked gets more budget from you next quarter, and knows it. That loop is why they bring you their best ideas rather than someone else's.

<Impact>
  for your business

  * **In your CRM**
    Return is read from real CRM deals rather than partner-reported numbers, on the same record as the spend
  * **Cost to run**
    Nothing is reconstructed at year end, because results are captured as the activity completes

  for your partners

  * **Self-serve**
    They report results on the same project they proposed, not in a separate template you send them
  * **Enabled**
    Seeing what their activity actually returned tells them what to propose next time
  * **Efficient**
    One form at the end of the activity, against a deadline set when it was approved

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

<Personas>
  * **Partner Marketing** - a budget they can defend with numbers
  * **Finance** - returns measured in the CRM, not on a slide
  * **Partners** - proof it worked, which earns the next round
</Personas>

## See it work

<Tour>
  * ![The ROI step of a marketing fund, with the results form partners submit after a funded activity completes.](https://assets.introw.io/docs/features/mdf/roi/guides/configure-the-roi-form/steps/04.png)

    **The step**

    Results land on the same record as the spend.

  * ![The ROI intake form, collecting the results a partner reports after a funded activity.](https://assets.introw.io/docs/features/mdf/roi/guides/configure-the-roi-form/steps/05.png)

    **The form**

    What partners report back, on a form you shape.

  * ![Sequential human approval gates on the ROI form, each accepting before the next.](https://assets.introw.io/docs/features/mdf/roi/guides/configure-the-roi-form/steps/06.png)

    **Approve**

    The same approval chain as every other step.

  * ![The ROI deadline configuration on a fund, setting when results are due after an activity.](https://assets.introw.io/docs/features/mdf/roi/guides/configure-the-roi-form/steps/08.png)

    **The deadline**

    When results are due after the activity ends.
</Tour>

## How it works

ROI is measured two ways, and they reinforce each other. Partners **report outcomes** through the ROI form. The fund also tracks **real-time ROI from CRM data**. It attributes the objects a project produced, typically deals, to that project. From there it either **counts them**, times a value per unit, or **sums a property** like deal amount. Because the source is your CRM, the number updates as pipeline progresses instead of waiting for a manual year-end tally.

That ties MDF spend directly to the revenue it influenced, in the same defensible model RevOps uses for the rest of the pipeline. The ROI step has its own reporting window on the timeline, and the results surface to partners and your team on the project and in [reports and dashboards](/features/reporting/report-builder).

```mermaid theme={"theme":{"light":"github-light","dark":"github-dark"}}
flowchart LR
  activity["Funded activity"] --> deals["Deals attributed to the project"]
  deals --> measure["Count objects or sum a property"]
  measure --> roi["Live ROI on the project and in reports"]
```

## Run it from your AI assistant

<Headless>
  * What ROI have partners reported against the Q2 fund?
  * Which MDF projects sourced the most pipeline this quarter?
  * Show the return on Acme's field-event project.
</Headless>

## Going deeper

<CardGroup cols={2}>
  <Card title="How to" icon="screwdriver-wrench" href="./technical">
    Configure real-time ROI tracking and the ROI reporting window.
  </Card>

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

**Works with**

<CardGroup cols={2}>
  <Card title="Projects" icon="sack-dollar" href="/features/mdf/projects">
    ROI is measured on the proposal's activity.
  </Card>

  <Card title="Report Builder" icon="chart-line" href="/features/reporting/report-builder">
    Fund ROI feeds reports and dashboards.
  </Card>

  <Card title="CRM" icon="plug" href="/features/integrations/crm">
    ROI attributes real CRM deals to the project.
  </Card>
</CardGroup>
