How do I shorten links in bulk from a spreadsheet or CSV?

Steps verified on September 24, 2026

Open Links in the sidebar and choose Import links. Drop in a CSV file or paste a list, check how Flyn read the columns, preview every link, then import. Anyone can upload a file and see the full preview for free; running the import needs Pro, Lifetime or Team. On a free account you can also shorten up to 10 pasted URLs at a time with the free Bulk URL Shortener.

The same importer reads exports from other link shorteners, such as Bitly, Rebrandly, Short.io and Dub. Migrate to Flyn has the export steps for each tool.

Step 1: open Import links

Click Links in the sidebar. On a free account, click the Import links button at the top of the Links page. On a paid plan, click the three-dots button at the top right of the Links page and choose Import links in the menu that opens. Both take you to the import page. Nothing is created until the import step.

Close-up of the Links item in the sidebar

The Links page on a paid plan: the three-dots button (1) opens a menu with Import links (2)

Close-up of the three-dots menu with Import links

Step 2: add your file or paste your links

The first step, Source, has a drop zone that reads Drop your export here. Drag a .csv, .tsv or .txt file of up to 20 MB onto it, or click Choose a file. You can also paste into the box under Or paste your links: one link per line works, and so does text with a header row copied from a spreadsheet. If you are coming from another tool, How do I get my links out of my current tool? shows the export steps for it. Flyn reads the file in your browser, and nothing is created until you import.

The Source step: Choose a file (1) in the drop zone, or paste your links into the box (2)

Close-up of the drop zone and the paste box

Step 3: check how Flyn read the columns

The Review step names the tool the file seems to come from, for example Bitly or Dub, and shows a high, medium or low confidence. A file that matches no known export is read from its contents. Below that, every column is listed with sample values and a menu for what it holds: Destination URL, Old short link, Back-half, Short domain, Title, Tags, Created date (kept in notes), Status (deleted or banned links are skipped) or Do not import. Only the destination column is required. Check that it really holds the long URLs, change any menu that is wrong, pick how tags are separated if the file has tags, then click Preview.

The Review step: the detected tool and its confidence (1), and a mapping menu for each column (2)

Close-up of the detected tool and the column mapping

Step 4: read the preview

The Preview step shows how every row will be created before anything is written:

  • Counts of the links that are ready, the ones that keep working on your own domain, the ones that get a new Flyn link, the rows that need attention and the rows that will be skipped.
  • Match links to your connected domains. Shown when you have added a custom domain. With it on, a row whose old short link is on one of your domains is created on that domain with the same back-half, and counts as keeping working (once the domain is verified in Flyn and its DNS points to Flyn, if it is still pending).
  • New Flyn links go on. The domain for every other row. When you have an active custom domain you can pick it here; otherwise the preview names Flyn's default short domain.
  • Keep the same back-halves where available. With this on, an old link ending in /spring-sale becomes a new link ending in /spring-sale when that back-half is free. With it off, those links get random back-halves. Links matched to your own domain keep their back-half when it is free and Flyn allows it (see the back-half rules below).
  • If a back-half is already taken. Choose once for the whole import: Give that link a random back-half (the default) or Skip that link. Nothing that already exists is overwritten. On your own domain, a link with a random back-half is a new link, so the old one will not keep working.
  • Rows. A table of the first 200 rows with a status for each, and a Show menu to list only the rows that need attention, are skipped, keep working or get a new Flyn link. The counts above it cover the whole file.

To show which back-halves are free, the preview sends only the back-halves, domains and destinations to Flyn and checks them against the links that already exist.

The Preview step: matching your connected domains (1), keeping the same back-halves (2), what to do when a back-half is taken (3), and the Import button (4)

Close-up of the domain, back-half and conflict options

Step 5: import

Click Import followed by the number of links, at the bottom of the preview. On a free account this opens the upgrade options instead. Your file usually stays in that browser tab (a very large file may have to be uploaded again), so after upgrading open Links, then Import links, to pick up where you left off.

On a paid plan, Flyn creates the links 100 at a time and shows a progress bar with the counts so far. Pause and Resume hold and continue the import, and Stop and see results ends it early; both take effect when the batch in progress comes back, and links already created stay. Keep the tab open until the results appear: the import runs from this page, so closing it stops the import partway.

If the import stops at the daily limit for new accounts (an account in its first 7 days), it says so. Import the remaining rows once the 24 hours have passed, using the file of rows that were not imported from the results page.

The Import step: Pause (1) and Stop and see results (2) under the progress bar

Close-up of the progress bar with Pause and Stop and see results

Step 6: read the results and download the report

The Results step counts the links that were created and skipped, explains any that failed, and has Download report (CSV): one line per row of your file, with the columns row, old_short_url, new_short_url, destination, status and reason. The status is created, skipped, failed or not_imported, and the reason says why a row was not created. Row numbers count the header as row 1 and include blank lines, so they match the rows of your spreadsheet. If the import stopped before the end, Download rows not imported gives you a file to import later; do not import the original file again, because a plain URL that got a random back-half would be created twice.

