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

# Sharing & submitting

> Every way an Introw form reaches partners and returns attributed, CRM-ready submissions: share links, website embeds, email, Slack, Teams, AI, CSV, API.

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

> A form is only as good as the partners who actually fill it in. Sharing & Submitting is every way a form gets to a partner and back: a link, an embed, an email, a Slack or Teams message, an AI assistant, a bulk CSV upload, or a call from your own systems. Every channel feeds the same form, so the submission always lands attributed and CRM-ready, wherever the partner started.

## The problem it solves

Most partner data never arrives because the form is one more place partners have to go:

<Pains>
  | Without Introw                      | With Introw                     |
  | ----------------------------------- | ------------------------------- |
  | Partners will not log in for a form | They submit from where they are |
  | A form with no submissions is waste | Every channel feeds one form    |
  | A long list, one row at a time      | One CSV of up to 1000 rows      |
  | Big partners want system-to-system  | The same form over the API      |
</Pains>

## Impact

The form is not the product, the submission is. Being reachable in the channel a partner already has open is the whole difference between a form you built and data you actually have.

<Impact>
  for your business

  * **No new tool**
    Link, embed, portal, email, Slack, Teams, an AI assistant, a CSV or the API, all into one form
  * **Live in days**
    Switching on a channel is a setting, so submissions start arriving in days rather than quarters

  for your partners

  * **Self-serve**
    Templates, bulk upload and pre-submit validation let them get it right without a round trip
  * **Enabled**
    They start where the deal came up, in chat or their inbox, not in a tool they had to remember
  * **Efficient**
    One CSV instead of a hundred submissions, and their own systems can submit on their behalf

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

<Personas>
  * **Partner Operations** - the channels to switch on
  * **Partner Marketing** - forms in sites and journeys
  * **Partners** - one record or a whole list
  * **Developers** - intake over the API
</Personas>

## See it work

<Tour>
  * ![A form opened from the partner portal, prefilling who the partner is and asking for the subject, description, priority, category and any attachments.](https://assets.introw.io/docs/partner-portal/support-form.png)

    **One at a time, from the portal**

    The form opens where the partner already is, already knowing who they are.

  * ![A Batch Upload field being added to a form in the builder.](https://assets.introw.io/docs/features/forms/sharing-submitting/guides/bulk-upload-multiple-records/steps/02.png)

    **Allow a batch**

    A Batch Upload field turns one form into a list intake.

  * ![The upload step of a batch submission, with a completed CSV being uploaded.](https://assets.introw.io/docs/features/forms/sharing-submitting/guides/bulk-upload-multiple-records/steps/06.png)

    **Take the CSV**

    Partners hand over a whole book of business in one file.

  * ![The batch preview, flagging rows against required values, allowed picklist values and validation rules.](https://assets.introw.io/docs/features/forms/sharing-submitting/guides/bulk-upload-multiple-records/steps/08.png)

    **Validate before it lands**

    Required values, picklists and rules are checked row by row.

  * ![The API tab of a form's share dialog, with the link to manage API keys.](https://assets.introw.io/docs/features/forms/sharing-submitting/guides/submit-a-form-via-the-api/steps/04.png)

    **Or system to system**

    The same form is callable over the API, with its own key.
</Tour>

## How it works

Once a form is built, you deliver it through whatever channel fits how your partners work. Send a general or partner-specific link, embed it on your own site, or drop it into a portal experience. Partners can also submit straight from email, Slack, Teams, or an AI assistant that fills the form for them. When a partner has a whole list rather than a single record, a batch upload lets them submit up to 1000 rows from one CSV. And when the submission should not involve a human at all, your own product, an internal tool, or an agent can submit the form over the API.

Every one of these routes feeds the same form and the same CRM automation, so it does not matter where a partner starts. The submission is attributed to the right partner, checked, and turned into clean CRM records the same way each time. Meeting partners where they already work, instead of forcing them into a portal, is what turns a form from a thing you built into submissions you actually receive.

Sharing & Submitting turns a built form into submissions you receive. Publish it through the channels your partners already live in, add a bulk path for lists, and let every route converge on the same attributed, CRM-synced record. Adoption stops being a portal-login problem and becomes a question of which channels you switch on.

```mermaid theme={"theme":{"light":"github-light","dark":"github-dark"}}
flowchart LR
  form["One form"] --> channels["Link, embed, email, Slack, Teams, AI, bulk CSV, API"]
  channels --> submit["Partner submits where they work"]
  submit --> record["Attributed, CRM-ready record"]
```

## Run it from your AI assistant

<Headless>
  * Which forms can I submit for Acme, and what are the ways to submit them?
  * Share the deal registration form with Globex as a partner-specific link.
  * Submit a batch of leads for Acme from a CSV.
</Headless>

## Going deeper

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

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

**Works with**

<CardGroup cols={2}>
  <Card title="Form Builder" icon="table-list" href="/features/forms/form-builder">
    Build the form once, then share it through every channel.
  </Card>

  <Card title="CRM Automations" icon="table-list" href="/features/forms/crm-automations">
    Each submission maps and syncs to the CRM on the way in.
  </Card>

  <Card title="Submissions & Approvals" icon="table-list" href="/features/forms/submissions-approvals">
    Every submission lands in one inbox to review.
  </Card>

  <Card title="Partner Support Agent" icon="robot" href="/features/ai/partner-support">
    Partners submit by email, Slack, Teams, or AI and the agent fills the form.
  </Card>
</CardGroup>
