Import
Import accounts from a spreadsheet
- 13
- Columns understood
- .csv .txt .tsv
- File shapes
- 200
- Profiles per batch
- 100
- Saved templates
Your accounts already live in a spreadsheet
Onboarding fifty accounts one at a time is the most tedious thing this app can ask of you. The list already exists somewhere: an export from a supplier, or a sheet your team keeps.
Press From a spreadsheet above the profile list. The file picker takes .csv, .txt and .tsv, which is what Excel, Google Sheets and most supplier exports produce.
The file is read by a real CSV parser, not a split on commas. That matters because a reader one column off does not fail loudly. It creates profiles that look correct and carry someone else's proxy, and undoing that is worse than doing the work by hand.
| What arrives in the file | What the reader does with it |
|---|---|
| A byte order mark from Excel | Stripped, so the first header still matches instead of turning into an unknown column. |
| Semicolons or tabs instead of commas | The delimiter is counted on the header line outside quotes, so comma, semicolon and tab are all recognised. |
| A quoted field with commas or line breaks | Kept whole. A name like "Ivanov, Ivan" stays one cell and does not shift the rest of the row. |
| A doubled quote inside a field | Read as one literal quote, the way RFC 4180 defines it. |
| Windows line endings, a trailing blank line | Handled. A row that is empty in every cell is dropped instead of becoming a blank profile. |

