OBLYTECH Logo
OBLYTECH Logo
Common ServiceNow App Engine and Low-Code Mistakes and How to Avoid Them

Common ServiceNow App Engine and Low-Code Mistakes and How to Avoid Them

Most App Engine problems that reach a platform team are described as symptoms, and the same symptom can come from several common mistakes. This page covers the mistakes behind them, what each one looks like in use, and how to check which one is causing a problem before anything is changed.

Over-Scoping the App on First Build

Mistake: Building a comprehensive app with 100 fields, 20 workflows, integrations to five systems and a complex UI. The intent is to deliver a complete solution immediately.

Symptom: The app build takes months. By the time it launches, requirements have changed. The app is complex and hard to maintain. Teams do not understand all the features.

Root cause: Confusing MVP (minimum viable product) with full product. MVP should have the smallest set of features to deliver value and validate the approach. Full features come later based on learning.

Fix: Start with a small scope: core data model, key workflows, and essential UI. Launch this in a focused timeframe. Gather feedback and add features based on real usage. This approach is faster to launch, easier to maintain and adapts to changing needs.

Poor Data Model Design

Mistake: Creating a data model with too many fields, unclear relationships or fields that duplicate data from other tables.

Symptom: Forms are cluttered. Reports are slow because queries must join many tables. Business logic breaks when data is inconsistent across places. Adding new fields requires changing many workflows.

Root cause: Building the data model based on the current UI layout or form design, not based on the entities and relationships. Confusing “data storage” with “UI presentation”. Trying to store calculated values instead of computing them at query time.

Fix: Model entities and relationships first, independent of UI. A good model has one place to store each fact (no duplication), clear relationships between entities, and fields that represent business data (not UI artifacts). Use normalisation principles: avoid storing the same data in multiple places. Calculate aggregate fields at query time or in a reporting layer, not in the base data.

Ignoring Performance From the Start

Mistake: Building a feature without checking performance. The app works fine with 100 records but slows down with 10,000.

Symptom: Users report slow forms, slow searches, slow reports. Workarounds are needed to avoid performance issues (filtering to show fewer records, removing some calculations). App becomes hard to scale.

Root cause: Not profiling queries during development. Building without indexes. Using client-side logic (field calculations in JavaScript) instead of database queries. Not testing with realistic data volume.

Fix: Test performance early and often. Use the browser developer tools to profile page load time. Check the database slow query log to find expensive queries. Add indexes to frequently queried fields. Push calculations to the database or a scheduled job rather than client-side JavaScript. Test with a production-like data volume before launching.

Weak Testing and No Regression Suite

Mistake: Testing only the happy path (normal workflow) before launch. No systematic test plan. No automated tests to catch regression when changes are made.

Symptom: A change to one workflow breaks a different workflow that was not re-tested. Bugs that were fixed before come back. Users report issues that should have been caught before launch.

Root cause: Time pressure leading to limited testing. Assumption that “it should work” without proof. No test infrastructure in place.

Fix: Before launch, test systematically: normal cases, edge cases (empty data, very large numbers), error cases (what happens when integration fails?). Create a test plan document. Use automated testing for regression; if a bug is found and fixed, add an automated test that would have caught it. As the app grows, maintain a regression suite that runs against every change.

Deployment Without Change Control

Mistake: Pushing changes directly to production without following change management. An app update breaks an integration that was not tested, causing data loss.

Symptom: Unexpected issues in production. No rollback plan if something goes wrong. No visibility to stakeholders that changes are happening.

Root cause: Low-code tools make changes easy and fast, so teams skip formal change control. The belief that “it is just an app, not a system change” leads to under-estimation of impact.

Fix: Treat app changes like any other platform change. Follow change management: document the change, test in a staging environment, get approval from relevant stakeholders (data owners, managers of affected teams), schedule the deployment, monitor for issues. For critical changes (data model changes, integrations), use a phased rollout (pilot group first, then broader).

Tight Coupling to External Systems

Mistake: Building the app to directly depend on an external system with no fallback. If the external system is slow or fails, the app becomes unusable.

Symptom: When the external system is down for maintenance, users cannot use the app. When the external system is slow, all app operations become slow. Integrations break and there is no visibility to users about the problem.

Root cause: Not designing for resilience. Not caching data locally. Not handling integration failures gracefully.

Fix: Cache data locally so the app works even if the external system is temporarily unavailable. Use async integrations (queue the request, process it in background) rather than sync (wait for response before continuing). Implement fallback logic: if the integration fails, use cached data or offer degraded functionality. Monitor integration health and alert if failures are increasing.

Inadequate Documentation

Mistake: Building the app without documenting the data model, workflows, integrations or business rules. Only the builder understands how it works.

Symptom: A team member leaves and no one can maintain the app. Changes are slow because the next person must reverse-engineer the design. Bugs are hard to trace because the logic is undocumented.

