Task Templates Editor
The V28 task-template editor is where you define a template — every field on a future task starts here.
Opening the editor
- Operations → Task Templates → click an existing template OR New template.
- From the Manual Trigger page → Edit template link.
Editor sections
1. Basics
- Name — the human-readable label that becomes the task name.
- Language — per-locale name overrides (Slovak/English/etc). When a task is generated for a reservation, the language resolver (see Communications → Languages) picks which translation to surface.
- Description — optional operator-facing notes about what the template does and why.
2. Trigger
- Event —
reservation.created,reservation.checkin,reservation.checkout,after_checkout,cleaning.required, etc. Full list is autodiscovered fromplatformCapabilities.ts. - Trigger offset — e.g. "24h before checkInTime", "2h after checkOutTime", "at 19:00 on checkOutDay-1".
- Conditions to fire — optional. Only seed the task if these are met when the event fires (e.g. "only if guestMood is friendly").
3. Assignee
- Role — host / cleaner / admin / specific teammate.
- Routing rule — pick the teammate assigned to this property's role, or a fixed teammate.
4. Action
The most important section. Pick from the dropdown:
whatsapp.sendTemplate— send an approved WhatsApp templatewhatsapp.sendFreeText— send a free-text message (24h window applies)nuki.generateCode— provision a PINnuki.revokeCode— revoke a PINreport.sendReply— AI-suggest then send a reply in the message threadguidebook.generate— produce the per-stay guidebook PDFcleaner.assign— assign a cleaner to the cleaning task- …and ~30 more, autodiscovered from tRPC mutation registry
Each action exposes operator-meaningful parameters as form fields. After #149 the editor no longer shows internal telemetry fields (aiOriginalBody, aiGuestMessageBody were leaking through report.sendReply until then).
5. Action parameters
Parameter values can be placeholder-resolvable strings — see Placeholders.
Example: a whatsapp.sendTemplate action with the checkin_instructions template might have parameters:
{
"templateName": "checkin_instructions",
"params": {
"guest_name": "{{guest.name}}",
"property_name": "{{property.name}}",
"access_code": "{{guest.nukiAccessCode}}",
"checkin_time": "{{reservation.earlyCheckinTime|property.checkInTime}}"
}
}
The | is the fallback syntax — see Placeholders.
6. Auto-resolve
Optional. If set:
- Schedule time — HH:MM, evaluated in tenant timezone.
- Conditions — list of boolean checks (
reservation.nukiAccessCode is_not_null,messageThread.hasUnansweredGuestMessage equals false, …). - Notify on not met — at fire time, if conditions fail, ping the operator.
See Tasks → Auto-resolve for the runtime semantics.
7. Allow dismiss
If checked, the operator can dismiss the task without firing the action. Useful for "FYI" tasks where the action is informational and human judgement might override.
⚠ Before #153, trying to save a template with only allowDismiss and no action would fail validation with an unhelpful error. Now the editor allows it but surfaces a clear note that no action will be available.
Validation
The editor validates on Save:
- Placeholder syntax —
{{guest.name}}etc must be a valid path. After #254,{{guest.email}}and{{guest.name}}are correctly recognised (they were false-flagged before). - Action schema — required params must be present; types must match.
- Language coverage — if a template has a name in English but not Slovak and your tenant has Slovak teammates, the editor warns.
- Condition references — every property referenced in a condition must exist in
platformCapabilities.ts.
Validation errors appear inline above the offending field. Fix and save again.
Dry-run
Once saved, click Dry-run against reservation to see what would happen for a specific stay. Pick the reservation, hit run, and the editor shows:
- The fully-resolved task row that would be created
- The placeholder-expanded action params
- The conditions that would be attached
- Any runtime errors that would fire (e.g. "guest.nukiAccessCode resolves to null for this reservation — task would be BLOCKED")
Related issues
- #185 —
Add FAQ entryplaceholder schema regression. - #153 — save-with-allowDismiss-only validation surfacing.
- #254 —
{{guest.email}}/{{guest.name}}validator false-positive. - #149 — operator-meaningful params surface; internal telemetry hidden.
- #82 — schema-strictness audit for mutation inputs (developer-side).