Sonaline Admin

Manage your customers, numbers, and service.

Your own account. Everything you change is recorded under your name.
Continue with Google
Continue with Microsoft
The six digits your authenticator app shows for . Codes change every 30 seconds.
The shared key. Held for this browser tab only, never stored, and audited as key rather than as anyone. Use it to bootstrap the first operator account, or to get back in.

Set up two-factor

This account must have two-factor authentication on. Add this key to your authenticator app (scan it, or paste it), then enter the six digits the app shows.

Signed in as


    

Open in your authenticator

The six digits your authenticator app shows. Codes change every 30 seconds.
/
Appearance
Viewing the console as : their customers and their access, exactly as they see it. Nothing can be changed while you look.
You are signed in with the shared admin key, so everything you change is recorded as 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.

Letters, digits and underscores: the customer's id everywhere, and it cannot change later.
What the inbox and the invoices call them.

Manage this customer

PeopleLines & phonesNumbersHours & repliesWorkspace

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.

Needs attention

At a glance

Recent changes

Everything operators did to this customer full history

Console

Not on the customer's page

Only operators see these.

App 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 page

Console

Not on the customer's page

Console

Not on the customer's page

Automatic 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
A list of objects, each with a "word" and a "reply".

Business hours

A closing time earlier than opening means the hours continue overnight.

Advanced: raw hours JSON
Days as keys, each with an opening and a closing time, like {"mon":["09:00","17:00"]}.

Console

Not on the customer's page

Numbers 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.

Must already be on that carrier's account, or order one from Bandwidth, which lands it here by itself.

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 page

0 keeps them forever. Older ones are deleted within fifteen minutes of passing the limit. Deleting the customer deletes all of them a day later.

Allowed provider IP addresses or ranges, separated by commas. Leaving this blank blocks carrier calls.

Console

Not on the customer's page

Messaging service

Old road through the provider (handover only)

Bandwidth-style API

How a customer's system uses it: the Developer guide.

Applications

Where this workspace's callbacks go, in Bandwidth's format. With no application, its webhook is used as before.

Sent as HTTP Basic on every callback. Kept encrypted; never shown again. Leave empty to keep the current one.
Empty: every number no other application names.

Text history from Ringotel

Found in Ringotel under Integrations, then API Settings. One key for every organization on the Ringotel account. It is checked with Ringotel, kept encrypted, and never shown again.
Its SMS numbers that are also this workspace's are imported; any other is left out and named.

Console

Not on the customer's page

Sending limits

0 = the gateway default; negative = deliberately uncapped.

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.

Uses your carrier cost under Billing → Your carrier cost, for texts, pictures and numbers.

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.

WhenFrom → To ContentStatusCRM

Everything their system was told, and what it answered.

WhenEventMessage AttemptsStatusState

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.

NumberStopped hearing from WordWhen

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

People are added inside their customer, where their lines are too. Pick which, and continue there.

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.

EmailAskedTimes
EmailCustomerRole 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.

Number ordering is not configured. Set 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.
or

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.

NumberCityState Rate center

Orders

PlacedNumberCustomerStatus

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.

LocationIdsVoice hostsTexts
Order notifications: not checked yet.
NumberCustomer 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.

NumberStopped hearing from WordWhen

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

WhenWhatCustomerPerson NumberMessageStatus

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.

WhenCustomerPerson WhatAppSize


        

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.

WhatMedian90% OpensPhone or browserVersionApp

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.

WhenCustomerFrom → To ContentStatusCRM
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.

CustomerEventMessage AttemptsLast statusState

By customer

Everything one customer's system was told, told or owed, newest first.

Everything one customer's system was sent, newest first.

WhenEventMessage AttemptsStatusState

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

ItemQuantity RateAmount
Total

Usage

Last 14 days

Received Sent
See the numbers
Day ReceivedSent

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 SentSegments Sent MMS ReceivedReceived 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.

Add an operator

Optional. The email is what lands in the audit trail.
At least 12 characters. Written only: it can never be read back.
Changing your own password takes the current one too.
Access
Customers
May Sensitive
Sign-in

Adding or removing a passkey always asks for your password; turning on two-factor asks unless you signed in within the last 15 minutes.

Authenticator app

Add this key to your authenticator app (paste it, or open the link on your phone), then enter the six digits it shows.


              
Google sign-in Link

Tied to the Google account they linked here. Unlink it if that account is no longer theirs; they can link another from their own row.

Microsoft sign-in Link

Tied to the Microsoft account they linked here. Unlink it if that account is no longer theirs; they can link another from their own row.

Passkeys

A passkey signs you in with no password at all. The device checks a fingerprint, face or PIN and proves itself to this console's own address, so there is nothing to phish. One per device.

EmailNameAccess Sign-inLast 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.

PartnerShown asCustomers 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.

EdgeDoorsHealthLines

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

The PEM text, from the BEGIN CERTIFICATE line to the END one.

Approving always asks for your password, however recently you signed in.

CertificateStatusSeen 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.

SwitchEvery customerWorkspaces

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.

WhenWhoDid what ToDetail
0 unsaved changes
Review changes