I’m currently working on a marketing preferences screen where a user can control what marketing comms they receive and the channels they receive them on. A business decision was made to keep the channels at a global level, rather than allow the user granular control at the category level.
The preferred approach is to auto save preference changes, rather than a global save button as we want it to feel more like a native experience. We don’t have a dedicated native app, just a native wrapper for the web experience so our solution needs to work for both, although 75% of our users use the native app.
The challenge with these constraints is that it makes preventing the preferences from falling into an invalid state a bit tricky (see table).
Global preference | Category | Channel | Valid? |
---|---|---|---|
Off | Any selection | null | No |
Off | null | Any selection | No |
Off | Any selection | Any selection | No |
Off | null | null | Yes |
On | Any selection | Any selection | Yes |
On | null | Any selection | No |
On | Any selection | null | No |
Currently, the options we’ve explored are:
- Don’t force valid preference state - allow preferences to fall into invalid states and provide feedback to user (see visual)
- Once the last category/channel is opted out of, disable the opposing section where options are still enabled
- Once the last category/channel is opted out of, automatically toggle any enabled options off in the other opposing section
- Once the last category/channel is opted out of, show dialog saying they’re about to opt out of all comms
- Change inputs from switches to checkboxes (does auto save behaviour still work here?)
- Change whole approach to use a global save button (and checkboxes) rather than auto save - allows for clear inline validation
None of the solutions feel quite right, so my question is, is there a nice way to prevent the preferences from falling into these invalid states in the first place, aside from going with option 6?
Failing that, is there a better way to indicate the preferences are invalid other than the options outlined above?