Optional Lab: Advanced Forms
This lab is optional. It builds on Lab #7 with multi-domain ingestion, record producers, fillability overrides, and query filters. No core lab depends on it.
Sections 1.1 and 1.3 need plugins a stock ServiceNow instance doesnβt include: the Human Resources Catalog comes with HR Service Delivery, and the Report a Defect form comes with Agile Development. If your instance doesnβt have them, read those sections and complete Sections 1.2, 1.4, and 1.5.
Overview
- Learning Objectives: Add a second catalog (HR) to your existing forms ingestion as a new domain, read and reason about fillability errors by severity, apply a fillability override to a record producer, recognize when override canβt fix a form and exclude it instead, and explore advanced filtering options.
- Estimated Time: About 35 minutes of active configuration, plus ingestion cycles between sections (after Sections 1.1, 1.3, and 1.4). Plan for up to 48 hours elapsed.
- Prerequisites:
- Lab #7 complete (IT catalogs ingested)
- For Sections 1.1 and 1.3: the HR Service Delivery and Agile Development plugins on your ServiceNow instance
π οΈ 1: Walkthrough
1.1: Add the Human Resources Catalog as a Second Domain
Why this matters: Adding a second catalog with a different domain demonstrates how Moveworks handles multi-domain form ingestion. IT and HR forms are configured independently so they can have different filtering rules and requester field mappings.
Heads up: Error 13008, βAt most one source config is allowed per integration ID.β
If you try to create a brand-new ingestion source config for the snow integration, Moveworks will reject it with this error. Each integration can have only one source config, and multiple domains live inside it as per-domain configurations.
The fix: open the source config you already created in Lab #7 and add a new domain inside it. The steps below use that path.
-
In Moveworks Setup, navigate to Forms > Import > Import Settings.
-
Open the existing ingestion configuration for the
snowintegration (the one you created in Lab #7) to launch the ingestion wizard. -
Step through the wizard to Step 3: Select Form Catalogs. The five wizard steps are: Select Connectors β Setup Ingestion β Select Form Catalogs β Provide Sample URL Templates β Review Samples.
About the Advanced mode toggle on this step. In the top-right corner of the Select Form Catalogs page youβll see an Advanced mode toggle. The subtitle reads: βSwitch to advanced mode to include complex filters for ingestion and more such controls.β Toggling Advanced mode shows per-domain settings like custom filter queries, Disallowed form IDs, Additional form IDβs to ingest, and additional table names.
Basic mode is enough for Section 1.1 (adding the HR catalog as a second domain). Advanced mode is required later in Section 1.4 (Disallowed form IDs) and Section 1.5 (Advanced filter). You can toggle between modes freely; nothing saves until you confirm ingestion at the end of the wizard.
-
In the catalog table, check the Human Resources Catalog row. (The sys_id should already appear in the Catalog IDs column; on a standard instance itβs
7b0370019f22120047a2d126c42e7075.) -
In the Select Domain dropdown for that row, choose
HR. All three catalogs (Technical Catalog (IT), Service Catalog (IT), and Human Resources Catalog (HR)) should now be checked with their domain tags assigned.
-
Click Next to advance to Step 4: Provide Sample URL Templates. Youβll now see a URL template field for each domain. The IT template should already be populated from Lab #7.
-
In the Paste Form URL template for HR field, enter the ESC (Employee Center) URL template:
textReplace
[your-instance]with your ServiceNow instance name, the same one you used for the IT template in Lab #7. The{form_id}placeholder is required; Moveworks substitutes it with each ingested formβs sys_id at runtime. -
Click Next to advance to Step 5: Review Samples. Moveworks will show a preview of forms it found with the current config. You should see noticeably more forms than in Lab #7 (for example, about 182 compared with about 119 for IT only). The exact count varies by instance. Confirm HR forms appear alongside IT forms in the sample list, then click Confirm Ingestion.

-
A Summary dialog opens with two required fields:
Both fields are mandatory. The Config Title names this ingestion configuration for future reference; the Change Summary creates an audit-trail entry describing what you changed in this revision. Click Confirm Ingestion in the dialog to finalize.
Sample values for illustration only. The values above are suggestions to keep this lab consistent. Your organization can use any naming convention. The Config Title should describe the ingestion config; the Change Summary should describe the specific revision being saved. Both are surfaced in the configurationβs change history, so future-you (or another admin) can quickly see what changed and why.

Heads-up about HR record producers. All 34 HR producers use sn_hr_core.hr_ServicesUtil.createCaseFromProducer, which derives the caseβs opened_for from the GlideSession user, so Moveworks submissions get attributed to the service account, not the actual employee. Ingesting still demonstrates multi-domain setup; making in-chat submission attribute correctly would need ServiceNow-side changes (out of scope here). See the Moveworks Help docs for context on this anti-pattern.
Ingestion of the HR catalog will start on the next scheduled run. You can check progress under Forms > Import > Imported Forms.
1.2: Reading Fillability Errors
Why is the ingested count lower than the Step 5 preview? Youβll likely see fewer forms in Forms > Import > Imported Forms than the wizardβs Sample Preview promised (e.g. ~159 ingested vs. ~182 previewed). The preview query only checks active=true and catalog membership; ingestion applies a stricter set of validations and drops anything that fails them. The most common reasons a form is dropped at ingestion:
- Empty or inactive category (the form has no category, or its innermost category is set to inactive)
- No active catalogs remaining for the form (after blacklist/inactive filters)
visible_standaloneis false (the catalog item is hidden as a standalone item)hide_spis true (the item is configured to hide from Service Portal)sys_class_nameoutside the allowlist (onlysc_cat_item,sc_cat_item_producer,sc_cat_item_guide,pc_software_cat_item,pc_hardware_cat_item, andx_fls_appportal_catalog_itemsare ingested)- Empty name on the form
You can ignore the gap. Itβs expected and doesnβt affect the demos in Sections 1.3 and 1.4.
Once ingestion finishes, open Forms > Import > Imported Forms and sort by the Fillable column. Many forms will show as Not fillable with one or more optimization errors. Before reaching for overrides, learn to read the errors.
Click any unfillable form to open its detail panel. The Form optimization errors section lists each error with a type, description, and a βLearn how to resolveβ link.

Fillability error cheat sheet
Every βNot fillableβ error falls into one of two severity tiers. The βOverride unfillable forms to be fillableβ setting clears only the first tier; it has no effect on the second. For the canonical reference (every error type, root cause, and remediation), see the Form Fillability ServiceNow Error Guide.
Rule of thumb: if every error on a form is βrequires override,β override will work. If even one error is βblocking,β override wonβt help. You either fix it in ServiceNow, exclude the form, or let it deflect to the portal.
1.3: Report a Defect (override demo)
Where this lives: The Section 1.3 override rule is on Forms > Advanced Settings > Plugin Settings. Sections 1.4 (Disallowed form IDs) and 1.5 (Advanced filter) are configured in the ingestion wizard with Advanced mode on.
Report a Defect is a record producer with two βrequires overrideβ errors and no blocking errors, so it shows the override feature end to end. After override, the form fills in chat and submits cleanly.
-
In Forms > Import > Imported Forms, find Report a Defect (
sys_id: 6377b7a77f000001070ec31b396896fe) and click into it. You should see 2 Form optimization errors, both βrequires overrideβ:- βRecord producer forms must be manually verified to be working correctlyβ (IS_RECORD_PRODUCER)
- βRecord producer writes tickets to unsupported table
rm_defectβ (UNSUPPORTED_RECORD_PRODUCER_TABLE)

-
Copy the sys_id from the form detail panel.
-
Navigate to Forms > Advanced Settings > Plugin Settings in the sidebar.
-
Scroll to the Override unfillable forms to be fillable field (the description reads: βForce an override of unfillable forms to be fillable in chat. Note that this only applies to ServiceNow forms due to a client script, UI Policy Script, or virtue of being a Record Producer.β).
-
In the DSL Editor, enter this rule:
textThe
IN [...]syntax is a list. You can extend it later with more form sys_ids separated by commas, each wrapped in.$LOWERCASE(). The case-normalization ensures the rule matches regardless of how ServiceNow returns the sys_id casing.
-
Click Validate Syntax to confirm the DSL parses. Then click Save and wait for the next ingestion cycle to re-index the form.
-
Back in Forms > Import > Imported Forms, refresh Report a Defect. It should now show as Fillable.

-
Test in the AI Assistant: type
"report a defect"(or similar). The Assistant surfaces Report a Defect with a Complete this request button.
Click Complete this request to open the form modal in chat. It only has two fields: Short description and Description (both mandatory). Fill them in and submit. Verify a new record appears in ServiceNow at
rm_defect.list.
Try it from a different angle. Whatβs another way you could verify the record landed, without opening ServiceNowβs UI? Hint: you set up something for this in Lab #3, the API Playground. See if you can craft a
GET /api/now/table/rm_defectrequest that returns the record you just submitted.
Pause and think about this.
If you havenβt completed Lab #8: Ticketing (Core) yet, there are a lot of ticketing concepts that would be required for end-to-end ticket handling, none of which are configured in your instance right now:
- Table mappings: Moveworks Setup needs to know about each destination table (Incident, Request, Request Item, Task) before it treats records there as tickets
- Table Actions: Query, Create, Update, Resolve, Reopen permissions per table
- Routing & workflows: which intent routes to which ticket type
- Field mappings:
caller_id/requested_for/requested_bymappings, custom_data, default values - Service Portal URL: for βView in portalβ links in chat
- Polling & notifications: for status updates and concierge nudges
Moveworks Setup even flagged this exact form earlier with βRecord producer writes tickets to unsupported table rm_defectβ. So why did the AI Assistant just successfully file a record from it?
Think about it: what did the override actually do, and what code path runs when you hit Submit? Does Moveworks need to know about the destination table to call the record producerβs submit endpoint? Of all the ticketing concepts above, which ones would you actually need to configure to make this form work the way it just did? And which ones come into play only after submission?
Sit with the question for a moment before reading the next callout.
Why it worked anyway. Submission hits ServiceNowβs record-producer API (POST /api/sn_sc/servicecatalog/items/{sys_id}/submit_producer); Moveworks just calls that endpoint, and ServiceNowβs own producer script writes to rm_defect. Thereβs no Moveworks-side check at submit time for βis this table in your ticketing config?β, and the override already cleared the fillability checks.
Where the ticketing config would matter is after submission: tracking the record as a ticket in chat (status, reopen, βView in portalβ, lifecycle). rm_defect isnβt mapped, so you get a plain confirmation. To get full lifecycle in a real deployment, youβd add rm_defect as a new table mapping (out of scope here).
1.4: Item Designer Category Request (when override isnβt enough)
Not every unfillable form can be rescued by override. Item Designer Category Request is the canonical example: override handles two of its three errors, but one is Blocking and nothing clears it.
-
In Forms > Import > Imported Forms, open Item Designer Category Request (
sys_id: 48bcec40eb0311003623666cd206fe24). Youβll see 3 Form optimization errors:
-
Even if you applied an override rule for this formβs sys_id, the reference qualifier on the
parentfield still uses JavaScript (javascript:'sc_catalog='+current.variables.sc_catalog), which Moveworks canβt evaluate in chat. The form would stay unfillable.
The real fix is in ServiceNow, not Moveworks Setup. The blocking error requires either rewriting the parent fieldβs reference qualifier as a static encoded query (e.g., sc_catalog=<hardcoded_sys_id>) instead of JavaScript, or accepting that this form belongs in the ITSM portal.
Why not use Script IDβs to ignore? That setting only filters client scripts (sys_script_client records on the catalog item). It does not affect reference qualifier JavaScript, which is a different ServiceNow construct handled in a separate code path. No Moveworks configuration field can bypass a REF_QUALIFIER_USES_SCRIPTS blocking error. The fix has to happen in ServiceNow.
Since Item Designer Category Request is an admin-facing form that employees wonβt use through the AI Assistant anyway, the pragmatic choice is to exclude it from ingestion entirely.
Catalog scoping. Item Designer Category Request lives in the Service Catalog (IT domain), not the HR catalog you added in Section 1.1. The exclusion below is added under the IT domain block of your existing ingestion source config, not under HR.
-
Navigate to Forms > Import > Import Settings and open your existing
snowingestion source config. Step through the wizard to Step 3: Select Form Catalogs, and toggle Advanced mode on (top-right of the page). Without Advanced mode, the per-domain configuration block stays collapsed and the Disallowed form IDs field is hidden. -
Expand the IT domainβs per-domain configuration block, then scroll to the Disallowed form IDs field (description: βForm IDs you do not want ingested. This setting will be respected regardless of other options.β). No DSL rule is needed here. The field is a plain Value / Display Value list; you enter the formβs sys_id directly.
-
Click + to add a new entry. In the Value column, paste the sys_id below. Leave the Display Value column blank, itβs optional and not used by the filter.
text
-
Click Save, then advance through the rest of the wizard and Confirm Ingestion. In the same Summary dialog from Section 1.1, give the change a new title and summary.
-
After the next ingestion cycle, Item Designer Category Request will no longer surface in Forms > Import > Imported Forms.
1.5: Advanced filtering with a custom query (reference)
This section is reference-only, not a lab step. You donβt need to apply anything here. Read it to understand what Advanced mode adds, then move on.
Instead of the Default filter, you can switch to an Advanced filter with a custom ServiceNow encoded query. The setting lives in the same per-domain block on the wizardβs Step 3 (Select Form Catalogs) that you used in Section 1.4. Toggling Advanced mode exposes a Filter type dropdown per domain; switching it to Advanced filter opens an encoded-query field.
The two queries below reproduce the catalog scoping you set up in Basic mode in Section 1.1 (IT pulls from Technical + Service catalogs; HR pulls from the Human Resources catalog). Writing the scoping out as an explicit query produces the same form count as Basic mode, because Basic mode internally generates an equivalent active=true^sc_catalogsIN<sys_ids> query.
IT domain (Technical Catalog + Service Catalog):
HR domain (Human Resources Catalog):
The power of Advanced mode is everything you can layer on top of that base. Once youβre writing the query yourself, you can narrow further on any field ServiceNow exposes: a specific category (category.titleINHardware,Software,Access), a specific class (sys_class_nameINsc_cat_item,sc_cat_item_producer to exclude order guides), recency (sys_updated_on>=javascript:gs.daysAgoStart(180)), categorization presence (categoryISNOTEMPTY), or any combination. The encoded-query syntax matches what youβd build visually in a ServiceNow list filter, so the easiest workflow is: build the filter on sc_cat_item.list in ServiceNow, right-click the breadcrumb to Copy query, then paste here.
The wizardβs Step 5 (Review Samples) preview does not reflect your Advanced filter. The preview is hardcoded to the baseline active=true^sc_catalogsIN<ids> query and ignores any extra clauses you add (category, class, date, etc.). Those clauses are only applied at actual ingestion. So Step 5βs count is a useful upper bound, but if youβve narrowed beyond catalog membership, expect the post-ingestion count to be lower than what the preview shows.
β 2: Verification & Next Steps
- Multi-domain ingestion working:
- Human Resources Catalog checked in the existing
snowsource config (no Error 13008) - Domain
HRselected for that row - HR URL template set to
/esc?id=sc_cat_item&sys_id={form_id}on Step 4 - Step 5: Review Samples shows more forms than Lab #7βs IT-only ingestion
- Summary dialog completed with Config Title and Change Summary
- Both IT and HR forms appear in Forms > Import > Imported Forms after the next ingestion cycle
- Human Resources Catalog checked in the existing
- Override demo (Report a Defect):
- Report a Defect shows as Fillable after the override rule is applied
- Typing
"report a defect"in the AI Assistant starts conversational form filling - Submitting the form creates a new record at
rm_defect.listin ServiceNow
- Exclusion demo (Item Designer Category Request):
- Item Designer Category Request no longer appears in Forms > Import > Imported Forms
Next: Return to the Moveworks Setup labs to continue with the core labs or pick another optional lab.
πͺ 3: Reflecting on This Configuration
Through this lab, youβve learned the following:
- How to add a second domain (HR) to an existing forms ingestion source config, and why Moveworks rejects a second source config for the same integration with Error 13008
- That stock ServiceNow HRSD record producers donβt expose a requester variable (they rely on
hr_ServicesUtil.createCaseFromProducer, a session-based anti-pattern), so in-chat submission needs ServiceNow-side fixes - How to read fillability errors and distinguish Requires override from Blocking severity
- How to apply a fillability override with a DSL rule to make a record producer thatβs safe to fill in chat fillable
- When override genuinely wonβt help, and how to exclude the form via Disallowed form IDs
- How to use Advanced filter for custom form selection
βοΈ 4: Configuration Details
Use the tables below to fill in the required fields accurately.
HR Catalog (added to the existing snow source config in Basic mode)
Fillability Override Example (Report a Defect, from Section 1.3)
The setting below lives at Forms > Advanced Settings > Plugin Settings. (Section 1.4 and 1.5 settings live in the ingestion wizardβs Advanced mode.)
Exclusion Example (Item Designer Category Request, from Section 1.4)
Disallowed form IDs lives on Forms > Import > Import Settings, inside the per-domain block. Item Designer Category Request is in the IT/Service Catalog, so the entry goes under the IT domain block.
Forms Ingestion Settings Reference
All fields below live on the Select Form Catalogs wizard step in Advanced mode. The Scope column shows whether the field is per-domain (inside a ServiceNow related configurations block) or integration-level (shared across all domains under the same integration).