[{"data":1,"prerenderedAt":816},["ShallowReactive",2],{"page-\u002Fblog\u002Fservicenow-update-sets-complete-guide-migration-mastery\u002F":3,"related-\u002Fblog\u002Fservicenow-update-sets-complete-guide-migration-mastery\u002F":778},{"id":4,"title":5,"author":6,"authorUrl":7,"body":8,"date":751,"dateUpdated":751,"description":752,"dqid":751,"excerpt":753,"extension":754,"faq":755,"headline":5,"meta":768,"navigation":196,"path":769,"seo":770,"socialImage":771,"stem":772,"tags":773,"__hash__":777},"content\u002Fblog\u002Fservicenow-update-sets-complete-guide-migration-mastery.md","ServiceNow Update Sets: A Complete Guide to Clean Migrations","Gabriel Fordan","https:\u002F\u002Fsn-tricks.com\u002Fabout",{"type":9,"value":10,"toc":738},"minimark",[11,15,18,23,36,39,53,57,60,77,80,94,110,114,117,120,130,140,147,151,154,161,391,399,403,409,508,511,515,518,529,532,536,570,573,577,584,587,643,653,657,663,679,683,689,692,696,722,734],[12,13,14],"p",{},"An update set records the configuration changes you make on one ServiceNow instance so you can move them to another. The idea is simple. The problems come from what update sets do not capture, from changes recorded in the wrong set, and from committing sets in the wrong order.",[12,16,17],{},"This guide walks through the whole path, from creating an update set in development to committing it in production.",[19,20,22],"h2",{"id":21},"how-update-sets-work","How update sets work",[12,24,25,26,30,31,35],{},"When you change a tracked record, ServiceNow writes a ",[27,28,29],"strong",{},"Customer Update"," record to the ",[32,33,34],"code",{},"sys_update_xml"," table and attaches it to your current update set. The record holds an XML snapshot of the whole configuration record, not a diff.",[12,37,38],{},"Two consequences follow:",[40,41,42,46],"ul",{},[43,44,45],"li",{},"The last captured version of a record wins. If two developers edit the same business rule in different update sets, the set committed second overwrites the first.",[43,47,48,49,52],{},"A table is only tracked when its dictionary entry has the ",[32,50,51],{},"update_synch"," attribute. Most configuration tables have it. Data tables do not.",[19,54,56],{"id":55},"what-update-sets-capture-and-what-they-miss","What update sets capture and what they miss",[12,58,59],{},"Captured:",[40,61,62,65,68,71,74],{},[43,63,64],{},"Business rules, script includes, client scripts, UI policies, and UI actions",[43,66,67],{},"Tables, fields, and dictionary changes",[43,69,70],{},"Form and list layouts, views, and related lists",[43,72,73],{},"Flows, catalog items, variables, and notifications",[43,75,76],{},"Access controls and roles",[12,78,79],{},"Not captured:",[40,81,82,85,88,91],{},[43,83,84],{},"Task records such as incidents, changes, and requests",[43,86,87],{},"Users, groups, and group memberships",[43,89,90],{},"Configuration items and other CMDB data",[43,92,93],{},"Most records in data lookup and custom data tables",[12,95,96,97,100,101,103,104,109],{},"If a flow assigns work to a group, the flow moves but the group does not. The flow then points at a ",[32,98,99],{},"sys_id"," that does not exist on the target. Create the group on the target with the same ",[32,102,99],{}," by exporting it as XML from the source and importing it, or load it through an ",[105,106,108],"a",{"href":107},"\u002Fblog\u002Fservicenow-import-set-transform-map-best-practices","import set",".",[19,111,113],{"id":112},"create-and-name-update-sets","Create and name update sets",[12,115,116],{},"Create one update set per story or defect, in the application scope where the work lives. An update set belongs to a single scope, so work that touches two scopes needs two sets.",[12,118,119],{},"Use a name that sorts well and explains itself:",[121,122,128],"pre",{"className":123,"code":125,"language":126,"meta":127},[124],"language-text","STRY0012345 - Incident - Auto-assign by category - v1\n","text","",[32,129,125],{"__ignoreMap":127},[12,131,132,133,136,137,109],{},"Put the story number first, then the area, a short description, and a version. When you need a fix after the first set is complete, create ",[32,134,135],{},"v2"," instead of reopening ",[32,138,139],{},"v1",[12,141,142,143,146],{},"Never do real work in the ",[27,144,145],{},"Default"," update set. It exists to catch changes made when nobody picked a set, and it should not be moved between instances.",[19,148,150],{"id":149},"check-which-update-set-you-are-in","Check which update set you are in",[12,152,153],{},"Most misplaced changes happen because a developer switched application scope and the update set picker changed with it. Confirm the picker before you save anything.",[12,155,156,157,160],{},"To review what a set contains before you complete it, run this in ",[27,158,159],{},"Scripts - Background"," on a development instance:",[121,162,166],{"className":163,"code":164,"language":165,"meta":127,"style":127},"language-javascript shiki shiki-themes github-light github-light","var setName = 'STRY0012345 - Incident - Auto-assign by category - v1';\n\nvar update = new GlideRecord('sys_update_xml');\nupdate.addQuery('update_set.name', setName);\nupdate.orderBy('type');\nupdate.query();\n\ngs.info(update.getRowCount() + ' updates in \"' + setName + '\"');\nwhile (update.next()) {\n  gs.info(update.getValue('type') + ' | ' + update.getValue('target_name') +\n    ' | ' + update.getValue('sys_created_by'));\n}\n","javascript",[32,167,168,191,198,224,241,256,267,272,308,323,365,385],{"__ignoreMap":127},[169,170,173,177,181,184,188],"span",{"class":171,"line":172},"line",1,[169,174,176],{"class":175},"sCydW","var",[169,178,180],{"class":179},"sKWpL"," setName ",[169,182,183],{"class":175},"=",[169,185,187],{"class":186},"sOTlB"," 'STRY0012345 - Incident - Auto-assign by category - v1'",[169,189,190],{"class":179},";\n",[169,192,194],{"class":171,"line":193},2,[169,195,197],{"emptyLinePlaceholder":196},true,"\n",[169,199,201,203,206,208,211,215,218,221],{"class":171,"line":200},3,[169,202,176],{"class":175},[169,204,205],{"class":179}," update ",[169,207,183],{"class":175},[169,209,210],{"class":175}," new",[169,212,214],{"class":213},"se37E"," GlideRecord",[169,216,217],{"class":179},"(",[169,219,220],{"class":186},"'sys_update_xml'",[169,222,223],{"class":179},");\n",[169,225,227,230,233,235,238],{"class":171,"line":226},4,[169,228,229],{"class":179},"update.",[169,231,232],{"class":213},"addQuery",[169,234,217],{"class":179},[169,236,237],{"class":186},"'update_set.name'",[169,239,240],{"class":179},", setName);\n",[169,242,244,246,249,251,254],{"class":171,"line":243},5,[169,245,229],{"class":179},[169,247,248],{"class":213},"orderBy",[169,250,217],{"class":179},[169,252,253],{"class":186},"'type'",[169,255,223],{"class":179},[169,257,259,261,264],{"class":171,"line":258},6,[169,260,229],{"class":179},[169,262,263],{"class":213},"query",[169,265,266],{"class":179},"();\n",[169,268,270],{"class":171,"line":269},7,[169,271,197],{"emptyLinePlaceholder":196},[169,273,275,278,281,284,287,290,293,296,299,301,303,306],{"class":171,"line":274},8,[169,276,277],{"class":179},"gs.",[169,279,280],{"class":213},"info",[169,282,283],{"class":179},"(update.",[169,285,286],{"class":213},"getRowCount",[169,288,289],{"class":179},"() ",[169,291,292],{"class":175},"+",[169,294,295],{"class":186}," ' updates in \"'",[169,297,298],{"class":175}," +",[169,300,180],{"class":179},[169,302,292],{"class":175},[169,304,305],{"class":186}," '\"'",[169,307,223],{"class":179},[169,309,311,314,317,320],{"class":171,"line":310},9,[169,312,313],{"class":175},"while",[169,315,316],{"class":179}," (update.",[169,318,319],{"class":213},"next",[169,321,322],{"class":179},"()) {\n",[169,324,326,329,331,333,336,338,340,343,345,348,350,353,355,357,360,362],{"class":171,"line":325},10,[169,327,328],{"class":179},"  gs.",[169,330,280],{"class":213},[169,332,283],{"class":179},[169,334,335],{"class":213},"getValue",[169,337,217],{"class":179},[169,339,253],{"class":186},[169,341,342],{"class":179},") ",[169,344,292],{"class":175},[169,346,347],{"class":186}," ' | '",[169,349,298],{"class":175},[169,351,352],{"class":179}," update.",[169,354,335],{"class":213},[169,356,217],{"class":179},[169,358,359],{"class":186},"'target_name'",[169,361,342],{"class":179},[169,363,364],{"class":175},"+\n",[169,366,368,371,373,375,377,379,382],{"class":171,"line":367},11,[169,369,370],{"class":186},"    ' | '",[169,372,298],{"class":175},[169,374,352],{"class":179},[169,376,335],{"class":213},[169,378,217],{"class":179},[169,380,381],{"class":186},"'sys_created_by'",[169,383,384],{"class":179},"));\n",[169,386,388],{"class":171,"line":387},12,[169,389,390],{"class":179},"}\n",[12,392,393,394,398],{},"Look for updates you did not expect, such as a form layout you opened by accident, and for updates made by someone else. See the ",[105,395,397],{"href":396},"\u002Fblog\u002Fservicenow-gliderecord-query-performance","GlideRecord query performance guide"," for more on writing queries like this one.",[19,400,402],{"id":401},"add-a-record-that-was-not-captured","Add a record that was not captured",[12,404,405,406,408],{},"Sometimes you need to carry a single data record, such as a system property value or a lookup row, inside an update set. Open the record, then run this with its table and ",[32,407,99],{},":",[121,410,412],{"className":163,"code":411,"language":165,"meta":127,"style":127},"var record = new GlideRecord('sys_properties');\nif (record.get('name', 'x_acme.feature.enabled')) {\n  new GlideUpdateManager2().saveRecord(record);\n  gs.info('Added ' + record.getDisplayValue() + ' to the current update set');\n}\n",[32,413,414,434,459,476,504],{"__ignoreMap":127},[169,415,416,418,421,423,425,427,429,432],{"class":171,"line":172},[169,417,176],{"class":175},[169,419,420],{"class":179}," record ",[169,422,183],{"class":175},[169,424,210],{"class":175},[169,426,214],{"class":213},[169,428,217],{"class":179},[169,430,431],{"class":186},"'sys_properties'",[169,433,223],{"class":179},[169,435,436,439,442,445,447,450,453,456],{"class":171,"line":193},[169,437,438],{"class":175},"if",[169,440,441],{"class":179}," (record.",[169,443,444],{"class":213},"get",[169,446,217],{"class":179},[169,448,449],{"class":186},"'name'",[169,451,452],{"class":179},", ",[169,454,455],{"class":186},"'x_acme.feature.enabled'",[169,457,458],{"class":179},")) {\n",[169,460,461,464,467,470,473],{"class":171,"line":200},[169,462,463],{"class":175},"  new",[169,465,466],{"class":213}," GlideUpdateManager2",[169,468,469],{"class":179},"().",[169,471,472],{"class":213},"saveRecord",[169,474,475],{"class":179},"(record);\n",[169,477,478,480,482,484,487,489,492,495,497,499,502],{"class":171,"line":226},[169,479,328],{"class":179},[169,481,280],{"class":213},[169,483,217],{"class":179},[169,485,486],{"class":186},"'Added '",[169,488,298],{"class":175},[169,490,491],{"class":179}," record.",[169,493,494],{"class":213},"getDisplayValue",[169,496,289],{"class":179},[169,498,292],{"class":175},[169,500,501],{"class":186}," ' to the current update set'",[169,503,223],{"class":179},[169,505,506],{"class":171,"line":243},[169,507,390],{"class":179},[12,509,510],{},"Use this sparingly. It suits a handful of supporting records. It is the wrong tool for bulk data.",[19,512,514],{"id":513},"batch-related-update-sets","Batch related update sets",[12,516,517],{},"A release usually contains many update sets. Committing them one at a time, in the right order, is slow and easy to get wrong.",[12,519,520,521,524,525,528],{},"Use a ",[27,522,523],{},"batch"," instead. Create a parent update set for the release and set the ",[27,526,527],{},"Parent"," field on each child. On the target instance you preview and commit the parent, and ServiceNow processes every child in one operation and resolves the order of updates to the same record by timestamp.",[12,530,531],{},"Batches are a better choice than merging. A merge produces one new set and loses the link between each change and its story. A batch keeps every child intact, which makes it possible to pull one story out of a release.",[19,533,535],{"id":534},"move-the-update-set","Move the update set",[537,538,539,549,564],"ol",{},[43,540,541,542,545,546,109],{},"On the source instance, set the update set ",[27,543,544],{},"State"," to ",[27,547,548],{},"Complete",[43,550,551,552,555,556,559,560,563],{},"On the target instance, open ",[27,553,554],{},"System Update Sets > Update Sources"," and select ",[27,557,558],{},"Retrieve Completed Update Sets",". If the instances cannot connect, export the set to XML on the source and use ",[27,561,562],{},"Import Update Set from XML"," on the target.",[43,565,566,567,109],{},"Open the set under ",[27,568,569],{},"Retrieved Update Sets",[12,571,572],{},"Move sets through every environment in the same order. A set that skipped test should not reach production.",[19,574,576],{"id":575},"preview-and-resolve-problems","Preview and resolve problems",[12,578,579,580,583],{},"Select ",[27,581,582],{},"Preview Update Set",". The preview compares each update with the target and reports problems. Do not commit until every problem has a decision.",[12,585,586],{},"Common preview problems:",[588,589,590,606],"table",{},[591,592,593],"thead",{},[594,595,596,600,603],"tr",{},[597,598,599],"th",{},"Problem",[597,601,602],{},"What it means",[597,604,605],{},"Usual action",[607,608,609,621,632],"tbody",{},[594,610,611,615,618],{},[612,613,614],"td",{},"Found a local update that is newer than this one",[612,616,617],{},"The target record changed after your update was captured",[612,619,620],{},"Compare both versions, then accept remote or skip",[594,622,623,626,629],{},[612,624,625],{},"Could not find a record in a table referenced by this update",[612,627,628],{},"A dependency has not been moved yet",[612,630,631],{},"Commit the dependency first, then preview again",[594,633,634,637,640],{},[612,635,636],{},"Could not find a table",[612,638,639],{},"The table definition is in another update set",[612,641,642],{},"Commit that set first",[12,644,645,648,649,652],{},[27,646,647],{},"Accept remote update"," applies your version over the target. ",[27,650,651],{},"Skip remote update"," leaves the target as it is. Decide per record and write the reason in the update set description, because the next person to investigate a defect will ask.",[19,654,656],{"id":655},"commit-and-verify","Commit and verify",[12,658,579,659,662],{},[27,660,661],{},"Commit Update Set",". When it finishes:",[40,664,665,668,676],{},[43,666,667],{},"Open the commit log and check for warnings and errors.",[43,669,670,671,675],{},"Run your smoke tests. An ",[105,672,674],{"href":673},"\u002Fblog\u002Fservicenow-atf-regression-testing-best-practices","ATF regression suite"," makes this repeatable.",[43,677,678],{},"Create any data records the change depends on.",[19,680,682],{"id":681},"back-out-with-care","Back out with care",[12,684,685,688],{},[27,686,687],{},"Back Out"," reverses a committed update set by restoring earlier versions of each record. It also deletes tables and fields that the set created, along with their data. Later update sets that changed the same records make a back-out unreliable.",[12,690,691],{},"In production, a forward fix in a new update set is usually safer than a back-out. Keep back-out for a change you committed minutes ago that nothing else depends on.",[19,693,695],{"id":694},"a-short-checklist","A short checklist",[40,697,698,701,704,707,710,713,716,719],{},[43,699,700],{},"One update set per story, in the correct scope",[43,702,703],{},"Nothing in Default",[43,705,706],{},"Review the contents before marking the set Complete",[43,708,709],{},"Never reopen a completed set; create the next version",[43,711,712],{},"Group a release with a batch, not a merge",[43,714,715],{},"Preview, resolve every problem, then commit",[43,717,718],{},"Record why you accepted or skipped each collision",[43,720,721],{},"Prefer a forward fix to a back-out",[12,723,724,725,729,730,109],{},"Update sets also affect upgrades, because every customised record becomes a candidate for the skipped list. The ",[105,726,728],{"href":727},"\u002Fblog\u002Fservicenow-upgrade-skipped-changes-checklist","upgrade skipped changes checklist"," covers that side. For ready-made examples to put in your next update set, browse the ",[105,731,733],{"href":732},"\u002Fscripts","script library",[735,736,737],"style",{},"html pre.shiki code .sCydW, html code.shiki .sCydW{--shiki-default:#D73A49;--shiki-dark:#D73A49}html pre.shiki code .sKWpL, html code.shiki .sKWpL{--shiki-default:#24292E;--shiki-dark:#24292E}html pre.shiki code .sOTlB, html code.shiki .sOTlB{--shiki-default:#032F62;--shiki-dark:#032F62}html pre.shiki code .se37E, html code.shiki .se37E{--shiki-default:#6F42C1;--shiki-dark:#6F42C1}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":127,"searchDepth":193,"depth":193,"links":739},[740,741,742,743,744,745,746,747,748,749,750],{"id":21,"depth":193,"text":22},{"id":55,"depth":193,"text":56},{"id":112,"depth":193,"text":113},{"id":149,"depth":193,"text":150},{"id":401,"depth":193,"text":402},{"id":513,"depth":193,"text":514},{"id":534,"depth":193,"text":535},{"id":575,"depth":193,"text":576},{"id":655,"depth":193,"text":656},{"id":681,"depth":193,"text":682},{"id":694,"depth":193,"text":695},"2026-11-11","Learn how ServiceNow update sets work, what they capture, and how to name, batch, preview, and commit them so changes reach production without surprises.",null,"md",[756,759,762,765],{"question":757,"answer":758},"What is an update set in ServiceNow?","An update set is a container that records configuration changes made on one instance, such as business rules, client scripts, form layouts, and dictionary entries, so they can be moved to another instance as a group. Each recorded change is stored as a Customer Update (sys_update_xml) record.",{"question":760,"answer":761},"Do update sets capture data records?","No. Update sets capture configuration, not data. Records such as incidents, users, groups, and configuration items are not captured. If a change depends on a data record, export that record as XML and import it on the target instance, or load it with an import set.",{"question":763,"answer":764},"Should I merge update sets or use batches?","Prefer batches. A batch groups update sets under a parent so they preview and commit together while each child keeps its own history. Merging creates a new update set and discards the link between a change and the story it belonged to.",{"question":766,"answer":767},"Can I reopen a completed update set to add a fix?","Avoid it. If the completed update set has already been retrieved by another instance, reopening it produces two different versions with the same name. Create a new update set for the fix and add it to the same batch.",{},"\u002Fblog\u002Fservicenow-update-sets-complete-guide-migration-mastery",{"title":5,"description":752},"\u002Fsocial-card.png","blog\u002Fservicenow-update-sets-complete-guide-migration-mastery",[774,775,776],"update sets","deployment","administration","dE6MHD4lyxuwsYxSstYJQuejxSs1Z8j72VHBE5kr-wY",[779,787,804],{"path":780,"title":781,"headline":781,"description":782,"date":751,"tags":783},"\u002Fblog\u002Fservicenow-mid-server-installation-configuration-troubleshooting","ServiceNow MID Server: Installation, Configuration, and Troubleshooting","Install and validate a ServiceNow MID Server, configure its key parameters, and troubleshoot a MID Server that is down, stuck, or failing its jobs.",[784,785,786,776],"mid server","discovery","integrations",{"path":788,"title":789,"headline":790,"description":791,"date":792,"tags":793},"\u002Fblog\u002Fservicenow-zurich-release-developer-revolution","ServiceNow Zurich Release: The Final Letter Brings the Developer Revolution | SN-Tricks","ServiceNow Zurich Release: How the Last Letter in the Alphabet Delivers the Biggest Developer Transformation Yet","Discover the exciting developer features in ServiceNow's Zurich release including Developer Sandboxes, Vibe Coding, Workflow Data Fabric, and AI-powered workflows.","2025-11-09T10:00:00",[794,795,796,797,798,799,800,801,802,803],"ServiceNow","Zurich","Developer Tools","Vibe Coding","AI","Developer Sandboxes","Git Integration","Workflow Data Fabric","Now Assist","Platform Update",{"path":805,"title":806,"headline":807,"description":808,"date":809,"tags":810},"\u002Fblog\u002Fservicenow-xanadu-release-developer-features","ServiceNow Xanadu Release: Game-Changing Features for Developers | SN-Tricks","ServiceNow Xanadu Release: Revolutionary Features Every Developer Must Know","Explore the ServiceNow Xanadu release's revolutionary developer features including ServiceNow IDE, Fluent DSL, ECMAScript 2021 support, and more.","2025-01-15T10:00:00",[794,811,796,812,813,814,815,802,803],"Xanadu","IDE","Fluent DSL","TypeScript","ECMAScript 2021",1794433798165]