key rather than as you. Add yourself under
Operators and sign in with that instead.
Customers
New customer
Only the name now. Everything else (their first person, a number, calling and their CRM) is a checklist on the customer's own page and can be done in any order.
Manage this customer
Overview shows health and next actions. Open a section to change its settings.
Setting up
This checklist stays here until the essentials are done. Each step opens the section where it happens.
Console
Not on the customer's pageApp access
Delete this customer
Deleting revokes the API key at once and removes everything under it (its users and their sessions, messages and attachments, contacts, notes, templates, push registrations, opt-outs and usage ledger) in one step, and orphans its inbound numbers. Type the short name to unlock the button. Only a restore of the database, within thirty days, can bring it back.
Console
Not on the customer's pageConsole
Not on the customer's pageConsole
Not on the customer's pageAutomatic replies
STOP and HELP, keyword replies, business hours and the away message. The customer's admin changes the same ones in their admin center, under Hours & auto-replies.
STOP & HELP replies
Keyword replies
Advanced: raw keyword JSON
Business hours
A closing time earlier than opening means the hours continue overnight.
Advanced: raw hours JSON
Console
Not on the customer's pageNumbers the customer asked for
Their admin asked from the app. Add the number below (or order one), then mark the request done; the note goes back to them.
Carriers
The carriers this customer may text on. Sonaline is Sonaline's own account, with nothing to set up; each other one appears under Texting carriers in its Admin Center, where its admin connects its own account. With Sonaline alone, nobody picks a carrier: every number added goes on Sonaline.
Its numbers stay on the provider until one is moved. Turn on the carriers this customer may connect its own account on, under Texting carriers in its Admin Center, and put numbers on.
Incoming texts on Skyetel
Each Skyetel number forwards its incoming texts and delivery updates to this address. Set up points them here through Skyetel's API (adding a Skyetel number does it too); by hand it is each number's SMS tab in the Skyetel portal: Forward to Callback URL, Method POST, this address. It is this customer's alone; New address replaces it if it ever leaks, and moves the numbers to the new one.
Console
Not on the customer's pageConsole
Not on the customer's pageMessaging service
Old road through the provider (handover only)
Bandwidth-style API
Applications
Where this workspace's callbacks go, in Bandwidth's format. With no application, its webhook is used as before.
Text history from Ringotel
Console
Not on the customer's pageSending limits
This month
Rate card
Billed the way the carrier bills: a text per segment, a picture message (MMS) per message, and anything sent per recipient. There is deliberately no gateway-wide default price: a default would invoice a customer at a rate nobody agreed to.
Every message this customer's numbers carried, newest first. What people wrote is never shown here: metadata only, who, when, size, outcome. CRM is the delivery ledger's verdict on telling their system about it. Click a row for the delivery story.
| When | From → To | Content | Status | CRM |
|---|
Everything their system was told, and what it answered.
| When | Event | Message | Attempts | Status | State |
|---|
Everything operators did to this customer, newest first. Reads are not recorded.
Numbers that replied STOP to this customer. Removing a row records consent given somewhere this gateway cannot see. It is your assertion, not a way to resume messaging someone who asked you to stop.
| Number | Stopped hearing from | Word | When |
|---|
Users
Everyone who signs in to any customer's inbox, and as whom. The same address may exist in several workspaces as separate accounts with separate passwords. Open a row to manage the person inside their customer.
Everyone who signs in to a customer's inbox. The same address in two workspaces is two accounts, each with its own password. Open a person to manage them in their workspace.
Add a person
Waiting for a reset link
This gateway has no mail server, so you are the delivery mechanism. Issue a link and send it however you already talk to that customer. It is good for four hours, works once, and ends every session that account had.
| Asked | Times |
|---|
| Customer | Role | Last signed in |
|---|
Numbers
Every phone number this gateway answers for, across all customers. 10DLC campaigns are registered in each carrier's own account, not here.
Every phone number this deployment answers for, across all customers. Numbers are assigned on the upstream: turn on Text messaging under a customer's Messaging and its numbers appear here.
Every number on the platform, across customers. Open one to see it in its workspace.
Search and order
What the carrier has for sale, by area code or by city and state. An order completes in seconds to minutes; a landed number joins the customer's list on its own the next time its order is checked.
BANDWIDTH_ACCOUNT_ID,
BANDWIDTH_SITE_ID, BANDWIDTH_PEER_ID and
the Bandwidth API credential (BW_CLIENT_ID,
BW_CLIENT_SECRET) on the Worker and reload.Cost: Bandwidth does not tell us the price through its API. Numbers are billed to Sonaline's Bandwidth account at its contract rate, monthly, from the day they are ordered.
| Number | City | State | Rate center |
|---|
Orders
| Placed | Number | Customer | Status |
|---|
Bandwidth locations
Each location is a SIP peer on a site of Sonaline's Bandwidth account. A number's incoming calls go to its location's voice hosts, set in Bandwidth's dashboard; its texts go to the location's messaging application, which must be this deployment's for them to arrive here.
| Location | Ids | Voice hosts | Texts |
|---|
| Number | Customer | In (30d) | Out (30d) | Status |
|---|
Order numbers
Orders
Opt-outs
A number here replied STOP and cannot be messaged from the number shown until it replies START. Removing a row records consent given somewhere this gateway cannot see (a form, a phone call) and is your assertion, not a way to resume messaging someone who asked you to stop.
Numbers that replied STOP. They get no texts from that number until they reply START. Remove one only when the person agreed again somewhere else, such as on a form or a call.
| Number | Stopped hearing from | Word | When |
|---|
Carriers
Every carrier Sonaline supports, from its own setup instructions. Connect the platform's own accounts here; each workspace's admin connects the workspace's own from its admin center.
Sonaline number
The one number every verification code goes out from, for every customer (never a customer's own number), so codes stay out of their conversations. Texts sent to it reach no customer: STOP, START and HELP get the standard answers, and anything else gets the reply below, once a day per sender. Codes are never shown here, and the other end shows as its last four digits.
What it sent and heard
| When | What | Customer | Person | Number | Message | Status |
|---|
Phone debug logs
What a phone sent when its owner turned on Settings → Debug logging and a call ended: the call's diagnostics and every SIP message, word for word. Use it to see what a call that went wrong actually did. Logs hold phone numbers and call details, and are deleted after two weeks. Newest first; times in your time zone.
What a phone sent after a call when its owner turned on debug logging: the call's details and every signal, word for word. Open one to read it. Kept two weeks.
| When | Customer | Person | What | App | Size |
|---|
Speed
How long the apps take on real phones and in real browsers: starting the Android app, each screen until what it shows is on it, and the web inbox until its conversations are on the page. Half of all opens were faster than the median, nine in ten faster than the 90% figure. Only numbers, the app's version and the phone's model or browser are kept, never who or what. Kept 30 days.
| What | Median | 90% | Opens | Phone or browser | Version | App |
|---|
Logs
Every message the gateway has carried, newest first. Filter by customer, business number (DID), customer number (CID), direction or status. What people wrote is never shown here: this ledger is metadata only: who, when, size, outcome. CRM is the delivery ledger's verdict on telling that customer's system about it. Times are UTC. Click a row for the delivery story.
Every text the platform carried, newest first, without what was written. Times are UTC. Open one to see how telling their system went.
| When | Customer | From → To | Content | Status | CRM |
|---|
System health
Deliveries
Events a customer's system is still owed, or that gave up in the last seven days. Retry now puts one back in the cron's path immediately, for when their endpoint is fixed and the backoff shouldn't be waited out.
Events a customer's system is still owed, or gave up on in the last seven days. Retry now sends one again at once, for when their end is fixed.
| Customer | Event | Message | Attempts | Last status | State |
|---|
By customer
Everything one customer's system was told, told or owed, newest first.
Everything one customer's system was sent, newest first.
| When | Event | Message | Attempts | Status | State |
|---|
Billing
The usage ledger priced with each customer's own rate card, set on their Billing page. There is deliberately no gateway-wide default price.
Your carrier cost
per unit, in dollars (powers the margin line)| Customer | Sent (billable) | Received | MMS | Total | Status |
|---|
Invoice
| Item | Quantity | Rate | Amount |
|---|
Usage
Last 14 days
Received SentSee the numbers
| Day | Received | Sent |
|---|
Billable messages per customer for one month. A message counts when the provider accepted it, delivered or not; a webhook retry counts nothing twice. Months roll over in the gateway's own timezone.
| Customer | Sent | Segments | Sent MMS | Received | Received MMS |
|---|
Response times
For every inbound message in the last 30 days: minutes until the thread's next outbound reply, averaged per customer. The one number that says whether an inbox is being worked or merely filling.
| Customer | Answered | Avg. minutes to reply |
|---|
Operators
Who may administer this gateway,
which customers each may see, and what they may do. The admin key
is one shared bearer token with no name on it: everything done
with it is recorded as key. An operator account can be
narrowed or disabled on its own, and everything they change carries
their email in the audit trail.
Who may run this console, which customers each may see, and what they may change. Everything they change carries their email in the audit.
Your account: your name and password, your two-factor and the passkeys that sign you in. Changing who may see and do what takes an operator who manages operators.
| Name | Access | Sign-in | Last signed in |
|---|
Partners
A partner is another system (a reseller, or a
sibling deployment of this software) that creates customers
here with its own key and sends and receives through the ordinary
SMS API as them. It reaches only the customers it made, which are
named <partner>_<workspace> and run as
API-only relays. You assign their numbers, caps and prices exactly
as for any customer.
The key is shown once, right here, and never again; the partner puts it in its own secrets. Rotate it any time; the old one stops working at once.
| Partner | Shown as | Customers | Created |
|---|
Edges
An edge is a box of the phone system's own (Kamailio,
rtpengine and the call agent) that the apps register through.
There is one today. A second is a DNS record, an sbc.env with
SBC_EDGE_NAME, one install.sh run, and a row here
(docs/sbc-failover.md has the runbook). A wrong door takes every
phone down: add an edge off, turn it on once its box answers here, and let
it take new registrations last. Blank URLs mean the voice worker's own
settings.
Add an edge
Both doors are full addresses with their port, like wss://host:443 and https://host:8443.
The realm is the same on every edge: the apps' credentials are minted for it. Leave it blank unless you know why.
| Edge | Doors | Health | Lines |
|---|
Filter certificates
A content filter that checks encrypted traffic answers for our addresses with its own certificate, and the Android app refuses it. Phones report the ones they refuse, and they wait here. Approve one only when you know whose filter it is: that filter can then read Sonaline's traffic on the phones that installed its certificate, sign-ins included. A phone accepts an approved certificate for Sonaline's own addresses only, and only when its owner installed that same certificate; nothing else changes.
Approve a certificate
Approving always asks for your password, however recently you signed in.
| Certificate | Status | Seen by | Valid until |
|---|
Feature switches
A feature still being built ships hidden behind a switch
and is turned on here: for every customer, or for one workspace to try
it first. A workspace's own setting wins over the one for every customer;
a switch nobody has set is off. The switches are named in the code
(platform/src/switches.ts), and one goes away once its
feature is finished.
| Switch | Every customer | Workspaces |
|---|
Audit
Every change made through this console and the operator API, with who made it. Reads are not recorded: they would bury the writes, and the writes are what anyone goes looking for. A customer's own slice is under their Activity, as Changes.
Every change made in this console or through the operator API, and who made it. Looking is not recorded.
| When | Who | Did what | To | Detail |
|---|