Awesome Experiences
Awesome Experiences
Architecture Document · Awesome Experiences

TheblueprintforapremiumAI-nativetravelplatform.

Twenty-seven sections covering system architecture, performance, security, multi-currency, compliance, and the delivery plan for the MVP build. One source of truth — written for the people deciding whether this gets built.

Investment£40,000 + VAT
Timeline12–14 weeks
StackNext.js · Vercel · Anthropic
Prepared forAwesome Experiences
00Contents

Departures · the document, by section.

§SectionGroup
····························
····························
····························
····························
····························
····························
····························
····························
····························
····························
····························
····························
····························
····························
····························
····························
····························
····························
····························
····························
····························
····························
····························
····························
····························
····························
····························
····························
····························
····························
····························
····························
····························
····························
····························
····························
····························
····························
AX · COLD LAVA2026.05.14

Click any row to jump. The full document is one continuous read; the board exists for navigation, not as a substitute for the narrative.

000Executive SummaryMVP SCOPE

The MVP, the price, the timeline, the risks — in one screen.

A 90-second read. Everything that follows is detail. If you only read this section, you have the shape of the build.

AX · MVPI
Investment
£40,000
+ VAT · fixed price
AX · 2026
AX · MVPT
Timeline
12–14 weeks
Five named gates
AX · 2026
AX · MVPS
Stack
Next.js 16 · Vercel
Postgres · Anthropic
AX · 2026
AX · MVPBV
Booking-ops vendor
Week 0 evaluation
FacilitaTrip OR Travel Compositor
AX · 2026
AX · MVPC
Compliance
ATOL · GDPR · WCAG 2.2 AA
Day-one, not bolted-on
AX · 2026
AX · MVPRAC
Run-rate AI cost
£180–300 / mo
AX safety threshold £500
AX · 2026
Problem
  • AX sells premium experiential travel through a workflow built for phone calls and back-office vendors.
  • Every customer interaction routes through DigitalTrip — a platform AX doesn't own and one that's reaching end-of-life.
  • Without rebuilding, AX cannot capture more leads, deliver an AI-native discovery experience, or scale beyond the current operating envelope.
Solution
  • A bounded MVP (12–14 weeks, £40k) that replaces DigitalTrip with an AX-owned platform.
  • AI advisor at discovery, structured TripBuilder at fallback, booking-ops vendor (TBD between FacilitaTrip and Travel Compositor) for back-office.
  • Multi-currency, ATOL-compliant, observable, secure — production-grade architecture from commit one.
  • Migration-safe by design: Year-3 vendor swap rewrites the integration seam, not the customer experience.

Top risks · explicit mitigations.

RiskMitigation (named section)
Booking-ops vendor mismatchWeek 0 evaluation gate (§004b) before Week 2 architecture sign-off.
Cost drift mid-buildFive named gates with explicit pass/fail (§024). Change requests in writing.
Pre-travel compliance complexityMVP = manual + automation; Phase 2 = Sherpa API (§018b).
DigitalTrip cut-over riskCrawl + redirect map + 30-day overlap (§021).
Technical deep-dive
§004 → §017 → §008b → §013 → §004b
Architecture, security, testing, booking flow, integration layer.
Commercial overview
§001 → §002 → §024 → §025 → §026
Overview, operating model, drift prevention, IP/insurance, timeline.
90-second read
This page → §001 → §026b
The summary, the principles, the Phase 2 roadmap.
001OverviewARCHITECTUREMVP SCOPE

A platform built for the way Awesome Experiences sells.

Technical architecture for the AX MVP. What gets built, how, where the risks are, and how cost and timeline are protected. Written for the people deciding whether this gets built.

Booking confirmation
<0 hr
DMC-anchored model
LCP target (UK)
<0 s
Vercel edge + Next.js 16
Uptime SLO
0%
Multi-region failover
Accessibility
WCAG 2.2 AA
From day one
Compliance
ATOL
Cert on confirmed booking
Sections in this doc
0
All built. All evidenced.
01

AX owns the platform.

  • Every line of code, every database row, every booking record stays portable.
  • FacilitaTrip is a back-office vendor — not a lock-in.
  • Year-3 swap rewrites the integration layer only, not the customer experience.
02

Premium, not demo.

  • No disabled features, no Vietnam-only restrictions, no mocked-for-screenshot flows.
  • Multi-currency from day one. Six languages activated at launch.
  • Production-grade security and performance budgets enforced in CI.
03

AI as advisor, not autopilot.

  • Mid-tier conversational LLM with in-session memory; cross-session persistence architected for Phase 2.
  • Hard-bounded to AX-approved inventory — cannot invent trips or quote unsanctioned prices.
  • Cannot bypass booking guardrails. Accelerates discovery, never impersonates.
Build a system serious enough that customers trust it with the most expensive holidays they take, and investors trust it with the next round.
The goal, in one line
Included in the MVP scope
  • Pioneers Club + structured discount-code engine
  • Live agent take-over of customer bookings
  • Multi-currency real-time + six-language launch, architected day one
  • Defence-in-depth security: removed the attack surface, then hardened what's left
  • In-flow lead capture, abandoned-search recovery automation
  • Editorial blog module + structured SEO / GEO schema
Investment, fixed price
  • MVP fixed price: £40,000 + VAT
  • Ongoing retainer: £500/month — website hosting + 3–4 hrs/month (maintenance of the live system, plus small development requests)
  • AI / LLM usage billed at cost, on top of the retainer
  • 12–14 weeks from project start to live launch
  • Five named gates with descope / proceed / rescope option
  • 10% AX-controlled change-request budget (£4k) — for items AX requests outside agreed scope; only invoiced if used
  • Weekly Loom updates, fortnightly checkpoint calls
  • Code, IP and data fully assigned on payment
Ongoing retainer
The £500/month retainer covers hosting and 3–4 hours of maintenance — monitoring, content updates, and small fixes that keep the live platform healthy. That is the included amount, not a cap. Development work— new features, changes, or additions AX requests — is quoted and billed separately on top, at the standard rate.
How Cold Lava works
On development hours alone, this build prices well above £40,000 — and it’s set where it is deliberately. Cold Lava would rather build a platform properly, price it fairly, and stay close to it as AX grows than take a maximal one-off fee and move on. The fixed price, the named gates, and the ongoing retainer are built around that: a platform that survives its delivery, and a team still there when AX needs it.
What MVP means in this document
“MVP” here is a commercial scope — the features bounded by §3 / §4 that ship in 12–14 weeks for £40k. The architecture is built to enterprise-grade from day one (security, compliance, currency, observability) so nothing in the next two years requires a rebuild. Some sections describe the architecture (permanent foundation); others describe the MVP feature set (bounded). The Phase 2 Roadmap section makes the boundary explicit.
How to read this document
Read top-to-bottom for the full picture, or use the section rail to jump straight to a specific area — system architecture, security, the booking flow, delivery, commercials. Every section is self-contained.
001bMVP BoundaryMVP SCOPE

A real platform with a deliberately narrow launch.

The most common question a CTO asks when reading an MVP plan is: where does MVP end and full-scale begin? That distinction is set out below. The platform we architect is sized for the full envelope from commit one. The catalogue we launch with is curated, not exhaustive. Phase 2 expands it.

01

Real, live, fully-functional.

Nothing in MVP scope is disabled, mocked, or placeholder. ATOL certificates are real. Stripe takes real money. The DMC genuinely receives the email. The matching algorithm genuinely learns. Cold Lava does not ship demonstration-only software.

02

Phase 2 expansion path.

The MVP catalogue of 40-50 trips across 15-20 countries is the starting envelope. The platform is built to scale to a full-scale catalogue of approximately 250 trips across 50 countries without architectural rework. Phase 2 expansion is a content and operational exercise, not a technical re-platforming.

Side by side.

DimensionMVP launch (Phase 1)Full-scale (Phase 2+)
Catalogue breadthMVP40-50 trips, 15-20 countriesP2+~250 trips, 50 countries
LanguagesMVPSix at launchP2+Full multi-language content
DMC channelMVPEmail-based, 1 active channelP2+API-based, multi-channel
Refunds / amendmentsMVPManual ops; system records stateP2+Automated orchestration
AI advisorMVPConversation + matchingP2++ Voice + ML refinement
MobileMVPResponsive websiteP2+PWA install + native apps
Inventory ingestMVPManual entry by AX staffP2+Assisted bulk inventory import
PersonalisationMVPCohort-level segmentationP2+Individual-level (history + social)
InsuranceMVPOut of scopeP2+Integrated upsell
TOMS VATMVPSystem captures data; AX accountant computesP2+TOMS-aware journals into accounting
002Operating Model

The business model the platform is built around.

The platform is not a generic booking engine. It is a wrapper around AX's specific operating model: DMC-anchored, ATOL-protected, catalogue-owned, with a Pioneers Club layer for early adopters and discount-driven cohorts. Every architectural decision below traces back to one of those facts.

01

DMC-anchored business logic.

Awesome Experiences books packages, not flights. The Destination Management Company on the ground confirms inventory, supplies the experience, and handles in-resort. The platform is built around DMC orchestration: every booking starts with a DMC notification and ends with a DMC confirmation. The technology is a wrapper around that real-world workflow.

02

AX owns the catalogue.

Tour templates, day templates, components, pricing matrices, margin rules, hotel tier definitions, SEO copy, imagery, constraint rules — all stored in AX's database, not the vendor's. FacilitaTrip is a back-office booking engine; it does not own AX's product structure. This is the migration-safety guarantee written into the data model.

03

Booking confirmation within 48 hours.

Customer-facing promise: any booking that starts has a confirmed DMC outcome (accept / alternative / reject) within 48 hours of deposit. The system enforces this as an SLA — if a DMC is silent, escalation routes to AX admin automatically. Customers are not left waiting in 'DMC pending' state without a human eye on it.

ATOL legal model — confirmed at kick-off.

ATOL compliance is not primarily a software question. It is a question of who is legally principal for each package booking. The answer is a kick-off decision — and it determines who issues the ATOL Certificate, who holds customer money, and which booking system is mandated. The platform implements to whichever model AX confirms.

Option A

AX holds its own ATOL licence.

AX is the principal for every package. AX issues every ATOL Certificate. AX bears the financial protection responsibility — bonding, audited accounts, APC payments per passenger, CAA reporting, claims handling. The platform issues certificates directly from the booking flow. Most flexible long-term; highest compliance overhead up front.

Option B

AX sells under a host operator's ATOL.

AX operates as an agent under a written agreement with an ATOL-licensed host. The host is the principal; the host issues the ATOL certificate; the host typically holds the customer payment. The host's booking system may be mandated. Lower compliance overhead; some operational constraints depending on the host. Many UK boutique tour operators run this model.

Confirmed in writing at kick-off
AX confirms in writing at kick-off whether the platform implements Option A (AX as ATOL principal) or Option B (AX as agent under a host’s ATOL). The certificate-issue mechanism sits behind a stable interface either way — the legal model determines the implementation, but the platform’s booking flow is identical. See §018 Compliance for certificate generation and audit detail.

Pioneers Club — discount and membership layer.

AX’s loyalty and acquisition model. Members get early access, exclusive trips, and discount codes scoped at trip or cohort level. Built into the data model from commit one so AX can run promotions from launch — not bolted on after.

Discount engine

Promo codes scoped per-tour, per-cohort, percentage or absolute, with date constraints. Powers Pioneers Club offers and standalone sales promotions alike — including partner-tied campaigns. Enforced on every quote.

Members-only inventory

Selected tours flagged as Pioneers Club exclusives, hidden from public catalogue, only visible to logged-in members.

Early access window

New trips visible to Pioneers Club for a configurable window before opening to general catalogue.

Margin-protected discounts

Codes apply to sell price, never to net cost. AX margin is preserved even on the most aggressive discount.

Agent takeover.

AX staff can open any customer’s session from the admin dashboard, edit the booking on their behalf, and complete the payment via a Stripe payment link sent during a phone call. Every edit is audited under the agent’s identity; the customer sees the change set in their booking history with the agent’s name. Detail in §013 Booking Flow.

It is treated as a first-class state transition rather than a side feature. It is how AX retains high-touch customer service in a self-serve digital flow.

003The complete loop

The end-to-end customer flow.

From the first ad impression to the post-trip review and back into the matching engine. Two parallel discovery paths (AI advisor and structured wizard), an exception loop on DMC rejection, and a self-perpetuating feedback loop that returns from post-trip improvements into both the matching algorithm and discovery for the next traveller.

The complete loop · Discovery to post-trip · Self-learning feedback returns to the match engine and to discovery for the next traveller · Click any stage to jump to its section
STAGES 01–04

Acquire

Lead enters via paid, organic, partner, or remarketing. UTM and behavioural data captured pre-consent at minimum-necessary level only; full tracking activates on cookie permission. Landing page is dynamic — same template, different hero based on campaign source.

STAGES 05–07

Discover & match

Customer chooses path: AI advisor or structured wizard. Both feed the same matching engine. Engine applies hard filters, then ranks AX-approved trips with weighted scoring and returns top 5. Customer selections train the algorithm via damped feedback.

STAGES 08–13

Tailor, book, confirm

Detail page → live tailoring with real-time re-pricing → provisional booking + Stripe deposit → DMC confirmation step (accept / alternative / reject) → confirmed booking with ATOL Certificate issued, margin frozen, customer in their account.

STAGES 14–16

Trip & loop

In-resort experience and live itinerary in the web app. Post-trip questionnaire feeds Improvements — which tunes match-engine weights and seeds discovery for the next traveller in the same cohort. The system self-perpetuates.

Save and resume — at every stage
Customers do not book in one sitting. From stage 03 onward, every action is saveable, every search is recoverable via signed link, and every abandoned itinerary triggers a follow-up sequence after 24 hours. The agent take-over path lets an AX team member load the customer’s exact session state and complete the booking on their behalf during a phone call — including a secure Stripe payment link.
What this diagram is, and what it is not
This is the customer-facing happy path with two named exception loops and one self-perpetuating feedback loop. It is not the operational diagram (those live in System Architecture §004 and Booking Flow §013). It is not the engineering sequence diagram. The intent: one screen the whole company can stand around and agree on.
004System ArchitectureARCHITECTURE

Six layers, named at every level.

Stated precisely. The system is six horizontal layers, each owned explicitly by AX or by a vendor. AX owns every layer above the Integration Bus. The Integration Bus is the seam where AX-owned code talks to vendor systems — and the seam where a Year-3 swap would rewrite the integration layer only, not the customer experience above it.

6-layer architecture · AX owns every layer above the Integration Bus · Year-3 vendor swap = rewrite the integration layer only

Layer-by-layer.

LayerTechOwnershipWhy this layer exists
01Customer UXNext.js 16 + React 19 + Tailwind 4 + Framer MotionAX-ownedEdge-rendered, PWA-installable, fully branded. The thing the customer sees and trusts.
02Vercel EdgeVercel platform (CDN, WAF, image optimisation, ISR)AX-ownedPerformance budget enforced at the edge. WAF + BotID at the perimeter.
03AX APINode.js + NestJS · REST endpointsAX-ownedAll client traffic routes through AX-owned endpoints. No direct vendor calls from the browser.
04AX data + intelligencePostgres + Redis + pgvector + Algolia + Claude Sonnet 4.6AX-ownedCatalogue, pricing, customer data, search index, AI advisor — all AX. Vendor-portable.
05Integration BusWebhooks + queues + idempotency keysAX-ownedThe seam where AX talks to vendors. Year-3 swap = rewrite this layer only.
06Vendor / externalBooking-ops vendor (FacilitaTrip OR Travel Compositor — see §004b) · Stripe · Xero/QuickBooks · SendGrid · Anthropic · DMC inboxes · Mapbox · Duffel/AmadeusVendorEach vendor sits behind the Integration Bus. Replaceable without touching layers 01-05. Booking-ops choice is a Week 0 evaluation, not a pre-decision.
Volume envelope (Phase 1)
Architecture sized for the Phase 1 envelope: 40-50 trip templates, 15-20 countries, ~250-500 bookings/year, peak 30 concurrent users. Postgres runs on a single Vercel-managed instance (db.t4g.small equivalent); Redis fits in-memory; Anthropic spend sits well within the £500/month safety threshold at expected session volume. The architecture is designed to scale well beyond MVP without rework — database schema, caching strategy, and rendering pipeline all accommodate a substantially expanded catalogue toward the ~250-trip, 50-country full-scale envelope.

Booking-ops vendor evaluation — Week 0 / Week 2 gate.

The AX brief leaves the vendor open between FacilitaTrip and Travel Compositor (§004b makes the comparison explicit). Week 0 is sales calls and demos with both. Week 1-2 is contractual and technical review of whichever vendor AX confirms — sandbox access, payload examples, sandbox booking proven end-to-end, gap analysis. AX retains the right at this gate to descope, defer, or proceed at the original scope.

