Skip to content

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 template
mutation 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 template
mutation 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 template
mutation 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 }
}