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

# Import companies from a CSV

> The five-step company import, its batch schedule, the credits it will spend and the Company Imports monitor.

export const UiPath = ({children}) => {
  const parts = String(children).split(/\s*(?:→|>)\s*/).filter(Boolean);
  return <span className="pl-path">
      {parts.map((part, index) => <span key={`${index}-${part}`}>
          {index > 0 && <span className="pl-path__sep">→</span>}
          {part}
        </span>)}
    </span>;
};

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

By the end of this page you've imported a list of companies from a CSV, and you know where to watch the import while it runs.

<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">Leads<span className="pl-path__sep">→</span>Companies</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 Companies <code>read-lead-companies</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-lead-companies</code> to add one, <code>update-lead-companies</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

* Companies, tags and imports all belong to the workspace you're viewing. Switch first if the list you want to bring in belongs somewhere else.
* Starting an import needs `create-imports`, on top of the `read-lead-companies` the block above covers. Without it, **Import Companies** doesn't appear on the Companies toolbar at all.
* The Configure step won't let you continue until you pick at least one tag. You can make one there and then with **Create new tag** if your role has `create-tags`; otherwise the workspace needs a tag already.
* Pausing, resuming or retrying an import needs `update-imports`. Without it those controls are not drawn at all.

## Steps

<Steps>
  <Step title="Open the Import Companies wizard">
    Go to <UiPath>Leads → Companies</UiPath>. The toolbar controls are icon buttons; the one for
    **Import Companies** sits between the export control and **Add Company**, and names itself when you
    hover it. On a workspace with no companies yet, the same action sits next to **Add Company** on the
    empty-state screen instead.

    The wizard opens on a five-step stepper: **Upload**, **Map**, **Configure**, **Review** and **Import**.
  </Step>

  <Step title="Upload your CSV and check the file report">
    Drop a file on the dropzone or click it to browse; **CSV files only**. No file to hand?
    **Download Template** gives you a CSV with every column the wizard understands, the required
    one marked with an asterisk.

    The file is read in your browser before anything reaches the server, and the report shows what the
    parser found: rows detected, and, when there are any, empty lines skipped, malformed rows, and rows
    recovered after a stray quote character had merged two lines into one. If the first row looks like it
    could be data rather than headers, the report asks outright and offers a **My file has no header row**
    toggle. If a large enough share of the file couldn't be read, the import is blocked rather than
    silently dropping rows, with the exact counts on screen and a suggestion to re-export the file as CSV
    (UTF-8).

    The same check enforces the row cap: a file with more than 3000 rows, counted against both its raw line
    count and its parsed row count so a parsing quirk can't sneak an oversized file past the limit, is
    rejected outright with the exact count found. The continue button names how many rows it's about to
    carry forward, and stays off while the file is blocked for any of those reasons.

    <Screenshot id="leads/import-companies-csv--upload" url="/leads/companies" alt="The file check screen after a CSV upload, its rows pill and check list, with a red alert saying the file's company count exceeds the maximum allowed" caption="The exact row count found and the exact cap are both on screen, rather than an oversized file being truncated quietly." />
  </Step>

  <Step title="Map your columns to the right fields">
    Every column in your file gets a dropdown of the fields the wizard understands, already pre-filled where
    the header text matched one. A column with no values in any row is left on **Skip** even when its header
    matches, so map that one by hand if you want it. Only **Website URL** is required; everything else,
    Company Name, Description, Industry, AI Instructions, up to three emails and three phone numbers,
    address fields, four social links and a Tag column, is optional. A tip on this screen explains why
    Company Name isn't required: it is extracted from the website when you don't provide one.

    If the column you mapped to Website URL is empty on some rows, a warning names how many rows that is.
    Those rows are skipped, not blank-imported. **Continue** stays off until Website URL is mapped to
    something.
  </Step>

  <Step title="Configure decision-maker search and tags">
    **Find Decision-Makers** is on by default. With it on, a **Leads per Company** slider (1 to 10, starting
    at 2) sets how many contacts to look for at each company, and an optional **AI Instructions** field lets
    you steer who counts as a decision-maker, for example toward C-level executives or VPs of Sales.

    **Assign Tags** is required regardless of the toggle above: pick at least one, or **Continue** stays off.
  </Step>

  <Step title="Review the plan and start the import">
    The review screen totals what's about to happen: how many companies (after removing rows with no
    website and repeated websites, keeping the first occurrence of each), an estimated lead count if Find
    Decision-Makers is on, and the tags you chose. A preview shows up to the first five mapped rows.

    A panel titled **How this import will run** gives the schedule: a file that needs more than one batch
    runs in batches of up to 100 companies, one dispatched every 2 hours, the first one right away, with an
    estimated finish date and time. A file small enough for a single batch says so instead, and notes that
    the company list is usually ready within minutes while decision-makers keep arriving afterwards.

    If Find Decision-Makers is on, a credits warning names how many companies will be processed and the
    ceiling on how many leads it will look for, and says credits will be consumed. See
    [What consumes credits](/en/billing/what-consumes-credits).

    Choose **Start Import**.

    <Screenshot id="leads/import-companies-csv--configure" url="/leads/companies" alt="The review step's How this import will run panel showing the batch count and estimated finish time, above the credits warning naming how many companies and leads will be processed" caption="The batch schedule and the credit cost sit on the same screen, right before you commit to either." />
  </Step>

  <Step title="Confirm if the file is flagged as a duplicate">
    Clicking **Start Import** first checks the file's fingerprint against your workspace's recent imports.
    If it matches one, a dialog names that earlier import, how long ago it ran, and its row and company
    counts, instead of silently starting a second copy. Choose **Cancel**, **View that import** to open the
    imports list, or **Import anyway** to proceed regardless.

    <Screenshot id="leads/import-companies-csv--duplicate-guard" url="/leads/companies" alt="The This file was already imported dialog, naming the earlier import, when it ran, and its row and company counts, with Cancel, View that import and Import anyway buttons" caption="A representative example: the match is simulated, but the check itself runs on the file's content, so renaming a file you already imported doesn't get past it." />
  </Step>

  <Step title="Wait for the import to queue">
    A short upload screen runs the file through, then confirms **Import queued**, not finished: the import
    keeps running in the background whether or not you stay on this screen. It repeats the company and lead
    counts from Review, then offers **View Imports** to jump straight to the monitor, or **Done** to close
    the wizard.
  </Step>
