Deployment questions come up in the technical round, usually after the panel has finished with scripting and wants to know whether you have actually shipped anything. They are asked by the lead who owns the release, and they are easy to spot because they stop being about syntax and start being about sequence. Eight questions are covered here, four on update sets and deployment and four on architecture and platform practice. The answers stay close to what happens in a real migration from development to production, including the parts of your work that an update set quietly leaves behind.
Update set and deployment questions
What is an Update Set?
An update set is a container that records customisations made on one instance so they can be carried to another instance. The container itself is a record in sys_update_set. Every change you make while that set is your current set is written as a child record in sys_update_xml, holding the full XML payload of the changed record, its table and its sys_id.
The important part of the answer is what it captures. ServiceNow tracks changes to tables marked as application files, which is platform language for configuration. It does not track data. That single distinction explains almost every failed deployment a new developer runs into.
| Item | In an update set | How you move it if it is not |
|---|---|---|
| Business rules, client scripts, UI policies, UI actions | Yes | Captured automatically |
| Script includes, ACLs, notifications, email scripts | Yes | Captured automatically |
| Tables, dictionary entries, choice lists, form layouts | Yes | Captured automatically |
| Workflows | Published versions only | Publish before marking the set complete |
| Flow Designer flows and subflows | Yes | Check that any connection or credential alias points to a target side record |
| System properties | Yes | Review before commit, a property value from dev can break production |
| Role definitions | Yes | Captured automatically |
| Incident, change, CMDB, user and group records | No | Export XML, import set with a transform map, or create by hand |
| Group membership and role assignments to users | No | Export XML or configure on the target |
| Service catalog items, variables, variable sets | Usually no, they are data records | Add to the update set manually with the utility your instance provides, or export XML |
| SLA definitions | No | Export XML or rebuild on the target |
| Homepages, dashboards, reports | No | Add to the update set manually from the record, or export XML |
| Scheduled job definitions | Treat as not captured, and verify in your instance | Export XML, then check the schedule and activation on the target |
| Scheduled job run state, last run and next run values | No | Regenerated on the target, never migrated |
| Personalised list layouts and per user list filters | No | These are user preferences and stay where they were created |
| Attachments | No | Re-attach on the target |
| Update set records themselves, and anything changed outside your current set | No | Verify your current set before you start work |
When a change is data, you have four practical options. Right click the record and use Export, XML, then use Import XML on the target list, which preserves the sys_id so references do not break. For volume, build an import set and transform map so the load is repeatable and auditable. For a handful of records, create them on the target by hand and accept that the sys_ids will differ, which is fine for standalone records and dangerous for anything referenced by a script. For a full refresh of sub-production data, clone down from production.
Say the sys_id point out loud in the interview. A candidate who says "I exported the XML so the sys_id stayed the same and the reference fields on the target still resolved" sounds like somebody who has done a migration. A candidate who says "I moved the data" sounds like somebody who has read about one.
What are the best practices for update sets?
The practices below are the ones that prevent rework, not the ones that sound tidy.
One update set per story. Name it with the ticket number and a short description, for example RITM0012345 - Incident auto assignment. When the business defers one story, you can leave its set behind instead of unpicking changes from a shared container.
Set your current update set before you touch anything. Go to System Update Sets, Local Update Sets, and select your set. Changes made while Default is current sit in Default forever, and Default cannot be moved.
Keep sets small and single purpose. A small set previews faster, reads faster in review, and backs out cleanly.
Mark Complete the moment development finishes. A completed set is frozen. Anything you change after that is captured in whatever set is current, which is how half a feature reaches production.
Never reopen a completed set that has already been retrieved somewhere. The target already holds a copy of the payload. Changing the source version creates two versions of the same story.
Do not let two developers work on the same artifact in two different sets. This is the root cause of most collisions, and no tooling fixes it after the fact.
Batch instead of merge. Covered in detail below.
Record the manual steps in the story, not in the set. Data loads, property values that differ per instance, integration endpoints, group membership, scheduled job activation. Write them as a numbered pre-commit and post-commit checklist and attach it to the change record. The deployment is the set plus the checklist, never the set alone.
Know your scope. Changes inside a scoped application are captured in a set belonging to that scope. A global set will not pick them up, and the scope selector at the top of the screen decides this silently.
Preview early. Retrieve into the test instance and preview the day before the change window, not inside it. Preview does not change anything, so there is no reason to save it for the last hour.
What is the difference between retrieve and commit?
They are two different steps in a three step sequence, and the sequence is the answer the panel wants.
- Mark Complete on the source. On the development instance, the set moves from In Progress to Complete. Only completed sets are visible to a retrieving instance.
- Retrieve on the target. Either configure an update source under System Update Sets, Update Sources, pointing at the development instance, then use Retrieve Completed Update Sets; or export the set to XML from development and import it under Retrieved Update Sets. After retrieval the set sits on the target in Loaded state. Nothing on the target has changed. The payload is parked, that is all.
- Preview. The platform compares every incoming record against what already exists on the target and reports problems. This is a dry run. Still nothing has changed.
- Commit. Only after the preview is clean will the platform let you commit. Commit writes every record in the set onto the target, in dependency order, and creates version records so the changes can be backed out.
So retrieve is transport and commit is application. The gap between them is where all your safety lives. A retrieved set can be previewed, reviewed, discussed and deleted without consequence. A committed set is live on the instance.
Two follow-ups are common. First, can you back out a commit. Yes, an update set has a Back Out action that restores previous versions where a previous version exists, but records created by the set are deleted rather than reverted, and any data written by the new code stays behind. Treat back out as a recovery tool, not a plan. Second, what happens if you commit an incomplete preview. You cannot, for errors. Warnings can be ignored and skipped updates are silently left out, which is the more realistic failure.
What is an update set collision?
A collision is preview telling you that the record arriving in the update set already exists on the target and has been changed there independently. The preview problem usually reads along the lines of a local update being newer than the remote update in the set.
It happens when the same artifact was touched in two places. Somebody made a fix directly in test. A previous release already moved that script include. Two developers edited the same business rule in two different sets and both sets are now landing. Or production has an out of the box record that was modified locally at some point in the past.
When you open the collision, preview offers you two choices and you must understand both.
- Accept remote takes the version inside the incoming update set and overwrites what is on the target. The local change is gone, and nothing warns you about what it contained.
- Skip or ignore leaves the target record as it is and that particular update never applies. The rest of the set commits normally, so you end up with a partial deployment that tests fine in some paths and fails in others.
Neither choice is automatically right. The correct action is to open both versions, compare them field by field, and decide. If the local change is a hotfix that must survive, the honest answer is to go back to development, fold that change into the code, produce a new update set, and deploy that instead of accepting remote.
This is exactly the ground where interviewers stop testing definitions. Candidates fail on demonstration, not knowledge, and "your commit finished but the new field is missing on the form, what do you check" beats "what is a collision" every time. Walk the panel through it: check whether that update was skipped in preview, check the update set's Customer Updates list for the record, check the sys_update_version history on the target record, then check whether the change was made in a different scope or under a different current set on dev.
Prevention is simpler than resolution. Lock down who can write to test and production, keep one owner per artifact per sprint, and clone down regularly so development does not drift away from production.
What the interviewer is actually checking
- Whether you understand that an update set carries configuration and not data, and can name the usual gaps without being prompted.
- Whether you can state the retrieve, preview, commit sequence in order and say what each step does and does not change.
- Whether you treat a preview problem as a decision to be made rather than a button to be clicked.
- Whether you have a written plan for the manual steps that ride alongside a deployment.
- Whether you can describe a real deployment you were part of, including what went wrong and what you checked.
Architecture and best practices questions
What is ServiceNow architecture?
ServiceNow is multi-instance rather than multi-tenant. Each customer runs on their own application nodes with their own database, so an upgrade, a plugin activation or a heavy script on one customer's instance does not touch another's. That distinction is the first thing to say, because it is the one candidates confuse with the shared-database model used by other SaaS platforms.
The stack, from the outside in:
- Client layer. The browser, running the Now platform UI, Service Portal or the Next Experience workspaces. Client scripts, UI policies and the client-side APIs like
g_formlive here. - Application layer. Java application nodes behind a load balancer. Server-side JavaScript, business rules, script includes, scheduled jobs and the REST and SOAP endpoints all run here. Everything the server executes runs on these nodes, never in the browser.
- Database layer. A relational database per instance. Every configuration record and every ticket is a row in a table.
- MID Server. A lightweight Java service installed inside the customer network. It polls the instance outbound over HTTPS through the ECC queue, so ServiceNow can reach on-premise systems for integrations and orchestration without an inbound firewall rule.
Two platform concepts sit on top of that. Everything is a table, and tables extend other tables, so incident extends task and inherits its fields and behaviour. And code lives in a scope, either the global scope or a scoped application, which controls what that code may call and what other applications may call in it.
The instance strategy is part of this answer and is where the panel usually goes next.
| Instance | Purpose | Rule |
|---|---|---|
| Development | All build work, all update sets originate here | Never a shortcut to test or production |
| Test or QA | Integration testing, UAT, rehearsal of the deployment | Retrieve, preview and commit here first, always |
| Production | Live users and live data | No development, ever, no exceptions for small fixes |
The flow is build in development, capture in an update set, mark complete, retrieve into test, preview, commit, test, then retrieve the same set into production during an approved change window and commit again. The set that reaches production is the same set that was proved in test. If it is not the same set, you have not tested the deployment.
Cloning down is how sub-production instances stay realistic. A clone copies production over a target instance, replacing what was there. Practical points to give:
- The clone direction is always downward, from production to development or test. Nobody clones upward.
- Everything on the target is replaced, so export any uncommitted work to XML and keep it outside the instance before the clone runs.
- Use clone data preservers for records the target needs to keep, such as instance-specific properties or test accounts, and use exclude lists to skip large log and audit tables you do not need.
- After the clone, do the post-clean-up before anyone logs in: stop outbound email so the copied data does not notify real users, re-point integration endpoints at non-production systems, and re-enter credentials and encrypted password fields, which typically do not survive a clone.
- Schedule clones between release cycles, never in the middle of one.
Interviewers go five levels deep here. Which instances did your project have, who approved the change, what was the window, what did you do when the commit on production behaved differently from the commit on test. Invented project experience disappears at the third question, so answer from what you have actually done, even if that is a personal developer instance and a practice deployment between two of them.
What are best practices for scripting?
The first rule is to not script. If a UI policy can do it, a client script should not. If a flow can do it, a business rule should not. Out of the box configuration survives upgrades and reviews better than code does.
When you do write code:
- Choose the right execution point. A before business rule modifies the current record without a second write, so never call
current.update()in a business rule that is running on that same record. An after rule is for updating related records. An async rule is for work that the user does not need to wait for. - Put logic in the Condition field, not at the top of the script. The condition is evaluated cheaply and stops the script from running at all.
- Never run a synchronous GlideRecord query in a client script. The browser freezes while it waits. Use GlideAjax against a script include marked client callable, and handle the result in the callback.
- Query efficiently. Filter on indexed fields, apply
setLimit()when you only need a few rows, useGlideAggregatewhen you only need a count or a sum, and never put a query inside a loop when one query with an encoded query will do. - Reuse through script includes. A script include holds logic that business rules, flows and client callbacks share, and it is testable in a background script.
- Do not hardcode sys_ids or group names. Put them in system properties and read them with
gs.getProperty(), so the value can differ between instances without a code change. - Handle errors. Wrap risky work in try and catch, and log with enough context to identify the record, using
gs.info()in scoped applications. - Respect security in code. Plain
GlideRecordignores ACLs. UseGlideRecordSecurewhen the script runs on behalf of a user and should see only what that user may see.
Knowing the syntax is not the same as knowing the execution. Candidates can write a GlideRecord loop and then cannot say when it runs, where it runs and what data it can reach. Client side against server side is the ServiceNow version of that gap, and the panel will find it with one question about g_form inside a business rule.
How do you design scalable ServiceNow solutions?
Scalability in ServiceNow is mostly a data model and a transaction volume conversation.
Start with the data model. Extend task only when the record genuinely behaves like a task, with assignment, state and SLA behaviour. Extending it for a simple reference list gives you a wide table and a slow one. Avoid long extension chains, because a query on a deeply extended table joins across every parent.
Design for the size the table will reach. Index the fields you filter and sort on. Avoid conditions that cannot use an index, such as a contains search on a multi-million row table. Plan archiving or table rotation for high volume tables like logs and events before they become a problem.
Keep the synchronous path short. Anything a user does not need to see immediately belongs in an async business rule, a flow, an event, or a scheduled job. Heavy before rules on a high volume table slow down every single insert.
Batch integrations. One REST call per record does not scale. Send in batches, use the ECC queue and a MID Server for on-premise systems, and make the integration restartable so a failure does not force a full replay.
Report on snapshots, not on live tables. Performance Analytics collects scores on a schedule so a dashboard reads pre-calculated data instead of scanning the transaction table every time somebody opens it.
Build for reuse. Script includes for logic, subflows for process, variable sets for catalog variables, and scoped applications so a capability has a controlled boundary and a clean deployment path.
Decide the deployment model on day one. Naming standards, one set per story, a batching plan and a back out plan are part of the design, not an afterthought once three developers are already working.
How do you ensure security in ServiceNow applications?
Security is layered, and the answer should walk through the layers rather than name one.
Access control lists are the enforcement point. An ACL is defined for a table and operation, and optionally for a specific field, with the pattern table.field and operations such as read, write, create and delete. Each ACL can require a role, a condition and a script, and all of the parts present on that ACL must pass. The platform evaluates the most specific match first, and a user must satisfy the field level rule as well as the table level rule for that operation. Editing ACLs requires elevating to security_admin, which is deliberate friction.
Roles go to groups, groups go to users. Assigning roles directly to individuals is how an instance ends up with fifty people holding admin.
Client side controls are not security. A UI policy that hides a field, a client script that makes it read-only and a hidden form section all still leave the data reachable through the list view, the API and an export. Anything that must not be seen needs an ACL.
Script access follows the same rule. GlideRecord runs without ACL checks by design, so a script include exposed to the client can hand back data the caller should never see. Use GlideRecordSecure where user context matters, and check what a client callable script include actually returns.
Scoped applications add their own boundary. Application access settings on a table control whether other applications can read or write it and whether it is reachable over web services, and cross-scope privileges record which application may call which.
Secure the instance itself, not only the app. Single sign-on with multi-factor authentication, IP address access control for privileged accounts, a dedicated integration user with a purpose-built role rather than admin, OAuth instead of stored basic credentials where the other side supports it, and field auditing turned on for the tables that matter. The Instance Security Center gives you the hardening checklist to work through.
Test as the user. Impersonate a real account with the real roles and try to read, write and export the record. Security debug shows which ACL granted or denied access, and it is the fastest way to answer "why can this user see that field".
What the interviewer is actually checking
- Whether you can explain multi-instance architecture and place your own work in the right layer of it.
- Whether you know the difference between a control that hides data and a control that protects it.
- Whether your scripting habits show awareness of when code runs and what it costs at volume.
- Whether you think about the instance strategy and the clone cycle, not only the code.
- Whether your project examples hold up when the panel asks which table, what requirement, why that approach and what your role was.
Where to go next
Deployment is the part of ServiceNow you cannot learn from reading, because nothing goes wrong until you move something. Get a personal developer instance, build a small feature, capture it properly, and practise the full sequence including a deliberate collision so you have seen the preview screen before somebody asks you about it. Structure your answers as situation, approach, reason and result rather than starting with "basically in our project", and the same experience will sound twice as credible.
If you want that practice guided, with real deployment scenarios and mock interview rounds on this material, the ServiceNow training programme at RizeX Labs covers update sets, instance strategy and platform architecture as hands-on work rather than theory.