Documentation Index
Fetch the complete documentation index at: https://docs.neoagent.io/llms.txt
Use this file to discover all available pages before exploring further.
A single index of the settings most often asked about in support. Each entry lists the field name, where it lives in the workflow/agent JSON, the default, and a one-line description.
If a question starts with “how do I…” or “what does X do?”, the answer probably starts here.
Triggering
| Field | Where | Default | What it does |
|---|
trigger_type | workflow | required | SCHEDULED (runs on a clock), TRIGGERED (runs when a PSA event matches), or NONE (chat agent — user-initiated). |
entity_type | workflow | ticket | What this workflow processes: ticket, project_ticket, task, scheduled_entry, time_entry. |
callback_settings.target_changes | workflow (TRIGGERED only) | required | List of PSA events that fire this workflow — combination of change_type (e.g. TICKET_CREATED, FIELD_UPDATED) + optional target_field + target_value/source_value. |
callback_settings.run_only_once_per_entity | workflow (TRIGGERED only) | false | If true, the workflow runs on each ticket at most once, ever. Used when you want a workflow to fire on creation but never again. |
process_sub_entities_only_once | workflow | false | For sub-entities (time entries, notes, scheduled entries on a ticket): if true, Neo processes each sub-entity at most once. Without it, the same time entry can be re-processed every time its parent ticket changes. |
process_entities_sequentially | workflow | false | If true, the workflow processes matched tickets one-by-one instead of in parallel. Slower but predictable when later steps depend on earlier ones. Incompatible with REQUEST_TECHNICIAN_APPROVAL. |
execution_order | workflow | required | Integer position in the per-client ordering. Lower runs first when multiple workflows match the same event. |
ignore_execution_order | workflow | true | If true, this workflow ignores ordering and runs in parallel with other matching workflows. Set false only when ordering is load-bearing. |
Scheduling (SCHEDULED workflows)
schedule object on the workflow.
| Field | Default | What it does |
|---|
schedule.time_period | null | Recurrence interval, e.g. { "interval": 1, "unit": "HOUR" } for hourly, { "interval": 1, "unit": "DAY" } for daily. |
schedule.start_datetimes | [] | Specific clock times when the workflow runs (e.g. 08:00 and 15:00 for twice-daily). |
schedule.daily_execution_windows | null | Per-weekday allowed run windows. Use this when a workflow should only run during business hours (e.g. Mon-Fri 08:30-17:30). Preferred over the deprecated allowed_execution_hours + should_skip_weekends. |
schedule.timezone | UTC | IANA timezone for the schedule (e.g. America/New_York, Europe/London). All other schedule times are interpreted in this timezone. |
schedule.allowed_execution_hours | null | Deprecated — replaced by daily_execution_windows. Single start/end window applied every day. |
schedule.should_skip_weekends | false | Deprecated — set daily_execution_windows with weekday entries only instead. |
Common gotcha — business-hours triggering: schedule.daily_execution_windows only constrains when the workflow itself runs. For TRIGGERED workflows (event-driven, not scheduled), the trigger fires whenever the PSA event matches — there is no “only trigger during business hours” knob today. If you need that, gate it with a filter on the ticket’s received_at or a deterministic business-hours filter.
Filters
Filters live inside the first action (FIND_ENTITIES.input.filter_conditions).
| Field | Where | What it does |
|---|
field_name | a single filter condition | PSA field to match on — board, status, priority, type, sub-type, item, queue, company, owner, or any custom field (use the PSA’s exact custom-field name). |
operator | a single filter condition | EQUALS, NOT_EQUALS, IN, NOT_IN, IS_NULL, IS_NOT_NULL, CONTAINS, etc. |
value / values | a single filter condition | Single value or list, depending on operator. |
logical_operator | between conditions | AND (default) or OR for combining multiple conditions. Custom-field filters and standard fields can be mixed freely. |
AI filter (ai_filter_prompt) | filter conditions | Natural-language predicate — Neo evaluates the ticket against your description (e.g. “ticket is about a printer issue”). Slower and consumes credits per evaluation; use deterministic filters first and AI filters only for fuzzy matches. |
Common gotcha — NULL handling in ConnectWise filters: ConnectWise’s API uses SQL three-valued logic. A filter like Owner != "Alice" AND Owner != "Bob" silently drops tickets where Owner IS NULL, because NULL != "Alice" evaluates to NULL (not TRUE). To include unassigned tickets, use Owner IS NULL OR (Owner NOT IN ["Alice", "Bob"]) instead.
Test mode & re-running
| Field | Where | Default | What it does |
|---|
agent_settings.test_mode | agentic / conversational workflows | false | If true, the agent will not call tools with side effects (no PSA writes, no emails, no SMS). It adds an internal ticket note instead, describing what it would have done. |
agent_settings.report_test_via | agentic / conversational workflows | Internal Ticket Note | Where the agent posts its dry-run report when test_mode=true: Internal Ticket Note, Email to Internal Team, Teams Message to Internal Team, or Dashboard Message. |
agent_settings.sandbox_enabled | agentic / conversational workflows | true | If true, the agent can write+run Python in a sandbox for bulk operations. Counts toward credits (SANDBOX_BASH is ADVANCED tier). |
emulate_main_ticket_as_newly_created | re-run dialog | false | When re-running, pretend the ticket was just created (so triage logic that gates on “newly created” runs again). |
ignore_previous_neo_executions | re-run dialog | false | Same as “Start fresh” in the UI — the agent doesn’t see prior Neo executions on this ticket. Without it (“Continue previous”), the agent picks up where it left off. |
Technician-in-the-Loop (TIL)
| Field | Where | Default | What it does |
|---|
agent_settings.til_channel | agentic / conversational workflows | Teams | Where TIL approval requests go: Teams (adaptive card sent to configured technicians) or Chat (approval card inline in the chat session — default for CONVERSATIONAL agents). |
Custom instructions
| Field | Where | What it does |
|---|
agent_settings.custom_instructions | agentic / conversational workflows | Free-text instructions that the agent loads as a system prompt. Use to encode MSP-specific naming, escalation paths, tone, prohibitions. |
| Action-level instructions | CHAINED_ACTIONS Action.instructions | Per-step instructions for an individual action (e.g. dispatch agent specifics). Layered on top of custom_instructions. |
| Skill files | src/agents_v2/skills/prompts/ | Built-in skills the agent loads on demand (resolve-issue, end-user-communication, etc.). |
| Skill loader settings | agent_settings | Which built-in skills are enabled. |
Notify-action delays
Notify actions support a configurable random delay so messages don’t all leave at the same second.
| Field | Default | What it does |
|---|
include_random_delay | false | If true, the notify action waits a random number of minutes before sending. |
min_range_delay_in_minutes | null | Lower bound (in minutes) of the random delay. |
max_range_delay_in_minutes | null | Upper bound (in minutes) of the random delay. |
If include_random_delay=true but min and max are both 0/null, the delay is skipped (not an error).
Sub-entity callbacks
| Field | Where | Default | What it does |
|---|
sleep_before_callback_processing_seconds | client (not per-workflow) | 4 | Seconds Neo waits after receiving a PSA callback before kicking off the matched workflows. Gives the PSA time to settle (audit rows visible, related records consistent). Tune per-client only if your PSA needs longer. |
process_sub_entities_only_once | workflow | false | See Triggering above. |
Inbox notifications
| Field | Where | What it does |
|---|
InboxException(send_email=…) | source code | When True, dispatches an email + inbox card to the MSP admin (used for required action like missing settings, auth failures). When False, only an inbox card. Default is False — emails are reserved for MSP admin must act. |
| Dedup key | derived | client_id + message_id. If the same InboxMessageId can occur for distinct subjects (per end-client, per mailbox), use compose_inbox_message_id(...) to scope per-subject and avoid collapsing distinct failures into one message. |
Credits
| Concept | Detail |
|---|
CHAINED_ACTIONS workflows | Each action sets its own credits_consumed (typically 1 per ticket). Sum = total per run. |
AGENTIC entity-triggered | Billed at the max credit tier across the resolved toolbox (raw + auto-injected). Tiers: BASIC=1, STANDARD=2, ADVANCED=3. |
AGENTIC conversational (no entities) | Billed as the sum of tier × call_count across each tool actually invoked. |
| Auto-injected tools | MS_GRAPH_REQUEST (when MS Graph perms non-disabled), CW_PSA_REQUEST (when CW PSA enabled), SANDBOX_BASH (when sandbox_enabled=true), and integration *_REQUEST tools all count toward credits — even though they don’t appear in the dashboard toolbox. |
| Generic API tool tier | STANDARD when all enabled perms are READ_ONLY; ADVANCED when any perm is READ_WRITE. PowerShell tools stay ADVANCED regardless. |
Versioning & sharing
| Field | Where | What it does |
|---|
created_by_user | workflow | Who owns the workflow. Required to view/edit unless the workflow is shared (or unless you are a super-admin). |
version_timestamp | workflow | Optimistic-lock version. PUT requests must include the version they’re editing against; mismatches return 409 Conflict. |
state | workflow | ENABLED, DISABLED, or DELETED. Disabled workflows don’t run; deleted are tombstoned. |
group_name, group_order | workflow | Purely organizational folder + position within the folder. Doesn’t affect execution. |
See also