Compare commits
2 Commits
870525d6c7
...
4a53cb6353
| Author | SHA1 | Date | |
|---|---|---|---|
| 4a53cb6353 | |||
| 5511ef4110 |
@@ -0,0 +1,45 @@
|
|||||||
|
import type { Metadata } from "next";
|
||||||
|
import Link from "next/link";
|
||||||
|
import "@/components/portal/portal.css";
|
||||||
|
import "./legal.css";
|
||||||
|
import { COMPANY } from "./legal-config";
|
||||||
|
|
||||||
|
export const metadata: Metadata = {
|
||||||
|
title: `${COMPANY} — Legal & SMS`,
|
||||||
|
description: `${COMPANY} SMS program opt-in, Privacy Policy and Terms of Service.`,
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function LegalLayout({ children }: { children: React.ReactNode }) {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||||
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossOrigin="anonymous" />
|
||||||
|
<link
|
||||||
|
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap"
|
||||||
|
rel="stylesheet"
|
||||||
|
/>
|
||||||
|
<div className="legal-root">
|
||||||
|
<header className="legal-bar">
|
||||||
|
<Link href="/portal/login" aria-label={`${COMPANY} home`}>
|
||||||
|
{/* eslint-disable-next-line @next/next/no-img-element */}
|
||||||
|
<img src="/image/logo.png" alt={`${COMPANY} logo`} />
|
||||||
|
</Link>
|
||||||
|
<nav>
|
||||||
|
<Link href="/sms-opt-in">SMS Alerts</Link>
|
||||||
|
<Link href="/privacy">Privacy</Link>
|
||||||
|
<Link href="/terms">Terms</Link>
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
{children}
|
||||||
|
<footer className="legal-foot">
|
||||||
|
<div>© {new Date().getFullYear()} {COMPANY}. All rights reserved.</div>
|
||||||
|
<div style={{ marginTop: 8 }}>
|
||||||
|
<Link href="/sms-opt-in">SMS Alerts</Link>
|
||||||
|
<Link href="/privacy">Privacy Policy</Link>
|
||||||
|
<Link href="/terms">Terms of Service</Link>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
/**
|
||||||
|
* Shared business details for the public compliance pages (SMS opt-in, Privacy,
|
||||||
|
* Terms). Edit these in one place to keep every page and disclosure consistent.
|
||||||
|
* Replace SMS_SENDER with your live Twilio number once the campaign is approved.
|
||||||
|
*/
|
||||||
|
export const COMPANY = "LynkedUp Pro";
|
||||||
|
export const SUPPORT_EMAIL = "support@lynkeduppro.com";
|
||||||
|
export const PRIVACY_EMAIL = "privacy@lynkeduppro.com";
|
||||||
|
export const SMS_SENDER = "(555) 010-0100"; // TODO: replace with your Twilio A2P number
|
||||||
|
export const SITE_URL = "https://lynkeduppro-crmnew.vercel.app";
|
||||||
|
export const LAST_UPDATED = "July 13, 2026";
|
||||||
@@ -0,0 +1,125 @@
|
|||||||
|
/* Public compliance pages (SMS opt-in, Privacy, Terms). Reuses the portal design
|
||||||
|
tokens (--bg, --text, --primary…) from portal.css for a consistent look, with
|
||||||
|
prose styling tuned for long-form legal copy. */
|
||||||
|
|
||||||
|
.legal-root {
|
||||||
|
min-height: 100vh;
|
||||||
|
background: var(--bg, #0b0c11);
|
||||||
|
color: var(--text, #f3f4f8);
|
||||||
|
font-family: var(--font-ui, "Inter", system-ui, sans-serif);
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.legal-bar {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
gap: 16px;
|
||||||
|
padding: 18px 24px;
|
||||||
|
border-bottom: 1px solid var(--line, rgba(255, 255, 255, 0.09));
|
||||||
|
position: sticky;
|
||||||
|
top: 0;
|
||||||
|
background: color-mix(in srgb, var(--bg, #0b0c11) 88%, transparent);
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
|
z-index: 5;
|
||||||
|
}
|
||||||
|
.legal-bar img { height: 30px; width: auto; }
|
||||||
|
.legal-bar nav { display: flex; gap: 20px; flex-wrap: wrap; }
|
||||||
|
.legal-bar nav a {
|
||||||
|
color: var(--muted, #a3a8b5);
|
||||||
|
text-decoration: none;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
.legal-bar nav a:hover { color: var(--text, #f3f4f8); }
|
||||||
|
.legal-bar nav a.on { color: var(--primary-2, #fb923c); }
|
||||||
|
|
||||||
|
.legal-wrap { flex: 1; width: 100%; max-width: 820px; margin: 0 auto; padding: 44px 24px 80px; }
|
||||||
|
|
||||||
|
.legal-wrap h1 { font-size: 32px; font-weight: 800; letter-spacing: -0.02em; margin: 0 0 6px; }
|
||||||
|
.legal-wrap .updated { color: var(--faint, #6c7280); font-size: 13px; margin: 0 0 30px; }
|
||||||
|
.legal-wrap h2 {
|
||||||
|
font-size: 19px; font-weight: 700; margin: 34px 0 10px;
|
||||||
|
padding-top: 20px; border-top: 1px solid var(--line, rgba(255, 255, 255, 0.09));
|
||||||
|
}
|
||||||
|
.legal-wrap h2:first-of-type { border-top: none; padding-top: 0; }
|
||||||
|
.legal-wrap p, .legal-wrap li { color: var(--muted, #a3a8b5); font-size: 15px; line-height: 1.7; }
|
||||||
|
.legal-wrap p { margin: 0 0 12px; }
|
||||||
|
.legal-wrap ul { margin: 0 0 12px; padding-left: 20px; }
|
||||||
|
.legal-wrap li { margin: 0 0 6px; }
|
||||||
|
.legal-wrap strong { color: var(--text, #f3f4f8); font-weight: 600; }
|
||||||
|
.legal-wrap a { color: var(--primary-2, #fb923c); }
|
||||||
|
|
||||||
|
/* Callout box for the mandatory SMS disclosures — makes them easy for a reviewer to find. */
|
||||||
|
.legal-callout {
|
||||||
|
border: 1px solid var(--line-2, rgba(255, 255, 255, 0.15));
|
||||||
|
background: var(--surface, rgba(255, 255, 255, 0.04));
|
||||||
|
border-radius: var(--radius-sm, 13px);
|
||||||
|
padding: 16px 18px;
|
||||||
|
margin: 8px 0 18px;
|
||||||
|
}
|
||||||
|
.legal-callout p:last-child { margin-bottom: 0; }
|
||||||
|
|
||||||
|
.legal-foot {
|
||||||
|
border-top: 1px solid var(--line, rgba(255, 255, 255, 0.09));
|
||||||
|
padding: 22px 24px;
|
||||||
|
text-align: center;
|
||||||
|
color: var(--faint, #6c7280);
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
.legal-foot a { color: var(--muted, #a3a8b5); text-decoration: none; margin: 0 10px; }
|
||||||
|
.legal-foot a:hover { color: var(--text, #f3f4f8); }
|
||||||
|
|
||||||
|
/* SMS opt-in form */
|
||||||
|
.optin-card {
|
||||||
|
border: 1px solid var(--line, rgba(255, 255, 255, 0.09));
|
||||||
|
background: var(--surface, rgba(255, 255, 255, 0.04));
|
||||||
|
border-radius: var(--radius-sm, 13px);
|
||||||
|
padding: 22px;
|
||||||
|
margin-top: 22px;
|
||||||
|
}
|
||||||
|
.optin-field { margin-bottom: 16px; }
|
||||||
|
.optin-field label { display: block; font-weight: 600; font-size: 14px; margin-bottom: 7px; color: var(--text, #f3f4f8); }
|
||||||
|
.optin-input {
|
||||||
|
width: 100%;
|
||||||
|
background: var(--ink, #121319);
|
||||||
|
border: 1px solid var(--line-2, rgba(255, 255, 255, 0.15));
|
||||||
|
border-radius: 10px;
|
||||||
|
padding: 13px 14px;
|
||||||
|
color: var(--text, #f3f4f8);
|
||||||
|
font-size: 15px;
|
||||||
|
font-family: inherit;
|
||||||
|
}
|
||||||
|
.optin-input:focus { outline: 2px solid var(--primary, #f97316); outline-offset: 1px; border-color: transparent; }
|
||||||
|
|
||||||
|
.optin-consent { display: flex; gap: 11px; align-items: flex-start; margin: 6px 0 4px; }
|
||||||
|
.optin-consent input { margin-top: 3px; width: 18px; height: 18px; flex: none; accent-color: var(--primary, #f97316); }
|
||||||
|
.optin-consent label { font-size: 13.5px; line-height: 1.6; color: var(--muted, #a3a8b5); }
|
||||||
|
|
||||||
|
.optin-submit {
|
||||||
|
width: 100%;
|
||||||
|
margin-top: 18px;
|
||||||
|
background: var(--primary, #f97316);
|
||||||
|
color: #fff;
|
||||||
|
border: none;
|
||||||
|
border-radius: 10px;
|
||||||
|
padding: 14px;
|
||||||
|
font-size: 15px;
|
||||||
|
font-weight: 700;
|
||||||
|
cursor: pointer;
|
||||||
|
font-family: inherit;
|
||||||
|
}
|
||||||
|
.optin-submit:disabled { opacity: 0.5; cursor: not-allowed; }
|
||||||
|
|
||||||
|
.optin-fine { font-size: 12.5px; color: var(--faint, #6c7280); line-height: 1.6; margin-top: 14px; }
|
||||||
|
.optin-done {
|
||||||
|
border: 1px solid color-mix(in srgb, var(--green, #34d399) 45%, transparent);
|
||||||
|
background: color-mix(in srgb, var(--green, #34d399) 12%, transparent);
|
||||||
|
color: #a7f3d0;
|
||||||
|
border-radius: var(--radius-sm, 13px);
|
||||||
|
padding: 18px 20px;
|
||||||
|
margin-top: 22px;
|
||||||
|
font-size: 14.5px;
|
||||||
|
line-height: 1.6;
|
||||||
|
}
|
||||||
@@ -0,0 +1,98 @@
|
|||||||
|
import type { Metadata } from "next";
|
||||||
|
import Link from "next/link";
|
||||||
|
import { COMPANY, SUPPORT_EMAIL, PRIVACY_EMAIL, LAST_UPDATED } from "../legal-config";
|
||||||
|
|
||||||
|
export const metadata: Metadata = {
|
||||||
|
title: `Privacy Policy — ${COMPANY}`,
|
||||||
|
description: `How ${COMPANY} collects, uses, and protects your information, including SMS/text messaging.`,
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function PrivacyPage() {
|
||||||
|
return (
|
||||||
|
<main className="legal-wrap">
|
||||||
|
<h1>Privacy Policy</h1>
|
||||||
|
<p className="updated">Last updated: {LAST_UPDATED}</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
This Privacy Policy explains how {COMPANY} ("{COMPANY}," "we,"
|
||||||
|
"us") collects, uses, and protects your information when you use our
|
||||||
|
website, portal, and services, including our text message (SMS) program.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>Information we collect</h2>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Account information</strong> — name, email address, and mobile phone number you provide when registering or signing in.</li>
|
||||||
|
<li><strong>Property and service information</strong> — details you share to request roof inspections, estimates, and reports.</li>
|
||||||
|
<li><strong>Usage and device information</strong> — log data, device and browser type, and similar technical information collected automatically.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>How we use your information</h2>
|
||||||
|
<ul>
|
||||||
|
<li>To create and secure your account, including sending one-time verification codes (OTP).</li>
|
||||||
|
<li>To provide, maintain, and improve our services.</li>
|
||||||
|
<li>To communicate with you about your account, appointments, estimates, and support requests.</li>
|
||||||
|
<li>To comply with legal obligations and protect against fraud and abuse.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>SMS / text messaging</h2>
|
||||||
|
<div className="legal-callout">
|
||||||
|
<p>
|
||||||
|
<strong>
|
||||||
|
We do not sell, rent, or share your mobile phone number, or your SMS opt-in
|
||||||
|
consent, with any third parties or affiliates for their marketing or
|
||||||
|
promotional purposes.
|
||||||
|
</strong>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Mobile information collected for the purpose of sending text messages is used
|
||||||
|
only to deliver the messages you opted into and is not shared with third parties
|
||||||
|
for marketing. We may share your number only with service providers (such as our
|
||||||
|
messaging platform) strictly to deliver the messages, and as required by law.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<strong>Message frequency varies</strong> — verification codes are sent when you
|
||||||
|
request them (for example, each time you sign in or register), and account or
|
||||||
|
service notifications are occasional. <strong>Message and data rates may
|
||||||
|
apply</strong>, depending on your mobile carrier and plan.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
You can opt out at any time by replying <strong>STOP</strong> to any message, and
|
||||||
|
get help by replying <strong>HELP</strong>. See our{" "}
|
||||||
|
<Link href="/terms">Terms of Service</Link> and the{" "}
|
||||||
|
<Link href="/sms-opt-in">SMS opt-in page</Link> for full program details.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>How we share information</h2>
|
||||||
|
<p>
|
||||||
|
We do not sell your personal information. We share information only with service
|
||||||
|
providers who help us operate the service (for example, cloud hosting,
|
||||||
|
authentication, and messaging providers), and when required by law or to protect
|
||||||
|
our rights. As stated above, mobile phone numbers and SMS consent are never shared
|
||||||
|
with third parties or affiliates for marketing purposes.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>Data retention and security</h2>
|
||||||
|
<p>
|
||||||
|
We retain personal information for as long as your account is active or as needed to
|
||||||
|
provide the service and meet legal obligations. We use administrative, technical,
|
||||||
|
and physical safeguards designed to protect your information; no method of
|
||||||
|
transmission or storage is completely secure.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>Your choices and rights</h2>
|
||||||
|
<p>
|
||||||
|
You may access or update your account information at any time, opt out of SMS by
|
||||||
|
replying STOP, and request deletion of your account by contacting us. Depending on
|
||||||
|
your location, you may have additional rights under applicable privacy laws.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>Contact us</h2>
|
||||||
|
<p>
|
||||||
|
Questions about this Privacy Policy? Email us at{" "}
|
||||||
|
<a href={`mailto:${PRIVACY_EMAIL}`}>{PRIVACY_EMAIL}</a> or{" "}
|
||||||
|
<a href={`mailto:${SUPPORT_EMAIL}`}>{SUPPORT_EMAIL}</a>.
|
||||||
|
</p>
|
||||||
|
</main>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,125 @@
|
|||||||
|
"use client";
|
||||||
|
|
||||||
|
import { useState } from "react";
|
||||||
|
import Link from "next/link";
|
||||||
|
import { COMPANY, SMS_SENDER, SUPPORT_EMAIL } from "../legal-config";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Public SMS opt-in web form for A2P 10DLC campaign verification. Contains every
|
||||||
|
* element Twilio/CTIA require: phone field, an un-pre-checked consent checkbox, a
|
||||||
|
* description of the messages, frequency, rates disclaimer, HELP/STOP instructions,
|
||||||
|
* and links to the Terms and Privacy Policy.
|
||||||
|
*/
|
||||||
|
export default function SmsOptInPage() {
|
||||||
|
const [phone, setPhone] = useState("");
|
||||||
|
const [consent, setConsent] = useState(false);
|
||||||
|
const [done, setDone] = useState(false);
|
||||||
|
|
||||||
|
const digits = phone.replace(/\D/g, "");
|
||||||
|
const valid = digits.length >= 10 && consent;
|
||||||
|
|
||||||
|
function onSubmit(e: React.FormEvent) {
|
||||||
|
e.preventDefault();
|
||||||
|
if (!valid) return;
|
||||||
|
// Records the opt-in. Consent + timestamp should be persisted server-side for your
|
||||||
|
// records; this confirmation is the user-facing acknowledgement.
|
||||||
|
setDone(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<main className="legal-wrap">
|
||||||
|
<h1>{COMPANY} SMS Alerts</h1>
|
||||||
|
<p className="updated">Sign up to receive text messages from {COMPANY}.</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
{COMPANY} sends text messages to help you use and secure your account. By opting
|
||||||
|
in below you'll receive <strong>account and service messages</strong>,
|
||||||
|
including:
|
||||||
|
</p>
|
||||||
|
<ul>
|
||||||
|
<li>One-time verification codes (OTP) when you sign in or register</li>
|
||||||
|
<li>Sign-in and security alerts</li>
|
||||||
|
<li>Roof inspection scheduling and status updates</li>
|
||||||
|
<li>Estimate and report notifications</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
{done ? (
|
||||||
|
<div className="optin-done" role="status">
|
||||||
|
<strong>You're signed up.</strong> We'll text account and service
|
||||||
|
messages to {phone}. Reply <strong>STOP</strong> at any time to unsubscribe, or{" "}
|
||||||
|
<strong>HELP</strong> for help.
|
||||||
|
</div>
|
||||||
|
) : (
|
||||||
|
<form className="optin-card" onSubmit={onSubmit}>
|
||||||
|
<div className="optin-field">
|
||||||
|
<label htmlFor="sms-phone">Mobile phone number</label>
|
||||||
|
<input
|
||||||
|
id="sms-phone"
|
||||||
|
className="optin-input"
|
||||||
|
type="tel"
|
||||||
|
inputMode="tel"
|
||||||
|
autoComplete="tel"
|
||||||
|
placeholder="+1 (555) 010-0100"
|
||||||
|
value={phone}
|
||||||
|
onChange={(e) => setPhone(e.target.value)}
|
||||||
|
required
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Consent checkbox — MUST NOT be pre-checked (starts false). */}
|
||||||
|
<div className="optin-consent">
|
||||||
|
<input
|
||||||
|
id="sms-consent"
|
||||||
|
type="checkbox"
|
||||||
|
checked={consent}
|
||||||
|
onChange={(e) => setConsent(e.target.checked)}
|
||||||
|
/>
|
||||||
|
<label htmlFor="sms-consent">
|
||||||
|
I agree to receive account and service text messages (including one-time
|
||||||
|
verification codes) from {COMPANY} at the number provided. Consent is not a
|
||||||
|
condition of purchase. Message frequency varies. Message and data rates may
|
||||||
|
apply. Reply HELP for help and STOP to unsubscribe. See our{" "}
|
||||||
|
<Link href="/terms">Terms of Service</Link> and{" "}
|
||||||
|
<Link href="/privacy">Privacy Policy</Link>.
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button className="optin-submit" type="submit" disabled={!valid}>
|
||||||
|
Yes, sign me up!
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<p className="optin-fine">
|
||||||
|
Message frequency varies. Message and data rates may apply. Reply{" "}
|
||||||
|
<strong>HELP</strong> for help or <strong>STOP</strong> to cancel at any time.
|
||||||
|
Carriers are not liable for delayed or undelivered messages.
|
||||||
|
</p>
|
||||||
|
</form>
|
||||||
|
)}
|
||||||
|
|
||||||
|
<h2>Program details</h2>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Program name:</strong> {COMPANY} Account & Service Alerts</li>
|
||||||
|
<li><strong>Message types:</strong> verification codes (OTP), security alerts, appointment and inspection updates, estimate notifications</li>
|
||||||
|
<li><strong>Message frequency:</strong> varies — codes are sent when you request them (e.g. each sign-in or registration); notifications are occasional</li>
|
||||||
|
<li><strong>Cost:</strong> Message and data rates may apply, per your mobile plan</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>How to opt out or get help</h2>
|
||||||
|
<p>
|
||||||
|
Reply <strong>STOP</strong> to any message to unsubscribe — you'll get one
|
||||||
|
confirmation and no further texts. Reply <strong>HELP</strong> for help, or contact
|
||||||
|
us at <a href={`mailto:${SUPPORT_EMAIL}`}>{SUPPORT_EMAIL}</a>
|
||||||
|
{SMS_SENDER ? <> or {SMS_SENDER}</> : null}. Messages are sent from {COMPANY}.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>Your privacy</h2>
|
||||||
|
<p>
|
||||||
|
<strong>
|
||||||
|
We do not sell, rent, or share your mobile phone number or your SMS opt-in
|
||||||
|
consent with any third parties or affiliates for their marketing purposes.
|
||||||
|
</strong>{" "}
|
||||||
|
See our <Link href="/privacy">Privacy Policy</Link> for full details.
|
||||||
|
</p>
|
||||||
|
</main>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
import type { Metadata } from "next";
|
||||||
|
import Link from "next/link";
|
||||||
|
import { COMPANY, SUPPORT_EMAIL, LAST_UPDATED } from "../legal-config";
|
||||||
|
|
||||||
|
export const metadata: Metadata = {
|
||||||
|
title: `Terms of Service — ${COMPANY}`,
|
||||||
|
description: `The terms governing your use of ${COMPANY}, including the SMS/text messaging program.`,
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function TermsPage() {
|
||||||
|
return (
|
||||||
|
<main className="legal-wrap">
|
||||||
|
<h1>Terms of Service</h1>
|
||||||
|
<p className="updated">Last updated: {LAST_UPDATED}</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
These Terms of Service ("Terms") govern your access to and use of the{" "}
|
||||||
|
{COMPANY} website, portal, and services (the "Service"). By using the
|
||||||
|
Service you agree to these Terms.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>Use of the Service</h2>
|
||||||
|
<p>
|
||||||
|
You must provide accurate information, keep your credentials secure, and use the
|
||||||
|
Service only for lawful purposes and in accordance with these Terms. You are
|
||||||
|
responsible for activity that occurs under your account.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>Accounts and verification</h2>
|
||||||
|
<p>
|
||||||
|
To protect your account we may verify your identity, including by sending one-time
|
||||||
|
codes to your email or mobile number. You agree to receive these verification
|
||||||
|
messages as part of using the Service.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>SMS / text messaging program</h2>
|
||||||
|
<div className="legal-callout">
|
||||||
|
<p>
|
||||||
|
By opting in on our <Link href="/sms-opt-in">SMS opt-in page</Link> or by
|
||||||
|
providing your mobile number and agreeing to receive texts, you consent to
|
||||||
|
receive <strong>account and service text messages</strong> from {COMPANY},
|
||||||
|
including one-time verification codes (OTP), security alerts, appointment and
|
||||||
|
inspection updates, and estimate notifications.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<strong>Message frequency varies.</strong> <strong>Message and data rates may
|
||||||
|
apply.</strong> Reply <strong>HELP</strong> for help or <strong>STOP</strong> to
|
||||||
|
unsubscribe at any time; after you send STOP we will send one confirmation and no
|
||||||
|
further messages. Carriers are not liable for delayed or undelivered messages.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
We do not sell, rent, or share your mobile number or SMS consent with third
|
||||||
|
parties or affiliates for marketing. See our{" "}
|
||||||
|
<Link href="/privacy">Privacy Policy</Link> for details.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>Acceptable use</h2>
|
||||||
|
<p>
|
||||||
|
You may not misuse the Service, attempt to access accounts or data you are not
|
||||||
|
authorized to access, interfere with the Service's operation, or use it to
|
||||||
|
send unlawful, harmful, or infringing content.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>Disclaimers and limitation of liability</h2>
|
||||||
|
<p>
|
||||||
|
The Service is provided "as is" without warranties of any kind. To the
|
||||||
|
fullest extent permitted by law, {COMPANY} is not liable for any indirect,
|
||||||
|
incidental, or consequential damages arising from your use of the Service.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>Changes to these Terms</h2>
|
||||||
|
<p>
|
||||||
|
We may update these Terms from time to time. Continued use of the Service after
|
||||||
|
changes take effect constitutes acceptance of the updated Terms.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>Contact us</h2>
|
||||||
|
<p>
|
||||||
|
Questions about these Terms? Email us at{" "}
|
||||||
|
<a href={`mailto:${SUPPORT_EMAIL}`}>{SUPPORT_EMAIL}</a>.
|
||||||
|
</p>
|
||||||
|
</main>
|
||||||
|
);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user