Product changelog

One year of building —
what shipped and why

The full story of Lumifone from a blank project to a production SaaS: calling, teams, billing, CRM, leads, recordings, and everything in between. June 2025 → June 2026.

June 2025 — The project begins

Jun 1–7, 2025
v0
Feature

Lumifone v0 — browser-based calling SaaS born

Started from a single request: build a SaaS platform with auth, payments, and browser-based outbound calling. The initial plan laid out a complete architecture covering authentication, a wallet/credits system, a dialer, number management, and a transaction history. Not a prototype — a full product plan from day one.

Phase 1 kicked off immediately: backend edge functions, voice SDK integration via WebRTC, and the foundational database schema. The very first hurdle was the token generation function — getting the auth payload in the exact format the telephony provider expects proved tricky before everything clicked.

  • Email-based auth (login + signup)
  • Voice SDK in the browser for outbound calls
  • Voice app configured with POST webhooks on serverless edge functions
  • First working call placed and received
Jun 8–14, 2025
Fix

Double-ring bug — callers were hearing themselves call themselves

First major call quality bug: when a call connected, the recipient was immediately hit with a second call and heard a hold message — as if they were the one initiating. Root cause was a voice markup routing loop. Fixed the call flow so outbound calls only create one leg, on the right side of the connection.

Late June → July 2025 — Credits, calls, teams

Jun 15–30, 2025
Feature

Dollar-based credit wallet — call costs by country, not flat rate

The credit system was rebuilt from arbitrary units to real dollar amounts. Each country you dial now has its own per-minute rate (e.g. USA at $0.02/min, Poland at $0.30/min). Credits are deducted based on actual call duration and destination. Balance is visible at all times and calls are checked against it before connecting — if you're out of credits, you can't call.

Jul 1–14, 2025
Feature

Teams — invite up to 50 members, shared wallet, shared numbers

Account owners can now build a team of up to 50 members. Team members share the account owner's wallet balance — no separate top-ups per person. Invitations go out by email: the invite link opens a custom signup page that shows the team name, locks the email field, and automatically places the new user under the inviting account upon signup.

Getting here involved several rounds of fixing: permission policy violations blocking team member inserts, invited users not appearing in the owner's team dashboard, and invited members not being able to see the shared balance. All resolved.

Jul 15–31, 2025
Feature

Dedicated phone numbers — buy, assign, cancel, forwarding

Users can purchase dedicated phone numbers (USA, UK, Canada) via subscription checkout. Numbers are provisioned automatically on payment success via a payment webhook. Account owners can assign numbers to specific team members, set up call forwarding to any external number, and cancel subscriptions — with a clear warning that cancellation is immediate.

  • Subscription drives monthly billing; number is released on cancellation
  • Country picker limited to USA, UK, Canada
  • Forwarding configured per number with automatic sync to telephony provider
  • Both shared and dedicated numbers visible on the dialer's caller ID selector

August 2025 — Navigation, UX, /rates, dashboard

Aug 1–14, 2025
UX

Navigation overhaul — dialer as homepage, profile menu, phone numbers in nav

The app's information architecture was reworked so users land directly on the dialer after login — not a dashboard with charts they haven't earned yet. Phone numbers moved to the top nav bar for quick access. The logout button was replaced with a profile icon showing email, balance (clickable to open transactions), and subscription tier pill. Billing, rates, and team management were tucked under the profile menu to reduce clutter.

Aug 15–31, 2025
Feature

/rates page — live pricing, per-country lookup

A public-facing rates page lets users check the per-minute cost before dialing any country. Rates are pulled from the telephony provider's pricing API and stored, with a markup applied. When a user dials a number, the system looks up the rate dynamically, shows it before the call connects, and uses it to calculate exact credit deductions per minute.

September 2025 — Contacts, CSV import, click-to-call

Sep 1–20, 2025
Feature

Contacts — lists, CSV import with column mapping, click-to-call

A full contacts module launched. Users can add contacts manually (name, phone, company, email, notes) or import them from CSV with a column mapping UI. From any contact — on the /contacts page or inside an open contact card — a single click pre-fills the dialer and redirects to /call. Contacts are organized into lists; deleting a list also deletes its contacts (with a confirmation prompt).

The contacts sidebar on the /call page slides open on demand — the dialer shifts left and the contact list appears alongside it. Horizontally scrollable, with click-on-row to populate the dialer number.

October 2025 — SMB Leads, call recording, mid-call DTMF

Oct 1–14, 2025
Feature

SMB Leads module — business search with credits-per-lookup

An external SMB leads search module was imported and fully integrated. Users can search for businesses, view contact information, save leads to lists, and import them directly to contacts. Each API request costs credits from the wallet (later changed to 0.5 per result returned). Batch-saving leads was optimized from one-network-call-per-lead to a single bulk operation.

Oct 15–31, 2025
Feature

Call recording — per-call opt-in, cloud storage, playback in the app

Users can now toggle recording on a per-call basis before dialing. Recordings are stored in the cloud and surfaced in the recent calls table — playable directly in the platform without leaving the page. Auto-deletion after 30 days to control storage costs. Mid-call DTMF dialpad added simultaneously, so users can navigate IVR menus (press 1 for sales, etc.) without hanging up.