CriterionPassFail
Vendor selected (FT or TC)One vendor confirmed by AX after Week 0 evaluation callsBoth vendors fail evaluation → architecture remains, vendor layer rescoped
Single source of truth (decisive)Vendor exposes inventory via API for the AX front end to query directly at request time — no replication into AX's own database requiredVendor requires inventory replication into AX's DB → deprioritised regardless of other strengths: sync logic, data-drift risk, and operational overhead with no offsetting benefit
Sandbox access provisionedYes — credentials in hand, sandbox booking written end-to-endNo access by end Week 1 → escalate to AX; pause if not resolved Week 2
Booking object model documentedRequired fields, state transitions, IDs all matched to specMaterial gaps logged; rescope produced
Payment ownership confirmedStripe under AX, vendor receives reference onlyIf vendor mandates payment ownership → migration-safe arch broken; Option B (host ATOL) reconsidered
ATOL document handlingConfirmed who issues, where stored, audit log accessibleAligns with §002 ATOL legal model decision
Rate limits + webhook reliabilityDocumented, sufficient for projected MVP volumeQuoted as separate scope or capped
Data export sampleBooking + customer + payment records exportable in machine-readable formMigration-safe Year-3 promise weakened; AX accepts or AX descopes
Outcome on fail
Project pauses. AX has three options: descope (drop affected scope from Phase 1), defer (move affected scope to Phase 2 with re-quote), or rescope at the original price. No build work proceeds against unverified vendor endpoints. Detail in §024 Cost Drift Prevention.
004bIntegration Layer · Named ConnectorsARCHITECTURE

The booking-ops vendor is a Week 0 evaluation. Architecture is shape-agnostic until it's resolved.

AX has left the booking-ops vendor open: ‘most probably FacilitaTrip or Travel Compositor.’ The architecture commits to neither until the Week 0 evaluation gate. The Integration Bus connects to whichever vendor AX confirms — and the rest of the API stack adjusts accordingly.

FacilitaTrip vs Travel Compositor — both are candidate connectors.

DimensionFacilitaTripTravel Compositor
ScaleSmaller, boutique400k+ reservations/year
Suppliers~100 incl. TBO Holidays100+ incl. Hotelbeds, Booking.com, Expedia, Amadeus, Travelport
Hotel breadthVia TBO + othersDirect Hotelbeds/Expedia/RateHawk + 30+ bed banks
ActivitiesAggregated downstreamDirect Viator, Civitatis
Dynamic packagingAvailableWorld-patented, core feature
AI trip-builderNot native‘AI Trips’ patented engine
OnboardingFree consultations, partner-yHeavier, more enterprise
Integration time (vendor)<1 month claimedMulti-month typical
Operational stabilityNo flagged concernsSome Capterra negative reviews

Pricing for both: not publicly available. FacilitaTrip starts at €1,500/user/month per Capterra. Travel Compositor is tier-based (‘choose 8 of 20 engines’). Both require sales conversations as a Week 0 gate item.

Connector inventory · MVP / Phase 2 hedged by booking-ops choice.

ConnectorRoleIf FTIf TCCost / note
DuffelModern flight booking · 300+ airlines · NDC/GDS · no IATA requiredMVPPhase 2~£300/mo at MVP volume (no IATA) · materially less with own IATA · sales for enterprise
Amadeus Self-ServiceFallback flight content · breadth for niche carriers Duffel may not coverMVPMVPPer-call pricing in dashboard only · sandbox is free
Hotelbeds APItudeDirect hotel inventory · 250k properties · Europe/LATAM strengthPhase 2Commercial only · no public pricing · third-party reseller cites £40-120k integrationIf Travel Compositor wins, already covered via TC's native Hotelbeds connector.
Viator Merchant300k+ tours & activities · OCTO-shaped abstraction layerMVPPhase 2£0/month + refundable deposit · cost lives in booking marginIf Travel Compositor wins, use TC's native Viator connector for MVP.
aviationstackReal-time flight status · 250+ countries · post-booking opsMVPMVP$49.99/mo Basic · $0 free tier covers MVP barelyNeither booking-ops vendor provides post-booking flight status.
MapboxMaps · geocoding · routing · address autofillMVPMVP$0/month at MVP volume · all SKUs within free tier
Google PlacesPOI · reviews · photos · for casual recommendations beyond bookable inventoryMVPMVP$0/month at MVP volume · 5k Pro events free per month
openexchangerates.orgCanonical FX rate-of-record at deposit lock · audit clarityMVPMVP$0/month free tier · daily snapshot well under 1k call limit
OpenWeatherPer-destination per-date weather · 'what to expect on your trip dates'MVPMVP$0/month free tier · cached server-side
HaveIBeenPwnedBreach-list password rejection at signup (k-anonymity)MVPMVPFree · no API key required
SherpaReal-time visa, vaccination, travel restriction dataPhase 2Phase 2Commercial only · sales contact requiredCloses the Pre-Travel Compliance gap (see §018b).

Flight connectors — the named primary.

The named primary flight connector is the Lyme / Aviate consolidator — two sides of the same business: Lyme handles British Airways and the broader BA group; Aviate handles all other airlines. Both expose an API (recently introduced; their previous model was offline-only via phone, email, or manual entry). They are named here as the most likely default for MVP and Phase 2, not as a required dependency — additional flight inventory sources can be added as connectors over time.

Why the booking-ops choice cascades.

If FacilitaTrip

FacilitaTrip's supplier breadth is shallower. Direct connectors fill the gap on day one.

  • Duffel for flights — MVP day one
  • Direct Viator Merchant — MVP day one
  • Hotelbeds APItude — Phase 2
If Travel Compositor

TC's 100+ supplier connectors collapse most of the direct-API stack into the booking-ops layer.

  • Hotelbeds inventory — already in TC, no separate integration needed
  • Viator inventory — already in TC, direct Merchant becomes optional Phase 2
  • Duffel — Phase 2 / case-by-case (TC covers most flight needs)
What this means commercially
Don't commit until the demo. Week 0 is two sales calls + technical demos. Pick the vendor whose actual top-route portfolio matches AX's own. The £40k MVP build cost is unaffected; the ongoing run-rate cost (vendor licence + per-API fees) materially shifts based on the choice.
005Technology Stack

Every choice named. Every alternative named.

Each technology was selected against named alternatives. Click any row to see why it won and what was rejected.

AreaChoiceVersionWhy this
Stack consistency = handover hygiene
AX’s sister builds (Gen1, ax-fresh) already use Next.js + React + Tailwind + Framer. Same toolchain, same major version, same patterns. AX’s next development partner reads this codebase on day one without onboarding friction.
006PerformanceARCHITECTURE

Speed is a budget. We commit to numbers.

Performance is treated as a budget, not an afterthought. The platform commits to specific Core Web Vitals targets per region, monitored from launch via Vercel Speed Insights. Regressions of more than 10% week-over-week trigger an alert.

Production targets per region.

RegionLCPINPTTFBLighthouse
United Kingdom≤ 1.8 s≤ 200 ms≤ 400 ms≥ 95
European Union≤ 2.5 s≤ 200 ms≤ 500 ms≥ 92
United States≤ 3.0 s≤ 250 ms≤ 700 ms≥ 90
Rest of world≤ 4.5 s≤ 300 ms≤ 1.0 s≥ 85

Targets measured at the median of real-world traffic captured by Vercel Speed Insights. Lighthouse scores measured on mobile profiles in CI before each release.

How we hit them.

01

Edge rendering on Vercel.

Stateless pages — homepage, category landings, trip detail — render at the edge with Incremental Static Regeneration on a 5-minute revalidation cadence. Stateful pages (TripBuilder, account, booking) render from the user's nearest region.

02

Image pipeline.

Every image served via next/image with AVIF and WebP fallbacks, responsive sizes per breakpoint, blur placeholders. Vamoos-sourced imagery auto-resized and cached on Vercel's image CDN. Hero images carry priority and a per-page bundle budget of 350 KB.

03

Font subsetting.

Brand fonts subset to the Latin-1 character set, served via next/font with display: swap. Total font payload under 60 KB gzip. No FOUT, no FOIT, no layout shift on text load.

04

Bundle budget per route.

Hard limit of 180 KB JS gzip per route, enforced via next-bundle-analyzer in CI. Route-level code splitting on the TripBuilder, the LLM advisor, and the tailoring module — each is a separate bundle, loaded only when entered.

05

Database query budget.

Any list endpoint serving search results returns in ≤ 180 ms p95 from a warmed Postgres. Indexes on tour_template (destination, duration, party_size), pricing_matrix (tour_id, date_band, party_size), and a denormalised trip_search_index materialised view rebuilt nightly.

Reference points.

Vercel Speed Insights, wired in from commit one
Real User Monitoring is on every page from the day the site goes live. The numbers in this section are what we measure against in production — not a one-off Lighthouse run before launch.
007Browser & Device

Every browser, every screen, tested before release.

Browser and device coverage, made explicit. The platform supports an explicit matrix of browsers and three responsive breakpoints. The MVP ships as a fully responsive website — no native iOS or Android binary, no App Store / Play Store distribution. AX’s spec calls for a ‘downloadable APP’; the architecture is PWA-ready, with home-screen install activated in Phase 2 rather than the MVP build (see Phase 2 Roadmap).

Browser support matrix.

BrowserMin versionUK shareRationale
Chrome (desktop + Android)120+≈ 62%Dominant desktop and Android share
Safari (desktop + iOS)16.4+≈ 24%Required for iOS PWA install
Edge (desktop)120+≈ 5%Chromium-equivalent
Firefox (desktop)121+≈ 3%Long-tail desktop coverage
Samsung Internet (Android)23+≈ 3%Long-tail Android coverage

Coverage figures from StatCounter UK, rolling 90-day window. On iOS, third-party browsers (Chrome, Firefox, Edge) run on the same Safari / WebKit engine, so the Safari row covers them. Older browsers receive a simplified server-rendered fallback — bookings still complete, with reduced visual polish.

What this means in plain English
Safari 16.4+ covers iPhone 8 / X and newer (2017 onwards). iPads from roughly 2017+. Macs from roughly 2013–2015 onwards. The platform is designed to work well on devices up to around 8 years old. Older setups receive a simplified server-rendered fallback that delivers core functionality — browse, book, account access — without the interactive enhancements of the main interface.

Three breakpoints, intentional layouts.

Mobile
≤ 640 px

Single column. Sticky bottom nav on TripBuilder. Tap targets ≥ 44 × 44 px.

Tablet
641 – 1024 px

Two column. Sidebar collapsible. TripBuilder steps stack vertically with persistent progress bar.

Desktop
≥ 1025 px

Full layout. Persistent left sidebar. Map and itinerary share viewport. Hover affordances active.

PWA-ready architecture — home-screen install activates in Phase 2.

Home-screen install as a Progressive Web App — on iOS 16+ Safari and Android 12+ Chrome, with an icon, splash screen, and full-screen launch — is a Phase 2 addition. It bridges the spec’s “downloadable APP” ask without the App Store review cycle, the Play Store fees, or the native-code maintenance burden.

MVP scope is the fully responsive website. Both the PWA home-screen install and the richer in-trip companion experience — offline-first vouchers, push for flight delays, daily itinerary map, in-app contact-AX — are mapped in the Phase 2 Roadmap, not in the £40k commercial scope.

iOS minimum
16.4
Android minimum
12
Service worker
Phase 2
Native app
Phase 2

Phase 2App Store + Play Store distribution. React Native wrapper around the PWA, certificate management, ongoing store maintenance. Indicative add: £15–25k.

QA pipeline + accessibility.

Cross-browser

BrowserStack matrix on every release branch.

A smoke suite covers homepage, TripBuilder happy path, search results, trip detail, booking flow on each browser × breakpoint combination. Visual regression diffs via Percy — any unexpected diff blocks the release until resolved.

Accessibility

WCAG 2.2 AA throughout.

Keyboard navigation, contrast ratios, ARIA labels, focus management on the TripBuilder steps. Verified via axe-core in CI plus a manual NVDA and VoiceOver pass before launch. No interactive element relies on hover or colour alone.

Common questions, answered
“Can it be installed like an app?” — PWA home-screen install is a Phase 2 addition; the MVP is a fully responsive website (no native binary). “Does it work on my partner’s old iPhone?” — Safari 16.4+, so yes. “Does it look right on my iPad?” — tablet breakpoint is a first-class layout, not a compromise.
008Currency & i18n

Multi-currency and i18n, day one architecture.

Multi-currency is built into the data model from commit one. Sterling is the platform's source-of-truth currency. Suppliers price in around ten base currencies; the platform retails to customers in three presentment currencies — GBP, EUR and USD. The MVP launches in six languages; the i18n architecture scaffolds further locales for activation as AX expands, quoted separately at that point.

Source-of-truth currency
Sterling (GBP)
Presentment currencies
GBP · EUR · USD
Supplier / base currencies
~10 at launch
FX provider (target)
ECB reference + commercial fallback
MVP content languages
Six at launch
Further languages
Quoted per language

FX rate freeze — five points, named.

Travel pricing is a finance system requirement, not a feature. The platform defines exactly when an FX rate is sourced, when it freezes, who bears exposure, and how refunds compute. Five named points; nothing implicit.

StageRate behaviourEffect on booking ledger
QuoteRefreshed hourlyDisplay-only. Customer sees a current estimate in their chosen presentment currency, based on the latest reference rate.
Deposit paidFrozen on the booking recordFX rate is locked. Margin snapshot persisted. The booking ledger now stores both supplier-currency cost and GBP-equivalent.
Balance dueFrozen at the deposit-time rateThe customer's full price is locked at deposit — no exchange-rate movement is passed on between deposit and balance.
Supplier payableRate at supplier-payment timeDelta vs deposit-time rate is journaled to AX margin. Accounting reconciles GBP-vs-supplier-currency margin movement.
RefundOriginal deposit-time rateCustomer is refunded what they paid in GBP. AX absorbs any FX delta on the supplier side.
Currency: contractual fixing at deposit
Once a deposit is paid, the FX rate for that booking is frozen and used for the deposit, balance, and any refunds; later FX movements do not re-price that booking. This is a consumer-protection guarantee, not a discretionary policy — a contracted holiday cannot be re-priced against later FX movement.
Currency: presentment principle
AX retails in presentment currencies only — at MVP launch, GBP, EUR and USD. A manual currency selector in the UI lets customers switch between them. The platform does not retail in supplier or local cost-side currencies (such as THB, ISK, INR) at any point in the booking flow or aftercare. Some operators sell in foreign currency to manage their own FX exposure; AX has deliberately chosen not to, on the basis that pricing in unfamiliar currencies degrades customer experience and trust.

i18n architecture — six languages at launch.

ICU message catalogues.

All UI copy lives in next-intl JSON catalogues, keyed by string ID. Activating a language is a translation and review pass over the catalogue, not a code change. The catalogue ships with the six launch languages populated and further locales stubbed.

Locale-prefixed routes from commit one.

The site ships with locale-prefixed route segments in place for the launch languages. Further locales can be activated by populating the catalogue and toggling a flag — no routing rework, no new Next.js patterns to learn.

Currency abstraction.

The pricing layer takes a quote in supplier currency and renders in the requested presentment currency. Adding a presentment currency beyond the launch set is a Stripe configuration change plus a single backend toggle — no schema migration.

Supplier-currency capture.

Every component (hotel night, transfer, experience) stores its net cost in the supplier's currency. Margin computation respects supplier currency. This is what makes future multi-currency expansion non-disruptive.

Cross-reference
Stripe payment flow detail is in §014 Payments. TOMS VAT treatment is explicitly out of MVP scope (system records data; AX accountant computes TOMS quarterly) — see §018 Compliance.
008bTesting StrategyARCHITECTURE

Five layers of test coverage. Failures block merges, not launches.

Five test tiers, each with a tool, a coverage bar, and a CI gate. The point isn't 100% coverage — it's that nothing breaks silently between AX sign-off on staging and the customer reaching the deposit page.

Five tiers of coverage.

TierToolCoverage barWhat it catches
UnitVitest≥ 80% on lib/, ≥ 60% on app/Pure functions, pricing engine, currency converter, validation, FX maths, matching algorithm scoring, ATOL cert calculator. Fast, deterministic, run on every commit.
IntegrationVitest + Testcontainers (Postgres)Every API route + every booking-state transitionReal Postgres in a container. Booking state machine end-to-end (saved → tailored → provisional → deposit_paid → dmc → confirmed). Stripe webhook parsing. ATOL cert generation. Idempotency keys verified.
End-to-endPlaywrightSix golden flows + every gate-blocking pathReal browser. TripBuilder happy path. AI advisor → match → tailor → provisional → deposit. Save & resume. Agent take-over. Login + 2FA + breach-list password rejection. Cross-browser via BrowserStack matrix.
Visual regressionPercyHomepage + every key marketing surface + 4 wizard stepsDiffs every PR against approved baseline. Unexpected diff blocks merge. Diff-approval is a code-review action, not a screenshot bin.
Accessibilityaxe-core in CI + manual NVDA + VoiceOverZero serious / critical issues per WCAG 2.2 AAaxe-core runs against every Playwright page-load. CI fails on serious/critical. Pre-launch manual screen-reader pass on every primary flow.

