Initial commit: houses.flowautomate.ai lead generation website
Static landing page with Express backend for lead capture. Navy/Gold branding, mobile-responsive, SQLite storage, Mailcow SMTP notifications, rate limiting, TCPA compliance. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
7
.dockerignore
Normal file
7
.dockerignore
Normal file
@@ -0,0 +1,7 @@
|
||||
node_modules
|
||||
.git
|
||||
.gitignore
|
||||
data/*.db
|
||||
data/*.db-wal
|
||||
data/*.db-shm
|
||||
*.md
|
||||
5
.gitignore
vendored
Normal file
5
.gitignore
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
node_modules/
|
||||
data/*.db
|
||||
data/*.db-wal
|
||||
data/*.db-shm
|
||||
.env
|
||||
7
Dockerfile
Normal file
7
Dockerfile
Normal file
@@ -0,0 +1,7 @@
|
||||
FROM node:20-alpine
|
||||
WORKDIR /app
|
||||
COPY package*.json ./
|
||||
RUN npm ci --production
|
||||
COPY . .
|
||||
EXPOSE 3000
|
||||
CMD ["node", "server.js"]
|
||||
0
data/.gitkeep
Normal file
0
data/.gitkeep
Normal file
1289
package-lock.json
generated
Normal file
1289
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
20
package.json
Normal file
20
package.json
Normal file
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"name": "houses-flowautomate",
|
||||
"version": "1.0.0",
|
||||
"description": "Lead generation website for Flowautomate LLC virtual wholesaling",
|
||||
"main": "server.js",
|
||||
"scripts": {
|
||||
"start": "node server.js",
|
||||
"dev": "node --watch server.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"better-sqlite3": "^11.7.0",
|
||||
"express": "^4.21.0",
|
||||
"express-rate-limit": "^7.4.0",
|
||||
"helmet": "^8.0.0",
|
||||
"nodemailer": "^6.9.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=20"
|
||||
}
|
||||
}
|
||||
458
public/css/style.css
Normal file
458
public/css/style.css
Normal file
@@ -0,0 +1,458 @@
|
||||
/* === Reset & Base === */
|
||||
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
||||
html { scroll-behavior: smooth; }
|
||||
body {
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
color: #333;
|
||||
background: #fff;
|
||||
line-height: 1.6;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
}
|
||||
a { color: #C9A94E; text-decoration: none; }
|
||||
a:hover { text-decoration: underline; }
|
||||
img { max-width: 100%; height: auto; }
|
||||
|
||||
/* === Layout === */
|
||||
.container { max-width: 1120px; margin: 0 auto; padding: 0 20px; }
|
||||
.section { padding: 64px 0; }
|
||||
.section--navy { background: #1B3A5C; color: #fff; }
|
||||
.section--light { background: #F8F9FA; }
|
||||
|
||||
/* === Header === */
|
||||
.header {
|
||||
position: sticky;
|
||||
top: 0;
|
||||
z-index: 100;
|
||||
background: #fff;
|
||||
border-bottom: 1px solid #e8e8e8;
|
||||
padding: 12px 0;
|
||||
}
|
||||
.header .container {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 16px;
|
||||
}
|
||||
.header__logo { height: 40px; width: auto; }
|
||||
.header__right { display: flex; align-items: center; gap: 16px; }
|
||||
.header__phone {
|
||||
color: #1B3A5C;
|
||||
font-weight: 700;
|
||||
font-size: 15px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.header__phone:hover { text-decoration: none; color: #C9A94E; }
|
||||
|
||||
/* === Buttons === */
|
||||
.btn {
|
||||
display: inline-block;
|
||||
background: #C9A94E;
|
||||
color: #fff;
|
||||
font-weight: 700;
|
||||
font-size: 15px;
|
||||
padding: 12px 28px;
|
||||
border: none;
|
||||
border-radius: 6px;
|
||||
cursor: pointer;
|
||||
transition: background 0.2s, transform 0.1s;
|
||||
text-align: center;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.btn:hover { background: #b8982f; text-decoration: none; transform: translateY(-1px); }
|
||||
.btn:active { transform: translateY(0); }
|
||||
.btn--lg { padding: 16px 36px; font-size: 17px; }
|
||||
.btn--outline {
|
||||
background: transparent;
|
||||
border: 2px solid #C9A94E;
|
||||
color: #C9A94E;
|
||||
}
|
||||
.btn--outline:hover { background: #C9A94E; color: #fff; }
|
||||
.btn--block { display: block; width: 100%; }
|
||||
|
||||
/* === Hero === */
|
||||
.hero {
|
||||
background: linear-gradient(135deg, #1B3A5C 0%, #0f2540 100%);
|
||||
color: #fff;
|
||||
padding: 72px 0 80px;
|
||||
}
|
||||
.hero .container {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 48px;
|
||||
align-items: center;
|
||||
}
|
||||
.hero__content h1 {
|
||||
font-size: 42px;
|
||||
font-weight: 800;
|
||||
line-height: 1.15;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
.hero__content h1 span { color: #C9A94E; }
|
||||
.hero__content p {
|
||||
font-size: 18px;
|
||||
color: #c8d6e5;
|
||||
margin-bottom: 24px;
|
||||
line-height: 1.7;
|
||||
}
|
||||
.hero__badges {
|
||||
display: flex;
|
||||
gap: 24px;
|
||||
margin-top: 8px;
|
||||
}
|
||||
.hero__badge {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
font-size: 13px;
|
||||
color: #a0b4c8;
|
||||
}
|
||||
.hero__badge svg { width: 16px; height: 16px; fill: #C9A94E; flex-shrink: 0; }
|
||||
|
||||
/* === Lead Form === */
|
||||
.lead-form {
|
||||
background: #fff;
|
||||
border-radius: 12px;
|
||||
padding: 32px;
|
||||
box-shadow: 0 8px 32px rgba(0,0,0,0.2);
|
||||
}
|
||||
.lead-form h2 {
|
||||
color: #1B3A5C;
|
||||
font-size: 22px;
|
||||
margin-bottom: 20px;
|
||||
text-align: center;
|
||||
}
|
||||
.form-group { margin-bottom: 14px; }
|
||||
.form-group label {
|
||||
display: block;
|
||||
font-size: 13px;
|
||||
font-weight: 600;
|
||||
color: #1B3A5C;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
.form-group input,
|
||||
.form-group select {
|
||||
width: 100%;
|
||||
padding: 11px 14px;
|
||||
font-size: 15px;
|
||||
border: 1px solid #d0d5dd;
|
||||
border-radius: 6px;
|
||||
font-family: inherit;
|
||||
background: #fff;
|
||||
transition: border-color 0.2s;
|
||||
}
|
||||
.form-group input:focus,
|
||||
.form-group select:focus {
|
||||
outline: none;
|
||||
border-color: #C9A94E;
|
||||
box-shadow: 0 0 0 3px rgba(201,169,78,0.15);
|
||||
}
|
||||
.form-group input.error,
|
||||
.form-group select.error {
|
||||
border-color: #e74c3c;
|
||||
}
|
||||
.form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
|
||||
.form-consent {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
gap: 8px;
|
||||
margin: 16px 0;
|
||||
font-size: 12px;
|
||||
color: #6C757D;
|
||||
line-height: 1.5;
|
||||
}
|
||||
.form-consent input[type="checkbox"] {
|
||||
margin-top: 2px;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
flex-shrink: 0;
|
||||
accent-color: #C9A94E;
|
||||
}
|
||||
.form-note {
|
||||
text-align: center;
|
||||
font-size: 13px;
|
||||
color: #6C757D;
|
||||
margin-top: 12px;
|
||||
}
|
||||
.form-note svg { width: 14px; height: 14px; fill: #C9A94E; vertical-align: -2px; margin-right: 4px; }
|
||||
.form-success {
|
||||
text-align: center;
|
||||
padding: 24px 0;
|
||||
display: none;
|
||||
}
|
||||
.form-success svg { width: 48px; height: 48px; fill: #27ae60; }
|
||||
.form-success h3 { color: #1B3A5C; margin: 12px 0 8px; font-size: 20px; }
|
||||
.form-success p { color: #6C757D; font-size: 14px; }
|
||||
.form-error {
|
||||
background: #fdf0ef;
|
||||
color: #e74c3c;
|
||||
padding: 10px 14px;
|
||||
border-radius: 6px;
|
||||
font-size: 13px;
|
||||
margin-bottom: 14px;
|
||||
display: none;
|
||||
}
|
||||
.hp-field { position: absolute; left: -9999px; }
|
||||
|
||||
/* === Trust Bar === */
|
||||
.trust-bar {
|
||||
background: #fff;
|
||||
border-bottom: 1px solid #e8e8e8;
|
||||
padding: 20px 0;
|
||||
}
|
||||
.trust-bar .container {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
gap: 40px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.trust-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
color: #1B3A5C;
|
||||
}
|
||||
.trust-item svg { width: 20px; height: 20px; fill: #C9A94E; flex-shrink: 0; }
|
||||
|
||||
/* === Steps === */
|
||||
.steps { text-align: center; }
|
||||
.steps h2 { font-size: 32px; color: #1B3A5C; margin-bottom: 48px; }
|
||||
.steps__grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
gap: 36px;
|
||||
}
|
||||
.step { padding: 0 12px; }
|
||||
.step__number {
|
||||
width: 56px;
|
||||
height: 56px;
|
||||
border-radius: 50%;
|
||||
background: #C9A94E;
|
||||
color: #fff;
|
||||
font-size: 24px;
|
||||
font-weight: 800;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
margin: 0 auto 16px;
|
||||
}
|
||||
.step h3 { font-size: 18px; color: #1B3A5C; margin-bottom: 8px; }
|
||||
.step p { font-size: 14px; color: #6C757D; }
|
||||
|
||||
/* === Benefits Cards === */
|
||||
.benefits h2 { font-size: 32px; color: #1B3A5C; text-align: center; margin-bottom: 48px; }
|
||||
.benefits__grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
gap: 24px;
|
||||
}
|
||||
.benefit-card {
|
||||
background: #fff;
|
||||
border-radius: 12px;
|
||||
padding: 28px 24px;
|
||||
box-shadow: 0 2px 12px rgba(0,0,0,0.06);
|
||||
transition: transform 0.2s, box-shadow 0.2s;
|
||||
}
|
||||
.benefit-card:hover { transform: translateY(-4px); box-shadow: 0 8px 24px rgba(0,0,0,0.1); }
|
||||
.benefit-card__icon {
|
||||
width: 44px;
|
||||
height: 44px;
|
||||
background: rgba(201,169,78,0.12);
|
||||
border-radius: 10px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
margin-bottom: 14px;
|
||||
}
|
||||
.benefit-card__icon svg { width: 22px; height: 22px; fill: #C9A94E; }
|
||||
.benefit-card h3 { font-size: 17px; color: #1B3A5C; margin-bottom: 6px; }
|
||||
.benefit-card p { font-size: 14px; color: #6C757D; line-height: 1.6; }
|
||||
|
||||
/* === Situations === */
|
||||
.situations h2 { font-size: 32px; margin-bottom: 12px; }
|
||||
.situations > .container > p { color: #c8d6e5; font-size: 16px; margin-bottom: 36px; text-align: center; }
|
||||
.situations h2 { text-align: center; }
|
||||
.situations__grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
gap: 16px;
|
||||
max-width: 700px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
.situation-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
font-size: 15px;
|
||||
padding: 12px 16px;
|
||||
background: rgba(255,255,255,0.08);
|
||||
border-radius: 8px;
|
||||
border-left: 3px solid #C9A94E;
|
||||
}
|
||||
.situation-item svg { width: 18px; height: 18px; fill: #C9A94E; flex-shrink: 0; }
|
||||
|
||||
/* === Testimonials === */
|
||||
.testimonials h2 { font-size: 32px; color: #1B3A5C; text-align: center; margin-bottom: 48px; }
|
||||
.testimonials__grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
gap: 24px;
|
||||
}
|
||||
.testimonial-card {
|
||||
background: #fff;
|
||||
border-radius: 12px;
|
||||
padding: 28px 24px;
|
||||
box-shadow: 0 2px 12px rgba(0,0,0,0.06);
|
||||
}
|
||||
.testimonial-card__stars { color: #C9A94E; font-size: 16px; margin-bottom: 12px; }
|
||||
.testimonial-card p { font-size: 14px; color: #555; line-height: 1.7; margin-bottom: 16px; font-style: italic; }
|
||||
.testimonial-card__author {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
}
|
||||
.testimonial-card__initials {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
background: #1B3A5C;
|
||||
color: #C9A94E;
|
||||
border-radius: 50%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-weight: 700;
|
||||
font-size: 14px;
|
||||
}
|
||||
.testimonial-card__name { font-size: 14px; font-weight: 600; color: #1B3A5C; }
|
||||
.testimonial-card__loc { font-size: 12px; color: #6C757D; }
|
||||
|
||||
/* === FAQ === */
|
||||
.faq h2 { font-size: 32px; color: #1B3A5C; text-align: center; margin-bottom: 48px; }
|
||||
.faq__list { max-width: 760px; margin: 0 auto; }
|
||||
.faq-item {
|
||||
border-bottom: 1px solid #e8e8e8;
|
||||
}
|
||||
.faq-item:first-child { border-top: 1px solid #e8e8e8; }
|
||||
.faq-item__q {
|
||||
width: 100%;
|
||||
background: none;
|
||||
border: none;
|
||||
padding: 18px 0;
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
color: #1B3A5C;
|
||||
cursor: pointer;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
text-align: left;
|
||||
font-family: inherit;
|
||||
}
|
||||
.faq-item__q:hover { color: #C9A94E; }
|
||||
.faq-item__q svg {
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
fill: #C9A94E;
|
||||
transition: transform 0.2s;
|
||||
flex-shrink: 0;
|
||||
margin-left: 12px;
|
||||
}
|
||||
.faq-item.active .faq-item__q svg { transform: rotate(180deg); }
|
||||
.faq-item__a {
|
||||
max-height: 0;
|
||||
overflow: hidden;
|
||||
transition: max-height 0.3s ease;
|
||||
}
|
||||
.faq-item.active .faq-item__a { max-height: 300px; }
|
||||
.faq-item__a p {
|
||||
padding: 0 0 18px;
|
||||
font-size: 14px;
|
||||
color: #6C757D;
|
||||
line-height: 1.7;
|
||||
}
|
||||
|
||||
/* === CTA Banner === */
|
||||
.cta-banner {
|
||||
text-align: center;
|
||||
padding: 72px 0;
|
||||
}
|
||||
.cta-banner h2 { font-size: 34px; margin-bottom: 16px; }
|
||||
.cta-banner p { color: #c8d6e5; font-size: 17px; margin-bottom: 28px; }
|
||||
.cta-banner .btn { margin: 0 8px; }
|
||||
|
||||
/* === Footer === */
|
||||
.footer {
|
||||
background: #0f2540;
|
||||
color: #a0b4c8;
|
||||
padding: 48px 0 24px;
|
||||
font-size: 14px;
|
||||
}
|
||||
.footer__grid {
|
||||
display: grid;
|
||||
grid-template-columns: 2fr 1fr 1fr 1fr;
|
||||
gap: 36px;
|
||||
margin-bottom: 36px;
|
||||
}
|
||||
.footer h4 { color: #fff; font-size: 15px; margin-bottom: 14px; }
|
||||
.footer__brand p { line-height: 1.7; margin-top: 8px; }
|
||||
.footer ul { list-style: none; }
|
||||
.footer ul li { margin-bottom: 8px; }
|
||||
.footer ul a { color: #a0b4c8; font-size: 13px; }
|
||||
.footer ul a:hover { color: #C9A94E; }
|
||||
.footer__bottom {
|
||||
border-top: 1px solid rgba(255,255,255,0.1);
|
||||
padding-top: 20px;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
flex-wrap: wrap;
|
||||
gap: 12px;
|
||||
}
|
||||
.footer__disclaimer {
|
||||
font-size: 11px;
|
||||
color: #6a7d91;
|
||||
max-width: 600px;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
/* === Responsive === */
|
||||
@media (max-width: 1024px) {
|
||||
.hero .container { grid-template-columns: 1fr; gap: 36px; }
|
||||
.hero__content { text-align: center; }
|
||||
.hero__content h1 { font-size: 34px; }
|
||||
.hero__badges { justify-content: center; }
|
||||
.lead-form { max-width: 500px; margin: 0 auto; }
|
||||
.footer__grid { grid-template-columns: 1fr 1fr; }
|
||||
}
|
||||
@media (max-width: 768px) {
|
||||
.section { padding: 48px 0; }
|
||||
.header__phone { display: none; }
|
||||
.hero { padding: 48px 0 56px; }
|
||||
.hero__content h1 { font-size: 28px; }
|
||||
.hero__content p { font-size: 16px; }
|
||||
.hero__badges { flex-direction: column; gap: 8px; align-items: center; }
|
||||
.form-row { grid-template-columns: 1fr; }
|
||||
.steps__grid { grid-template-columns: 1fr; gap: 28px; }
|
||||
.benefits__grid { grid-template-columns: 1fr; }
|
||||
.situations__grid { grid-template-columns: 1fr; }
|
||||
.testimonials__grid { grid-template-columns: 1fr; }
|
||||
.cta-banner h2 { font-size: 26px; }
|
||||
.cta-banner .btn { display: block; margin: 8px 0; }
|
||||
.footer__grid { grid-template-columns: 1fr; }
|
||||
.footer__bottom { flex-direction: column; text-align: center; }
|
||||
.trust-bar .container { gap: 20px; }
|
||||
}
|
||||
|
||||
/* === Schema/Structured Data (hidden) === */
|
||||
.sr-only {
|
||||
position: absolute;
|
||||
width: 1px;
|
||||
height: 1px;
|
||||
padding: 0;
|
||||
margin: -1px;
|
||||
overflow: hidden;
|
||||
clip: rect(0,0,0,0);
|
||||
border: 0;
|
||||
}
|
||||
5
public/images/logo.svg
Normal file
5
public/images/logo.svg
Normal file
@@ -0,0 +1,5 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 240 44" fill="none">
|
||||
<rect x="0" y="4" width="36" height="36" rx="8" fill="#1B3A5C"/>
|
||||
<path d="M10 28l6-16h4l6 16h-4l-1.2-3.6h-5.6L14 28h-4zm6.4-7h3.2l-1.6-4.8L16.4 21z" fill="#C9A94E"/>
|
||||
<text x="44" y="30" font-family="Arial,Helvetica,sans-serif" font-size="22" font-weight="800" fill="#1B3A5C">Flow<tspan fill="#C9A94E">Automate</tspan></text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 412 B |
552
public/index.html
Normal file
552
public/index.html
Normal file
@@ -0,0 +1,552 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Sell Your House Fast for Cash | Flowautomate LLC</title>
|
||||
<meta name="description" content="Get a fair, no-obligation cash offer on your house in 24 hours. No repairs, no commissions, close on your timeline. Flowautomate LLC buys houses in any condition.">
|
||||
<meta name="robots" content="index, follow">
|
||||
<link rel="canonical" href="https://houses.flowautomate.ai/">
|
||||
|
||||
<!-- Open Graph -->
|
||||
<meta property="og:type" content="website">
|
||||
<meta property="og:title" content="Sell Your House Fast for Cash | Flowautomate LLC">
|
||||
<meta property="og:description" content="Get a fair, no-obligation cash offer in 24 hours. No repairs, no commissions, close on your timeline.">
|
||||
<meta property="og:url" content="https://houses.flowautomate.ai/">
|
||||
<meta property="og:site_name" content="Flowautomate LLC">
|
||||
|
||||
<!-- Twitter Card -->
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:title" content="Sell Your House Fast for Cash | Flowautomate LLC">
|
||||
<meta name="twitter:description" content="Get a fair, no-obligation cash offer in 24 hours. No repairs, no commissions.">
|
||||
|
||||
<link rel="stylesheet" href="/css/style.css">
|
||||
|
||||
<!-- Schema.org: RealEstateAgent -->
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "RealEstateAgent",
|
||||
"name": "Flowautomate LLC",
|
||||
"description": "AI-powered real estate solutions company that buys houses for cash in any condition.",
|
||||
"url": "https://houses.flowautomate.ai",
|
||||
"telephone": "+14256107779",
|
||||
"email": "offers@flowautomate.ai",
|
||||
"areaServed": "United States",
|
||||
"priceRange": "$$"
|
||||
}
|
||||
</script>
|
||||
|
||||
<!-- Schema.org: FAQPage -->
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "FAQPage",
|
||||
"mainEntity": [
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "How does the process work?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "Simply fill out our form or call us. We'll review your property details, make a fair cash offer within 24 hours, and if you accept, we close on your timeline — as fast as 14 days."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "Will I get a fair price for my house?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "Yes. We use current market data and comparable sales to make competitive cash offers. While it may be below full retail, you save on agent commissions (6%), repairs, holding costs, and months of waiting."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "Do I need to make any repairs?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "No. We buy houses in any condition — as-is. Leaky roof, foundation issues, outdated kitchen, even fire damage. You don't need to fix a thing."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "How fast can you close?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "We can close in as little as 14 days. Or if you need more time, we'll work with your schedule. You pick the closing date."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "Are there any fees or commissions?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "None. There are zero fees, zero commissions, and zero closing costs for you. The price we offer is the price you get."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "What types of properties do you buy?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "We buy single-family homes, condos, townhomes, duplexes, and small multi-family properties in any condition across the US."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "Do I need to be there in person?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "No. Our entire process is 100% virtual. We handle everything through e-signatures, remote notarization, and wire transfers. Perfect if you live out of state."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "Can you help if I'm facing foreclosure?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "Yes. We specialize in helping homeowners facing foreclosure. A fast cash sale can stop the foreclosure process and protect your credit. Time is critical — contact us today."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "Is Flowautomate LLC legitimate?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "Absolutely. Flowautomate LLC is a registered company. We use licensed title companies for every closing, ensuring a safe and transparent transaction for all parties."
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<!-- Header -->
|
||||
<header class="header" id="top">
|
||||
<div class="container">
|
||||
<a href="/" aria-label="Flowautomate LLC Home">
|
||||
<img src="/images/logo.svg" alt="Flowautomate LLC" class="header__logo" width="240" height="44">
|
||||
</a>
|
||||
<div class="header__right">
|
||||
<a href="tel:+14256107779" class="header__phone">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="#C9A94E" style="vertical-align:-3px;margin-right:4px;"><path d="M6.62 10.79a15.05 15.05 0 006.59 6.59l2.2-2.2a1 1 0 011.01-.24c1.12.37 2.33.57 3.58.57a1 1 0 011 1V20a1 1 0 01-1 1A17 17 0 013 4a1 1 0 011-1h3.5a1 1 0 011 1c0 1.25.2 2.46.57 3.58a1 1 0 01-.24 1.01l-2.21 2.2z"/></svg>
|
||||
(425) 610-7779
|
||||
</a>
|
||||
<a href="#lead-form-section" class="btn">Get My Cash Offer</a>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<!-- Hero -->
|
||||
<section class="hero" id="lead-form-section">
|
||||
<div class="container">
|
||||
<div class="hero__content">
|
||||
<h1>Need to Sell Your<br>House <span>Fast?</span></h1>
|
||||
<p>Get a fair, no-obligation cash offer in 24 hours. No repairs. No commissions. Close on your timeline.</p>
|
||||
<div class="hero__badges">
|
||||
<span class="hero__badge">
|
||||
<svg viewBox="0 0 24 24"><path d="M12 2L3 7v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V7l-9-5zm-1 15l-4-4 1.41-1.41L11 14.17l6.59-6.59L19 9l-8 8z"/></svg>
|
||||
100% Free
|
||||
</span>
|
||||
<span class="hero__badge">
|
||||
<svg viewBox="0 0 24 24"><path d="M12 2L3 7v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V7l-9-5zm-1 15l-4-4 1.41-1.41L11 14.17l6.59-6.59L19 9l-8 8z"/></svg>
|
||||
No Obligation
|
||||
</span>
|
||||
<span class="hero__badge">
|
||||
<svg viewBox="0 0 24 24"><path d="M12 2L3 7v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V7l-9-5zm-1 15l-4-4 1.41-1.41L11 14.17l6.59-6.59L19 9l-8 8z"/></svg>
|
||||
Close in 14 Days
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Lead Form -->
|
||||
<div class="lead-form">
|
||||
<h2>Get Your Cash Offer Today</h2>
|
||||
<form id="lead-form" novalidate>
|
||||
<div id="form-error" class="form-error"></div>
|
||||
<div id="form-fields">
|
||||
<div class="form-group">
|
||||
<label for="address">Property Address</label>
|
||||
<input type="text" id="address" name="address" placeholder="123 Main St, City, State ZIP" required autocomplete="street-address">
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<div class="form-group">
|
||||
<label for="name">Full Name</label>
|
||||
<input type="text" id="name" name="name" placeholder="Your full name" required autocomplete="name">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="phone">Phone</label>
|
||||
<input type="tel" id="phone" name="phone" placeholder="(555) 123-4567" required autocomplete="tel">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="email">Email</label>
|
||||
<input type="email" id="email" name="email" placeholder="you@email.com" required autocomplete="email">
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<div class="form-group">
|
||||
<label for="condition">Property Condition</label>
|
||||
<select id="condition" name="condition">
|
||||
<option value="">Select...</option>
|
||||
<option value="Good">Good</option>
|
||||
<option value="Needs Work">Needs Work</option>
|
||||
<option value="Major Repairs">Major Repairs</option>
|
||||
<option value="Not Sure">Not Sure</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="timeline">Selling Timeline</label>
|
||||
<select id="timeline" name="timeline">
|
||||
<option value="">Select...</option>
|
||||
<option value="ASAP">ASAP</option>
|
||||
<option value="1-2 Weeks">1-2 Weeks</option>
|
||||
<option value="1-3 Months">1-3 Months</option>
|
||||
<option value="No Rush">No Rush</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Honeypot -->
|
||||
<div class="hp-field" aria-hidden="true">
|
||||
<label for="website_url">Website</label>
|
||||
<input type="text" id="website_url" name="website_url" tabindex="-1" autocomplete="off">
|
||||
</div>
|
||||
<div class="form-consent">
|
||||
<input type="checkbox" id="tcpa_consent" name="tcpa_consent" required>
|
||||
<label for="tcpa_consent">I agree to be contacted by Flowautomate LLC at the phone number and email provided, including by automated means, regarding my property. I understand this is not a condition of any purchase. Message and data rates may apply.</label>
|
||||
</div>
|
||||
<button type="submit" id="form-submit" class="btn btn--lg btn--block">Get My Cash Offer</button>
|
||||
<p class="form-note">
|
||||
<svg viewBox="0 0 24 24"><path d="M12 2L3 7v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V7l-9-5zm-1 15l-4-4 1.41-1.41L11 14.17l6.59-6.59L19 9l-8 8z"/></svg>
|
||||
100% Free • No Obligation • Your info is secure
|
||||
</p>
|
||||
</div>
|
||||
<div id="form-success" class="form-success">
|
||||
<svg viewBox="0 0 24 24"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"/></svg>
|
||||
<h3>Thank You!</h3>
|
||||
<p>We received your information. Expect a call or email within 24 hours with your cash offer.</p>
|
||||
<p style="margin-top:12px;"><a href="tel:+14256107779" class="btn">Call Us Now: (425) 610-7779</a></p>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Trust Bar -->
|
||||
<section class="trust-bar">
|
||||
<div class="container">
|
||||
<div class="trust-item">
|
||||
<svg viewBox="0 0 24 24"><path d="M12 2L3 7v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V7l-9-5zm-1 15l-4-4 1.41-1.41L11 14.17l6.59-6.59L19 9l-8 8z"/></svg>
|
||||
Trusted by Homeowners Nationwide
|
||||
</div>
|
||||
<div class="trust-item">
|
||||
<svg viewBox="0 0 24 24"><path d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm.5-13H11v6l5.25 3.15.75-1.23-4.5-2.67z"/></svg>
|
||||
Fast Closings — 14 Days or Less
|
||||
</div>
|
||||
<div class="trust-item">
|
||||
<svg viewBox="0 0 24 24"><path d="M11.8 10.9c-2.27-.59-3-1.2-3-2.15 0-1.09 1.01-1.85 2.7-1.85 1.78 0 2.44.85 2.5 2.1h2.21c-.07-1.72-1.12-3.3-3.21-3.81V3h-3v2.16c-1.94.42-3.5 1.68-3.5 3.61 0 2.31 1.91 3.46 4.7 4.13 2.5.6 3 1.48 3 2.41 0 .69-.49 1.79-2.7 1.79-2.06 0-2.87-.92-2.98-2.1h-2.2c.12 2.19 1.76 3.42 3.68 3.83V21h3v-2.15c1.95-.37 3.5-1.5 3.5-3.55 0-2.84-2.43-3.81-4.7-4.4z"/></svg>
|
||||
Zero Fees or Commissions
|
||||
</div>
|
||||
<div class="trust-item">
|
||||
<svg viewBox="0 0 24 24"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-7 3c1.93 0 3.5 1.57 3.5 3.5S13.93 13 12 13s-3.5-1.57-3.5-3.5S10.07 6 12 6zm7 13H5v-.23c0-.62.28-1.2.76-1.58C7.47 15.82 9.64 15 12 15s4.53.82 6.24 2.19c.48.38.76.97.76 1.58V19z"/></svg>
|
||||
100% Virtual Process
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- How It Works -->
|
||||
<section class="section steps">
|
||||
<div class="container">
|
||||
<h2>How It Works</h2>
|
||||
<div class="steps__grid">
|
||||
<div class="step">
|
||||
<div class="step__number">1</div>
|
||||
<h3>Tell Us About Your Property</h3>
|
||||
<p>Fill out the quick form above or give us a call. It takes less than 60 seconds.</p>
|
||||
</div>
|
||||
<div class="step">
|
||||
<div class="step__number">2</div>
|
||||
<h3>Get Your Cash Offer</h3>
|
||||
<p>We analyze market data and send you a fair, no-obligation cash offer within 24 hours.</p>
|
||||
</div>
|
||||
<div class="step">
|
||||
<div class="step__number">3</div>
|
||||
<h3>Close on Your Timeline</h3>
|
||||
<p>Accept the offer, pick your closing date, and get paid. As fast as 14 days.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Benefits -->
|
||||
<section class="section section--light benefits">
|
||||
<div class="container">
|
||||
<h2>Why Homeowners Choose Us</h2>
|
||||
<div class="benefits__grid">
|
||||
<div class="benefit-card">
|
||||
<div class="benefit-card__icon">
|
||||
<svg viewBox="0 0 24 24"><path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
|
||||
</div>
|
||||
<h3>No Repairs Needed</h3>
|
||||
<p>Sell your house exactly as it is. Leaky roof, old carpet, broken furnace — we don't care. You won't spend a dime on fixes.</p>
|
||||
</div>
|
||||
<div class="benefit-card">
|
||||
<div class="benefit-card__icon">
|
||||
<svg viewBox="0 0 24 24"><path d="M11.8 10.9c-2.27-.59-3-1.2-3-2.15 0-1.09 1.01-1.85 2.7-1.85 1.78 0 2.44.85 2.5 2.1h2.21c-.07-1.72-1.12-3.3-3.21-3.81V3h-3v2.16c-1.94.42-3.5 1.68-3.5 3.61 0 2.31 1.91 3.46 4.7 4.13 2.5.6 3 1.48 3 2.41 0 .69-.49 1.79-2.7 1.79-2.06 0-2.87-.92-2.98-2.1h-2.2c.12 2.19 1.76 3.42 3.68 3.83V21h3v-2.15c1.95-.37 3.5-1.5 3.5-3.55 0-2.84-2.43-3.81-4.7-4.4z"/></svg>
|
||||
</div>
|
||||
<h3>No Agent Commissions</h3>
|
||||
<p>Skip the 6% realtor fees. There are zero commissions, zero hidden fees, and zero closing costs for you.</p>
|
||||
</div>
|
||||
<div class="benefit-card">
|
||||
<div class="benefit-card__icon">
|
||||
<svg viewBox="0 0 24 24"><path d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm.5-13H11v6l5.25 3.15.75-1.23-4.5-2.67z"/></svg>
|
||||
</div>
|
||||
<h3>Close in 14 Days</h3>
|
||||
<p>Need to sell fast? We can close in as little as two weeks. Or pick any date that works for you.</p>
|
||||
</div>
|
||||
<div class="benefit-card">
|
||||
<div class="benefit-card__icon">
|
||||
<svg viewBox="0 0 24 24"><path d="M21 18v1c0 1.1-.9 2-2 2H5c-1.11 0-2-.9-2-2V5c0-1.1.89-2 2-2h14c1.1 0 2 .9 2 2v1h-9c-1.11 0-2 .9-2 2v8c0 1.1.89 2 2 2h9zm-9-2h10V8H12v8zm4-2.5c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z"/></svg>
|
||||
</div>
|
||||
<h3>Cash Offer</h3>
|
||||
<p>No bank financing means no appraisals, no loan denials, no delays. Real cash, guaranteed closing.</p>
|
||||
</div>
|
||||
<div class="benefit-card">
|
||||
<div class="benefit-card__icon">
|
||||
<svg viewBox="0 0 24 24"><path d="M20 18c1.1 0 1.99-.9 1.99-2L22 6c0-1.1-.9-2-2-2H4c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2H0v2h24v-2h-4zM4 6h16v10H4V6z"/></svg>
|
||||
</div>
|
||||
<h3>100% Virtual Process</h3>
|
||||
<p>Everything is handled remotely — e-signatures, remote notarization, wire transfer. You never need to leave your couch.</p>
|
||||
</div>
|
||||
<div class="benefit-card">
|
||||
<div class="benefit-card__icon">
|
||||
<svg viewBox="0 0 24 24"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"/></svg>
|
||||
</div>
|
||||
<h3>Any Situation</h3>
|
||||
<p>Foreclosure, divorce, inherited property, tax liens, vacant homes — we've seen it all and we can help.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Situations -->
|
||||
<section class="section section--navy situations">
|
||||
<div class="container">
|
||||
<h2>Situations We Help With</h2>
|
||||
<p>No matter what you're going through, we can offer a fast, fair solution.</p>
|
||||
<div class="situations__grid">
|
||||
<div class="situation-item">
|
||||
<svg viewBox="0 0 24 24"><path d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"/></svg>
|
||||
Facing Foreclosure
|
||||
</div>
|
||||
<div class="situation-item">
|
||||
<svg viewBox="0 0 24 24"><path d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"/></svg>
|
||||
Going Through Divorce
|
||||
</div>
|
||||
<div class="situation-item">
|
||||
<svg viewBox="0 0 24 24"><path d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"/></svg>
|
||||
Inherited a Property
|
||||
</div>
|
||||
<div class="situation-item">
|
||||
<svg viewBox="0 0 24 24"><path d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"/></svg>
|
||||
Behind on Property Taxes
|
||||
</div>
|
||||
<div class="situation-item">
|
||||
<svg viewBox="0 0 24 24"><path d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"/></svg>
|
||||
Relocating for Work
|
||||
</div>
|
||||
<div class="situation-item">
|
||||
<svg viewBox="0 0 24 24"><path d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"/></svg>
|
||||
Tired Landlord
|
||||
</div>
|
||||
<div class="situation-item">
|
||||
<svg viewBox="0 0 24 24"><path d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"/></svg>
|
||||
Code Violations
|
||||
</div>
|
||||
<div class="situation-item">
|
||||
<svg viewBox="0 0 24 24"><path d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"/></svg>
|
||||
Vacant Property
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Testimonials -->
|
||||
<section class="section testimonials">
|
||||
<div class="container">
|
||||
<h2>What Homeowners Say</h2>
|
||||
<div class="testimonials__grid">
|
||||
<div class="testimonial-card">
|
||||
<div class="testimonial-card__stars">★★★★★</div>
|
||||
<p>"I was three months behind on my mortgage and didn't know what to do. They gave me a fair cash offer and we closed in 12 days. Saved my credit and gave me a fresh start."</p>
|
||||
<div class="testimonial-card__author">
|
||||
<div class="testimonial-card__initials">MS</div>
|
||||
<div>
|
||||
<div class="testimonial-card__name">M.S.</div>
|
||||
<div class="testimonial-card__loc">Memphis, TN</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="testimonial-card">
|
||||
<div class="testimonial-card__stars">★★★★★</div>
|
||||
<p>"My mom passed and I inherited her house across the country. I couldn't deal with repairs or finding a realtor from 2,000 miles away. They handled everything virtually. I never had to visit."</p>
|
||||
<div class="testimonial-card__author">
|
||||
<div class="testimonial-card__initials">JT</div>
|
||||
<div>
|
||||
<div class="testimonial-card__name">J.T.</div>
|
||||
<div class="testimonial-card__loc">Cleveland, OH</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="testimonial-card">
|
||||
<div class="testimonial-card__stars">★★★★★</div>
|
||||
<p>"Going through a divorce and needed to sell fast. No showings, no staging, no drama. Got a cash offer the next day and closed in three weeks. Exactly what I needed."</p>
|
||||
<div class="testimonial-card__author">
|
||||
<div class="testimonial-card__initials">KR</div>
|
||||
<div>
|
||||
<div class="testimonial-card__name">K.R.</div>
|
||||
<div class="testimonial-card__loc">Indianapolis, IN</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- FAQ -->
|
||||
<section class="section section--light faq">
|
||||
<div class="container">
|
||||
<h2>Frequently Asked Questions</h2>
|
||||
<div class="faq__list">
|
||||
|
||||
<div class="faq-item">
|
||||
<button class="faq-item__q" type="button">
|
||||
How does the process work?
|
||||
<svg viewBox="0 0 24 24"><path d="M7.41 8.59L12 13.17l4.59-4.58L18 10l-6 6-6-6z"/></svg>
|
||||
</button>
|
||||
<div class="faq-item__a"><p>Simply fill out our form or call us. We'll review your property details, make a fair cash offer within 24 hours, and if you accept, we close on your timeline — as fast as 14 days. There's no obligation at any point.</p></div>
|
||||
</div>
|
||||
|
||||
<div class="faq-item">
|
||||
<button class="faq-item__q" type="button">
|
||||
Will I get a fair price for my house?
|
||||
<svg viewBox="0 0 24 24"><path d="M7.41 8.59L12 13.17l4.59-4.58L18 10l-6 6-6-6z"/></svg>
|
||||
</button>
|
||||
<div class="faq-item__a"><p>Yes. We use current market data and comparable sales to make competitive cash offers. While it may be below full retail value, you save on agent commissions (6%), repairs, holding costs, and months of waiting — so many sellers actually come out ahead.</p></div>
|
||||
</div>
|
||||
|
||||
<div class="faq-item">
|
||||
<button class="faq-item__q" type="button">
|
||||
Do I need to make any repairs?
|
||||
<svg viewBox="0 0 24 24"><path d="M7.41 8.59L12 13.17l4.59-4.58L18 10l-6 6-6-6z"/></svg>
|
||||
</button>
|
||||
<div class="faq-item__a"><p>No. We buy houses in any condition — completely as-is. Leaky roof, foundation issues, outdated kitchen, even fire damage. You don't need to fix a thing.</p></div>
|
||||
</div>
|
||||
|
||||
<div class="faq-item">
|
||||
<button class="faq-item__q" type="button">
|
||||
How fast can you close?
|
||||
<svg viewBox="0 0 24 24"><path d="M7.41 8.59L12 13.17l4.59-4.58L18 10l-6 6-6-6z"/></svg>
|
||||
</button>
|
||||
<div class="faq-item__a"><p>We can close in as little as 14 days. Or if you need more time — say you're looking for a new place first — we'll work with your schedule. You pick the closing date that works best.</p></div>
|
||||
</div>
|
||||
|
||||
<div class="faq-item">
|
||||
<button class="faq-item__q" type="button">
|
||||
Are there any fees or commissions?
|
||||
<svg viewBox="0 0 24 24"><path d="M7.41 8.59L12 13.17l4.59-4.58L18 10l-6 6-6-6z"/></svg>
|
||||
</button>
|
||||
<div class="faq-item__a"><p>None. There are zero fees, zero commissions, and zero closing costs for you. The offer price we give you is the amount you walk away with.</p></div>
|
||||
</div>
|
||||
|
||||
<div class="faq-item">
|
||||
<button class="faq-item__q" type="button">
|
||||
What types of properties do you buy?
|
||||
<svg viewBox="0 0 24 24"><path d="M7.41 8.59L12 13.17l4.59-4.58L18 10l-6 6-6-6z"/></svg>
|
||||
</button>
|
||||
<div class="faq-item__a"><p>We buy single-family homes, condos, townhomes, duplexes, and small multi-family properties in any condition across the United States.</p></div>
|
||||
</div>
|
||||
|
||||
<div class="faq-item">
|
||||
<button class="faq-item__q" type="button">
|
||||
Do I need to be there in person?
|
||||
<svg viewBox="0 0 24 24"><path d="M7.41 8.59L12 13.17l4.59-4.58L18 10l-6 6-6-6z"/></svg>
|
||||
</button>
|
||||
<div class="faq-item__a"><p>No. Our entire process is 100% virtual. We handle everything through e-signatures, remote notarization, and wire transfers. Perfect if you live out of state or out of the country.</p></div>
|
||||
</div>
|
||||
|
||||
<div class="faq-item">
|
||||
<button class="faq-item__q" type="button">
|
||||
Can you help if I'm facing foreclosure?
|
||||
<svg viewBox="0 0 24 24"><path d="M7.41 8.59L12 13.17l4.59-4.58L18 10l-6 6-6-6z"/></svg>
|
||||
</button>
|
||||
<div class="faq-item__a"><p>Yes. We specialize in helping homeowners facing foreclosure. A fast cash sale can stop the foreclosure process and protect your credit. Time is critical — reach out today so we can explore your options.</p></div>
|
||||
</div>
|
||||
|
||||
<div class="faq-item">
|
||||
<button class="faq-item__q" type="button">
|
||||
Is Flowautomate LLC legitimate?
|
||||
<svg viewBox="0 0 24 24"><path d="M7.41 8.59L12 13.17l4.59-4.58L18 10l-6 6-6-6z"/></svg>
|
||||
</button>
|
||||
<div class="faq-item__a"><p>Absolutely. Flowautomate LLC is a registered company. We use licensed title companies for every closing, ensuring a safe, transparent transaction. We're happy to provide references and answer any questions before you decide.</p></div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Final CTA -->
|
||||
<section class="section section--navy cta-banner">
|
||||
<div class="container">
|
||||
<h2>Ready to Get Your Cash Offer?</h2>
|
||||
<p>Fill out the form or call us now. No obligation, no pressure.</p>
|
||||
<a href="#lead-form-section" class="btn btn--lg">Get My Cash Offer</a>
|
||||
<a href="tel:+14256107779" class="btn btn--lg btn--outline" style="border-color:#fff;color:#fff;">Call (425) 610-7779</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Footer -->
|
||||
<footer class="footer">
|
||||
<div class="container">
|
||||
<div class="footer__grid">
|
||||
<div class="footer__brand">
|
||||
<img src="/images/logo.svg" alt="Flowautomate LLC" width="180" height="33" style="filter:brightness(0) invert(1);">
|
||||
<p>AI-powered real estate solutions. We help homeowners sell their properties fast for cash — no repairs, no commissions, no hassle.</p>
|
||||
</div>
|
||||
<div>
|
||||
<h4>Quick Links</h4>
|
||||
<ul>
|
||||
<li><a href="#lead-form-section">Get an Offer</a></li>
|
||||
<li><a href="#top">How It Works</a></li>
|
||||
<li><a href="/privacy.html">Privacy Policy</a></li>
|
||||
<li><a href="/terms.html">Terms of Service</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div>
|
||||
<h4>Contact</h4>
|
||||
<ul>
|
||||
<li><a href="tel:+14256107779">(425) 610-7779</a></li>
|
||||
<li><a href="mailto:offers@flowautomate.ai">offers@flowautomate.ai</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div>
|
||||
<h4>We Buy Houses In</h4>
|
||||
<ul>
|
||||
<li>Memphis, TN</li>
|
||||
<li>Indianapolis, IN</li>
|
||||
<li>Cleveland, OH</li>
|
||||
<li>Houston, TX</li>
|
||||
<li>Jacksonville, FL</li>
|
||||
<li>And more...</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="footer__bottom">
|
||||
<p>© 2026 Flowautomate LLC. All rights reserved.</p>
|
||||
<p class="footer__disclaimer">Flowautomate LLC is not a licensed real estate broker or agent. We are a real estate investment company. We do not provide legal, financial, or real estate advice. Consult a licensed professional for advice specific to your situation.</p>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script src="/js/form.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
112
public/js/form.js
Normal file
112
public/js/form.js
Normal file
@@ -0,0 +1,112 @@
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
var form = document.getElementById('lead-form');
|
||||
var errorBox = document.getElementById('form-error');
|
||||
var successBox = document.getElementById('form-success');
|
||||
var submitBtn = document.getElementById('form-submit');
|
||||
var formFields = document.getElementById('form-fields');
|
||||
|
||||
if (!form) return;
|
||||
|
||||
// FAQ accordion
|
||||
document.querySelectorAll('.faq-item__q').forEach(function (btn) {
|
||||
btn.addEventListener('click', function () {
|
||||
var item = btn.closest('.faq-item');
|
||||
var wasActive = item.classList.contains('active');
|
||||
document.querySelectorAll('.faq-item').forEach(function (i) { i.classList.remove('active'); });
|
||||
if (!wasActive) item.classList.add('active');
|
||||
});
|
||||
});
|
||||
|
||||
// Smooth scroll for anchor links
|
||||
document.querySelectorAll('a[href^="#"]').forEach(function (link) {
|
||||
link.addEventListener('click', function (e) {
|
||||
var target = document.querySelector(link.getAttribute('href'));
|
||||
if (target) {
|
||||
e.preventDefault();
|
||||
target.scrollIntoView({ behavior: 'smooth', block: 'start' });
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// Phone formatting
|
||||
var phoneInput = document.getElementById('phone');
|
||||
if (phoneInput) {
|
||||
phoneInput.addEventListener('input', function () {
|
||||
var val = phoneInput.value.replace(/\D/g, '').slice(0, 10);
|
||||
if (val.length >= 7) {
|
||||
phoneInput.value = '(' + val.slice(0, 3) + ') ' + val.slice(3, 6) + '-' + val.slice(6);
|
||||
} else if (val.length >= 4) {
|
||||
phoneInput.value = '(' + val.slice(0, 3) + ') ' + val.slice(3);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Form submission
|
||||
form.addEventListener('submit', function (e) {
|
||||
e.preventDefault();
|
||||
errorBox.style.display = 'none';
|
||||
|
||||
// Clear previous errors
|
||||
form.querySelectorAll('.error').forEach(function (el) { el.classList.remove('error'); });
|
||||
|
||||
var name = form.querySelector('#name').value.trim();
|
||||
var email = form.querySelector('#email').value.trim();
|
||||
var phone = form.querySelector('#phone').value.trim();
|
||||
var address = form.querySelector('#address').value.trim();
|
||||
var condition = form.querySelector('#condition').value;
|
||||
var timeline = form.querySelector('#timeline').value;
|
||||
var consent = form.querySelector('#tcpa_consent').checked;
|
||||
var honeypot = form.querySelector('#website_url').value;
|
||||
|
||||
// Validation
|
||||
var errors = [];
|
||||
if (!name) { errors.push('Name is required'); form.querySelector('#name').classList.add('error'); }
|
||||
if (!email || !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) { errors.push('Valid email is required'); form.querySelector('#email').classList.add('error'); }
|
||||
if (!phone || phone.replace(/\D/g, '').length < 7) { errors.push('Valid phone is required'); form.querySelector('#phone').classList.add('error'); }
|
||||
if (!address) { errors.push('Property address is required'); form.querySelector('#address').classList.add('error'); }
|
||||
if (!consent) { errors.push('Please agree to be contacted'); }
|
||||
|
||||
if (errors.length) {
|
||||
errorBox.textContent = errors[0];
|
||||
errorBox.style.display = 'block';
|
||||
return;
|
||||
}
|
||||
|
||||
// Disable button
|
||||
submitBtn.disabled = true;
|
||||
submitBtn.textContent = 'Submitting...';
|
||||
|
||||
fetch('/api/submit-lead', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({
|
||||
name: name,
|
||||
email: email,
|
||||
phone: phone,
|
||||
address: address,
|
||||
condition: condition,
|
||||
timeline: timeline,
|
||||
tcpa_consent: true,
|
||||
honeypot: honeypot,
|
||||
}),
|
||||
})
|
||||
.then(function (res) { return res.json(); })
|
||||
.then(function (data) {
|
||||
if (data.success) {
|
||||
formFields.style.display = 'none';
|
||||
successBox.style.display = 'block';
|
||||
} else {
|
||||
errorBox.textContent = data.error || 'Something went wrong. Please try again.';
|
||||
errorBox.style.display = 'block';
|
||||
submitBtn.disabled = false;
|
||||
submitBtn.textContent = 'Get My Cash Offer';
|
||||
}
|
||||
})
|
||||
.catch(function () {
|
||||
errorBox.textContent = 'Connection error. Please try again.';
|
||||
errorBox.style.display = 'block';
|
||||
submitBtn.disabled = false;
|
||||
submitBtn.textContent = 'Get My Cash Offer';
|
||||
});
|
||||
});
|
||||
});
|
||||
98
public/privacy.html
Normal file
98
public/privacy.html
Normal file
@@ -0,0 +1,98 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Privacy Policy | Flowautomate LLC</title>
|
||||
<meta name="description" content="Privacy policy for Flowautomate LLC — how we collect, use, and protect your information.">
|
||||
<meta name="robots" content="noindex, follow">
|
||||
<link rel="canonical" href="https://houses.flowautomate.ai/privacy.html">
|
||||
<link rel="stylesheet" href="/css/style.css">
|
||||
<style>.legal{max-width:760px;margin:0 auto;padding:48px 20px 64px;}.legal h1{color:#1B3A5C;font-size:32px;margin-bottom:8px;}.legal .date{color:#6C757D;font-size:14px;margin-bottom:32px;}.legal h2{color:#1B3A5C;font-size:20px;margin:28px 0 12px;}.legal p,.legal li{color:#555;font-size:15px;line-height:1.7;margin-bottom:12px;}.legal ul{padding-left:20px;}.legal a{color:#C9A94E;}</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<header class="header">
|
||||
<div class="container">
|
||||
<a href="/" aria-label="Home"><img src="/images/logo.svg" alt="Flowautomate LLC" class="header__logo" width="240" height="44"></a>
|
||||
<div class="header__right">
|
||||
<a href="/" class="btn">Get My Cash Offer</a>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<div class="legal">
|
||||
<h1>Privacy Policy</h1>
|
||||
<p class="date">Last updated: February 19, 2026</p>
|
||||
|
||||
<p>Flowautomate LLC ("we," "us," or "our") operates the website houses.flowautomate.ai. This Privacy Policy explains how we collect, use, disclose, and protect your personal information.</p>
|
||||
|
||||
<h2>1. Information We Collect</h2>
|
||||
<p>When you submit our property inquiry form, we collect:</p>
|
||||
<ul>
|
||||
<li>Full name</li>
|
||||
<li>Email address</li>
|
||||
<li>Phone number</li>
|
||||
<li>Property address</li>
|
||||
<li>Property condition and selling timeline</li>
|
||||
<li>IP address (for security and fraud prevention)</li>
|
||||
</ul>
|
||||
|
||||
<h2>2. How We Use Your Information</h2>
|
||||
<p>We use the information you provide to:</p>
|
||||
<ul>
|
||||
<li>Evaluate your property and prepare a cash offer</li>
|
||||
<li>Contact you regarding your property inquiry</li>
|
||||
<li>Send you a confirmation email acknowledging your submission</li>
|
||||
<li>Improve our services and website</li>
|
||||
</ul>
|
||||
|
||||
<h2>3. How We Share Your Information</h2>
|
||||
<p>We do not sell your personal information. We may share your information with:</p>
|
||||
<ul>
|
||||
<li>Title companies to facilitate property closings</li>
|
||||
<li>Licensed real estate professionals assisting with your transaction</li>
|
||||
<li>Service providers who help us operate our website and business (email hosting, analytics)</li>
|
||||
<li>Legal authorities if required by law</li>
|
||||
</ul>
|
||||
|
||||
<h2>4. Data Security</h2>
|
||||
<p>We implement reasonable security measures to protect your personal information, including encrypted data transmission (SSL/TLS) and secure data storage. However, no method of electronic transmission or storage is 100% secure.</p>
|
||||
|
||||
<h2>5. Your Rights</h2>
|
||||
<p>You have the right to:</p>
|
||||
<ul>
|
||||
<li>Request access to your personal data</li>
|
||||
<li>Request correction or deletion of your personal data</li>
|
||||
<li>Opt out of future communications at any time</li>
|
||||
</ul>
|
||||
<p>To exercise these rights, contact us at <a href="mailto:offers@flowautomate.ai">offers@flowautomate.ai</a> or call <a href="tel:+14256107779">(425) 610-7779</a>.</p>
|
||||
|
||||
<h2>6. Cookies</h2>
|
||||
<p>This website does not use tracking cookies or third-party analytics. We do not use advertising pixels or remarketing technologies.</p>
|
||||
|
||||
<h2>7. TCPA Consent</h2>
|
||||
<p>By checking the consent box on our form, you provide prior express written consent under the Telephone Consumer Protection Act (TCPA) for Flowautomate LLC to contact you at the phone number provided using automated technology, including calls and text messages, regarding your property inquiry. This consent is not a condition of any purchase or service.</p>
|
||||
|
||||
<h2>8. Changes to This Policy</h2>
|
||||
<p>We may update this Privacy Policy from time to time. Changes will be posted on this page with an updated date.</p>
|
||||
|
||||
<h2>9. Contact Us</h2>
|
||||
<p>
|
||||
Flowautomate LLC<br>
|
||||
Email: <a href="mailto:offers@flowautomate.ai">offers@flowautomate.ai</a><br>
|
||||
Phone: <a href="tel:+14256107779">(425) 610-7779</a>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<footer class="footer">
|
||||
<div class="container">
|
||||
<div class="footer__bottom" style="border:none;padding-top:0;">
|
||||
<p>© 2026 Flowautomate LLC. All rights reserved.</p>
|
||||
<p><a href="/" style="color:#C9A94E;">Back to Home</a></p>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
81
public/terms.html
Normal file
81
public/terms.html
Normal file
@@ -0,0 +1,81 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Terms of Service | Flowautomate LLC</title>
|
||||
<meta name="description" content="Terms of service for Flowautomate LLC website.">
|
||||
<meta name="robots" content="noindex, follow">
|
||||
<link rel="canonical" href="https://houses.flowautomate.ai/terms.html">
|
||||
<link rel="stylesheet" href="/css/style.css">
|
||||
<style>.legal{max-width:760px;margin:0 auto;padding:48px 20px 64px;}.legal h1{color:#1B3A5C;font-size:32px;margin-bottom:8px;}.legal .date{color:#6C757D;font-size:14px;margin-bottom:32px;}.legal h2{color:#1B3A5C;font-size:20px;margin:28px 0 12px;}.legal p,.legal li{color:#555;font-size:15px;line-height:1.7;margin-bottom:12px;}.legal ul{padding-left:20px;}.legal a{color:#C9A94E;}</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<header class="header">
|
||||
<div class="container">
|
||||
<a href="/" aria-label="Home"><img src="/images/logo.svg" alt="Flowautomate LLC" class="header__logo" width="240" height="44"></a>
|
||||
<div class="header__right">
|
||||
<a href="/" class="btn">Get My Cash Offer</a>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<div class="legal">
|
||||
<h1>Terms of Service</h1>
|
||||
<p class="date">Last updated: February 19, 2026</p>
|
||||
|
||||
<p>By accessing and using houses.flowautomate.ai ("the Website"), you agree to the following terms and conditions.</p>
|
||||
|
||||
<h2>1. About Us</h2>
|
||||
<p>Flowautomate LLC is a real estate investment company. We are not licensed real estate brokers or agents. We do not provide legal, tax, or financial advice. We buy properties directly from homeowners for investment purposes.</p>
|
||||
|
||||
<h2>2. No Obligation</h2>
|
||||
<p>Submitting your information through our form does not create any obligation to sell your property or accept any offer. All offers are non-binding until a purchase agreement is signed by both parties.</p>
|
||||
|
||||
<h2>3. Not Real Estate Advice</h2>
|
||||
<p>The content on this website is for informational purposes only and does not constitute real estate, legal, financial, or tax advice. We recommend consulting with a licensed professional before making any real estate decisions.</p>
|
||||
|
||||
<h2>4. Property Evaluations</h2>
|
||||
<p>Our cash offers are based on our analysis of current market conditions, property condition, and comparable sales. Offers may change based on further inspection or new information about the property.</p>
|
||||
|
||||
<h2>5. Communication Consent</h2>
|
||||
<p>By submitting the form on this website and checking the consent box, you agree to receive communications from Flowautomate LLC, including phone calls, text messages, and emails regarding your property inquiry. You may opt out at any time by replying STOP to any text message or contacting us directly.</p>
|
||||
|
||||
<h2>6. Accuracy of Information</h2>
|
||||
<p>You agree to provide accurate and truthful information when submitting our form. Providing false or misleading information may result in withdrawal of any offer.</p>
|
||||
|
||||
<h2>7. Intellectual Property</h2>
|
||||
<p>All content on this website, including text, graphics, logos, and design, is the property of Flowautomate LLC and is protected by applicable intellectual property laws.</p>
|
||||
|
||||
<h2>8. Limitation of Liability</h2>
|
||||
<p>Flowautomate LLC shall not be liable for any direct, indirect, incidental, or consequential damages arising from your use of this website or reliance on any information provided. The website is provided "as is" without warranties of any kind.</p>
|
||||
|
||||
<h2>9. Third-Party Links</h2>
|
||||
<p>This website may contain links to third-party websites. We are not responsible for the content or practices of any linked sites.</p>
|
||||
|
||||
<h2>10. Governing Law</h2>
|
||||
<p>These terms are governed by the laws of the State of Washington, without regard to conflict of law provisions.</p>
|
||||
|
||||
<h2>11. Changes to Terms</h2>
|
||||
<p>We reserve the right to update these terms at any time. Changes take effect immediately upon posting to this page.</p>
|
||||
|
||||
<h2>12. Contact</h2>
|
||||
<p>
|
||||
Flowautomate LLC<br>
|
||||
Email: <a href="mailto:offers@flowautomate.ai">offers@flowautomate.ai</a><br>
|
||||
Phone: <a href="tel:+14256107779">(425) 610-7779</a>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<footer class="footer">
|
||||
<div class="container">
|
||||
<div class="footer__bottom" style="border:none;padding-top:0;">
|
||||
<p>© 2026 Flowautomate LLC. All rights reserved.</p>
|
||||
<p><a href="/" style="color:#C9A94E;">Back to Home</a></p>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
214
server.js
Normal file
214
server.js
Normal file
@@ -0,0 +1,214 @@
|
||||
const express = require('express');
|
||||
const path = require('path');
|
||||
const Database = require('better-sqlite3');
|
||||
const nodemailer = require('nodemailer');
|
||||
const rateLimit = require('express-rate-limit');
|
||||
const helmet = require('helmet');
|
||||
|
||||
const app = express();
|
||||
const PORT = process.env.PORT || 3000;
|
||||
|
||||
// Database setup
|
||||
const dbPath = path.join(__dirname, 'data', 'leads.db');
|
||||
const db = new Database(dbPath);
|
||||
db.pragma('journal_mode = WAL');
|
||||
db.exec(`
|
||||
CREATE TABLE IF NOT EXISTS leads (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
name TEXT NOT NULL,
|
||||
email TEXT NOT NULL,
|
||||
phone TEXT NOT NULL,
|
||||
address TEXT NOT NULL,
|
||||
property_condition TEXT,
|
||||
timeline TEXT,
|
||||
tcpa_consent INTEGER NOT NULL DEFAULT 0,
|
||||
ip TEXT,
|
||||
created_at TEXT DEFAULT (datetime('now'))
|
||||
)
|
||||
`);
|
||||
|
||||
// SMTP transporter
|
||||
const transporter = nodemailer.createTransport({
|
||||
host: process.env.SMTP_HOST || 'mail.flowautomate.ai',
|
||||
port: parseInt(process.env.SMTP_PORT || '587'),
|
||||
secure: false,
|
||||
auth: {
|
||||
user: process.env.SMTP_USER || 'offers@flowautomate.ai',
|
||||
pass: process.env.SMTP_PASS || '',
|
||||
},
|
||||
tls: { rejectUnauthorized: false },
|
||||
});
|
||||
|
||||
// Middleware
|
||||
app.use(helmet({
|
||||
contentSecurityPolicy: {
|
||||
directives: {
|
||||
defaultSrc: ["'self'"],
|
||||
styleSrc: ["'self'", "'unsafe-inline'"],
|
||||
scriptSrc: ["'self'"],
|
||||
imgSrc: ["'self'", "data:"],
|
||||
fontSrc: ["'self'"],
|
||||
connectSrc: ["'self'"],
|
||||
},
|
||||
},
|
||||
}));
|
||||
app.use(express.json());
|
||||
app.use(express.urlencoded({ extended: false }));
|
||||
app.use(express.static(path.join(__dirname, 'public')));
|
||||
|
||||
// Rate limit for form submissions
|
||||
const submitLimiter = rateLimit({
|
||||
windowMs: 60 * 60 * 1000, // 1 hour
|
||||
max: 5,
|
||||
message: { success: false, error: 'Too many submissions. Please try again later.' },
|
||||
standardHeaders: true,
|
||||
legacyHeaders: false,
|
||||
keyGenerator: (req) => req.ip,
|
||||
});
|
||||
|
||||
// Health check
|
||||
app.get('/api/health', (req, res) => {
|
||||
res.json({ status: 'ok', timestamp: new Date().toISOString() });
|
||||
});
|
||||
|
||||
// Lead submission
|
||||
app.post('/api/submit-lead', submitLimiter, async (req, res) => {
|
||||
try {
|
||||
const { name, email, phone, address, condition, timeline, tcpa_consent, honeypot } = req.body;
|
||||
|
||||
// Honeypot check
|
||||
if (honeypot) {
|
||||
return res.json({ success: true });
|
||||
}
|
||||
|
||||
// Validate required fields
|
||||
if (!name || !email || !phone || !address) {
|
||||
return res.status(400).json({ success: false, error: 'All fields are required.' });
|
||||
}
|
||||
|
||||
// Validate email format
|
||||
if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
|
||||
return res.status(400).json({ success: false, error: 'Please enter a valid email address.' });
|
||||
}
|
||||
|
||||
// Validate phone (digits, dashes, parens, spaces, plus)
|
||||
const cleanPhone = phone.replace(/[\s\-\(\)\+]/g, '');
|
||||
if (!/^\d{7,15}$/.test(cleanPhone)) {
|
||||
return res.status(400).json({ success: false, error: 'Please enter a valid phone number.' });
|
||||
}
|
||||
|
||||
// TCPA consent required
|
||||
if (!tcpa_consent) {
|
||||
return res.status(400).json({ success: false, error: 'Please agree to be contacted.' });
|
||||
}
|
||||
|
||||
// Save to database
|
||||
const stmt = db.prepare(`
|
||||
INSERT INTO leads (name, email, phone, address, property_condition, timeline, tcpa_consent, ip)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
||||
`);
|
||||
stmt.run(name, email, phone, address, condition || '', timeline || '', 1, req.ip);
|
||||
|
||||
// Send notification email to team
|
||||
const notifyHtml = `
|
||||
<h2 style="color:#1B3A5C;">New Lead from houses.flowautomate.ai</h2>
|
||||
<table style="font-family:Arial,sans-serif;border-collapse:collapse;">
|
||||
<tr><td style="padding:6px 12px;font-weight:bold;color:#1B3A5C;">Name</td><td style="padding:6px 12px;">${escapeHtml(name)}</td></tr>
|
||||
<tr style="background:#F8F9FA;"><td style="padding:6px 12px;font-weight:bold;color:#1B3A5C;">Phone</td><td style="padding:6px 12px;">${escapeHtml(phone)}</td></tr>
|
||||
<tr><td style="padding:6px 12px;font-weight:bold;color:#1B3A5C;">Email</td><td style="padding:6px 12px;">${escapeHtml(email)}</td></tr>
|
||||
<tr style="background:#F8F9FA;"><td style="padding:6px 12px;font-weight:bold;color:#1B3A5C;">Property</td><td style="padding:6px 12px;">${escapeHtml(address)}</td></tr>
|
||||
<tr><td style="padding:6px 12px;font-weight:bold;color:#1B3A5C;">Condition</td><td style="padding:6px 12px;">${escapeHtml(condition || 'Not specified')}</td></tr>
|
||||
<tr style="background:#F8F9FA;"><td style="padding:6px 12px;font-weight:bold;color:#1B3A5C;">Timeline</td><td style="padding:6px 12px;">${escapeHtml(timeline || 'Not specified')}</td></tr>
|
||||
<tr><td style="padding:6px 12px;font-weight:bold;color:#1B3A5C;">TCPA Consent</td><td style="padding:6px 12px;">Yes</td></tr>
|
||||
<tr style="background:#F8F9FA;"><td style="padding:6px 12px;font-weight:bold;color:#1B3A5C;">Submitted</td><td style="padding:6px 12px;">${new Date().toLocaleString('en-US', { timeZone: 'America/Chicago' })}</td></tr>
|
||||
</table>
|
||||
`;
|
||||
|
||||
// Auto-response email to seller
|
||||
const autoResponseHtml = `
|
||||
<div style="font-family:Arial,Helvetica,sans-serif;max-width:600px;margin:0 auto;">
|
||||
<div style="background:#1B3A5C;padding:24px;text-align:center;">
|
||||
<h1 style="color:#C9A94E;margin:0;font-size:22px;">Flowautomate LLC</h1>
|
||||
<p style="color:#ffffff;margin:6px 0 0;font-size:13px;">AI-Powered Real Estate Solutions</p>
|
||||
</div>
|
||||
<div style="padding:28px 24px;color:#333;">
|
||||
<p>Hi ${escapeHtml(name.split(' ')[0])},</p>
|
||||
<p>Thank you for reaching out about your property at <strong>${escapeHtml(address)}</strong>. We received your information and our team is reviewing it now.</p>
|
||||
<p><strong>What happens next:</strong></p>
|
||||
<ul style="color:#555;line-height:1.8;">
|
||||
<li>We'll review your property details and local market data</li>
|
||||
<li>You'll receive a fair, no-obligation cash offer within 24 hours</li>
|
||||
<li>If the offer works for you, we can close on your timeline</li>
|
||||
</ul>
|
||||
<p>If you have any questions in the meantime, feel free to call or text us:</p>
|
||||
<p style="text-align:center;margin:20px 0;">
|
||||
<a href="tel:+14256107779" style="display:inline-block;background:#C9A94E;color:#fff;padding:12px 28px;text-decoration:none;border-radius:6px;font-weight:700;font-size:16px;">(425) 610-7779</a>
|
||||
</p>
|
||||
</div>
|
||||
<div style="border-top:2px solid #C9A94E;padding:20px 24px;background:#F8F9FA;">
|
||||
<table cellpadding="0" cellspacing="0" border="0" style="font-family:Arial,Helvetica,sans-serif;">
|
||||
<tr>
|
||||
<td style="vertical-align:top;">
|
||||
<p style="margin:0 0 2px;font-size:16px;font-weight:700;color:#1B3A5C;">Jociah</p>
|
||||
<p style="margin:0 0 4px;font-size:10px;font-weight:600;color:#C9A94E;text-transform:uppercase;letter-spacing:2px;">Founder & CEO</p>
|
||||
<p style="margin:0 0 2px;font-size:13px;color:#1B3A5C;font-weight:600;">Flowautomate LLC</p>
|
||||
<p style="margin:0;font-size:11px;color:#888;">
|
||||
<a href="tel:+14256107779" style="color:#1B3A5C;text-decoration:none;">(425) 610-7779</a> •
|
||||
<a href="mailto:offers@flowautomate.ai" style="color:#1B3A5C;text-decoration:none;">offers@flowautomate.ai</a>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div style="padding:12px 24px;text-align:center;">
|
||||
<p style="font-size:10px;color:#aaa;margin:0;">Fast cash offers • No repairs needed • Close on your timeline</p>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
|
||||
// Send both emails (don't block response on email delivery)
|
||||
if (process.env.SMTP_PASS) {
|
||||
transporter.sendMail({
|
||||
from: '"Flowautomate LLC" <offers@flowautomate.ai>',
|
||||
to: 'offers@flowautomate.ai',
|
||||
subject: `New Lead: ${address} - ${name}`,
|
||||
html: notifyHtml,
|
||||
}).catch(err => console.error('Notification email failed:', err.message));
|
||||
|
||||
transporter.sendMail({
|
||||
from: '"Jociah at Flowautomate" <offers@flowautomate.ai>',
|
||||
to: email,
|
||||
subject: 'We received your info - Flowautomate LLC',
|
||||
html: autoResponseHtml,
|
||||
}).catch(err => console.error('Auto-response email failed:', err.message));
|
||||
}
|
||||
|
||||
res.json({ success: true });
|
||||
} catch (err) {
|
||||
console.error('Lead submission error:', err);
|
||||
res.status(500).json({ success: false, error: 'Something went wrong. Please try again.' });
|
||||
}
|
||||
});
|
||||
|
||||
function escapeHtml(str) {
|
||||
return String(str)
|
||||
.replace(/&/g, '&')
|
||||
.replace(/</g, '<')
|
||||
.replace(/>/g, '>')
|
||||
.replace(/"/g, '"');
|
||||
}
|
||||
|
||||
// SPA fallback — serve index.html for unknown routes
|
||||
app.get('*', (req, res) => {
|
||||
res.sendFile(path.join(__dirname, 'public', 'index.html'));
|
||||
});
|
||||
|
||||
// Graceful shutdown
|
||||
process.on('SIGTERM', () => {
|
||||
db.close();
|
||||
process.exit(0);
|
||||
});
|
||||
|
||||
app.listen(PORT, () => {
|
||||
console.log(`houses.flowautomate.ai running on port ${PORT}`);
|
||||
});
|
||||
Reference in New Issue
Block a user