vicigeeksimple guides
Browse
All guides

Running your system · Growth signals, measured not guessed

When to outgrow VICIdial: fixable ceilings versus real reasons to leave

Most “we have outgrown VICIdial” moments are a media-port range, a missing index, or a dial level set by guesswork, each with a documented fix on this site. A smaller set of signals genuinely point toward a managed platform, including one seat-count fact, Five9’s published 50-seat minimum, that rules out a whole category of vendor before a feature ever gets compared. This article gives you the checks to tell the two apart on your own data, and prices what leaving actually costs in both directions.

Reader setup

Before you choose

List your constraints, required evidence and stop rules before you score options.

  1. Read-only database access to your own VICIdial install — see vicidial-read-only-database-account if you do not have one yet — since every signal in this article is a query away, not a guess.
  2. Your own table-growth and drop-rate trend over the last few months, not just today’s snapshot.
  3. A named owner for telephony operations today, so you know whether “no one can run this” is actually true or still just unresolved.
What you will prove
You will be able to tell, from your own database, whether a symptom that looks like outgrowing VICIdial is actually an unwidened media-port range, a missing index, or a single overloaded server, and know which few signals point toward a managed platform instead.
Safety boundary
This is a decision framework, not a benchmark, a vendor endorsement, or a migration plan; act on your own measurements, not on a number printed here.

Reader path

How to use this article

  • Use it when: You are comparing options and need decision evidence before approval.
  • Expected result: Turn options into explicit acceptance criteria and documented stop conditions.
  • Start here: Score what is mandatory, keep unknowns visible, then decide only when risks are understood.

Most “we have outgrown VICIdial” moments are a misconfigured system

Fast answer: most signals that feel like outgrowing VICIdial are a config or capacity limit with a documented fix on this site: the media-port range, one server carrying every role, an unconfigured report slave, missing indexes on high-traffic tables, and a dial level set by feel instead of measurement. A smaller set of signals genuinely point toward a managed platform: no one on staff who can own telephony after the person who built it leaves, a compliance obligation you cannot evidence, a support contract a customer or auditor requires, a channel VICIdial does not natively provide, or headcount small enough that operating a phone system is a distraction from the business itself. The difference between the two lists is measurable from your own database today, not a feeling about how big you have gotten.

This article does not tell you when to leave. It gives you the checks that separate a fixable ceiling from a real one, prices what a managed platform actually requires against a fact that ends the conversation for some readers before it starts, and lays out what leaving costs in both directions. No number here is a threshold to act on by itself; your own measurements are.

New to agent, campaign, dial level, carrier, or disposition? “VICIdial terminology for complete beginners: users, phones, campaigns and leads” defines each one before this article leans on it. Two more specific terms matter here: abandonment is a call that reached a live person but got dropped because no agent was free to take it, counted under statuses such as DROP; and channel, in this article only, means a way customers reach you other than a phone call, such as chat, email, or SMS — a different sense than "channel" meaning one simultaneous call path elsewhere on this site.

  • Read the two lists in the next section before assuming your symptom belongs on the migration side.
  • Every price attached to a vendor in this article is dated August 5, 2026 and should be reverified before budgeting.
  • This is a decision framework, not a benchmark, a migration plan, or a vendor comparison with a winner.
Trace path · read left to right
01Sort the signal: fixable or real02Measure agents, growth, and drop rate03Weigh what leaving costs both ways

Visual walkthrough

Follow three real demo screens

Captured on an isolated VICIdial demo: Administration screens on September 24, 2026, and the idle Agent screen on August 11, 2026. Each caption states its own capture time, and every sanitized image helps you recognize a related screen; none proves that this article's call, command, or result occurred.
Step 1 · Find the main areas

Start at Administration home

Sanitized VICIdial Administration home page with navigation and aggregate system counts
Captured September 24, 2026 at 21:54:37 UTC on the authorized isolated demo. This is an orientation page with aggregate counts only; it is not a report and does not prove production activity or a completed call.
Step 2 · Map system administration

