Console

Operator access for the SMS gateway.

Your own account. Everything you change is recorded under your name.
The six digits your authenticator app shows.
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.
Y YBPBX console
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.

Overview

Last 14 days

Received Sent
See the numbers
Day ReceivedSent

Machinery

When each background job last proved it ran.

Deliveries needing attention

Events a tenant'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.

TenantEventMessage AttemptsLast statusState

Tenants near their spend caps

TenantPeriod UsedCap

Recent failed messages

WhenTenantToWhy

New tenant

The business and its integration — one pass. Numbers follow, on the tenant's own tab.

Letters, digits and underscores — the internal id, e.g. acme_plumbing. Cannot change later.

Numbers come next, on the tenant's own Numbers tab. This finishes there.

What their PBX or CRM presents as x-api-key. Readable any time on the tenant's page.
Where inbound texts and receipts are POSTed. Leave empty for a send-only tenant.

—

Invoice

ItemQuantity RateAmount
Total

Integration

API key — Webhook URL — Signing token — Custom headers — Media push — Surfaces — Managed by —

Numbers

What their system was told lately

WhenEventMessage AttemptsStatusState

The numbers this tenant texts from and receives on. An inbound text to any of them is this tenant's — attributed to it and forwarded to its webhook.

Must already be on the carrier account — or order one under Numbers, which lands it here by itself.
Number In (30d)Out (30d)

10DLC campaign

Covers every number above. Optional, but unregistered traffic gets filtered — the Numbers view keeps flagging it.

Service

Off is a total wall — nothing sends, nothing is attributed inbound.
The machine surface: api-key sends, media, and webhooks to their system. Off pauses the integration.

Identity

What the invoices call them. Their numbers live on the Numbers tab.

Integration

Every message event POSTs here as JSON. Prove it with Send test event, up top.
Sent as a Bearer and used to sign each body (X-YBPBX-Signature, and the timestamped X-Signature-256). Empty = unsigned.
Optional: attachments POSTed to them as files, named by message id.

STOP & HELP

Answer here only if the carrier does not already confirm STOP and answer HELP on these numbers.

Limits & history

0 keeps message history forever.
0 = the gateway default; negative = deliberately uncapped.

Rate card

Operator notes

Danger zone

Deleting a tenant revokes its API key at once and removes everything under it — its messages and attachments, opt-outs and usage ledger — in one step, and orphans its inbound numbers. Type the tenant's name to unlock the button. Time Travel is the only way back, for thirty days.

Numbers that replied STOP to this tenant. 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

Tenants

One row per customer: its numbers, its integration and its limits. Add tenant walks through a new one; a row opens its page, Settings goes straight to the switches. A PBX customer's API key is created on the PBX and copied over by import_tenants.py, so calls and texts share one key — rotate those there, not here.

TenantNumbersSMS ForwardingLast activity Limits

Logs

Every message the gateway has carried, newest first — filter by tenant, 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 tenant's system about it. Times are UTC; history reaches back as far as each tenant's retention keeps it. Click a row for the delivery story.

WhenTenantFrom → To ContentStatusCRM

Billing

The usage ledger priced with each tenant’s own rate card. Rates are set per tenant under Tenants → Settings → Rate card; there is deliberately no gateway-wide default price, because a default would invoice a customer at a rate nobody agreed to.

Your carrier cost per unit, in dollars — powers the margin line below
Tenant Sent (billable) Received MMS Total Status

Numbers

Every phone number this gateway answers for, across all tenants. A number sending real volume with no 10DLC campaign is on borrowed time — carriers filter unregistered traffic harder every quarter, and this table is where that shows before it hurts.

Search & 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 tenant's list on its own the next time its order is checked.

Number ordering is not configured. Set BANDWIDTH_ACCOUNT_ID, BANDWIDTH_DASH_USER, BANDWIDTH_DASH_PASS (a secret), BANDWIDTH_SITE_ID and BANDWIDTH_PEER_ID on the Worker and reload.
or
NumberCityState Rate center

Orders

PlacedNumberTenantStatus
NumberTenantCampaign In (30d)Out (30d) Status

Operators

Who may administer this gateway. The admin key is one shared bearer token with no name on it — it cannot be given to one person and taken back from another, and everything done with it is recorded as key. An operator account can be disabled on its own, and everything they change carries their email in the audit trail.

Your sign-in

Second factors for . A passkey signs you in with no password at all — your device checks a fingerprint, face or PIN and proves itself to this console; there is nothing to phish. The authenticator code guards the password door.

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.


                
Passkeys

A passkey works only on this console's own address — that binding is what makes it unphishable. Enroll one per device you sign in from.

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.
Disabling ends every session they have open, at once.
EmailNameStatus Last signed in

Partners

A partner is another system — a reseller, or a sibling deployment of this software — that creates tenants here with its own key and sends and receives through the ordinary SMS API as them. It reaches only the tenants it made, which are named <partner>_<workspace> and run as relays (no message content kept). You assign their numbers, caps and prices exactly as for any tenant.

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 asTenants Created

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.

WhenWhoDid what ToDetail

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.

NumberStopped hearing from WordWhen

Usage

Billable messages per tenant 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.

Tenant 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 tenant. The one number that says whether a tenant's customers are being answered.

Tenant Answered Avg. minutes to reply

Webhook deliveries

Every event owed to this tenant's CRM endpoint: delivered, still being retried (with the next attempt's time), or dead after a day of refusals. Dead rows are the "their integration is broken and nobody noticed" alarm.

WhenEventMessage AttemptsStatusState