November 2025 — Answered/unanswered detection (a saga)

Nov 1–30, 2025
Fix

Call status detection — unanswered calls were billing and showing as answered

One of the longest debugging threads in the project. The telephony provider sends a completed status and a non-zero duration for unanswered calls (because the connection itself has duration even with no answer), which was causing the webhook to mark everything as answered and charge the user. Multiple rounds of fixes:

  • First fix: check the dial leg's status instead of the outer call status — but the child call's status wasn't arriving in the initial webhook payload
  • Second fix: restructured the voice markup to use a dial verb with a status callback, capturing the child call's outcome separately
  • Final fix: billing logic anchored to dial status being 'answered' AND dial duration > 0. Unanswered, busy, failed, and voicemail calls no longer deduct credits.

An 'answered' column was added to the recent calls table so users can see at a glance which calls connected.

December 2025 — Dashboard, DB polling optimization, subscription plans

Dec 1–15, 2025
Feature

Dashboard analytics — call volume, answered vs unanswered, per-caller breakdowns

The /dashboard page got real charts and visualizations: calls answered vs unanswered over time, per-caller performance, total minutes, credit spend trends. Each team member sees their own recent calls rather than the entire account's history. Built on the existing call data — no new data pipeline needed, just surfacing what was already being logged.

Dec 16–31, 2025
Infrastructure

Polling overhaul — 1,440 edge function calls/day down to scheduled intervals

The app was hammering the backend with constant polling: contact lists, calls, phone numbers, wallets, contacts — all on short timers. With zero production users, it was already racking up 1,440+ invocations per day. Replaced aggressive client polling with scheduled intervals and smarter cache invalidation so the system breathes at rest.

Dec 16–31, 2025
Feature

Monthly subscription — $9/month for 180 credits, auto-renewing

A recurring subscription tier was added: $9/month gives users 180 credits that replenish automatically each billing cycle. Credits are separate from the wallet balance used for calls — subscription credits roll in monthly, one-time top-ups go in on purchase. Users who cancel still keep credits until the end of the billing period.

January 2026 — Isolated accounts, security overhaul

Jan 1–20, 2026
InfrastructureSecurity

Isolated telephony accounts — every user gets their own sandboxed environment

The single biggest architectural change. Previously, every user's calls, numbers, and credentials ran through the master telephony account — meaning one bad actor could get the entire platform suspended. The fix: each user who signs up and buys a number or verifies a caller ID now gets their own isolated account, automatically provisioned.

  • Numbers purchased under the user's own isolated account — not the master
  • Voice apps and API keys created per-account
  • Team members share the team owner's account (not their own)
  • Shared numbers remain on the master; dedicated numbers are isolated per-user
  • If a user's account gets flagged, it doesn't touch anyone else
Jan 20–31, 2026
SecurityInfrastructure

Full security audit — access policies, webhook validation, client-side checks removed

A full code review targeting 1,000-user readiness. Critical access policies that were missing or too permissive were fixed — no user should be able to read another's contacts, calls, wallet, or team data. Webhook signature validation added to prevent spoofed incoming requests. All credit-balance checks moved server-side; client-side checks (inspect-able via browser dev tools) removed entirely.

February 2026 — Forwarding fix, caller ID display, country codes, call credit cut-off

Feb 1–15, 2026
Fix

Call forwarding — application error on forwarded numbers, random caller ID

Call forwarding was broken in two ways: (1) calls to forwarding-enabled numbers played an application error message and hung up, traced back to the forwarding configuration not using the correct isolated credentials for numbers owned by sub-accounts; (2) the receiving end sometimes saw a random system number instead of the user's dedicated number. Both fixed by ensuring forwarding config always uses the correct account's voice app and credentials.

Feb 16–28, 2026
Feature

Caller name registration, credit cut-off mid-call, country code picker

Three meaningful additions shipped together:

  • Caller name: users can register a display name for their dedicated number (e.g. "Acme Sales") that shows on the recipient's screen instead of a raw number
  • Credit cut-off: calls are now terminated mid-call if the user's balance runs out — a monitor runs during active calls and hangs up when credits hit zero
  • Country code picker: instead of typing "+1" every time, users pick from a searchable popover of country codes. Selecting one pre-fills the code; pasting a full international number auto-detects the code. A limit was added to prevent calling countries not supported by the account's setup.

March 2026 — Transactional email, annual plans, scripts, inbound SMS

Mar 1–14, 2026
Feature

Transactional email — team invites, confirmations

Email delivery was set up with a custom domain. Team invitations, password resets, and billing confirmations now arrive reliably from a branded address. The invite email flow was fully rebuilt: click the link → see the team name → set password → account created and linked to the team automatically.

Mar 15–31, 2026
Feature

Annual subscription plans — 20% discount, billed upfront

Annual versions of all subscription tiers were added: same monthly credits, 20% cheaper, billed as a single payment 12 months in advance. Useful for users who know they'll be calling at scale and want to lock in savings. Credit structure clarified: subscription credits (monthly/annual) are separate from one-time top-up packs, and phone number purchases don't include any credits.