// Hotel Walks — Marketing landing page. // Pitch to hotel GMs / revenue managers. Editorial, calm, direct. (function() { const { SmartKey, Wordmark, Lockup, tokens: HWT } = window.HW; const { Caps, Btn, SerifI } = window.UI; const { IxRouting, IxTimer, IxLetter, IxLedger, FlowIcon, IxTimeline } = window.HWIx; function Section({ children, dark, pad = "80px 64px", style }) { return (
{children}
); } function Hero() { const [navOpen, setNavOpen] = React.useState(false); return (
{/* Top bar */}
{/* Desktop links — Product / Pricing / Markets are placeholders (no pages yet). */}
{["Product", "Pricing", "Markets"].map(label => ( e.preventDefault()} style={{ color: "inherit", textDecoration: "none", cursor: "default" }}> {label} ))} Try the demo →
{/* Mobile hamburger */}
{/* Mobile drawer */} {navOpen && (
{["Product", "Pricing", "Markets"].map(l => ( { e.preventDefault(); setNavOpen(false); }} style={{ display: "flex", alignItems: "center", justifyContent: "space-between", padding: "20px 24px", textDecoration: "none", color: "var(--bone)", borderBottom: "1px solid rgba(244,238,221,0.12)", cursor: "default", }}> {l} ))} setNavOpen(false)} style={{ display: "flex", padding: "22px 24px", textDecoration: "none", color: "var(--bone)", background: "rgba(244,238,221,0.06)", }}> Try the demo →
)} {/* Hero copy */}
For oversold nights · Beta · Brooklyn & South Florida
When the rooms run out, the handoff begins.

Hotel Walks is the quiet protocol behind a walked guest. Re-house the booking, negotiate the rate, generate the letter, and settle the invoice — without the front desk picking up the phone.

See the demo {}}>Join the beta
); } function Stat({ label, value, dark }) { return (
{value}
{label}
); } // The hero visual — two stacked walk-letter cards. function HeroMark() { return (
{/* Back letter */}
Walk letter · duplicate
The Hoxton,
Williamsburg

Re-housed for the night of May 21. Confirmation enclosed.

260521-K-WYTHE-HOXBK-0027841
{/* Front letter */}
Wythe Hotel
Re-housing for the guest of
Maya Klein
Re-housed at Rate
1 Hotel
Brooklyn Bridge
$645
Authorized
A. Nair
0027841
); } function Problem() { // Single column template + gap, reused for both the headline row and the timeline row, so everything aligns. const gridCols = "minmax(0, 1fr) minmax(0, 1fr)"; const gridGap = 64; return (
The night you don't want
A walked guest is a phone call you wish you didn't have to make.

Oversold by three rooms at 11pm. The duty manager starts calling partners. First hotel doesn't answer. Second is also sold out. Third offers a rate $200 higher than what you can paper. The lobby is filling.

Hotel Walks turns the next 45 minutes into 6. One request, broadcast to ranked partners, on your terms. Acceptance, confirmation number, letter — done before the guest reaches the desk.

{/* Before / after timelines — same grid template so the columns line up with the headline row above. */}
Before · the phone tree 45 min
After · Hotel Walks 6 min
); } // The "after" version — single broadcast, partners ping back, one accepts. function IxTimelineAfter({ fullWidth }) { return ( {/* main timeline */} 11:00 PM 11:06 PM {/* broadcast dot at start with concentric radiating arcs */} SEND {/* partner pings — small ticks above the line */} {[110, 175, 240, 305].map((x, i) => ( ))} {/* accept at end */} ACCEPT ); } function Features() { const items = [ { eyebrow: "01 · Partner routing", title: "Send once. Route by preference or by rate.", body: "Rank your partners. Or let the platform broadcast to the best available rate first. Custom sub-markets for the comp set you actually use. A blacklist for the ones you don't.", Ix: IxRouting, }, { eyebrow: "02 · Escalation", title: "Timers that move on without you.", body: "Set 30 minutes per partner. If the request goes unanswered, the opportunity moves to the next. Toggle Urgent and it blasts to every partner at once — for the nights when 10pm has already passed.", Ix: IxTimer, }, { eyebrow: "03 · Walk letter", title: "The document, generated and watermarked.", body: "Three copies — guest, hotel, receiving property. A unique serial number. Reprints are watermarked DUPLICATE. The certificate cannot be redeemed twice.", Ix: IxLetter, }, { eyebrow: "04 · Invoices & credits", title: "Settled monthly. No phone calls.", body: "$4 + 10% per side. No-show toggles only on the receiving line, where they belong. A credits ledger for goodwill, applied to open invoices as needed.", Ix: IxLedger, }, ]; return (
How it works
Four parts. One quiet protocol.
{items.map((it, i) => (
{it.eyebrow}
{it.title}

{it.body}

))}
); } // A horizontal "walk flow" — connected timeline of the loop, on paper. function Flow() { const steps = [ { t: "Request", time: "T+0:00", d: "3 rooms tonight, $420 target.", ic: "request" }, { t: "Broadcast", time: "T+0:01", d: "Sent to ranked partners in order.", ic: "broadcast" }, { t: "Accept", time: "T+4:00", d: "Partner returns confirmation #.", ic: "accept" }, { t: "Letter", time: "T+5:30", d: "Three copies generated. Serialised.", ic: "letter" }, { t: "Settle", time: "+30 d", d: "Both sides invoiced. Done.", ic: "settle" }, ]; return (
The walk loop
From oversold to settled — in five steps.

