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

# Field mapping and the submissions inbox

> Track or ignore a detected form, map its fields to lead attributes, and work the submissions it produces.

export const Screenshot = ({id, alt, caption, frame = 'browser', url, marks = [], lang = 'en', workspace = 'northwind-outbound'}) => {
  const src = `/images/screenshots/${lang}/${id}.png`;
  const chrome = url ? `app.pipelime.ai/${workspace}${url}` : 'app.pipelime.ai';
  return <figure className={`pl-shot pl-shot--${frame} not-prose`}>
      <div className="pl-shot__frame">
        {frame !== 'bare' && <div className="pl-shot__bar">
            <span className="pl-shot__dots">
              <span className="pl-shot__dot" />
              <span className="pl-shot__dot" />
              <span className="pl-shot__dot" />
            </span>
            <span className="pl-shot__url">{chrome}</span>
          </div>}
        <div className="pl-shot__media">
          <img src={src} alt={alt} loading="lazy" />
          {marks.map(mark => <span key={mark.n} className="pl-shot__mark" style={{
    left: `${mark.x}%`,
    top: `${mark.y}%`
  }} aria-hidden="true">
              {mark.n}
            </span>)}
        </div>
      </div>
      {caption && <figcaption className="pl-shot__caption">{caption}</figcaption>}
    </figure>;
};

Decide what each detected form does with its data, then work every submission it produces from a live inbox.

<div className="pl-availability">
  <div className="pl-availability__row">
    <div className="pl-availability__label">Where</div>
    <div className="pl-availability__value"><span className="pl-path">Integrations<span className="pl-path__sep">→</span>Integrations<span className="pl-path__sep">→</span>Web Forms</span></div>
  </div>

  <div className="pl-availability__row">
    <div className="pl-availability__label">Your role needs</div>
    <div className="pl-availability__value">Read access to Web Forms <code>read-web-forms</code>. Admin, Member and Viewer have it by default.</div>
  </div>

  <div className="pl-availability__row">
    <div className="pl-availability__label">To create or change</div>
    <div className="pl-availability__value"><code>create-web-forms</code> to add one, <code>update-web-forms</code> to change one, on top of the permission above.</div>
  </div>

  <div className="pl-availability__note">If you cannot find this in your sidebar, your workspace may have a custom menu configuration. Contact support and we will check it for you.</div>
</div>

## Before you begin

* A form source with at least one detected form. If you don't have one yet, [connect the forms on your website](/en/finding-leads/web-forms-connect) first, then open it and stay on the **Forms** tab, the one you land on.

## Steps

