ITSM • Business Rules • Client Scripts • ACLs • Flow Designer • Integrations • 2026

ServiceNow Interview Questions

30 questions What each one tests, an answer frame, a spoken answer 33 min read

This page is for anyone facing a ServiceNow round, whether you're going for an admin, developer or ITSM consultant role. Most rounds start with incident, problem and change and how the task table ties them together, then move to business rules, client scripts, UI policies, script includes and GlideRecord. Stronger rounds test ACLs, Flow Designer, catalog items, update sets, imports and REST integrations, and finish with a production story and a judgement call. Each question shows what the interviewer is really checking, the shape of a strong answer and a short answer you can say out loud. Try the scripts on a personal developer instance, then change the stories to your own.

Search all questions by round, difficulty and level, or save the ones you want to practise.

ITSM & CMDB 3 questions

Easy Technical round Fresher, Mid-level Practice question

1. In ServiceNow ITSM, how are incident, problem and change different, and how do they connect in a real outage?

What the interviewer is really testing:
Whether you understand the processes the platform is built around, not just the module names in the left menu.
Answer frame:

Incident: restore service as fast as possible; the goal is the user working again.

Problem: find and remove the root cause behind one or more incidents; track workarounds and known errors.

Change: control the fix going into production with risk review and approval.

Sample spoken answer:

"An incident is about getting the user or the service working again as quickly as possible. It doesn't need the root cause, just a fix or a workaround. A problem is opened when we want to know why it happened, often because the same incident keeps coming back or one outage hit many people. The problem team finds the root cause, records a workaround or a known error, and proposes a permanent fix. That fix usually needs a change request, so it goes through risk assessment and approval before it touches production. In a real outage the flow is: many incidents get linked to one parent or to a problem, the problem finds, say, a bad certificate renewal process, and a change request fixes it properly. On the platform all three extend the task table, so they share assignment, state and work notes."

Red flag to avoid:

Describing problem management as just a bigger incident, or saying a permanent fix goes straight into production without a change.

They may ask next:
  • How is incident priority calculated from impact and urgency?
  • When would you close an incident while its problem record stays open?
Say it in 60 seconds
Medium Technical round Fresher, Mid-level Practice question

2. What are the standard, normal and emergency change types, and when would you use each one?

What the interviewer is really testing:
Whether you can match approval effort to risk, which is what change management is really for.
Answer frame:

Standard: low risk, repeated often, pre-approved and usually raised from a template.

Normal: full path with planning, risk assessment and CAB or group approval.

Emergency: urgent fix to restore service; faster approval, often by a smaller emergency board, reviewed afterwards.

Sample spoken answer:

"A standard change is something low risk that we do the same way many times, like adding memory to a virtual machine or restarting a known service in a window. It's pre-approved, so people raise it from a template and it skips the approval step. A normal change is anything that needs a real look: it goes through planning, a risk assessment, and approval from the change manager or the CAB before it's scheduled. An emergency change is for when something is broken right now and waiting for the next CAB would hurt the business. It still gets approved, but by a small group quickly, and it gets reviewed after the fact. The trap I've seen is teams calling everything an emergency to skip the queue, so I'd watch the ratio and push repeat work into standard templates instead."

Red flag to avoid:

Saying emergency changes need no approval at all, or treating standard changes as a shortcut for any change the team is confident about.

They may ask next:
  • How does a change become a standard change in the first place?
  • What is a change freeze or blackout window, and how does the platform warn about conflicts?
Say it in 60 seconds
Medium Technical round Fresher, Mid-level, Senior Practice question

3. What is the CMDB, how are CI classes and relationships stored, and why does it matter for incidents and changes?

What the interviewer is really testing:
Whether you see the CMDB as a working tool for impact and routing, and know how it avoids duplicate records.
Answer frame:

Classes: CIs live in cmdb_ci and child tables such as servers, databases and applications.

Relationships: stored in cmdb_rel_ci as parent, child and a type like runs on or depends on.

Population: discovery and integrations load CIs through identification rules so they match instead of duplicate.

Use: link CIs to incidents and changes for impact, routing and risk.

Sample spoken answer:

"The CMDB is the record of what the company runs and how it fits together. Every configuration item sits in cmdb_ci or a child class, like a Linux server, a database instance or a business application, and each class adds its own fields. Relationships live in cmdb_rel_ci as a parent, a child and a type, like an application depends on a database, which runs on a server. Data mostly comes from Discovery or integrations, and it should go through the identification and reconciliation engine so the same server from two sources becomes one CI, not two. Why it matters: when an incident is logged against a CI, you can route it to the right support group and see what else is affected. For a change, you can see which services depend on the server you're about to patch, which feeds the risk assessment."

Red flag to avoid:

Calling the CMDB an asset spreadsheet, or having no idea how the data gets in or stays correct.

They may ask next:
  • What causes duplicate CIs, and how would you clean them up?
  • How would you keep CMDB data trustworthy over time?
Say it in 60 seconds

Tables & Data 2 questions

Easy Technical round Fresher Practice question

4. What is the task table, and what does it mean that incident and change request extend it?

What the interviewer is really testing:
Whether you understand table inheritance, which explains why fields, rules and security behave the way they do across modules.
Answer frame:

Parent table: task holds the shared fields such as number, state, assigned to, assignment group and short description.

Child tables: incident, problem, change_request, sc_req_item and sc_task extend it and add their own fields.

Inheritance: business rules and ACLs on task apply to children unless something more specific exists.

Sample spoken answer:

