Route Templates
Route templates allow you to save workflow patterns for reuse. Instead of recreating the same route structure every time, define it once as a template and spawn new routes from it.
What is a Route Template?
A route template is a saved workflow pattern - it defines the structure of stops and their relationships without being an active workflow. Think of it as a blueprint for routes.
type RouteTemplate { id: ID tenantId: ID name: String description: String stops: [Stop] track: AWSJSON}Creating Templates
From Scratch
Create a template by defining its structure with instructions:
mutation CreateTemplate { addRouteTemplate(input: { name: "Standard Approval Process" instructions: [ { trackType: stop action: startWith actionStationOrRouteTemplateId: "submit-station-id" }, { trackType: stop action: addAfter actionStationOrRouteTemplateId: "review-station-id" actionTargetStopId: "submit-stop-id" }, { trackType: stop action: addAfter actionStationOrRouteTemplateId: "approve-station-id" actionTargetStopId: "review-stop-id" } ] }) { id name stops { id name } }}Querying Templates
List All Templates
query ListTemplates { listRouteTemplates { id name description stops { id name type } }}Get Template Details
query GetTemplate { getRouteTemplate(id: "template-123") { id name description track stops { id name stationId station { name description } } }}Updating Templates
Update Template Name
mutation UpdateTemplateName { updateRouteTemplateName( id: "template-123" name: "Enhanced Approval Process" ) { id name }}Update Template Structure
Modify the template’s stops and structure:
mutation UpdateTemplate { updateRouteTemplate( id: "template-123" input: { name: "Updated Approval Process" instructions: [ { trackType: stop action: addAfter actionStationOrRouteTemplateId: "new-station-id" actionTargetStopId: "existing-stop-id" } ] } ) { id stops { id name } }}Using Templates in Routes
Embed Template in a Route
You can include a template as part of a route, expanding it into stops:
mutation CreateRouteFromTemplate { addRoute(input: { name: "Q4 Budget Approval" instructions: [ { trackType: routeTemplate action: startWith actionStationOrRouteTemplateId: "approval-template-id" } ] }) { id name stops { id name status } }}Combine Templates with Additional Stops
mutation CreateCombinedRoute { addRoute(input: { name: "Custom Workflow" instructions: [ { trackType: stop action: startWith actionStationOrRouteTemplateId: "intake-station-id" }, { trackType: routeTemplate action: addAfter actionStationOrRouteTemplateId: "standard-review-template-id" actionTargetStopId: "intake-stop-id" }, { trackType: stop action: addAfter actionStationOrRouteTemplateId: "final-station-id" actionTargetStopId: "last-template-stop-id" } ] }) { id stops { id name } }}Deleting Templates
mutation DeleteTemplate { deleteRouteTemplate(id: "template-123") { id }}Real-time Subscriptions
Template Added
subscription OnTemplateAdded { routeTemplateAdded(tenantId: "your-tenant-id") { id name }}Template Updated
subscription OnTemplateUpdated { routeTemplateUpdated(tenantId: "your-tenant-id") { id name stops { id name } }}Template Deleted
subscription OnTemplateDeleted { routeTemplateDeleted(tenantId: "your-tenant-id") { id }}Best Practices
Template Naming
Use descriptive names that indicate the purpose:
✓ "Customer Onboarding - Enterprise"✓ "Document Review - Legal"✓ "Bug Fix Workflow"
✗ "Template 1"✗ "Process"✗ "New Template"Template Organization
Organize templates by:
- Department: “HR - New Hire”, “Finance - Invoice Approval”
- Process Type: “Review Process”, “Approval Process”
- Complexity: “Simple Review”, “Multi-Stage Approval”
Version Control
Since templates can be updated, consider including version info:
- “Contract Review v2”
- “Onboarding Process (2024)“
Example: Building a Template Library
# Simple approval templatemutation CreateSimpleApproval { addRouteTemplate(input: { name: "Simple Approval" instructions: [ { trackType: stop, action: startWith, actionStationOrRouteTemplateId: "submit-id" }, { trackType: stop, action: addAfter, actionStationOrRouteTemplateId: "approve-id", actionTargetStopId: "submit-stop" } ] }) { id }}
# Multi-level approval templatemutation CreateMultiLevelApproval { addRouteTemplate(input: { name: "Multi-Level Approval" instructions: [ { trackType: stop, action: startWith, actionStationOrRouteTemplateId: "submit-id" }, { trackType: stop, action: addAfter, actionStationOrRouteTemplateId: "manager-review-id", actionTargetStopId: "submit-stop" }, { trackType: stop, action: addAfter, actionStationOrRouteTemplateId: "director-review-id", actionTargetStopId: "manager-stop" }, { trackType: stop, action: addAfter, actionStationOrRouteTemplateId: "final-approve-id", actionTargetStopId: "director-stop" } ] }) { id }}
# Parallel review templatemutation CreateParallelReview { addRouteTemplate(input: { name: "Parallel Review" instructions: [ { trackType: stop, action: startWith, actionStationOrRouteTemplateId: "start-id", enableAsynchronousChildren: true }, { trackType: stop, action: addAsFirstChild, actionStationOrRouteTemplateId: "legal-review-id", actionTargetStopId: "start-stop" }, { trackType: stop, action: addAsLastChild, actionStationOrRouteTemplateId: "finance-review-id", actionTargetStopId: "start-stop" } ] }) { id }}