I was sending dank memes in the ServiceNow developer community Discord server this morning instead of being at all productive in any way whatsoever - as we do be doin' over there - when someone went and ruined it by asking an intelligent question.
Unfortunately, I found this question really interesting and was thus compelled to write this article about the ideas that flowed from that conversation.
And now you have to read it.
I'm sorry, everyone.
Background Info
The specific question doesn't matter for the point that this article is trying to make (which is about how to communicate changes to your ServiceNow environment), but it helps me illustrate the point of this article (which does, I assure you, have a point).
The question was about how to modify which fields are visible in the ServiceNow Incident activity history formatter thingy - for everyone in the instance.
An individual user can modify which fields' updates they see in the activity history of a ticket by clicking the filter icon at the top-right of the activity formatter, and then selecting from a list of audited fields. Only fields which are audited on the table in question can be selected, but as long as a field is audited (and you have permissions to see that field's value), you can select it from this list and see changes to this field in the ticket's activity history.
But this question was not about how an individual user can change which fields' activity they see; it was about how to change which fields show up in the activity history by default, for everyone.
"By default" tells me that the fields should still be audited, and should still be available for a user to select, but should be de-selected from the activity history formatter's filter (in the screenshot above) by default.
I happen to have looked into how the activity formatter works, so I know that its behavior is controlled by user preference records (in the sys_user_preference
table). Specifically, this behavior is controlled by the "incident.activity.filter
" user preference, the value of which consists of a semicolon-delimited list of audited field names followed by a comma and then true
or false
indicating whether the indicated user has chosen for them to show in their activity feed on that table (i.e. “assigned_to,true;cmdb_ci,true;incident_state,true;…”
etc.
If you don’t know, this problem is an easy one to solve; you just create a default user preference record, like so:
Navigate to the
sys_user_preference
table by typingsys_user_preference.list
into your application navigator filter bar and pressing Enter.Check if you already have a default for this user preference by filtering for records where Name is {table_name}.activity.filter (i.e. incident.activity.filter), System is set to true, and User is empty as in this this encoded query:
name=incident.activity.filter^system=true^userISEMPTY
If so, you’ll want to modify the existing one. If not, create a new one.
Set the Name field to
incident.activity.filter
, the Type field toString
, the System field totrue
, leave the User field blank, and set the value to whatever you’d like the default value for this user preference record to be.
An easy way to determine what the value should be, is to set your own preference record to whatever you want the default selection to be, then just copy your own account’s user preference record value into your default one.
Okay, sure, but what about users who have already customized their own activity filter?
Those users will not be impacted by this change. Default user preferences only apply to users who do not have user-specific preference records.
What if I want these new defaults to apply to everyone, overriding any user-specific customizations they may have had?
Rude; but sure, you can do that. Just delete all of their user preference records. You’ll have to do this separately and manually (or semi-manually, with a script) in each instance of course; but it can be done.
Pro-tip: User preferences are not typically captured in Update Sets. However, if the System field is set to true, then they will be captured in your Update Set! This means you don’t need to push the “default” user preference record into your Update Set using something like my “Include in Update Set” tool (though you totally should have it in your environment because it’s awesome).
Communicating Your Changes
You’ve communicated with your stakeholders. You’ve decided whether to delete any user-customized preferences for this user preference. What’s next? Test and deploy?
Let’s imagine what would happen if we pushed a change like this to production without properly and adequately communicating it to our users.
We’d start getting calls right away. “It used to be like this, and now it’s like that! I don’t like it when things change!” - “I can’t see the date when the ticket was created in the activity history anymore! I need to be able to keep track of that! What if it changes!? Am I just supposed to ignore the possibility of time-travel!? Change it back!”
How do we avoid the abject rage of these bescorned users?
Well, that’s one option…
No, not like that! We do it with ✨communication✨!
But, how do we communicate this information?
We could set up a newsletter… but literally nobody would read it. Especially if it went out to everyone, instead of being targeted at the people to whom each change was relevant.
How can we make sure to communicate the changes we made only to those users to whom the changes are relevant, while making sure that all of those users understand how the changes relate to them?
Guided Tours, baby!
Sorry for calling you ‘baby’.
Okay, I know, Guided Tours in ServiceNow kinda suck. They’re incredibly fragile, they don’t work in a lot of situations, they were straight-up just broken in the Vancouver release for no apparent reason and nobody seemed to care… but oh man, when they work…
Guided Tours have enormous potential, and one way to show ServiceNow that they’re important to us (and hopefully get them to stop breaking the darn things), is by using them.
The fragility of Guided Tours means that big, complicated, or critical use-cases are probably not advisable; but for situations like this, they’re perfect.
…As long as you’re on a version of ServiceNow that didn’t break them. ಠ_ಠ
In this case, what I’d do is create a Guided Tour called “Incident Activity History Changes”, and make it available only to people who are likely to need to know what’s going on with the activity history on that form and care what fields are selected: itil users.
With Guided Tours, you can even disable auto-launch, but create a corresponding Knowledge Article or form annotation thingy that has a link which directly launches the Guided Tour!
The main down-side to Guided Tours? Well, they don’t… work…
I mean, they do… sometimes.
I’m told that ServiceNow is working on un-breaking them… again… but resolving technical debt and fixing core functionality that they’ve broken has never really been ServiceNow’s strong suit, y’know?
Pro-tip for Guided Tours: Whenever your next “step” is on an element or control which may or may not exist depending on the user’s persona or permissions, consider making that (and perhaps a chunk of following related steps) be skippable so that the tour doesn’t automatically bail out the moment it hits a step tagged to an element that the user might not see. You can sometimes even go so far as to create whole skippable error-handling paths within your Guided Tours but since Guided Tours are highly linear, that is very rarely worth the extra work.
Just remember to always test your Guided Tours as different user personas, the same way you’d test any other functionality you build!
Conveyance
A big part of User Experience (UX) design is “conveyance”: the seamless and intuitive flow of information and guidance relating to the user’s journey to achieve whatever goal they’re aiming for as they use your fancy-fresh app.
Think of conveyance as representing how well your app’s UI communicates what an interface or element element does, how to interact with it, and what the result of that interaction will be. It's about making the function and purpose of elements clear intuitively, without requiring too much explanation.
Effective UX conveyance consists of a whole bunch of complicated ideas that can be hard to describe in writing, and largely come down to intuition and the developer’s ability to imagine the perspective of a user who is new to their application… so rather than try to explain UX conveyance in words, I’m going to outsource the job to my two favorite YouTube videos on the topic:
Good Conveyance: Mega Man X
Bad Conveyance: Dr. Jekyll & Mr. Hyde
-
2025
- Sep 14, 2025 Communicating Changes to Your Users (& Setting Default User Preferences in ServiceNow) Sep 14, 2025
- Mar 24, 2025 Calculate Distance Between Two Locations in ServiceNow (without an API call!) Mar 24, 2025
- Mar 11, 2025 5 Ways to Check your ServiceNow Instance for DANGEROUS CODE in Less Than 5 minutes Mar 11, 2025
-
2024
- Mar 28, 2024 How to Identify Duplicate Records by Multiple Fields in ServiceNow Mar 28, 2024
- Mar 7, 2024 How to Merge Personal & Company ServiceNow Accounts Mar 7, 2024
- Feb 12, 2024 5 Lessons About Programming From Richard Feynman Feb 12, 2024
-
2023
- Jul 5, 2023 Managing Instance-Specific System Properties for Dev/Test/Prod in ServiceNow Jul 5, 2023
- Apr 28, 2023 Your ACLs and Business Rules are Broken (Here's How to Fix Them) Apr 28, 2023
-
2022
- Dec 13, 2022 ServiceNow Developers: BE THE GUIDE! Dec 13, 2022
- Oct 19, 2022 A Faster, More Efficient Client-side GlideRecord (Free tool!) Oct 19, 2022
- Oct 9, 2022 Animated Loading Message & Collapsible Details on ServiceNow Form or Field (Client-side) Oct 9, 2022
- Aug 23, 2022 Using .addJoinQuery() & How to Query Records with Attachments in ServiceNow Aug 23, 2022
- Aug 18, 2022 Free, Simple URL Shortener for ServiceNow Nerds (snc.guru) Aug 18, 2022
- Aug 16, 2022 How to Get and Parse ServiceNow Journal Entries as Strings/HTML Aug 16, 2022
- Aug 14, 2022 New tool: Get Latest Version of ServiceNow Docs Page Aug 14, 2022
- Mar 4, 2022 How to Set or Change ServiceNow Application's Repository URL, Credentials, or SSH Key Mar 4, 2022
- Feb 7, 2022 How to return a CSV file from a Scripted REST API (SRAPI) in ServiceNow Feb 7, 2022
-
2021
- May 3, 2021 Adding a Guided Setup to Your ServiceNow Application May 3, 2021
- Apr 27, 2021 Use Automated Tests to Validate "Guided Setup" Completion & Functionality. Apr 27, 2021
- Feb 11, 2021 "Processors", SRAPIs, and How to Run a Script and Redirect a User From a URL in ServiceNow Feb 11, 2021
-
2020
- Nov 17, 2020 SN Guys is now part of Jahnel Group! Nov 17, 2020
- Sep 14, 2020 Better ServiceNow Notifications (& Another FREE Tool!) Sep 14, 2020
- Jul 31, 2020 Debugging Client & Catalog Client Scripts in ServiceNow Jul 31, 2020
- Jan 20, 2020 Getting Help from the ServiceNow Community Jan 20, 2020
-
2019
- Dec 18, 2019 Can ServiceNow Script Includes Use the "current" Variable? Dec 18, 2019
- Nov 18, 2019 Handling 'text/plain' and Other Unsupported Content Types in ServiceNow Scripted REST APIs Nov 18, 2019
- Apr 21, 2019 Understanding Attachments in ServiceNow Apr 21, 2019
- Apr 10, 2019 Using Custom Search Engines in Chrome to Quickly Navigate ServiceNow Apr 10, 2019
- Apr 4, 2019 Set Catalog Variables from URL Params (Free tool) Apr 4, 2019
- Apr 1, 2019 Outlook for Android Breaks Email Approvals (+Solution) Apr 1, 2019
- Mar 11, 2019 GlideFilter is Broken - Free Tool: “BetterGlideFilter” Mar 11, 2019
- Feb 27, 2019 Making Update Sets Smarter - Free Tool Feb 27, 2019
-
2018
- Nov 29, 2018 How to Learn ServiceNow Nov 29, 2018
- Nov 6, 2018 ServiceNow & ITSM as a Career? Nov 6, 2018
- Oct 19, 2018 Asynchronous onSubmit Catalog/Client Scripts in ServiceNow Oct 19, 2018
- Oct 11, 2018 How to do Massive, Slow Database Operations Efficiently With Event-Driven Recursion Oct 11, 2018
- Sep 18, 2018 Broken Queries & Query Business Rules in ServiceNow Sep 18, 2018
- Sep 7, 2018 JournalRedactor - Easily Redact or Delete Journal Entries in ServiceNow! Sep 7, 2018
- Jul 23, 2018 Admin Duty Separation with a Single Account Jul 23, 2018
- Jun 19, 2018 Improving Performance on Older Instances with Table Rotation Jun 19, 2018
- Jun 4, 2018 New Free Tool: Login Link Generator Jun 4, 2018
- May 29, 2018 Learning ServiceNow: Second Edition! May 29, 2018
- Apr 17, 2018 Upgrading From Express to Enterprise: What's Missing Apr 17, 2018
- Apr 12, 2018 If a Genie Gave Me Three Wishes, I'd Use Them All to "Fix" Scope Apr 12, 2018
- Mar 19, 2018 Service Catalog "Try in Portal" button Mar 19, 2018
- Mar 15, 2018 Video: Custom Output Transition Conditions From a Single Workflow (Script) Activity Mar 15, 2018
- Feb 11, 2018 We have a new book! Feb 11, 2018
-
2017
- Nov 6, 2017 Requiring Attachments (& Other Miracles) in Service Portal Nov 6, 2017
- Sep 12, 2017 Handling TimeZones in ServiceNow (TimeZoneUtil) Sep 12, 2017
- Jul 27, 2017 How to Enable DOM Manipulation in ServiceNow Service Portal Catalog Client Scripts Jul 27, 2017
- Jun 25, 2017 What's New in ServiceNow: Jakarta (Pt. 1) Jun 25, 2017
- Jun 4, 2017 Powerful Scripted Text Search in ServiceNow Jun 4, 2017
- May 9, 2017 Work at Lightspeed: ServiceNow's Plan for World Domination May 9, 2017
- Apr 9, 2017 Avoiding Pass-By-Reference Using getValue() & setValue() Apr 9, 2017
- Apr 4, 2017 "Learning ServiceNow" is Now Available for Purchase! Apr 4, 2017
- Mar 12, 2017 reCAPTCHA in ServiceNow CMS/Service Portal Mar 12, 2017
-
2016
- Dec 20, 2016 Pro Tip: Use updateMultiple() for Maximum Efficiency! Dec 20, 2016
- Dec 2, 2016 We're Writing a Book! Dec 2, 2016
- Nov 10, 2016 Chrome Extension: Load in ServiceNow Frame Nov 10, 2016
- Sep 7, 2016 Force-Include Any Record Into an Update Set Sep 7, 2016
- Sep 1, 2016 GlideRecord Pagination - Page through your GlideRecord query Sep 1, 2016
- Jul 17, 2016 Granting Temporary Roles/Groups in ServiceNow Jul 17, 2016
- Jul 15, 2016 Scripted REST APIs & Retrieving RITM Variables via SRAPI Jul 15, 2016
- May 17, 2016 What's New in Helsinki? May 17, 2016
- Apr 27, 2016 Customizing UI16 Through CSS and System Properties Apr 27, 2016
- Apr 5, 2016 ServiceNow Versions: Express Vs. Enterprise Apr 5, 2016
- Mar 28, 2016 Update Set Collision Avoidance Tool: V2 Mar 28, 2016
- Mar 18, 2016 ServiceNow: What's New in Geneva & UI16 (Pt. 2) Mar 18, 2016
- Feb 22, 2016 Reference Field Auto-Complete Attributes Feb 22, 2016
- Feb 6, 2016 GlideRecord & GlideAjax: Client-Side Vs. Server-Side Feb 6, 2016
- Feb 1, 2016 Make Your Log Entries Easier to Find Feb 1, 2016
- Jan 29, 2016 A Better, One-Click Approval Jan 29, 2016
- Jan 25, 2016 Quickly Move Changes Between Update Sets Jan 25, 2016
- Jan 20, 2016 Customize the Reference Icon Pop-up Jan 20, 2016
- Jan 7, 2016 ServiceNow: Geneva & UI16 - What's new Jan 7, 2016
- Jan 4, 2016 Detect/Prevent Update Set Conflicts Before They Happen Jan 4, 2016
-
2015
- Dec 28, 2015 SN101: Boolean logic and ServiceNow's Condition Builder Dec 28, 2015
- Dec 17, 2015 Locate any record in any table, by sys_id in ServiceNow Dec 17, 2015
- Dec 16, 2015 Detecting Duplicate Records with GlideAggregate Dec 16, 2015
- Dec 11, 2015 Array.indexOf() not working in ServiceNow - Solution! Dec 11, 2015
- Dec 2, 2015 Understanding Dynamic Filters & Checking a Record Against a Filter Using GlideFilter Dec 2, 2015
- Oct 20, 2015 Bookmarklet: Load the current page in the ServiceNow frame Oct 20, 2015
- Aug 27, 2015 Easily Clone One User's Access to Another User Aug 27, 2015