"Task is a base table for anything that gets assigned and worked. It holds the common fields: number, state, priority, assigned to, assignment group, short description, work notes. Incident, problem, change request, requested items and catalog tasks all extend it, so they inherit those fields and add their own, like caller on incident or risk on change. In the database a child record is still a task record, so a report on task can show incidents and changes together, and a business rule written on task runs for all of them. ACLs work the same way: if there's no ACL on the child table, the one on task is checked. When I build something new that gets assigned and has a lifecycle, extending task gives me SLAs, approvals and assignment for free, which is usually better than a flat custom table."

Red flag to avoid:

Thinking each module is a completely separate table with copied fields, or not knowing that rules on a parent table fire for child records.

They may ask next:
  • What is a dictionary override, and when would you use one on a child table?
  • What is a sys_id, and why should scripts use it instead of the number?
Say it in 60 seconds
Easy Technical round Fresher, Mid-level Practice question

5. What is the system dictionary, what is a reference field, and how does dot-walking work?

What the interviewer is really testing:
Whether you know where field definitions live and can reach related data without writing extra queries.
Answer frame:

Dictionary: sys_dictionary defines each field: type, length, default, mandatory, reference target.

Reference field: stores the sys_id of a record on another table and shows its display value.

Dot-walking: follow references with dots, in scripts, filters, forms and reports.

Sample spoken answer:

"The dictionary is where every table's fields are defined. Each entry says the column name, the type, max length, default value, whether it's mandatory, and for reference fields which table it points at. A reference field actually stores a sys_id, the unique 32 character id of the other record, but the form shows its display value, like the user's name. Dot-walking means following that link with a dot. So on an incident, caller_id.manager.email gets the email of the caller's manager without me writing a second query. I use it in scripts, in list filters, in notification templates and to add related fields to a form layout. One thing I'm careful about: long dot-walks in a loop over many records can be slow, because each hop can mean another lookup."

Code:
var inc = new GlideRecord('incident');
if (inc.get('number', 'INC0010001')) {
  gs.info(inc.caller_id.manager.email.toString());
}
Red flag to avoid:

Saying a reference field stores the name of the related record, or querying the user table again when a dot-walk would do.

They may ask next:
  • What is the difference between getValue and getDisplayValue on a reference field?
  • What does a dot-walk return when one reference in the chain is empty?
Say it in 60 seconds

Server Scripting 6 questions

Easy Coding round Fresher, Mid-level Practice question

6. Write a server-side script that finds the ten newest active priority 1 incidents and logs their number and assignee.

What the interviewer is really testing:
Whether you can write basic GlideRecord code cleanly, with the query built on the database side rather than filtered in a loop.
Answer frame:

Build: new GlideRecord on the table, add conditions, order and a limit.

Run: call query, then loop with next.

Read: getValue for raw values, getDisplayValue for references.

Sample spoken answer:

"I create a GlideRecord on incident, add an active query and a condition for priority 1, order by created date descending and set a limit of ten so the database only returns what I need. Then I call query and loop with while next. Inside the loop I use getValue for the number and getDisplayValue for assigned to, because assigned to is a reference and getValue would give me a sys_id. I'd test this in background scripts on a sub-production instance first. For more complex filters I often build the condition in a list view, copy the query, and use addEncodedQuery, which is easier to read and matches exactly what the users see in the list."

Code:
var gr = new GlideRecord('incident');
gr.addActiveQuery();
gr.addQuery('priority', 1);
gr.orderByDesc('sys_created_on');
gr.setLimit(10);
gr.query();
while (gr.next()) {
  gs.info(gr.getValue('number') + ' - ' + gr.getDisplayValue('assigned_to'));
}
Red flag to avoid:

Querying the whole table and filtering with if statements inside the loop, or forgetting to call query before next.

They may ask next:
  • How would you just check whether any such record exists, as cheaply as possible?
  • Why can a GlideRecord that skips ACLs be a problem in a script called from the client?
Say it in 60 seconds
Medium Technical round Fresher, Mid-level Practice question

7. Explain before, after, async and display business rules. When would you pick each one?

What the interviewer is really testing:
Whether you choose the rule type by timing and side effect, which prevents most performance and recursion bugs.
Answer frame:

Before: runs before the database write; change fields on current, no update call.

After: runs after the write; update related records or fire events.

Async: queued to run in the background after the transaction; heavy or slow work.

Display: runs when a form loads; fills g_scratchpad for client scripts.

Sample spoken answer:

"A before rule runs just before the record is written, whether the save came from a form, a script or an import, so it's the right place to set or validate fields on current. If I set a field there, it's saved with the record, no update call needed, and I can stop the save with setAbortAction. An after rule runs once the record is saved, so I use it to update other records, like closing child tasks when a parent closes. An async rule is queued and runs in the background, so the user doesn't wait for it; that's where I put slow work like an outbound REST call. It doesn't have previous, though, so it can't compare old and new values. A display rule runs when the form is loaded, before it's sent to the browser, and I use it to put server data into g_scratchpad so client scripts don't need extra server calls."

Red flag to avoid:

Putting outbound integrations in a before rule so every save waits on another system, or updating current's own fields in an after rule.

They may ask next:
  • What does a query business rule do, and when does it run?
  • How does the order field decide which rule runs first?
Say it in 60 seconds
Medium Technical round Mid-level, Senior Practice question

8. Why is calling current.update() inside a business rule usually a mistake, and what would you do instead?

What the interviewer is really testing:
Whether you understand the save cycle well enough to avoid double saves and recursive rules.
Answer frame:

Before rule: the record is about to be saved anyway; just set the field.

After rule: update() saves again, so every rule runs again and can loop.

