# A SIPp 200 OK Is Not Proof Your Carrier Got the Call (FreePBX Test)

Source: https://srvscripts.com/guides/sipp-200-ok-not-proof-carrier/
Updated: 2026-10-17
Publisher: srvScripts (https://srvscripts.com/)

We load tested a FreePBX 17 server with SIPp: 30 calls through an outbound route to a test carrier. SIPp reported 30 successful calls, a SIPp 200 OK for every one, and 0 failures. The call records told a different story: only 9 calls had reached the carrier. FreePBX had answered the other 21 itself, played an announcement and hung up, and to SIPp an answered call is a successful call.

**Short answer:** SIPp counts any 200 OK as success, and an Asterisk PBX can answer a call itself (concurrency-limit announcement, IVR, voicemail, a misrouted pattern). Always reconcile a load test with the CDR: count calls whose `dstchannel` is a trunk and whose disposition is ANSWERED. In our test the cause was FreePBX’s per-extension Outbound Concurrency Limit of 3; setting it to 0 for the test extension gave 30 of 30 delivered calls.

In short: SIPp counts any 200 OK as success, and an Asterisk PBX can answer a call itself (concurrency-limit announcement, IVR, voicemail, a misrouted pattern). Always reconcile a load test with the C…

## What happened in our test

The test extension 1002 registered from SIPp, then dialled a US-format test number at 3 new calls per second with up to 10 calls at the same time, holding each call for 5 seconds. The number matched the US-Canada outbound route, whose trunk pointed at a test carrier (another SIPp instance on the same server that answers every call). No real number was dialled.

| What we looked at | What it said |
| --- | --- |
| SIPp counters | 30 calls answered (200 OK), 0 failed |
| 180 Ringing received | only 9 (the carrier rings; the PBX announcement does not) |
| CDR: answered on the trunk | 9 of 30 |
| CDR: answered by Playback | 21 (FreePBX played “your simultaneous call limit is reached” and hung up) |
| FreePBX setting | Extension 1002, Advanced tab: Outbound Concurrency Limit = 3 |

[](https://srvscripts.com/wp-content/uploads/2026/10/srvscripts-lab-slt101-02-false-success.png)bash sipp-call-load-test.sh --ext 1002 --secret-file /root/1002.secret --number 12125550123 --yes --calls 30 --rate 3 --max 10 --hold 5 — Outbound Concurrency Limit set to 3, exit code 1, 24.5 s. Version 1.0.1. Debian 12, FreePBX 17.0, Asterisk 22.11, SIPp 3.6.1, 17 Oct 2026. IP addresses masked.

The clue was in the SIPp counters all along: 30 answers but only 9 “180 Ringing” responses. Without the call records it is easy to read that as a carrier that answers quickly.

## Why a SIPp 200 OK can come from the PBX itself

- **Per-extension concurrency limits.** FreePBX can limit how many outbound calls one extension makes at once (a useful anti-fraud setting). Calls above the limit are answered and hear an announcement.

- **Announcements, IVRs and voicemail.** Any dialplan path that answers the call before it reaches a trunk returns 200 OK, for example a feature code, an IVR, voicemail or a custom announcement.

- **Local channels.** Calls that go through a Local channel (follow-me, ring groups) can be answered inside the PBX; count only the real trunk leg.

- **Only the call records know.** In SIPp’s counters the one visible hint was the 180 Ringing count (9, not 30), because our carrier rang and the PBX announcement did not. Other setups give no hint at all.

## Reconcile the test with the CDR

On FreePBX the call records are in the `asteriskcdrdb.cdr` table. Count the calls the test made, and the calls that were answered on your trunk. Name the trunk explicitly (its channel is `PJSIP/` plus the trunk name; FreePBX lists trunks in the `asterisk.trunks` table) and limit the query to the start and end time of the test:

```
SELECT COUNT(DISTINCT uniqueid) AS calls,
       COUNT(DISTINCT CASE WHEN dstchannel LIKE 'PJSIP/mytrunk-%'
                                AND disposition = 'ANSWERED' THEN uniqueid END) AS on_trunk
FROM cdr
WHERE calldate BETWEEN '2026-10-17 01:20:00' AND '2026-10-17 01:21:30'
  AND src = '1002' AND dst LIKE '%12125550123';
```

Then see what answered the others: `SELECT lastapp, COUNT(*) FROM cdr WHERE … GROUP BY lastapp`. Playback, VoiceMail, BackGround or Hangup mean the PBX handled the call itself. A test for “any channel that is not `Local/`” is not enough: a call answered by another phone, such as `PJSIP/1003-00000012`, would pass it. Use a test extension nothing else uses during the test, and remember that ANSWERED means the trunk answered the signalling, not that audio flowed both ways.

## Run a load test you can trust

Our [SIPp call load test script](/scripts/sipp-call-load-test/) does all of this in one run: it registers as the extension (password in a private file, not on the command line), places the burst, samples the live call count and reconciles with the CDR. It also warns before the test if the extension has a concurrency limit lower than your test.

```
apt install sip-tester
bash sipp-call-load-test.sh --ext 1002 --secret-file /root/1002.secret --number 15550100 --calls 30 --rate 3 --max 10 --hold 5
```

With the limit set to 0 for the test extension, the same test delivered 30 of 30 calls, and a larger run delivered 200 of 200 with 60 calls at once (screenshots of version 1.0.1 of the script, which counts only calls answered on the trunks in the FreePBX trunk list and reports a run that stopped early as INCOMPLETE):

[](https://srvscripts.com/wp-content/uploads/2026/10/srvscripts-lab-slt101-01-ok.png)bash sipp-call-load-test.sh --ext 1002 --secret-file /root/1002.secret --number 12125550123 --yes --calls 30 --rate 3 --max 10 --hold 5 — exit code 0, 25.3 s. Version 1.0.1. Debian 12, FreePBX 17.0, Asterisk 22.11, SIPp 3.6.1, 17 Oct 2026. IP addresses masked.

[](https://srvscripts.com/wp-content/uploads/2026/10/srvscripts-lab-slt101-03-200.png)bash sipp-call-load-test.sh --ext 1002 --secret-file /root/1002.secret --number 12125550123 --yes --calls 200 --rate 10 --max 60 --hold 8 — exit code 0, 42.1 s. Version 1.0.1. Debian 12, FreePBX 17.0, Asterisk 22.11, SIPp 3.6.1, 17 Oct 2026. IP addresses masked.

## Safety rules for SIP load tests

- Never load test through a paid trunk without a test number or the carrier’s permission: every call is billed, and a burst of calls looks like toll fraud.

- Respect the carrier’s calls-per-second limit; above it you are testing their rate limiter.

- Use a dedicated test extension with its own password and remove it afterwards. If you lifted a concurrency limit for the test, set it back.

- This is a signalling test. Without RTP it does not measure audio, transcoding or recording capacity.

## What we tested and how

All results on this page come from our FreePBX 17 lab server (Debian 12, Asterisk 22.11, 4 vCPU) on 16 and 17 October 2026 with SIPp 3.6.1, FreePBX 17.0.33 and Asterisk 22.11. The carrier was a SIPp process acting as a SIP provider, so the setup is reproducible without real calls. The screenshots are the real terminal output; only IP addresses are masked.

Related: [SIPp call load test script](/scripts/sipp-call-load-test/), [how many SIP channels you need](/guides/how-many-sip-channels/), [FreePBX PJSIP trunk setup](/guides/freepbx-pjsip-trunk-setup/), [Asterisk CDR reports from MySQL](/guides/asterisk-cdr-mysql-reporting/), [SIP response codes](/guides/sip-response-codes/).

Further reading: the [SIPp documentation](https://sipp.readthedocs.io/en/latest/) (scenarios, injection files and the `[authentication]` keyword).

## Frequently asked questions

### Why does SIPp report success when calls did not reach the carrier?

SIPp counts a call as successful when it receives 200 OK. If the PBX answers the call itself, for example to play a concurrency-limit announcement, SIPp cannot tell. The CDR shows which calls were answered on a trunk.

### What is the FreePBX Outbound Concurrency Limit?

A per-extension setting on the Advanced tab that limits how many outbound calls the extension can make at once. Calls above the limit are answered by FreePBX with an announcement. 0 means no limit.

### How do I check in the CDR whether a call reached the trunk?

Look at dstchannel and disposition in asteriskcdrdb.cdr: a delivered call has a trunk channel such as PJSIP/mytrunk-00000012 and disposition ANSWERED. Calls answered by Playback, VoiceMail or an IVR were handled inside the PBX.

### Can I load test against my real SIP provider?

Only with a test number or their permission, and within their calls-per-second limit. Every call is billed, and a burst of calls can trigger their fraud protection.

### Does a SIPp signalling test measure call quality?

No. Without RTP it measures call setup and teardown only. Audio, transcoding and recording capacity need a separate test with media.