Use the Administration menu as a map

Sanitized VICIdial Administration menu showing phones, carriers, servers, system settings, and system statuses
Captured September 24, 2026 at 21:34:11 UTC on the authorized isolated demo. This menu is a navigation map only; it does not show that any system-wide setting was changed or verified.
Step 3 · Read platform identity

Confirm version and system-wide context

Sanitized VICIdial Modify System Settings page showing revision, schema, interface, SIP-stack, and API-related controls
Captured August 11, 2026 at 16:22:08 UTC on the authorized isolated demo. This is a read-only view of system-wide settings with no credentials or addresses; it does not prove that a setting was changed or that an API request succeeded.

Two lists, and which one your symptom actually belongs on

Before anything else, sort what you are seeing into one of two lists. The first list is long on purpose, because it is every signal this publication has already documented a fix for: a config change, an index, a second box, or a measured pacing adjustment, not a migration project. The second list is short and narrow, because most of what looks like outgrowing VICIdial is really the first list wearing a bigger costume.

Work through both lists against your own system before reading the rest of this article, then come back to the sections that match what you actually found.

  • Match your actual symptom against a line on the first list before assuming it belongs on the second.
  • A symptom can appear on both lists at once; a genuinely small team with an unwidened media-port range still has a media-port range problem to fix first.
  • None of the lines above are a threshold to act on by themselves; they are a place to start measuring.
Sort your own symptom before you sort a migration
FIXABLE ON THIS BOX (a config or capacity change):- Calls drop only during your busiest hour, as concurrent channels approach the configured media-port range- One box runs the database, the dialer, the web tier, and reports at the same time- Reports run slow only during business hours, and reports_use_slave_db is still blank- The agent screen or hopper refresh slows as vicidial_log or vicidial_hopper grows, with no composite index on campaign_id- Connect rate fell after dial level was raised on instinct, with no measured step behind it GENUINELY WORTH A MANAGED PLATFORM:- No one on staff can own Asterisk, PJSIP, and a carrier relationship once the person who built it leaves- A compliance obligation requires evidence you cannot produce from your own infrastructure today- A customer or an auditor requires a named vendor support contract, not an internal team's word- The business needs a channel, such as native chat, email, or SMS, that VICIdial does not provide out of the box- Headcount is small enough that operating a phone system is time taken directly away from the business itself
Not executed · worksheet or reference text

This sample is a template or reading aid, not a terminal command. There is no output to show.

Before you run it
Read down both columns against your own system before you read anything else in this article.
Success looks like
Your symptom matches a line in the first column, and a documented fix for it appears later in this article.
Stop if
Your symptom only matches a line in the second column, or matches nothing on either list; treat that as a genuinely open question rather than assuming either answer.

The media-port ceiling: the most common real limit, and a config change

Every VICIdial box has a Real-time Transport Protocol (RTP) port range configured in /etc/asterisk/rtp.conf, and a firewall rule that is supposed to match it; a narrow range sets a hard ceiling on concurrent audio streams before a call has nowhere left to go. On our ViciBox 12 lab, the firewalld service that opens this traffic, named rtp, is configured for the wide UDP 10000–20000 band — but that firewall service definition is not the same thing as your own rtp.conf range, and whichever one is narrower is your real ceiling. On a single server, this is one of the first ceilings a growing campaign hits, well before the database, the web tier, or the agents themselves become the constraint.

“Elastic SIP trunking for predictive dialers: why your own media path is the real ceiling” documents this wall in full and how to widen it: a carrier’s trunk can usually carry far more concurrent calls than a single VICIdial box can, because the box’s own configured range, not the carrier, is what runs out first. Widening the range and opening the matching firewall rule is a configuration change made once, not a reason to replatform.

