# Importing and exporting your list > Bring an existing list in from CSV without losing the referral graph, and export yours at any time. Your data is never locked in. Source: https://getlaunchlist.com/help/docs/audience/importing --- Bringing a list in and taking one out are both self-serve. There is no support ticket and no lock-in. ## Importing from CSV Open **Audience → Signups** and press **Import**. ![The Signups page header with the Import and Export buttons.](https://app.getlaunchlist.com/images/docs/audience/importing/01-import-button.webp "Import and Export sit in the Signups header") ### 1. Upload Any CSV with a header row, up to **50 MB** or **250,000 rows** per file. Split anything larger and import the pieces one at a time. Excel exports work, and so does anything that can save a CSV. There is a template CSV on the upload step if you would rather start from our column names than map yours. ![The Import signups panel on its upload step, listing what the file needs, with the Choose a CSV file button.](https://app.getlaunchlist.com/images/docs/audience/importing/02-upload-step.webp "Upload a CSV with a header row") If the file came from **Waitlister, GetWaitlist, Prefinery, KickoffLabs or Viral Loops**, it is recognized on sight and the columns are mapped for you. Everything else maps by hand, which takes about a minute. ### 2. Map your columns You match your CSV's columns to LaunchList fields. The importer guesses the obvious ones (`email`, `Email Address`, `e-mail`) and you confirm or correct. ![The column mapping step with each CSV column matched to a LaunchList field.](https://app.getlaunchlist.com/images/docs/audience/importing/03-map-columns.webp "Match your columns to LaunchList fields") Anything that does not match a field of ours is **not** dropped. It is kept as a **custom field** on the contact, so you can segment on it later, and there is no reason to strip your CSV down before importing. Set a column to **Don't import** if you genuinely want it gone. What you can map to: | Field | What it is | | ---------------------- | ----------------------------------------------------------------------------------------------------- | | **Email** or **Phone** | The identity we deduplicate on | | **Name** | Their name | | **Joined date** | When they originally signed up. This is what keeps queue order | | **Referred by** | Who referred them, as an email or a referral code from this file | | **Referral code** | Their existing share code, so old links keep working | | **Points** | Their leaderboard points, which is what decides position | | **Stage** | Their funnel stage. The invited stage cannot be imported, and unknown values land in your first stage | | **Country** | Two-letter ISO code | | **Subscription** | Whether they agreed to hear from you: subscribed, unconfirmed or unsubscribed. See below | | **Custom field** | Anything else, kept on the contact | The three worth setting deliberately are **Joined date**, **Referred by** and **Referral code**, in that order. They are what carry your existing queue across intact. > [!NOTE] Your own IDs come in through the API, not the CSV > Contacts can carry your system's `external_id`, but it is set through the > [REST API](/help/docs/api/contacts-create) rather than mapped from a file. A CSV column holding > your IDs still imports fine as a custom field. ### 3. Choose what happens to duplicates, then run Before it starts you answer one question, **Already in your audience?**: whether a row matching somebody you already have is skipped (**Skip the row**, the default, leaving your existing contact untouched) or updates them with what is in the file (**Update the contact**). If you choose to update, one more option appears: **Also update their subscription from this file**. It is off unless you tick it, because a file should not quietly change who you email. With it on, a row that says subscribed subscribes a person who was not subscribed (or whom you unsubscribed), and a row that says unsubscribed unsubscribes them. A row that says unconfirmed changes nothing, and a blank cell changes nothing. It never undoes someone who unsubscribed themselves or marked an email as spam, and never touches a bounced or blocked contact. Those are counted on the summary as left as they were. **People you removed come back.** If a row matches someone you removed from your audience, they are put back, with their place in the queue and the referral credit their removal took away, and the summary counts them as **Removed signups put back**. Someone you erased, or blocked as a fake signup, is not. Then it runs in the background. Large lists keep importing while you close the tab, and the counters move as it goes: **Imported**, **Updated**, **Skipped (already existed)** and **Rejected (invalid)**, and the summary adds **Removed signups put back**. When it finishes you get a summary, by email too if you closed the tab, and any skipped or rejected rows are downloadable as their own file so you can see exactly what did not make it and why. ### The Subscription column If your file says who agreed to hear from you, map that column to **Subscription** and each person arrives the way their row says: | The row says | They arrive as | | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------- | | **subscribed** (also yes, true, 1, opted in, confirmed, verified, active) | Subscribed, recorded as agreed by import, with your name on it | | **unconfirmed** (also no, false, 0, pending, unverified, awaiting) | Not subscribed. No email is sent, and they stay that way until you subscribe them | | **unsubscribed** (also opted out, opt out, unsub, revoked, do not email) | Unsubscribed, and kept off every broadcast and automation | | Blank | Whatever you chose for the whole file ("They asked to hear from me") | A plain "no" or "false" means unconfirmed, not unsubscribed: it says they are not subscribed, not that they asked to leave. A value that is none of these rejects the row, with the reason in the report, rather than guessing. Waitlister's **Verified** column is mapped to this for you. ## Preserving the referral graph If your existing waitlist had referrals, map the referrer column and the relationships come across. People keep who referred them, and their referral counts stay correct. > [!WARNING] Map the joined date, or everyone lands at the back > Positions are ordered by signup time. With no **Joined date** column mapped, every imported contact > is treated as having joined at import time, which puts your earliest supporters behind your newest. > This is the one mapping that is genuinely hard to undo. ## What happens to imported contacts Imported contacts are added to your audience without going through a signup form, with three deliberate differences: - **No verification email is sent.** Importing does not spam the people you bring in. - **You say whether they asked to hear from you.** The import asks "Did these people ask to hear from you?" and nothing is chosen for you. **They asked to hear from me** adds them as subscribed, so your next broadcast can reach them, unless the file's own **Subscription** column says otherwise for a row. **I'm not sure** adds them as **Not subscribed**: they get no broadcasts or automations, and no email is sent, until you subscribe them from **Audience** with **Mark as subscribed**. Choose it if you are not certain the list opted in. - **Their trust verdict starts at Unknown**, and nothing about the import claims they proved they own the address. That is the difference between being subscribed and having proof, and we never manufacture the second one on somebody's behalf. A broadcast set to **Verified email** leaves imported people out; choose **Verified or not** to include them. Deduplication still applies, so a list that overlaps your existing one cannot create doubles. Whether the overlap is left alone or refreshed is the choice you made in step 3. > [!NOTE] Import consent, not just addresses > Only import people who agreed to hear from you. A list bought or scraped will bounce, complain, > and damage the sending domain you need for your actual launch. If too much of an imported list > turns out to be undeliverable, we will tell you rather than send to it. To see which addresses > are real before you send, [check them with credits](/help/docs/account/credits). ## Importing from code The CSV importer is the same pipeline `POST /v1/imports` and the MCP `import_contacts` tool run: no verification email, no welcome email, no automation enrollment, contacts arrive subscribed or not subscribed depending on what you tell it about the list. It accepts up to 10,000 contacts a call (1,000 over MCP) rather than a file, and it can tag every row it creates or updates as it goes. See [Silent bulk import](/help/docs/api/imports) for the request shape. ## Exporting Open **Audience → Signups** and press **Export**. Exports are **unlimited and never paywalled**. Your data is yours. ![The Export panel of the Signups page.](https://app.getlaunchlist.com/images/docs/audience/importing/05-export-panel.webp "Export what you are looking at") The export respects whatever you are looking at, so filtering to a segment, a stage, or a trust tier and then exporting gives you exactly that subset. It runs in the background and arrives as a **download link valid for 24 hours**. Large exports do not block the page or time out. The file includes identity, status, stage, trust tier, referral code and count, who referred them, signup date, captured custom fields, and source. Deliverability is a column too, filled in only for the contacts whose verdict you have revealed. ## Deleting Removing contacts frees your **contact count immediately**, so anyone hidden past your plan size reappears from that moment. There is no charge for extra contacts, so there is nothing to settle afterward. Removed people are not gone. Open **Audience → Signups** and the **Removed** view lists them, and **Put back** returns any you choose, or everyone in the view, however many. Importing a file that names them brings them back too. Erased and blocked people cannot be restored. For a GDPR erasure request, tick **Also erase their personal data** in the Remove dialog rather than removing alone. Remove takes someone out of your audience; erase destroys their personal data while keeping the aggregate counts your reporting depends on. ## Next - [Keeping fake signups out](/help/docs/audience/spam-and-trust): clean your audience before you import or export - [The REST API](/help/docs/api/contacts-create): for continuous sync rather than a one-off file ## Common questions ### Can I import an existing waitlist into LaunchList? Yes, from a CSV of up to 50 MB or 250,000 rows. You map your columns to LaunchList fields, choose whether duplicates are skipped or updated, and it runs in the background, preserving original signup dates and referral relationships. Exports from Waitlister, GetWaitlist, Prefinery, KickoffLabs and Viral Loops are recognized and mapped for you. ### Will importing a list break my referral positions? No, as long as your CSV carries the original signup dates and you map that column to Joined date. Positions are ordered by signup time, so imported people slot into the right places rather than all landing at the end. ### Can I export my LaunchList contacts? Yes, at any time and with no limits. Exports run in the background and arrive as a download link valid for 24 hours. There is no lock-in.