Prototype — click any node in a workflow to see its configuration. Open workflow builder →
Round 2 · Product research & design prototype

Workflow Builder for Admissions

Schools automate communication across the admission journey — Enquiry → Application → Review → Decision → Enrolment → Payment. This prototype defines the forms, the status model, the node set, and nine workflows that cover the full journey. Small workflows chained by status changes, instead of one giant flow.

1 · Two dynamic forms + two fixed records

Enquiry and Application are school-configurable dynamic forms (solution design 01) — the data entry points whose fields feed triggers, conditions and personalization. Offer and Student are fixed-schema records, identical for every school, created only by workflows via the Create record node with field mappings. An Application is only created when a parent actually starts one (via a tokenized link carrying the enquiry id) — never auto-created — so an application's existence always means real intent.

Dynamic form · filled by parent · public

Enquiry Form

First touch. Creates a Contact + Enquiry record.

  • Parent name text
  • Email email · identity match
  • Phone phone · identity match
  • Child name text
  • Grade applying for system · options from fee structure
  • Academic year select
  • How did you hear about us select · attribution
Dynamic form · filled by parent · tokenized link ?enquiry_id=…

Application Form

Prefilled from the enquiry. Converts the enquiry on submit.

  • Student details prefilled from enquiry
  • Date of birth date
  • Previous school text
  • Documents upload files → documents_complete
  • Guardian details group
  • Application fee payment · fee_paid
Fixed record · created by workflow 5 (Create record)

Offer

Prefilled from the application via field mappings. The family responds through the offer link — their decision and payment write back to this record.

  • Student name · guardian details mapped from application
  • Grade mapped · drives the amount
  • Amount derived from fee structure by grade
  • Status Created → Sent → Accepted / Declined
  • Payment status Pending → Paid
Fixed record · created by workflow 7 (Create record)

Student

The enrolled child. Created when the offer is accepted and paid; its status change fires the welcome workflow.

  • Name · guardian details mapped from application
  • Grade mapped
  • Status Created → Active

2 · Status model — the glue between workflows

Status changes are what chain the nine workflows together — and they are the only thing that can trigger one. Status fields are dropdown-backed, so triggers, branch conditions and Update-field actions always reference these exact values.

Enquiry New Nurturing Converted/ Dormant
Application Submitted In Review Interview Requested Accepted/ Declined Enrolled/ Closed
Offer Created Sent Accepted/ Declined · Payment Pending Paid
Student Created Active

3 · Node palette

Five node categories, numbered below. Trigger, Branch, Loop and End are single nodes; Action is one category with six subtypes. Loops are deliberately constrained: max iterations and an exit condition are mandatory.

4 · The nine workflows

Every workflow is a straight line with at most one split — loops handle repeated reminders, status changes hand off to the next workflow. Click any node for its full configuration.

5 · Try the builder

The creation experience is a separate canvas page: a workflow starts as Trigger → End, the + icon on an edge opens the node panel, and every node's configuration is edited in place.

Open workflow builder →

6 · Design decisions & edge cases

Decisions locked for this round, and what is deliberately out of scope.

Loop semantics

Exit condition is checked at the start of every iteration and acts as a live interrupt during delays — if the parent pays on day 2 of a 5-day wait, the run exits immediately. After max iterations the flow falls through to the next node.

One trigger shape — no inactivity trigger

Every workflow starts the same way: a form's field reaches a value (submission is just field = status, value = Submitted). "Nothing happened yet" is expressed inside the flow as Delay + Branch — one mental model, no hidden timers outside the canvas.

Re-entry policy

One active run per workflow per applicant. Re-triggering while a run is active does nothing. A duplicate enquiry from a known email/phone attaches to the existing contact.

The decision is human, everything after is automated

The team makes the money decision by setting application status = Accepted. The workflow then creates the offer record itself (Create record node) — prefilled from the application via field mappings, amount derived from the fee structure — and the offer-delivery workflow takes over from offer.status = Created. The team never creates or sends offers manually.

One workflow, one journey — upstream only

A run executes against a family's linked record chain: enquiry → application → offer → student. Every field reference (conditions, updates, recipients, mappings) is scoped to the trigger's form and its upstream forms — they're guaranteed to exist. Downstream references are illegal; records downstream are reached by creating them (Create record) and letting their triggers fire.

Message content — later enhancements

For now an email or SMS/WhatsApp message is a plain title + description, sent only inside its configured send window (queued otherwise). Later: dynamic fields via tokens like {{application.name}} resolved per family at send time, and a rich text editor for email bodies (formatting, links, images).

Validation rules

  • Workflow must start with exactly one Trigger
  • Exactly one End node, always last — branch paths and loops merge back into it
  • Loop requires max iterations + exit condition
  • Email/SMS nodes require recipient and content

Out of scope (roadmap)

  • Workflow execution, analytics, deliverability
  • Nested branches, A/B testing, goal nodes
  • In-house slot booking — we lean on Calendly (webhook sets application.interview_booked)
  • CRM/contact management itself