If any links went onto your own domain, Your domains shows the DNS records that point that domain to Flyn, for each domain that is not verified yet. Add them at your DNS provider, then click Verify under Settings, Domains. The old links on that domain keep working once the domain is verified in Flyn and its DNS points to Flyn; until then they still go through your old provider. How do I connect a custom domain to Flyn? has the full DNS steps.

The Results step: Download report (CSV) (1) and the DNS records for your own domain (2)

Close-up of the report button and the Your domains records

What the file can look like

You can start from the flyn-import-template.csv template, a header row and two sample rows. Delete the sample rows before you import: the sample back-half my-link is very likely taken already, and the other row would create a real link to another.com.

url,slug,title,tags
https://example.com/spring-sale,acme-spring-sale,Spring sale landing page,campaign;email
https://example.com/pricing,,Pricing page,web
https://example.com/blog/launch,,Launch post,
  • One column of destinations is all you need. Other columns are optional: the old short link (a full link such as bit.ly/abc or go.yourbrand.com/abc), a back-half, a title, tags and a created date. Common header names from other tools, such as destination, long url, original url, slug, back-half, alias, keyword, slashtag, name, tags and labels, are recognised, and any column can be mapped by hand in the review step.
  • No header row is fine. A plain list of URLs, one per line, imports as destinations.
  • Commas, semicolons or tabs between columns. Files Excel saves with semicolons, tab-separated files and files that start with a sep= line all work. Cells that contain commas, quotes or line breaks are read correctly when the cell is in quotes, which Google Sheets and Excel do for you.
  • .csv, .tsv or .txt up to 20 MB, not .xlsx. Save a workbook as CSV first, or copy its cells and paste them into the Source step. Split a bigger file into smaller ones.
  • Tags can be separated by semicolons, pipes or commas inside the cell; the review step detects which, or you pick it. Each tag is trimmed and cut to 50 characters, and repeated tags are dropped.
  • Titles are cut to 200 characters.
  • Back-halves: letters, numbers, hyphens and underscores, up to 100 characters. A back-half with other characters, such as a slash, or one that matches a word Flyn reserves for its own pages, is not reused: that link gets a random back-half, and the preview says so.
  • A Flyn export is recognised. A file from Export CSV on the Links page reads back its destinations, back-halves, titles and tags. A link on a custom domain you have added to this workspace keeps that domain; any other link goes on the domain chosen in the preview. Clicks, status and notes are not imported: the new link's note names the old link and its created date instead.

What happens to each row

  • Destination. Copied as written. https:// is added when the scheme is missing, so www.example.com/page becomes https://www.example.com/page. A row with no destination, or one that is not a web address, is skipped.
  • Domain and back-half. As in the preview: your own domain with the same back-half when the old short link is on a domain you have added to Flyn, otherwise the domain chosen under New Flyn links go on, with the old back-half when that toggle is on and the back-half is free, or a random one.
  • Title and tags. Taken from the file when it has them.
  • Note. Every new link gets a note saying where it came from. A row with an old short link gets a note like Imported from Bitly: https://bit.ly/abc (created 2024-01-15). Any other row's note ends with its row number: it gives the created date when the file has one, like Imported from Bitly (created 2024-01-15), row 5, and otherwise names the file, or a pasted list, and when you added it, like Imported from links.csv on Sep 24, 2026, 10:30 AM, row 5. The old created date lives only in that note: the link's own created date is the day you import it.
  • Clicks. Not imported. Click history stays with the old tool.
  • Folder. None. New links appear under All Links.
  • Workspace. Links are created in the workspace that is active when you import, the one selected in the workspace switcher in the sidebar, and you are recorded as the creator of each link. In a team workspace, your role has to allow creating links.
  • Safety check. Each destination goes through Flyn's safety checks. A refused row is reported as failed with the reason, for example a destination that points to a private network address. A destination that is itself a Flyn link is refused in the preview. A link that passes can still be disabled shortly afterwards if a follow-up scan of the page finds a problem, see Why is my short link disabled or not working?.
  • Duplicates. A row with the same destination and the same old short link, or the same back-half on the same domain, as an earlier row is skipped as a duplicate. So is a row with neither whose destination, title and tags all match an earlier row; rows to the same page with a different title or tags are kept as separate links. A back-half is used once per domain: a later row asking for the same one gets a random back-half.
  • Links you imported before. A row whose back-half already exists on that domain with the same destination in your account or team is skipped as already imported, and so is a row with a random back-half whose destination and import note match a link you imported before. A row from a plain list of URLs, with no old short link or date, is not recognised when you import the same list again, so that creates those links a second time.
  • Everything else is left at its default. Add an expiry date, password, routing or other settings by opening a link afterwards. The import sends no webhook events, so link.create webhooks do not fire for imported links.

