·13 min·1 views

FreePBX Call Center Reporting: What Actually Works (and What Wastes Your Time)

FreePBX built-in reporting covers 1 of 7 essential call center questions. Here is what to set up instead - with SQL queries, AMI configs, and an honest tool comparison.

A
Astervis
Engineering & product team

I have set up call center reporting on FreePBX more times than I can count. The pattern is always the same: someone installs FreePBX, gets the queues running, and then asks "where are my reports?"

The answer is uncomfortable. FreePBX's built-in reporting is not designed for call center operations. It is designed for a PBX that happens to have queues.

That distinction matters more than most teams realize until they are three months in and cannot answer basic questions like "what is our average wait time by hour?"

My take: FreePBX is the best open-source PBX management interface available. But treating its reporting modules as call center analytics is like using a spreadsheet as a CRM - it technically works, and it will technically hold you back.


What FreePBX Actually Gives You (Honest Assessment)

Before you spend time evaluating external tools, understand exactly what ships with FreePBX. Some of it is better than people think. Most of it is worse.

CDR Reports Module (Free, Built-in)

This is what most people discover first. It queries Asterisk's cdr table and presents it through a web interface.

What it does well:

  • Call history lookup by date range, extension, or DID
  • CSV export for offline analysis
  • Basic call duration statistics

What it cannot do:

  • Show queue-specific metrics (calls are logged by channel, not by queue context)
  • Track agent state transitions (login, pause, available, wrap-up)
  • Calculate SLA compliance
  • Display anything in real time

Here is the SQL that FreePBX CDR runs under the hood:

-- This is essentially what FreePBX CDR module queries SELECT calldate, src, dst, duration, billsec, disposition, channel, dstchannel FROM cdr WHERE calldate BETWEEN '2026-04-01' AND '2026-04-02' ORDER BY calldate DESC;

Notice what is missing: no queue_log join, no agent identification, no wait time calculation. The CDR module operates on a completely separate data source from your queue operations.

My take: CDR reports are fine for billing reconciliation and basic "did this call happen" lookups. They are not call center reporting. If someone tells you CDR reports cover your analytics needs, they have not run a call center.

Queue Reports (Commercial Module - $149)

Sangoma sells a Queue Reports module that many teams buy expecting it to solve their reporting problems.

What it adds over CDR:

  • Queue-level call counts (answered, abandoned, timed out)
  • Agent login duration tracking
  • Basic wait time averages

What still does not work:

  • No real-time dashboard (data refreshes on page load, not live)
  • Wait time averages hide the distribution - you cannot see that 80% of calls wait 10 seconds while 20% wait 4 minutes
  • No correlation between agent performance and queue outcomes
  • No heatmaps or pattern visualization
  • Cannot compare performance across time periods

The $149 is a one-time purchase, which is reasonable. But the capability gap between what it provides and what a 20-agent call center actually needs is significant.

UCP (User Control Panel)

UCP is agent-facing. It shows personal call history, voicemail, and presence. It is not a reporting tool and I will not pretend it is one.


The FreePBX Reporting Gap (With Numbers)

Here is a practical example. A 15-agent FreePBX call center needs to answer these questions daily:

QuestionFreePBX CDRQueue Reports ($149)External Analytics
How many calls did we handle today?Partial (no queue filter)YesYes
What is our SLA compliance right now?NoNo (no real-time)Yes
Which agent has the highest AHT?NoPartial (login time only)Yes
What hour has the most abandoned calls?NoNo (no hourly breakdown)Yes
Are we staffed correctly for tomorrow?NoNoYes
Which trunk is at capacity?NoNoYes
How does this week compare to last week?Manual CSV exportNoYes

6 out of 7 questions require an external tool. The one question FreePBX partially answers (call count) still requires manual filtering.


Setting Up Real Reporting on FreePBX

Step 1: Enable Queue Logging (Critical - Most Skip This)

FreePBX queue logging is not fully enabled by default. Without it, no external tool can help you.