</Steps>

## What happens next

<Check>
  **Done** or **View Imports** closes the wizard and a toast confirms the import is queued. The import keeps
  running on its own, and companies appear in the Companies list as each batch completes.
</Check>

Open **View Imports** from the Companies toolbar any time to see the workspace's most recent company
imports, newest first. The list polls every 10 seconds while anything is still active, and each row carries
a phase: **Queued** first, then a batch counter naming which batch is running out of how many, then
**Analyzing companies** or, with Find Decision-Makers on, **Finding decision-makers**, settling into
**Completed**, **Completed with issues**, **Paused**, **Out of credits** or **Failed** once it stops.

<Screenshot id="leads/import-companies-csv--imports-dialog" url="/leads/companies" alt="The Company Imports dialog listing two imports: one mid-run showing its current batch progress, and one marked Completed" caption="A representative example, so both states are visible at once: the workspace's company imports land in this one list, refreshing on its own while anything is still running." />

Click a row to open its details drawer. **Overview**, the default tab, shows a progress ring and the
outcome recorded for every row: created, already in workspace, no website, blocked domain and row errors
under CSV rows; analyzed, unreachable websites, invalid websites and discarded under Companies; and, with
Find Decision-Makers on, leads found, with verified email, email not found and no decision-makers found
under Decision-makers.

Two more tabs appear once the import has been split into batches. **Batches** lists every batch's own
status, result counts and schedule, and lets you retry a single failed batch without touching the rest.
**Companies** lists the import's companies one by one, filterable by batch and by status, each with a
reason chip (No website, Duplicate, Invalid website, Blocked domain, Site unreachable, No decision-makers,
Email not found, Processing error) when something didn't go through.

<Screenshot id="leads/import-companies-csv--import-details" url="/leads/companies" alt="The Import Details drawer's Overview tab: a progress ring, an estimated-finish banner, and counters for created, already-in-workspace, no-website and blocked-domain rows" caption="A representative example, mid-run so every counter has a number in it: every row is accounted for as created, skipped or failed, never just missing." />

## Troubleshooting

<AccordionGroup>
  <Accordion title="My file is rejected before anything imports">
    Four checks can stop a file before anything is imported. A file too large to analyze in the browser is
    refused on sight, before any report is drawn; split it into smaller files. A file the parser finds no
    data rows in is refused the same way. If the file's raw line count and its parsed row count then
    disagree by a wide margin, the import is blocked outright rather than silently losing rows, because a
    stray quote character can otherwise collapse thousands of rows into a handful with no warning:
    re-export the file as CSV (UTF-8) from your spreadsheet tool, remove stray quote characters, and try
    again. Separately, a file with more than 3000 rows is rejected on the row cap alone, counted against
    both the raw and parsed line counts; split it and import the pieces one at a time.
  </Accordion>

  <Accordion title="A batch says it's overdue or running behind schedule">
    Batches run on their own schedule, hours apart. A batch whose slot has already passed reads Overdue on
    the **Batches** tab. Once the import is more than half an hour past its next batch's slot, the Overview
    tab replaces its countdown with a line saying the next batch is running behind schedule and will be
    picked up automatically, and the phase pill in the imports list grows an amber dot carrying the same
    explanation. No action is needed.
  </Accordion>

  <Accordion title="The import is Paused or Out of credits and nothing is happening">
    Paused only happens when someone stops the import deliberately. Out of credits is the import stopping
    itself, when the credit check fails part-way through the run. Either way, resuming needs
    `update-imports`; if the control isn't there, ask someone who has that permission. Resuming re-checks
    credits before it restarts anything, so an Out of credits import needs the balance topped up first or
    the resume is refused. See [What consumes credits](/en/billing/what-consumes-credits).
  </Accordion>
</AccordionGroup>

## Related

<CardGroup cols={2}>
  <Card title="Companies list, match score and discards" icon="building-2" href="/en/leads/companies-and-match-score">
    Where these companies land, what the match score means, and how to discard one.
  </Card>

  <Card title="Add leads manually or import a CSV" icon="file-spreadsheet" href="/en/leads/add-leads-and-import-csv">
    The sibling wizard for a list of people instead of companies.
  </Card>

  <Card title="What consumes credits" icon="coins" href="/en/billing/what-consumes-credits">
    Why finding decision-makers costs credits, and what doesn't.
  </Card>

  <Card title="Leads troubleshooting" icon="life-buoy" href="/en/leads/troubleshooting">
    Symptom-first answers for stalled imports and lists that won't update.
  </Card>
</CardGroup>