Confirm your own configured range and your own peak channel count before assuming this is even your problem; a box that never gets close to its configured ceiling during its busiest hour does not have a media-port problem yet, whatever else might be happening.

  • Widening the RTP range and its matching firewall rule is the fix; it is not, by itself, a reason to leave VICIdial.
  • Check this before any other capacity signal; it is the most common real ceiling and the cheapest one to move.
  • A carrier's own trunk limits are a separate question from your own box's configured range.
Check the configured RTP range against your own firewall backend
#!/bin/bashset -euo pipefailRTP_CONF=/etc/asterisk/rtp.confecho 'Configured RTP range:'grep -E '^(rtpstart|rtpend)=' "$RTP_CONF"echo 'Firewall backend and its rule for that range:'if systemctl is-active --quiet firewalld 2>/dev/null; then  echo 'firewalld is active:'; firewall-cmd --info-service=rtpelif [ -x /usr/bin/VB-firewall ]; then  echo 'VB-firewall is present; cross-check the kernel table:'; iptables -S | grep -E 'udp.*dport'elif command -v ufw >/dev/null 2>&1; then ufw statuselse echo 'No known firewall backend detected; inspect iptables -L -n directly.'; iptables -L -n; fiecho 'Current channel count:'asterisk -rx 'core show channels count' 
Evidence · ViciBox 12 demo capture

Captured demo response · 2026-09-24 22:25 UTC. The displayed command is the command that ran; a safe subset label means it was filtered, redacted, or fixture-scoped. Replays only after you select Replay transcript.

Command output line: #!/bin/bash set -euo pipefail RTP_CONF=/etc/asterisk/rtp.conf echo 'Configured RTP range:' grep -E '^(rtpstart|rtpend)=' "$RTP_CONF" echo 'Firewall backend and its rule for that range:' if systemctl is-active --quiet firewalld 2>/dev/null; then echo 'firewalld is active:'; firewall-cmd --info-service=rtp elif [ -x /usr/bin/VB-firewall ]; then echo 'VB-firewall is present; cross-check the kernel table:'; iptables -S | grep -E 'udp.*dport' elif command -v ufw >/dev/null 2>&1; then ufw status else echo 'No known firewall backend detected; inspect iptables -L -n directly.'; iptables -L -n; fi echo 'Current channel count:' asterisk -rx 'core show channels count'
Configured RTP range:
rtpstart=10000
rtpend=20000
Firewall backend and its rule for that range:
firewalld is active:
rtp
ports: 10000-20000/udp
protocols:
source-ports:
modules:
destination:
includes:
helpers:
Current channel count:
0 active channels
0 active calls
2 calls processed
Before you run it
Run this locally on the box that carries the calls; RTP_CONF points at the standard Asterisk configuration path on a VICIdial install. The script checks firewalld first, then VB-firewall, then a bare ufw or iptables fallback, since ViciBox ships firewalld and VB-firewall rather than ufw.
Success looks like
rtpstart and rtpend show your actual configured range, your active firewall backend's own rule or service definition matches it, and the channel count stays comfortably under that range during your busiest hour.
Stop if
If the range is narrow relative to your peak channel count, widen it and its matching firewall rule before treating this as a reason to migrate.

One server doing every role, and a table that only ever grows

A second common signal is architectural rather than numeric: one box running the database, the dialer, the web tier, and reports all at once, all reading and writing the same tables under load. Reports slow the agent screen down, and a growing vicidial_log slows both. None of that means VICIdial cannot carry your volume; it usually means one role needs its own hardware.

“Scaling VICIdial: designing a multi-server cluster for 500+ agents” walks through splitting those roles apart and what shared state has to stay consistent across the split. That is a real project, but it is a hardware and configuration project with a documented path, not a migration off the platform.

