Skip to content

Subscriber Import & Export

When you migrate from another billing system or onboard a batch of customers at once, you don’t want to type each subscriber into the Subscribers page by hand. The Import page lets you upload a spreadsheet and create hundreds of subscribers in one pass, with a row-by-row report telling you exactly which rows succeeded and which failed (and why).

ProxPanel ships two import paths that look similar but are wired to different endpoints with different permissions:

PathEndpointPermissionUsed by
Excel import (the UI page)POST /subscribers/import-excelAdminOnlyThe Import Subscribers page (/subscribers/import)
CSV importPOST /subscribers/bulk-importsubscribers.createProgrammatic / older multipart CSV upload

The page you see in the panel uses the Excel path. The CSV path is a separate endpoint that accepts a raw multipart CSV file — useful for scripting, and reachable by any user (including resellers) with subscribers.create.

Sidebar → SubscribersImport button, or go directly to /subscribers/import. The page route itself is gated by subscribers.create, but the Excel import call it makes is AdminOnly — a reseller can open the page but the import will be rejected with Only admin can bulk import. For resellers, use the CSV bulk-import endpoint instead.

The page walks you through three steps.

  1. Download the sample file. Click Download Sample Excel to get import_subscribers_sample.xlsx. It shows the expected layout: row 1 is the header, row 2 is a description/hint row, and data starts at row 3.
  2. Upload your file. Click Choose File and pick a .xlsx or .xls. Parsing happens entirely in your browser — the spreadsheet is read with the xlsx library, never uploaded as a binary. The page auto-detects whether row 2 is a description row (it looks for words like “required”, “optional”, “format”, “example”) and skips it; otherwise data is read from row 2.
  3. Review & import. A preview table shows the first 100 parsed rows. Rows missing a required field, or whose Service name doesn’t match an existing service, are highlighted red. Click Import All to send the parsed data to the server.

You can optionally pick a Default NAS before importing. That NAS ID is attached to every created subscriber.

Column headers are matched case-insensitively, with spaces and * stripped. Each field accepts several aliases, so a header of User, username, or Username * all map to the same field:

FieldAccepted header aliasesRequired
Usernameusername, userYes
Passwordpassword, passYes
Serviceservice, plan, packageYes (must match an existing service name)
Full namefull_name, name, fullnameNo
Expiryexpiry, expiry_date, expires, expNo
Phonephone, mobile, telNo
Addressaddress, addrNo
Regionregion, areaNo
Buildingbuilding, bldgNo
Nationalitynationality, nationNo
CountrycountryNo
MAC addressmac_address, macNo
Notenote, notes, commentNo
ResellerresellerNo (matched by reseller name)
Blockedblocked, block, statusNo

For each row the import-excel handler:

  1. Validates that Username, Password, and Service are all present — otherwise the row fails.
  2. Looks up the Service by name (case-insensitive). Unknown service name fails the row with Service '<name>' not found.
  3. Checks the username isn’t already taken — duplicates fail with Username already exists.
  4. Parses the Expiry. It tries YYYY-MM-DD first, then DD/MM/YYYY, then MM/DD/YYYY. An unparseable date fails the row. An empty expiry defaults to 30 days from now.
  5. Resolves the Reseller by name if provided (unknown reseller names are silently ignored — the subscriber is created with no reseller).
  6. Sets status to Active, unless the Blocked column is 1, true, or yes, in which case status is Stopped.
  7. Creates the subscriber, then writes RADIUS rows:
    • radcheck: Cleartext-Password, Expiration, Simultaneous-Use := 1.
    • radreply: Mikrotik-Rate-Limit from the service’s speed strings, and Framed-Pool if the service has a pool name.

The subscriber’s MAC is upper-cased and MAC-binding (SaveMAC) is turned on automatically when a MAC is supplied.

After import, a results table lists every row with a green Success or red Failed badge and a message (the same per-row reasons listed above). The group header summarises N success, M failed. From there you can click Import More to reset the form, or Go to Subscribers to see the new accounts.

The bulk-import endpoint takes a multipart-uploaded CSV file plus a service_id form field, and is gated by subscribers.create rather than AdminOnly — so resellers can use it. It behaves slightly differently from the Excel path:

  • All imported subscribers get the single service passed in service_id (the CSV has no per-row Service column).
  • Recognised CSV columns: username/user, password/pass, full_name/fullname/name, email, phone/mobile, address. Headers are matched case-insensitively.
  • Only Username is required. If Password is blank, the password defaults to the username.
  • Expiry is computed from the service’s own expiry value/unit (not read from the file).
  • A reseller’s imports are owned by that reseller; an admin’s default to reseller ID 1.
  • Like the Excel path it skips duplicate usernames and writes the same radcheck / radreply rows.

Both endpoints write a single audit-log entry summarising the import (Bulk imported N subscribers (M failed)).

There is no subscriber-export endpoint in ProxPanel today. The pages that do export to CSV are Sessions, Audit Log, and Reports — none of which dumps the subscriber table itself. To extract the full subscriber list, query the subscribers table directly, or use the per-page CSV exports above for the data they cover.

Permission / roleEffect
subscribers.createLoads the /subscribers/import page; required for the CSV bulk-import endpoint.
Admin roleRequired for the Excel import-excel endpoint — resellers are rejected even with subscribers.create.
  • Subscribers — where imported accounts land; the Import button lives here.
  • Services — the Service column / service_id must match a service name defined here.
  • Resellers — the Reseller column is matched against reseller names.
  • Backups — the recommended path for full server-to-server subscriber migration.
  • Bulk Operations — bulk actions (renew, reset FUP, disconnect) on subscribers that already exist.