The whole loop closes in under six minutes for a typical walk. Settlement is automatic at month-end — no calls, no chase.

{/* connector hairline through node centers — drops behind the discs */}
); } function Preview() { return (
Inside the app
What the front desk actually sees.

One screen. The walks you've sent, the ones inbound, the timer counting down. No tabs to hunt through when 10pm hits and the lobby fills.

Open the demo →
); } function PreviewFrame() { const rows = [ { time: "3:42 pm", guest: "Maya Klein", to: "1 Hotel Brooklyn Bridge", rate: "$645", status: "Letter sent", tone: "filled" }, { time: "4:08 pm", guest: "Daniel Park", to: "The Hoxton, Williamsburg", rate: "$372", status: "Accepted", tone: "good" }, { time: "4:51 pm", guest: "Ifeoma Okonkwo", to: "— pending —", rate: "—", status: "Broadcasting", tone: "warn" }, ]; return (
{/* fake top bar — bone like the real app */}
Hotel Walks
Wythe Hotel · AH
{/* fake tab strip */}
{["Today","Send","Incoming","Letters","Invoices"].map((t, i) => ( {t} {i === 2 && ( 3 )} ))}
{/* page head */}
Friday · May 22
Today at Wythe Hotel.
Walked 3 · 1 inbound · all timers green
{/* stat strip — trimmed to 2 */}
Walks open
3
Next escalation
12m
{/* table */}
In flight 3 walks
{rows.map((r, i) => (
{r.time} {r.guest} {r.to} {r.rate} {r.status}
))}
); } function Pricing() { const included = [ "Walk letter generation · serialised, watermarked DUPLICATE on reprint", "Partner routing · preference or best-rate strategies", "Escalation timers · auto-handoff between partners", "Urgent mode · simultaneous broadcast for late-night oversells", "Invoice generation · monthly settlement, both sides", "Credits portal · platform-managed goodwill ledger", "Guest cancellation page · standardised verbiage", "No-show flag · receiving-side only, waives commission", ]; return (
{/* LEFT — headline + price tag + audience tiers */}
Pricing
Per walk.
Per side.

No seats. No contracts. Beta properties in Brooklyn and South Florida ride free through Q3.

{/* Price tag */}
{/* RIGHT — what's included */}
What's included
The whole protocol, in the price.
    {included.map((line, i) => (
  • {line}
  • ))}
); } function Markets() { return (
Beta markets
Open in two cities — by invitation.

Convention hotels, urban centers, properties near major airports. The kind of inventory that gets oversold on a Thursday and needs help by Friday morning.

); } function MarketCard({ city, sub, hotels }) { return (
{city}
{sub}
); } function Quote() { return (
From the front desk
"On a sold-out Friday, we used to triage walks for the entire shift. Now the receiving hotel confirms before the guest finishes their second drink."
Front office manager · Williamsburg
); } function CTA() { return (
Beta · invitation only
Bring the next oversold night
under control.
Open the demo Email the founders
); } function Footer() { return ( ); } const responsiveCSS = ` @media (max-width: 1000px) { .hero-grid { grid-template-columns: 1fr !important; gap: 60px !important; } .hero-visual { min-height: 460px !important; max-width: 460px; margin: 0 auto; } .two-col { grid-template-columns: 1fr !important; gap: 36px !important; } .flow-track { grid-template-columns: 1fr 1fr !important; row-gap: 56px !important; } .flow-track > [aria-hidden] { display: none !important; } .cta-grid { grid-template-columns: 1fr !important; } .features-grid { grid-template-columns: 1fr !important; } .feature-card { grid-template-columns: 120px 1fr !important; gap: 24px !important; padding: 32px !important; } } @media (max-width: 720px) { .mkt-links { display: none !important; } .mkt-hamburger { display: inline-flex !important; } .mkt-drawer { display: block !important; } .mkt-topbar { padding: 12px 20px 24px !important; } .hero-grid { padding: 16px 24px 64px !important; gap: 40px !important; } .hero-headline { font-size: clamp(40px, 11vw, 64px) !important; } .hero-sub { font-size: 17px !important; margin-bottom: 32px !important; } .hero-visual { min-height: 380px !important; max-width: 340px !important; } .hero-stat-strip > div { grid-template-columns: 1fr !important; } .hero-stat-strip .hero-stat-cell { border-right: none !important; border-bottom: 1px solid var(--rule); flex-direction: row !important; padding: 16px 20px !important; } .hero-stat-strip .hero-stat-cell:last-child { border-bottom: none; } .hero-stat-strip .hero-stat-cell .serif-i { font-size: 26px !important; } .hero-ctas a { flex: 1; } .hero-ctas a > * { width: 100%; } .flow-track { grid-template-columns: 1fr 1fr !important; row-gap: 56px !important; } .flow-track > div:last-child:nth-child(odd) { grid-column: span 2; } section { padding: 64px 24px !important; } } @media (max-width: 640px) { .feature-card { grid-template-columns: 1fr !important; padding: 28px !important; } .flow-grid { grid-template-columns: 1fr !important; } } `; function LiveTicker() { // A thin marquee-style strip — gives the page life without breaking the calm. const items = [ ["00:14", "Wythe", "1 Hotel Brooklyn Bridge", "$645", "accepted"], ["00:09", "Ace Brooklyn", "The Hoxton, Williamsburg", "$385", "accepted"], ["00:22", "Fontainebleau", "Eden Roc Miami Beach", "$540", "letter sent"], ["00:06", "The William Vale", "The Penny Williamsburg", "$410", "accepted"], ["00:18", "Faena", "The Setai", "$890", "letter sent"], ["00:11", "1 Hotel South Beach", "Delano South Beach", "$520", "accepted"], ]; // Duplicate the items so the marquee can loop seamlessly. const row = [...items, ...items]; return (
{row.map((it, i) => ( {it[0]} {it[1]} {it[2]} · {it[3]} {it[4]} ))}
{/* fade edges */}
); } function HeroStatStrip() { const stats = [ { label: "Avg time to re-house", value: "6 min" }, { label: "Partner acceptance", value: "78%" }, { label: "Letters generated · ytd", value: "11,420" }, ]; return (
{stats.map((s, i) => (
{s.label}
{s.value}
))}
); } function Marketing() { return (
); } window.Screens = window.Screens || {}; window.Screens.Marketing = Marketing; })();