Your app's notifications, captured - not delivered.
Notify-Sim sits where your SMS, WhatsApp, email and push provider sits. Your integration code does not change: swap one base URL, keep sending, and every message lands in an inbox that shows it exactly as the recipient would see it.
No card. Free tier stays free. Local edition runs on your machine.
# the Meta call, unchanged { "to": "919848012345", "type": "template", "template": { "name": "payment_reminder", "language": {"code": "en"}, "components": [{ "type": "body", "parameters": [ {"text": "Ravi Naidu"}, {"text": "₹25,31,091"}, {"text": "TC-1103"} ] }] } }
business account
Drop-in for the gateways you already use
Same paths, same payloads, same success bodies - and the same error shapes, down to SmartPing's REJECTED, Meta's 131026, Expo's DeviceNotRegistered, FCM's UNREGISTERED and SMTP's 550.
The problem
In dev you either send for real, or you test nothing.
Both choices cost you. One burns money and reaches real people; the other replaces the part of your system most likely to break with a function that always returns true.
Sending for real
Gateway charges on every test run. Live DLT rejections. WhatsApp templates that fail approval only in production. And the moment a staging job picks up production data, a stranger gets an SMS about somebody else's flat.
Stubbing the channel
send_sms() returns True and nothing is exercised: not the provider's error codes, not your retry path, not your delivery-report handler, not the template your customer will actually read.
The third option
The real integration, exercised end to end, with nothing leaving the building. Your code keeps its provider client; the provider is simply somewhere else while you test.
What you get
Four things, each worth a page of its own.
Device-true previews
SMS as a phone thread, WhatsApp with template bodies and read ticks, email in a reading pane with openable attachments, push on a lock screen.
See the channels →Tests that assert
Wait for the message your flow should have produced, read the OTP out of it, and make failures deterministic instead of hoping for them.
See how it works →India compliance
DLT bodies compared verbatim, WhatsApp templates rendered from your registered text, TRAI quiet hours modelled - before the gateway rejects anything.
See the checks →The whole loop
Delivery lifecycles, provider-native signed webhooks with replay, and customer replies coming back into your handlers.
See the loop →Start in about two minutes
Send one message. Watch it arrive as a phone screen.
Create a project, copy the environment block for your stack, and run the flow you were about to test anyway. The free tier does not expire and needs no card.