In FreePBX Admin, go to Applications > Queues, then for each queue:

  1. Under Advanced tab:

    • Event When Called: Yes
    • Event Membership: Yes
    • Queue Logging: Yes (this is the one people miss)
  2. Under Timing & Agent Options:

    • Wrap-Up Time: Set to your actual wrap-up target (default 0 means no tracking)
    • Member Delay: 0 (unless you need announcement before connecting)

Then verify logging is working:

# Check that queue_log is being written tail -20 /var/log/asterisk/queue_log # You should see entries like: # 1774000000|1774000001|support|CONNECT|15|SIP/200|12 # 1774000012|NONE|support|ADDMEMBER|SIP/201

If queue_log is empty, check your Asterisk configuration:

; /etc/asterisk/logger.conf ; Make sure queue_log is enabled [logfiles] queue_log => queue_log
# After changes: fwconsole restart # Or if you want to avoid dropping calls: asterisk -rx "logger reload"

My take: I estimate 40% of FreePBX call centers have incomplete queue logging. They discover this 3 months in when someone asks "why is the data missing?" Fix it now.

Step 2: Configure AMI for External Tools

Every external monitoring tool connects through Asterisk Manager Interface (AMI). FreePBX manages this, but you need to create a dedicated user.

Go to Settings > Asterisk Manager Users in FreePBX, or edit directly:

; /etc/asterisk/manager.conf (managed by FreePBX - use GUI when possible) [monitoring] secret = generate_a_32_char_password_here deny = 0.0.0.0/0.0.0.0 permit = 10.0.0.0/255.255.255.0 ; Your monitoring server subnet read = system,call,log,agent,reporting write = system,call,agent,reporting writetimeout = 5000

Security note: never use permit = 0.0.0.0/0.0.0.0 in production. Restrict to your monitoring server's IP or subnet. AMI with open access is how PBX systems get compromised.

# Test AMI connection from your monitoring server telnet freepbx-server 5038 # Then type: Action: Login Username: monitoring Secret: your_password # You should get: Response: Success # Then test queue data: Action: QueueStatus Queue: your_queue_name

Step 3: Set Up Database Access for Historical Reporting

For historical analytics, external tools need access to the CDR and queue_log databases. FreePBX uses MySQL/MariaDB:

# Create a read-only database user for analytics mysql -u root -p CREATE USER 'analytics'@'monitoring-server-ip' IDENTIFIED BY 'secure_password'; GRANT SELECT ON asteriskcdrdb.cdr TO 'analytics'@'monitoring-server-ip'; GRANT SELECT ON asteriskcdrdb.cel TO 'analytics'@'monitoring-server-ip'; FLUSH PRIVILEGES;

If your external tool uses the queue_log file directly (some do), configure log rotation carefully:

# /etc/logrotate.d/asterisk-queue-log /var/log/asterisk/queue_log { monthly rotate 12 compress delaycompress missingok notifempty copytruncate # Important: don't move the file, copy and truncate }

My take: copytruncate is essential. If logrotate moves the file, Asterisk keeps writing to the old file descriptor until restart, and you lose data. I have seen this cause "missing data" reports that took weeks to diagnose.


FreePBX Reporting Tools Compared (Honest Rankings)

1. Astervis - Best for Teams Who Want Results, Not Projects

Astervis is purpose-built for Asterisk-based PBX systems including FreePBX.

Setup on FreePBX:

# On your FreePBX server or a separate machine (recommended) curl -fsSL https://api.astervis.io/api/releases/install.sh | bash # Add your FreePBX server in the dashboard # Queues auto-discovered within 60 seconds

What makes it different for FreePBX:

  • Auto-discovers FreePBX queue configuration (no manual queue mapping)
  • 30+ charts including heatmaps, agent performance trends, trunk analytics
  • Real-time dashboards that update sub-second via AMI events
  • Operator management with KPIs, leaderboards, and shift scheduling
  • CRM integration (Bitrix24, AmoCRM)
  • Self-hosted - your data stays on your network

Pricing: From $119/month, unlimited operators. 14-day free trial.

Where it fits: Teams running FreePBX as a call center (5+ agents) who need immediate visibility without a setup project.

2. Grafana + Custom Stack - Best for DevOps Teams

