App icon badges

Put the unread count on your app icon

A badge is the smallest thing you can say to a user, and it costs them nothing to read. Set it, bump it or clear it from the same campaign and Journey as everything else you send.

Three iPhone home screens side by side, each with several app icons carrying a red unread-count badge in the corner and the rest of the icons carrying no badge at all

Trusted by 80,000+ companies to scale their engagement

The format, in full

A badge is a single integer, and that is the whole appeal. It costs no banner and no sound, it spends none of the permission you fought to get, and it keeps working on the user who swiped your push away three hours ago. There are three things you can do to that integer from the composer or the API, plus one caveat about where it actually renders.

An exact count

ios_badges: 5 puts a 5 on the icon, whatever was there before. The value you send is the value the user sees, which is what you want when your server already knows the real total.

+1 and -1

Relative changes bump or drop the count without you tracking it. The SDK posts the on-device value back through the internal /setBadge endpoint, so Pushwoosh's counter stays level with the real icon.

0 clears it

Send 0 and the badge leaves the icon. Clearing on open is the difference between a count users trust and a red dot they learn to ignore.

iOS uniform, Android launcher-dependent

On iOS the badge is a standard aps.badge value and every device draws it identically. On Android there is no native badge API, so the render depends on the launcher, and Pushwoosh says so rather than implying coverage it cannot deliver.

What you control

What you sendWhat happens to the countWhere it lives
An integer, 5Sets the badge to exactly that valueios_badges / android_badges, or the Badges field
+1, +3Increments the current countSame field. Also +n in the Android presets
-1Decrements the current countSame field, for a read or a dismissal on the server side
0Removes the badge from the iconSame field, or the app on launch
An SDK callSets or clears the badge from an in-app eventsetApplicationIconBadgeNumber on iOS, PushwooshBadge on Android
NothingThe SDK applies whatever badge arrived with the pushNo app code for the basic iOS case
An extensionChanges the count before the notification is displayedPWNotificationExtensionManager with App Groups
What you send
1 / 7
An integer, 5
What happens to the count
Sets the badge to exactly that value
Where it lives
ios_badges / android_badges, or the Badges field
What you send
2 / 7
+1, +3
What happens to the count
Increments the current count
Where it lives
Same field. Also +n in the Android presets
What you send
3 / 7
-1
What happens to the count
Decrements the current count
Where it lives
Same field, for a read or a dismissal on the server side
What you send
4 / 7
0
What happens to the count
Removes the badge from the icon
Where it lives
Same field, or the app on launch
What you send
5 / 7
An SDK call
What happens to the count
Sets or clears the badge from an in-app event
Where it lives
setApplicationIconBadgeNumber on iOS, PushwooshBadge on Android
What you send
6 / 7
Nothing
What happens to the count
The SDK applies whatever badge arrived with the push
Where it lives
No app code for the basic iOS case
What you send
7 / 7
An extension
What happens to the count
Changes the count before the notification is displayed
Where it lives
PWNotificationExtensionManager with App Groups

Where you set it

A Badges field in the composer

The Send-Push form and the push presets take a number, +n, -n or 0. Changing what a campaign does to the count takes no release and no developer.

One key in the API

ios_badges and android_badges in /createMessage. On iOS the value is rendered into the aps.badge field of the payload Apple already carries.

Applied and synced by the SDK

The SDK applies the arriving value with no app code, and keeps the server's notion of the badge current through /setBadge so +1 counts from the right number.

The job it does, inside a journey

One count, several sources

The badge is an attribute of a message you are already sending, so it needs no integration of its own. The same Customer Journey and the same customer profile that decide who gets the push also decide what the count becomes.

So the only open question is what feeds the number. A Message Inbox unread total can be the count outright, a silent push can move it with no alert at all, and a visible mobile push carries it along for the ride. A step at the journey goal takes it back to 0.

Three rewards stack up while the player is away

Each reward granted fires an event, and each event sends a silent push that adds +1. Nothing rings, nothing lights up the lock screen, and by the evening the icon quietly reads 3.

When the live event opens, the same Journey sends one visible push worth interrupting for. Whichever of the two brings the player back, the SDK clears the badge to 0 on launch, so tomorrow’s count starts from something true.

What to use it for

The badge pays off in proportion to count-density: whether your app has a real, building number of unread or pending things worth putting on an icon. Apps built around a counter get a genuine re-engagement nudge for free, and apps with nothing to count get a red dot that trains users to ignore red dots.

