VacationHolm

A direct-booking marketplace that keeps hosts in control.

VacationHolm guest search with fictional holiday rentals and date-based pricing.
Start with the guest The real search page with fictional properties and stay details. The examples show the interface, not live inventory or customer activity.

A direct-booking marketplace for holiday rentals in the Azores and Madeira. Guests search, price a stay and contact the host. The platform keeps the listing, calendar, inquiry and conversation together while payment stays between guest and host.

My partner brought the idea of a direct-booking listings platform for the Azores and Madeira, along with local market knowledge and commercial outreach. I turned that premise into the product: defining most of the workflows, designing the data and interfaces, and implementing the application end to end. Our discussions shaped the details, including traveler search, bilingual communication and host onboarding.

I built the guest and host workflows that connect property search, stay pricing, calendar availability and conversation. The difficult work sits between those screens, where two price calculations can disagree, a calendar refresh can erase the wrong block, or a failed reply job can disappear.

Role
Product and engineering across guest search, host operations, data design, failure handling and interface copy.
Business model
Direct booking. VacationHolm connects guests and hosts but does not collect or hold payment.
Verification
13 targeted assertion checks and an isolated PostgreSQL migration harness passed against the local source.
Status
Shipped; venture on hold. My partner is pursuing funding from Portuguese government entities. The September enhancements were reviewed locally; their deployment was not verified.

One stay should have one answer

A guest can see a total on a search card, open the property, change dates and submit an inquiry. Those steps used to have several ways to calculate price. VacationHolm now runs the same server calculation across search, listing detail and inquiry submission. It includes custom nightly rates, weekend pricing, stay discounts and cleaning fees.

The server recalculates the stay before saving the inquiry. A stale or changed quote returns for review instead of accepting the browser's amount. The saved quote carries its dates, party, currency and fee breakdown into the host conversation, so a draft cannot answer from a different nightly-rate shortcut.

VacationHolm guest inquiry with stay dates, party details and a quoted total.
A quote at the point of contact The guest reviews the requested stay and quote before making an inquiry. Fictional dates, prices and party details; no inquiry was submitted.

Preserving who blocked each date

Availability can come from an imported iCal reservation, a host block, a confirmed direct booking or older data whose source is unknown. Those records now keep their origin. A successful refresh replaces only the dates owned by that feed, while an empty feed can still record a successful sync. A failed fetch keeps existing blocks in place.

Guests see three states: recently checked and open, unavailable, or host confirmation needed. That last state matters. Missing or stale calendar evidence is not the same thing as proof that a date is free.

One place to manage the next host action

The host dashboard brings listing controls and waiting conversations into the same workspace. The queue calls out guests awaiting a reply and calendars that need a sync. Hosts can then open the relevant conversation, review the property, or move into Insights.

VacationHolm host dashboard with listing management and an attention queue.
The host workspace The real host dashboard populated with fictional properties and waiting work. The screenshot illustrates the controls, not an operating customer account.

A reply draft is work with a lifecycle

A premium host can receive a proposed reply to a guest question, edit it, decline it or write their own. Generation runs through a durable job tied to the exact guest message and policy version. The interface can distinguish queued, ready, unsupported, failed and obsolete work. A retry claims one lease, and a newer guest message makes an older draft ineligible.

The draft can use listing facts, the validated quote and host-approved knowledge. Policies and reusable answers have property, host or inquiry scope, plus effective dates and withdrawal. Editing an approved rule returns it to draft. A one-time concession to one guest stays separate from a standing policy for the next.

VacationHolm response draft and source evidence in a fictional guest conversation.
The host makes the sending decision A fictional conversation and proposed reply rendered in the real conversation view. The host can inspect the evidence and choose how to respond; no model call or guest message was sent.

The host should leave Insights knowing what to do

The host view answers several different questions. Which guest questions repeat? Where do listing journeys stop? What searches could this property nearly satisfy? Which inquiries became host-reported bookings, and why were others lost? What changed after a host edited a listing or policy?

Those views use different evidence, so they do not pretend to be one universal conversion number. The listing funnel uses an ordered 14-day journey and immediate prior-step denominators. Missed demand reports the explicit condition that excluded a property and separates indeterminate price or calendar data. Booking totals remain host-reported. Recurring-question analysis counts distinct guest messages and says when a reply link is inferred for older records.

VacationHolm Insights overview with fictional portfolio activity.
The overview behind the detailed views The real Insights dashboard populated with fictional activity. It gives the host a portfolio view before exploring questions, outcomes, the funnel, missed demand and changes.
VacationHolm listing funnel showing ordered steps and per-property percentages from fictional journeys.
The denominator travels with the percentage The funnel follows journeys recorded after analytics consent, from a visible search result to a host-reported confirmed booking. Each rate uses the step immediately before it. Saved inquiries and host-reported confirmations create the final stages on the server; browser events alone cannot claim either conversion.
VacationHolm change insights comparing equal before and after windows for a fictional photo addition.
A comparison with a boundary Equal windows put observed behavior before and after a fictional photo addition. Overlapping edits are flagged, partial windows wait, and the page says that a difference after the edit does not prove the edit caused it.

Failures have somewhere to go

The host dashboard collects waiting guest replies and calendar sync failures. Hosts can open a waiting conversation or request a calendar sync from the queue. A separate action center in Insights links improvement tasks to their editor or conversation, with explicit completion, dismissal and snooze controls.

Hosts record whether an inquiry became a booking outside VacationHolm, stayed in discussion or did not book. Confirmed stays can block the calendar under their own source. Reversing that outcome removes only those booking dates, leaving host and imported blocks untouched.

What the verification proves

Thirteen assertion-based checks exercise the shared quote path, calendar reconciliation, reply knowledge and jobs, outcome history, funnel ordering, missed-demand reasons, recurring questions, change windows and booking analysis. A network-isolated PostgreSQL harness applies the migrations to a disposable database and checks ownership, atomic writes, idempotency and source-specific calendar behavior.

The product had already shipped before this review. These checks establish behavior in the September local source, not production usage or customer impact. They do not establish whether those newer changes, migrations and background workers are deployed.

  • Next.js
  • React
  • TypeScript
  • Supabase
  • PostgreSQL
  • iCal
  • OpenAI

Code snapshot: 6 September 2026. Product context updated 7 September 2026. Technical evidence comes from the VacationHolm repository and its local verification scripts; delivery and ownership reflect the project history. Screenshots use fictional fixtures rendered through the real components, with no live writes or model calls.