Table growth is the numeric half of the same signal. vicidial_log and the hopper tables grow every day a campaign runs, and a table that has never been archived behaves very differently at month one than at month twelve. Measure your own growth rate before assuming today's query time is where it will stay.

  • Splitting the database, web tier, and reporting roles onto separate hosts is a documented hardware change, not a migration.
  • Measure your own row-growth trend before assuming today's slow query is where performance will stay.
  • An archived table and a split role often resolve a symptom that looked like an architecture ceiling.
Measure your own table growth before assuming a ceiling
SELECT DATE_FORMAT(call_date, '%Y-%m') AS call_month, COUNT(*) AS call_rowsFROM vicidial_logWHERE campaign_id = '<CAMPAIGN_ID>'  AND call_date >= DATE_SUB(NOW(), INTERVAL 6 MONTH)GROUP BY call_monthORDER BY call_month;
Evidence · ViciBox 12 demo capture · demo values substituted

Captured demo response · 2026-09-24 22:25 UTC. The displayed command is the command that ran; a safe subset label means it was filtered, redacted, or fixture-scoped. Replays only after you select Replay transcript.

Command output line: SELECT DATE_FORMAT(call_date, '%Y-%m') AS call_month, COUNT(*) AS call_rows FROM vicidial_log WHERE campaign_id = 'KPISYN1' AND call_date >= DATE_SUB(NOW(), INTERVAL 6 MONTH) GROUP BY call_month ORDER BY call_month;
(no output)
Before you run it
Run this with a read-only account, for example mysql --defaults-extra-file=/etc/vicidial-readonly.cnf, outside your busiest hour so the query itself does not compete with live dialing. This lab scopes the query to one fixture campaign for a safe capture; on your own install, drop the campaign_id filter for your whole table's growth, and run SHOW TABLE STATUS LIKE 'vicidial_log' alongside it for the table's current size.
Success looks like
You have a month-by-month row count, showing whether growth is linear, accelerating, or already leveling off after an archival job; add SHOW TABLE STATUS on your own install to see the table's current size as well. On our ViciBox 12 lab the idle KPISYN1 fixture campaign has never placed a call, so this query returns zero rows here with no months listed at all - zero rows means no calls in the window, not flat growth, so on a real campaign read an all-empty result as too narrow a window or a campaign that has not started dialing yet, never as proof growth has stopped.
Stop if
If call_rows keeps climbing every month with no archival step anywhere in your maintenance schedule, growth alone is not a reason to migrate; it is a reason to schedule the archival job this table is missing. A climb needs months with real rows to show up at all - an all-empty result, as on our idle lab fixture, is the no-data case above, not a climb and not evidence growth has leveled off.

Missing indexes and an unconfigured report slave

The schema this site ships is honest about where it stops short. vicidial_hopper carries an index only on lead_id; vicidial_live_agents indexes random_id, last_call_time, last_update_time, and last_call_finish; vicidial_log indexes lead_id and call_date alone. None of the three carries a composite index on campaign_id together with status or call_date, which is exactly the pair most agent-screen and hopper queries filter on under load.

system_settings also ships slave_db_server and reports_use_slave_db fields for exactly this situation: pointing reports at a replica so they stop competing with live dialing for the same tables. A blank value in either field means the report slave was never configured, not that VICIdial cannot support one.

Adding a composite index and pointing reports at a slave are both configuration changes with a documented shape. Confirm what your own schema actually has before treating a slow report or a sluggish agent screen as a capacity ceiling.

  • A missing composite index on campaign_id together with status or call_date is a schema change, not a platform ceiling.
  • A blank slave_db_server field means the report slave was never turned on, not that it does not exist.
  • Check your own schema directly; a customized install may already have added what the shipped schema lacks.
Check your own indexes and report-slave configuration
SELECT TABLE_NAME, INDEX_NAME, COLUMN_NAME, SEQ_IN_INDEX FROM information_schema.STATISTICSWHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME IN ('vicidial_hopper', 'vicidial_live_agents', 'vicidial_log')ORDER BY TABLE_NAME, INDEX_NAME, SEQ_IN_INDEX; SELECT COALESCE(CHAR_LENGTH(slave_db_server), 0) > 0 AS slave_db_server_is_set, reports_use_slave_dbFROM system_settingsLIMIT 1;
Evidence · ViciBox 12 demo capture

