{
  "name": "DEMO - Harbor & Hearth \u00b7 Samira's Quote Desk",
  "meta": {
    "templateCredsSetupCompleted": false,
    "instanceId": "demo-fictional-sample-content-only"
  },
  "tags": [
    {
      "name": "DEMO - fictional, sample content",
      "createdAt": "2026-10-29T00:00:00.000Z",
      "updatedAt": "2026-10-29T00:00:00.000Z"
    }
  ],
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "harbor-hearth-lead",
        "responseMode": "onReceived",
        "options": {}
      },
      "id": "webhook-lead-form",
      "name": "Webhook - Web Form Lead",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        240,
        300
      ],
      "webhookId": "demo-harbor-hearth-lead",
      "notes": "DEMO - fictional, sample content. Quote form for Harbor & Hearth (Samira Okonkwo, Red Hook). Body: name, email, phone, event_date, guest_count, message, event_type (optional)."
    },
    {
      "parameters": {
        "functionCode": "// DEMO - fictional, sample content\n// Normalize and validate inbound lead payload\nconst body = items[0].json.body || items[0].json;\nconst name = (body.name || '').toString().trim();\nconst email = (body.email || '').toString().trim().toLowerCase();\nconst phone = (body.phone || '').toString().trim();\nconst eventDate = (body.event_date || body.eventDate || '').toString().trim();\nconst guestCount = (body.guest_count || body.guestCount || '').toString().trim();\nconst message = (body.message || '').toString().trim();\nconst receivedAt = new Date().toISOString();\n\nif (!name || !email) {\n  throw new Error('DEMO validation: name and email are required');\n}\n\nreturn [{\n  json: {\n    name,\n    email,\n    phone,\n    event_date: eventDate,\n    guest_count: guestCount,\n    message,\n    source: 'website_quote_form',\n    status: 'new',\n    received_at: receivedAt,\n    follow_up_at: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString()\n  }\n}];"
      },
      "id": "normalize-lead",
      "name": "Normalize Lead Data",
      "type": "n8n-nodes-base.function",
      "typeVersion": 1,
      "position": [
        460,
        300
      ],
      "notes": "DEMO - fictional, sample content. Cleans fields and sets follow_up_at = now + 24h."
    },
    {
      "parameters": {
        "operation": "append",
        "documentId": {
          "__rl": true,
          "value": "DEMO_GOOGLE_SHEET_ID_REPLACE_ME",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "Leads",
          "mode": "name"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "received_at": "={{$json.received_at}}",
            "name": "={{$json.name}}",
            "email": "={{$json.email}}",
            "phone": "={{$json.phone}}",
            "event_date": "={{$json.event_date}}",
            "guest_count": "={{$json.guest_count}}",
            "message": "={{$json.message}}",
            "source": "={{$json.source}}",
            "status": "={{$json.status}}",
            "follow_up_at": "={{$json.follow_up_at}}"
          }
        },
        "options": {}
      },
      "id": "append-google-sheet",
      "name": "Append to Google Sheet",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.5,
      "position": [
        680,
        200
      ],
      "notes": "DEMO - fictional, sample content. Replace DEMO_GOOGLE_SHEET_ID_REPLACE_ME with your Sheet ID. Columns: received_at, name, email, phone, event_date, guest_count, message, source, status, follow_up_at."
    },
    {
      "parameters": {
        "operation": "create",
        "base": {
          "__rl": true,
          "value": "DEMO_AIRTABLE_BASE_ID",
          "mode": "id"
        },
        "table": {
          "__rl": true,
          "value": "Leads",
          "mode": "name"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "Name": "={{$json.name}}",
            "Email": "={{$json.email}}",
            "Phone": "={{$json.phone}}",
            "Event Date": "={{$json.event_date}}",
            "Guest Count": "={{$json.guest_count}}",
            "Message": "={{$json.message}}",
            "Source": "={{$json.source}}",
            "Status": "={{$json.status}}",
            "Received At": "={{$json.received_at}}",
            "Follow Up At": "={{$json.follow_up_at}}"
          }
        }
      },
      "id": "create-airtable-row",
      "name": "Create Airtable Row (optional alt)",
      "type": "n8n-nodes-base.airtable",
      "typeVersion": 2.1,
      "position": [
        680,
        400
      ],
      "disabled": true,
      "notes": "DEMO - fictional, sample content. OPTIONAL alternative to Google Sheets. Disabled by default \u2014 enable and connect credentials if you prefer Airtable."
    },
    {
      "parameters": {
        "fromEmail": "quotes@example.com",
        "toEmail": "={{$json.email}}",
        "subject": "Got it \u2014 Harbor & Hearth is on your event (from Samira)",
        "emailType": "html",
        "html": "=<div style=\"font-family:Georgia,serif;font-size:16px;line-height:1.5;color:#2A1F18;max-width:560px\">\n<p style=\"margin:0 0 12px;font-size:12px;letter-spacing:.08em;text-transform:uppercase;color:#8B4513\">DEMO \u2014 fictional, sample content</p>\n<p>Hi {{$json.name}},</p>\n<p>Samira here \u2014 chef-owner at <strong>Harbor &amp; Hearth</strong> in Red Hook. Your quote note just landed on my desk{{$json.event_date ? ' for ' + $json.event_date : ''}}{{$json.guest_count ? ' (' + $json.guest_count + ' guests)' : ''}}, and I\u2019m already thinking about the table.</p>\n<p>While I pull a custom menu, peek at a few house favorites: <em>smoked paprika short ribs</em>, <em>charred citrus halibut</em>, <em>brown-butter squash with sage</em>, and our <em>olive-oil cake with sea salt</em>. Happy to lean vegetarian, pescatarian, or \u201cfeed a hungry loft full of designers.\u201d</p>\n<p>I\u2019ll reply personally within one business day with timing, tasting notes, and a rough range. Reply to this email anytime \u2014 dietary needs, venue constraints, playlist vibes, all welcome.</p>\n<p style=\"margin-top:20px\">Warmly,<br/><strong>Samira Okonkwo</strong><br/>Harbor &amp; Hearth Catering \u00b7 Red Hook, Brooklyn<br/><span style=\"font-size:12px;color:#6B5B52\">quotes@example.com \u00b7 555-0177</span></p>\n<p style=\"font-size:11px;color:#8A7A70;margin-top:24px;border-top:1px solid #E8DFD6;padding-top:10px\">DEMO - fictional, sample content. No real catering business. Sample auto-reply only.</p>\n</div>"
      },
      "id": "instant-email-reply",
      "name": "Instant Email Reply to Lead",
      "type": "n8n-nodes-base.emailSend",
      "typeVersion": 2.1,
      "position": [
        920,
        200
      ],
      "notes": "DEMO - fictional, sample content. Warm instant reply in Samira's voice with sample menu hooks."
    },
    {
      "parameters": {
        "resource": "sms",
        "operation": "send",
        "from": "+15550100",
        "to": "={{$json.phone}}",
        "message": "=Hi {{$json.name}} \u2014 Samira at Harbor & Hearth got your quote. Thinking short ribs & olive-oil cake already \ud83c\udf7d\ufe0f I'll email within 1 business day. Reply STOP to opt out. (DEMO - fictional)",
        "options": {}
      },
      "id": "instant-sms-reply",
      "name": "Instant SMS Reply (Twilio placeholder)",
      "type": "n8n-nodes-base.twilio",
      "typeVersion": 1,
      "position": [
        920,
        400
      ],
      "disabled": true,
      "notes": "DEMO - fictional, sample content. Warm SMS in Samira's voice. Disabled by default. Needs consent + Twilio creds."
    },
    {
      "parameters": {
        "channel": "#leads-demo",
        "text": "=:bell: *New quote for the Red Hook kitchen* (DEMO - fictional, sample content)\n*Who:* {{$json.name}}\n*Email:* {{$json.email}}\n*Phone:* {{$json.phone || 'n/a'}}\n*When:* {{$json.event_date || 'date TBD'}}\n*Guests:* {{$json.guest_count || 'n/a'}}\n*Note:* {{$json.message || '(no message \u2014 call them)'}}\n*Received:* {{$json.received_at}}\n_Samira: reply with a tasting sketch within 1 business day._",
        "otherOptions": {}
      },
      "id": "slack-alert-owner",
      "name": "Slack Alert to Owner",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 2.2,
      "position": [
        1140,
        200
      ],
      "notes": "DEMO - fictional, sample content. Posts a new-lead alert to a Slack channel (e.g. #leads)."
    },
    {
      "parameters": {
        "fromEmail": "quotes@example.com",
        "toEmail": "owner@example.com",
        "subject": "=New quote: {{$json.name}} wants a Harbor & Hearth table",
        "emailType": "text",
        "text": "=DEMO - fictional, sample content\n\nSamira \u2014 new website quote just hit the Sheet.\n\nName: {{$json.name}}\nEmail: {{$json.email}}\nPhone: {{$json.phone}}\nEvent date: {{$json.event_date}}\nGuests: {{$json.guest_count}}\nMessage: {{$json.message}}\nReceived: {{$json.received_at}}\nFollow-up scheduled: {{$json.follow_up_at}}\n\nSuggested reply angle: ask about venue (loft / rooftop / gallery / office), dietary mix, and whether they want the short-rib board or a lighter fish-forward spread."
      },
      "id": "email-alert-owner",
      "name": "Email Alert to Owner",
      "type": "n8n-nodes-base.emailSend",
      "typeVersion": 2.1,
      "position": [
        1140,
        400
      ],
      "notes": "DEMO - fictional, sample content. Parallel owner email alert (use if Slack is not preferred)."
    },
    {
      "parameters": {
        "amount": 24,
        "unit": "hours"
      },
      "id": "wait-24h",
      "name": "Wait 24 Hours",
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1.1,
      "position": [
        1360,
        300
      ],
      "webhookId": "demo-wait-24h",
      "notes": "DEMO - fictional, sample content. Pauses the execution for 24 hours before the follow-up email."
    },
    {
      "parameters": {
        "fromEmail": "quotes@example.com",
        "toEmail": "={{$json.email}}",
        "subject": "Still dreaming up the menu? \u2014 Samira at Harbor & Hearth",
        "emailType": "html",
        "html": "=<div style=\"font-family:Georgia,serif;font-size:16px;line-height:1.5;color:#2A1F18;max-width:560px\">\n<p style=\"margin:0 0 12px;font-size:12px;letter-spacing:.08em;text-transform:uppercase;color:#8B4513\">DEMO \u2014 fictional, sample content</p>\n<p>Hi {{$json.name}},</p>\n<p>Just circling back \u2014 I know event weeks get loud. If you\u2019re still planning{{$json.event_date ? ' for ' + $json.event_date : ''}}, I\u2019m happy to sketch a two-option tasting: one cozy (short ribs + squash) and one bright (halibut + citrus greens).</p>\n<p>Tell me your venue vibe (Gowanus loft, Williamsburg rooftop, Chelsea gallery, FiDi conference room \u2014 we\u2019ve done the fictional versions of all of them) and any \u201cmust serve / please never serve\u201d notes. I\u2019ll send a sample menu the same day I hear back.</p>\n<p style=\"margin-top:20px\">On your side whenever you\u2019re ready,<br/><strong>Samira</strong><br/>Harbor &amp; Hearth \u00b7 Red Hook</p>\n<p style=\"font-size:11px;color:#8A7A70;margin-top:24px;border-top:1px solid #E8DFD6;padding-top:10px\">DEMO - fictional, sample content. Sample 24-hour follow-up only.</p>\n</div>"
      },
      "id": "followup-email-24h",
      "name": "Follow-up Email After 24h",
      "type": "n8n-nodes-base.emailSend",
      "typeVersion": 2.1,
      "position": [
        1580,
        300
      ],
      "notes": "DEMO - fictional, sample content. Warm 24h follow-up with menu forks and venue prompts."
    }
  ],
  "connections": {
    "Webhook - Web Form Lead": {
      "main": [
        [
          {
            "node": "Normalize Lead Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Normalize Lead Data": {
      "main": [
        [
          {
            "node": "Append to Google Sheet",
            "type": "main",
            "index": 0
          },
          {
            "node": "Create Airtable Row (optional alt)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Append to Google Sheet": {
      "main": [
        [
          {
            "node": "Instant Email Reply to Lead",
            "type": "main",
            "index": 0
          },
          {
            "node": "Instant SMS Reply (Twilio placeholder)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Instant Email Reply to Lead": {
      "main": [
        [
          {
            "node": "Slack Alert to Owner",
            "type": "main",
            "index": 0
          },
          {
            "node": "Email Alert to Owner",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Slack Alert to Owner": {
      "main": [
        [
          {
            "node": "Wait 24 Hours",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Email Alert to Owner": {
      "main": [
        [
          {
            "node": "Wait 24 Hours",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait 24 Hours": {
      "main": [
        [
          {
            "node": "Follow-up Email After 24h",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1",
    "callerPolicy": "workflowsFromSameOwner",
    "errorWorkflow": ""
  },
  "versionId": "demo-v1-fictional",
  "pinData": {},
  "staticData": null
}