If you have a DevOps engineer and want full customization:

  1. Install Grafana + PostgreSQL/TimescaleDB
  2. Write a parser for /var/log/asterisk/queue_log
  3. Create AMI event listener for real-time data
  4. Build dashboards from scratch

Realistic timeline: 40-80 hours for a production-quality setup. Then ongoing maintenance.

# Example: basic queue_log parser to PostgreSQL # This is the EASY part. The hard part is real-time AMI event processing. awk -F'|' '{print $1","$2","$3","$4","$5","$6}' /var/log/asterisk/queue_log \ | psql -c "COPY queue_events FROM STDIN WITH CSV"

My take: I respect teams that build their own analytics. But I have watched three Grafana-on-FreePBX projects start enthusiastically and get abandoned within 6 months when the engineer who built it leaves or gets pulled to other work. The initial build is 20% of the cost - maintenance is 80%.

Tired of guessing what's happening in your queues?

Astervis gives you 30+ real-time charts, operator KPIs, and CRM integration for your Asterisk PBX. Self-hosted. Install in 5 minutes. From $119/mo flat unlimited operators.

Try Free

3. QueueMetrics - Legacy Option

QueueMetrics has been around since 2004 and has deep Asterisk integration. But it requires Java/Tomcat on your FreePBX server.

# QueueMetrics installation on FreePBX yum install java-11-openjdk tomcat # Java + Tomcat on your PBX server # Download and deploy WAR file # Configure database, AMI, queue_log path... # Total setup: 2-4 hours if everything goes right

The FreePBX-specific problem: Running Tomcat alongside FreePBX on the same server competes for resources. Java's memory footprint (typically 512MB-1GB) on a system that is also processing real-time voice is not ideal. Production FreePBX servers should dedicate resources to call processing.

See our detailed QueueMetrics comparison for pricing and migration analysis.

4. Asternic Stats - Budget Option

Asternic is simpler than QueueMetrics and uses PHP instead of Java:

  • Reads queue_log directly
  • Basic web dashboard (pre-2010 UI aesthetic)
  • Lower resource footprint than QueueMetrics

The honest take: Asternic works for basic queue statistics. If you need "how many calls per queue per day" and nothing else, it is adequate. It does not do real-time monitoring, agent performance tracking, or anything resembling modern analytics.

See our Asternic comparison for full details.


FreePBX-Specific Reporting Queries

If you are building custom reports or need to verify your analytics tool is calculating correctly, here are the SQL queries that actually work on FreePBX's database:

Agent Performance from queue_log

-- Agent call counts and average handle time (FreePBX queue_log table) SELECT agent, COUNT(CASE WHEN event = 'CONNECT' THEN 1 END) AS calls_answered, COUNT(CASE WHEN event = 'RINGNOANSWER' THEN 1 END) AS calls_missed, ROUND(AVG(CASE WHEN event = 'COMPLETECALLER' OR event = 'COMPLETEAGENT' THEN CAST(data2 AS UNSIGNED) END)) AS avg_talk_seconds, ROUND(AVG(CASE WHEN event = 'COMPLETECALLER' OR event = 'COMPLETEAGENT' THEN CAST(data1 AS UNSIGNED) END)) AS avg_hold_seconds FROM queue_log WHERE time > UNIX_TIMESTAMP(CURDATE()) AND agent != 'NONE' GROUP BY agent ORDER BY calls_answered DESC;

Hourly Abandon Rate

-- Abandon rate by hour (identifies understaffing windows) SELECT HOUR(FROM_UNIXTIME(time)) AS hour, COUNT(CASE WHEN event = 'ABANDON' THEN 1 END) AS abandoned, COUNT(CASE WHEN event IN ('CONNECT','ABANDON') THEN 1 END) AS total, ROUND(100.0 * COUNT(CASE WHEN event = 'ABANDON' THEN 1 END) / NULLIF(COUNT(CASE WHEN event IN ('CONNECT','ABANDON') THEN 1 END), 0), 1) AS abandon_pct FROM queue_log WHERE time > UNIX_TIMESTAMP(CURDATE() - INTERVAL 7 DAY) AND queuename = 'your_queue' GROUP BY HOUR(FROM_UNIXTIME(time)) ORDER BY hour;