Captured demo response · 2026-09-24 22:25 UTC. The displayed command is the command that ran; a safe subset label means it was filtered, redacted, or fixture-scoped. Replays only after you select Replay transcript.

Command output line: SELECT TABLE_NAME, INDEX_NAME, COLUMN_NAME, SEQ_IN_INDEX FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME IN ('vicidial_hopper', 'vicidial_live_agents', 'vicidial_log') ORDER BY TABLE_NAME, INDEX_NAME, SEQ_IN_INDEX;
+----------------------+------------------+------------------+--------------+
| TABLE_NAME | INDEX_NAME | COLUMN_NAME | SEQ_IN_INDEX |
+----------------------+------------------+------------------+--------------+
| vicidial_hopper | lead_id | lead_id | 1 |
| vicidial_hopper | PRIMARY | hopper_id | 1 |
| vicidial_live_agents | last_call_finish | last_call_finish | 1 |
| vicidial_live_agents | last_call_time | last_call_time | 1 |
| vicidial_live_agents | last_update_time | last_update_time | 1 |
| vicidial_live_agents | PRIMARY | live_agent_id | 1 |
| vicidial_live_agents | random_id | random_id | 1 |
| vicidial_live_agents | vlali | lead_id | 1 |
| vicidial_live_agents | vlaus | user | 1 |
| vicidial_log | call_date | call_date | 1 |
| vicidial_log | lead_id | lead_id | 1 |
| vicidial_log | PRIMARY | uniqueid | 1 |
+----------------------+------------------+------------------+--------------+
Command output line: SELECT COALESCE(CHAR_LENGTH(slave_db_server), 0) > 0 AS slave_db_server_is_set, reports_use_slave_db FROM system_settings LIMIT 1;
+------------------------+----------------------+
| slave_db_server_is_set | reports_use_slave_db |
+------------------------+----------------------+
| 0 | |
+------------------------+----------------------+
Before you run it
Run this read-only, for example mysql --defaults-extra-file=/etc/vicidial-readonly.cnf, against your own install; a customized deployment can differ from the shipped schema if anyone has already added an index. The last statement reports whether slave_db_server is set rather than selecting its value, so a captured run never prints a real hostname.
Success looks like
You can see, for your own tables, whether a composite index on campaign_id together with status or call_date already exists, and whether slave_db_server_is_set is 1 or 0 and reports_use_slave_db is populated.
Stop if
A slave_db_server_is_set value of 0, or a missing composite index, explains slow reports and a sluggish agent screen without VICIdial itself being the limit; add the index and configure the slave before pricing a migration over it.

Dial level set by guesswork, not measurement

A rising abandonment rate often gets read as outgrowing the system, when the more common cause is a dial level or answering machine detection (AMD) setting raised on instinct and never revisited against the number it actually produces. VICIdial dials exactly as aggressively as it is told to; a ratio picked to fill a shift, rather than measured against connect and drop rate, produces exactly the abandonment problem it looks like it is causing.

“Optimize VICIdial dial ratios and AMD for better connection rates” documents how dial level and AMD interact to create or destroy connected calls, and how to raise the ratio in measured steps with a stop point instead of guessing at the next number. That is a tuning exercise run on your own traffic, not a sign the platform has a ceiling.

Trend your own drop rate before deciding whether this is a tuning problem or something else. A drop rate that tracks a specific pacing change is a tuning problem. A drop rate that keeps climbing after pacing has been left alone is a different question.

  • A drop rate that moves with a specific pacing change is a tuning problem, not a growth problem.
  • Raise dial level in measured steps against your own connect and drop rate, not by feel.
  • Confirm the status codes your own dialplan uses for a dropped call before trusting one status filter.
