Implementation worksheet · 7 min read
An onboarding dismissal and opt-out policy
Offer three distinct choices and store each as its own decision: 'Not now' snoozes one flow for a set period, 'Don't show this again' ends one flow for that user, and a global onboarding opt-out stops optional tours, checklists and tips that the product starts. Write down what the opt-out doesn't cover, such as security, billing and legal notices, and deliver those through a channel the opt-out doesn't govern, so the two rules can never contradict each other. Guidance the user explicitly asks for, like replaying a tour from Help, still runs. Store every decision per user on the server, show the current state in settings, and make turning guidance back on as easy as turning it off.
Dismissal is the most honest feedback an onboarding flow receives, and it's easy to throw away by treating every close button the same. This policy covers a signed-in user of a web or mobile product receiving optional in-app guidance. Email and push preferences usually live in a separate preference center and are out of scope. Account-critical messages are deliberately excluded, for reasons the failure section makes concrete.
Put it into practice
1. Name the three choices and what each one suppresses
'Not now' affects one flow, temporarily. 'Don't show this again' affects one flow, permanently, for this version. The global opt-out affects every optional flow the product starts. Put the exact wording users see in the policy, because 'Close' and 'Skip' are ambiguous and each needs mapping to one of the three.
2. Separate optional guidance from required notices first
List every in-app message type and mark each optional or required. Required means the user must see it whatever their preference: a sign-in from a new device, a failed payment, a terms change your counsel says must be shown. Route required notices through the product's own notification component, not the onboarding layer. Check with counsel on which notices are legally required in your markets.
3. Give 'Not now' a duration, not a session
A snooze that ends with the session comes back at the next login, which users read as the product not listening. Give it a period (seven days in the worked example) and count it against your frequency budget, so a snoozed tour can't return sooner than any other prompt could.
4. Make 'Don't show this again' final for that flow version
Store the flow ID and version with the decision. Decide in advance whether a substantially new version may be shown once to people who dismissed the old one. If yes, say so in the policy and cap it at one re-show. Silent re-targeting on every edit turns 'never' into 'until we change the copy'.
5. Put the global opt-out where people look for it
A toggle in account settings, plus a link to it from the close menu of every optional tour. Show its current state. Turning guidance back on should take no more steps than turning it off, and should be reachable from the same place.
6. Keep user-requested guidance working
The opt-out stops guidance the product starts. If a user who opted out opens Help and chooses 'Replay the setup tour', run it. Refusing a tour the user just asked for isn't respecting a preference; it ignores a newer one.
7. Store per user, server-side, and test it
Local storage forgets across browsers and devices. Store the three decisions against the user's identity and sync them to every client that shows guidance. For team products, decide whether an admin can turn guidance off for a workspace, and make a member's own opt-out survive an admin switching it back on.
Dismissal and opt-out policy worksheet
Copy this structure into your review document and record your observed result for each row.
| Message or flow | Class | Close or snooze behavior | Under the global opt-out |
|---|---|---|---|
| Welcome tour | Optional | 'Not now' snoozes for 7 days | Not started |
| Setup checklist | Optional | Collapses; tasks stay available in the product | Hidden; progress kept |
| Tip on the new Export button | Optional | 'Don't show this again' ends it for this version | Not started |
| Replay tour from Help | User-requested | Closes like any tour | Runs, because the user asked |
| In-app survey | Out of scope | Survey dismissal rules apply | Governed by the survey policy |
| New-device sign-in alert | Required | Closes after it has been shown | Still shown; product notification system |
| Failed payment notice | Required | Can be closed for the session | Still shown; product notification system |
| Terms change notice | Required if counsel says so | Closes on acknowledgement | Still shown; product notification system |
| Workspace admin turns guidance off | Admin setting | Applies to all members | Member opt-outs survive an admin re-enable |
A failure worth checking
The opt-out that swallowed a security notice. A team routes every in-app message through the onboarding tool because it's convenient. A user turns off tips. Weeks later a sign-in from a new country triggers a banner through the same tool, which honors the opt-out and shows nothing. Or someone notices and adds an override, and now the opt-out has an undocumented exception that users can't see. Separate the delivery path for required notices before offering an opt-out, not after the first incident.
Common questions
Should dismissing the setup checklist mark its tasks complete?
No. Dismissal is a statement about the checklist, not about the work. Keep task completion tied to the product events that prove it, so analytics never count a dismissed checklist as activation, and let the user bring the checklist back from settings or Help.
Is an opt-out for onboarding tours legally required?
This policy doesn't answer that, and the answer can depend on jurisdiction and on what data the guidance uses. Check with counsel. The case made here is product trust: a preference users can see, change and rely on.
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.