What blocks what.

GateMust pass
Pull request openedVitest (unit + integration) green · ESLint clean · type-check clean · axe-core zero serious · Percy diff approved
Merge to mainAbove + Playwright golden flows green on Chromium
Promote to stagingAbove + Playwright cross-browser pass on BrowserStack matrix · pen-test scan clean (week 13+)
Promote to productionAbove + AX sign-off on staging UAT
Test data discipline

Every test seeds its own data via fixtures. Production database is never touched. Stripe uses test mode keys. ATOL generation runs against a sandbox issuer. Anthropic uses a separate API key on a $20/month spend cap so test runs can't accidentally tip the production budget.

Manual UAT (Week 14)

AX staff run a structured UAT pass against staging. Acceptance script per deliverable in §3 of the proposal. Failures block production promotion. UAT is a sign-off ritual, not a discovery — automated tests catch regressions before they reach UAT.

Why this matters
The fair question of any £40k MVP is “will this actually work in production?” Five named test tiers + automated CI gates + cross-browser visual regression is the unambiguous answer. None of this is exotic — it is the baseline, applied deliberately.
008cEnvironments & Deployment PipelineARCHITECTURE

Four environments. Preview-per-PR. Migrations isolated by Neon branching.

The defensive answer to ‘how does code get from a developer's machine to production safely?’ Vercel handles deploys; Neon handles database branching; CI handles gates. Every PR has its own preview URL. Every migration is rehearsed on a branch before it touches production.

Four environments.

EnvURLDataAccessPromotion
Locallocalhost:3000Docker Postgres + Redis · seeded fixturesEach developer
Preview (per PR)ax-architecture-pr-{n}.vercel.appNeon branched DB (forked from staging)Cold Lava + AX (link only)Auto on PR open · destroyed on PR close
Stagingstaging.ax.comNeon staging DB · sanitised production-like datasetCold Lava + AX team · password-gatedAuto on merge to main
Productionax.comNeon production DB · full WAL backupsPublic · WAF + BotID at edgeManual promotion after staging UAT sign-off

Pipeline · code → production.

  1. 01PR opened. Vitest + ESLint + type-check + axe-core + Percy diff. Vercel preview URL posted to PR.~3 min
  2. 02PR merged. Playwright golden flows on Chromium. Auto-deploy to staging.~6 min
  3. 03Staging deployed. Cross-browser Playwright on BrowserStack. Smoke test against real Stripe sandbox + ATOL sandbox.~12 min
  4. 04UAT sign-off. AX runs structured acceptance script. Tickets opened against any failures.Ad-hoc
  5. 05Production promote. Manual click in Vercel dashboard. Database migrations run via Neon branch-then-merge.~2 min + monitor

Database migrations · Neon branch-then-merge.

Migrations are the highest-risk part of any deployment. Neon's branching model lets us rehearse each migration against a real copy of the database before touching production.

01Branch from staging

Every PR gets a Neon branch off staging. Migrations run against the branch. Application connects via env-var-injected DSN.

02Test in branch

Integration tests + E2E run against the branched DB. Real data shape, isolated writes. Branch is read-only against parent.

03Merge migration

On PR merge, the migration is applied to staging. Forward-only — no rollback once merged. Reverts go through a new corrective PR.

04Production migrate

Production migration is a separate explicit step at promotion time. Schema dry-run on a fresh production-clone branch first to catch surprises.

Why this matters
Explicit dev / staging / prod, preview-per-PR, and Neon branching for safe migrations — all three are wired in CI from week 2 onward. The staging URL is live for AX review from week 3.
009Data Model

14 entities. Three layers. Audited everywhere.

The platform's data model is structured in three layers: catalogue (the AX product), booking (transactions), and user (identity + history). Every transactional row is versioned, every booking-affecting write is audited, every user-owned table is RLS-protected. The ERD below is the spine.

14-entity ERD · Catalogue layer (top) · Booking layer (middle) · User layer (right) · Audit columns (timestamps + actor) on every transactional row, omitted from diagram

Catalogue layer.

AX-owned. Pre-built structured content. The differentiation lives here — AX’s curated tours, pricing rules, supplier mapping. Year 3 FacilitaTrip swap leaves this layer untouched.

TourTemplate
Standard tour. Destination, duration, hero imagery, base price by date band, party size, hotel category.
DayTemplate
One day in a tour. Default components + alternative components. Routing constraints. Per-day imagery + copy.
Component
Reusable building block: experience, hotel night, transfer, permit. Net cost, markup rule, capacity, tags.
PricingMatrix
Versioned. Date band × party size × hotel category × room type → sterling sell + margin snapshot.
HotelTier
Hotel category definition (3★ Character / 4★ / 5★) with supplier mapping per destination.

Booking layer.

Transactional. Regulated (ATOL audit). Linked to FacilitaTrip via booking reference but not dependent on FacilitaTrip's schema.

Booking
Transaction record. Status, margin snapshot at booking, FX rate at deposit, audit columns. Immutable transitions.
Passenger
Per-booking person. Name, DOB, passport, dietary, special needs. PII; encrypted at rest.
ATOLCertificate
Issued post-DMC. PDF storage reference, issued_at timestamp, audit_id linking to immutable log.
Payment
Stripe PaymentIntent linkage. Deposit + balance entries. Currency, GBP-equivalent, FX snapshot.
DMCRequest
Outbound booking notification. Response timestamp, accept/reject/alternative, retry history.

User layer.

Identity, preferences, GDPR audit, AI session state. The only layer carrying personally-identifiable information at scale.

User
Account record. Email, hashed password, 2FA secret, preferences blob, marketing flag, GDPR audit cols.
SavedSearch
Per-user. Search preferences, resume token (signed), abandonment timestamps for recovery emails.
ConsentLedger
GDPR audit trail. user_id, consent type, wording version, timestamp, IP. Append-only.
ChatSession
AI advisor session. user_id (or anon), turns, token usage, derived structured fields, cost.

Versioning + audit — example.

The PricingMatrix is the most temporally-sensitive table. Below is its shape. Every other transactional table follows the same audit-column pattern.

CREATE TABLE pricing_matrix (
  id              UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  tour_template_id UUID NOT NULL REFERENCES tour_template(id),
  date_band_start DATE NOT NULL,
  date_band_end   DATE NOT NULL,
  party_size      party_size_enum NOT NULL,
  hotel_tier_id   UUID NOT NULL REFERENCES hotel_tier(id),
  room_type       room_type_enum NOT NULL,

  -- Costs in supplier currency, sells in GBP
  net_cost        NUMERIC(12,2) NOT NULL,
  net_currency    CHAR(3) NOT NULL,         -- ISO 4217
  sell_gbp        NUMERIC(12,2) NOT NULL,
  margin_pct      NUMERIC(5,4) GENERATED ALWAYS AS
                  ((sell_gbp - (net_cost * fx_to_gbp)) / sell_gbp) STORED,

  -- Validity window, versioning
  valid_from      TIMESTAMPTZ NOT NULL,
  valid_to        TIMESTAMPTZ,            -- NULL = current
  superseded_by   UUID REFERENCES pricing_matrix(id),

  -- Audit
  created_at      TIMESTAMPTZ NOT NULL DEFAULT now(),
  created_by      UUID NOT NULL REFERENCES users(id),
  version         INT NOT NULL DEFAULT 1,

  CONSTRAINT no_overlap EXCLUDE USING gist
    (tour_template_id WITH =, party_size WITH =, hotel_tier_id WITH =,
     tstzrange(valid_from, valid_to) WITH &&)
);

CREATE INDEX idx_pricing_lookup
  ON pricing_matrix (tour_template_id, party_size, hotel_tier_id)
  WHERE valid_to IS NULL;

Versioning rules — applied across the model.

Audit columns on every transactional table

created_at, created_by, updated_at, updated_by, version. Standard across User, Booking, Passenger, Payment, DMCRequest, ATOLCertificate.

PricingMatrix versioned, never overwritten

Each price update creates a new row with a valid_from / valid_to window. Historical bookings always reference the price they were booked at.

Immutable audit_log for booking writes

Every write to a booking-related table writes a row to audit_log. actor_id, action, before, after, correlation_id. 7-year retention for ATOL.

Soft deletes for user-deletable data

User-initiated deletion soft-deletes the record (deleted_at). Anonymisation pass redacts PII while preserving financial integrity. Hard delete after 30-day cooling-off.

Migration-safety in the data model
Every entity above is owned by AX, not by FacilitaTrip. FacilitaTrip receives copies of booking data via the Integration Bus, not the other way around. Year 3 swap-out: the Booking and DMCRequest tables get new IDs from a different vendor, but the schema stays.
010AI LayerARCHITECTUREMVP SCOPE

An advisor, not an autopilot. Bounded by design.

The AI advisor is a Cold Lava USP — a mid-tier conversational interface, hard-bounded to AX-approved inventory. It cannot invent trips. It cannot quote prices it has not been given. It cannot bypass the booking guardrails. It accelerates the discovery experience, it does not impersonate the platform.

Try it. The advisor is live, scoped to a sample of AX's catalogue.

This is the actual claude-sonnet-4.6 model running through Vercel's AI Gateway against 157 real AX toursscraped from the existing site. The model is bounded by the same guardrails described below — try asking for Antarctica or somewhere AX doesn't cover, and watch what happens.

ax
AX Travel Advisor
Online · Sonnet 4.6 · 157 tours
Tell me what kind of trip you're after.

Destination, party, rough dates, budget, style — anything works. I'll search AX's 157 tours and recommend a few that fit.

This demo is an illustrative example. The production advisor — its prompts, conversational flow, and behaviour — is tailored to AX following detailed requirements discussions.

How it's wired.

Model

Claude Sonnet 4.6 (Anthropic).

Mid-tier reasoning with strong instruction-following and tool use. Public pricing: $3 / $15 per million input / output tokens. Enough capability to handle nuanced travel preferences at materially lower latency and cost than the Opus 4.7 top tier ($5 / $25 — about 1.7× Sonnet, not the 3× ratio that Opus 4.x shipped with). The architecture supports an upgrade to Opus in Phase 2 with no application code change — only a model identifier swap. Pricing verified at docs.claude.com on 10 May 2026.

Memory

In-session in the MVP; cross-session in Phase 2.

Within a session, the advisor holds the full conversation context — preferences, dislikes, stated constraints. Cross-session persistence — remembering you didn't enjoy long bus transfers in Vietnam when you return weeks later to plan Cambodia — is architected from commit one but activated in Phase 2. Once live, AI memory falls under the right-to-erasure scope (§018), purged with the customer record on the 30-day hard-delete cadence.

Tool-calling schema.

The model interacts with the platform through four named tools. Conversation orchestration is the model’s job; data retrieval and scoring belong to deterministic Cold Lava code.

ToolSignaturePurpose
extractPreferences(text: string) → StructuredFieldsParses free-text or pasted itinerary into the structured field set the matching engine consumes — hard filters and weighted dimensions alike. Validated for completeness before handoff.
matchTrips(prefs: StructuredFields) → Trip[5]Calls the matching algorithm. The LLM does not score trips; it surfaces them. Returns top 5 with confidence scores.
getItinerary(tripId: UUID) → ItineraryDetailFetches a full day-by-day itinerary from the AX catalogue. Used when the user asks for detail on a recommended trip.
suggestAlternatives(prefs: StructuredFields) → Trip[3]Called when the user rejects the initial 5. Adjusts weightings and re-queries. Damped feedback prevents oscillation.

Hallucination guardrails — three layers.

01

System prompt as policy.

The Claude system prompt is a 1,200-word document, versioned in the repo, reviewed at every change. It explicitly bounds the model: AX trip catalogue only, no fabricated pricing, no fabricated routes, no fabricated hotel names, no off-catalogue destinations. Loaded fresh at every session start.

02

Tool-calling schema, not free generation.

The model does not produce trip recommendations directly. It calls four tools, each implemented in Cold Lava code, each backed by the AX catalogue. The model orchestrates the conversation; the matching engine produces the recommendations.

03

Output validation before render.

Every tool result is validated before reaching the user. Trip IDs must exist in the catalogue. Prices must match current pricing. Hotel names must match catalogue records. Validation failures route the model back through a stricter retry. Three consecutive failures end the session and route the user to the structured TripBuilder.

Off-catalogue handling

When a user requests a destination AX does not currently offer, the model never invents a trip. It acknowledges the gap and offers the closest available match.

User:
“We want to go to Antarctica next February.”
Advisor:
“Awesome Experiences doesn’t currently offer trips to Antarctica. The closest match in our catalogue is Patagonia — also February-friendly, also dramatic landscapes, also small-group. Would you like to explore that?”

Cost model and controls.

Cost model: pay-as-you-go metered API with multi-layer cost controls. Per-session cost (working range, with optimisations applied): £0.08–0.15; pessimistic ceiling £0.20. The earlier £0.40 figure represented an unoptimised baseline — standard optimisations bring it well below. AI / API run-rate costs are carried by Cold Lava through the build and testing phases; metered cost passes to AX at handover.

Six-layer defence-in-depth on run-rate.

  1. 01Structural optimisation. Prompt caching on system prompts (~90% cost reduction on repeated context), Haiku for filtering/classification, Sonnet for advisor reasoning, structured outputs. Combined: ~50–70% reduction vs unoptimised baseline.
  2. 02Per-session caps. 25,000-token budget per session, with graceful auto-handoff to the TripBuilder when reached.
  3. 03Per-user rate limiting. ~10 advisor sessions per IP per day, with cooldown windows on rapid-fire usage.
  4. 04Bot protection. Vercel BotID plus CAPTCHA on AI advisor entry, server-side request validation. See §017 Security for the full bot-protection scope.
  5. 05Real-time monitoring with AX-controlled safety threshold. Continuous token-spend monitoring with anomaly detection. A configurable monthly safety threshold (default £500/month) acts as a final backstop: when reached, the advisor temporarily pauses with a polite handoff to the TripBuilder until AX raises the threshold or investigates the cause. The threshold sits under AX’s control — it can be raised, lowered, or effectively disabled at any time, and is a commercial decision, not a Cold Lava-imposed ceiling. Alerts fire at configurable percentages (defaults 50% / 75% / 90%) ahead of the threshold.
  6. 06TripBuilder primacy. The structured 6-step TripBuilder is the default flow; the AI advisor is for complex or free-form needs. ~80–90% of visitors never invoke LLM spend. See §011.
Expected monthly run-rate

£180–300 / month at MVP scale — assumes ~10,000 monthly visitors, ~15% engaging the AI advisor.

AX-controlled safety threshold

£500 / month default — a configurable backstop, not a fixed ceiling. AX can raise, lower, or effectively disable it at any time. When reached, the advisor pauses with a polite handoff to the TripBuilder until AX adjusts the threshold or investigates.

Full cost-model walkthrough
For the full cost-model walkthrough — realistic vs pessimistic maths, cost-per-conversion scenarios, and worst-case analysis — see the AX AI Layer — Cost Model and Controls companion note.
If Anthropic is unavailable
The structured 6-step TripBuilder remains fully functional as a fallback path. The matching engine is the load-bearing component; the LLM is an accelerator on top of it. AX never hits a state where the platform cannot accept a search because the model is degraded.
011Search & MatchARCHITECTURE

Hard filters, then weighted scoring, with damped feedback.

The engine ranks in clear stages. Hard filters come first — destination and activity type — narrowing the catalogue to trips that structurally fit; a trip that fails a hard filter is never shown. A weighted scoring pass then ranks what remains across the softer dimensions and returns a top-5. A conservative safety-and-suitability overlay sits across both, hard-excluding trips that would be genuinely unsuitable for the traveller. The weighting profile is configuration-driven and AX-owned: Awesome Experiences sets the initial values, and the profile itself is AX IP. Cold Lava's contribution is the engine and the damped-feedback loop — assigned to AX on payment, like every other Cold Lava-authored module in §025. Both the structured TripBuilder and the LLM advisor feed the same engine.

Try the matching engine live.

Drag the sliders. The top-5 reorders in real time as the engine rescores every catalogue trip against your preferences. The score breakdown bars show which dimensions drove each placement. Six dimensions shown here for clarity — the production engine runs the full set detailed below, across both stages.

