AutomationFlowsCRM & Sales › Sync Open House Leads From Signsnaphome to Hubspot with Automated Email…

Sync Open House Leads From Signsnaphome to Hubspot with Automated Email…

Original n8n title: Sync Open House Leads From Signsnaphome to Hubspot with Automated Email Follow-up

ByKaden Reese @kadenreese on n8n.io

Automatically capture and sync every open house visitor from SignSnapHome.com directly into HubSpot with intelligent lead scoring, automated follow-up emails, and comprehensive contact enrichment.

Webhook trigger★★★★☆ complexity16 nodesHubSpotEmail Send
CRM & Sales Trigger: Webhook Nodes: 16 Complexity: ★★★★☆ Added:

This workflow corresponds to n8n.io template #9133 — we link there as the canonical source.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "8451445c-cf7f-43b3-b8e5-6fb377befcab",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -560,
        -576
      ],
      "parameters": {
        "color": 4,
        "width": 346,
        "height": 472,
        "content": "## \ud83d\udccb SETUP INSTRUCTIONS\n\n**Welcome to SignSnap Home \u2192 HubSpot Integration!**\n\n### Quick Setup:\n1. Configure HubSpot OAuth2 credentials in n8n\n2. Configure SMTP credentials for email (optional)\n3. Update the \"from\" email address in Send Email node\n4. Activate this workflow\n5. Copy the webhook URL\n6. Go to **SignSnapHome.com** \u2192 Settings \u2192 Integerations\n7. Paste webhook URL and enable \"Send on each submission\"\n\n\u2705 Done! Open house leads will auto-sync to HubSpot!"
      },
      "typeVersion": 1
    },
    {
      "id": "74585b1c-f23b-4001-b81e-a38291312481",
      "name": "Webhook: SignSnap Home",
      "type": "n8n-nodes-base.webhook",
      "position": [
        -144,
        -224
      ],
      "parameters": {
        "path": "signsnap-hubspot",
        "options": {},
        "httpMethod": "POST"
      },
      "typeVersion": 2.1
    },
    {
      "id": "a3562394-ff96-408f-8e5f-2cfaa5e7dd08",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -192,
        -656
      ],
      "parameters": {
        "color": 4,
        "width": 289,
        "height": 380,
        "content": "## \ud83c\udfaf WEBHOOK RECEIVES DATA\n\n**This webhook receives POST data from SignSnap Home**\n\nURL Format:\n`https://your-n8n.com/webhook/signsnap-hubspot`\n\nAdd this exact URL to your SignSnapHome.com automation settings and turn on auto-send.\n\n\u26a1 Triggers on every open house sign-in!"
      },
      "typeVersion": 1
    },
    {
      "id": "7d256ab8-0b49-4638-b3a3-736fdb921c47",
      "name": "Parse SignSnap Data",
      "type": "n8n-nodes-base.code",
      "position": [
        80,
        -224
      ],
      "parameters": {
        "jsCode": "// Extract and process SignSnap Home data for HubSpot\nconst items = $input.all();\nconst guestData = items[0].json.body;\n\n// Extract core contact information\nconst email = guestData.email || null;\nconst firstName = guestData.first_name || '';\nconst lastName = guestData.last_name || '';\nconst phone = guestData.phone_number || null;\n\n// Extract open house details\nconst propertyAddress = guestData.openHouseTitle || '';\nconst visitDate = guestData.submissionTimestamp || new Date().toISOString();\nconst hasAgent = guestData.are_you_currently_working_with_an_agent || 'Not specified';\n\n// Optional fields (may not exist in all forms)\nconst rating = guestData.what_did_you_rate_the_house || null;\nconst buyerAgreement = guestData.do_you_have_a_signed_buyer_agreement || null;\n\n// Separate standard fields from custom fields\nconst standardFields = [\n  'openHouseTitle', 'openHouseType', 'submissionTimestamp',\n  'guestPhotoUrl', 'first_name', 'last_name', 'phone_number',\n  'email', 'are_you_currently_working_with_an_agent',\n  'what_did_you_rate_the_house', 'do_you_have_a_signed_buyer_agreement',\n  'webhookUrl', 'executionMode'\n];\n\nconst customFields = {};\nfor (const [key, value] of Object.entries(guestData)) {\n  if (!standardFields.includes(key) && value !== null && value !== undefined && value !== '') {\n    customFields[key] = value;\n  }\n}\n\n// Build custom fields text for notes\nconst customFieldsText = Object.entries(customFields)\n  .map(([key, value]) => {\n    const formattedKey = key.replace(/_/g, ' ')\n      .split(' ')\n      .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n      .join(' ');\n    return `${formattedKey}: ${value}`;\n  })\n  .join('\\n');\n\n// Calculate lead score (0-100)\nlet leadScore = 50; // Base score\n\nif (hasAgent === 'No' || hasAgent === 'no') {\n  leadScore += 30; // Hot lead - no agent\n}\n\nif (rating) {\n  const ratingNum = parseInt(rating);\n  if (ratingNum >= 4) leadScore += 20; // High rating\n  else if (ratingNum <= 2) leadScore -= 20; // Low rating\n}\n\nif (buyerAgreement === 'No' || buyerAgreement === 'no') {\n  leadScore += 10; // No agreement = more available\n}\n\nleadScore = Math.max(0, Math.min(100, leadScore)); // Clamp 0-100\n\n// Determine lead status\nlet leadStatus = 'OPEN';\nif (leadScore >= 70) leadStatus = 'HOT';\nelse if (leadScore >= 50) leadStatus = 'WARM';\nelse if (leadScore < 40) leadStatus = 'COLD';\n\n// Build comprehensive notes for HubSpot\nconst notes = `\ud83c\udfe0 Open House Visit\\n\\nProperty: ${propertyAddress}\\nVisit Date: ${new Date(visitDate).toLocaleString('en-US', { dateStyle: 'full', timeStyle: 'short' })}\\nHas Agent: ${hasAgent}${rating ? `\\nProperty Rating: ${rating}/5` : ''}${buyerAgreement ? `\\nBuyer Agreement: ${buyerAgreement}` : ''}\\n\\nLead Score: ${leadScore}/100\\nLead Status: ${leadStatus}${customFieldsText ? `\\n\\n--- Additional Information ---\\n${customFieldsText}` : ''}\\n\\n\ud83d\udccd Source: SignSnap Home Open House Sign-In`;\n\nreturn [{\n  json: {\n    // HubSpot contact fields\n    email: email,\n    firstname: firstName,\n    lastname: lastName,\n    phone: phone,\n    \n    // Property & visit details\n    propertyAddress: propertyAddress,\n    visitDate: visitDate,\n    hasAgent: hasAgent,\n    rating: rating,\n    \n    // Scoring\n    leadScore: leadScore,\n    leadStatus: leadStatus,\n    \n    // Notes to add to contact\n    notes: notes,\n    \n    // Lifecycle stage\n    lifecyclestage: 'lead',\n    \n    // Original data for reference\n    _raw: guestData\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "bae80e9f-b4fe-4c0e-a945-a1d2b5937e8e",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        144,
        -672
      ],
      "parameters": {
        "color": 4,
        "width": 303,
        "height": 373,
        "content": "## \u2699\ufe0f DATA PROCESSING\n\n**Extracts & enriches all data:**\n\n\u2705 Contact info (name, email, phone)\n\u2705 Property & visit details\n\u2705 Custom form fields (automatic!)\n\u2705 Lead score calculation (0-100)\n\u2705 Lead status (HOT/WARM/COLD)\n\n**Lead Scoring:**\n- Base: 50 points\n- No agent: +30\n- Rating 4-5: +20\n- Rating 1-2: -20\n- No buyer agreement: +10"
      },
      "typeVersion": 1
    },
    {
      "id": "9f28800b-f6fd-4ca8-b41f-43dcc7fde6f9",
      "name": "Has Email?",
      "type": "n8n-nodes-base.if",
      "position": [
        304,
        -224
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "email-check",
              "operator": {
                "type": "string",
                "operation": "notEmpty"
              },
              "leftValue": "={{ $json.email }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "1c5ca9b2-cba1-4709-a02c-9df049310f4d",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        480,
        -656
      ],
      "parameters": {
        "color": 4,
        "width": 262,
        "height": 248,
        "content": "## \u2709\ufe0f EMAIL REQUIRED\n\n**HubSpot requires email to create/update contacts**\n\nIf no email:\n\u2192 Lead logged to error output\n\u2192 Manual follow-up needed\n\n\ud83d\udca1 **TIP:** Make email required in SignSnap form for 100% sync rate"
      },
      "typeVersion": 1
    },
    {
      "id": "fdebbdbb-0116-4f6a-92ea-3fdef2fbcded",
      "name": "Create/Update HubSpot Contact",
      "type": "n8n-nodes-base.hubspot",
      "position": [
        528,
        -352
      ],
      "parameters": {
        "email": "={{ $json.email }}",
        "options": {},
        "authentication": "appToken",
        "additionalFields": {
          "lastName": "={{ $json.lastname }}",
          "firstName": "={{ $json.firstname }}",
          "phoneNumber": "={{ $('Parse SignSnap Data').item.json._raw.phone_number }}",
          "membershipNote": "={{ $('Parse SignSnap Data').item.json.notes }}"
        }
      },
      "credentials": {
        "hubspotAppToken": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "fbc3e0a7-97d3-4822-b57a-6c8f8b279eba",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        768,
        -496
      ],
      "parameters": {
        "color": 5,
        "width": 262,
        "height": 300,
        "content": "## \ud83c\udfaf HUBSPOT\n\nIf contact exists (by email):\n\u2192 Updates information\n\u2192 Adds new visit to timeline\n\u2192 Updates lead score\n\nIf contact is new:\n\u2192 Creates new contact\n\u2192 Sets all properties\n\u2192 Marks as 'Lead'\n\n\u2728 Prevents duplicates!"
      },
      "typeVersion": 1
    },
    {
      "id": "25b03343-3dfe-46ab-8860-b36dea6fbebf",
      "name": "Send Thank You Email",
      "type": "n8n-nodes-base.emailSend",
      "position": [
        528,
        -160
      ],
      "parameters": {
        "html": "=Hi {{ $('Parse SignSnap Data').item.json.firstname }}!\n\nThank you for visiting {{ $('Parse SignSnap Data').item.json.propertyAddress }} today.\n\n{{ $('Parse SignSnap Data').item.json.hasAgent === 'No' ? \"Our team would love to help you on your home buying journey! We specialize in this area and can provide exclusive listings and personalized service. We're here to make finding your dream home easy and stress-free.\\n\\n\" : \"\" }}If you have any questions about this property or would like to schedule another viewing, please don't hesitate to reply to this email.\n\nBest regards,\nYour Real Estate Team",
        "options": {},
        "subject": "=Thank You for Visiting {{ $('Parse SignSnap Data').item.json.propertyAddress }}!",
        "toEmail": "={{ $('Parse SignSnap Data').item.json.email }}",
        "fromEmail": "user@example.com"
      },
      "typeVersion": 2.1
    },
    {
      "id": "b714c9f3-c953-4ecb-9456-3f2e346b31ef",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        208,
        -48
      ],
      "parameters": {
        "color": 5,
        "width": 262,
        "height": 268,
        "content": "## \ud83d\udce7 AUTO-FOLLOW UP\n\n**Sends personalized thank you email**\n\nDifferent messages:\n- **No Agent:** Offers consultation\n- **Has Agent:** Friendly follow-up\n\n\ud83d\udd27 **Setup:**\n1. Configure SMTP credentials\n2. Update FROM email address\n3. Customize footer"
      },
      "typeVersion": 1
    },
    {
      "id": "61c0140b-7043-4f12-9498-6bf3d850c37b",
      "name": "Log Missing Email",
      "type": "n8n-nodes-base.set",
      "position": [
        528,
        16
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "error-message",
              "name": "error_reason",
              "type": "string",
              "value": "No email address provided"
            },
            {
              "id": "guest-name",
              "name": "guest_name",
              "type": "string",
              "value": "={{ $json.firstname }} {{ $json.lastname }}"
            },
            {
              "id": "property",
              "name": "property",
              "type": "string",
              "value": "={{ $json.propertyAddress }}"
            },
            {
              "id": "phone",
              "name": "phone",
              "type": "string",
              "value": "={{ $json.phone }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "098055b4-f2e3-4376-ad9d-cc7f2ab1ff26",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        512,
        176
      ],
      "parameters": {
        "color": 6,
        "width": 262,
        "height": 231,
        "content": "## \u26a0\ufe0f NO EMAIL HANDLING\n\n**Guest didn't provide email**\n\nOptions:\n\u2192 Connect to Google Sheets\n\u2192 Send alert to team\n\u2192 Manual follow-up via phone\n\n\ud83d\udca1 Make email required in SignSnap to prevent this!"
      },
      "typeVersion": 1
    },
    {
      "id": "4c31c975-05e6-4bed-8e9f-96d5e8c426c9",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        864,
        -112
      ],
      "parameters": {
        "color": 3,
        "width": 361,
        "height": 670,
        "content": "## \ud83d\udcca CUSTOM HUBSPOT PROPERTIES (OPTIONAL)\n\n**Create these in HubSpot for enhanced tracking:**\n\nGo to: **Settings \u2192 Properties \u2192 Create Property**\n\n**Recommended Custom Properties:**\n\n1. `last_open_house_property` (Text)\n   - Label: Last Open House Property\n\n2. `last_open_house_date` (Date)\n   - Label: Last Open House Visit\n\n3. `has_real_estate_agent` (Dropdown)\n   - Options: Yes, No, Not specified\n\n4. `property_interest_rating` (Number)\n   - Label: Property Rating (1-5)\n\n5. `lead_score` (Number)\n   - Label: Lead Score\n\n6. `lead_status` (Dropdown)\n   - Options: HOT, WARM, COLD, OPEN\n\n**OR** just use standard fields + notes!\nThe workflow works either way."
      },
      "typeVersion": 1
    },
    {
      "id": "3d3a1a95-f7ba-4e1d-9304-524604993896",
      "name": "Sticky Note8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -544,
        -16
      ],
      "parameters": {
        "color": 7,
        "width": 349,
        "height": 734,
        "content": "## \ud83d\udca1 PRO TIPS & ENHANCEMENTS\n\n**Optimization Ideas:**\n\n**1. Auto-Assign to Agent**\n- Match property to agent territory\n- Auto-assign contact owner in HubSpot\n\n**2. Create Deals Automatically**\n- Create deal for HOT leads (score \u226570)\n- Link to property and contact\n- Set deal stage based on score\n\n**3. Add to Lists**\n- Create HubSpot list per property\n- Auto-segment by lead status\n- Use for targeted campaigns\n\n**4. Trigger HubSpot Workflows**\n- Send automated nurture sequence\n- Schedule follow-up tasks\n- Assign to sales rep\n\n**5. Add Photo Attachment**\n- Upload guest photo to HubSpot Files\n- Attach to contact record\n- Requires additional node\n\n**6. SMS Follow-up**\n- Add Twilio node for instant SMS\n- Parallel to email\n- Higher engagement rate"
      },
      "typeVersion": 1
    },
    {
      "id": "2b6fca52-ae4b-4788-8283-4997cd4d2757",
      "name": "Sticky Note9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -160,
        -16
      ],
      "parameters": {
        "color": 6,
        "width": 333,
        "height": 702,
        "content": "## \ud83d\udd27 TROUBLESHOOTING\n\n**Common Issues:**\n\n\ud83d\udd34 **\"Invalid email\"**\n\u2192 Check email format in SignSnap\n\u2192 Ensure validation is enabled\n\n\ud83d\udd34 **\"Property doesn't exist\"**\n\u2192 Create custom property in HubSpot\n\u2192 Or remove from node config\n\n\ud83d\udd34 **\"Authentication failed\"**\n\u2192 Reconnect HubSpot OAuth2\n\u2192 Check token expiration\n\n\ud83d\udd34 **\"Contact not in HubSpot\"**\n\u2192 Check execution history\n\u2192 Verify email was provided\n\u2192 Search \"All contacts\" view\n\n\ud83d\udd34 **\"Duplicate contacts\"**\n\u2192 HubSpot auto-matches by email\n\u2192 Check for typos in emails\n\n\ud83d\udd34 **\"Email not sending\"**\n\u2192 Verify SMTP credentials\n\u2192 Check FROM email is valid\n\u2192 Test SMTP connection\n\n**Need help?**\n\u2192 n8n community forum\n\u2192 HubSpot API docs\n\u2192 SignSnap support"
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "Has Email?": {
      "main": [
        [
          {
            "node": "Create/Update HubSpot Contact",
            "type": "main",
            "index": 0
          },
          {
            "node": "Send Thank You Email",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Log Missing Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse SignSnap Data": {
      "main": [
        [
          {
            "node": "Has Email?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook: SignSnap Home": {
      "main": [
        [
          {
            "node": "Parse SignSnap Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

Automatically capture and sync every open house visitor from SignSnapHome.com directly into HubSpot with intelligent lead scoring, automated follow-up emails, and comprehensive contact enrichment.

Source: https://n8n.io/workflows/9133/ — original creator credit. Request a take-down →

More CRM & Sales workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

CRM & Sales

This workflow is designed for B2B/SaaS teams who want to secure renewals before it’s too late.

HTTP Request, Zendesk, Postgres +7
CRM & Sales

This n8n template automatically enriches company records in your CRM using CompanyEnrich and keeps your data up to date without manual work.

HTTP Request, HubSpot, Salesforce
CRM & Sales

This workflow is built for sales professionals, recruiters, founders, and marketers who want to automatically capture LinkedIn profile visitors and convert them into actionable CRM leads. Perfect for

@Apify/N8N Nodes Apify, HubSpot, HTTP Request
CRM & Sales

Sync Local Falcon rankings to HubSpot company records. Uses @local-falcon/n8n-nodes-localfalcon, hubspot. Scheduled trigger; 12 nodes.

@Local Falcon/N8N Nodes Localfalcon, HubSpot
CRM & Sales

Automatically syncs your Zoho contacts with Beex Contact Center by handling creation and update events in real time. Trigger: The workflow is activated when a contact is created or updated in Zoho CRM

N8N Nodes Beex