Root cause: Time pressure and the belief that “the code documents itself”. Low-code tools make it look simple, but hidden complexity still exists.

Fix: Document the data model (entity diagram, field definitions). Document workflows (why does this transition exist, what happens if it fails?). Document integrations (what is being sent, expected timing, failure modes). Maintain a README that explains the app’s purpose and how to use it. Keep documentation as part of the definition of done: no feature is done until it is documented.

Diagnosing which mistake is behind a symptom before changing anything

Most App Engine problems reported to a platform team are described as symptoms: a list is slow, a user cannot finish a form, a report disagrees with the source. The same symptom can come from several common mistakes on this platform, and the fix for one can make another worse. Before changing configuration, it helps to match the symptom to the likely underlying error and check whether the evidence supports it. Changing a data model to fix a slow screen, when the real cause is a weak filter, creates a second problem without solving the first.

Symptom to likely cause, with the check that confirms it

What users report Mistake most likely behind it Check to run before changing anything
Forms take long to open for some people Too many related lists or reference lookups on one form Compare load times for the same record with a simple role and an administrator role
Two versions of the same status exist No single agreed data model; fields added per team List the fields holding the status and who writes each one
Changes go live and break something elsewhere Tight coupling to another application’s tables or scripts Search the app’s dependencies for references to tables it does not own
Nobody can explain why a rule exists Inadequate documentation at build time Find the change record that introduced the rule, if one exists
Every release causes a regression No regression suite and no change control path Count how many test cases cover the last three changes

A retrospective procedure for an app that already shows these mistakes

  1. Pick the one application causing the most support work and freeze its configuration for the duration of the review, so the findings describe a fixed target.
  2. Map its tables, forms, flows and integrations on one page, marking each dependency that crosses into another team’s ownership.
  3. Take the symptom list from the users and assign each item to one of the mistake categories, noting where an item fits more than one.
  4. For each assigned item, run the check from the table above and record the result, including checks that came back clean.
  5. Rank the confirmed causes by how often they generate work, not by how hard they would be to fix.
  6. Fix the top cause first and watch whether the support volume moves before starting the next one.

Two mistakes that look like good practice

Over-engineering a first version is often defended as preparation for scale. In practice it adds configuration nobody can test and that must be maintained from day one. The better test is whether each element is used by a current process. A second apparent virtue is reuse: sharing a script or a table across several apps creates a dependency that every future change must respect. Reuse helps when the shared thing has an owner who will say no to changes that break others. Without that owner, reuse becomes a hidden coupling.

What the fix looks like in governance terms

Many recurring mistakes are not technical. They persist because nobody is responsible for the decision that caused them. A short record of who approves a new table, who signs off a change to a shared rule and who can retire an app is often enough to prevent the same mistakes recurring. The governance model sets out how those decisions can be assigned, and the platform governance charter note explains why the record matters beyond the single application.

Integration mistakes deserve their own review because they fail in ways the app team does not see. The integration patterns guide describes the shapes that tend to hold up better under change.

When to stop fixing and start rebuilding

Some applications have so many confirmed mistakes that patching them costs more than a planned rebuild. A rebuild is justified when the data model itself is wrong, when the owner has changed and nobody can describe the process, or when the app cannot be tested in its current form. A rebuild is not justified simply because the app is old or because the original builder left. Make the call on the evidence from the retrospective, and record it, so the next team knows why the app was rebuilt rather than repaired.

Where the troubleshooting path for a specific app is still unclear, the practical troubleshooting guide covers the diagnostic order.

Is a slow form always a model problem?

Not always. Slow forms are frequently caused by lookups and related lists rather than the data model. Check the form’s components before redesigning tables.

Should we remove unused fields from an old app?

Only after confirming that no report, integration or script refers to them. Unused in the form does not mean unused in the platform, and removing a field that an integration reads causes failures that look unrelated.

Who should run the retrospective?

Someone who did not build the app, with the business owner present for the decisions. Builders are useful for explaining intent, but they are poor at spotting their own assumptions.

Frequently asked questions

How do we decide whether something is appropriate for low-code development or needs a full coding approach?

Use low-code for data-driven apps with standard workflows: forms, approvals, notifications, integration to other systems. Use full coding for complex business logic, real-time processing, or custom algorithms. Low-code is faster and easier to maintain; use it when possible. Full coding is needed when low-code reaches its limits.

What is the right balance between performance and feature richness?

Start by delivering features that users need (not want). Get feedback on what works and what does not. Then optimise performance for features users actually use. Do not optimise features no one is using. Monitor performance continuously and adjust when it degrades.

Should we use app versioning or always update the single version?

For large, complex apps, versioning makes sense: keep a previous version available while users transition to the new one. For smaller apps that update frequently, a single version with quick rollback capability is sufficient. Choose based on the scope and impact of changes.

Talk to Oblytech

Planning, running or fixing a ServiceNow programme? Tell us where you are and we will suggest a sensible next step.

Contact us