Live matching engine · drag a slider, watch top 5 reorder
Try
PaceSlow
SlowActive
Budget per person£2,500
£500£5,000+
Duration14 days
3 days16 days
Adventure levelCultural / relaxed
CulturalAdventurous
Party size2 people
Solo12 people
Best monthFeb
Top 5 · ranked by total score
  1. #1Highlights of Vietnam & Cambodia with Phu Quoc 14 Nights
    91 / 100
    15d£1,000slowVietnam · Cambodia
    Pace
    Budget
    Duration
    Adventure
    Party
    Month
  2. #2Conquer Mount Kilimanjaro - Private Climb with Zanzibar
    88 / 100
    11d£750moderateTanzania
    Pace
    Budget
    Duration
    Adventure
    Party
    Month
  3. #3Head to Toe Chile
    86 / 100
    13d£1,000moderateArgentina · Chile
    Pace
    Budget
    Duration
    Adventure
    Party
    Month
  4. #4Head to Toe Chile
    86 / 100
    13d£1,000moderateChile
    Pace
    Budget
    Duration
    Adventure
    Party
    Month
  5. #5Luxury Chile - Head to Toe
    86 / 100
    13d£1,000moderateChile
    Pace
    Budget
    Duration
    Adventure
    Party
    Month

This demo is an illustrative example. The production matching engine — its filters, dimensions, weights, and scoring — is tailored to AX following detailed requirements discussions.

Try the structured trip builder.

The 6-step structured path — the default flow for most visitors. Each step writes to the same structured field set the matching engine consumes. This mirrors the functionality of AX’s existing trip builder, rebuilt to the platform’s design language.

AX Trip BuilderStep 1 / 6
Your trip
Six quick questions — we'll shape the rest.

What kind of experience are you after?

Trip summary
  • Experience type
    Not selected
  • Region
    Not selected
  • Departure
    Not selected
  • Preferences
    Not selected
  • Guides & transfers
    Not selected
  • Budget pp
    Not selected
Steps completed0 / 6

This demo is an illustrative example. The production trip builder — its steps, options, and flow — is tailored to AX following detailed requirements discussions.

Matching engine: hard filters and scored dimensions.

The engine ranks trips against the customer’s stated preferences and returns a small ranked set — a top-5 with an overall match score. Not every input plays the same role. Some define structural feasibility and are applied as hard filters; the rest are weighted, scored, and ranked. A walking holiday returns walking trips — never a city break that happened to score well on budget and dates.

Hard filters — must match

Applied before any scoring. A trip that fails one of these is excluded — or down-ranked so heavily it effectively never appears in the top results.

Hard filter

Destination, region, country

The customer must specify — or have inferred — at least a region before meaningful ranking can occur. A trip outside the stated destination is excluded; it does not enter the ranked set however well it scores on everything else.

Hard filter

Category / activity type

Specialist activity products — walking, wildlife, festival, culinary and similar — are respected as categorical needs. A customer who selects a walking holiday does not see non-walking tours in their top results, however well those tours score elsewhere. Category is matched directly, not approximated by a generic adventure score.

Scored dimensions — weighted, scored, ranked

Run only on the trips that pass the hard filters. These contribute to the overall match score but do not exclude trips outright. Pace is decomposed into two underlying dimensions — physical intensity and schedule tempo — because it means two different things.

Scored dimensionWhat it captures
Physical intensityWalking distance per day, terrain difficulty, altitude, early starts. Most relevant for travellers with mobility constraints, older guests, or anyone who wants a deliberately low-effort trip. One half of pace.
Schedule tempoActivities per day, travel-day frequency, downtime built in — the 'chilled versus packed' dimension. The other half of pace.
Adventure levelHow full-on or mellow a generic tour feels, for customers who have not specified a specialist activity category. A separate dimension from activity type.
BudgetSterling sell against the customer's stated figure, with tolerance bands either side.
DurationTour length against the customer's stated figure, with tolerance bands either side.
Party size and compositionFamily-suitable, couple-suitable, solo-friendly, group dynamics. Mismatches down-rank rather than exclude.
Other soft preferencesStyle (luxury, mid-range, value), accommodation type, food culture, sustainability flags, guide preference, special-occasion tags, and similar.

Safety and suitability overlay.

Certain combinations of customer attributes and trip attributes are treated as hard fails regardless of overall score:

  • High-intensity treks for travellers who indicated mobility constraints, limited fitness, or relevant age flags — excluded.
  • Trips requiring sustained altitude or remote conditions for travellers with relevant health flags — excluded.

The safety overlay is deliberately conservative. It is better to exclude a marginal-fit trip than to recommend something that would be unsafe or unpleasant for the traveller.

Configurable weighting.

The matching engine is data-driven, not hard-coded. Each scored dimension carries a weight (0–100) that determines its contribution to the overall match score. Weights are stored as a configurable data record, editable by Awesome Experiences without code changes, and new dimensions can be added with their own weights.

The initial weighting profile is provided by Awesome Experiences’ founder, William Burton, drawing on two decades of operating a tour-matching business. The weights themselves are provided at project kick-off; every weight shown or implied in this document is placeholder and illustrative until then. The relative shape is deliberate: destination and category weights sit very high — at near-hard-filter levels — while pace and adventure are important but subordinate, and other soft preferences lower still.

Booking-conversion data then refines the weights over time. The refinement is conservative— adjustments are small, validated against booking outcomes, and reversible if they degrade match quality. A poor initial profile destabilises the feedback loop, so AX’s existing operating intuition is the starting position; data-driven refinement layers on top of it, it does not replace it.

Damped feedback loop — how the algorithm learns.

01

Selection signal recorded.

When a customer selects one of the top 5, the dimensions where that trip outscored its peers are reinforced. Dimensions where it underperformed are softly downweighted.

02

Damping applied.

Each weight update is dampened by a momentum coefficient (default α = 0.15). Single sessions don't whip the algorithm — only consistent signal across many sessions moves weights materially.

03

Per-cohort, not per-individual.

Phase 1 learns at cohort level (segment buckets like 'culture-focused 30-50 traveller'). Individual-level personalisation is Phase 2, with explicit consent.

04

Bounded weight range.

No weight can grow beyond 2× its initial value or shrink below 0.25×. Prevents runaway feedback loops that lock the algorithm into a local optimum.

The update rule.

# Pseudo-code — scored-dimension weights only.
# Hard filters (destination, activity type) and the safety
# overlay run before this; only trips that pass are scored
# and ranked here.

def update_weights(prefs, ranked_top5, selected_index, weights, alpha=0.15):
    selected = ranked_top5[selected_index]

    for dim in SCORED_DIMENSIONS:
        dim_score_selected = score(prefs[dim], selected[dim])
        dim_score_others = mean(score(prefs[dim], t[dim])
                                for t in ranked_top5
                                if t is not selected)

        # Reinforce dimensions where selected outscored others
        delta = alpha * (dim_score_selected - dim_score_others)

        # Damped update with bounds
        new_weight = weights[dim] * (1 + delta)
        weights[dim] = clamp(new_weight,
                             0.25 * INITIAL[dim],
                             2.00 * INITIAL[dim])

    return weights

Pace and adventure: getting the wording right.

The TripBuilder asks about pace and adventure in language that distinguishes the underlying dimensions without overwhelming the customer with questions. “How physically demanding do you want this trip to be?” drives the physical-intensity dimension. “How busy do you want your days to be?” drives the schedule-tempo dimension. Each question carries short helper text, so the customer always knows what it controls — the wording deliberately avoids the common mistake of conflating walking intensity with itinerary busy-ness.

Adventure level is asked separately again, and kept distinct from activity type — activity type is the categorical need, matched as a hard filter, not a slider. Where an answer is genuinely ambiguous, conversational follow-up and disambiguation are the job of the LLM Advisor: the structured TripBuilder stays structured, the Advisor is the conversational path, and both feed the same engine.

Two paths in, one engine.

The TripBuilder is the default flow for most visitors — its structured 6-step path handles the majority of trip-planning needs efficiently and intuitively. The AI Advisor is available for visitors with complex, multi-constraint, or free-form needs the structured path cannot easily express: pasted dream-trip descriptions, voice input, or unconventional combinations of regions and themes. Most visitors complete a trip via the TripBuilder; the AI Advisor is a power-user path.

Structured

6-step TripBuilder

Customer chooses dates → countries → experience type → guide preference → budget → review. Each step writes to the same structured field set the engine consumes.

Free-text + voice

LLM Advisor

Customer types a paragraph or pastes an itinerary. Claude extracts to the same structured fields via the extractPreferences tool (§010). Validates completeness before passing to the engine. Identical output format, identical scoring.

Save and resume — at every step
Every search is saveable. Every saved search has a resume token. Every 24h-abandoned search triggers an automated email with a one-click return link. The matching engine state is preserved — the customer comes back to exactly where they were, with the dimension weights up-to-date.
012Tailoring EngineMVP SCOPE

Allowed actions, named constraints, real-time pricing.

Tailoring is the most interactive piece of the platform — and the place where unbounded flexibility breaks the booking economics. The engine takes a small, named set of allowed actions, enforces a constraint engine, and re-prices every change. No free-text 'change anything' — every mutation is a typed action with rules.

Allowed actions — six, named.

ActionEffectConstraint
addDay(after, day)Insert a tailored day at a specific stopCannot break routing logic. Cannot add at stops that don't permit additions. Triggers re-pricing.
removeDay(dayId)Drop a day from the tailored itineraryOnly days marked 'optional' on the parent tour can be removed. Margin recomputed; minimum-night constraints checked.
moveDay(dayId, after)Reorder a day within the tourGeography and routing constraints enforced. Can only move within configured segments.
swapActivity(slot, activity)Replace AM/PM/Eve activity with an alternativeEach slot has a candidate list. Combinability rules: full-day swaps exclude AM+PM combinations. Live re-price on swap.
upgradeHotel(tier)Change overall hotel grade for the tourTier must exist for every stop. Pricing recomputes from PricingMatrix at the new tier.
extendTrip(start, end)Add pre-trip / post-trip staysDefined extension list per tour. Flight check fires on date change. ATOL package boundary preserved.

Constraint engine — declarative DSL, evaluated per action.

Every action passes through a constraint engine before it commits. Rules are declarative (per-tour configuration, not hard-coded). If a rule fails, the customer sees an explanation, not a broken itinerary.

Cannot break routing logic
Geographic adjacency rules per tour. Day 5 cannot be 800 miles from Day 4's overnight.
Cannot violate availability constraints
Component-level availability windows (days of week, blackout dates). Enforced at insert/move time.
Combinability rules respected
Activity slots have combinability flags (full-day = exclusive). The rule engine prevents impossible combinations before re-pricing fires.
Pre/post tours come from a defined list
Per-tour extension menu. Customer cannot append arbitrary destinations.
Margin re-computed every change
Every state mutation fires the pricing engine. The customer sees a live total; AX sees a live margin snapshot.

Live re-pricing pipeline.

  1. — 01Mutate. Customer triggers an action (add day, swap activity). The action is captured as a typed event.
  2. — 02Validate. Constraint engine checks the proposed mutation against all rules. Failure surfaces immediately to the customer with the rule name.
  3. — 03Recompute pricing. Pricing engine recalculates total + margin from PricingMatrix. Includes any FX delta if supplier-currency exposure shifts.
  4. — 04Persist. Tailored itinerary version saved with audit columns. Saved-search token updated so the customer can resume.
  5. — 05Render. UI updates with new total + margin (margin only visible to AX agents, not the customer).
Flight check on date change
Whenever a tailoring action moves the trip start or end date, a Skyscanner-equivalent check fires. If no flights match, the customer gets a double-confirmation gate before they can save the change. AX avoids selling a tour the customer can’t actually fly to.
Phase 2 — AI recomposition
Phase 1 keeps tailoring deterministic and rule-bounded. AI-driven recomposition (e.g. “rearrange this trip to maximise wildlife time”) is Phase 2 — once the rule engine + PricingMatrix history is dense enough to validate AI suggestions automatically.
013Booking FlowARCHITECTUREMVP SCOPE

A booking is a state machine. Every transition is named and audited.

The booking layer is regulated. ATOL, payments, supplier confirmation, and accounting all interact. The way to keep that surface honest is to model the booking as a state machine — every transition triggered by a named event, every transition logged. The diagram below is the system in one read.

Booking state machine · Solid blue = forward path · Dashed orange = exception (cancelled) or feedback (alt / agent edit) · Click states with anchors to jump

Triggers and side effects.

Every transition is owned by a named event. The events listed are the load-bearing ones — the ones that move money, issue regulated documents, or notify external systems. Everything is logged to the immutable audit trail with correlation ID.

EventSide effects
Stripe deposit succeededFX rate frozen on booking. Margin snapshot persisted. DMC notification email queued. Booking transitions Provisional → Deposit Paid → DMC Pending.
DMC acceptATOL Certificate generated as PDF. Customer confirmation email dispatched. Accounting webhook fires to Xero/QuickBooks. Booking transitions DMC Pending → Confirmed.
DMC alternative offeredCustomer notified with the alternative itinerary and revised price. Booking transitions DMC Pending → Alternative. Customer accepts or returns to Tailored to adjust.
DMC silent for 48 hoursAutomated reminder to DMC. Parallel notification to AX admin. After 72 hours, booking flagged 'DMC unresponsive' in admin dashboard for manual escalation.
Balance payment due date hitCustomer reminder sent. Stripe PaymentIntent for balance created. Booking transitions Confirmed → Balance Due. Failure triggers AX admin chase flow.
Agent takeover initiatedAX staff opens customer's session via admin dashboard. Edits committed under agent identity, audited. Customer notified of any change. Booking transitions Tailored → Agent Takeover and back.
ATOL ordering, the right way
ATOL Certificate is issued afterDMC confirmation, never before deposit. The platform never issues a regulated package guarantee for inventory that has not been confirmed. If a DMC rejects, the customer retains a refundable deposit and an audited record — not a certificate covering nothing.

DMC email-confirmation model — edge cases.

Phase 1 uses an email-based DMC confirmation, not API integration. That constrains the failure modes we need to handle explicitly in the state machine. Each one below has an enforced behaviour, not an aspirational one.

Case

DMC silent (no response)

Reminder at 48 h, AX admin alerted at 72 h, manual escalation from there. Booking holds in DMC Pending — deposit refundable on customer request until confirmed.

Case

DMC partial accept (e.g. days 1-8 yes, day 9 no)

DMC submits an alternative via the hosted form. Booking transitions to Alternative. Customer reviews, accepts, or routes back to Tailored to adjust.

Case

DMC accepts then later cancels

Booking reverts to Cancelled. Issued ATOL certificate is voided. Refund to customer triggered manually by AX with full record in audit log. ATOL host informed if applicable.

Case

Multiple DMC channels per tour

Out of scope Phase 1. Each tour has one nominated DMC channel. Multi-channel routing is Phase 2.

Case

DMC insolvency mid-booking

Manual ops by AX. Platform records the event and freezes the booking; refund / re-routing handled outside the system in v1.

Case

Customer abandons mid-payment

Booking transitions Provisional → Cancelled after PaymentIntent expiry. Saved-search recovery email fires after 24 h with a resume link.

Agent takeover.

Agent take-over is a first-class state transition, not a feature bolted on. AX staff open a customer’s live session from the admin dashboard. Edits commit under the agent’s identity and are audited — the customer can see every change, with a timestamp and a reason note. Stripe payment links can be sent for phone bookings, completing the loop.

Customer trust is preserved by transparency. A booking edited by AX shows that fact in the customer’s booking history, with the agent’s name and the change set. There are no silent modifications.

Agent identity
Audited
Customer view
Full diff
Payment links
Stripe
Reversibility
Per edit
014PaymentsARCHITECTURE

Stripe-native, multi-currency, zero PCI burden.

Payments are handled end-to-end by Stripe Elements. Cold Lava code never sees, stores, or transmits card data. PCI compliance lands at SAQ-A — the lightest scope possible — by deliberate design: we removed the attack surface, then hardened what's left. 3DS / SCA enforced. Multi-currency built in from launch — see §008 Currency for the FX rate-freeze model that makes this work.

Card data on Cold Lava infra
Zero
PCI scope
SAQ-A (offloaded)
3DS / SCA
Enforced
Currencies at launch
GBP · EUR · USD
Deposit + balance
Separate PaymentIntents
Refunds
Full + partial

Deposit + balance, decoupled.

Deposit and balance are separate Stripe PaymentIntents linked by booking reference. A partial refund on deposit does not corrupt balance state. A failed balance does not reverse the deposit. Each intent has its own webhook, its own state, its own audit row. Two money events are not one event.

Deposit

Locks the booking, freezes margin and FX.

On Stripe success, FX rate is captured against the booking record, margin snapshot persists, DMC notification fires, booking transitions Provisional → Deposit Paid → DMC Pending. ATOL Certificate is NOT issued at this stage — see §013 for the ordering that protects AX from issuing regulated documentation against unconfirmed inventory.

Balance

Scheduled, automated, monitored.

Balance due date is computed from tour start and supplier terms. Stripe PaymentIntent for balance is created when due. Customer reminder fires N days before; failure routes to AX admin chase flow. Late payment does not silently break the booking — exception path is named and visible.

Payment links for phone bookings
AX agent takeover (§002, §013) uses Stripe-hosted payment links. During a phone call, the agent can edit the booking and send a one-time secure link to the customer’s phone or email. Customer pays in their own browser; agent never sees card data; PCI scope is preserved.