Fix: move field changes to a before rule; for related records, update those records instead.

Sample spoken answer:

"In a before rule, the record is already on its way to the database, so calling update is redundant. I just set the field on current and it gets saved with everything else. In an after rule it's worse: current.update triggers a second save, which runs all the before and after rules again, and that can loop, fire notifications twice and write duplicate audit history. So my fix is almost always to move the logic into a before rule. If I really have to change the same record after it's saved, for example based on something only known after insert, I'd think hard about it, and use setWorkflow false on that one update so the rules don't run again, with a comment explaining why. For other records, like the parent of a task, calling update on that other GlideRecord is fine."

Red flag to avoid:

Saying update() is required to save changes made in a before rule, or reaching for setWorkflow(false) everywhere without knowing it also stops the other business rules and the notifications they would trigger.

They may ask next:
  • What does setWorkflow(false) turn off, and what's the risk of using it?
  • How would you detect that a record is being saved twice in one transaction?
Say it in 60 seconds
Medium Technical round Fresher, Mid-level Practice question

9. What is a script include, and how does a client-callable one differ from a normal one?

What the interviewer is really testing:
Whether you know how to share server code properly and expose only what the browser should reach.
Answer frame:

Purpose: reusable server code, loaded only when something calls it.

Shapes: a class with Class.create and a prototype, or a single function named like the include.

Client callable: extends AbstractAjaxProcessor, has the client callable flag set, reached through GlideAjax.

Sample spoken answer:

"A script include is a library of server-side code I can call from business rules, flows, other script includes or scheduled jobs. It isn't run on its own; it's loaded when something calls it by name, which keeps it cheap. Most are written as a class with Class.create and a prototype of methods, so I can do new IncidentUtils and call a method on it. For something tiny I can write a single function with the same name as the include. A client-callable one extends AbstractAjaxProcessor and has the client callable flag ticked, so a client script can reach it through GlideAjax. Its methods read inputs with getParameter and return a value. Because anyone logged in can call it from a browser, I treat those methods like a public API: validate inputs, check the user's rights, and only return what the form needs."

Red flag to avoid:

Putting shared logic by copy-paste into many business rules, or making a script include client callable without any check on what it returns.

They may ask next:
  • How would you stop a client-callable script include from leaking data to the wrong user?
  • How do you call a script include that lives in another application scope?
Say it in 60 seconds
Medium Coding round Mid-level Practice question

10. How would you count open incidents per assignment group in a server script, and why not just loop with GlideRecord?

What the interviewer is really testing:
Whether you push counting to the database instead of pulling every record into memory.
Answer frame:

Tool: GlideAggregate with a COUNT aggregate and groupBy.

Why: the database returns one row per group instead of every record.

Reading: getAggregate for the count, getDisplayValue for the group name.

Sample spoken answer:

"I'd use GlideAggregate, which is built for counts, sums, averages and group-bys. I add the active condition, add a COUNT aggregate, group by assignment group and query. The database does the counting and hands back one row per group, so even with half a million incidents I only get back a few dozen rows. Looping with GlideRecord would pull every matching record into the app server and count in JavaScript, which is slow and wastes memory. The same applies to a simple 'how many' check: getRowCount on a GlideRecord still runs the full query, so for a plain count I'd use GlideAggregate without the group-by."

Code:
var ga = new GlideAggregate('incident');
ga.addActiveQuery();
ga.addAggregate('COUNT');
ga.groupBy('assignment_group');
ga.query();
while (ga.next()) {
  var group = ga.assignment_group.getDisplayValue() || '(no group)';
  gs.info(group + ': ' + ga.getAggregate('COUNT'));
}
Red flag to avoid:

Counting with a GlideRecord loop over the whole table, or using getRowCount on large tables as if it were free.

They may ask next:
  • How would you only return groups with more than 50 open incidents?
  • When is getRowCount acceptable to use?
Say it in 60 seconds
Medium Technical round Mid-level Practice question

11. What is g_scratchpad, and how does a display business rule use it to help client scripts?

What the interviewer is really testing:
Whether you know the cheapest way to get server data onto a form without extra round trips.
Answer frame:

Display rule: runs on the server as the form loads, before it reaches the browser.

Scratchpad: an object filled on the server and readable in client scripts.

Use: onLoad decisions that need server data, with no GlideAjax call.

Sample spoken answer:

"A display business rule runs on the server when a form is being loaded, just before it's sent to the browser. In it I can do queries and set properties on g_scratchpad, for example whether the caller is a VIP or how many open incidents they already have. That object arrives with the form, so an onLoad client script can just read g_scratchpad.isVip and show a message or hide a section. The big win is there's no extra server call after the page loads, which a GlideAjax call would need. The limit is that it only runs on load, so if the value depends on something the user changes later, like picking a different caller, I'd still need GlideAjax in an onChange script. I also keep the display rule light, because it runs on every form load of that table."

Code:
// Display business rule on incident
g_scratchpad.isVip = current.caller_id.vip.toString() === 'true';

// onLoad client script
function onLoad() {
  if (g_scratchpad.isVip) {
    g_form.showFieldMsg('caller_id', 'VIP caller', 'info');
  }
}
Red flag to avoid:

Using a synchronous server call on load to fetch data a display rule could have sent with the form.

They may ask next:
  • What happens if the display rule runs a heavy query?
  • Can you use g_scratchpad in a list view?
Say it in 60 seconds

Client Scripting 5 questions

Easy Technical round Fresher Practice question

12. What are the four types of client script, and what is each one used for?

What the interviewer is really testing:
Whether you know when each script fires and can use the right one without side effects.
Answer frame:

onLoad: runs when the form opens; set defaults, show messages.

onChange: runs when one field changes; check isLoading to skip the initial load.

onSubmit: runs on save; return false to stop the submit.

onCellEdit: runs when a field is edited from a list.

Sample spoken answer:

"onLoad runs when the form opens, so I use it for things like showing an info message or hiding a section based on the state. onChange runs when a specific field changes. It gets the control, old value, new value and an isLoading flag, and I usually return early if isLoading is true, because the script also fires as the form loads. onSubmit runs when the user saves; if I return false, the save is stopped, so it's where I do final checks like making sure a close note has enough detail. onCellEdit runs when someone edits a field inline from a list, which people often forget; if I only protect the form, a user can change the value from the list and skip my logic. All of them run in the browser, so they're for user experience, not for security."

Red flag to avoid:

Treating client scripts as a security control, or not knowing that list edits bypass form client scripts.

They may ask next:
  • Why should onChange scripts check isLoading and a blank newValue?
  • If a rule must never be broken, why isn't a client script enough?
Say it in 60 seconds
Easy Technical round Fresher, Mid-level Practice question

13. When would you use a UI policy instead of a client script to make a field mandatory or hidden?

What the interviewer is really testing:
Whether you reach for configuration before code, which is what keeps an instance easy to upgrade and maintain.
Answer frame:

UI policy: condition plus actions: mandatory, visible, read-only. No code needed.

Reverse if false: undoes the action when the condition stops being true.

Client script: when you need logic a condition can't express, server data, or messages.

Sample spoken answer:

"If the rule is just 'when this condition is true, make these fields mandatory, visible or read-only', I use a UI policy. It's configuration, not code: I set the condition, add policy actions, and with reverse if false ticked it undoes itself when the condition stops being true. Anyone on the team can read it, and it's less likely to break on an upgrade. I switch to a client script when I need real logic: calling the server through GlideAjax, setting values based on calculations, showing a confirm box, or reacting to a value in a way a condition can't express. UI policies can run scripts too, but if I'm writing a lot of script, a client script is clearer. One thing to know: UI policies apply after onLoad client scripts, so if both touch the same field, the policy's result is usually what the user sees."

Red flag to avoid:

Writing a client script for every show-hide rule, or thinking a UI policy also protects imports and API updates.

They may ask next:
  • Why is a UI policy on its own not enough to guarantee a field is filled?
  • How do you debug two UI policies that fight over the same field?
Say it in 60 seconds
Medium Technical round Mid-level Practice question

14. What is a data policy, and how is it different from a UI policy?

What the interviewer is really testing:
Whether you know which rules only guard the form and which ones guard the data from every entry point.
Answer frame:

UI policy: runs in the browser on forms only; can hide fields.

Data policy: enforced on the server, so imports, web services and list edits obey it too.

Overlap: a data policy can also act as a UI policy; it only does mandatory and read-only, never visibility.

Sample spoken answer:

"A UI policy only lives on the form in the browser. If data comes in through an import set, the REST API or someone editing in a list, the UI policy never runs. A data policy is enforced on the server when the record is saved, so it applies no matter where the change comes from. That makes it the right tool when a field truly must be filled, like a resolution code on a closed incident. A data policy can also be used as a UI policy on the client, so I don't have to build the same rule twice. What it can't do is hide fields, since visibility only means something on a form; it only handles mandatory and read-only. For anything more complex than that, I'd use a before business rule that aborts the save with a clear message."

Red flag to avoid:

Saying UI policies protect data coming in through integrations.

They may ask next:
  • Can an import skip a data policy, and would you ever want it to?
  • When would you choose a before business rule over a data policy?
Say it in 60 seconds
Hard Coding round Mid-level, Senior Practice question

15. Show how a client script would get the caller's manager from the server using GlideAjax, without freezing the form.

What the interviewer is really testing:
Whether you can write both halves of an asynchronous client-server call and avoid the blocking patterns that slow forms down.
Answer frame:

Server: a client-callable script include extending AbstractAjaxProcessor, reading inputs with getParameter.

Client: new GlideAjax, sysparm_name for the method, extra sysparm parameters, then getXMLAnswer with a callback.

Async: the callback fills the field later; the user can keep working.

Sample spoken answer:

"On the server I write a client-callable script include that extends AbstractAjaxProcessor. The method reads the user sys_id with getParameter, looks up the user and returns the manager's sys_id. On the client, in an onChange on caller, I create a GlideAjax pointing at that script include, pass sysparm_name with the method name and my own parameter with the new caller, and call getXMLAnswer with a callback. The callback runs when the answer comes back and sets the field with g_form.setValue. Because it's asynchronous, the form stays responsive. I avoid getXMLWait, which blocks the browser, and I avoid GlideRecord in client scripts, which is synchronous and pulls whole records to the browser. For a simple read like this, g_form.getReference with a callback also works, but GlideAjax lets me return only the one value I need."

Code:
// Script include: CallerUtils (client callable)
var CallerUtils = Class.create();
CallerUtils.prototype = Object.extendsObject(AbstractAjaxProcessor, {
  getManager: function() {
    var user = new GlideRecord('sys_user');
    if (user.get(this.getParameter('sysparm_user_id'))) {
      return user.getValue('manager');
    }
    return '';
  },
  type: 'CallerUtils'
});

// onChange client script on caller_id
function onChange(control, oldValue, newValue, isLoading) {
  if (isLoading || newValue === '') return;
  var ga = new GlideAjax('CallerUtils');
  ga.addParam('sysparm_name', 'getManager');
  ga.addParam('sysparm_user_id', newValue);
  ga.getXMLAnswer(function(answer) {
    g_form.setValue('u_manager', answer);
  });
}
Red flag to avoid:

Using getXMLWait or client-side GlideRecord as the normal pattern, or returning a whole record when the form needs one value.

They may ask next:
  • How would you return several values in one GlideAjax call?
  • Why doesn't getXMLWait work in the service portal?
Say it in 60 seconds
Hard Situational round Mid-level, Senior Practice question

16. After a release, the incident form takes several seconds to open. How would you find and fix the cause?

What the interviewer is really testing:
Whether you can split browser time from server time and track the delay to a specific script.
Answer frame:

Measure: split the time into server, network and browser; check the transaction log.

Server side: debug business rules for heavy display rules or slow queries.

Browser side: synchronous calls, many onLoad scripts, heavy related lists.

Release link: compare with what the update set changed.

Sample spoken answer:

"First I'd measure where the time goes. The response time breakdown on the form and the transaction logs show whether the server, the network or the browser is slow. If it's the server, I turn on business rule debugging and look at display rules and any new query rules, because a display rule doing a big GlideRecord loop runs on every form load. If it's the browser, I look at onLoad client scripts, especially synchronous calls like getXMLWait, client-side GlideRecord or getReference without a callback, and at related lists the release added. Since it started with a release, I'd open the update set and list every form-related change, which usually narrows it to one or two records quickly. The fix is normally to move data into g_scratchpad or an async GlideAjax call, add a missing index or limit, or move a related list to a tab that loads on demand."

Red flag to avoid:

Blaming the network or the platform without measuring, or rolling back the whole release without finding the cause.

They may ask next:
  • How would you prove your fix actually made the form faster?
  • How would you stop this from reaching production next time?
Say it in 60 seconds

Security 3 questions

Hard Technical round Mid-level, Senior Practice question

17. How does ServiceNow evaluate ACLs when a user tries to read a field on an incident?

What the interviewer is really testing:
Whether you can reason about access step by step, which you need to both build security and debug 'why can't I see this'.
Answer frame:

Two checks: the user must pass the table-level ACL and the field-level ACL.

Most specific first: the exact table and field, then parent tables like task, then wildcards such as incident.* and *.

Inside one ACL: role, condition and script must all pass; any one passing ACL at the matched level is enough.

Sample spoken answer:

"There are two gates: the user has to pass a table-level read ACL on the record and a field-level read ACL on the field. For each gate, the platform looks for the most specific match first. For the table, that's incident, then the parent task, then the wildcard. For the field, it's incident dot that field, then task dot that field, then the wildcard rules like incident dot star. It stops at the first level where ACLs exist and evaluates those. Inside a single ACL, the requirements are ANDed: the user needs one of the listed roles, the condition must be true and the script must return true. If there are several allow ACLs at that level, passing any one of them is enough. Newer releases also have deny-unless ACLs, which are checked first and can block access even when an allow rule passes. So when a user can see the incident but a field is missing, I look at the field ACLs and use the security debugger."

Red flag to avoid:

Saying the platform checks every ACL and needs all of them to pass, or thinking roles alone decide access.

They may ask next:
  • What role do you need to edit ACLs, and why is it elevated?
  • How does a deny-unless ACL change the result when an allow ACL at the same level passes?
  • Why is a script-heavy ACL a performance concern on large lists?
Say it in 60 seconds
Hard Technical round Mid-level, Senior Practice question

18. Users should only see incidents for their own groups. Would you use a read ACL or a query business rule, and why?

What the interviewer is really testing:
Whether you know how row-level restrictions feel to users and perform on large tables.
Answer frame:

Read ACL: checks each row after it's fetched; lists show 'rows removed by security constraints' and uneven pages.

Query rule: adds a condition to the query itself, so hidden rows are never fetched.

Best: often both; query rule for the list experience, ACLs as the real security model for read, write and delete.

Sample spoken answer:

"If I only use a read ACL, the database still returns rows and the platform removes the ones the user can't read. The list then shows a message saying some rows were removed by security constraints, page counts look wrong, and on a big table it wastes work. A before query business rule adds a condition to the query before it runs, like assignment group is one of my groups, so the user simply never gets those rows and paging works. The catch is that a query rule is a filter, not a full security model, and it has to handle admins and integration users properly, usually by skipping them. So in practice I'd use the query rule for a clean list, and keep matching ACLs, because the query rule doesn't cover write or delete, and a script that turns business rules off skips it."

Red flag to avoid:

Choosing ACLs only and calling the 'rows removed' message expected behaviour, or treating a query rule on its own as the complete security model.

They may ask next:
  • What problems do query rules cause for reports and integrations?
  • How would you test that the restriction works for a specific user?
Say it in 60 seconds
Medium Situational round Fresher, Mid-level Practice question

19. An agent says some incidents are missing from their list, but their team lead can see them. How do you find out why?

What the interviewer is really testing:
Whether you debug access methodically instead of just giving the user more roles.
Answer frame:

Reproduce: impersonate the agent, open the same list and filter.

Check filters: the list's filter, the module's filter, saved personal filters.

Check security: 'rows removed' message, read ACLs, query business rules, roles and group membership.

Fix: correct the data or the rule, not a blanket new role.

Sample spoken answer:

