Last month
Bellbird is a marketplace. When a buyer's order changes, it sends push, email, SMS and in-app notifications. One-time passcodes go out through the same system, and a login code is only useful for a short while. A newsletter can wait.
Last month a newsletter to 25,000 people was sitting in the queue when a login campaign sent 1,800 OTPs. The first code arrived 19 seconds after it was requested, and 14% of them arrived too late to use. Then a provider went down, and afterwards nobody could say what had happened to 640 notifications.
Build a delivery path an operator can run: urgent messages don't wait behind bulk mail, and provider trouble doesn't erase work that was already accepted. Provider contracts, campaign authoring and the mobile client aren't part of this.
What the starter gives you
The notification service (Python and FastAPI): an API that accepts notifications into a Redis queue, and one worker in the same container that hands them to the provider in order. Around it, a fake provider that stands in for every vendor: you can slow it down or take it down, and it keeps every notification it accepts with the time it arrived. make up starts it all.
make notify replays last month on a small scale: fifteen newsletters, then one urgent login code, and one line saying how long the code took to reach the provider. make outage takes the provider down while five notifications are accepted, brings it back two seconds later, and counts what arrived, what the service gave up on and what was lost; make outage-long does the same with ten seconds of outage; whether those five end delivered or given up on depends on the retry budget you choose, and either counts as accounted for. make contract checks the service still answers as it did.
You can port the service to another language: keep its routes, port 8000 inside the container, REDIS_URL and PROVIDER_URL, and run make contract until it passes.
Per-vendor quotas, a queue that spans regions and user preferences don't fit on a laptop. Cover them in your design notes.