On the free plan

Free accounts see an Import links button on the Links page, and the whole flow up to the import is free: upload, column review and preview. The Import button at the end of the preview opens the upgrade options. Members of a paid team workspace can import through the Team plan.

On a free account, the Bulk URL Shortener is the bulk option. Paste a column of URLs from your sheet, one per line, and it shortens them together. It has its own limits:

  • 10 URLs per batch. Extra lines are skipped. There are no slug, title or tag columns.
  • One batch per day per browser.
  • Links made without signing in last 24 hours, unless you sign up, or sign in, from the same browser before they expire, which moves them into your account, see Why did my free short link expire?. Links made while signed in go straight into your account and count toward the free plan's 25 links a month.

From Google Sheets

Flyn has no Google Sheets add-on. There are two ways to get a sheet of URLs into Flyn:

  1. Import it. Download the sheet as CSV (File, Download, Comma-separated values (.csv), which downloads the tab you have open), or select the cells and copy them, then follow the steps above. Pasted cells work in the Source step without saving a file.
  2. Script it against the API. Apps Script, or any code, can call POST /api/links once per row with an API key sent as Authorization: Bearer followed by the key. No endpoint you can call with an API key takes a list of different URLs, so it is one link per request, and requests are rate limited, so space them out. You create API keys under Settings, API Keys, which needs Pro, Lifetime or Team. The request fields are documented under Links, and the full OpenAPI spec is at /docs/openapi.

For a comparison of the spreadsheet approaches, see Bulk Shorten URLs From a Spreadsheet: CSV vs Formulas.

Many links for one destination

If you need many different short links that all go to the same page, one per ad, pin or partner, you do not need a CSV. The Create many button on the Links page makes 2 to 50 links for a single destination in one step, each with its own click count, on Pro, Lifetime or Team. See Create Many Links for how it works.

If an import fails in a way this page does not explain, email [email protected] with the exact message you saw and the first few rows of your file.

Common questions

Can I import links from a CSV on the free plan?

You can upload a file and preview it for free, but running the import needs Pro, Lifetime or Team. On a free account, Import links on the Links page takes your file through the column review and the full preview, and the Import button at the end opens the upgrade options instead. Your file usually stays in that browser tab (a very large file may have to be uploaded again), so after upgrading you can open Import links again and pick up where you left off. For a small batch without upgrading, paste up to 10 URLs, one per line, into the free Bulk URL Shortener at /bulk-url-shortener. It takes one batch per day per browser. Links made there without signing in expire after 24 hours unless you sign up or sign in from the same browser first.

Can an import put links on my custom domain?

Yes, for rows whose old short link is on that domain. Add the domain under Settings, Domains before you import; it can still be pending, but a paused domain is not used. With Match links to your connected domains switched on in the preview, a row whose old short link, such as go.yourbrand.com/spring, is on a domain you have added is created on that domain with the same back-half, so the old link keeps working once the domain is verified in Flyn and its DNS points to Flyn. Every other row goes to the domain chosen under New Flyn links go on, which can also be one of your active custom domains.

Do my old short links from Bitly or another shortener keep working?

Only links on your own branded domain can. Import them onto that domain in Flyn, then point the domain's DNS to Flyn and click Verify under Settings, Domains. Links on a shortener's shared domain, such as bit.ly, rebrand.ly or dub.sh, belong to that company: they stay there, and the import gives each one a new Flyn link, listed next to the old one in the report. Click history does not transfer, and QR codes printed with another company's domain keep pointing there.

Some rows were skipped or failed. How do I find them?

Click Download report (CSV) on the results page. It has one line per row of your file, with the row number, the old and new short link, the destination, a status (created, skipped, failed or not_imported) and the reason. If the import stopped early, the results page also offers Download rows not imported, a file you can import later. Do not import the original file again: rows that kept their back-half or carry an old short link are skipped as already imported, but a plain URL that got a random back-half would be created a second time.

How do I get the new short links back into my spreadsheet?

Click Download report (CSV) on the results page. Its new_short_url column holds the full short link of every row that was created, next to the row number from your file, so you can paste it back or match it with a lookup on the destination. Export CSV on the Links page still works too, but it lists every link in the workspace, not just this import, and has no column with the full short URL.

Is there a limit on how many rows one file can have?

The importer reads files up to 20 MB and sets no separate row limit: it sends links 100 at a time and shows its progress. Split a bigger file into smaller ones and import them one after another. Two things still limit a very large file. If the import stops at the daily limit for new accounts (an account in its first 7 days), it says so, and the remaining rows can be imported once the 24 hours have passed. The import also runs from the open page, so keep the tab open until the results appear. Closing it stops the import partway, and the links already created stay.

Related articles

Did this answer it? If not, email [email protected] and a human will help.

Try it yourself

Create a branded, trackable short link free and follow along with this guide.