"First I'd impersonate the agent and open the same list, so I see exactly what they see. Often the answer is a filter: a personal filter, a module that only shows 'assigned to me', or a condition they didn't notice in the breadcrumb. If the filter is the same as the lead's, I look for the 'rows removed by security constraints' message at the bottom, which points to a read ACL. If there's no message but rows are still missing, it's likely a query business rule, often one that limits incidents to the user's own groups. Then I compare the two users: roles, group memberships, and whether the agent was just added to a group and is still on an old session. I'd use the security debugger to see which rule failed. The fix is usually a missing group membership, not a new role, and I'd confirm by impersonating again."

Red flag to avoid:

Jumping straight to 'give them admin' or another role without finding which rule actually hides the records.

They may ask next:
  • Why is giving the agent the lead's roles a bad quick fix?
  • How would the answer change on an instance with domain separation?
Say it in 60 seconds

Automation & Catalog 4 questions

Medium Technical round Fresher, Mid-level, Senior Practice question

20. When would you build automation in Flow Designer rather than the legacy workflow editor?

What the interviewer is really testing:
Whether you know the current direction of the platform and can still support older workflows you'll inherit.
Answer frame:

Flow Designer: triggers, actions, subflows and flow logic; readable by process owners; the recommended default for new work.

Reuse: subflows and custom actions, plus integration spokes for other systems.

Legacy workflow: still runs many older catalog items; maintain it, migrate when there's a reason.

Sample spoken answer:

"For anything new I'd default to Flow Designer. A flow has a trigger, like a record created or updated, a schedule, or a catalog item being requested, and then a list of actions and flow logic like if, for each and wait for condition. It reads almost like plain language, so a process owner can follow it, and I can build reusable subflows and custom actions, and use integration spokes instead of hand-written REST code. The execution details show exactly which step ran with which values, which makes debugging much easier. The legacy workflow editor is the older drag-and-drop canvas, and lots of instances still run catalog items and approvals on it. I wouldn't rewrite those just because; I'd migrate a workflow when we're changing it significantly anyway, or when it's hard to maintain."

Red flag to avoid:

Saying Flow Designer is only for people who can't code, or proposing to rewrite every legacy workflow at once with no business reason.

They may ask next:
  • What is the difference between a flow and a subflow?
  • How do you debug a flow that failed halfway?
Say it in 60 seconds
Medium Technical round Fresher, Mid-level Practice question

21. Walk me through building a catalog item: variables, variable sets, and what records get created when someone orders it.

What the interviewer is really testing:
Whether you can build a request end to end and know where fulfilment actually happens.
Answer frame:

Item: name, category, who can see it, and the flow or workflow that fulfils it.

Variables: the questions on the form; variable sets for questions shared across items.

Records: request (sc_request), requested item (sc_req_item) and catalog tasks (sc_task).

Behaviour: catalog client scripts and catalog UI policies for the form.

Sample spoken answer:

"I start with the item itself: a clear name, the catalog and category, a short description, and user criteria for who can see it. Then I add variables, which are the questions the user answers, picking the right type, like a reference to the user table instead of a free-text name. Questions used on many items, like 'requested for' and location, go in a variable set so I maintain them once. For form behaviour I use catalog UI policies and catalog client scripts. When someone orders, the platform creates a request, one requested item per item in the cart, and the fulfilment flow on the item creates catalog tasks for the teams doing the work, plus any approvals. In scripts and flows I read the answers from the requested item, for example current.variables.laptop_model in a business rule on sc_req_item."

Red flag to avoid:

Using free-text variables where a reference or choice list belongs, or not knowing the request, requested item and task hierarchy.

They may ask next:
  • What is a record producer, and how is it different from a catalog item?
  • How would you show a variable only to the fulfilment team, not the requester?
Say it in 60 seconds
Medium Technical round Fresher, Mid-level Practice question

22. How do email notifications work, and when would you trigger one from an event instead of a record update?

What the interviewer is really testing:
Whether you can control who gets an email and when, and use events to decouple the sending from the logic.
Answer frame:

When: on insert or update with conditions, or when an event fires.

Who: users, groups, fields on the record, or event parameters.

What: subject and body with field variables, templates and mail scripts.

Events: registered in the event registry, queued with gs.eventQueue.

Sample spoken answer:

"A notification has three parts: when to send, who receives it, and what it says. The simplest trigger is a record inserted or updated with a condition, like priority changes to 1. For anything that isn't a clean field change, I fire an event instead. I register it in the event registry, then call gs.eventQueue with the event name, the record and two parameters, often a recipient in parm1. The notification listens for that event and can send to event parm1. That keeps the 'decide to notify' logic in a script and the email content in the notification, and it's reusable, since several notifications or script actions can listen to one event. For content I use field variables, email templates for shared layouts and mail scripts when I need loops or logic. To test, I check the email log and the event log to see whether the event fired and who was picked."

Code:
// In an after business rule on incident
gs.eventQueue('incident.sla.warning', current,
  current.getValue('assigned_to'), current.getValue('assignment_group'));
Red flag to avoid:

Building an email by hand in a script with no notification record, or not knowing the email and event logs exist.

They may ask next:
  • An email didn't arrive. Where do you look, step by step?
  • How do you stop the person who made the change from getting their own notification?
Say it in 60 seconds
Easy Technical round Fresher, Mid-level Practice question

23. How do you set up a scheduled job that runs a script every night, and what do you watch out for?

What the interviewer is really testing:
Whether you can automate batch work safely without slowing the instance or running under the wrong user.
Answer frame:

Setup: a scheduled script execution with a run time, frequency and optional condition.

Run as: jobs run as a chosen user; pick one with the right access.

Care: batch large updates, log what happened, test on sub-production first.

Sample spoken answer:

