---
title: "Bringing people into an Outreach custom"
description: "Send people into an Outreach custom from another tool, or import a list you already have."
slug: "en/customs/people/bring-people-in"
url: "https://docs.custom.one/en/customs/people/bring-people-in/"
capability: "lead-intake"
published_at: "2026-10-13T07:11:21.729Z"
---
An Outreach custom has no quiz. You bring the people in yourself — from your
CRM, your ads, a form on your site, or a spreadsheet you already have — and each
one gets their own video and page. They all land in **Leads**.

:::note[Using a Quiz custom?]
A Quiz custom fills from its quiz: everyone who answers it appears in **Leads**
on their own, so there is nothing to connect and this page isn't for you.
Webhooks and imports are how an Outreach custom fills.
:::

## Where people come in

Open **Leads**. Everything starts from **Add people**, which offers four ways in:

| Option | What it does |
|---|---|
| **Upload a CSV** | import a file you already have |
| **Paste a list** | paste emails or a spreadsheet range |
| **Add one person** | type one person's details by hand |
| **Connect an app** | send people in from another tool, by webhook |

The same four show on an empty table. The **Connections** tab lists everything
connected to this custom — webhooks and past imports — with **Import a file** and
**Connect an app** at the top.

## Everyone arrives waiting for a video

However someone gets in, they arrive without a video. Nothing is made until you
ask, because making a video spends one from your plan.

The cards above the table sort people by where they are:

| View | Who is in it |
|---|---|
| **Received** | everyone who arrived, from any source |
| **To generate** | waiting for a video |
| **Generating** | their video is being made |
| **Ready** | video done |
| **Failed** | something went wrong — open the status to see why |
| **Watched** | started their video at least once |

While people are waiting, a bar above the table says how many, and how many
minutes of video are left on your plan. Press **Generate all** there, or select
the people you want and press **Generate**. A waiting person's own row also has a
**Generate** button.

:::note[You can collect people before your custom is finished]
Generating videos needs the rest of it ready — a result page, your clips
recorded, a destination for your landing page — and the custom published.
Collecting people needs none of that, so you can gather people while you're still
building. If you press Generate before the custom is published, you're shown
what's missing, each item takes you there, and once everything is set you can
**Publish & generate** in one go.
:::

## Bringing people in from another tool

An inbound webhook is a URL. You give it to another tool, that tool sends people
to it, and they appear in **Leads**. Nothing to install, no API key to create.

1. In **Leads**, open **Add people**, then **Connect an app**, and pick
   **Webhook**.
2. Copy the **Ingest URL**.
3. Paste it into whatever is sending you people — Make, Zapier, n8n, your form
   builder, your CRM. Anywhere that asks for a webhook or POST URL.
4. Send one test from that tool.
5. Come back and open the **Connections** tab. Your test will be in
   **Recent requests**.

:::caution[Treat the URL like a password]
The URL is the credential — the same way Zapier, Make and Slack webhooks work.
Anyone who has it can send people into this custom, so don't post it publicly.
If it leaks, use **Generate a new URL**: the old one stops working immediately.
:::

### Matching their fields to yours

Send one person per request, as a flat JSON object. Anything recognised fills a
field; anything else is listed in **Recent requests** so you can map it.

Three rules:

- Use the field's name as it appears in your table — or the sender's own name,
  and map it in **Match your fields**.
- Capitals, spaces, dashes and underscores don't matter.
- If a name matches nothing, the value is **reported rather than dropped**.
  Nothing is lost silently.

### When an answer doesn't match

If they send `hot_lead` and your answer is "Hot lead", that matches on its own.
If they send a genuinely different word, you're asked whether to match it to an
answer you already have, or add it as a new one.

:::tip[Prefer matching over adding]
Adding a new answer each time leaves "Hot lead", "hot_lead" and "Prospect chaud"
as three separate answers, which splits your filters and your reporting. Once
taught, the other name works everywhere — every webhook and every CSV import.
:::

### Checking what arrived

**Recent requests**, in the **Connections** tab, lists what's been sent,
successes and failures. Click one to jump to the person it created, or to see
exactly what the other tool sent, word for word. From a person's row menu,
**View received JSON** shows the same thing. Deliveries are kept for 30 days.

### If the same person arrives twice

The same information arriving twice within a few minutes is treated as one
person. Make and Zapier retry automatically when they don't get a quick answer,
and this stops a retry becoming a duplicate person and a duplicate video. The
repeat is noted in **Recent requests**, so it's never silent.

### Pausing, replacing and removing

A webhook's controls are in its **Settings**, from its row in **Connections**.

| Control | What it does |
|---|---|
| **Pause** | stops deliveries; your URL keeps working |
| **Generate a new URL** | old URL stops immediately — for leaks, not pausing |
| **Remove this webhook** | only for a webhook that was never used |

You can have several webhooks on one custom — one per tool, each with its own
URL, field matching and pause switch. Name them ("Meta lead ads", "Make — CRM"):
the name is what shows in your table as each person's origin.

## Importing a list you already have

1. In **Leads**, open **Add people**, then **Upload a CSV** — or **Paste a list**
   to paste the rows straight in.
2. Check the matching, then import.

Your headers are matched where they're recognised. For anything else, point the
column at an existing field, let it create a new one, or skip it. If a column
feeds a multiple-choice field and some values don't match, you're told which ones
before importing — with the same choice as a webhook: match it, or add it.

Column types are guessed from the values. Dates become dates, links become links,
a repeated set of short labels becomes a multiple-choice answer, and a column of
plain numbers becomes a **Number** field — a price, a count, an age. Numbers
written with formatting (`$1,200`, `7,5`, `10%`) stay as text, so no value is
lost on the way in.

Several answers in one cell can be separated with a comma, semicolon or pipe —
`Design, Copywriting` reads as two answers. For yes/no columns, `yes` / `y` /
`true` / `1` / `on` read as yes; `no` / `n` / `false` / `0` / `off` read as no.

:::note[Imported people wait too]
People from an import arrive waiting, exactly like webhook people, and no videos
are made until you ask.
:::

## Making videos automatically

By default people arrive waiting and you generate when you choose. In a webhook's
settings, turn on **Auto-submit incoming leads** and a video is made as soon as
someone arrives through it. Use it once you're happy with your setup — it spends
from your plan without asking.

Auto-submit is paced: a busy source makes videos steadily rather than all at
once, so a burst of arrivals can't consume your whole plan in minutes. Everyone
still arrives immediately — only the video-making is spread out.

## When something doesn't work

**Someone arrived but their row is empty.** Their tool's field names didn't match
any of yours and no matching was set up yet. Open **Match your fields**, use
**Detect from last request**, map them, then send another test.

**I fixed my matching and re-sent, but nothing changed.** Send a *new* test rather
than the same one — identical information sent twice in quick succession is
treated as one person.

**Recent requests shows a rejection.** Click it. The usual causes are a wrong or
old URL (if you regenerated it), or a tool sending something other than JSON.
Viewing the received data shows what actually arrived.

**Nothing arrives at all.** Check the webhook isn't paused, and that the URL was
pasted in full — including the long code at the end.