MomentWhat the number meansWhy the badge fits
Mobile games · rewards, refilled lives, event entries3 things to collectThe count is part of the retention loop already, and collecting is the whole motivation
Creator & subscription apps · drops, DMs, comments12 unreadA social feed keeps this number internally, so the icon only has to show it
Media & news · unread stories, new episodes5 unread storiesThe textbook case, and the one that reliably brings a reader back into a session
E-commerce & marketplaces · cart items, unread offers2 items in your cartA quiet reminder that costs the shopper none of their attention to receive
Fintech · statements, alerts, pending actions1 action neededThere is a real unread-document count, and the icon carries it without putting detail on a lock screen
Trading & betting · triggered alerts, settled bets4 alerts firedAlerts pile up into a number that actually means something to the user
Healthcare & telemed · results, secure messagesYour results are inThe count travels on the home screen while the content stays behind authentication
EdTech · unread lessons, streaks, assignments2 lessons waitingA streak or a lesson queue is exactly the kind of number people close out
Moment
1 / 8
Mobile games · rewards, refilled lives, event entries
What the number means
3 things to collect
Why the badge fits
The count is part of the retention loop already, and collecting is the whole motivation
Moment
2 / 8
Creator & subscription apps · drops, DMs, comments
What the number means
12 unread
Why the badge fits
A social feed keeps this number internally, so the icon only has to show it
Moment
3 / 8
Media & news · unread stories, new episodes
What the number means
5 unread stories
Why the badge fits
The textbook case, and the one that reliably brings a reader back into a session
Moment
4 / 8
E-commerce & marketplaces · cart items, unread offers
What the number means
2 items in your cart
Why the badge fits
A quiet reminder that costs the shopper none of their attention to receive
Moment
5 / 8
Fintech · statements, alerts, pending actions
What the number means
1 action needed
Why the badge fits
There is a real unread-document count, and the icon carries it without putting detail on a lock screen
Moment
6 / 8
Trading & betting · triggered alerts, settled bets
What the number means
4 alerts fired
Why the badge fits
Alerts pile up into a number that actually means something to the user
Moment
7 / 8
Healthcare & telemed · results, secure messages
What the number means
Your results are in
Why the badge fits
The count travels on the home screen while the content stays behind authentication
Moment
8 / 8
EdTech · unread lessons, streaks, assignments
What the number means
2 lessons waiting
Why the badge fits
A streak or a lesson queue is exactly the kind of number people close out

When the badge is the wrong tool

The badge reports a quantity. Everything about what is waiting, and how urgently, belongs to another surface.

  • The user needs to know what arrived: that is a mobile push, a rich media push or an in-app message.
  • The moment cannot wait. A badge is passive by design, so urgency belongs to an interruption level.
  • The state is ongoing rather than counted: an order en route, a running score. That is a Live Activity.
  • The app has no natural building count. Insurance, hotels, utilities and single-session tools get one bill or one booking, and a badge there is noise.
  • Your audience is Android-heavy and the badge would be a primary mechanic. Treat it as best-effort there and design the flow to work without it.
The count gets them looking. The push still has to be worth opening

50 push notifications worth copying, with the copy and the creative behind each one.

Get the examples

Platform & technical coverage

iOS has one badge, and every iPhone draws it the same way. Android has no universal badge API, so what appears on the home screen is up to the launcher the user happens to be running. The last column names whatever actually draws the number, because for this feature that is where the honest answer lives.

