ServiceNow App Engine Studio (AES) is the low-code environment for building scoped applications without starting in a script editor. It guides you through four areas: data, experience, logic and automation, and security. These App Engine Studio best practices help you build apps that someone else can maintain a year from now.
1. Decide whether you need a custom app
Custom tables cost licence entitlement and long-term upkeep. Before you create an app, check:
- Does an existing ServiceNow product or store application already cover the process?
- Could a catalog item with a flow handle it without a new table?
- Is the request really a report or a dashboard on data you already have?
Build a custom app when the process has its own records, its own lifecycle, and no product that fits.
2. Design the data model first
Most rework in low-code apps traces back to a table created in a hurry. Sketch the tables, their relationships, and the main fields before you open Table Builder.
Extend Task only for work. If a record is assigned to someone, moves through states, and may need approvals or SLAs, extend Task. For reference data, create a standalone table. An equipment list that extends Task inherits fields such as Assignment group and Work notes that mean nothing for it.
Use reference fields, not text. A Department field should reference cmn_department. A free-text department name cannot be reported on reliably and will be misspelled.
Use choices for short, stable lists. Use a reference table when the list will grow or needs its own attributes.
Name things for the next person. Give tables singular labels, such as Equipment Request. Give fields labels that read well on a form. You cannot rename a column later without creating a new one.
Be careful with spreadsheet imports. AES can create a table from a spreadsheet, and it will reproduce every flaw in that spreadsheet. Clean the columns first, then follow the import set best practices for the data load.
3. Start from templates, then review
App templates and the starting options in AES give you a working structure quickly. Treat what they generate as a draft. Remove tables, roles, and fields you do not need before anyone enters data, because unused artifacts are much harder to remove once records exist.
4. Set up security at the start
AES asks you to define roles when you create a table. Take that step seriously.
- Create at least two roles per app: a user role for people who submit and view their own records, and an admin role for people who manage everything.
- Grant access to roles, never to individual users. Assign the roles to groups.
- Check every table's create, read, write, and delete access. Delete should almost always be limited to the admin role.
- Test as a real user with impersonation. Do not rely on what you see as an administrator.
When access does not behave as expected, the ACL troubleshooting guide explains how to trace which rule is deciding.
Set application access on each table deliberately. Leave Can read available to other scopes only when other apps need the data, and keep create, update, and delete closed unless there is a reason to open them.
5. Prefer flows to scripts
In an app built by low-code developers, logic should live where they can read it.
- Use Flow Designer for approvals, notifications, task creation, and record updates. Follow the Flow Designer best practices on subflows and error handling.
- Use UI Policies to show, hide, or require fields before reaching for a client script.
- Use a Business Rule only when logic must run inside the database transaction, such as validating a record before it saves. The Business Rule best practices cover when that applies.
When you do need a script, put reusable logic in a Script Include and call it from the flow or rule. A scoped Script Include looks like this:
var EquipmentRequestUtils = Class.create();
EquipmentRequestUtils.prototype = {
initialize: function () {},
// Returns true when the requester already has an open request
// for the same equipment item.
hasOpenRequest: function (requesterId, equipmentId) {
var request = new GlideRecord('x_acme_equip_request');
request.addQuery('requested_for', requesterId);
request.addQuery('equipment', equipmentId);
request.addActiveQuery();
request.setLimit(1);
request.query();
return request.hasNext();
},
type: 'EquipmentRequestUtils'
};
Replace x_acme_equip_request with your own table name. Scoped apps use the scoped API, so some global methods are unavailable. Check the scoped API reference before copying a global example.
6. Keep the experience simple
- Choose one primary experience. A workspace suits people who process records all day. A portal or catalog item suits people who submit a request now and then.
- Put the fields people must complete at the top of the form, and keep each section short.
- Build list views and filters for the questions users ask every day, such as "my open requests".
7. Govern who builds what
Low-code works when administrators set guardrails early.
- Delegate development per app. Give each builder access to their own application with only the permissions they need, instead of the
adminrole. - Use an intake process. The App Engine Management Center lets you review app requests, see what is being built, and manage deployments in one place.
- Use collaboration descriptors to control what each collaborator on an app may do.
- Review before production. A platform developer should check the data model, access controls, and any scripts before the first deployment.
- Agree naming conventions for apps, tables, roles, and flows, and write them down.
8. Test before you deploy
- Test each role by impersonating a user who has only that role.
- Test the unhappy paths: a rejected approval, a missing mandatory value, a user with no access.
- Automate the main path with the Automated Test Framework. The ATF regression guide shows how to keep those tests stable.
9. Deploy as an application
A scoped app is a versioned package. Move it as one.
- Develop only in a sub-production instance.
- Deploy through the application repository, App Engine Management Center pipelines, or source control.
- Increase the version number with every release and record what changed.
- Do not edit the app directly in production. Changes made there are overwritten or cause conflicts on the next install.
Global configuration that the app depends on, such as a group or a system property outside the scope, still travels separately. The update sets guide explains how to move those pieces.
Checklist
- Confirmed no existing product covers the need
- Data model sketched before the first table
- Task extended only for work records
- User and admin roles defined and tested by impersonation
- Logic in flows first, scripts in Script Includes
- One clear primary experience
- Builders delegated per app, without the admin role
- Main path covered by an ATF test
- Deployed as a versioned application, never edited in production