Columns are matched by meaning, not by exact name
Your column names are yours, not ours. Each header cell is normalised before it is compared: case is dropped, spaces, underscores, dashes and dots are removed, and quotes and brackets go too. Profile Name, profile_name and PROFILE NAME are one and the same thing.
Each field then has a generous list of aliases, and they are not only English. The app itself speaks 22 languages, and column names are matched in many of them: Russian, Ukrainian, Spanish, French, German, Polish, Turkish, Japanese, Chinese, Korean and more. Every alias is one customer who does not have to rename a column before importing.
Two rules keep the matching honest. When a file has two columns that mean the same field, the first one wins, because the later one is usually the emptier one. And a column that matches nothing is never guessed at: it is listed by name in the preview and left out of the import.
| Field | Headers that match it | What it becomes |
|---|---|---|
| Name | Name, Profile name, Account, Title, Имя, Название, Nombre | The profile name. The only required cell. |
| Group | Group, Folder, Category, Team, Группа, Папка, Grupo | A real group, created if it does not exist yet. |
| Proxy | Proxy, Proxy URL, Proxy address, Прокси, 代理 | One cell in the seller's own notation. |
| Proxy type | Proxy type, Protocol, Тип, Протокол | http, https, socks5 or ssh. |
| Proxy host | Proxy host, Host, IP, Хост, Сервер | The address the profile goes out through. |
| Proxy port | Proxy port, Port, Порт | A port between 1 and 65535. |
| Proxy user | Proxy login, Proxy username, Логин прокси | Only headers that say proxy. |
| Proxy password | Proxy password, Proxy pwd, Пароль прокси | Only headers that say proxy. |
| Template | Template, Fingerprint, OS, Platform, Шаблон, Система | One of the five fingerprint templates. |
| Scenario | Scenario, Use case, Purpose, Сценарий | The profile's scenario. Rows without one get privacy. |
| Tags | Tags, Labels, Теги, Метки | Split on commas and semicolons inside the cell. |
| Notes | Notes, Comment, Description, Заметки, Описание | Carried across as written. |
| 2FA | 2FA, TOTP, OTP secret, Authenticator, Ключ 2FA | The one-time code key for that account. |
A column called Password belongs to the account, not the proxy
An accounts spreadsheet almost always has a Login column and a Password column next to each other. They belong to the account, not to the proxy, and the importer treats them that way.
This was once wrong, and the damage was quiet. A perfectly ordinary table with Name, Login, Password, IP, Port, Proxy login and Proxy password mapped the account credentials into the proxy settings. The account password was then written into the shared proxy library and sent to the proxy provider on every launch of that profile. The real proxy password was gone, so the proxy answered 407 and the profile did not work.
Only headers that say proxy match the proxy credential fields now. A bare Login or Password column stays unmatched, is named in the preview as a column left out, and is not imported anywhere.
The symptom was not the problem
What one row becomes
Each row is turned into a profile draft, field by field, and the draft is what you approve in the next step.
The proxy can arrive in one column, in whatever notation your seller sent it in. host:port, host:port:user:pass, user:pass@host:port and socks5://user:pass@host:port are all read, and a label after a pipe or a rotation link after a hash is picked out of the same line. Invisible characters that travel with a pasted address, like a non-breaking space, are removed before parsing.
Or the proxy can arrive as separate columns, which is what an exported template looks like. There the type is not guessed. An empty type cell means the seller did not say, and http is the reasonable reading of that. A named type the app does not support is reported instead of being downgraded, because a silent downgrade means you think you are on socks5 while you are going out in the clear.
- 1
Name
Taken as it is. An empty cell marks the row as a problem instead of creating an unnamed profile.
- 2
Proxy
Read from the single proxy column, or from the type, host, port, user and password columns.
- 3
Template
The word in the cell resolves to one of macos-chrome, windows-chrome, linux-chrome, android-chrome or android-tablet. Windows, ubuntu, phone and tablet all land where you expect. A word that matches nothing falls back to macos-chrome.
- 4
Group, tags, notes
The group is held as a name for now. Tags are split on commas and semicolons inside the cell. Notes come across as written.
- 5
One-time code key
A bare base32 secret or a whole otpauth:// link. The link carries its own digits, period and algorithm.
- 6
Scenario
Taken from the cell when there is one. Rows without it get the privacy scenario.
Nothing is created until you have seen the mapping
The import runs in two steps on purpose. The file is read and matched first, and what the app understood is shown before a single profile exists.
The preview names both sides: your header on the left, our field on the right. You check our reading against your own file instead of trusting it. Columns that matched nothing are listed by name.
Under that sits a sample of the first five rows as values, not as claims about column names: the line number, the name, the group and the proxy address that will actually be used. A mapping that is one column off shows up here, in the values.
Cancel drops the parsed file inside the app's main process. A later press of Create profiles cannot act on a file you thought you had dismissed.
- File
- accounts.csv, rows found: 120
- Mapping
- Аккаунт > Name · Логин прокси > Proxy user · Тип > Proxy type
- Columns left out
- Purchase date, Manager
- Sample row
- line 2 · Amazon Seller DE · Marketplaces · socks5://198.51.100.10:8000
- Rows with problems
- 3. Lines: 14, 27, 88
Line numbers are the ones in your spreadsheet: the header is line 1, so the first account is line 2.
A row that cannot be read is named by its line number
A row with a problem is still built and still shown. Hiding it would mean an import that silently drops rows, and you would find out weeks later that account 47 never arrived.
The checkbox decides what happens next. Ticked, which is the default, only clean rows are created. Unticked, a row is created minus the part that failed, so an unreadable proxy cell gives you the profile without a proxy rather than nothing at all.
A row with no name is left out either way. Everything else is a choice you make with the values in front of you.
| Problem in the row | How it looks | What the import does |
|---|---|---|
| No name | The Name cell is empty | The row is never created, with the box ticked or not. |
| Proxy not readable | "ask the seller" in the Proxy cell | Reported with the line number. The profile is created without a proxy rather than with an invented one. |
| Proxy type unsupported | A protocol the app does not speak | Reported. Nothing is quietly downgraded to http. |
| 2FA key unusable | A secret with characters that are not base32 | Reported, never stored. Wrong codes fail the login, and a few failures lock the account out. |
The import fills the groups and the proxy library too
Group names in the file become the same first-class groups the rest of the app uses. Matching is case-insensitive, so Sales and sales do not become two groups, and a group that does not exist yet is created.
When you are signed in, the local group id is translated to the server's id before the profile is created. Without that step the server rejects every row that has a group, and an import of a hundred rows with groups created zero profiles. The group column is second in the app's own example file, so that failure reached almost everyone.
Proxies from the file join the shared library as well, deduplicated by host, port and user, and labelled with the profile they came in with. Rotation, checks and a single password change then reach an imported profile the same way they reach a hand-made one.
The one-time code key is written to the profile as soon as it exists, so an imported profile is ready to sign in rather than half set up.
Created
Profiles that now exist.
Skipped
Rows the app refused, with the reason from the last refusal.
New groups
Groups the import had to create along the way.
Proxies saved to the library
New entries added. Addresses already in the library are reused, not duplicated.
A template carries your decisions, never a fingerprint
Open a profile, set it up the way you need it, and press Save as a template. The template is those decisions under a name.
It carries the scenario, the OS template, the group, the proxy, the rotation interval, the start URL, the headless choice, the engine build such as 153.0.7978.0, the notes and the tags. A proxy you typed in by hand travels whole, including the key file path for an SSH exit, and its password is sealed with the system keychain when the system offers one.
It does not carry the fingerprint, and that is the more important half. A fingerprint is derived from the profile's own id under generation 4, so fifty profiles built from one template are fifty different machines. Copying one machine fifty times is the fastest way to have a group of accounts recognised as a group, and it shows on the first launch, with no history needed.
Stored in a template
Scenario, OS template, group, proxy, rotation, start URL, headless, engine build, notes, tags.
Never stored
The fingerprint, the cookies, the sessions. Each new profile derives its own machine from its own id.
Limits
Up to 100 templates, a name up to 60 characters, up to 12 tags per template.
A batch with names that continue the series
Press Create a batch, pick a template, type a base name and a count. The batch is created from the template, so the decisions are shared and the machines are not.
Names continue the series instead of starting it again. Numbers are padded with zeros to the width of the largest one, so Work 01 to Work 50 sorts in order, while Work 1 next to Work 10 does not. If Work 01 and Work 02 already exist and you ask for three more, you get 03, 04 and 05.
Your plan's room is checked before the first profile is created, not in the middle of the run. Free carries 2 profiles, Professional 10 to 100, Business 200 to 1000, Enterprise 5000 and up. When the batch does not fit, the message says how many do.
Up to 200 profiles are created per press. The first failure stops the run, because if the quota ran out or the network went away, the next forty-nine attempts would fail the same way while you waited for all of them.
- 1
Pick the template
The line under the picker names the scenario, the OS template, the group, the proxy and the engine build it will use.
- 2
Name and count
A base name, and how many. The count is capped at 200 per press.
- 3
Read the preview line
It shows the first and the last name before you press anything. Fifty profiles with unexpected names can only be renamed one at a time.
- 4
Create
Profiles appear in the list, each with its own fingerprint, its own storage and the shared decisions from the template.
What this does not do
- Excel and OpenDocument workbooks are not read. Save the sheet as CSV or TSV first: the picker takes .csv, .txt and .tsv.
- The import brings settings, not sessions. Cookies, signed-in state and local storage are not in a spreadsheet and do not come with it.
- A proxy that parses is not a proxy that works. The import reads the address, it does not dial it. Check the entries afterwards in the Proxies view.
- Rows are not matched against profiles you already have. The same name twice gives two profiles, and re-importing the same file creates everything again.
- A bare 2FA secret is read with the standard settings: 6 digits, a 30 second step, SHA1. If your provider issues 8 digits or a 60 second step, put the whole otpauth:// link in the cell.
How to check
Every claim on this page is one file you can open, and most of them have a stand that fails when the behaviour changes.
- The file is read as CSV, not split on commas: BOM, semicolons, tabs, quoted commas and line breaks inside a field.
- apps/desktop/src/lib/csv.js · apps/desktop/test/csv-import.js
- Columns are matched by meaning, and a column that matches nothing is named rather than guessed at.
- apps/desktop/src/lib/profileImport.js · apps/desktop/test/csv-import.js
- An account Login or Password column never becomes the proxy's login or password.
- apps/desktop/src/lib/profileImport.js · apps/desktop/test/csv-proxy-columns.js
- A group name from the file becomes a real group, and a signed-in account gets the server id instead of the local one.
- apps/desktop/src/main/main.js · apps/desktop/test/csv-import-groups.js
- A template copies decisions but not the fingerprint, the quota is checked before creation, and batch names continue the series.
- apps/desktop/src/lib/presets.js · apps/desktop/test/заготовки-и-пакет.js
Bring your list in
Download ARMANOS, press From a spreadsheet above the profile list, and check the mapping before anything is created.