Notifications
AppMint Push - Notify Your Users
Send notifications to everyone who installed your app, straight from AppMint on your own Firebase project - schedule, edit after sending, cancel, deep links
AppMint
1How It Works#
AppMint Push sends notifications to everyone who installed your app, from inside AppMint - send now, schedule, edit after sending, cancel, deep links.
It runs on YOUR OWN Firebase project: your users, your project, no shared limits, and nothing of yours hosted by AppMint. Firebase Cloud Messaging is free with no message limit.
You need two files from that project - google-services.json (for the build) and a service-account key (for sending). The next steps get both. Works with every build mode: website, ZIP, HTML and AI.
AppMint Push and OneSignal are alternatives: turning one on turns the other off.
2Create a Firebase Project#
Go to Firebase Console and click 'Add project' (or open a project you already have). A free Firebase project is enough - no billing needed for notifications.
One project can hold several of your apps.
3Add Your App and Download google-services.json#
In your Firebase project:
- Click 'Add app' and choose Android
- Enter the package name EXACTLY as set in the AppMint wizard (e.g. com.yourname.yourapp) - a mismatch means notifications never arrive, and AppMint refuses the build for it
- Click 'Register app' and download google-services.json
- You can skip the remaining SDK steps - AppMint handles them
4Turn It On and Upload the File#
In the build wizard's Push Notifications card:
- Enable 'AppMint Push'
- Tap 'Upload google-services.json' and pick the file from the previous step
The wizard checks the file contains your package name. Then build your APK as normal - during the build your app is registered for push against your project.
Users just install the app and open it once. On Android 13+ they are asked to allow notifications after the first screen loads.
5Upload Your Service-Account Key (Once)#
AppMint sends through your project, so it needs a key from it - the same file OneSignal asks for.
In Firebase Console:
- ⚙ Project settings → 'Service accounts' tab
- Click 'Generate new private key' and confirm - a JSON file downloads
In AppMint: Home > Notifications → pick your app → 'Upload key' → choose that JSON.
AppMint verifies the key with a test send to your project before storing it (encrypted), so a green tick means the next send will really go out. One upload per app; rebuilding the app does not need it again unless you switch Firebase projects.
⚠️ Upload the SERVICE-ACCOUNT key here, not google-services.json - the screen tells you if you mix them up. To revoke access later, delete the key in Firebase Console.
6Send Your First Notification#
In Home > Notifications:
- Pick your app
- Write a title (message, image and link are optional)
- Tap 'Send Notification'
Every phone with your app installed receives it. Use 'Preview' first to see it exactly as users will - including a real notification on your own phone.
7Schedule for Later#
In the compose form, tap the Delivery row and choose 'Schedule for later...', then pick a date and time. The notification goes out automatically at that moment.
Until it fires, you can edit or cancel it from the History list below.
8Fix a Mistake After Sending#
Tap any notification in History:
- 'Edit & resend' - replaces it IN PLACE on every device with the corrected version
- 'Cancel' - removes it from every phone where it has not been opened yet
- 'Delete' - same as cancel, and clears it from your history
⚠️ A notification the user already opened or dismissed cannot be taken back.
9Open a Specific Page#
The optional Link field controls what a tap opens:
- A full https:// address (great for website apps)
- An in-app route like #/offers
Your app's code can also read it any time:
const link = window.WebToApk?.getLaunchUrl?.();
window.addEventListener('appmint:deep-link',
e => goTo(e.detail.url));10In-App Inbox (Optional)#
Every push is also stored inside the installed app (last 50), so your app can show its own notifications screen with unread badges. This works in EVERY build mode - including website (URL) apps, where you just add these few lines to your own site.
Dismiss is a SWIPE, not a tiny ✕, and it is reversible - pair it with a brief Undo:
const B = window.WebToApk;
const inbox = JSON.parse(B?.getPushInbox?.() ?? "[]");
// [{id,title,body,imageUrl,link,receivedAt,read}]
const unread = inbox.filter(m => !m.read).length;
// live arrival while the app is open
window.addEventListener('appmint:push', e => {
if (e.detail.type === 'received') showBanner(e.detail.message);
refreshInbox(); // fires for 'revoked' too
});
B?.markPushRead?.(id); // "" = mark all read
B?.dismissPushMessage?.(id); // swipe away
B?.restorePushMessage?.(id); // ...Undo11If Nothing Arrives on Your Test Phone#
Almost always a limit on the TEST PHONE, not your app or your users.
Android allows roughly 100 push registrations per phone. Every FRESH install of an app that uses notifications takes one - so installing build after build while testing can use them all up, and that phone then stops receiving for newly installed apps.
Free up slots (this is what actually works):
- Uninstall test apps you no longer need - Android releases the slot each one was holding
- Or clear a test app's data: Settings > Apps > [that app] > Storage > Clear data - that releases its slot without uninstalling
- On an emulator, wiping it resets every slot at once
Restarting the phone does NOT help: these registrations are stored permanently, which is why they survive a reboot. Clearing Google Play Services' cache does not free them either.
Avoid it while testing:
- Keep ONE package name while you iterate - every different package name takes its own slot
- Install the new APK OVER the old one instead of uninstalling first - an update keeps the existing registration, a reinstall spends a new one
- Test on a spare phone or an emulator; wiping an emulator resets its slots instantly
- Delete test apps you have finished with
Also check the basics: the app was opened at least once after installing, and notifications are allowed for it in Android settings. The app re-subscribes on every launch, so it recovers by itself once slots free up - no rebuild needed.
12Limits and Good Practice#
- No limit on how many notifications you send - Firebase Cloud Messaging is free
- Title up to 120 characters; image links must be https://
- On the free plan a short ad plays before each send
- Test apps: remove them with the trash icon next to the app selector - this deletes the history and stored key in AppMint only; your Firebase project is untouched, and a rebuild adds the app back
- Rebuilding with a NEW google-services.json from the SAME project changes nothing: your key stays, existing installs keep receiving
- ⚠️ Moving the app to a DIFFERENT Firebase project is a clean break. Rebuild with the new google-services.json, upload the new project's key (AppMint drops the old one, since it could never send for the new project) - and know that phones still running the OLD version stop receiving until their users update. Notifications reach a project, and those installs are still listening to the old one
- Send sparingly: users uninstall apps that spam them