White Label
Branded portal, zero UI dev. Best for platforms that want a premium phone-system experience without building or maintaining a voice UI.
Your customers log into a DialStack-hosted portal at <yourplatform>.netvoice.io — our dedicated white-label domain. The admin console, call history, voicemail inbox, and device management are all provided — you own the branding and the identity flow. A custom domain like phones.yourplatform.com is also possible (see Custom domain below).
What you ship
- A fully branded phone-system portal at
<yourplatform>.netvoice.io. - Administrative interfaces (e.g., for managing users, numbers, dial plans).
- User features (e.g., call history, voicemail inbox, and device provisioning).
- SSO from your app → the portal so users never see a second login.
Provisioning flow
Three API calls. That's it.
Provision a new customer
When your signup flow runs, create a DialStack account for the customer:
import { DialStack } from '@dialstack/sdk';
const ds = new DialStack(process.env.DIALSTACK_KEY);
const account = await ds.accounts.create({
email: 'contact@joneschiro.com',
});
// → { id: 'acct_01h2xcejqtf2nbrexx3vqjhp41', ... }
Persist account.id against your customer record. All subsequent user / billing / config calls scope to this ID via the DialStack-Account header.
Sync users
Whenever your product creates or deletes a user on that customer's account, mirror it to DialStack:
const user = await ds.users.create(
{ name: 'Dr. Alice Smith', email: 'alice@joneschiro.com' },
{ dialstackAccount: account.id }
);
// later, on offboard:
await ds.users.del(user.id, { dialstackAccount: account.id });
The user now shows up in the portal's admin console and can be assigned a phone number.
Issue a session and redirect
When the user clicks "Open phones" in your app, create a short-lived session token on your backend and redirect with it:
// Backend
const { client_secret } = await ds.accountSessions.create({
account: account.id,
});
// Redirect URL
const url = `https://yourplatform.netvoice.io?session_token=${client_secret}`;
Session tokens are account-scoped, expire in one hour, and are safe to pass through a redirect URL. The portal consumes the token on load and drops into the authenticated UI.
Theming
Your logo and brand colors are configured once in the Platform Admin and applied across the portal and transactional email. No code, no CSS.
Custom domain
By default the portal lives at <yourplatform>.netvoice.io. That's production-ready and branded — no DNS required.
If you want the portal to live under your own domain (e.g., phones.yourplatform.com), that's supported too. It involves more than a simple CNAME — we coordinate DNS, TLS provisioning, and per-tenant routing together. Reach out and we'll walk through it.
What you don't build
- Call-logs list, voicemail inbox, device provisioning
- Admin tools (users, dial plans, number ordering)
- Authentication UX — session tokens carry identity
What you do build
- Account creation on customer signup (
ds.accounts.create) - User sync on user onboard/offboard (
ds.users.create/ds.users.del) - "Open phones" button in your app that issues a session and redirects
When to pick this
- You want voice live in weeks, not months.
- You don't have front-end capacity for a voice surface.
- Your customers are used to logging into vendor portals (payroll, scheduling, DMS tools).
When to pick something else
- If voice has to live inside your app's main workspace with no context switch → Embedded.
- If you're building a bespoke voice workflow (dispatcher console, agent cockpit) → Direct API.
See also
- Quickstart — the
ds.accounts.create/ds.users.create/ds.accountSessions.createtrio. - Authentication — session-token lifecycle, refresh, revocation.