SLA Compliance (80/30)

-- SLA: percentage of calls answered within 30 seconds SELECT DATE(FROM_UNIXTIME(time)) AS day, COUNT(CASE WHEN event = 'CONNECT' AND CAST(data1 AS UNSIGNED) <= 30 THEN 1 END) AS within_sla, COUNT(CASE WHEN event = 'CONNECT' THEN 1 END) AS total_answered, ROUND(100.0 * COUNT(CASE WHEN event = 'CONNECT' AND CAST(data1 AS UNSIGNED) <= 30 THEN 1 END) / NULLIF(COUNT(CASE WHEN event = 'CONNECT' THEN 1 END), 0), 1) AS sla_pct FROM queue_log WHERE time > UNIX_TIMESTAMP(CURDATE() - INTERVAL 30 DAY) AND queuename = 'support' GROUP BY DATE(FROM_UNIXTIME(time)) ORDER BY day DESC;

Trunk Utilization (FreePBX CDR)

-- Concurrent call peaks by trunk (capacity planning) SELECT DATE(calldate) AS day, HOUR(calldate) AS hour, channel, COUNT(*) AS calls, MAX(duration) AS max_duration FROM cdr WHERE calldate > DATE_SUB(NOW(), INTERVAL 7 DAY) AND channel LIKE 'PJSIP/trunk%' GROUP BY DATE(calldate), HOUR(calldate), channel ORDER BY calls DESC LIMIT 20;

Common FreePBX Reporting Mistakes

1. Trusting CDR Duration as Talk Time

CDR duration includes ring time. CDR billsec is closer to talk time but still includes IVR navigation. Neither represents actual agent-customer conversation time.

For accurate talk time, use queue_log CONNECT/COMPLETE events with the hold time (data1) and talk time (data2) fields.

2. Not Separating Queue Types

A single SLA target across sales, support, and VIP queues is meaningless. Configure separate queues in FreePBX and track them independently:

; queues_additional.conf (FreePBX manages this, but understand the structure) [sales](!) servicelevel=20 ; 20-second SLA for sales strategy=rrmemory [support](!) servicelevel=30 ; 30-second SLA for support strategy=leastrecent [vip](!) servicelevel=15 ; 15-second SLA for VIP strategy=linear ; Always ring best agent first

3. Ignoring After-Call Work

FreePBX default wrapuptime=0 means agents immediately receive the next call after hanging up. This causes:

  • Inaccurate AHT (wrap-up work is done during the next call)
  • Agent burnout (no processing time between calls)
  • Incorrect capacity calculations

Set appropriate wrap-up time:

; In FreePBX: Applications > Queues > Queue Settings wrapuptime=30 ; 30 seconds between calls

Read more about preventing agent burnout through proper workload management.

4. Running Reports During Peak Hours

Analytical queries against the CDR database compete with call processing. Schedule heavy reports for off-peak hours, or better yet, replicate data to a separate analytics database.


What to Set Up This Week

If you are running FreePBX with queues and have no analytics beyond CDR reports, here is your action plan:

Day 1: Enable queue logging on all queues (Step 1 above). Verify queue_log is being written.

Day 2: Configure AMI access for external monitoring (Step 2). Test the connection.

Day 3: Install an analytics tool. Try Astervis free for 14 days - setup takes 10 minutes on FreePBX.

Day 4-5: Configure SLA thresholds per queue. Set wrapuptime. Review initial data.

The difference between "we think our call center is performing well" and "we know our SLA is 78% with a 14% abandon rate at 2 PM" is the difference between hope and data.

FreePBX handles the calls. Analytics tells you whether it is handling them well.


For more on optimizing your FreePBX call center, see our complete Asterisk monitoring guide, CDR reporting deep dive, and real-time queue monitoring setup.

Stop guessing. Start monitoring.

See your Asterisk call center's real performance — queue wait times, agent activity, trunk usage, and 30+ charts. Self-hosted on your server. Install in 5 minutes. No credit card required.

From $119/mo flat. Unlimited operators. 14-day free trial.

Share this article