Trend your own drop rate over the last two weeks
SELECT DATE_FORMAT(call_date, '%Y-%m-%d') AS call_day,       COUNT(*) AS total_calls,       SUM(CASE WHEN status = 'DROP' THEN 1 ELSE 0 END) AS dropped_calls,       ROUND(100 * SUM(CASE WHEN status = 'DROP' THEN 1 ELSE 0 END) / COUNT(*), 2) AS drop_rate_pctFROM vicidial_logWHERE campaign_id = '<CAMPAIGN_ID>'  AND call_date >= DATE_SUB(NOW(), INTERVAL 14 DAY)GROUP BY call_dayORDER BY call_day;
Evidence · ViciBox 12 demo capture · demo values substituted

Captured demo response · 2026-09-24 22:25 UTC. The displayed command is the command that ran; a safe subset label means it was filtered, redacted, or fixture-scoped. Replays only after you select Replay transcript.

Command output line: SELECT DATE_FORMAT(call_date, '%Y-%m-%d') AS call_day, COUNT(*) AS total_calls, SUM(CASE WHEN status = 'DROP' THEN 1 ELSE 0 END) AS dropped_calls, ROUND(100 * SUM(CASE WHEN status = 'DROP' THEN 1 ELSE 0 END) / COUNT(*), 2) AS drop_rate_pct FROM vicidial_log WHERE campaign_id = 'KPISYN1' AND call_date >= DATE_SUB(NOW(), INTERVAL 14 DAY) GROUP BY call_day ORDER BY call_day;
(no output)
Before you run it
Run this read-only, for example mysql --defaults-extra-file=/etc/vicidial-readonly.cnf, with your own campaign_id in place of <CAMPAIGN_ID>, and confirm which status codes your own dialplan actually uses for a dropped call against the official statuses reference before trusting one status filter.
Success looks like
You have a day-by-day drop rate for the last two weeks, which lines up, or does not, against any pacing change made on the same dates. On our ViciBox 12 lab the KPISYN1 fixture campaign is idle, so every day in the window returns zero total_calls here and the query prints no rows at all; zero rows means nothing to trend yet, not a steady or an improving drop rate.
Stop if
If the drop rate climbs on days with no pacing change at all, treat this as an open question rather than a pacing fix; it may not belong on the fixable list. A climb only shows up once days with real call volume exist to compare - an all-empty result across the whole window, as on our idle lab fixture, is the nothing-to-trend case above, not a climb, and not proof pacing is fine either.

Tell the difference with your own numbers, not a feeling

Every signal above has a number attached to it: a channel count against a configured range, a row-growth trend, an index that either exists or does not, a drop rate that either tracks a pacing change or does not. The same discipline applies to the harder question of whether you have actually outgrown the platform rather than a particular box or setting: measure your own distinct-agent count and your own peak concurrency, and compare both against whatever plan or platform you are considering, before either number becomes a feeling.

Distinct agents and peak concurrency are not the same number, and mixing them up produces bad comparisons in both directions. Distinct agents is how many different people log in over a period, the number a seat-based quote actually prices. Peak concurrency is how many are logged in at the exact same moment, the number that matters for a channel ceiling or a database load question. A campaign with 40 distinct agents working staggered shifts might never have more than 15 logged in at once.

  • Distinct agents prices a seat-based quote; peak concurrency prices a capacity ceiling. Do not compare a plan's price against the wrong one.
  • Measure peak concurrency during your actual busiest hour, not an average one.
  • A flat distinct-agent count with rising peak concurrency often means shift scheduling, not headcount growth.
Measure distinct agents against peak concurrency
SELECT COUNT(DISTINCT user) AS distinct_agents_last_30_daysFROM vicidial_logWHERE campaign_id = '<CAMPAIGN_ID>'  AND call_date >= DATE_SUB(NOW(), INTERVAL 30 DAY); SELECT COUNT(*) AS agents_logged_in_right_nowFROM vicidial_live_agentsWHERE campaign_id = '<CAMPAIGN_ID>'  AND status IN ('READY','INCALL','QUEUE','PAUSED');
Evidence · ViciBox 12 demo capture · demo values substituted