"I create a scheduled script execution, give it a clear name, set it to run daily at a quiet time, and write the script, for example closing resolved incidents older than a set number of days. I set the run-as user deliberately, because the job runs with that user's identity and it shows up in the audit history. There's also a conditional option if the job should only run when something is true. Before scheduling it, I test with 'Execute Now' on a sub-production instance and log what it changed. For big volumes I process in batches and use setWorkflow false only where I'm sure notifications and business rules shouldn't fire. If it's more of a process than a script, like a weekly review task, a scheduled Flow Designer trigger can be easier for others to maintain."

Red flag to avoid:

Running a job as an admin by default without thinking, or updating hundreds of thousands of records in one loop during business hours.

They may ask next:
  • How would you stop a job from timing out or slowing the instance on a very large table?
  • Why might a scheduled job behave differently from the same code in background scripts?
Say it in 60 seconds

Integration & Deployment 4 questions

Medium Technical round Fresher, Mid-level Practice question

24. Explain how import sets and transform maps load data, and what coalesce does.

What the interviewer is really testing:
Whether you can load data repeatedly without creating duplicates, which is the most common import mistake.
Answer frame:

Flow: data source to import set staging table, then a transform map to the target table.

Field maps: source column to target field, with scripts when values need changing.

Coalesce: the key used to find an existing record: match updates it, no match inserts.

Scripts: onBefore, onAfter, onStart and onComplete; ignore skips a row.

Sample spoken answer:

"A data source says where the data comes from, like an uploaded spreadsheet, a JDBC connection or a file. Loading it fills an import set table, which is just a staging table with the raw rows. A transform map then moves each row into the target table, with field maps from source columns to target fields. Coalesce is the key setting: I mark one or more fields, like employee number, as coalesce fields, and for each row the platform looks for a target record with the same value. If it finds one, it updates it; if not, it inserts. With no coalesce, every run inserts new records, which is how people end up with duplicate users. For cleaning values I use field map scripts, and an onBefore transform script can set ignore to true to skip bad rows. The import set shows each row's result, so errors are easy to trace."

Red flag to avoid:

Loading data straight into the target table with no staging, or not knowing that a missing coalesce creates duplicates.

They may ask next:
  • What happens if the coalesce field is empty on some rows?
  • How would you schedule this import to run every night?
Say it in 60 seconds
Hard Technical round Mid-level, Senior Practice question

25. How would you integrate ServiceNow with an external system over REST, both receiving and sending data?

What the interviewer is really testing:
Whether you can choose the right inbound and outbound tools and handle auth, errors and failures like a production integration.
Answer frame:

Inbound: Table API for simple record access; Scripted REST API for custom logic; import set API when data should be transformed.

Outbound: a REST Message with methods, called from a flow or with RESTMessageV2 in script.

Production concerns: a dedicated integration user with least access, OAuth or basic auth, a MID Server for systems inside the network, retries and logging.

Sample spoken answer:

"For inbound, the out-of-the-box Table API already lets another system create or read records, so for simple cases I give them an integration user with just the roles they need. If they need custom logic or a payload that doesn't match our tables, I build a Scripted REST API, and if the data needs cleaning and matching I send it through the import set API so transform maps and coalesce do the work. For outbound, I define a REST Message with the endpoint, authentication and methods, then call it from a flow or from script with RESTMessageV2. I run outbound calls in an async business rule or a flow, never in a before rule, check the status code, log failures and retry. If the other system sits inside the company network, the call goes through a MID Server."

Code:
var rm = new sn_ws.RESTMessageV2('Asset Service', 'get');
rm.setStringParameterNoEscape('asset_tag', current.getValue('asset_tag'));
var response = rm.execute();
if (response.getStatusCode() == 200) {
  var body = JSON.parse(response.getBody());
  gs.info('Owner: ' + body.owner);
} else {
  gs.error('Asset Service failed: ' + response.getStatusCode());
}
Red flag to avoid:

Giving the integration an admin account, or making a synchronous outbound call inside a before rule so every save waits on another system.

They may ask next:
  • How would you stop two systems from updating each other in an endless loop?
  • What changes if the external system is slow or down for an hour?
Say it in 60 seconds
Medium Technical round Fresher, Mid-level Practice question

26. What does an update set capture, what does it not capture, and how do you move one to another instance?

What the interviewer is really testing:
Whether you can promote work safely, and know the data that silently gets left behind.
Answer frame:

Captures: configuration changes such as business rules, client scripts, UI policies, form layouts and dictionary changes.

Does not capture: data records like users, groups, group memberships or incidents.

Moving: mark complete, retrieve on the target, preview, fix problems, commit.

Sample spoken answer:

"An update set records configuration changes as I make them in the instance: business rules, client scripts, UI policies, script includes, form layouts, dictionary changes, notifications. What it doesn't pick up is data. Users, groups, group memberships, and records in tables like incident aren't captured, so if my new rule depends on a new assignment group, I have to move that group separately, usually by exporting and importing XML. Before I start, I make sure I'm in my own named update set, never Default. To move it, I mark it complete, retrieve it on the target instance from the source, and run a preview. The preview flags collisions and missing references, which I resolve before committing. For big releases I group related sets into a batch so they commit in the right order."

Red flag to avoid:

Doing work in the Default update set, or assuming groups and users travel with the update set.

They may ask next:
  • How do update sets behave with scoped applications?
  • How do you back out an update set that caused a problem?
Say it in 60 seconds
Hard Situational round Mid-level, Senior Practice question

27. During preview, an update set shows a collision with a newer local change on the target instance. What do you do?

What the interviewer is really testing:
Whether you resolve deployment conflicts by understanding both changes instead of clicking accept to get past the preview.
Answer frame:

Understand: open both versions and compare; find who made the local change and why.

Decide: accept the remote update, skip it, or merge both changes by hand.

Prevent: find why someone changed the target directly, and fix the process.

Sample spoken answer:

"A collision means the record on the target instance was changed after the version in my update set, so committing would overwrite someone else's work. I wouldn't just click accept. I'd compare the two versions to see what each change does, and find out who made the local change and why. Often it's a hotfix made directly in test or production. If my version already includes their fix, I accept the remote update. If their change must stay and mine isn't needed, I skip mine. If both matter, I merge them in development, capture a new version in an update set, and move that instead, so every environment ends up the same. Then I'd deal with the cause: changes made directly on a higher instance drift out of sync, so I'd push for fixes to go through development, even urgent ones."

Red flag to avoid:

Accepting every remote update to get past the preview, or skipping them all without checking what gets lost.

They may ask next:
  • What would you do if the preview shows a missing reference instead of a collision?
  • How would you keep instances in sync after an emergency fix made directly in production?
Say it in 60 seconds

Real Work 3 questions

Medium Behavioral round Mid-level, Senior Practice question

28. Tell me about a script you wrote on ServiceNow that caused a problem in production, and how you traced and fixed it.

What the interviewer is really testing:
Whether you can own a mistake, debug with the platform's tools and change how you work afterwards.
Answer frame:

Situation: what broke, who noticed and how bad it was.

Trace: logs, debug tools and how you narrowed it to your script.

Fix and lesson: the fix, how you protected users meanwhile, and what you changed in your process.

Sample spoken answer:

"At my last company I wrote an after business rule on incident that updated the parent incident's work notes whenever a child changed. In testing it looked fine. In production the service desk reported duplicate emails and some saves taking several seconds. I turned on business rule debugging for my session, reproduced it, and saw my rule firing twice per save. I'd called current.update inside the after rule to set a flag, which re-ran every rule on the record, and the parent update was sending notifications as well. As a quick fix I deactivated the rule, since nothing critical depended on it. Then I moved the flag logic into a before rule, kept only the parent update in the after rule, and tested with a realistic number of child records. Since then I review every rule for update calls on current, and I test with production-like data volumes."

Red flag to avoid:

A story where the bug was someone else's fault, or where the fix was found by guessing rather than using logs and debugging.

They may ask next:
  • How did you tell the affected users what had happened?
  • What would you add to code review so this doesn't happen again?
Say it in 60 seconds
Hard Behavioral round Mid-level, Senior Practice question

29. Walk me through a platform upgrade you worked on. How did you handle skipped records and customisations?

What the interviewer is really testing:
Whether you've handled upgrades with a plan and understand why customising base files costs the company later.
Answer frame:

Plan: sub-production first, a test plan built from the most used processes.

Skipped records: review each one; revert to base, merge, or keep and document.

Result and lesson: what you found, how you reduced customisation for next time.

Sample spoken answer:

"In my last role I was part of an upgrade for an instance that had been customised a lot over the years. We upgraded a sub-production clone first. The upgrade left a long list of skipped records, which are base files we'd changed, so the upgrade didn't overwrite them. We went through them in groups. Where our change no longer mattered, we reverted to the base version. Where we needed both, we merged our change into the new base version. A few we kept, with a note explaining why. Then we ran regression tests on the flows people use most: raising incidents, changes and the top catalog items. We found one client script that broke a form, fixed it, and repeated the process in the next environment. Afterwards I pushed for a rule that we copy and extend base scripts instead of editing them, which made the next upgrade much shorter."

Red flag to avoid:

Saying skipped records can simply be ignored, or never having looked at them after an upgrade.

They may ask next:
  • How did you decide which skipped records to revert and which to keep?
  • How would you build a regression test plan if there are no automated tests?
Say it in 60 seconds
Medium Behavioral round Mid-level, Senior Practice question

30. Tell me about a time a process owner asked for a heavy customisation and you steered them toward a simpler option.

What the interviewer is really testing:
Whether you can protect the instance's health and still leave the business feeling heard.
Answer frame:

Ask: what they wanted and the real need behind it.

Options: the configured or out-of-box way next to the custom one, with the long-term cost of each.

Outcome: what was built and how the owner felt about it.

Sample spoken answer:

"At my last company the change manager wanted a custom approval engine, with a new table and scripts, because approvals had to depend on the risk level and the affected service. When I asked what problem he was really facing, it was that high-risk changes to key services weren't getting the right approvers. I showed him that the standard change approval path could handle it with approval rules based on risk and the CI's support group, driven from a flow, with no new table and nothing that would fight the next upgrade. I built a quick demo in our dev instance using two real past changes, which made it concrete. He agreed, with one small tweak we added in a subflow. It went live in a couple of weeks instead of the couple of months the custom build was estimated at, and it upgraded cleanly later."

Red flag to avoid:

Either building anything the business asks for without question, or refusing flatly with no alternative.

They may ask next:
  • What would you have done if he'd insisted on the custom build?
  • How do you explain technical debt to someone who isn't technical?
Say it in 60 seconds
Were you asked something else? Share it A person checks every question before it goes on the site. No name is shown.
For the call itself

The questions above are the prep. The call has ten more.

ClapAssist is an AI interview assistant for Mac and Windows. It listens to the interview on your computer and shows you what to say, in short lines you can read while you talk. Your resume and notes are never stored on our servers. It stays out of screen share on every plan; only you can see it.

Download ClapAssist with 10 free minutes
Mac and Windows · Stays out of screen share · No card