Ready-to-use workflow examples for typical practice management scenarios. Copy these patterns and customize them for your specific needs.
🚀 Quick Start Examples¶
Patient Welcome Automation¶
Scenario: Automatically welcome new patients with confirmation email, practice information, and onboarding sequence.
Workflow Overview¶
Trigger: New Patient Registration
↓
Send Welcome Email
↓
Create CRM Contact
↓
Schedule Follow-up Call
↓
Add to Newsletter List
Step-by-Step Configuration¶
1. Semble Trigger Node¶
Node: "Semble Trigger"
Resource: "Patient"
Event: "New Only"
Poll Interval: "Every 30 minutes"
Date Period: "Last 4 hours"
Limit: 10
2. Email Node (Welcome)¶
Node: "Send Email"
To: "{{$node['Semble Trigger'].json['email']}}"
Subject: "Welcome to {{ practice_name }} - Important Information"
Type: "HTML"
Template:
Dear {{$node['Semble Trigger'].json['firstName']}},
Welcome to our practice! We're delighted to have you as a new patient.
Next Steps:
1. Complete your medical history form (attached)
2. Bring photo ID to your first appointment
3. Arrive 15 minutes early for registration
Practice Information:
- Address: 123 Health Street, Medical City
- Phone: +44 20 7946 0958
- Emergency: Call 999 or visit A&E
We look forward to caring for your health.
Best regards,
The {{ practice_name }} Team
3. CRM Integration (HubSpot)¶
Node: "HubSpot"
Operation: "Create Contact"
Email: "{{$node['Semble Trigger'].json['email']}}"
Properties:
firstname: "{{$node['Semble Trigger'].json['firstName']}}"
lastname: "{{$node['Semble Trigger'].json['lastName']}}"
phone: "{{$node['Semble Trigger'].json['phone']}}"
lifecyclestage: "customer"
hs_lead_status: "NEW"
source: "semble_registration"
registration_date: "{{$node['Semble Trigger'].json['dateCreated']}}"
4. Task Creation (Asana/Trello)¶
Node: "Asana"
Operation: "Create Task"
Name: "Welcome call - {{$node['Semble Trigger'].json['firstName']}} {{$node['Semble Trigger'].json['lastName']}}"
Assignee: "practice.manager@clinic.com"
Due Date: "{{DateTime.now().plus({days: 2}).toISO()}}"
Notes: |
New patient registered on {{$node['Semble Trigger'].json['dateCreated']}}
Patient Details:
- Name: {{$node['Semble Trigger'].json['firstName']}} {{$node['Semble Trigger'].json['lastName']}}
- Email: {{$node['Semble Trigger'].json['email']}}
- Phone: {{$node['Semble Trigger'].json['phone']}}
Welcome call checklist:
- Confirm contact details
- Explain practice procedures
- Answer any questions
- Schedule first appointment if needed
5. Newsletter Subscription¶
Node: "Mailchimp"
Operation: "Add Member to List"
List: "new_patients_onboarding"
Email: "{{$node['Semble Trigger'].json['email']}}"
Status: "subscribed"
Merge Fields:
FNAME: "{{$node['Semble Trigger'].json['firstName']}}"
LNAME: "{{$node['Semble Trigger'].json['lastName']}}
PHONE: "{{$node['Semble Trigger'].json['phone']}}"
REG_DATE: "{{$node['Semble Trigger'].json['dateCreated']}}"
Tags: ["new_patient", "welcome_sequence"]
Appointment Reminder System¶
Scenario: Automated appointment reminders with escalating notifications and confirmation tracking.
Workflow Overview¶
Trigger: New Appointment Booking
↓
Schedule 24h Reminder Email
↓
Schedule 2h Reminder SMS
↓
Track Confirmation Status
↓
Final Reminder if Unconfirmed
Implementation¶
1. Booking Trigger¶
Node: "Semble Trigger"
Resource: "Booking"
Event: "New Only"
Poll Interval: "Every 15 minutes"
Date Period: "Next 7 days"
Filters:
status: ["Pending", "Confirmed"]
exclude_cancelled: true
2. 24-Hour Email Reminder¶
Node: "Schedule Trigger"
Trigger Time: "{{DateTime.fromISO($node['Semble Trigger'].json['appointmentDate']).minus({days: 1}).set({hour: 18, minute: 0}).toISO()}}"
↓
Node: "Send Email"
To: "{{$node['Semble Trigger'].json['patient']['email']}}"
Subject: "Appointment Reminder - Tomorrow at {{$node['Semble Trigger'].json['appointmentTime']}}"
Template: |
Dear {{$node['Semble Trigger'].json['patient']['firstName']}},
This is a reminder of your appointment:
📅 Date: {{DateTime.fromISO($node['Semble Trigger'].json['appointmentDate']).toFormat('EEEE, MMMM d, yyyy')}}
🕐 Time: {{$node['Semble Trigger'].json['appointmentTime']}}
👨⚕️ With: {{$node['Semble Trigger'].json['staff']['firstName']}} {{$node['Semble Trigger'].json['staff']['lastName']}}
📍 Location: Main Practice, Room 1A
Preparation:
- Arrive 10 minutes early
- Bring photo ID
- List current medications
Need to reschedule? Click here: {{reschedule_link}}
Confirm your attendance: {{confirm_link}}
3. 2-Hour SMS Reminder¶
Node: "Schedule Trigger"
Trigger Time: "{{DateTime.fromISO($node['Semble Trigger'].json['appointmentDate']).minus({hours: 2}).toISO()}}"
↓
Node: "Twilio SMS"
To: "{{$node['Semble Trigger'].json['patient']['phone']}}"
Message: |
Appointment reminder: Today at {{$node['Semble Trigger'].json['appointmentTime']}} with {{$node['Semble Trigger'].json['staff']['firstName']}} {{$node['Semble Trigger'].json['staff']['lastName']}}.
Practice address: 123 Health St. Arrive 10 mins early.
Reschedule: {{short_reschedule_link}}
4. Confirmation Check¶
Node: "Schedule Trigger"
Trigger Time: "{{DateTime.fromISO($node['Semble Trigger'].json['appointmentDate']).minus({hours: 4}).toISO()}}"
↓
Node: "Semble"
Resource: "Booking"
Action: "Get"
Booking ID: "{{$node['Semble Trigger'].json['id']}}"
↓
Node: "IF (Conditional)"
Condition: "{{$node['Semble'].json['confirmationStatus'] !== 'confirmed'}}"
↓ (If True)
Node: "Twilio SMS" (Final Reminder)
Message: |
FINAL REMINDER: Appointment today at {{$node['Semble'].json['appointmentTime']}}.
Please confirm attendance or we may need to offer your slot to another patient.
Confirm now: {{urgent_confirm_link}}
Cancel: {{cancel_link}}
Cancelled Appointment Management¶
Scenario: Handle appointment cancellations with automatic waiting list processing and revenue recovery.
Workflow Process¶
Trigger: Appointment Cancelled
↓
Send Cancellation Confirmation
↓
Check Waiting List
↓
Offer Slot to Waiting Patients
↓
Process Refunds if Applicable
↓
Update Analytics
Implementation¶
1. Cancellation Trigger¶
Node: "Semble Trigger"
Resource: "Booking"
Event: "Updates Only"
Poll Interval: "Every 10 minutes"
Date Period: "Next 30 days"
Filters:
status_changed_to: "Cancelled"
2. Cancellation Confirmation¶
Node: "Send Email"
To: "{{$node['Semble Trigger'].json['patient']['email']}}"
Subject: "Appointment Cancellation Confirmed"
Template: |
Dear {{$node['Semble Trigger'].json['patient']['firstName']}},
Your appointment has been successfully cancelled:
📅 Original Date: {{$node['Semble Trigger'].json['appointmentDate']}}
🕐 Original Time: {{$node['Semble Trigger'].json['appointmentTime']}}
👨⚕️ Provider: {{$node['Semble Trigger'].json['staff']['firstName']}} {{$node['Semble Trigger'].json['staff']['lastName']}}
Cancellation Details:
- Cancelled: {{DateTime.now().toFormat('MMM d, yyyy HH:mm')}}
- Reason: {{$node['Semble Trigger'].json['cancellationReason'] || 'Not specified'}}
{{#if refund_applicable}}
💰 Refund: A refund of £{{$node['Semble Trigger'].json['fee']}} will be processed within 3-5 business days.
{{/if}}
Need to reschedule? Book online: {{booking_link}}
We hope to see you again soon!
3. Waiting List Processing¶
Node: "HTTP Request" (Get Waiting List)
Method: "GET"
URL: "{{practice_api}}/waiting-list"
Query:
appointment_type: "{{$node['Semble Trigger'].json['appointmentTypeId']}}"
staff_id: "{{$node['Semble Trigger'].json['staffId']}}"
date_preference: "{{$node['Semble Trigger'].json['appointmentDate']}}"
↓
Node: "Function" (Process Waiting List)
Code: |
// Sort waiting list by priority and date added
const waitingList = $node['HTTP Request'].json;
const sortedList = waitingList
.filter(patient => patient.available_dates.includes('{{$node['Semble Trigger'].json['appointmentDate']}}'))
.sort((a, b) => {
if (a.priority !== b.priority) return b.priority - a.priority;
return new Date(a.date_added) - new Date(b.date_added);
});
return sortedList.slice(0, 3); // Top 3 candidates
↓
Node: "Send Email" (Waiting List Offer)
To: "{{$item.email}}"
Subject: "Appointment Available - {{DateTime.fromISO($node['Semble Trigger'].json['appointmentDate']).toFormat('MMM d')}}"
Template: |
Good news {{$item.first_name}}!
An appointment slot has become available:
📅 Date: {{DateTime.fromISO($node['Semble Trigger'].json['appointmentDate']).toFormat('EEEE, MMMM d, yyyy')}}
🕐 Time: {{$node['Semble Trigger'].json['appointmentTime']}}
👨⚕️ Provider: {{$node['Semble Trigger'].json['staff']['firstName']}} {{$node['Semble Trigger'].json['staff']['lastName']}}
📍 Type: {{$node['Semble Trigger'].json['appointmentType']['name']}}
This appointment is available on a first-come, first-served basis.
🎯 Book immediately: {{priority_booking_link}}&token={{$item.priority_token}}
⏰ This offer expires in 2 hours or when the slot is filled.
Want to remain on the waiting list? No action needed.
Inventory Management Automation¶
Scenario: Monitor product stock levels and automate reordering with supplier integration.
Workflow Logic¶
Trigger: Product Stock Update
↓
Check Stock Levels
↓
Generate Reorder Alerts
↓
Create Purchase Orders
↓
Notify Suppliers
↓
Track Delivery
Implementation¶
1. Stock Level Trigger¶
Node: "Semble Trigger"
Resource: "Product"
Event: "Updates Only"
Poll Interval: "Every 1 hour"
Date Period: "Last 2 hours"
Filters:
stock_tracked: true
status: "Active"
2. Stock Analysis¶
Node: "Function" (Analyze Stock)
Code: |
const items = $input.all();
const lowStockItems = [];
items.forEach(item => {
const product = item.json;
// Check if stock is below minimum
if (product.currentStock <= product.minimumStock) {
const daysUntilEmpty = Math.floor(product.currentStock / (product.averageDailyUsage || 1));
lowStockItems.push({
...product,
reorderUrgency: daysUntilEmpty <= 3 ? 'urgent' : 'standard',
daysUntilEmpty: daysUntilEmpty,
suggestedOrderQuantity: product.maximumStock - product.currentStock,
preferredSupplier: product.suppliers[0] // Primary supplier
});
}
});
return lowStockItems;
3. Urgent Stock Alerts¶
Node: "IF" (Check Urgency)
Condition: "{{$json.reorderUrgency === 'urgent'}}"
↓ (If True)
Node: "Slack/Teams Alert"
Channel: "#inventory-urgent"
Message: |
🚨 **URGENT STOCK ALERT** 🚨
**Product**: {{$json.name}} ({{$json.code}})
**Current Stock**: {{$json.currentStock}} {{$json.unitOfMeasure}}
**Days Until Empty**: {{$json.daysUntilEmpty}}
**Suggested Order**: {{$json.suggestedOrderQuantity}} {{$json.unitOfMeasure}}
**Supplier**: {{$json.preferredSupplier.name}}
**Lead Time**: {{$json.preferredSupplier.leadTime}} days
**Cost**: £{{$json.preferredSupplier.cost}} per {{$json.unitOfMeasure}}
@channel Please action immediately! 📞
4. Purchase Order Generation¶
Node: "HTTP Request" (Create PO)
Method: "POST"
URL: "{{inventory_system_api}}/purchase-orders"
Body:
supplier_id: "{{$json.preferredSupplier.id}}"
urgent: "{{$json.reorderUrgency === 'urgent'}}"
items:
- product_code: "{{$json.code}}"
supplier_code: "{{$json.preferredSupplier.productCode}}"
quantity: "{{$json.suggestedOrderQuantity}}"
unit_cost: "{{$json.preferredSupplier.cost}}"
total_cost: "{{$json.suggestedOrderQuantity * $json.preferredSupplier.cost}}"
delivery_address: "{{practice_address}}"
requested_delivery: "{{DateTime.now().plus({days: $json.preferredSupplier.leadTime}).toISO()}}"
notes: "Auto-generated reorder - Stock level: {{$json.currentStock}}"
5. Supplier Notification¶
Node: "Send Email"
To: "{{$json.preferredSupplier.contactEmail}}"
Subject: "Purchase Order #{{$node['HTTP Request'].json.po_number}} - {{$json.reorderUrgency === 'urgent' ? 'URGENT' : 'Standard'}} Order"
Template: |
Dear {{$json.preferredSupplier.contactName}},
We have generated a new purchase order:
**PO Number**: {{$node['HTTP Request'].json.po_number}}
**Priority**: {{$json.reorderUrgency === 'urgent' ? '🚨 URGENT' : '📦 Standard'}}
**Order Details**:
- Product: {{$json.name}}
- Your Code: {{$json.preferredSupplier.productCode}}
- Quantity: {{$json.suggestedOrderQuantity}} {{$json.unitOfMeasure}}
- Unit Price: £{{$json.preferredSupplier.cost}}
- Total: £{{$json.suggestedOrderQuantity * $json.preferredSupplier.cost}}
**Delivery**:
- Address: {{practice_address}}
- Requested: {{DateTime.now().plus({days: $json.preferredSupplier.leadTime}).toFormat('MMM d, yyyy')}}
- {{$json.reorderUrgency === 'urgent' ? 'Please expedite - critical stock level!' : 'Standard delivery timeline acceptable'}}
**Payment**: As per agreed terms ({{$json.preferredSupplier.paymentTerms || '30 days net'}})
Please confirm receipt and estimated delivery date.
Best regards,
Practice Manager
{{practice_name}}
Revenue Optimization Workflow¶
Scenario: Monitor appointment patterns and optimize scheduling for maximum revenue and efficiency.
Analytics Process¶
Daily Revenue Analysis
↓
Identify Underutilized Slots
↓
Dynamic Pricing Adjustments
↓
Promotional Campaign Triggers
↓
Performance Reporting
Implementation¶
1. Daily Analytics Trigger¶
Node: "Schedule Trigger"
Rule: "0 6 * * *" (Daily at 6 AM)
↓
Node: "Semble" (Get Yesterday's Bookings)
Resource: "Booking"
Action: "Get All"
Date Filter: "Yesterday"
Return All: true
2. Revenue Analysis¶
Node: "Function" (Calculate Metrics)
Code: |
const bookings = $node['Semble'].json;
const today = DateTime.now();
const yesterday = today.minus({days: 1});
// Calculate key metrics
const totalRevenue = bookings
.filter(b => b.status === 'Completed')
.reduce((sum, b) => sum + (b.fee || 0), 0);
const totalSlots = 48; // 8 hours * 6 slots per hour
const bookedSlots = bookings.filter(b => b.status !== 'Cancelled').length;
const utilizationRate = (bookedSlots / totalSlots) * 100;
const noShowRate = (bookings.filter(b => b.status === 'No Show').length / bookedSlots) * 100;
const cancellationRate = (bookings.filter(b => b.status === 'Cancelled').length / bookings.length) * 100;
// Identify patterns
const hourlyUtilization = {};
bookings.forEach(booking => {
const hour = DateTime.fromISO(booking.appointmentTime).hour;
hourlyUtilization[hour] = (hourlyUtilization[hour] || 0) + 1;
});
const underutilizedHours = Object.entries(hourlyUtilization)
.filter(([hour, count]) => count < 4) // Less than 67% utilization
.map(([hour]) => parseInt(hour));
return {
date: yesterday.toISODate(),
totalRevenue,
utilizationRate,
noShowRate,
cancellationRate,
bookedSlots,
totalSlots,
underutilizedHours,
recommendedActions: {
increasePricing: utilizationRate > 90,
decreasePricing: utilizationRate < 60,
targetOffPeakPromotion: underutilizedHours.length > 0,
improveNoShowPrevention: noShowRate > 10
}
};
3. Dynamic Pricing Alerts¶
Node: "IF" (High Utilization)
Condition: "{{$json.utilizationRate > 90}}"
↓ (If True)
Node: "Send Email" (Revenue Team)
To: "revenue@practice.com"
Subject: "High Demand Alert - Consider Premium Pricing"
Template: |
📈 **HIGH UTILIZATION DETECTED**
**Date**: {{$json.date}}
**Utilization**: {{Math.round($json.utilizationRate)}}%
**Revenue**: £{{$json.totalRevenue}}
**Recommendation**: Consider implementing premium pricing for peak hours
**Actions to Consider**:
- Increase prices by 10-15% for tomorrow
- Offer earlier/later appointment slots
- Promote package deals to spread demand
**Next Steps**: Review pricing strategy for similar high-demand patterns.
4. Off-Peak Promotion Trigger¶
Node: "IF" (Low Utilization)
Condition: "{{$json.utilizationRate < 60}}"
↓ (If True)
Node: "Mailchimp" (Promotional Campaign)
Operation: "Create Campaign"
Type: "regular"
Subject: "Special Offer - 20% Off Off-Peak Appointments"
Template: |
We have some great appointment availability!
🎯 **20% OFF** appointments between {{$json.underutilizedHours.join(', ')}}:00
**Available This Week**:
{{#each available_slots}}
- {{date}} at {{time}} - £{{discounted_price}} (was £{{original_price}})
{{/each}}
Perfect for:
✅ Regular check-ups
✅ Follow-up consultations
✅ Health assessments
Book online: {{booking_link}}?promo=OFFPEAK20
*Offer valid for bookings made within 48 hours*
Recipients: "low_frequency_patients"
Send Immediately: true
🎯 Industry-Specific Workflows¶
NHS Integration Workflows¶
NHS Number Verification¶
Trigger: New Patient Registration
↓
Validate NHS Number Format
↓
Query NHS Demographics Service
↓
Update Patient Record
↓
Generate Compliance Report
GP Referral Processing¶
Trigger: New Booking (Referral Type)
↓
Validate Referral Letter
↓
Extract Clinical Information
↓
Schedule Priority Appointment
↓
Notify Referring GP
↓
Update NHS Systems
Private Practice Workflows¶
Insurance Verification¶
Trigger: New Private Patient
↓
Verify Insurance Coverage
↓
Check Pre-authorization
↓
Calculate Patient Liability
↓
Send Coverage Summary
↓
Update Billing System
Corporate Health Packages¶
Trigger: Employee Health Booking
↓
Validate Corporate Account
↓
Apply Package Pricing
↓
Schedule Comprehensive Screen
↓
Prepare Executive Summary
↓
Bill Corporate Account
Specialist Clinic Workflows¶
Procedure Scheduling¶
Trigger: Procedure Booking
↓
Check Pre-procedure Requirements
↓
Schedule Pre-op Assessment
↓
Send Preparation Instructions
↓
Coordinate Theatre Booking
↓
Arrange Follow-up Care
Multi-disciplinary Team Coordination¶
Trigger: Complex Case Booking
↓
Identify Required Specialists
↓
Coordinate Availability
↓
Schedule Team Meeting
↓
Prepare Case Summary
↓
Distribute Meeting Notes
🔧 Utility Workflows¶
Data Synchronization¶
Master Data Management¶
Schedule: Daily at 2 AM
↓
Export Semble Data
↓
Transform to Standard Format
↓
Update Master Database
↓
Sync to All Systems
↓
Generate Sync Report
Backup and Recovery¶
Schedule: Weekly
↓
Full Data Export
↓
Encrypt and Compress
↓
Upload to Cloud Storage
↓
Verify Backup Integrity
↓
Clean Old Backups
Compliance Workflows¶
GDPR Data Requests¶
Trigger: Data Subject Access Request
↓
Compile All Patient Data
↓
Anonymize Third-party References
↓
Generate Portable Format
↓
Secure Delivery to Patient
↓
Log Compliance Activity
Audit Trail Generation¶
Schedule: Monthly
↓
Extract Activity Logs
↓
Analyze Access Patterns
↓
Identify Anomalies
↓
Generate Audit Report
↓
Archive Historical Data
📊 Reporting Workflows¶
Performance Analytics¶
Daily Dashboard Update¶
Schedule: Every hour during business hours
↓
Collect Real-time Metrics
↓
Calculate KPIs
↓
Update Dashboard Display
↓
Send Alerts if Needed
↓
Log Performance Data
Monthly Business Review¶
Schedule: 1st of every month
↓
Compile Monthly Statistics
↓
Generate Revenue Analysis
↓
Create Utilization Reports
↓
Analyze Patient Trends
↓
Distribute to Management
Clinical Reporting¶
Quality Metrics¶
Schedule: Weekly
↓
Calculate Clinical Indicators
↓
Measure Patient Outcomes
↓
Track Adherence Rates
↓
Generate Quality Report
↓
Submit to Regulators
Safety Monitoring¶
Trigger: Incident Reported
↓
Classify Incident Type
↓
Assess Risk Level
↓
Notify Relevant Teams
↓
Track Resolution
↓
Update Safety Database
🚀 Advanced Automation¶
AI-Powered Workflows¶
Intelligent Scheduling¶
Trigger: Booking Request
↓
Analyze Patient History
↓
Predict Appointment Duration
↓
Optimize Staff Assignment
↓
Suggest Best Time Slots
↓
Auto-book if Confidence High
Predictive Analytics¶
Schedule: Daily
↓
Analyze Historical Patterns
↓
Predict No-show Probability
↓
Forecast Demand
↓
Optimize Resource Allocation
↓
Generate Predictions Report
Integration Orchestration¶
Multi-system Workflow¶
Trigger: Complex Business Event
↓
Coordinate Multiple Systems
↓
Handle Cross-system Dependencies
↓
Implement Rollback Logic
↓
Monitor All Components
↓
Report Success/Failure
Event-driven Architecture¶
Event Bus: Central coordination
↓
Route Events to Handlers
↓
Process in Parallel
↓
Aggregate Results
↓
Trigger Next Workflow Stage
↓
Update Event Log
📋 Implementation Checklist¶
Pre-deployment¶
- Test with sample data
- Verify API permissions
- Configure error handling
- Set up monitoring
- Create documentation
Deployment¶
- Deploy to staging
- Run integration tests
- Monitor initial execution
- Deploy to production
- Verify all connections
Post-deployment¶
- Monitor performance
- Collect user feedback
- Optimize workflows
- Update documentation
- Plan enhancements
🆘 Troubleshooting Quick Reference¶
Common Issues¶
Workflow Not Triggering:
- Check trigger configuration
- Verify API credentials
- Review date periods
- Test manual execution
Data Synchronization Problems:
- Validate data mappings
- Check field compatibility
- Review transformation logic
- Monitor error logs
Performance Issues:
- Optimize data queries
- Reduce batch sizes
- Implement caching
- Scale infrastructure
Error Recovery¶
Failed Workflow Steps:
1. Identify failure point
2. Check error messages
3. Verify input data
4. Test individual nodes
5. Implement retry logic
Data Corruption:
1. Stop affected workflows
2. Assess damage scope
3. Restore from backup
4. Re-process lost data
5. Validate data integrity
Next Steps¶
Ready to implement these workflows? Check out:
- Node Documentation - Detailed node configurations
- Integration Patterns - Advanced system integration
- Troubleshooting Guide - Problem resolution
- Development Guide - Custom workflow development
Questions? Join our community discussions or contact support for workflow consultation.