A system is EmpowerNow's name for a connected external API or service β€” Salesforce, Entra ID, ServiceNow, your own internal microservice, anything that speaks HTTP. Once registered, every command you define on that system becomes a building block your workflows and AI agents can call. By the end of this guide you'll have one fully wired system with a working command.

⚑
Shortcut Β· NEW
Skip the manual steps β€” describe your system to AI
The new AI Assist tab generates a complete system YAML from a one-line description. You'll still review and click Save, but the schema, command shapes, and auth blocks are written for you. Combine it with this guide for the bits AI can't see (test connection, real credentials).
Open AI Assist guide β†’

1 Open the Systems list

Step 1 Β· Navigate

Go to /systems

From the EmpowerNow side navigation choose System Editor, or open the URL directly. You land on the Systems hub with stats cards on top, a toolbar of view toggles, search, and type filter, and the list of every system already registered for your tenant.

Browser https://your-tenant.empowernow.ai/systems
All Types β–Ύ Grid ⊞ Table β–€ Tree 🌲 Mind-map 🌐
salesforce-prodoauth-rest Β· 12 commands
entra-idoauth-rest Β· 24 commands
servicenowbasic-rest Β· 8 commands
πŸ”
Permission needed

To see the Create button you need system-editor:system with the create action. Without it, the button is hidden by the Protected component.

2 Click Create New System

Step 2 Β· Create

Hit the teal button on the top-right

The ✨ Create New System button is in the top-right corner. Clicking it navigates you to /system-editor/new β€” a multi-tab editor that's already in create mode. The first tab, System Details, is open and waiting for metadata.

Editor β€” System Details (create mode)
System Details
Connection
OAuth
Automation
Designer
YAML Editor
MCP Tools
Fulfillment
API Docs
πŸ’‘
You're not committed yet

Nothing has been written to the server. The system isn't real until you fill in the required fields and hit Save in the top-right of the editor. Closing the tab here loses everything.

3 Set name, type, description

Step 3 Β· Metadata

Fill in the System Details tab

FieldWhat to enterNotes
System Name *Lowercase slug, no spacese.g. helpdesk-api. Becomes the system's permanent id β€” workflows reference it by this name.
DescriptionOne-line summaryVisible on cards and to anyone browsing the gallery.
VersionDefaults to 1.0.0Bump it when you change the contract.
TagsComma separated, optionale.g. itsm, ticketing, internal. Used to filter the list.
System Type *Choose from dropdownCommon picks: oauth-rest (OAuth 2.0 + REST), basic-rest (basic auth + REST), graphql, or a custom type your admins added.
⚠️
The system name is permanent

Once saved, you can't rename a system without breaking every workflow that calls it. Choose carefully on day one. The Description and Tags fields are safe to change later.

4 Optional shortcut β€” import an OpenAPI spec

Step 4 Β· OpenAPI

If your API ships an OpenAPI 3.x file, use it