CapabilityiOSAndroidWebDelivered by
Exact badge valueYes, standard aps.badgeBest-effort, launcher-dependentThe push payload, applied by the SDK
Relative +1 and -1Yes, Pushwoosh SDK 6.4.0++n in the presets, launcher-dependentThe push, with /setBadge keeping the counter in sync
Clear to 0YesLauncher-dependentThe push payload, or the app on launch
No-code Badges fieldYes, in the composer and presetsYes, a badge value in the presetsPushwoosh Control Panel
Set or clear from app codesetApplicationIconBadgeNumberPushwooshBadgeYour app, through the Pushwoosh SDK
Change the count before displayYes, in a Notification Service ExtensionPWNotificationExtensionManager with App Groups
Update the badge with no alertYesBest-effortA silent push, same audience and Journey
Launcher and device coverageEvery iPhone, identicallySony, Samsung, LG, HTC, ASUS, ADW, APEX, NOVA, Huawei, ZUK, OPPOcom.pushwoosh:pushwoosh-badge with launcher permissions
Pixel and unsupported launchersn/aNo native Android badge API exists, so nothing renders
Read the current count from the OSiOS exposes no read API, so the count lives in your app or on the server
An app-icon badge at allYesLauncher-dependentBrowsers have no equivalent surface for a web push
Capability
1 / 11
Exact badge value
iOS
Yes, standard aps.badge
Android
Best-effort, launcher-dependent
Web
Delivered by
The push payload, applied by the SDK
Capability
2 / 11
Relative +1 and -1
iOS
Yes, Pushwoosh SDK 6.4.0+
Android
+n in the presets, launcher-dependent
Web
Delivered by
The push, with /setBadge keeping the counter in sync
Capability
3 / 11
Clear to 0
iOS
Yes
Android
Launcher-dependent
Web
Delivered by
The push payload, or the app on launch
Capability
4 / 11
No-code Badges field
iOS
Yes, in the composer and presets
Android
Yes, a badge value in the presets
Web
Delivered by
Pushwoosh Control Panel
Capability
5 / 11
Set or clear from app code
iOS
setApplicationIconBadgeNumber
Android
PushwooshBadge
Web
Delivered by
Your app, through the Pushwoosh SDK
Capability
6 / 11
Change the count before display
iOS
Yes, in a Notification Service Extension
Android
Web
Delivered by
PWNotificationExtensionManager with App Groups
Capability
7 / 11
Update the badge with no alert
iOS
Yes
Android
Best-effort
Web
Delivered by
A silent push, same audience and Journey
Capability
8 / 11
Launcher and device coverage
iOS
Every iPhone, identically
Android
Sony, Samsung, LG, HTC, ASUS, ADW, APEX, NOVA, Huawei, ZUK, OPPO
Web
Delivered by
com.pushwoosh:pushwoosh-badge with launcher permissions
Capability
9 / 11
Pixel and unsupported launchers
iOS
n/a
Android
Web
Delivered by
No native Android badge API exists, so nothing renders
Capability
10 / 11
Read the current count from the OS
iOS
Android
Web
Delivered by
iOS exposes no read API, so the count lives in your app or on the server
Capability
11 / 11
An app-icon badge at all
iOS
Yes
Android
Launcher-dependent
Web
Delivered by
Browsers have no equivalent surface for a web push

Security & hosting

Pushwoosh runs on its own hardware in the US and Germany, under GDPR and BDSG.

ISO 27001:2022 CertifiedISO 27001 CertifiedGDPR CompliantData Privacy FrameworkHIPAA CompliantSOC 2 Type I CertifiedOWASP Compliant

How it works

Setting a badge is no-code and free on every plan. The engineering time sits in two narrow places, and neither of them is the iOS basic case.

  1. Compose the count (no-code)

    Type a number, +n, -n or 0 in the Badges field of the Send-Push form or a preset, or send ios_badges and android_badges through the Messages API. On iOS the basic case needs nothing from your app: the SDK applies the value on arrival.

  2. Wire the two places that need it (developer)

    Android needs the com.pushwoosh:pushwoosh-badge library plus the launcher-specific permissions in the manifest. Clearing on push-open and app-launch is one SDK call, and a Notification Service Extension with App Groups is only for counts that have to change before display.

  3. Orchestrate it (no-code)

    Drive the number from your Message Inbox unread total, move it with a silent push that shows no alert, and clear it at the goal of the same Customer Journey that runs your push, in-app and email.

Limits worth knowing

A count primitive with one uniform platform and one fragmented one. These are its edges.

  • iOS is uniform and first-class. Android is best-effort, because the OS has no universal badge API and the launcher decides what appears.
  • Android coverage is genuinely uneven. Samsung and Xiaomi use different mechanisms, Google’s own Pixel launcher largely does not render icon badges, and some third-party launchers ignore them.
  • Android badge updates are battery-gated. Doze and App Standby throttle the background work they depend on, and a force-stopped app cannot update the count until it is reopened.
  • Huawei devices hand badge control to Huawei’s own launcher, so behavior varies by device and EMUI or HarmonyOS version.
  • Relative +1 and -1 depend on the SDK knowing the current value. An app that overrides the badge without syncing can leave a server-side increment counting from the wrong number, and iOS offers no API to read the system badge back.
  • Badge-via-push mechanics changed in iOS SDK 6.4.0. Apps that used the badge to count received pushes had to migrate, so plan against the current behavior rather than the legacy one.
  • The badge carries a quantity and nothing else. What is waiting, and how urgent it is, has to come from a push, an in-app message or an interruption level.
  • It leaves almost no server-side marker. Only campaigns that explicitly set the badge appear in the stored payload, while SDK-managed apply and clear do not, so measure it by running a badged cohort against an unbadged one rather than looking for it in a report.