Captured demo response · 2026-09-24 22:25 UTC. The displayed command is the command that ran; a safe subset label means it was filtered, redacted, or fixture-scoped. Replays only after you select Replay transcript.

Command output line: SELECT COUNT(DISTINCT user) AS distinct_agents_last_30_days FROM vicidial_log WHERE campaign_id = 'KPISYN1' AND call_date >= DATE_SUB(NOW(), INTERVAL 30 DAY);
+------------------------------+
| distinct_agents_last_30_days |
+------------------------------+
| 0 |
+------------------------------+
Command output line: SELECT COUNT(*) AS agents_logged_in_right_now FROM vicidial_live_agents WHERE campaign_id = 'KPISYN1' AND status IN ('READY','INCALL','QUEUE','PAUSED');
+----------------------------+
| agents_logged_in_right_now |
+----------------------------+
| 0 |
+----------------------------+
Before you run it
Run both statements read-only, for example mysql --defaults-extra-file=/etc/vicidial-readonly.cnf; run the second query again during your actual busiest hour, not an average one, since a single snapshot can understate peak concurrency. This lab scopes both statements to one fixture campaign for a safe capture; on your own install, drop the campaign_id filter for an org-wide total.
Success looks like
You have a real distinct-agent count to weigh against a seat-based minimum, and a real peak-concurrency number to weigh against a channel or capacity ceiling, instead of a headcount estimate.
Stop if
If peak concurrency keeps sitting close to your configured channel ceiling while distinct agents stays flat, that is closer to a capacity signal than a growth signal; revisit the media-port section before pricing a migration.

The signals that actually favor a managed platform

A smaller set of signals do not have a documented fix on this site, because they are not a VICIdial problem. No one on staff can own Asterisk, PJSIP, and a carrier relationship once the person who built the system leaves. A compliance obligation requires evidence you cannot currently produce from your own infrastructure. A customer or an auditor requires a named vendor support contract, not an internal team's word. The business needs a channel VICIdial does not natively provide, such as native chat, email, or SMS, rather than one bolted on through an integration. Or headcount is small enough that operating a phone system at all is time taken directly away from the business it exists to serve.

Two of these are worth pricing against real numbers before acting on a feeling. Five9's own pricing page, accessed August 5, 2026, publishes Digital at $119 per seat per month and Core at $159 per seat per month, both behind a published minimum of 50 seats; Plus, Pro, and Enterprise are quote-only. A team of 15 agents cannot buy a published Five9 plan at all, whatever else is true about the comparison, and that fact should end that particular conversation before a sales call, not after one. Below 50 seats, Talkdesk's own pricing page, also accessed August 5, 2026, publishes Talkdesk Express: a free trial with 25 licenses plus a $100 credit, no contract required, for businesses under 50 employees in the United States and Canada only.

The channel signal has its own published comparison. Amazon Web Services' own pricing page, accessed August 5, 2026, states plainly that Amazon Connect carries “no seat-based licensing requirements”: voice runs $0.038 per minute plus standard telephony rates, chat $0.010 per message, email $0.080 per message, and SMS or third-party messaging $0.014 per message, all usage-based with no minimum commitment. That is the closest published pricing shape to VICIdial's own economics, paying for usage rather than for seats, and it is also a native answer to a channel gap in a way an integration bolted onto VICIdial is not.

