This is one of the most complex Zapier workflows I've built — 84 steps, fully automated outreach that reads every inbound reply, classifies the tone using OpenAI, and sends the right personalised follow-up without any human involvement.
The client was running cold outreach at scale in Close.io CRM. Their sales reps were spending 3 hours a day manually reading replies and crafting responses. This workflow eliminated all of that manual work.
The Problem
When you run outreach at scale, replies fall into a few buckets:
- Interested — "Yes, tell me more" / "Can we book a call?"
- Objection — "Too expensive" / "We're using X already" / "Not the right time"
- Not now — "Reach back in Q2" / "We're in a budget freeze"
- Unsubscribe — "Remove me from your list"
- Out of office — Auto-replies that shouldn't trigger a response
Each category needs a completely different response. A generic reply to an objection kills the deal. A delayed response to "Can we book a call?" loses it.
The Workflow Architecture
The Zap triggers on New Activity in Close.io (specifically: email received on an existing lead). The flow:
- Trigger: New inbound email activity in Close.io
- Filter: Skip if it's an outbound email (direction = "outbound")
- Filter: Skip if subject contains "Out of Office" or "Auto-Reply"
- OpenAI: Classify reply tone → returns category + confidence + summary
- Filter: Skip if unsubscribe → run unsubscribe handler instead
- Paths: Branch on the classification result
- Per branch: OpenAI drafts personalised reply → update Close.io lead status → send email via Close.io
The OpenAI Tone Classification Prompt
Classify this sales email reply. Return ONLY valid JSON.
{
"category": "interested" | "objection" | "not_now" | "unsubscribe" | "out_of_office" | "other",
"objection_type": "price" | "competitor" | "timing" | "authority" | null,
"confidence": 0.0-1.0,
"urgency": "high" | "medium" | "low",
"one_line_summary": "string"
}
Email reply:
{{email_body}}
The Reply Templates (OpenAI Drafted)
Interested branch
The prospect just replied to your outreach and said:
"{{email_body}}"
They work at {{company_name}} as {{prospect_title}}.
Our product is an AI automation platform.
Write a reply (max 3 sentences) that:
1. Confirms you saw their interest
2. Proposes a specific 20-minute call time (use "Tuesday or Wednesday this week")
3. Includes a Calendly link placeholder: [CALENDAR_LINK]
No fluff. Sound like a real person, not a template.
Objection branch — price
The prospect objected to price: "{{email_body}}"
Write a 2-sentence reply that:
1. Acknowledges the concern without being defensive
2. Reframes the ROI (automation saves X hours/week)
Don't discount. Don't apologize. Keep it confident.
Why 84 steps? Each of the 5 reply categories has its own sub-flow: OpenAI draft → format message → update lead status in Close → update lead custom fields → send email → create follow-up task → log activity. That's ~15 steps per branch × 5 branches + the shared upstream logic = 84 total.
The Results
After 60 days running this workflow for the client:
- Reply handling time: 3 hours/day → 0 minutes (fully automated)
- Response speed: Average 4.2 hours → under 3 minutes
- Booking rate: Increased 31% (faster responses = more booked calls)
- Unsubscribe mishandling: 0 (previously 2-3 per week)
Key Lessons from Building This
- Always filter out-of-office replies first. Without this, the system replies to auto-responders and triggers infinite loops.
- Low-confidence classifications need a human fallback. If OpenAI returns confidence below 0.7, I flag the lead for manual review instead of auto-responding.
- Test with real email samples. Generic test data produces unreliable classification. I used 50 real past replies to tune the prompts.
- Zapier's execution timeout is 2 minutes. OpenAI calls sometimes take 15–30 seconds, so keep the rest of the flow lean.
This kind of workflow is what I build for outreach-heavy sales teams. If you're running outreach at scale and drowning in manual reply handling, let's talk.