PLG OS

Implementation worksheet · 6 min read

A gamification notification preference checklist

Give each gamification notification type its own preference and channel setting instead of one on/off switch: streak-at-risk reminders, badge and milestone celebrations, leaderboard rank changes and challenge invitations behave differently and bother different people. Default the competitive ones, like a rank drop, to off or in-app only; respect quiet hours in the user's own time zone; and let a celebration be acknowledged without an animation. Then test every type on every channel, because a setting that stops the push but still sends the email is exactly the failure this checklist exists to catch.

Gamification notifications are persuasive by design, which is the reason to handle them carefully. A streak reminder at 23:30 local time, or an alert that a teammate just overtook you, is working exactly as built, and either can push someone to switch notifications off for the whole product. This checklist covers in-app, email and push messages generated by streaks, badges, leaderboards and challenges. It assumes you already have an account-level notification preference center to plug into.

Put it into practice

1. Inventory every message the gamification layer can trigger

Record trigger, channel, frequency cap and copy for each. Include messages another system sends using gamification data, such as a weekly digest that mentions the user's streak. Those are easy to miss, because a different team built them.

2. Split preferences by type, then add a master switch

Separate toggles for reminders, celebrations, competitive updates and social invitations, plus one master switch for all of gamification. A single switch forces users to lose the messages they like to stop the one they don't.

3. Choose a default per type and write down why

Reminders might start on with a strict daily cap; celebrations in-app only; competitive updates off. These are product decisions, not universal answers. Record the reasoning so the default can be revisited with evidence rather than habit.

4. Apply quiet hours in the user's own time zone

A streak-at-risk reminder near the end of the user's day must not fire inside quiet hours. Send it before quiet hours start, or skip it. Use the same time zone rule your streak logic uses, or the reminder and the streak will disagree about when the day ends.

5. Let celebrations be quiet

Honor the operating system's reduced-motion setting, which browsers expose as the prefers-reduced-motion CSS media feature, and offer an in-product setting as well. A badge can appear without confetti and still be a celebration. For context, WCAG 2.2 criterion 2.3.3 Animation from Interactions is Level AAA.

6. Put an off switch on every message

Each email and push should link to the specific preference that controls it, and each in-app notification should offer 'Stop these' in its menu. Landing on the generic settings page makes users hunt, and some will reach for the master switch instead.

7. Test the full matrix, including a distant time zone

For every type and channel: turn it off, trigger the event, confirm nothing arrives. Turn the master switch off and confirm account and security messages still arrive, since this checklist doesn't govern them. Repeat with a test user whose time zone is far from your servers'.

Preference test matrix

Copy this structure into your review document and record your observed result for each row.

Preference test matrix
Notification typeDefault (illustrative)Channels governedTest to pass
Streak at riskOn; in-app, plus push if the user opted into push; at most one a dayIn-app, push, emailToggle off: nothing on any channel the next day
Streak lostIn-app onlyIn-appShown once at the next visit; no push sent
Badge or milestone earnedIn-app onlyIn-app, weekly email digestReduced motion on: badge shown without animation
Leaderboard rank droppedOffIn-app, pushStays off after an app update and a new sign-in
Overtaken by a named teammateOffIn-app, pushWhen on, names shown only for users who allow it
Challenge invitationOn, in-appIn-app, emailDeclining stops reminders for that challenge
Weekly progress digestOn, emailEmailFooter link opens this exact toggle
Quiet hours22:00 to 08:00, user's local timePush, emailReminder due at 23:30 local is sent earlier or skipped
Gamification master switchOnAll types aboveOff: none of the above sent; account notices still arrive

A failure worth checking

The preference that governs one channel. A user turns off streak reminders in the app, and the toggle writes to the push service. The weekly email, built by another team from the same streak data, still says 'Don't lose your 12-day streak!' The user decides the setting is decorative and unsubscribes from all product email, including the messages about shared work they actually wanted. Store preferences in one place that every sender reads, and test each type across every channel before launch, not after the complaint.

Common questions

Should streak reminders be on by default?

Decide it explicitly instead of inheriting a vendor's default. A common compromise is on, with a strict cap, in-app first, escalating to push only for users who opted into push. Whatever you choose, judge it by whether reminded users do more of the product's core action, not by whether they open the app.

Is reduced motion a WCAG requirement?

prefers-reduced-motion is a CSS media feature that reports a user's system setting; it isn't a WCAG rule. The closest criterion, 2.3.3 Animation from Interactions, is Level AAA, so a Level AA target doesn't include it. Honoring the setting for celebration animations is still cheap and worth doing.

Basis and scope

This is a proposed implementation method using illustrative examples, not a measured benchmark or a customer case study. Prepared with AI assistance. Validate product-specific behavior against current documentation and your own test environment.

Continue with PLG OS

Explore onboarding →