Skip to content

Reseller Onboarding

A reseller is a partner ISP operator who owns a slice of subscribers, has their own wallet, and (optionally) their own login URL, branding, and downstream sub-resellers. Onboarding is the path from “admin creates the row” to “reseller logs in, tops up their wallet, and adds their first sub-reseller”.

This page describes the operator side of onboarding — what the platform admin does, what the new reseller sees on first login, and the four decisions every onboarding makes (permissions, balance, NAS scope, branding).

From the admin panel sidebar:

  • ResellersAdd Reseller (top-right button)
  • Or direct URL: /resellers/new

Only admins can create top-level resellers. A reseller can create sub-resellers under themselves from the same page in their own panel (see Sub-Resellers).

The Add Reseller form is divided into five sections:

SectionWhat you setWhen to revisit
AccountUsername, password, email, phone, full nameUsername and password can be changed later from the reseller’s profile
CompanyDisplay name, company name, addressShown on invoices and (if branded) on the login page
WalletStarting balance, credit limitTop up later from the Resellers list → Transfer
ScopeParent reseller, permission groupPermission group can be changed any time; parent rarely changes
NetworkAllowed IPs, WAN check overridesUsed for partner / read-only lockdowns
FieldRule
UsernameLowercase, unique across the system, used at login. Soft-deleted usernames are still reserved — use Permanent Delete if you need to free one up.
PasswordStored hashed (bcrypt) + an admin-visible plain copy so you can hand it to the reseller. Force-password-change on first login is the safer default.
Email / phoneUsed by Communication Rules for billing alerts and password reset (if SMTP/SMS is configured in Settings → Notifications).
Full nameFree text; used in the audit log and admin lists.

The company name is the display name shown:

  • In the Subscribers list “Reseller” column
  • On invoices generated for this reseller’s subscribers
  • On the login page only if branding is enabled and a custom domain is set

The address is printed on invoices when “Reseller is invoice issuer” is enabled in Billing Settings — otherwise the panel-wide company address is used.

Wallet — starting balance and credit limit

Section titled “Wallet — starting balance and credit limit”

Two separate numbers:

  • Balance — actual money in the reseller’s wallet. Increases on Transfer in / Top-up; decreases on every subscriber renewal, plan change, top-up fulfilled.
  • Credit limit — how far below zero the balance can go before subscriber renewals start failing. Default is 0 (no credit — must always be in the black). Resellers you trust can carry, e.g., -500 so they can keep renewing for the first few days of the month before settling with you.

Most operators leave the starting balance at 0 and credit at 0, then transfer real funds once the reseller signs their agreement.

CallerParent field behavior
Admin creating a top-level resellerLeave Parent empty. The reseller reports directly to the admin.
Admin creating a sub-resellerPick the parent from the dropdown. The sub-reseller inherits NAS scope from the parent.
Reseller creating a sub-resellerParent is forced to the calling reseller — they cannot create resellers under someone else.

Hierarchy depth is one level: a sub-reseller cannot themselves have sub-resellers. This is a deliberate design choice — supporting deeper trees triples the complexity of balance flow and permission scoping without a real-world demand.

The permission group decides what the reseller can do, not what they can see. Common patterns:

GroupUse case
SALES (default)Full reseller — create / edit / delete their own subscribers, set prices, top-up, view their reports.
SUPPORTView-only on their own subscribers, can reset FUP and disconnect, cannot delete or change pricing.
PARTNER (read-only)All *.view_all permissions, no .edit / .create / .delete. See Partner Role.
No groupBackward-compatible mode — the reseller has all permissions on their own scope.

You can create more groups under Settings → Permissions.

Both fields are optional and most resellers leave them blank.

FieldMeaning
Allowed IPsComma-separated IP / CIDR list. If set, all logins and API calls from this reseller must originate from one of these addresses. See IP Restriction.
WAN checkPer-reseller override of the system-wide WAN connectivity check (used for sharing detection). Leave on inherit unless you have a reason.
  1. Sidebar → ResellersAdd Reseller.
  2. Fill in Username, Password, Full Name, Email, Phone.
  3. Set Company Name (this is the public-facing name).
  4. Leave Balance at 0 and Credit Limit at 0 for now.
  5. Pick a Permission Group. SALES is the typical full-reseller default.
  6. Leave Parent empty — this is a top-level reseller reporting to you.
  7. Click Create. The list refreshes with the new row.
  8. From the new row’s action menu → Login as Reseller to verify they can sign in.
  9. Hand the reseller their username / password + the panel URL.
  1. Resellers → click the reseller’s row → Transactions tab.
  2. Click Transfer in the top-right.
  3. Enter the amount (e.g. 1000) and an optional note (e.g. "Monthly settlement May 2026").
  4. Click Transfer. The reseller’s balance increases instantly; a transfer transaction is logged on both sides.
  1. Reseller opens the panel URL and signs in with the credentials you provided.
  2. If force_password_change is set, they’re prompted to pick a new password.
  3. The Dashboard loads — they see their own subscriber count (zero), today’s revenue (zero), and their balance.
  4. Subscribers → Add Subscriber to onboard their first end-customer.
  5. (Optional) Settings → Branding to upload a logo and pick a primary color — only if the admin has enabled rebranding for this reseller (see Custom Branding).

Creating a sub-reseller (the reseller does this)

Section titled “Creating a sub-reseller (the reseller does this)”
  1. Reseller signs into their own panel.
  2. Resellers → Add Reseller (visible because they have resellers.create).
  3. Username / password / contact details — same form as the admin sees, minus the Parent picker (it’s auto-set).
  4. Permission Group picker is constrained — they can only pick groups the admin has marked as “available to sub-resellers”.
  5. Starting balance defaults to 0. To fund the sub-reseller, save first, then use Transfer from the sub-reseller’s row.
PermissionEffect
resellers.viewSee the Resellers list (your own sub-resellers only — admins see all).
resellers.createAdd a new sub-reseller under yourself.
resellers.editChange a sub-reseller’s name, contact, permission group, NAS scope.
resellers.deleteDelete a sub-reseller (only if they have zero subscribers).
transactions.transferUse Transfer to fund a sub-reseller from your own wallet.
transactions.withdrawPull balance back from a sub-reseller into your wallet.

Admins always have all reseller permissions.

When Create is clicked, the API performs in one transaction:

  1. Insert a row in users (bcrypt password, user_type=2 for reseller).
  2. Insert a row in resellers (linked to that user, with the wallet, credit, parent, permission group).
  3. Update users.reseller_id to point back at the new reseller row.
  4. Append an audit log entry: Created new reseller.

If step 2 fails, step 1 is rolled back so you don’t end up with a dangling user record.