<Steps>
  <Step title="Track or ignore what's been detected">
    Detected forms are grouped by what they do with their data. **Tracking** is always on screen, with a line telling you when nothing is tracking yet. **Discovered — needs review** and a collapsed **Ignored** section appear only once something is in them. Each row shows its name, or an automatic one built from its page path (Form on /contact, say), a chip for whether it arrived through the page **Snippet** or a direct **Endpoint** post, and how many fields it has. A tracking row with no field mapped to Email also carries a **No email mapped** chip.

    Only a **Discovered** row gets quick **Track** and **Ignore** buttons; every row, whatever its group, also has **Map fields** (1), which is where you rename it too. Track it once you're happy with how it's mapped, ignore it so its submissions never create leads on their own, or leave it in Discovered to decide later. Ignoring does not turn the form off: its submissions still arrive and park in the review inbox, like any form that is not tracking. The **Forms** tab's own badge counts only what's still Discovered, so it clears once everything has been triaged.

    <Screenshot id="finding-leads/web-forms-mapping-and-submissions--definitions" url="/web-forms/12" alt="The Forms tab with one row already Tracking, showing a Snippet chip and a field count, and one row still Discovered with Track, Ignore and Map fields buttons" caption="The Tracking group is always there. Discovered and Ignored show up only when something is in them." marks={[{ n: 1, x: 84, y: 62 }]} />
  </Step>

  <Step title="Map its fields to lead attributes">
    Choose **Map fields** on any row. The dialog carries a **Form name** box, a **Status** select and a table of every field the app detected next to the lead attribute it can hold.

    <Screenshot id="finding-leads/web-forms-mapping-and-submissions--mapping-editor" url="/web-forms/12" alt="The Map fields dialog: a table of three detected fields, each next to a select already showing a guessed lead attribute, an auto-matched count chip and a mapped-of-total counter above the table" caption="Every field here matched on its own; override any of them and the counters update immediately." marks={[{ n: 1, x: 68, y: 14 }, { n: 2, x: 90, y: 14 }]} />

    A form with nothing mapped yet opens pre-filled with the app's own guesses, in this order: the field's autocomplete attribute, then its input type, then its name or label, recognizing English and Spanish wording alike (correo, teléfono, empresa and the like), with a plain text area falling back to Message. A form that already has a mapping opens on what was saved, and nothing is guessed again. A chip (1) above the table counts how many of the guesses you kept, and the line beside it (2) counts how many fields are mapped out of the total.

    **Email** is the only required attribute, and each attribute belongs to one field at a time: assign it and it greys out in every other field's list until you clear it there. Leave a field unassigned and it stays **Keep as raw data**, still shown on a submission but not filling anything in. With no field mapped to Email at all, a warning sits above the table. Do not rely on those submissions becoming leads: the only thing left is a fallback that reads an email-looking key straight out of the payload, and whatever it misses waits in the review inbox.

    **Save** writes the name, the status and the mapping together, even if you only meant to change one of them.
  </Step>

  <Step title="Switch to the submissions inbox">
    Choose the **Submissions** tab. Five chips (1) filter what you see: **All**, **In review**, **Lead created**, **Duplicate** and **Spam**. **Processing**, **Processed**, **Discarded** and **Error** get no chip of their own, so **All** is the only place they show.

    Each row shows the contact the app resolved (falling back to an email- or name-looking key in the raw payload when the mapping did not produce one), which form it came from, the page it was submitted on, its location, when it arrived, and its status. The table keeps checking for new activity on its own while you're on this tab, and stops the moment you leave it.

    Choose any row to open it.

    <Screenshot id="finding-leads/web-forms-mapping-and-submissions--inbox" url="/web-forms/12?tab=submissions" alt="The Submissions tab: filter chips for All, In review, Lead created, Duplicate and Spam above a table with rows spanning Lead created, Processed, In review, Duplicate, Spam, Processing and Error statuses" caption="All is the default filter, so every status shows up together until you narrow it." marks={[{ n: 1, x: 8, y: 12 }]} />
  </Step>

  <Step title="Open a submission and decide what happens to it">
    The drawer opens with a header (1) tinted to match the submission's status, carrying the form's name, the status chip and when it arrived. Where the app stopped short of creating a lead, a line inside that header explains why: the form wasn't tracking yet when the submission arrived, no email could be resolved from it, the address wasn't valid, a lead with that email already exists, the source was inactive at the time, or one of a few other reasons.

    Below that: the contact it resolved, then a **Mapped fields** section listing each mapped value next to its lead attribute (or saying plainly that nothing was mapped), the full **Raw payload** the form actually sent, and a **Metadata** section for whatever the app captured on its own, none of it needing a field on your form: location, UTM and click-id parameters when present, the page URL, the referrer, the IP address and the user agent.

    A submission still **In review**, **Processing** or **Error** gets two actions at the bottom (2). **Approve & create lead** runs it through the pipeline again with the tracking and auto-create gates lifted, so a form you have not tracked yet stops being a reason to hold it. It still needs an email it can use: with none in the mapping or the payload it refuses and says so. Everything after that gate still applies, so an approved submission can land on **Duplicate** or **Spam** rather than **Lead created**. **Discard** marks it done without a lead. Either way the page's own counters refresh right away. Once a submission has finished with a lead attached, that same spot becomes a single **View lead** button that takes you straight to it, including on a **Duplicate**, which is linked to the lead it matched.

    <Screenshot id="finding-leads/web-forms-mapping-and-submissions--drawer" url="/web-forms/12?tab=submissions" alt="The submission drawer open on an In review row: a status-tinted header, the resolved contact, a Mapped fields section reading No fields were mapped for this submission, the raw payload, a Metadata section with Location, Page and Device, and Approve & create lead and Discard buttons at the bottom" caption="Nothing was mapped on this one, so the section says so. The location, page and device came in without a field on the form." marks={[{ n: 1, x: 18, y: 10 }, { n: 2, x: 30, y: 92 }]} />
  </Step>
</Steps>

## What happens next

<Check>
  A submission from a tracked form with Email mapped, on a source that still has **Auto-create leads** switched on, moves through on its own and lands with a **Lead created** status, no click required. It lands on **Duplicate** instead when a lead already holds that address, and on **Spam** when the address is on your own domain or the message is stuffed with links. One from a form that's still Discovered, or missing an Email match, arrives **In review** and stays there until you map the form or approve the submission by hand.

  New forms keep appearing under **Discovered** by themselves the first time your snippet or endpoint reports one the app hasn't seen before, so you don't have to go looking for them. The list refreshes while you sit on the **Forms** tab.
</Check>

## Troubleshooting

<AccordionGroup>
  <Accordion title="A submission is stuck In review">
    Open it. The line at the top of the drawer names the exact cause when the app has one: no email it could resolve, an address that isn't valid, a form that wasn't tracking yet when the submission arrived, or **Auto-create leads** switched off on the source. Fix what it names and later submissions go through on their own. For the one in front of you, **Approve & create lead** lifts the tracking and auto-create gates by hand. It cannot invent an address: with no valid email in the mapping or the payload it refuses and tells you to map an email field first.
  </Accordion>

  <Accordion title="I discarded or approved a submission and can't find it again">
    Discarding sets it to **Discarded**, and none of the five chips select that. Switch to **All**, where **Processed**, **Discarded**, **Processing** and **Error** rows all sit. An approved submission lands on whatever the pipeline decided, so look under **Lead created**, **Duplicate** or **Spam**.
  </Accordion>

  <Accordion title="An attribute is greyed out in a field's list">
    It's already assigned to another field, and an attribute belongs to one field at a time. Open that field, set it back to **Keep as raw data**, and the attribute becomes selectable everywhere else.
  </Accordion>
</AccordionGroup>

## Related

<CardGroup cols={2}>
  <Card title="Connect the forms on your website" icon="plug" href="/en/finding-leads/web-forms-connect">
    Scan your site, map the fields and create the form source these two tabs belong to.
  </Card>

  <Card title="Install methods: JavaScript snippet or direct endpoint" icon="code" href="/en/finding-leads/web-forms-install-methods">
    The snippet and the direct endpoint, the platform guides, and the fields each one accepts.
  </Card>

  <Card title="Working the Prospects list" icon="users" href="/en/leads/prospects-list">
    Where a submission's lead ends up once one is created.
  </Card>
</CardGroup>