Accounting webhook — the contract.

Every Stripe state transition fires a webhook to the accounting layer (Xero or QuickBooks at MVP launch, configurable). The webhook payload carries the fields below. AX’s accountant uses these to compute TOMS quarterly — the platform records the data, the accountant runs the calculation. TOMS-aware journal entries direct from the platform are Phase 2.

FieldDescription
booking_referenceCold Lava-issued, immutable, prefixed AX-XXXXX
deposit_receivedGBP-equivalent, with FX rate on snapshot
balance_receivedGBP-equivalent, with FX rate at balance time
supplier_payableSupplier currency + GBP-equivalent at payable date
balance_due_dateComputed from tour start and supplier terms
vat_treatmentCaptured per-component (sufficient for AX accountant TOMS)
refund_entriesLinked to original PaymentIntent + reason code + audit ID
fx_rate_snapshotRate at deposit + rate at balance + rate at supplier-payable
What's NOT in MVP scope
Automated refund computation, ATOL re-issue logic, force-majeure orchestration, insurance-claim interplay, and partial-refund FX recomputation are all Phase 2. MVP records the state transitions; AX staff orchestrate the refund flow manually using the accounting fields and the audit log. This is explicitly out of proposal scope — see proposal §4 and the v2 patches.
015CRM & Lead Capture

Captured at every step. Recovered automatically. Saved with audit.

Travellers do not book in one sitting. The platform captures lead data at every plausible stage, recovers abandoned searches automatically, and feeds the CRM with structured records. Every consent is logged with the wording version active at capture time. No exit pop-ups.

Capture points — six, distributed.

StageWhat is captured
Hero / homepageOptional 'inspire me' modal captures email + destination interest. Cookie consent gates pixel tracking.
TripBuilder Step 1Soft email capture for save-and-resume. Not required to progress; offered with clear value.
TripBuilder Step 6Required: name, email, phone, marketing-permission checkbox. Recorded with timestamp + wording version (GDPR consent ledger).
AI AdvisorCaptured early in conversation. Phone optional. Same ledger row written. Admin notification email fires on session completion.
Trip detail saveSaved-trip click triggers email-only capture if not yet logged in. Resume token sent via email.
Booking checkoutFull passenger details collected (legal requirement). Marketing consent re-confirmed at this point if not previously captured.

Every capture writes a row to the GDPR consent_ledger with timestamp, IP, and wording version. The platform never silently captures or repurposes data.

Recovery automation — five trigger paths.

TriggerActionCadence
Search abandoned mid-flowAuto-email after 24h with resume link + preliminary trip ideas based on captured prefsOnce
Trip saved, no follow-up in 7 daysEmail with 3 alternative trip suggestions tailored to saved prefsOnce
Provisional booking abandoned at checkoutEmail after 48h with one-click return link, then SMS at 5 days (if phone captured)Twice
Deposit paid, balance not paid by reminder dateAutomated reminder series (T-14d, T-7d, T-3d, T-1d), then AX admin escalationSeries
Trip completedPost-trip questionnaire + review request + referral CTAOnce at T+7d

CRM record shape.

The platform syncs records to AX's CRM (HubSpot at MVP launch, or equivalent — configurable) on every meaningful state change. The record below is the canonical shape; CRM-specific field mapping is configurable.

FieldPopulated from
Full name + titleTripBuilder, Advisor, Account
Email + phoneLead capture points above
Marketing consent (boolean)Explicit capture + ledger row
Consent wording versionConsentLedger join
Searches made (date + prefs)Activity stream from SavedSearch + ChatSession
Bookings (status, value, dates)Booking table
Most recent activityComputed; powers re-engagement scoring
Pioneers Club statusMembership flag + tier
AX-internal notesAX agent annotations from admin dashboard

Email deliverability · ATOL certificates must never land in spam.

SendGrid handles transactional sends with Postmark as fallback (§015 stack). Beyond the provider choice, deliverability is its own discipline:

ControlImplementation
SPFSender Policy Framework. AX domain TXT record explicitly authorises SendGrid + Postmark IPs to send mail-from-ax.com. Configured Week 1.
DKIMDomainKeys Identified Mail. SendGrid + Postmark each sign outbound mail with AX-domain DKIM keys. Receivers verify cryptographically.
DMARCDomain-based Message Authentication. p=quarantine policy at launch, escalating to p=reject after 6 weeks of clean reports. Aggregate + forensic reports to dmarc@ax.com.
Dedicated IP + warm-upDedicated SendGrid IP for ATOL + booking confirmations (regulated). 2-week warm-up cadence: start 50/day, double daily until reaching ~5k/day. Prevents blacklisting.
Suppression listAutomatic add to suppression on bounce, unsubscribe, complaint. Hard-bounce after 3 attempts disables the address everywhere. Suppression respected across CRM + transactional sends.
List hygieneEmail validation at signup via ZeroBounce or similar (catches typos, role addresses, disposables). Existing list re-verified quarterly.
Subdomain isolationMarketing sends go from marketing.ax.com; transactional + ATOL go from booking.ax.com. A burnt marketing reputation never affects ATOL deliverability.
Engagement-aware throttlingInactive recipients (>180d no-open) get downgraded send frequency. Re-engagement campaign or auto-unsubscribe rather than continued sends to dead addresses.

Deliverability monitored via SendGrid + Postmark dashboards plus weekly DMARC report review. ATOL cert delivery rate is a tracked SLO (target: 99.5% inbox placement, p95).

No exit pop-ups
Every capture is contextual and value-led: “Save your trip and we’ll send you a link to come back to.” Never an interruption, never a guilt-trip.
Cross-reference
§015c Customer Account is the customer-facing side of this data — the signed-in My Account portal where customers view and manage their own records, bookings, and documents.
015bAdmin ToolingMVP SCOPE

The screens AX staff use every day. Not an afterthought.

A platform that replaces phone calls with software needs the staff-side screens to be at least as polished as the customer-side. Ten named screens, four roles, every action audit-logged — the staff-side experience scoped as deliberately as the customer-side.

Screens · ten of them, all in MVP scope.

ScreenWhat it doesAccess
Booking dashboardLive list of all bookings · filter by status, date range, customer, DMC, value · row-click opens full booking detail with state machine timeline.AX staff (all roles)
Customer 360Single customer record · all bookings, all chat sessions, AI memory, consent log, payment history, saved searches, abandoned carts. One screen replacing five spreadsheets.AX staff
Agent take-overClick a customer row → impersonate session, edit on their behalf, leave audit trail. Customer sees ‘an AX agent is helping you’. Hand-back returns control.AX staff (with audit)
Refund & amendmentStructured flow · partial / full refund · Stripe-side action + booking-state update + customer-comms template selection. Manager approval required above £500.AX staff · approval gated
Catalogue editorTrip template CRUD · day-by-day component grid · pricing matrix editor · publish workflow with preview-then-confirm. Versioned (every save is a row in catalogue_versions).AX content owner
Discount-code adminCreate / expire codes · type (percentage, fixed, partner-tied, Pioneers Club) · usage caps · per-customer limits · scheduled activation. Codes live in payments_meta + applied at deposit.AX staff
Editorial blogMarkdown / MDX-driven article authoring with image upload, scheduled publication, draft preview, built-in SEO / GEO optimisation suggestions.AX content owner
DMC inbox monitorLive status of every DMC notification · sent / accepted / alternative / rejected · ageing alerts when accepts haven't come back inside SLA. Trigger re-send or escalation.AX staff
Audit log viewerEvery state-change, every payment, every refund, every agent take-over, every catalogue edit. Searchable by actor, target, time-range. Read-only · 7-year retention.AX staff (read-only) · admin (full)
AI cost dashboardPer-day Anthropic spend · per-session cost histogram · cost-per-converted-booking metric · alerts at 50% / 75% / 90% of the £500/month safety threshold. Detail in §010.AX admin

Role-based access · four roles.

RoleCan do
AdminEverything · plus user management, role assignment, audit log full access, refunds above £500
StaffAll daily ops · booking management, agent take-over, refunds up to £500, catalogue read-only
Content ownerCatalogue + editorial blog · cannot touch bookings or payments
Read-onlyBooking + customer dashboards · no write actions · for analyst / external accountant access
Every action audit-logged

Every write — bookings, refunds, catalogue edits, agent take-overs — produces an audit row containing actor, target, before/after diff, IP address, timestamp. Audit log is append-only, replicated to a separate Postgres database, retained seven years per ATOL + accounting rules.

Built on the same Next.js app

Admin tooling is route-protected pages inside the same Next.js codebase as the customer site. No separate admin app, no separate deploy. Login uses the same auth, so AX staff can move between admin and customer-facing views with one session.

Why this matters
A platform that replaces phone calls needs the daily AX-team experience scoped as a first-class deliverable. This section enumerates the ten screens, four roles, and audit posture explicitly. All in MVP scope; no Phase 2 add for daily ops.
Cross-reference
§015c Customer Account covers the customer-facing My Account portal. The staff-side account-management capabilities here are its back-office counterpart.
015cCustomer AccountMVP SCOPE

A single signed-in home for every customer.

Every customer who books or saves a trip with Awesome Experiences has access to a dedicated My Account portal. It consolidates all customer-facing functionality into a single signed-in experience, accessible from the main site header at all times.

What the portal covers.

Account management

Register, log in, manage profile, set communication preferences, update payment methods.

Saved trips and quotes

Resume any saved search or in-progress quote via signed magic-link emails. Trips stay saved indefinitely unless the customer deletes them.

Booking history

Full record of past, current, and upcoming bookings — status, payment history, and itinerary access.

Active itineraries

For trips in progress or imminent: itinerary details, vouchers, certificates, and supplier documents in one place. Read-only access to the in-trip dashboard views (§018b).

Documents

Centralised storage of all booking-related documents — invoices, vouchers, e-tickets, visa letters, insurance certificates, supplier confirmations.

Travel preferences

Dietary requirements, accessibility needs, room preferences and traveller details recorded once and carried forward to all future bookings.

After booking — a personalised checklist.

The moment a booking is confirmed, the portal switches the customer into a personalised to-do list — a clear, ordered view of everything they need to do and submit before they travel. Each item shows its status, what is needed, and a one-click action: upload a document, pay a balance, follow a link. It pulls directly from the pre-travel compliance checks in §018b, so the customer sees the same requirements AX’s staff track — visa requirements, passport validity, insurance proof, balance payments — without chasing or guessing. The journey is designed to be calm and obvious: the customer always knows exactly what is outstanding and what is done.

Your trip checklist
  • Booking confirmedATOL certificate issued and stored in your account
  • Passenger & passport detailsAdd each traveller's details — passport flagged automatically if expiry is close
  • Visa requirementsVisa needed for your destination — your responsibility, with a direct link to official guidance
  • Travel insuranceUpload your policy document — one click, straight into your account
  • Balance paymentDue date shown clearly; pay early or on schedule
  • Pre-departure packItinerary, vouchers, contacts and packing notes — available from T-21 days

Why it matters.

01

Reduces customer-service load.

Customers self-serve on the majority of 'where do I find X' or 'what's my booking reference' queries.

02

Builds loyalty.

A saved account with travel history is a switching cost — customers have more reason to return to AX for their next trip.

03

Centralises compliance documents.

Vouchers, certificates and travel documents live in one customer-controlled location, reducing lost paperwork and missed pre-departure requirements.

Cross-references
§015 CRM for the back-office view of customer data · §015b Admin Tooling for staff-side account management · §018b for the in-trip dashboard customers can see in read-only mode · §023 acceptance criteria (item 3.1 Customer Account) for the MVP acceptance tests covering this functionality.
016SEO + GEO

SEO and GEO — built into the data model, embedded on handover.

Travel discovery starts on Google and increasingly runs through LLMs. The platform ships with structured data, server-rendered metadata, clean URLs, and an editorial blog framework — SEO and GEO are embedded into the build, not bolted on afterwards. Cold Lava also provides SEO and GEO audits of the live surface as part of the engagement.

JSON-LD structured data — six schemas.

Every page emits structured data. Google reads it for rich results; LLMs read it for retrieval-augmented generation. Both matter for travel discovery.

Schema typeOn pagesCarries
TouristTripTrip detail pagesTrip name, description, hero image, itinerary array, offers (PricingMatrix-derived), starting price.
TravelActionBooking stepAction type (RESERVE_ACTION), agent (the customer), object (the tour), participant count.
FAQPageTrip detail + FAQ pagesQ+A pairs from AX content. Powers Google Featured Snippets and LLM RAG ingest.
OrganizationSite-wideAX as organisation, logo, contact info, ATOL number (when applicable), trustpilot ratings.
ProductTrip detail pagesTrip as product, with offer (price), brand (AX), aggregate rating from reviews.
BreadcrumbListAll pagesHierarchical breadcrumbs supporting Google rich-result breadcrumb display.

URL structure.

RuleExample
Clean, hierarchical, lowercase/trips/italy/food-and-wine-tour-tuscany
No query strings for canonical contentSearches use /search/q+filters as path segments, not ?q= and ?filter=
Locale prefix when multi-language activates/en-gb/trips/... · /de-de/trips/... — Phase 2
Slugs derived from tour title, not IDTour ID is canonical in DB; slug is SEO-friendly URL fragment
301 redirects on renameTrip rename writes a redirect rule; old URLs preserve link equity

Server-rendered metadata.

ComponentWhat
<title>Server-rendered, page-specific. Trip detail: '[Trip Name] | Awesome Experiences' (~55 chars).
<meta description>Page-specific, hand-written or AX-curated. Truncated automatically if over 155 chars.
Open Graph tagsog:title, og:description, og:image, og:type. Powers preview cards on Facebook, LinkedIn, WhatsApp, iMessage.
Twitter cardssummary_large_image variant. Same image source as og:image.
Canonical URLsPrevents duplicate-content penalties when query parameters or trailing slashes vary.
Sitemap.xmlAuto-generated from tour catalogue. Submitted to Google Search Console; updated on publish.
robots.txtDisallow on /admin, /api/internal. Allow elsewhere. Sitemap location declared.

Editorial blog module — Phase 2 framework, MVP foundations.

MVP

Foundation in place.

Routes scaffolded (/blog, /blog/[slug]). Database schema for posts (title, body, hero image, author, publish date, tags). RSS feed endpoint. JSON-LD Article schema. Editorial tooling itself (CMS, editor experience, scheduling) is Phase 2.

Phase 2

Editorial workflow.

Sanity (or equivalent headless CMS) for content authoring. Multi-author support with approval workflow. Image management. Scheduled publishing. Internal linking suggestions. AX content team gets a real authoring experience without paying for it twice in MVP.

SEO + GEO audits
SEO and GEO are embedded into the platform itself — structured data, metadata, clean URLs, and crawlable content ship as part of the build. On top of that, Cold Lava provides periodic SEO and GEO audits of the live surface: broken structured data, missing meta, slow pages, broken redirects, sitemap drift, Search Console alerts — delivered as a delta report to AX’s admin dashboard. When Google ships an algorithm update, the audit flags ranking impact.
017SecurityARCHITECTURE

Defence in depth, from edge to data.

Security is the single concern raised most often by serious technical reviewers, and the one most easily reduced to platitudes. This section is specific. Named controls at every layer, named tooling, named cadences. Nothing aspirational.

01

Edge