“Five9 vs VICIdial: the seat minimum decides first,” “Talkdesk vs VICIdial: the true cost of self-hosting,” and “Amazon Connect vs VICIdial: no seat license on either side” each work through one of these comparisons in full, with the same rule this article follows: a published price dated to when it was read, and no vendor declared better. “VICIdial alternatives: an operator test matrix, not a ranking” sets up how to test a candidate platform against your own workflows, rather than a features table, once a signal here turns out to be real.

  • Price a seat-based quote against your own agent count before anything else; Five9's own 50-seat minimum makes some quotes unpurchasable outright.
  • A channel VICIdial does not natively provide is a genuine signal; an integration that already covers it is not.
  • Reverify every vendor price above directly with the vendor; published rates change without much notice.

What it actually costs to leave, in both directions

Moving onto a managed platform means re-platforming campaigns, scripts, and integrations, retraining agents on a new screen, and porting phone numbers and carrier relationships across on the vendor's contract timeline rather than yours. None of that is priced on a pricing page; all of it is real, whether the move turns out to be right or not.

Moving off a managed platform later is the same category of work in reverse, plus whatever the contract says about exporting configuration, call history, and recordings, and however long that export actually takes once you need it. A seat-based contract also usually carries a term; check it before assuming a month-to-month flexibility that was never actually offered.

Self-hosted VICIdial carries the opposite shape of lock-in: there is nothing to export from a vendor when you leave, because you already hold the database, the recordings, and the configuration, but there is also nowhere else to point when something breaks. That is not a reason to stay any more than it is a reason to leave; it is a cost that runs in the other direction and belongs in the same comparison.

“Managed VICIdial hosting vs self-hosting: a decision framework, not a vendor ranking” maps the shared-responsibility split in detail, patching, certificates, firewall rules, database care, recordings, access review, monitoring, and incident response, so each item has a named owner on one side of the decision or the other before you commit to either one.

  • Get the contract's data, recording, and configuration export terms in writing before you need them, not after.
  • Self-hosting carries its own lock-in shape: nothing to export, but nowhere else to point when something breaks.
  • Budget a migration in either direction as a project with a defined cutover, not a weekend task.

Evidence ledger

Verification basis

  • Five9’s per-seat prices, tier names, and 50-seat minimum are quoted verbatim from Five9’s own pricing page, accessed August 5, 2026.
  • Talkdesk’s per-user tiers and the Talkdesk Express free-trial terms are quoted verbatim from Talkdesk’s own pricing page, accessed August 5, 2026; Talkdesk’s page does not publish a minimum seat count or contract length, so none is asserted here.
  • Amazon Connect’s usage-based rates and its statement of no seat-based licensing requirements are quoted verbatim from Amazon Web Services’ own pricing page, accessed August 5, 2026.
  • On our ViciBox 12 lab, firewalld's shipped rtp service opens UDP 10000–20000; that describes this build's firewall service definition, not a fixed architectural limit of VICIdial or Asterisk, and it is not the same value as whatever rtpstart/rtpend your own /etc/asterisk/rtp.conf actually configures — confirm both independently rather than assuming one implies the other.
  • The missing composite indexes on vicidial_hopper, vicidial_live_agents, and vicidial_log, and the report-slave fields on system_settings, are this publication's own earlier schema review, not a live capture from the ViciBox 12 lab; confirm both against your own installation's SHOW INDEX and SHOW COLUMNS output before treating them as still accurate.
  • No total-cost figure for a VICIdial deployment appears anywhere in this article, and no vendor is ranked or declared better; hosting, carrier rates, and staffing vary too much across operators for a single number to be honest.

Primary references

Sources

  1. Five9 pricingFive9 · accessed August 5, 2026
  2. Talkdesk pricingTalkdesk · accessed August 5, 2026
  3. Amazon Connect pricingAmazon Web Services · accessed August 5, 2026
  4. VICIdial PJSIP SupportVICIdial · accessed August 5, 2026
  5. VICIdial Statuses reference (VICIDIAL_statuses.txt)VICIdial · accessed August 5, 2026

Follow without guesswork

Get the next article

RSS is live now. Email delivery below is an explicit local preview and sends nothing.Open the RSS feed
Email preview only. The address stays in this browser and is never transmitted.