Push notifications from your server, to every device a user has.
Register tokens under your own user ids and send to a user, a list, a topic or everyone, on Android, iOS and the web. Schedule sends, cap marketing pushes per user, and get a signed webhook for every result.
- 1,000 devices free
- Rs 499 a month for 5,000 devices
- Unlimited sends within fair use
Send to a user, not a token.
Your server adds each token under the user id you already use. SignOps keeps the list: which phone, which browser, when it was last seen.
- Your own user ids. You never store an id from SignOps.
- Up to 20 devices a user, across Android, iOS and the web.
- Tokens Google or Apple reject are removed, and your webhook hears about it.
- Import existing tokens from OneSignal or Firebase by CSV or the API.
- Pixel 8Android · seen nowTrusted for Approve
- iPhone 15iOS · seen 2 h agoPush
- Chrome on WindowsWeb · seen nowPasskey
- Redmi Note 12Android · seen 41 d agoToken expired, removed
Android, iOS and the web in one request.
Name the user. SignOps fans the message out to every device they have, in the format each platform expects, and retries what Google or Apple asks it to.
- Libraries for Node, PHP and Python, and plain REST for everything else.
- Images, deep links and up to two buttons.
- Silent data pushes to refresh your app in the background.
import { SignOps } from "@signops/node";
const signops = new SignOps(process.env.SIGNOPS_KEY);
// Every device of this user: Android, iOS, web.
await signops.push.send({
user_id: "usr_8f21c4",
title: "Your order is out for delivery",
body: "Ravi is 10 minutes away with 6 items.",
link: "kirana://orders/88213",
});use SignOps\SignOps;
$signops = new SignOps(getenv('SIGNOPS_KEY'));
$signops->push->send([
'user_id' => 'usr_8f21c4',
'title' => 'Your order is out for delivery',
'body' => 'Ravi is 10 minutes away with 6 items.',
'link' => 'kirana://orders/88213',
]);from signops import SignOps
signops = SignOps(os.environ["SIGNOPS_KEY"])
signops.push.send(
user_id="usr_8f21c4",
title="Your order is out for delivery",
body="Ravi is 10 minutes away with 6 items.",
link="kirana://orders/88213",
)curl https://api.signops.dev/v1/push \
-H "Authorization: Bearer $SIGNOPS_KEY" \
-H "Content-Type: application/json" \
-d '{
"user_id": "usr_8f21c4",
"title": "Your order is out for delivery",
"body": "Ravi is 10 minutes away with 6 items."
}'Offers on time, without a developer.
Users join topics like offers or pune. Your team writes a push in the dashboard, picks a topic, sets a time and checks the preview on all three platforms.
- Schedule up to 30 days ahead, cancel any time before it goes.
- Stored templates with fields like {{name}} filled per user.
- A daily cap on marketing pushes per user, set by you.
- Send a test to your own phone before it reaches everyone.
Your Firebase project. Your Apple team.
Upload your Firebase service account and your Apple key once. SignOps makes the web push keys for you. Nothing about your project moves.
- Keys encrypted per app and never shown again after upload.
- iOS through FCM, or straight to APNs with your .p8 key.
- Google's limit of 6 lakh messages a minute stays your project's own.
- Firebase (FCM)kirana-express-prod · service accountConnected
- Apple (APNs)Key ID 8K2Q9XW4LM · Team 5HD3K7P2TQConnected
- Web pushVAPID key pair made by SignOpsConnected
See what every push did.
Each message shows what Google and Apple said about it, device by device. Every result also reaches your server as a signed webhook.
- Delivery logs for 7 days, 30 days on Pro.
- Opens and clicks when your app reports them with the SDK.
- Failed tokens counted and removed, with the reason.
- 09:41:02approve.createdusr_8f21c4 · Chrome on WindowsSent
- 09:41:04approve.approvedPixel 8 · matched 47 · Face IDApproved
- 09:41:05push.sentNew login on Chrome · 2 devicesSent
- 09:44:19device.removedRedmi Note 12 · token expiredCleaned
The same call, a send time and a topic.
// A topic, an image and a send time.
await signops.push.send({
topic: "offers",
title: "Weekend offer: 20% off fruit",
body: "Mangoes, bananas and apples until Sunday night.",
image: "https://cdn.kiranaexpress.in/offers/fruit.jpg",
send_at: "2026-10-24T18:00:00+05:30",
});curl https://api.signops.dev/v1/push \
-H "Authorization: Bearer $SIGNOPS_KEY" \
-d topic=offers \
-d title="Weekend offer: 20% off fruit" \
-d send_at=2026-10-24T18:00:00+05:30Topics
Subscribe users from your server. A user can be in as many topics as you like.
Send times
Any ISO time with a zone, like 6:00 pm IST. Cancel by id before it goes.
Caps
Marketing pushes over a user's daily cap are skipped and logged.
Templates
Write once in the dashboard, send by template id with fields.
Details and limits
What one app on SignOps Push can do, in numbers.
- Platforms
- Android through FCM. iOS through FCM, or APNs with your .p8 key. Web push on Chrome, Edge, Firefox and Safari.
- Who you can send to
- One
user_id, a list of up to 1,000 user ids, a topic, or every device of the app. - Devices per user
- Up to 20. A new one past that replaces the device seen longest ago.
- Scheduling
send_atup to 30 days ahead, in any time zone. Cancel any time before it goes.- Message
- Title, body, data, image, deep link and up to two buttons, within the 4 KB Google and Apple allow.
- Frequency caps
- Optional, per app: the most marketing pushes one user gets in a day.
- Pacing
- Large sends are paced per app at up to 5,000 pushes a second.
- Fair use
- An average of 10 pushes per device per day. Above it, sends are slowed instead of charged.
- Logs
- Every message and its result for 7 days, 30 days on Pro.
- Price
- 1,000 devices free. Rs 499 a month for up to 5,000, then Rs 0.10 a device, and Rs 0.05 above 10 lakh. A device counts in a month when it was sent at least one push that month.
Why do I upload my Firebase and Apple keys?
Device tokens belong to your Firebase project and your Apple team, so only your keys can send to them. You upload them once in Settings. SignOps encrypts them and never shows them again, and Google's sending limit stays your project's own.
Does my app need a SignOps SDK to get pushes?
No. Your app gets its token from the standard Firebase or Apple SDK, and your server registers it with SignOps. The SignOps SDK is needed only for Approve, and optionally to report when a push is opened.
What about Xiaomi, Oppo, Vivo and Realme phones?
These phones stop apps in the background to save battery, which can drop pushes on any provider. SignOps sends with high priority where Android allows it, and the docs list the settings and the in-app prompt that keep your app able to receive.
How do I move from OneSignal?
Export your subscribers with their external user ids, import them to SignOps by CSV or the API, and switch your server's send calls. Users keep getting pushes without an app update. For 5,000 users OneSignal is about Rs 5,900 a month; SignOps is Rs 499.
Can my marketing team send without a developer?
Yes. The composer in the dashboard writes a push, picks a topic or everyone, sets a time, shows the preview on Android, iOS and the web, and sends a test to your own phone first.
Guides for this product
All guidesYour first push is free.
Free for 1,000 push devices, 100 approvals a day, 10,000 passkey sign-ins a month and 500 email codes to try. No card until you pass a free amount.