Importing OpenAPI auto-generates everything β€” object types, every command (GET / POST / PUT / DELETE), parameters, request/response schemas. You go from blank to fully-loaded in 30 seconds.

  1. Click the Import OpenAPI button at the top of the editor.
  2. Provide a URL (https://api.example.com/openapi.json), upload a file, or paste raw YAML/JSON.
  3. The wizard previews everything it found. Untick anything you don't want.
  4. Click Apply. The Designer tab fills with object types and commands.
ℹ️
No spec? Skip this step

It's perfectly fine to define commands manually. Most internal systems work that way. Continue to step 5; we'll add a command by hand later in step 7.

5 Configure Connection & auth

Step 5 Β· Connection

Switch to the Connection tab

Click the Connection tab. Two fields are essential β€” everything else has sensible defaults:

FieldExample valueNotes
Base URL *https://api.example.com/v1The root every command's path is relative to.
Auth Type *OAuth 2.0 Β· API Key Β· Basic Β· Bearer Β· NoneMost modern APIs are OAuth 2.0. Pick the right one β€” the form below adapts.
TLS verificationOn (default)Only turn off for dev environments with self-signed certs.
Timeout (ms)30000Increase for slow APIs.
Rate limit / retriesOptionalSet conservative defaults so a misbehaving workflow can't hammer the upstream.
πŸ”’
Never paste raw secrets here

Use environment variable references like ${API_TOKEN} or Vault references like vault://secret/path#field. The Connection form resolves them at runtime; the literal value never leaves the secret store.

Step 5b Β· OAuth (only if Auth Type = OAuth 2.0)

Pick a preset, set scopes

If your auth type is OAuth 2.0, a separate OAuth tab appears. Use a preset (Microsoft Entra, Salesforce, Okta, generic) to auto-fill authorize/token URLs, then fill in:

  • Client ID / Client Secret (use env-var references).
  • Scopes β€” what permissions to ask for at consent.
  • PKCE on for public/native clients.
  • Token endpoint authentication method β€” usually client_secret_post or client_secret_basic.

6 Test the connection

Step 6 Β· Verify

Click Test Connection β€” don't skip this

Still on the Connection tab, click the Test Connection button at the bottom. EmpowerNow performs a lightweight call against the base URL using the configured auth and reports back.

βœ…
Connected
200 OK Β· 142 ms Β· TLS verified Β· Bearer token issued (sub: app-svc-acct)

If it fails, the panel shows the exact HTTP status, response body, and any TLS/redirect/auth issues. Common gotchas:

  • 401 Unauthorized β€” Client ID/secret wrong, or scopes don't include what the API requires.
  • 403 Forbidden β€” Auth worked but the service account lacks permission. Fix on the upstream side.
  • SSL handshake failed β€” Self-signed cert or expired chain. Either fix the cert or (dev only) disable TLS verification.
  • Connection timeout β€” Network/firewall. EmpowerNow's egress IPs may need to be allow-listed.
🩺
Re-test after every credential change

Test Connection costs nothing and catches 90% of "the workflow doesn't work" issues before you ship a single command.

7 Add your first command

Step 7a Β· Designer

Switch to the Designer tab

The Designer tab is where commands live, organised under object types. An object type is whatever the system is operating on β€” User, Ticket, Contact, Order. Commands belong to exactly one object type.

  1. If your Designer is empty, click + Add Object Type. Name it (e.g. Ticket). It appears as a card.
  2. Inside that card, click + Command. The Enhanced Command Modal opens.
Step 7b Β· Command Modal

Fill in the command

The modal is YAML-driven, but you don't need to know YAML to use it β€” there's an Insert Example button that drops a starter template you tweak. The minimum to get a working command:

Click Save command. The modal closes; the command appears in the object-type table on the Designer tab.

πŸ€–
The MCP block makes it AI-callable

mcp.enable: true exposes the command as an MCP tool β€” AI agents can discover and call it. The ai_use_when hint tells the agent when to reach for this tool. Optional but recommended.

8 Save & test the command

Step 8a Β· Save the system

Press Ctrl+S (or click Save System)

Up to this point everything has been local edits. Hit Save System in the top-right of the editor (or Ctrl+S). The platform validates the whole definition, persists it, and the system now appears in the gallery and is callable from workflows.

⚠️
Save conflict (412)

If another admin edited the same system while you were working, save returns 412 with a Reload / Overwrite dialog. Reload is almost always the right answer β€” it pulls their latest, you re-apply your delta.

Step 8b Β· Test System modal

Run the command end-to-end

Click Test in the editor toolbar (or use the per-command Quick Test action in the Designer table). The Test System modal opens:

  1. Pick the command (get_ticket_by_id).
  2. Fill in the path/query parameters β€” for our example, id = a real ticket id.
  3. Click Run.
  4. Read the Response tab β€” status, headers, body. If it failed, the Error tab shows what came back.
πŸŽ‰
200 OK Β· 187 ms
{ "id": "TKT-1042", "subject": "Printer offline", "status": "open", "assignee": "alice@corp" }
βœ…
You did it

The system is registered, the connection works, and your first command returns real data. From here every workflow in your tenant can drop this command into a Get-ticket node, and any AI agent with MCP access can call it.

β†’ What's next

Now that you have one connected system, deepen each layer with the rest of the System Editor guides:

  • Systems List β€” search, filter, paginate, switch between grid/table/tree/mind-map views.
  • System Details & YAML Editor β€” drop into the raw YAML editor, command palette (Ctrl+K), keyboard tab-switching.
  • Connection & Authentication β€” full reference for OAuth, delegation, automation (webhook + poller).
  • Commands & Designer β€” multiple object types, parameter badges, body templates, the Schema Mapper, Fulfillment overrides.
  • Testing & API Docs β€” Quick Test, response shape, browsable API docs tab.