Skip to Content
WorkflowsCommon Recipes

Common Recipes

Practical workflow patterns you can adapt for your use case. Each recipe shows the trigger, node sequence, and key configuration.

1. Lead Routing by Country

Automatically assign new leads to the regional team based on their country.

Trigger: Event — crm.lead.created

Event: crm.lead.created --> Extract Lead Data --> Switch: {{leadCountry}} Case "US" --> Assign Lead to "North America" team Case "CA" --> Assign Lead to "North America" team Case "GB" --> Assign Lead to "EMEA" team Case "DE" --> Assign Lead to "EMEA" team Case "FR" --> Assign Lead to "EMEA" team Default --> Assign Lead to "General" team --> Add Note: "Auto-routed to {{assignedTeam}} team"

Key configuration:

  • Switch node evaluates {{trigger.data.lead.country}}
  • Each Assign Lead node sets the assignedAgentId or team
  • The Add Note node logs the routing decision for audit

2. AI Auto-Reply with Confidence Threshold

Suggest an AI reply and send it automatically if the confidence score is high enough. Otherwise, leave it as a draft for human review.

Trigger: Event — inbox.message.received

Event: inbox.message.received --> AI Suggest Reply Input: {{trigger.data.message.text}} Conversation: {{trigger.data.conversationId}} --> Condition: {{nodes.aiSuggestReply.output.confidence}} > 0.8 True --> Send Message Text: {{nodes.aiSuggestReply.output.suggestedReply}} Conversation: {{trigger.data.conversationId}} --> Add Note: "Auto-replied with AI (confidence: {{nodes.aiSuggestReply.output.confidence}})" False --> Add Note: "AI draft ready for review (confidence: {{nodes.aiSuggestReply.output.confidence}})"

Key configuration:

  • The confidence threshold (0.8) can be adjusted based on your quality requirements
  • Lower thresholds mean more auto-replies but higher risk of inaccurate responses
  • The Add Note records the AI confidence for monitoring

3. SLA Escalation Ladder

If a conversation is idle for 30 minutes, notify the assigned agent. If still idle after 60 minutes, escalate to the team lead.

Trigger: Conversation Idle — 30 minutes

Conversation Idle: 30 minutes --> Send Message (internal note): "Reminder: This conversation has been idle for 30 minutes" --> Notify Slack: #support-alerts "Idle conversation: {{trigger.conversation._id}}" --> Delay: 30 minutes --> Condition: {{trigger.conversation.status}} === "open" True --> Update Conversation Priority: "urgent" --> Escalate to Team: "Support Leads" --> Notify Slack: #escalations "Escalated: idle 60+ minutes" False --> Log: "Conversation resolved before escalation"

Key configuration:

  • First notification goes to the assigned agent via internal note + Slack
  • 30-minute Delay node waits before checking again
  • The Condition checks if the conversation is still open (it may have been resolved during the wait)
  • If still open, priority is raised and the team lead is notified

4. Data Enrichment Pipeline

When a new lead is created, enrich their profile from multiple sources in parallel, validate their email, and update the lead record.

Trigger: Event — crm.lead.created

Event: crm.lead.created --> Extract Lead Data --> Fork Branch 1: Enrich Person (Apollo) Email: {{leadEmail}} First Name: {{leadName}} Branch 2: Validate Email (ZeroBounce) Email: {{leadEmail}} --> Merge (wait for all) --> Condition: {{nodes.validateEmail.output.status}} === "valid" True --> Update Lead Company: {{nodes.enrichPerson.output.company.name}} Title: {{nodes.enrichPerson.output.title}} LinkedIn: {{nodes.enrichPerson.output.linkedin_url}} Email Status: "verified" --> AI Score Lead --> Update Lead: score = {{nodes.aiScoreLead.output.score}} False --> Update Lead: emailStatus = "invalid" --> Add Note: "Email validation failed: {{nodes.validateEmail.output.sub_status}}"

Key configuration:

  • Fork runs Apollo enrichment and ZeroBounce validation simultaneously
  • Merge waits for both to finish before continuing
  • Only updates the lead with enrichment data if the email is valid
  • AI lead scoring runs after enrichment to factor in the new data

5. Shopify Order Follow-up

When a Shopify order webhook fires, create a conversation with the customer and send a thank-you message with order details.

Trigger: Webhook — Shopify order/created

Webhook: Shopify order/created --> Set Variable: customerEmail = {{trigger.body.customer.email}} --> Set Variable: orderNumber = {{trigger.body.order_number}} --> Set Variable: totalPrice = {{trigger.body.total_price}} --> Find Customer: email = {{variables.customerEmail}} --> Condition: {{nodes.findCustomer.output.found}} === true True --> (use existing customer) False --> Create Customer Email: {{variables.customerEmail}} Name: {{trigger.body.customer.first_name}} {{trigger.body.customer.last_name}} --> Find Conversation: customerId + channel = whatsapp --> Condition: {{nodes.findConversation.output.found}} === true True --> Send Message to existing conversation False --> Send WhatsApp Template Template: "order_confirmation" Parameters: [{{variables.orderNumber}}, {{variables.totalPrice}}] --> Create Lead Activity Type: "purchase" Notes: "Order #{{variables.orderNumber}} - ${{variables.totalPrice}}"

Key configuration:

  • The webhook URL is provided to Shopify as the order notification endpoint
  • The workflow checks if the customer already exists before creating a new one
  • If the customer has an active WhatsApp conversation, it sends a regular message
  • If not, it initiates with a WhatsApp template (required for 24-hour window)
  • A CRM activity is logged for the purchase

Building Your Own Recipes

When designing workflows:

  1. Start simple. Get the happy path working first, then add error handling and edge cases.
  2. Test with manual triggers. Switch to a Manual trigger during development so you can iterate quickly.
  3. Use the execution log. After each test run, check the execution log to verify data flow between nodes.
  4. Add notes for debugging. Use Add Note nodes as checkpoints to log intermediate values.
  5. Handle failures. Wrap external API calls in Try-Catch or Retry nodes before going to production.