# Salesforce lead follow-up automation: recover prospects who don't book meetings **Author:** dheer-gupta **Date:** 2026-02-08 **Category:** Integrations **Tags:** Salesforce, Lead Recovery, Zapier, Meeting Scheduling, Sales Automation, RevOps, Workflow Automation Your Salesforce leads are assigned but not booking meetings. Build an automated recovery workflow with Zapier and SkipUp to schedule meetings with every lead. > A step-by-step integration tutorial for Salesforce admins and RevOps teams showing how to build an automated lead recovery workflow that detects when a Salesforce lead submits a form but does not book a meeting, and triggers AI-powered scheduling follow-up via Zapier and SkipUp. Covers Salesforce-specific implementation including Salesforce Flow vs Zapier workflow comparison, Lead and Contact object configuration, Event object queries for meeting activity detection, delay and filter logic using Salesforce data, and edge cases unique to Salesforce's data model (Lead conversion to Contact, duplicate Lead handling, assignment rule interactions). Includes prerequisites checklist, dual-path setup instructions (Salesforce Flow + Zapier hybrid vs full Zapier), and testing procedures. Web version: https://blog.skipup.ai/salesforce-lead-follow-up-automation-recover-prospects --- > **Quick Start:** > - **What this covers:** A Salesforce-specific workflow to recover leads who don't book meetings after form submission. > - **Two paths:** Full Zapier (Professional+ with API) or Hybrid with Salesforce Flow (Enterprise+). > - **Setup time:** ~30 minutes (Zapier path) or ~60 minutes (Flow + Zapier path). > - **Prerequisites:** Salesforce Professional+ with API access, Zapier Starter+, SkipUp API key. > - **Edition note:** Salesforce Professional Edition users, use Path A (Full Zapier). Enterprise or Unlimited users, both paths are available. > - **Using HubSpot instead?** See [How to Automate Meeting Scheduling from HubSpot Form Submissions](/automate-meeting-scheduling-hubspot-form-submissions). > - For the CRM-agnostic version, see [How to Recover Leads Who Didn't Book a Meeting](/how-to-recover-leads-who-didnt-book-meeting). > **Key Facts:** > - Salesforce detection uses Lead/Contact records as triggers and Event objects (the Salesforce standard object that stores calendar meetings) as the "meeting booked" signal. > - Two implementation paths: Full Zapier (Professional+) or Salesforce Flow + Zapier (Enterprise+). > - Writing results back to Salesforce requires a separate Zapier step — SkipUp does not update Salesforce records natively. > - Recommended delay windows: demo request 15–30 min, contact form 30–60 min, pricing inquiry 10–15 min. > - Filter logic queries Event records where WhoId matches the Lead/Contact Id and CreatedDate falls after the form submission timestamp. > - Prerequisites: Salesforce with Web-to-Lead or custom forms, Zapier Starter+, SkipUp account with API key, connected calendar. If you have ever pulled a report of leads who were sent a booking link in the last 30 days and cross-referenced it against your Event records only to find a gap you could drive a truck through — this Salesforce lead follow-up automation guide closes that gap. We walk through two implementation paths using Zapier and SkipUp. > **How the tools divide the work:** SkipUp handles the scheduling conversation — outreach email, time negotiation, and calendar booking. Salesforce provides the detection data — Lead/Contact records and Event objects. Zapier orchestrates the connection between them. SkipUp does not score, route, or qualify leads, and does not write records back to Salesforce directly. Each tool does one job well. ## What do you need to set up Salesforce meeting recovery? Before you start, confirm you have everything on this checklist: - [ ] **Salesforce Professional edition or higher** with API access enabled - [ ] **Web-to-Lead enabled** with at least one active web form (or Pardot/third-party forms creating Lead records) - [ ] **Zapier account** (Starter or higher for multi-step Zaps) - [ ] **SkipUp account** with API key (Settings > API Keys) - [ ] **Calendar connected** in SkipUp (Google Calendar or Outlook) Already connected Salesforce to Zapier and SkipUp? Skip to the next section. For Salesforce-to-Zapier connection and authentication, see [support.skipup.ai/integrations/zapier-salesforce](https://support.skipup.ai/integrations/zapier-salesforce). For foundational Zapier + SkipUp setup, see our [Zapier integration guide](/automate-meeting-scheduling-with-zapier). This guide assumes those connections are in place and focuses on the recovery detection logic. ### Salesforce edition requirements | Feature | Minimum Edition | |---|---| | API access (required for Zapier) | Professional (with API add-on) or Enterprise | | Web-to-Lead | All editions | | Flow Builder (basic) | Professional | | Flow Builder with Scheduled Paths | Enterprise | | Flow Builder with HTTP Callout | Enterprise | | Lead Assignment Rules | All editions | ## Should you use Zapier or Salesforce Flow for detection? There are two ways to build this workflow. The right choice depends on your Salesforce edition. | | **Path A: Full Zapier** | **Path B: Hybrid (Flow + Zapier)** | |---|---|---| | **Detection logic** | Zapier handles trigger, delay, and filter | Salesforce Flow handles trigger, delay, and filter | | **SkipUp action** | Zapier "Create Meeting Request" | Flow fires HTTP Callout or Outbound Message to Zapier → SkipUp action | | **Salesforce edition** | Professional+ (with API access) | Enterprise+ (for HTTP Callout in Flow) | | **Zapier steps** | 5-6 steps | 1-2 steps | | **Lead conversion handling** | Extra Zapier step to check IsConverted | Flow handles natively | | **Best for** | Teams on Professional Edition or Zapier-first teams | Teams on Enterprise/Unlimited with Salesforce admin expertise | **Path A** keeps everything in Zapier — simpler to manage, works on Professional Edition. **Path B** uses Salesforce Flow for detection, which gives you richer filtering (SOQL-style queries, behavioral triggers) but requires Enterprise Edition and Flow Builder familiarity. This guide covers both paths. Follow Path A or Path B based on your Salesforce edition. ## Which Salesforce objects does the recovery workflow use? Salesforce's data model is fundamentally different from HubSpot's. Understanding which objects play which role prevents misconfiguration. | Salesforce Object | Role in Recovery Workflow | Detection Query | |---|---|---| | **Lead** | Trigger — new web form submission creates a Lead record | Record-Triggered Flow on Lead (or Zapier "New Record" trigger) | | **Contact** | Alternative trigger if Web-to-Lead auto-converts, or if Lead is converted during delay | Check both Lead and Contact triggers | | **Event** (the Salesforce standard object that stores calendar meetings) | "Meeting booked" signal — query by WhoId to check if a meeting was scheduled | WhoId = Lead/Contact Id AND CreatedDate > form submission time | | **Task** | Secondary meeting signal — some orgs log meeting requests as Tasks | Optional: WhoId match, Subject contains "Meeting" | | **Opportunity** | NOT used for detection — this is a downstream sales stage object | Do not filter on this | The critical difference from HubSpot: HubSpot has a "Last Meeting Booked Date" contact property you can check directly. Salesforce has no equivalent. You must query the **Event** object for meeting activity records associated with the Lead or Contact. ## How does Salesforce detection differ from HubSpot? If you are evaluating both CRMs or migrating between them, this comparison shows the structural differences in meeting detection and recovery automation. | Aspect | HubSpot | Salesforce | |---|---|---| | **Trigger object** | Form Submission event | Lead record creation (Web-to-Lead) | | **Meeting detection** | "Last Meeting Booked Date" contact property | Event object query (WhoId + CreatedDate) | | **Native automation** | HubSpot Workflows (Professional+) | Salesforce Flow (Professional+) | | **Delay mechanism** | Workflow scheduled action | Flow Scheduled Path or Pause element | | **Filter complexity** | Single property check | SOQL-style query or Flow Get Records element | | **CRM writeback** | Separate Zapier step | Separate Zapier step — NOT native SkipUp | | **Key edge case** | Contact merges during delay | Lead conversion to Contact during delay | For the HubSpot-specific implementation, see [How to Automate Meeting Scheduling from HubSpot Form Submissions](/automate-meeting-scheduling-hubspot-form-submissions). ## How do you trigger the workflow from a Salesforce form? This is where the Salesforce form to meeting automation pipeline begins. The trigger watches for new Lead records created by your web forms. ### Path A: Zapier trigger 1. In Zapier, click **Create Zap** and search for **Salesforce** as the trigger app. 2. Select **New Record** as the trigger event. Set the object to **Lead**. 3. Filter by **Lead Source = "Web"** (or your specific web form source value) to catch only Web-to-Lead submissions. Do not trigger on every new Lead — sales-created Leads and import Leads should not enter the recovery workflow. 4. Test the trigger to pull in a sample Lead record. Verify these fields come through: Email, FirstName, LastName, Company, LeadSource, CreatedDate. **Tip:** Create separate Zaps for different lead sources if they need different delay windows. A demo request form and a general contact form have different urgency levels. ### Path B: Salesforce Flow trigger 1. In Salesforce Setup, go to **Flow Builder** and create a new **Record-Triggered Flow** on the Lead object. 2. Set the trigger to: **A record is created** (After Insert). 3. Add entry conditions: **LeadSource equals "Web"** AND **Status equals "Open - Not Contacted"**. 4. Optionally exclude internal leads: **Email does not contain [your company domain]**. ## How long should you wait before checking for a meeting? ### Recommended delays by Salesforce lead source | Lead Source / Campaign | Recommended Delay | Why | |---|---|---| | **Web-to-Lead (Demo Request)** | 15-30 minutes | High intent — they book immediately or they don't | | **Web-to-Lead (Contact Us)** | 30-60 minutes | Mixed intent — lead may be comparing options | | **Web-to-Lead (Pricing Page)** | 10-15 minutes | Highest intent — active evaluation | | **Pardot / Account Engagement** | 15-30 minutes | Usually gated content — similar urgency to demo | | **Partner Referral** | 2-4 hours | Lead may not expect immediate outreach | | **Event / Tradeshow** | 24 hours | Follow-up expected but not urgent | ### Path A: Delay in Zapier After the trigger step, add a **Delay by Zapier** action. Select **Delay For** and set the value (e.g., 20 minutes). ### Path B: Delay in Salesforce Flow Use a **Scheduled Path** on your Record-Triggered Flow: "Run this path 20 minutes after Lead: CreatedDate." Prefer Scheduled Paths over Pause elements — some orgs have a 24-hour minimum on Pause elements, while Scheduled Paths achieve the same delay effect without that limitation. Note: Flow Scheduled Paths are processed in batches and may have slight timing variance (minutes, not hours). This is fine for lead recovery. ## How do you check if the lead already booked in Salesforce? This is the key section. Salesforce has no "Last Meeting Booked Date" property. You must query the **Event** object to determine whether a meeting was scheduled for this lead. ### Path A: Zapier filter using Salesforce data **Step 1: Check if the Lead was converted.** Add a **Salesforce: Get Record** action on the Lead object. Retrieve the **IsConverted** field. If the Lead was converted to a Contact during the delay window, you need the **ConvertedContactId** for the Event lookup. **Step 2: Search for Event records.** Add a **Salesforce: Find Record** action on the **Event** object. Search by: - **WhoId** = Lead ID from the trigger (or ConvertedContactId if IsConverted = true) - **CreatedDate** >= Lead CreatedDate If a matching Event is found → **STOP** the Zap (lead already has a meeting). **Step 3: Add the filter.** Add a **Filter by Zapier** step: - Only continue if: the Event search returned **no results**. **Alternative:** Check if a Task record exists with Type = "Meeting" as a secondary signal for orgs that log meetings as Tasks rather than Events. **Alternative:** Check if an Opportunity exists at stage "Discovery" or later as a coarser proxy for meeting activity (for orgs whose reps don't consistently log Events). ### Path B: Salesforce Flow filter After the Scheduled Path fires: 1. **Decision element:** Check `{!$Record.IsConverted}`. If true, use `ConvertedContactId` for downstream queries. 2. **Get Records element** on the Event object: Filter `WhoId = {!$Record.Id}` (or `ConvertedContactId`) AND `CreatedDate >= {!$Record.CreatedDate}`. 3. **Decision element:** If records found > 0 → end Flow (meeting exists). If records found = 0 → continue to the SkipUp action. ### Salesforce-specific edge cases **Lead conversion during delay.** This is the single biggest structural difference from HubSpot. If a Salesforce admin or SDR converts the Lead to a Contact + Account + Opportunity during the delay window, the Lead ID no longer receives new Events. Events are created on the Contact. Your filter must check `IsConverted` and fall back to `ConvertedContactId` for the Event lookup. In Path B, add a Decision element before the Get Records step. **Duplicate Leads from Web-to-Lead.** Salesforce's duplicate management rules may flag or merge duplicate Lead records from the same submission. The filter should check for existing SkipUp meeting requests by email (not just Lead ID) to avoid double-triggering recovery. **Lead assignment and ownership changes during delay.** Assignment rules run when the Lead is created, so assignment is already complete by the time the filter runs. However, if a rep manually reassigns the Lead during the delay window, the SkipUp meeting request should reference the **current** Lead Owner, not the original. In Path A, the Zapier lookup retrieves the current Owner at filter time. In Path B, the Flow accesses the current record state. Include the current Owner's name in the SkipUp context field so the scheduling email references the right rep. **Person Accounts.** If your org uses Person Accounts instead of the standard Lead/Contact model, the trigger and filter logic must be adapted. This is an advanced configuration beyond the scope of this guide. ## How do you connect SkipUp to recover the lead? Once the filter confirms no meeting was booked, the final step creates a SkipUp meeting request. When this step fires, SkipUp takes over the scheduling conversation. ### Path A: SkipUp action in Zapier Add **SkipUp** as an action step with **Create Meeting Request**. Map these fields: | SkipUp Field | Salesforce Source | Notes | |---|---|---| | **Participant email** | Lead.Email | Email from the triggering Lead | | **Subject** | "Demo Call with " + Lead.Company | Adjust per your meeting naming convention | | **Duration** | Static value | 30 minutes | | **Context** | Lead.FirstName + Lead.Company + Lead.LeadSource + Lead.Description | Include LeadSource so SkipUp's AI can reference how the prospect found you | | **Scheduling window** | Static value | 5 business days | Include the Lead Owner's name in the context field so SkipUp can personalize the scheduling email on behalf of the assigned rep. ### Path B: HTTP callout or webhook to Zapier In Salesforce Flow, the NO branch of your Decision element triggers an **HTTP Callout** action (Enterprise+) or an **Outbound Message** routed through Zapier. If using HTTP Callout directly to the SkipUp API, note that the raw API field names differ from the Zapier action labels (e.g., the API expects `participant_email` rather than "Participant email"). For simplicity, route through Zapier: create a separate Zap with **Webhooks by Zapier** as the trigger (Catch Hook) and add the SkipUp action with the same field mapping. ## How do you track recovery results in Salesforce? SkipUp handles the scheduling conversation. However, SkipUp does not write to Salesforce directly. To track recovery in your CRM, add a separate Zapier step after the SkipUp action. This keeps your CRM as the single source of truth without requiring a managed package or direct API integration. **Option A: Custom field update.** Create two custom fields on the Lead object: - `Recovery_Triggered__c` (Checkbox) — set to TRUE when recovery fires - `Recovery_Triggered_Date__c` (Date/Time) — timestamp of when recovery was triggered These fields enable Salesforce reporting on recovery volume and conversion rates. Check org validation rules before creating — if other required fields are missing, the Zapier update may fail. **Option B: Create a Task record.** Create a Task linked to the Lead with Subject = "SkipUp Recovery Triggered" and Status = "Completed." This appears in the Lead's activity timeline and is visible to reps without custom field setup. Note: This CRM write-back is a separate Zapier step writing to Salesforce. SkipUp handles scheduling — it does not update Salesforce records directly. ## How do you test your Salesforce recovery workflow? Before going live, run through this checklist: - [ ] Submit a test Web-to-Lead form and verify the Lead record is created in Salesforce - [ ] Verify the Zap triggers (Path A) or Flow fires (Path B) on the new Lead - [ ] Verify the delay fires for the correct duration (note: Flow Scheduled Paths may behave differently in sandbox vs production) - [ ] Create a test Event on the Lead, then verify the filter **stops** recovery - [ ] Delete the test Event, then verify the filter **continues** to recovery - [ ] Convert the Lead to a Contact during the delay window, then verify the filter correctly checks Events on the converted Contact - [ ] Verify the SkipUp meeting request is created with the correct Lead data - [ ] Verify the prospect receives a scheduling email from SkipUp - [ ] If using write-back, verify the custom field update or Task creation succeeds without validation rule errors ### Salesforce-specific troubleshooting **"Zapier can't connect to Salesforce."** Salesforce Professional Edition requires the API add-on to be enabled. Check Setup > Company Information > API Requests. **"Flow doesn't fire for Web-to-Lead records."** Verify the entry condition matches your Web-to-Lead field values (Lead Source, Record Type). Test with the debug tool in Flow Builder. **"Event lookup returns events from before the form submission."** Confirm the date comparison uses the Lead's CreatedDate, not just any date filter. **"Lead was converted and recovery still fired."** The IsConverted check must happen after the delay, not before. Add the conversion check immediately before the Event search. **"Validation rule blocked the write-back."** Check Setup > Object Manager > Lead > Validation Rules. Either modify the rule to exclude updates from the integration user, or use Task creation (Option B) instead of custom field updates. **"Filter always passes — Event search returns nothing."** Check that Event search criteria match how your org names meetings. If reps use free-text subjects, filter by Event type or a custom field instead of Subject. **"Recovery fires but no scheduling email goes out."** Check SkipUp API key permissions. Verify the meeting host's calendar is connected in SkipUp. Confirm the participant email is a valid external address. ## What should you do after setup? Your Salesforce recovery workflow is live. Here is what comes next: 1. **Monitor for two weeks** before adjusting delay windows or filter logic. Let the data accumulate. 2. **Check your recovery rate** against benchmarks — see [Form Submission to Meeting Booking: The Drop-Off Rates Every Sales Team Should Know](/form-submission-to-meeting-booking-drop-off-rates) for reference. 3. **Understand the speed-to-lead context** for why automated recovery outperforms manual follow-up: [Speed to Lead: Why Automated Meeting Scheduling is Your Best Response Time Weapon](/speed-to-lead-meeting-scheduling-automation). 4. **Scale to more lead sources** once your first workflow proves out. Replicate the Zap for each lead source to automate Salesforce lead follow up across your entire funnel, adjusting delay windows per the table above. 5. **Close the loop in Salesforce** after meetings are booked. Create a separate Zap triggered by SkipUp's "Meeting Booked" webhook to update Salesforce Lead/Contact records (e.g., Lead Status, Opportunity creation). SkipUp does not write to Salesforce directly — this CRM update is your responsibility via Zapier. 6. **Review the complete strategy** for the full detection-to-recovery pipeline: [The Complete Guide to Abandoned Form Lead Recovery](/abandoned-form-lead-recovery). > **Using HubSpot instead?** See [How to Automate Meeting Scheduling from HubSpot Form Submissions](/automate-meeting-scheduling-hubspot-form-submissions) for the HubSpot-specific version of this guide. Start with your highest-volume Web-to-Lead form. Set the delay, build the Event query, connect SkipUp, and recover the leads your team has been losing between assignment and meeting.