Vercel Firewall blocks known bad IPs and common WAF patterns. Rate-limiting on every /api/* route at 60 req/min per IP with burst tolerance. Vercel BotID challenges bot traffic across the booking flow, the AI advisor, and lead-capture forms. DDoS absorption is handled at Vercel's edge.

02

Transport

TLS 1.3 enforced. HSTS with preload. Strict CSP (default-src 'self', allow-list for Stripe, GA4, Meta Pixel). Trusted Types enforced. Subresource Integrity on all third-party scripts.

03

Application

Next.js 16 with Server Components — most data flows server-side, minimising client surface. All API routes guard on the userId from session. No user can read another user's saved trips, account data, or bookings under any code path.

04

Data

Postgres with Row-Level Security policies on every user-owned table — saved_searches, bookings, passengers, payments. AX admin role bypasses RLS via a separate service-role connection used only by admin endpoints, all of which require explicit re-authentication.

05

Secrets

All secrets in encrypted Vercel environment variables, scoped per environment. No .env in the repo. Rotation cadence: Stripe / FacilitaTrip / Anthropic keys every quarter. Rotation runbook lives in docs/runbooks/secrets-rotation.md.

OWASP Top 10 — every category, named mitigation.

RiskMitigation
A01Broken access controlPostgres RLS on every user-owned table; session userId guard on every API route
A02Cryptographic failuresTLS 1.3, bcrypt password hashing, Stripe Elements for cards
A03InjectionParameterised queries via Drizzle ORM; no string-concat SQL anywhere
A04Insecure designThreat model documented at kick-off, reviewed at the mid-build gate
A05Security misconfigurationVercel Firewall + strict CSP + secrets in encrypted Vercel env
A06Vulnerable componentsnpm audit blocks merge on high; Snyk weekly; Dependabot enabled
A07Auth failuresClerk / NextAuth; 2FA available; rate-limited login; lockout on brute-force
A08Software integrityLockfile checked in; SRI on third-party scripts; pinned dependency tree
A09Logging failuresSentry + structured Pino logs + immutable audit log on every booking write
A10SSRFOutbound calls allow-listed; no user-controlled URLs in fetches
Bot protection
Vercel BotID challenges bot traffic on the booking flow, the AI Advisor entry, contact forms, and lead-capture forms. CAPTCHA challenges (Cloudflare Turnstile or equivalent) are layered on the AI Advisor entry for additional defence; server-side request validation catches headless-browser patterns and known abuse signatures. The dual rationale: these controls reduce spam and abuse on customer-facing forms, and prevent automated scripts inflating LLM usage and run-rate — the AI Advisor in particular needs this because each session carries a real per-token cost.

Beyond the checklist.

PCI scope

Zero card data on Cold Lava infrastructure.

Stripe Elements iframes the payment form. PCI compliance is fully offloaded to Stripe (SAQ-A scope). Cold Lava code never sees, stores, or transmits card data — not even transiently.

Pen-test

CREST-accredited test against staging in Week 13.

A third-party penetration test runs against the staging environment one week before go-live. Findings triaged by severity; all critical and high findings are fixed before production launch.

Travel-specific threats

Credential stuffing, payment fraud, ATOL-cert phishing.

Customer accounts use 2FA + email-confirmation on payment-method changes. Stripe Radar enabled with custom rules flagging high-value first-time bookings, IP/billing-country mismatch, unusual booking velocity. Audit log makes any post-incident forensics straightforward.

Supply chain

No unverified packages.

Only npm packages on Snyk's no-known-malware list with weekly downloads above 10k. Lockfile checked in. SRI on third-party scripts. No package added without a security review note in the PR.

Disaster recovery · explicit RTO and RPO.

A fair question of any booking platform: what happens if Postgres is down for 4 hours mid-booking? Concrete answer below.

Failure modeRTO targetRPO targetHow
Vercel platform outage~ 5 min0Vercel's own multi-region failover. No action by AX. Customer briefly sees a Vercel error page; bookings in flight resume on retry.
Postgres primary failure~ 30 min≤ 5 minNeon Postgres point-in-time recovery from WAL log. Failover to standby replica is automatic. Lost writes are bounded by WAL replication lag.
Postgres data corruption~ 2 hr≤ 1 hrRestore from hourly snapshots to a fresh Neon branch, verify integrity, swap connection string. Bookings written during the corruption window are reconciled from Stripe + audit log.
Stripe outage (rare, hours)n/a — degradedn/aBooking flow shows clear messaging at deposit step. No data loss; existing bookings unaffected. Stripe maintains 99.99% historical uptime.
Booking-ops vendor outage~ 10 min queueing0Integration Bus queues outbound notifications and retries with exponential backoff. Customer sees ‘DMC notification queued’ rather than failure. AX admin alerted after 30 min.
Anthropic / AI advisor outageinstantn/aStructured TripBuilder takes over (§010 fallback). AI advisor degrades gracefully; no booking is blocked by AI being down.
Total catastrophic loss (rare)~ 4 hr≤ 1 hrRestore from off-region nightly backups + WAL. Bookings reconciled from Stripe + accounting ledger. Customer comms script lives in docs/runbooks/dr-major.md.

RTO = recovery time objective (how long until service restored). RPO = recovery point objective (acceptable data loss window).

Backup and continuity.

The platform is resilient to multiple categories of failure — regional outage, database compromise, code-host loss, slow corruption, operational error. The continuity model rests on three independent layers.

Layer 1 · Database backups

Hourly snapshots (rolling 24-hour recovery), nightly off-region backups copied to an independent geographic region, and Write-Ahead Log replication for point-in-time recovery. Combined: an RPO of seconds, not hours.

Layer 2 · Code + deployment history

All code in GitHub with full Git history. Production deployments versioned through Vercel — any version rolls back in seconds. A branch-based workflow means no production deploy without a tested, reviewed change.

Layer 3 · Off-platform mirror

All repositories mirrored weekly to a Hetzner Storage Box in Europe — different jurisdiction, different credentials from GitHub. Multi-generation retention (weekly snapshots kept for months) means a slow compromise can be recovered from a known-good state prior to the compromise window.

Rollback process
Identify the faulty deployment via Vercel history and Git log → redeploy a known-good previous version directly from Vercel (seconds) → if the issue is database-side, restore to a point-in-time prior to it using WAL → if both code and data are compromised, restore code from the Hetzner mirror and the database from the off-region nightly backup. Three independent sources of recovery (Vercel deployment history, GitHub, Hetzner mirror) and three independent layers of database protection — no single point of failure can take the platform offline permanently.
Named, not generic
Specifics over platitudes. Named libraries, named cadences, named accreditations, explicit RTO/RPO. Every claim above either has an enforcement mechanism in CI today or a runbook with an owner attached. None of it is generic “industry-standard” assurance.
018ComplianceARCHITECTURE

ATOL, GDPR, accessibility — designed in, not bolted on.

Travel is regulated. Selling to UK and EU residents adds GDPR and accessibility obligations. The platform handles each compliance surface explicitly: ATOL Certificate generation tied to confirmed bookings, GDPR consent ledger and DSAR/erasure tooling, WCAG 2.2 AA verified in CI.

ATOL Certificate generation.

On confirmed booking (post-DMC accept — see §013 Booking Flow), the platform generates an ATOL Certificate PDF. The certificate is emailed to the customer, stored on the booking record, and an immutable audit log entry is written. ATOL legal model (Option A: AX as principal vs Option B: host operator agency) is confirmed at kick-off — see §002 Operating Model.

FieldRequired
Passenger namesAll travelling passengers, full legal names
What is protectedPackage components covered under ATOL — flights / accommodation / transfers
ATOL numberAX's licence number (Option A) or host operator's number (Option B)
Price paidTotal package cost, GBP, at deposit + balance times
Booking dateConfirmed booking date (post-DMC accept), not deposit date
StorageStored on booking record, immutable, retained 7 years for CAA audit
Audit logIssue event written to immutable audit log with correlation ID
ATOL ordering
Certificate is generated AFTER DMC confirmation, not at deposit. AX never issues a regulated package guarantee for inventory it does not yet hold. See §013 for the booking state machine that enforces this.

GDPR — consent, DSAR, erasure, residency.

Control

Consent capture

Every consent action (cookies, marketing, third-party) writes a row to the consent_ledger table with timestamp, wording version, and IP. Wording is versioned in repo; if it changes, prior consents are flagged for re-collection.

Control

Data subject access (DSAR)

Admin endpoint returns a customer's full record (account, saved searches, bookings, communications) in machine-readable form. SLA: 30 calendar days, target 5 working days.

Control

Right to erasure

Customer-initiated deletion soft-deletes account, anonymises booking records (PII redacted, financial records retained for legal requirement), tombstones consent ledger entries. ATOL audit retention overrides for 7-year window.

Control

Data residency

Postgres + Redis instances run in eu-west-2 (London). Vercel Edge serves UK + EU customers from European edge nodes. No customer PII transits to US infrastructure.

Accessibility — WCAG 2.2 AA.

CheckHow it’s verified
WCAG 2.2 AA complianceVerified via axe-core in CI on every PR
Keyboard navigationEvery interactive element reachable + operable with keyboard alone
Screen reader passManual NVDA + VoiceOver pass before each release
Contrast ratiosAll foreground/background pairs ≥ 4.5:1 (text), ≥ 3:1 (UI components)
Focus managementTripBuilder steps preserve focus across navigation; modals trap focus correctly
ARIA labelsEvery icon-only button + non-text control labelled
No hover-only affordancesEvery interaction available via tap / click; hover is enhancement only
Standard compliance pages, day one
The site ships with Terms, Privacy Policy, ATOL information, Cookie Policy, Accessibility Statement, and Modern Slavery Statement at launch. Cookie consent banner blocks every tracking pixel until explicit consent is captured. None of these are afterthoughts — they are part of the §3 inclusion list.

Terms & Conditions — visa requirements clause.

“It is the sole responsibility of each traveller to obtain any visa, entry permit, transit visa, or other travel documentation required by the countries of destination, transit, or return. Awesome Experiences will provide reasonable advisory information (including links to official government sources) but does not guarantee the accuracy, completeness, or currency of such information, nor accept liability for travel arrangements that cannot proceed because of missing, invalid, or refused visa documentation. Travellers are advised to verify visa requirements with the relevant embassy or consulate well in advance of travel. Refunds and rebookings in the event of visa failure are subject to the applicable cancellation policy and any insurance the traveller has in place.”

The clause above is indicative wording and is subject to legal review by AX’s solicitor before publication as live Terms & Conditions.

018bPre-Travel Compliance & In-Trip SupportMVP SCOPE

From deposit to departure to return — every check, every reminder, named.

Checks on passports, visas, vaccinations, insurance, and balance payments — with reminders and customer assistance during travel. In the MVP these run as a manual-plus-automated workflow: automated expiry flags and reminder cadences, with visa and vaccination data from AX-maintained tables. Real-time API validation (Sherpa) is the Phase 2 upgrade, costed when volume justifies it.

Pre-travel checks · MVP delivery vs Phase 2 upgrade.

CheckMVP deliveryPhase 2 upgrade
Passport — expiry validation (advisory)Where the customer enters passport details, the system auto-flags if expiry is within 6 months of the return date. Advisory only — it warns the customer, it does not block booking or payment. Reminders at deposit, T-60d and T-21d. The customer remains responsible for passport validity at the time of travel.Sherpa API real-time validation against destination-specific passport rules.
Visa requirementManual lookup against AX-maintained visa table per destination × passport-of-issue. Workflow flags ‘visa required’ status to customer and AX staff. Email template handles the human conversation.Sherpa API real-time visa data per destination + nationality combination, fed into the booking flow.
Vaccination requirementSame approach as visa — AX-maintained per-destination table. Customer sees ‘recommended / required’ status. Reminder cycles tied to trip dates.Sherpa API real-time vaccination data + integration with NHS Fit-for-Travel.
Travel insurance proofCustomer uploads policy document at booking. AX staff verifies during DMC notification window. Soft-block on travel-day if not uploaded by 14 days pre-travel.Direct integration with travel insurer (e.g. Battleface, Worldnomads) for one-click purchase + auto-attached document.
Balance paymentStripe schedule + automated reminder cadence (60d, 30d, 14d, 7d, 1d). Customer can pay early. Failed-payment retry with manual escalation to AX staff.Smart reminder timing based on customer-engagement signals, not fixed schedule.
Pre-departure briefing packAuto-generated PDF at T-21 days containing itinerary, ATOL cert, vouchers, contact numbers, weather forecast, packing notes. Email + customer account download.In-trip companion (§007 Phase 2) renders this offline-first in the PWA shell.

Reminder cadence · seven touchpoints from deposit to T-1.

StageTriggerChannel
Deposit + 1 dayWelcome + ATOL cert + checklistEmail + SMS
T-90 daysPassport expiry warn (if < 6 months from return)Email + dashboard
T-60 daysBalance due reminder + visa/vaccination summaryEmail + SMS
T-30 daysInsurance upload reminder + balance finalEmail + SMS + AX call escalation
T-21 daysPre-departure briefing pack + final itineraryEmail + dashboard
T-7 daysFinal logistics + day-of contact infoEmail + SMS
T-1 dayWishing well + flight check-in windowSMS

Customer assistance during travel.

ChannelWhat it coversStatus
In-trip dashboardLive itinerary view · ATOL cert + vouchers always accessible · contact AX support buttonMVP (web-only · offline-first in Phase 2 in-trip companion)
WhatsApp / SMSAX staff number for in-trip questions · 24-hour response targetMVP (manual triage)
DMC direct lineDMC contact details surfaced in itinerary · for on-the-ground emergenciesMVP
AI advisor (post-booking mode)Same AI advisor scoped to ‘support an active customer’ — answers logistics, escalates booking changes to AX staffPhase 2
Visa responsibility (customer-facing)
During the booking flow and pre-departure communications, customers are explicitly reminded that securing the correct visa(s) for their travel is their own responsibility. Pre-departure emails include direct links to the official visa-information page for each destination. AX’s role is advisory — surfacing requirements visibly, providing accurate links, and flagging issues where reasonably detectable. AX does not undertake to obtain or guarantee visas on the customer’s behalf.
FCO advisory link (advisory)
Every tour page surfaces a direct link to UK Government foreign travel advice for the destination(s). Pre-departure customer communications include the same link, refreshed at the time of sending. This is an advisory link, not an active monitoring feature — the monitoring-and-notification capability is mapped in the Phase 2 Roadmap (§026b).
Why this matters
Pre-travel compliance is a working manual + automated workflow in the MVP; Phase 2 introduces Sherpa for real-time visa/vaccination data when customer volume justifies the API spend. The in-trip companion experience is mapped in §007 Phase 2.
Cross-reference
§015c Customer Account is where customers see these pre-travel checks as a personalised post-booking checklist — the same requirements AX staff track, surfaced in the customer’s signed-in My Account portal.
019ObservabilityARCHITECTURE

Operational maturity, from the day the URL goes live.

The platform is observable from commit one. Every error has a stack trace, every request has a correlation ID, every booking-affecting write is audited. Custom dashboards surface the metrics AX will check daily — funnel, AI cost, DMC SLA, conversion. On-call paging is wired in for the launch window.

LayerToolingWhat it captures
01ErrorsSentry (with source maps)Every server + client error captured. Correlation ID threaded request → DB query → response. P1 alerts page on-call during launch window.
02Performance (RUM)Vercel Speed InsightsReal User Monitoring on every page. p50 / p75 / p95 LCP, INP, TTFB by region + device. Regression alerts at >10% week-over-week.
03LogsPino (structured JSON) → LogflareEvery server request logs with correlation ID, user ID, trace ID. 30-day retention for application logs; 7-year retention for ATOL-related audit logs.
04Audit logPostgres audit_log tableImmutable row written on every booking-related write. actor_id, action, before, after, timestamp, correlation_id. Used for ATOL audit + dispute resolution.
05Synthetic checksBetter Stack / Checkly5-minute checks against homepage, TripBuilder entry, representative trip detail. Pages on-call if down.
06Uptime SLOVercel platform + FacilitaTrip dependency tracking99.9% target rolling 30-day. FacilitaTrip availability tracked separately; AX flagged if it falls below 99.5%.

Custom dashboards.

Four dashboards ship with the platform. Each is curated for a real AX user role — leadership looks at funnel + revenue, ops staff look at operational, the AX growth lead looks at AI advisor health.

Dashboard

Booking funnel

  • TripBuilder start → step 6 → results → trip detail → booking
  • LLM advisor session → recommendation → click-through to trip detail
  • Save-search → email capture → resume rate
  • Deposit-paid → DMC confirmation latency
  • Top abandonment points (per step + per source)
Dashboard

AI advisor health

  • Sessions started, sessions completed, abandonment by step
  • Token usage per session, per day, per month
  • Hallucination guardrail triggers (validation failures + retries)
  • Off-catalogue suggestions vs in-catalogue matches
  • Spend vs the £500/month safety threshold — alerts at 50%, 75%, 90%
Dashboard

Operational

  • DMC confirmation SLA: time from deposit to confirmed (target <48h)
  • DMC silence escalations triggered (48h, 72h)
  • Stripe payment success rate, 3DS challenge rate, fraud flag rate
  • ATOL Certificate issuance — count, time-to-issue post-DMC
  • Refunds initiated (count, value, reason code distribution)
Dashboard

Conversion + revenue

  • Booking conversion by traffic source (organic / paid / partner)
  • Average order value, by trip and by cohort
  • Pioneers Club discount usage + revenue attribution
  • Repeat customer rate
  • FX exposure tracked (live supplier-payable across currencies)
Audit log + uptime SLO
Every write to a booking-related table writes an immutable audit row. Used for ATOL audit (7-year retention), dispute resolution, and internal forensics. Uptime SLO is 99.9% on a rolling 30-day window; FacilitaTrip dependency is tracked separately. On-call paging via PagerDuty during the launch window (Weeks 12-14), downgraded to email after launch unless rotation is renewed.
020Migration-Safe ArchitectureARCHITECTURE

Year 3 swap = rewrite the seam, keep the spine.

A core requirement: AX does not get locked into a single booking-ops vendor indefinitely. Six architectural principles applied from commit one. The Year 3 swap-out cost is bounded by design: 3-6 months of integration work, not a full rebuild. (Vendor-agnostic from day one — see §004b.)

Year-3 vendor swap = rewrite the Integration Bus only · UX, Catalogue, AI/Search, and Booking semantics stay AX-owned

The six principles, applied today.

01

AX owns the catalogue.

Tour templates, day templates, components, pricing matrices, margin rules, hotel tier definitions, SEO copy, imagery, constraint rules — all stored in AX's database. FacilitaTrip is a back-office booking engine; it does not own AX's product structure.

02

API abstraction layer.

The frontend never talks directly to FacilitaTrip. Every vendor call goes through the AX API → Integration Bus. Vendor-specific quirks live in the Bus only — they never leak into the AX-owned layers.

03

Portable booking records.

Bookings are stored in AX's Postgres with ALL relevant fields — passenger details, financial records, status history, ATOL certificate, payment references. Data export is tested monthly. Migration assumes export will happen one day.

04

Stripe under AX control.

Payment orchestration is owned by AX, not the vendor. Stripe API keys belong to AX. PaymentIntent records are linked from AX's Booking table. If FacilitaTrip is replaced, Stripe stays. PCI scope stays SAQ-A.

05

Accounting integration owned by AX.

Webhook fires from the Integration Bus to Xero/QuickBooks, not from FacilitaTrip directly. The accounting sync is replaceable as a single component, not a vendor-specific dependency tree.

06

Audit trail belongs to AX.

Booking audit log is in AX's Postgres, not FacilitaTrip's logs. ATOL audit (7-year retention legal requirement) survives any vendor change. CAA can audit AX directly without vendor cooperation.

Year 3 swap — what changes vs what doesn’t.

Mapped against today’s components. The honest assessment: the Integration Bus rewrites; everything above it stays.

ComponentYear-3 swap effort
Customer UX (Next.js, components, design system)Zero — stays untouched
AX Catalogue (TourTemplate, DayTemplate, Component, PricingMatrix, HotelTier)Zero — stays untouched
Booking layer schema (Booking, Passenger, Payment, ATOLCertificate)Zero — stays untouched
AI Layer (Claude advisor, tool schema, embeddings)Zero — stays untouched
Search index (Algolia, pgvector)Zero — stays untouched
Stripe + Xero + SendGrid integrationsZero — stays untouched
Integration Bus — vendor-specific codeREWRITE — 3-6 months estimated
DMC notification format mappingUpdate — depends on new vendor's format
Status reconciliation logicUpdate — depends on new vendor's state model
Honesty about the estimate
“3-6 months for the Integration Bus rewrite” assumes the replacement vendor offers comparable surface area to FacilitaTrip. If AX migrates to a more limited or more expansive platform, the estimate moves. The architectural principles above mean this conversation is bounded; they don’t mean migration is free.
020bMVP as FoundationARCHITECTURE

Built to be built upon.

The MVP is not a standalone system that is set aside when Phase 2 begins. It is the foundation the entire roadmap is built on — and it is built that way deliberately. Cold Lava builds in stepping stones: each piece is designed to be extended, so the platform grows rather than restarts.

01

A planned progression, not a restart.

Phase 2 does not begin from scratch. The architecture for later phases is anticipated in how the MVP is built — every layer is designed to be extended, not replaced. The next phase grows from this platform; it does not require a rebuild.

02

A stepping-stone build.

Each component is built so the next can be added without rework. The broader roadmap is already planned — subject to change as the MVP's review and real-world performance inform priorities. Growth and scalability are designed in from commit one.

03

Every asset is AX-owned and reusable.

Everything built — including Additional Works modules such as the Contract Ingestion Agent, detailed in the Additional Works document — is an Awesome Experiences-owned asset. AX can carry it forward into any future amendment, build, or system it chooses. Nothing delivered is locked to this platform alone.

The point
The system delivered at MVP is not an endpoint. It is a framework — designed for growth and scalability from commit one, and built so that every later phase extends what is already proven rather than replacing it.
021Existing Site Migration

DigitalTrip → AX-architecture, with link equity preserved.

DigitalTrip end-of-life is end of June. The platform must replace it without losing search rankings or breaking customer-facing URLs. Migration is a four-phase activity overlapping the build, with redirect mapping and content audit as Week 1 work, not Week 14.

01
Pre-build
Inventory + audit
  • Crawl existing DigitalTrip pages with Firecrawl — capture every URL, status code, and content hash
  • Vamoos-source image catalogue inventoried — every image referenced + intended target
  • Existing data export from DigitalTrip dump (already received) parsed and mapped to AX schema
  • Content audit: which pages have material SEO equity, which are dead weight
02
Weeks 3-5
Content population
  • AX confirms the MVP catalogue (40-50 trips across 15-20 countries per §001b)
  • Trips have full content drafted into the new platform: text, imagery, day-by-day breakdowns, pricing matrix, supplier mapping
  • Imagery resized and optimised through next/image pipeline
  • FAQ content for each trip + landing page entered
03
Weeks 9-13
Redirect mapping
  • 301 redirect map produced from existing DigitalTrip URLs to new AX URLs
  • High-equity pages prioritised — those with backlinks, search rankings, or social shares
  • Edge-level redirects via Vercel — fast, no application code involved
  • Sitemap.xml regenerated and submitted to Google Search Console
04
Week 14 (cut-over)
DigitalTrip EOL
  • DNS cutover from DigitalTrip to AX-architecture (Vercel)
  • DigitalTrip put into read-only mode for 30 days for any orphaned content
  • Search Console monitored daily for crawl errors + ranking shifts
  • First 14 days post-launch: dedicated on-call rotation watching for traffic anomalies
DigitalTrip booking-engine — clean-room reimplementation, if needed
Optional, gated behind a feasibility review. If we determine an in-house booking engine yields cost savings (e.g. eliminating a third-party licence) it becomes a separately quoted Phase 1 add-on. The work is a clean-room reimplementation from documented public behaviour— no decompilation, no ex-DigitalTrip personnel involved, no proprietary internals consulted. Default assumption is the booking-ops vendor (FacilitaTrip OR Travel Compositor — see §004b) handles the booking engine and DigitalTrip is replaced wholesale.
022Design Language

Premium-restrained, warm, editorial.

The visual register Cold Lava builds in is not 'agency premium' (mood-board mockups) and not 'big-tech minimalism' (cold, Helvetica-everywhere). It's editorial — tech publication, warm and confident, where every typographic choice and every motion cue earns its place.

01

Premium-restrained.

Lots of whitespace. Serif headings used as confident accents, not as decoration. Precise typography rhythm. Restrained motion — every animation has a reason. The editorial register: tech publication, not agency pitch.

02

Warm, not icy.

Backgrounds are warm-black (never pure #000). Text is paper-cream (never #FFF). Accent is burnt coral, confident and warm, not the AI-pink default. The system reads like print quality, not screen quality.

03

Type as architecture.

Display: Instrument Serif at editorial sizes. Body: Inter at honest reading sizes. Monospace: JetBrains Mono for codes, dimensions, signatures. The hierarchy is clear at a glance — every page is laid out, not just composed.

Typography scale.

TokenUsageFamily
Display 5xl-7xlSection titles, heroInstrument Serif
Display tight 2xl-4xlSubheads, principle titlesInstrument Serif
Display italicPull quotes, emphasisInstrument Serif italic
Body 14-17pxLede, body copyInter regular
Eyebrow 10.5-11pxSection labels, table headersInter all-caps tracked
Mono 10.5-13pxCodes, signatures, table data, decorative numeralsJetBrains Mono

Motion principles.

Every animation has a reason

Reveal on viewport entry communicates section structure. Hover-state changes communicate interactivity. Loading shimmers communicate state. Decoration is not a reason.

Reduced-motion respected

All animation queries useReducedMotion() and degrades to instant reveal. Accessibility built in, not bolted on.

No bouncing, no springing

Eased curves only ([0.2, 0.8, 0.2, 1] for primary motion, [0.16, 1, 0.3, 1] for hero reveals). Premium-restrained means no toy physics.

Velocity matched to scale

Large elements move slowly (0.7-0.9s); small elements move quickly (0.3-0.45s). Physically intuitive.

Video hero, not carousel
Hero on the homepage is video, not carousel. Tour detail pages use a single primary image plus gallery; carousels are reserved for in-tour photo galleries where sequence matters. The aesthetic is calm, not busy.
023Delivery Approach

The way we deliver. Visible, testable, predictable.

Software is hard. Delivery against fixed price + fixed timeline is harder. The way to keep a 12-week regulated build honest is rigour about cadence, testing, and acceptance — and visibility for the client at every step. The detail below is what AX gets, by the week, by the test layer, by the acceptance test.

Communication rhythm.

CadenceActivity
WeeklyLoom video update — what shipped, what's next, anything blocked. 5 minutes max. Posted Monday.
FortnightlyZoom checkpoint with AX. Live demo of the latest staging build. Q&A. 30-45 minutes.
ContinuousLinear (or Notion) board with read-access for AX. Every task visible. Every blocker tagged.
Week 3+Staging URL live and accessible to AX. Updates with every merge to main.
Per-gateWritten gate report — pass criteria evidenced, descope/proceed/rescope decision logged.

Test approach — five layers, each in CI.

LayerScopeToolingCoverage target
UnitPure functions: matching algorithm scoring, FX-rate computation, ATOL PDF generation, TripBuilder validation, pricing-matrix lookupsVitest≥80% on lib/ and services/
IntegrationAPI routes against Postgres test instance, Stripe webhooks against Stripe CLI mock, FacilitaTrip against recorded fixture, SendGrid against capture mockVitest + Testcontainers + Stripe CLIAll happy paths + named edge cases
E2ETripBuilder happy path (structured + LLM), tailoring flow, deposit-paid booking flow with mocked Stripe + FacilitaTrip, customer account flowPlaywrightAll listed flows green
Visual regressionHomepage, TripBuilder per step, search results, trip detail, booking flow on each browser × breakpoint combinationPercy on BrowserStackUnexpected diffs block release
AccessibilityEvery page in CI. Keyboard nav, contrast, ARIA, focus management. Plus manual NVDA + VoiceOver before launch.axe-coreWCAG 2.2 AA

Every failing test in CI blocks merge to main. No silent passes. Pre-launch: a one-week UAT window where AX staff exercise the platform on a staging URL, identical to production except for test Stripe keys.

Acceptance criteria — per proposal §3 deliverable.

Each deliverable in proposal §3 has a corresponding test that AX or Cold Lava QA executes at UAT. A deliverable is “accepted” when its test passes. AX signs off acceptance per row; aggregated sign-off triggers the final 34% invoice (proposal §6).

DeliverableAcceptance test
3.1 HomepageRenders <1.8s LCP from UK. Hero, navigation, experience tiles, AI launcher, featured trips, category tiles all interactive. WCAG 2.2 AA verified.
3.1 6-step TripBuilderAll 6 steps render; validation prevents invalid progression; back nav preserves state; save-and-resume produces a working email link; submission produces ranked results.
3.1 Search ResultsFive tiles rendered; scoring rationale on hover; 'See Itinerary' + 'Select' both function; results return <2s p95.
3.1 Trip DetailDynamic from live data; geocoded map renders with day markers; day-by-day breakdown matches design; tailoring entry works.
3.1 Customer AccountRegister, login, password reset all work; 2FA optional; saved trips, booking history, preferences editable. Full section: §015c.
3.2 LLM ConversationalChat accepts free-text and pasted itinerary; extracts to 12 structured fields; recommends only AX-approved trips; lead capture fires; admin notification fires. Hallucination test: off-catalogue prompt returns 'we don't currently offer X' not a fabricated trip.
3.3 Matching Algorithm5 results returned for any valid input; selection feedback persisted to Postgres; damped weighting update visible in next session.
3.4 Trip TailoringDay add/remove/move with constraint enforcement; activity slot swap with live re-pricing; hotel grade swap with live re-pricing; flight check fires; save preserves tailored state.
3.5 Booking FlowPassenger details collected; Stripe deposit paid; ATOL cert generated on confirmed booking (post-DMC); DMC notification email fires; customer confirmation email fires.
3.6 FacilitaTripTrip and pricing data live from FacilitaTrip; no dummy data; bookings written to FacilitaTrip via API; status sync working.
3.7 Analytics & CRMGA4 events fire for funnel steps; Meta Pixel fires; CRM record created at account creation, trip save, booking; SendGrid emails delivering.
Cover policy + key-person redundancy
At least 2 senior developers across the project at all times. Holiday is rotated, not bunched. If one developer is unavailable for any reason, work continues. No client engagement runs on a single point of failure — this is policy, named in §025 Insurance, IP & Continuity.
024Cost & Drift Prevention

Five gates. No silent overruns. AX controls every decision.

A fixed-price build lives or dies on one question: does the budget run out mid-build? The contract is built around five named gates, each with an explicit pass/fail criterion and an explicit descope/proceed/rescope option. Cost or time pressure shows up as a conversation at a gate, never as a surprise invoice or a silently shipped subset.

The five gates.

01
Week 2
FacilitaTrip API discovery
PassSandbox provisioned · test booking written + confirmed · all assumed endpoints documented · gap analysis signed off
FailProject pauses; AX has descope / defer / rescope options. No build work proceeds against unverified endpoints.
02
Week 4
Architecture sign-off
PassData model approved · API surface approved · ATOL legal model confirmed in writing · MVP catalogue confirmed · DESIGN.md baseline signed
FailArchitecture issues paused; rescope or descope before further build.
03
Week 7
Mid-build review
PassCore platform live on staging · TripBuilder working · matching engine returning ranked results · Stripe + ATOL test bookings completing on test data
FailIssues catalogued; descope / extend / rescope decision before final build push.
04
Week 10
Pre-launch readiness
PassAll §3 deliverables passing acceptance · third-party pen-test scheduled · UAT plan signed · content (MVP catalogue) populated · staging mirrors production
FailPre-launch slips. Launch date renegotiated; reduced launch scope agreed.
05
Week 14
Post-launch
PassProduction live · monitoring + alerting wired · on-call rotation in place · first real bookings observed · handover pack delivered
FailHyper-care extension activated. Cost-and-time agreed before any extension begins.

Drift protections — controls already in the contract.

ControlWhat it doesWhere it’s named
Fixed-price scope, scope-bounded£40k+VAT covers exactly proposal §3 inclusions, bounded by §4 exclusions and §8 assumptions. Out-of-scope work is quoted before starting.Proposal §9.1
Booking-ops vendor discovery gateWeek 0 + Week 1-2 reserve right to pause if vendor reality (FacilitaTrip OR Travel Compositor) differs from assumption. Rescope, descope, or proceed at gate 1. See §004b for the vendor-evaluation framing.Proposal §9.2 + §004b
Change requests in writingEvery additional or modified scope item assessed, quoted, agreed in writing, invoiced separately. No silent absorbing, no silent descoping.Proposal §9.4
10% change-request budget (£4k)AX-controlled, not a hidden Cold Lava buffer. Pre-agreed pool that funds in-flight change requests during the build with one written approval per request. Cold Lava drafts the change note (scope + cost + impact); AX approves before work proceeds. Anything beyond £4k is a fresh quote. Honest framing — it's AX's tool, not a true contingency.Project ops doc
Weekly burn-down vs specLinear board (read-only for AX) shows planned vs actual progress per deliverable. Trending over budget triggers a conversation, not a surprise invoice.§023 Delivery Approach
Per-gate descope optionEvery gate above carries an explicit option to remove scope rather than extend timeline or budget. AX retains agency on what ships.This section

The contingency model.

The £40k+VAT headline price covers everything in the agreed MVP architecture. A 10% scope-change contingency of £4,000 sits alongside it, available for items AX requests during the build that fall outside the agreed scope. It is not an automatic uplift and is not pre-billed — it is a pre-approved buffer for fast-tracking small, clearly-defined extras without a full re-proposal each time.

  1. 01AX identifies a change or extra during the build that isn’t in the architecture document.
  2. 02Cold Lava provides a quick estimate (typically in half-day or day units).
  3. 03AX approves the draw against the contingency pot.
  4. 04Cold Lava delivers the item and invoices the agreed amount from the pot.
  5. 05Unused contingency is not invoiced. If AX uses none of it, the project total is £40k+VAT.
Worked example
During scoping, AX confirms a booking-ops vendor and integration begins. Mid-build, AX decides to switch to a different vendor. If the discovery on the alternative vendor’s APIs turns out to be quick, there is no charge. If it looks like it will take meaningful time, Cold Lava estimates the cost up front, AX approves it, and it draws from the contingency pot — never silently absorbed into the base £40k, never billed as a surprise. The model gives AX commercial flexibility for in-flight changes without surprise costs, and gives Cold Lava clear scope boundaries.
The principle
AX never finds out that a budget has run out. AX always knows where the project stands against the budget — and AX always retains the option to descope, defer, or rescope at any of the five named gates. Silent failure is not in the contract.
025Insurance, IP & Continuity

Insurance, IP, continuity — every contract risk named.

The contract risks that matter before a build proceeds: are we insured against catastrophe, who owns the IP, what happens if Cold Lava disappears. Every line below is a real policy or commitment, named, and willing to be evidenced at contract.

Insurance — three policies in force.

PolicyCoverProvider
Professional indemnity£2 million per claim, aggregateHiscox or equivalent (named at contract)
Cyber insurance£500k per incident — data loss, breach response, business interruptionSpecialist cyber underwriter (named at contract)
Public liability£5 millionCombined business policy

Certificates of insurance available on request before contract signature. Renewal cycle is annual; certificates re-issued automatically.

IP — clean assignment, full transferability.

Code ownership

Full IP assignment to AX on payment of final invoice. Clean assignment, not a licence. Cold Lava retains no rights to the codebase post-handover.

Repository transfer

Git history transferable. Repo is moved to AX's GitHub organisation on handover, with all commits, branches, PR history, deployment history, and observability logs intact. No rewrites, no obfuscation.

No proprietary build steps

The build is `npm install && npm run build`. No Cold Lava-only tooling, no secret npm packages, no obfuscated build scripts. AX's next developer can clone and run.

Third-party licenses inventoried

All npm dependencies catalogued with their licenses. MIT/Apache/BSD only — no GPL, no AGPL surprises in the dependency tree.

Brand assets

AX-provided imagery, copy, and brand assets remain AX's property. Cold Lava-produced design work (component library, motion patterns) assigns to AX on payment.

Continuity — what happens if Cold Lava isn’t around.

Code escrow option

Iron Mountain or NCC escrow available as an add-on. Quarterly snapshots deposited; AX gains access on Cold Lava insolvency, breach, or written request.

Key-person redundancy

Minimum 2 senior developers across the project at all times. Cover policy means no single point of failure. Holiday rotated, not bunched.

Documentation handover pack

On project completion: README, architecture doc (this site), runbook for every operational task, secret-rotation guide, monitoring playbooks. AX's next developer can operate without contacting Cold Lava.

Handover support window

30 days of priority support included after final acceptance. Out-of-scope work in the window billed at £120/hour, on-demand. Beyond 30 days: standard support retainer or per-engagement.

Training & handover · seven sessions, then forty days of cover.

AX is replacing phone-call workflows with software. A single pre-launch handover session isn't enough — the schedule below replaces it with seven.

WhenSessionWho attends · what we coverFormat
Week 12Admin tooling walkthroughAX ops staff. Booking dashboard, customer 360, agent take-over, refund flow, audit log search. Hands-on with staging.2 hr live
Week 12Catalogue editor + content workflowAX content owner. Trip template editing, pricing matrix, publish/preview, editorial blog, GEO suggestions.1.5 hr live
Week 13DMC inbox monitor + customer commsAX ops + customer-services lead. DMC notifications, ageing alerts, escalation paths, customer-comms templates.1.5 hr live
Week 13Discount-code admin + campaignsAX marketing lead. Code creation, expiry, partner-tied codes, Pioneers Club tier management.1 hr live
Week 14Agent-takeover deep-dive + auditAX staff doing live customer support. Take-over UI, audit-trail surfacing, customer-visible diff banners.2 hr live
Week 14Operational runbook walkthroughWhoever holds on-call. Secrets rotation, monitoring dashboards, alert response, deploy promotion, rollback.1.5 hr live
Launch + 1 weekReal-world recapAll staff. First week of production data — what surprised, what worked, what to refine. Open Q&A.1 hr live

Written runbooks (every operational task).

Deploy + rollback procedure
Secrets rotation (Stripe, vendor, Anthropic)
Database backup + restore
Pen-test finding response
Customer GDPR DSAR fulfilment
DMC unresponsive escalation
ATOL-cert reissue / void
Refund processing
Stripe dispute handling
On-call paging response
Bulk catalogue update
Agent take-over audit trail

Every runbook lives in docs/runbooks/ in the repository AX owns. Updated as the platform evolves.

Post-launch support window.

Days 1–14 · hyper-care

Daily Cold Lava check-in (15 min Loom or live). Same-day response on bugs. Slack channel staffed 09:00–18:00 UK. AX comfort grows fastest in this window.

Days 15–30 · cover

Weekly check-in. 24-hour response on bugs. Customer-impacting issues escalate to same-day. Slack channel still staffed.

Day 31+ · retainer or per-engagement

Standard support retainer (£500/month, scoped) or per-engagement at £120/hour. AX's call — never imposed.

Continuity if Cold Lava is no longer involved.

If Cold Lava ceases to operate or is no longer engaged for any reason, AX has everything required to keep running and developing the platform without us. Concretely:

  • Source code and full Git history are held in AX’s own GitHub organisation, with full ownership transferred on final payment. No proprietary licence, no usage restrictions.
  • All commits, branches, PR history, deployment history, and observability logs transfer with the repository. Nothing material is withheld.
  • An independent off-platform mirror (see §017) holds weekly snapshots in a separate jurisdiction under different credentials — the codebase cannot be lost or locked away by any single account or provider.
  • A handover documentation pack covers architecture, deployment, environment setup, observability, and runbooks — a new developer or agency can pick up the codebase from documentation alone.
  • Operational accounts (hosting, database, vendor APIs, DNS, payment) are held directly by AX. None depend on Cold Lava’s continued involvement.

The platform is built on standard infrastructure (Vercel, GitHub Actions, Postgres) with no proprietary build steps. Any reasonably competent successor developer or agency can take over operation without rebuilding from scratch. Continuity is a transition exercise, not a recovery exercise.

The principle
AX is never dependent on Cold Lava’s continued existence to operate the platform. The build is delivered, documented, and transferred so completely that AX could pick up a new developer tomorrow and lose no operational ground.
026Timeline

14 weeks. Five named gates. Critical path called out.

The build is 14 weeks from kick-off. Five named gates with explicit pass/fail criteria. Critical-path phases highlighted — these are the ones where slip is hardest to absorb. Buffers stated explicitly: AX always knows what slack exists and where.

Phase plan, week-by-week.

Weeks 1-2
Discovery + architecture sign-off
Critical path
  • FacilitaTrip API contractual + technical review
  • Sandbox booking written end-to-end against FacilitaTrip
  • Data model approved against AX's spec
  • ATOL legal model confirmed in writing (Option A or B)
  • MVP catalogue (40-50 trips / 15-20 countries) confirmed with AX
  • Brand assets, imagery, copy delivered by AX
Gate 1 — FacilitaTrip discovery (descope / proceed / rescope)
Weeks 3-5
Core platform
  • Homepage + navigation + brand system
  • TripBuilder 6-step wizard with state management
  • Trip detail pages, dynamic from catalogue
  • Customer account: register / login / 2FA / saved trips
  • MVP catalogue trips populated with content
  • Staging URL live for AX review
Weeks 6-8
AI + matching
  • Matching algorithm with 14-dim weighted scoring
  • Damped feedback loop on customer selection
  • LLM advisor (Claude Sonnet 4.6) with tool-calling schema
  • Hallucination guardrails — system prompt, validation, retry
  • Saved searches, abandoned-search recovery automation
Gate 2 — Architecture sign-off review
Weeks 9-11
Tailoring + payments
Critical path
  • Trip tailoring module: day add/remove/move, activity swap, hotel grade upgrade
  • Live re-pricing pipeline with constraint engine
  • Skyscanner-equivalent flight check on date change
  • Stripe Elements integration: deposit + balance, multi-currency, 3DS
  • Accounting webhook to Xero/QuickBooks
Gate 3 — Mid-build review
Weeks 12-13
Booking + ATOL + DMC
  • Booking state machine with all transitions
  • ATOL Certificate generation (post-DMC accept)
  • DMC notification + accept/exception/alternative form
  • Agent take-over flow with audit
  • Pen-test against staging (CREST-accredited)
Gate 4 — Pre-launch readiness
Week 14
QA, UAT, go-live
Critical path
  • Full UAT pass with AX staff on staging
  • Acceptance criteria signed off per §3 deliverable
  • DigitalTrip → AX-architecture cut-over
  • Production monitoring + on-call paging activated
  • Handover pack delivered (runbooks, secrets rotation, ops playbooks)
Gate 5 — Post-launch (hyper-care begins)

Visual timeline.

PhaseWeek 1 ............................ Week 14
Discovery + architecture sign-off
Core platform
AI + matching
Tailoring + payments
Booking + ATOL + DMC
QA, UAT, go-live

Buffer + slip handling.

Buffer week

1 week

Built in to weeks 9-11. Absorbs minor slip without renegotiating the launch date.

FacilitaTrip API gap

0-2 weeks

If gate 1 reveals material gaps, project pauses for re-quote. Not absorbed silently.

Pen-test remediation

0-1 week

Pen-test runs week 13. Critical findings fixed before launch; medium findings tracked into hyper-care.

Content readiness

AX-side

MVP catalogue content must be ready by end Week 5. Slip is AX-managed; affects launch date directly if not met.

Critical path
Three phases marked critical: Discovery (Week 1-2), Mid-build review (Week 9-11), and Pre-launch + cut-over (Week 12-14). Slip in any of these is communicated immediately, with descope / extend / rescope options put to AX before any silent absorption. See §024 Cost & Drift Prevention for the gating mechanism.
026bPhase 2 RoadmapPHASE 2

What's deliberately not in the £40k. What gets added later.

Every section that says 'Phase 2' in the doc collects here. Each item has the trigger that typically activates it and a section reference. Phase 2 is the architectural promise: nothing here requires a rebuild, only an addition. Costs are scoped at the time AX activates each item — no Phase 2 cost is committed in this document.

Phase 2 inventory.

ItemAreaWhy it mattersTypical triggerRef
Native iOS / Android distributionMobileApp Store + Play Store presence beyond the PWA install — for app-store discoverability or marketing reach.AX wants store-listed app§007
Per-stop hotel swapTailoringCustomer-driven hotel grade upgrades / swaps at each individual stop in the itinerary, with live re-pricing.MVP launch + tailoring usage data§012
Further language activationi18nAdditional languages beyond the MVP six — quoted separately per language, based on content volume and QA scope.Catalogue expansion to a new-language market§008
PWA home-screen installMobileAdd-to-home-screen install on iOS 16+ Safari and Android 12+ Chrome — icon, splash screen, full-screen launch. Bridges the spec's 'downloadable APP' ask. The architecture is PWA-ready in the MVP; install activates here.AX wants an installable app experience§007
Persistent cross-session AI memoryAI LayerThe advisor remembers a returning user's preferences, dislikes, and prior itineraries between sessions. Architected from commit one — in-session memory ships in the MVP, cross-session persistence activates here.Returning-customer volume makes it worthwhile§010
Voice searchAI LayerSlide 5 of client spec lists voice search. MVP = browser Web Speech API (free); Phase 2 = Whisper API server-side for accuracy + multilingual.Voice-first audience signals§010
In-trip companion (full)MobileOffline vouchers, push notifications for flight delays, daily itinerary map, in-app contact-AX, optional offline maps. Slide 11 spec.First wave of post-launch travellers§007
Pre-travel compliance API (Sherpa)ComplianceReal-time visa, vaccination, restriction data via Sherpa API — closes the pre-travel compliance gap properly. Currently MVP uses manual workflow.Volume past manual workflow tipping point§018
FCDO Monitoring & Customer AlertsComplianceActive monitoring of UK Government FCDO travel advisories. When an advisory changes for a country with active or upcoming AX bookings, the system identifies affected customers and drafts proactive notifications for staff review and dispatch — removing manual monitoring overhead. Quoted separately — see the Additional Works companion document.Booking volume makes manual monitoring impractical§018b
Hotelbeds APItude (direct)InventoryIf FacilitaTrip is the booking-ops choice — direct chain partnerships (IHG, Hilton, Sheraton, Hyatt) and supplementary supply pool.Inventory gaps identified post-MVP§004b
Direct Viator MerchantInventoryIf Travel Compositor wins, replace TC's Viator connector with direct Merchant for tighter control + better commission terms.Margin optimisation after MVP§004b
FlightAware AeroAPIOperationsIndustry-reference flight status data. aviationstack covers MVP; FlightAware is the gold standard for mission-critical ETAs.Premium tier customers expect it§004b
TripAdvisor Content APIContentReviews, photos, traveller rankings to enrich trip detail pages beyond Google Places coverage.SEO + conversion uplift post-MVP§016
Native iOS/Android React Native wrapperMobileSame as 'Native distribution' line above — full Phase 2 native wrapping if PWA install is judged insufficient.Same trigger as native distribution row§007
AI Opus upgradeAI LayerSonnet 4.6 → Opus 4.7. Application code unchanged, model identifier swap. ~1.7× cost ratio, stronger reasoning on edge cases.Edge-case routing complaints from premium travellers§010
Horizontal scaleInfrastructureMVP architecture vertically scales to 5,000 bookings/year + 300 concurrent. Beyond that = read replicas + queue workers + CDN tier-up.Year 2-3 growth§006
The architectural promise
Phase 2 is additive. No item on this list requires touching layers 01-05 of the architecture (§004). Anything in the table activates by extending the Integration Bus, plugging in a new module, or flipping a feature flag. The £40k MVP is the foundation; Phase 2 is what AX adds when commercial signal supports it — quoted at that time, not now.
Cross-reference
§026c Additional Capabilities Discussed in Scoping covers specific extensions raised during scoping — the Contract Ingestion Agent, FCDO monitoring, and further languages — each detailed in the Additional Works companion document. That section is a discussion list of optional additions; this roadmap is the architectural picture of what the platform is built to grow into.
026cAdditional Capabilities

Additional capabilities discussed in scoping.

In scoping conversations, several extensions to the platform were raised that sit outside the agreed £40k+VAT MVP scope. This section is not the next phase in full — the architectural roadmap is §026b — these are specific additions, raised for discussion, each optional and separately quoted. Every item here is detailed in full in the Awesome Experiences — Additional Works companion document.

Items discussed.

01

Contract Ingestion Agent

AI-assisted reading of supplier contracts (PDF and Word) with structured inventory mapping, configurable sanity checks, and a human-approval workflow. Designed as a deliberate replacement for the approximately £12,000/year manual contract-loading role. Fully detailed in Module 1 of the Additional Works companion document.

02

FCDO Monitoring & Customer Alerts

Active monitoring of UK Government travel advisories with affected-booking detection and draft customer notifications for staff review and dispatch. Fully detailed in the Additional Works companion document.

03

Additional language activation

Beyond the MVP six languages, further languages can be added — quoted separately per language, based on content volume and QA scope.

How this relates to Phase 2
This section is a set of specific additions raised for discussion — not a complete account of the next phase. The architectural roadmap, covering everything the platform is built to grow into, is §026b. Additional modules will be listed here as they are scoped; each has its full functional specification, worked-example scenarios, and commercial structure in the Awesome Experiences — Additional Works companion document.
027Sign-Off & Next Steps

Sign-off, kick-off, build.

Five steps to start. Each named, each owned. The fastest version of this is one approving email from AX, a signed SoW the next day, and Cold Lava on the FacilitaTrip API by the end of the week.

01

Approve this document.

AX reviews this site end-to-end. Any concern, any gap, any change request — flag it as a comment or in writing. Cold Lava responds within 48 hours with either a clarification or an action.

02

Sign the contract + SoW.

MSA + SoW with the proposal §3 inclusions, §4 exclusions, §8 assumptions, and §9 protections as the canonical scope. Patches v1 + v2 (TOMS, refund/amendment, volume caps, ATOL legal model, narrowed launch catalogue) merged in. Clean revision, no tracked-change ambiguity.

03

Issue project kick-off invoice (33%).

First payment. Triggers Cold Lava's calendar reservation, FacilitaTrip API access request, and project board provisioning. AX confirms the MVP catalogue (40-50 trips / 15-20 countries) by end of kick-off week.

04

Kick-off call.

30 minutes. Cold Lava + AX. Walkthrough of the project board, communication rhythm, gate dates, AX-side content readiness milestones. Loom recording for anyone who couldn't attend.

05

Build begins.

Weeks 1-2 are FacilitaTrip API discovery + architecture sign-off (gate 1). Build proper starts week 3. From here, the contract is the source of truth. Surprises become conversations at the next gate, not silently absorbed.

Contacts.

RolePersonEmailFor
Technical leadOliver Tatleroliver@coldlava.aiArchitecture, build, gate decisions, escalations, day-to-day technical comms
Project leadJacob Strayjacob@coldlava.aiDelivery, status updates, AX team comms, commercial coordination
Now boarding · AX · MVP build
Departure call
Gate closes when AX signs.

Cold Lava's calendar is held for the build window. Sign-off triggers the project. Two flights from contract to live: one signed page, one kick-off call.

Departure
CL
Cold Lava
Arrival
AX·MVP
14 weeks · go-live
Investment
£40,000 + VAT
Timeline
12–14 weeks
Gates
Five named
Status
Awaiting sign-off
“The contract is the source of truth. The platform is the deliverable. The relationship is the asset.”

This document is a single living URL. It updates as the build progresses. Every change ships as a deploy. Every section’s state can be referenced by anchor link in any conversation. When the platform launches, this document becomes the handover record.

Cold Lava is built to ship platforms that survive their delivery. This is the start.