Skip to content
Expedify
Your First AI Agent

Module · Foundations

Anatomy of a node: one job, one form

Lesson 3 of 8 · 7 min

Expedify ships over a hundred node types, and you are never going to learn them one at a time. You don't have to. Every node — the trigger, the AI agent, the CRM write, the send — is the same shape: a name, a form, and an output. Learn to read that shape once and a node you have never seen before stops being a mystery and becomes a form you haven't filled in yet.

Open one and look

This is the send node from lesson 1's workflow — the one that mails the welcome. Click it.

The same workflow, one node in focus

Four nodes, and every one of them opens into the panel you are about to read. This lesson is about the second one.

Scroll for all 4 steps →

The four parts, every time

  • The label — what the node is. “Campaign Send”, printed on the tile.
  • The alias — printed under the label, in smaller type: welcome. This is the node's name, and it is how every later node refers to it. Lesson 4 is entirely about this.
  • The config fields — the form. One row per decision the node needs you to make.
  • The output — what it hands to whatever comes next. Never shown in the form, because it isn't something you set.

A node does one job. If you ever find yourself wanting a node to do two things, that is the product telling you it is two nodes. That constraint is why workflows stay readable at twenty nodes instead of becoming a script nobody wants to open.

Reading the form

Here is what that panel is actually offering you. These are the real fields on a campaign_send node, straight from the product:

Five of campaign_send's fields — the ones lesson 1's workflow sets.

channel

What it holds
Communication channel One of: email · sms · whatsapp Defaults to email.

template_source

What it holds
Source of template (manual or input) One of: manual · input Defaults to manual.

template_id

What it holds
Selected template ID (when source is manual)

contact_source

What it holds
Source of contact data One of: input · config Defaults to input.

contact_input_variable

What it holds
Input variable containing contact data

Two patterns in that table are worth naming, because they repeat on almost every node.

  • A field with a fixed set of answers. channel is one of email · sms · whatsapp — you pick, you don't type. When a field has an enum, a value outside it is rejected outright rather than failing later at run time.
  • A pair of fields where one selects the mode and the other supplies the value. template_source says where the template comes from; template_id is the template itself. Same again for contact_source and contact_input_variable. Set the second without the first and the node reads the wrong one.

What “required” really means

The builder marks a field red when the node cannot run without it. That is a smaller set than you would guess — most fields have a default, and the default is usually right. What the red fields have in common is that they are the ones only you can answer: which template, which integration, which record. The product cannot guess those, so it refuses to pretend.

A saved workflow is not a running workflow. A node with an empty required field will save quite happily and then fail on its first real execution. If you take one habit from this lesson, take this one: after you configure a node, run the workflow once before you trust it. Lesson 10 is about reading what comes back.

The warnings the product ships with it

Some nodes carry advice that no amount of staring at the form will give you — behaviour learned in production. The CRM write from lesson 1's workflow is the best example in the whole course:

The CRM write, in full

The fourth node — and the one whose form is most likely to mislead you.

Scroll for all 4 steps →

Straight from the product: WRITES go in `json_data` (a JSON STRING), not a `data` object — the object is dropped on write.

A deal's stage has no native field — set it only via json_data: '{"stage_name": "..."}'.

custom_fields update MERGES: "" blanks a value, JSON null leaves it unchanged, omitted = unchanged.

SEARCH cannot filter by a custom field (it's ignored) — use a database_query SELECT instead.

Read results as {{alias.results}} / {{alias.results[0].id}}; a single entity as {{alias.entity.id}}.

Look at the first one against the node above. There is a data field on this node, it looks like the obvious place to put what you're writing, and it is silently dropped. The workflow uses json_data — a JSON string, quotes and all — instead. You would not learn that from the form. You learn it from the warnings, or from an afternoon wondering why nothing saved.

Where the output goes

Every node hands something onward. A campaign_send hands back send_result and message_id; the CRM write hands back the record it touched. You never configure these — they are what the node produces, and they are the raw material for every node after it.

Which is the whole of the next lesson: the output has a name, the name is the alias, and {{welcome.message_id}} is how you reach it.

Key takeaways

  1. Every node is the same shape: a label, an alias, a form, and an output.
  2. A node does exactly one job — wanting it to do two means you need two nodes.
  3. Enum fields are picked, not typed, and a wrong value is rejected up front.
  4. Required means “only you can answer this” — and a workflow with an empty one saves fine, then fails on first run.
  5. Read a node's warnings before you trust its form. crm_manager's `data` field is real, obvious, and silently dropped.
  6. Output is not configuration. It is what the node hands to whatever comes next.

Try it yourself

Open the workflow above and click each of the four nodes in turn. For every one, answer three questions out loud: what is its one job, which of its fields could only have been filled in by a human, and what does it hand to the node after it? By the fourth node you will notice you have stopped reading the labels.

Next: Passing data between nodes — the one idea that turns four separate forms into a workflow. It is the most important lesson in this path.