V2 Updated 2026-04-26

Softphone Pro V2

Replace Bria, Linphone, and Zoiper with a browser-native softphone — wired into your CRM.

Encrypted SIP credentials. Station binding. Pre-dial FDCPA/TCPA compliance gates. After-call work (ACW) state. Forced dispositions. Real audit trail.

What's new in V2

Encrypted SIP credentials

Every SIP credential is AES-256-GCM encrypted at rest in softphone_assignments.sip_credentials_encrypted, AAD-bound to the tenant_id. The migration re-encrypts existing rows in place; backward-compat readback keeps any unmigrated tenants working until their next save.

Station binding

User → station → DID + PBX registration. One agent can occupy one station at a time. Logging in on a second pod kicks the first. The station owns the DID, not the user.

Pre-dial compliance gate

Before any outbound dial, the engine resolves the customer and checks cease_and_desist, attorney_represented, bankruptcy_filed, do_not_call, deceased, and FDCPA §1692c(a)(1) hours. Hard blocks abort. Soft warnings prompt acknowledgment. Every event is audited.

After-Call Work (ACW) + dispositions

Hangup → 30-second wrap-up timer (configurable to 300s). Forced disposition modal with 12 default codes plus tenant-extensible. The dialer is locked out until the agent codes the call.

Architecture

V2 keeps the V1 Twilio Voice SDK foundation (browser → Twilio Edge → PSTN) and layers on top:

  • SoftphoneEngine (/classes/SoftphoneEngine.php) — single source of truth for station resolution, compliance gating, ACW state, disposition save
  • CredentialsCipher integration — same AES-256-GCM module used by Customer Payments V2 for Stripe credentials
  • softphone_stations — the new entity, one row per physical seat. Owns the DID and the SIP credentials.
  • softphone_compliance_audit — every block + forced override gets a row. Severity, reason code, forced flag, customer FK.
  • softphone_call_logs.disposition + acw_* — disposition code, notes, ACW start/end timestamps, ACW duration

Getting started

  1. Activate Softphone Pro from RubiMine. $9.99 per agent per month.
  2. Apply the V2 schema — open the Softphone dashboard in tenant admin. The V2 banner has a one-click Apply V2 schema button. Idempotent and encrypts any plaintext SIP credentials in place.
  3. Configure Twilio credentials — paste your Account SID, API Key, API Secret, and TwiML App SID into Module Settings. Click Test Connection.
  4. Create stations — one per physical seat. Give each a name, a location (optional), and the DID that should ring there.
  5. Bind agents to stations at the start of their shift. The station's DID becomes their caller ID.
  6. Train on the dispositions flow — after every call the agent gets a 30-second wrap-up window with a forced disposition modal.

Compliance reference

Hard blocks (cannot be overridden by an agent) — the engine returns allowed=false and the widget shows the block modal. Customer record must be updated by an admin to clear the flag.

Reason code Source Authority
cease_and_desistcustomer_collections_metadata.cease_and_desistFDCPA §1692c(c)
attorney_representedcustomer_collections_metadata.attorney_representedFDCPA §1692c(a)(2)
bankruptcy_filedcustomer_collections_metadata.bankruptcy_filed11 USC §362 (automatic stay)
do_not_callcustomers.do_not_call OR customer_collections_metadata.do_not_callTCPA + tenant policy
deceasedcustomer_collections_metadata.collections_status = 'deceased'Internal policy

Soft warnings (agent can acknowledge and force):

  • outside_fdcpa_hours — current hour is before 8 AM or after 9 PM tenant-local. FDCPA §1692c(a)(1).
  • max_calls_per_week — collections account has hit its weekly cap.
  • sol_expired — statute of limitations has expired on the debt.

Default disposition codes

sale — Sale / Conversion
callback — Callback Requested
no_answer — No Answer
voicemail — Left Voicemail
busy — Busy
wrong_number — Wrong Number
not_interested — Not Interested
do_not_call — Do Not Call (caller request)
escalation — Escalated to Supervisor
follow_up — Follow-Up Required
completed — Issue Resolved
other — Other (see notes)

FAQ

Does Softphone Pro V2 replace Bria, Linphone, or Zoiper?

Yes for tenants on Twilio Voice. Agents place and receive calls entirely in the browser via WebRTC. The widget includes a dialpad, mute, hold, transfer, and click-to-dial from any customer record. SIP-over-WebSocket against an Asterisk/FreeSWITCH PBX is on the V3 roadmap.

Is the FDCPA / TCPA compliance gate automatic?

Yes. Before any outbound dial the engine checks the customer's compliance flags and the call hour. Hard blocks abort the dial; soft warnings open an acknowledgment modal. Every block and forced override is written to softphone_compliance_audit.

What is After-Call Work (ACW)?

ACW is the wrap-up window after a call ends, during which the agent codes the call and writes notes. The default is 30 seconds and is tenant-configurable up to 300 seconds. During ACW the agent is unavailable for new dials. The disposition is required.

How are SIP credentials protected?

V2 stores SIP passwords encrypted at rest via the same CredentialsCipher class used for Stripe keys. AES-256-GCM with the tenant_id mixed into the AAD so a leaked ciphertext from tenant A cannot be decrypted as tenant B's. The V2 migration encrypts any plaintext rows from V1 in place.

Why station binding instead of just user → phone number?

A station represents the physical seat or pod the agent is logged into. One agent can use multiple stations across the day; one station can host different agents on different shifts. Station binding decouples the user identity from the DID and the SIP registration, which is what real PBXes track.

Can agents override a soft compliance warning?

Yes for soft warnings only (outside FDCPA hours, max-calls-per-week, statute-of-limitations expired). The agent must check an acknowledgment box and the override is written to softphone_compliance_audit with forced=true. Hard blocks cannot be overridden by agents — only an admin can change the compliance flags on the customer record.

Resources