Test your SMS code against a real SMSC. Not real phones.
Bind your SMPP client to our simulator and send messages like you would to a carrier.
Every submit_sm lands in a shared inbox with the decoded text,
raw bytes and every PDU field, and delivery receipts come back a second later.
Free for 7 days on any plan. Functional tests and load tests. Bound and sending in under two minutes. No carrier contract, no SIM cards, no per-message fees.
Acme Mobile
Inbox
SMPP connection
Point your client here. Whatever it submits shows up below.
- Host
- sim.smppsimulator.com Copy
- Port
- 2775 Copy
- System ID
- acme4821 Copy
- Password
- •••••••• Copy
-
ACME → +447700900123
14:02:51Your verification code is 482913. It expires in 10 minutes.
14:02:51 3 Oct ACME +447700900123 Your verification code is 482913. It expires in 10 minutes. delivered -
ACME → +15555550100
14:02:49Привет! Ваш заказ №10482 отправлен
14:02:49 3 Oct ACME +15555550100 Привет! Ваш заказ №10482 отправлен UCS-2 delivered -
Shop → +4915112345678
14:02:47Your order #10482 has shipped and should arrive on Thursday. Track it at…
14:02:47 3 Oct Shop +4915112345678 Your order #10482 has shipped and should arrive on Thursday. Track it at… 3 parts delivered -
40404 → +33612345678
14:01:30Rappel : votre rendez-vous est demain à 9h30.
14:01:30 3 Oct 40404 +33612345678 Rappel : votre rendez-vous est demain à 9h30. delivered -
Bank → +15555550199
14:00:12A payment of $42.00 to Coffee Co was approved […]
14:00:12 3 Oct Bank +15555550199 A payment of $42.00 to Coffee Co was approved […] 2 of 3 parts accepted
Why a simulator
Testing SMS against real carriers is slow, opaque and expensive
- Every test costs money
- Real carriers charge per message, so every CI run, retry loop and load test shows up on an invoice.
- You can’t see what you sent
- The phone shows the text. It doesn’t show the data_coding you picked, the UDH, or why the emoji turned into question marks.
- Carrier sandboxes are slow
- Weeks of paperwork for a test bind, shared credentials, and a support ticket every time you need a receipt.
- You can’t load test a carrier
- Send ten thousand messages to find your limits and you get a huge bill, throttled, or blocked. So most teams find their limits in production.
SMPP Simulator is an SMSC that behaves like a carrier on the wire and shows you everything it received. Nothing ever reaches a real phone.
How it works
From sign-up to first message in three steps
Swap a hostname and a password. Your code doesn’t know it’s talking to a simulator.
-
1
Sign up with your email
We email you a sign-in link. Your account gets its own SMPP system_id and password straight away.
-
2
Point your client at us
Bind as a transmitter, receiver or transceiver to sim.smppsimulator.com:2775. Any SMPP 3.4 library works, unchanged.
-
3
Send, and watch it land
Messages show up in the inbox within seconds. Ask for a receipt and a deliver_sm with stat:DELIVRD comes back.
import smpplib.client client = smpplib.client.Client('sim.smppsimulator.com', 2775) client.connect() client.bind_transceiver(system_id='acme4821', password='••••••••') client.send_message( source_addr='ACME', destination_addr='+447700900123', short_message=b'Your code is 482913', registered_delivery=True, # receipt in ~1s )
// jSMPP SMPPSession session = new SMPPSession(); session.connectAndBind("sim.smppsimulator.com", 2775, new BindParameter(BindType.BIND_TRX, "acme4821", "••••••••", "cp", TypeOfNumber.UNKNOWN, NumberingPlanIndicator.UNKNOWN, null)); String id = session.submitShortMessage("CMT", TypeOfNumber.ALPHANUMERIC, NumberingPlanIndicator.UNKNOWN, "ACME", TypeOfNumber.INTERNATIONAL, NumberingPlanIndicator.ISDN, "+447700900123", new ESMClass(), (byte) 0, (byte) 1, null, null, new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS), (byte) 0, new GeneralDataCoding(Alphabet.ALPHA_DEFAULT), (byte) 0, "Your code is 482913".getBytes()).getMessageId();
const smpp = require('smpp'); const session = smpp.connect('smpp://sim.smppsimulator.com:2775'); session.bind_transceiver({ system_id: 'acme4821', password: '••••••••' }, () => { session.submit_sm({ source_addr: 'ACME', destination_addr: '+447700900123', short_message: 'Your code is 482913', registered_delivery: 1, }, (pdu) => console.log(pdu.message_id)); }); session.on('deliver_sm', (pdu) => console.log('receipt', pdu.short_message));
The PDU inspector
See exactly what your client put on the wire
Encoding bugs hide on real phones. Here, each message opens to everything the SMSC received, so a wrong data_coding or a broken UDH is obvious in seconds.
- Decoded text, the way the handset would show it
- GSM 7-bit with the extension table, UCS-2, Latin-1, Cyrillic, Hebrew and the GSM data coding groups.
- Raw bytes, UDH included
- Copy the exact hex your client put on the wire, so you can diff it against what you meant to send.
- Every submit_sm field
- data_coding, esm_class, registered_delivery, TON/NPI, protocol_id, priority_flag and service_type, all labelled.
- Long messages, put back together
- Parts are joined from the UDH (8 or 16-bit reference) or SAR TLVs. A missing part is flagged, not hidden.
Inbox
Shop → +4915112345678
Received 3 Oct 2026 at 14:02:47 · 3 parts
Message
372 characters · GSM 7-bit
Your order #10482 has shipped and should arrive on Thursday. Track it at shop.example/t/10482 or reply STOP to opt out of updates…
Parts
Reference 0x2A
-
Part 1 of 3
delivered05 00 03 2A 03 01 D9 77 5D 0E 7A BF DD 65 50 3E 4D 07
-
Part 2 of 3
delivered05 00 03 2A 03 02 E8 E5 39 1D 06 B5 CB F3 79 F8 5C 06
- + 1 more part
submit_sm (part 1)
- source_addr
- Shop TON 5 · NPI 0
- destination_addr
- +4915112345678 TON 1 · NPI 1
- data_coding
- 0x00 GSM 7-bit
- esm_class
- 0x40 Starts with a user data header
- registered_delivery
- 0x01 Receipt requested
Real delivery receipts
A standard deliver_sm with stat:DELIVRD, receipted_message_id and message_state, about a second after submit.
Live inbox
New messages appear while the page is open. Search by number, text or message ID.
One inbox for the whole team
Invite people by email as owners, admins or members. Everyone sees the same messages.
Realistic error codes
Wrong system_id, wrong password, too many binds: you get the same ESME_ status a carrier would send.
Credentials you control
Reset the SMPP password from the dashboard and clients on the old one are unbound within 30 seconds.
No passwords to forget
Sign in with a link we email you. Nothing to rotate, nothing to leak.
Protocol coverage
Behaves like a carrier on the wire
SMPP 3.4 over plain TCP. Here’s what happens to each PDU your client sends.
-
bind_transmitter · bind_receiver · bind_transceiver Supported
Checked against your system_id and password. ESME_RINVSYSID, ESME_RINVPASWD or ESME_RBINDFAIL when they should be.
Supported -
submit_sm Supported
Stored in your inbox and answered with a message_id. Text from short_message or message_payload.
Supported -
submit_multi Supported
One inbox row per destination, all sharing a message_id.
Supported -
data_sm Supported
Same as submit_sm, with the text taken from message_payload.
Supported -
deliver_sm (receipt) Supported
Sent when registered_delivery asks for one: stat:DELIVRD plus receipted_message_id and message_state TLVs.
Supported -
query_sm Supported
Answered from the stored status.
Supported -
enquire_link · unbind Supported
Handled, so long-lived sessions stay up the way they would with a carrier.
Supported -
cancel_sm · replace_sm Refused
Refused with ESME_RCANCELFAIL / ESME_RREPLACEFAIL, because messages are delivered at once. Good for testing your error paths.
Refused
Performance testing
Load test your SMS application against an SMSC that answers like a carrier
You can’t fire ten thousand test messages at a real carrier. You can at ours. Find out how your application behaves under load before your customers do.
- Find your sender’s real ceiling
- Push your queue, workers and SMPP sessions as hard as they go. Every submit_sm gets a real submit_sm_resp, so you measure your whole pipeline, not a mock that returns instantly.
- Concurrent sessions
- Bind up to 10 sessions per login, as transmitters, receivers or transceivers, to test connection pools, windowing and how work is spread across binds.
- Receipts at the same volume
- Ask for receipts and every message sends a deliver_sm back about a second later. Your receipt consumer gets the same load as your sender.
- Soak tests and reconnects
- Keep sessions bound for hours with enquire_link. Reset the SMPP password mid-run and clients are unbound within 30 seconds, a real test of your reconnect logic.
- Prove nothing was lost
- When the run ends, compare what you sent with what arrived. Every message is in the inbox with its message_id, and long messages are checked part by part.
- A flat price, however hard you push
- No per-message fees. A load test that would cost hundreds on a carrier uses your plan’s monthly allowance instead.
$ ./load-test --binds 10 --messages 10000 connecting to sim.smppsimulator.com:2775 ✓ 10 sessions bound (bind_transceiver) ✓ 10,000 submit_sm sent ✓ 10,000 submit_sm_resp 0 errors ✓ 10,000 deliver_sm stat:DELIVRD ✓ inbox count matches 10,000 / 10,000 # throughput and latency: your numbers, # measured on your side of the wire
SMSC stress-testing tools
Fire thousands of messages at an SMSC to measure the SMSC’s capacity. Useful if you run an SMSC. They don’t tell you how your own application copes.
SMPP Simulator
The SMSC on the other end of the wire. Your application, or any load generator you already use, sends to us, so you measure your throughput, sessions and receipt handling. The two work well together.
Messages from load tests count towards your plan’s monthly allowance. Planning a bigger run? Talk to us (hello@smppsimulator.com).
Pricing
Cheaper than one afternoon of carrier test traffic
Try either plan free for 7 days. After that it’s a flat price: no per-message fees, no setup, cancel any time.
Dev
For a developer wiring up an SMPP client.
$29 $23 /month
Billed monthly $278 billed yearly, save $70
Start your free trial7 days free, then $29/month $278/year
- 5 numbers
- 10,000 messages a month
- Webhooks for every message and receipt
- Delivery receipts and query_sm
- Full PDU inspector: text, raw bytes, every field
- Long messages joined automatically
Team
For teams shipping SMS to production.
$99 $79 /month
Billed monthly $950 billed yearly, save $238
Start your free trial7 days free, then $99/month $950/year
- 20 numbers
- 100,000 messages a month
- Scenario builder
- Everything in Dev
- Shared inbox with owners, admins and members
- Invite your whole team by email
Prices in USD; applicable taxes are added at checkout. 7-day free trial and a 14-day money-back guarantee. Payments are handled by Paddle, our Merchant of Record. See the Terms of Service.
Need more numbers, higher volume or an on-premise SMSC? Talk to us (hello@smppsimulator.com).
FAQ
Questions, answered
How does the free trial work?
Every plan starts with 7 days free, with the full feature set. Sign up, bind your client and send as much as the plan allows. If it isn’t for you, cancel before the trial ends.
Do messages reach real phones?
Never. The simulator accepts every message, files it in your inbox and sends back a receipt. Nothing is forwarded to a carrier, so you can test with real-looking numbers safely.
Do I need to change my code?
No. Point your existing SMPP client at sim.smppsimulator.com:2775 with the system_id and password from your dashboard. If it can bind to a carrier, it can bind to us.
Which SMPP version and libraries are supported?
SMPP 3.4 over TCP. It works with any compliant client, including jSMPP, Cloudhopper, python-smpplib, node-smpp, Kannel and Jasmin.
Will my client get delivery receipts?
Yes, when registered_delivery asks for one. A deliver_sm with stat:DELIVRD arrives about a second later on the submitting session if it is a transceiver, or on any receiver bound with the same login.
How are long and Unicode messages handled?
Each part is stored with its own message_id and receipt, then shown as one message. Concatenation is read from the UDH (8 or 16-bit reference) or SAR TLVs. Text is decoded from data_coding: GSM 7-bit, UCS-2, Latin-1, Cyrillic, Hebrew and more.
Can I use it for load and performance testing?
Yes. Bind up to 10 sessions per login and send as fast as your application can. Every message gets a submit_sm_resp and, if you ask, a receipt, so you can measure your throughput, session handling and receipt processing under load. The simulator doesn’t throttle like a carrier, so what you measure is your application’s ceiling. Load-test messages count towards your monthly allowance. Contact us if you are planning a bigger run.
How is this different from an SMSC stress-testing tool?
A stress tester fires messages at an SMSC to measure the SMSC. SMPP Simulator is the SMSC, so it measures the application sending to it. They work together: point your existing load generator at us.
Can my whole team use one account?
Yes. Invite people by email as owners, admins or members. Everyone shares the same inbox and SMPP credentials, and only owners and admins can reset the password or clear the inbox.
Can I switch plans or cancel?
Any time, from your account settings. Yearly plans are 20% cheaper than paying monthly.
Your first test message is two minutes away
Try any plan free for 7 days. Sign up, copy your system_id, bind to sim.smppsimulator.com:2775, send.