Hashorn

Case study · Travel-tech · India · Pre-seed

B2B travel-booking MVP shipped in seven days for an investor pitch

A Bengaluru founder had a Tuesday pitch with three investors and a hypothesis about B2B travel booking that needed a working product to defend. We delivered a real flight-search-to-booking flow on Amadeus in seven days, with a working test booking ten minutes before the meeting.

Case studyTravel-tech · India · Pre-seed

SafarFlight

7 days · investor-ready demo

Client

SafarFlight

Engagement

Fast MVP · fixed scope, fixed deadline

Duration

7 working days (Q1 2026)

Team

2 senior engineers + 1 QA · 1 Hashorn PM

ServicesAI Software DevelopmentQuality Assurance

Outcomes at a glance

Time to demo-able product

7 working days

Live test booking before pitch

Confirmed PNR

Pre-seed closed

Within 14 days

Critical defects at demo

0

Sprint timeline

How the engagement unfolded

  1. Day 1

    Scope, Amadeus access, kickoff

    One 90-minute call to lock scope, Amadeus credentials provisioned, and a one-page brief shared by EOD. Killed five nice-to-haves that wouldn't help the pitch demo.

    Brief + Amadeus sandbox keys

  2. Day 2

    Auth, agency profiles, search shell

    Magic-link auth, agency profile schema, and a first cut of the flight-search UI rendering mock data from Amadeus's sandbox.

    Search UI rendering live Amadeus results

  3. Day 3

    Search results + fare caching

    Full search results with filtering (stops, time of day, airline), 5-minute fare cache to keep the demo snappy. Built the seat-class selector and the per-passenger pricing breakdown.

    Searchable results with filters

  4. Day 4

    Booking flow + Stripe checkout

    Passenger data capture, fare-hold creation on Amadeus, Stripe payment intent, and the idempotent booking confirmation path.

    First real fare-hold confirmed

  5. Day 5

    PNR confirmation + voucher generation

    Successful payment triggers Amadeus PNR creation, PDF voucher generation, and an email to the agent and passenger via Resend.

    First end-to-end booking · real PNR

  6. Day 6

    Hardening + load test

    Playwright covered the 12 demo paths; k6 load-test confirmed the search API stayed under 800ms p95 with 50 concurrent agents. PDF voucher reviewed by a real travel agent.

    12 specs · p95 800ms · agent sign-off

  7. Day 7

    Demo prep + investor pitch

    Three full dress rehearsals on Monday. Tuesday: live test booking ten minutes before the pitch confirmed the demo path. Founder ran the demo live with a real Amadeus PNR.

    Live PNR · investors agreed terms in the room

Architecture

The stack we shipped on

Frontend

Server components for search, client for booking

  • Next.js 15
  • App Router
  • TypeScript
  • Tailwind

API

Same Next app; no separate API service needed for the demo

  • Next.js Route Handlers
  • Zod
  • Idempotency keys

Data

  • PostgreSQL 16
  • Prisma
  • RDS

External

Sandbox keys for Amadeus + Stripe through the demo

  • Amadeus Self-Service
  • Stripe
  • Resend

Cloud

  • AWS
  • Vercel
  • CloudFront

Risks we actively managed

  • Amadeus rate limits during the demo — pinned fare cache + pre-loaded popular routes so the live search call was sub-second.
  • Stripe + Amadeus race conditions — fare-hold expires after 15 minutes; idempotency keys on every payment-confirmation write to prevent double-booking.
  • PDF voucher rendering on slow connections — generated server-side and cached so the email could ship even if the browser request timed out.
  • Investor pitch live failure — full dress-rehearsal sequence with a known-good test booking already in the system as a fallback.
Workflow

Tracked end-to-end in BuildOS.

Every meeting summary, requirement, sprint, task, and metric in this case study was rendered in BuildOS during the engagement. The customer's team had read-only access to the same workspace from week one, they saw Friday demos, weekly velocity, and AI-generated checklists without us sending status emails.

The challenge

Arjun Verma was a third-time founder pitching SafarFlight to three Indian VCs on a Tuesday. His thesis: B2B travel booking for India's 250,000+ small travel agencies was still being done on WhatsApp and Excel, and a clean booking flow with proper fare-holds and accounting integration would dominate the segment.

He had a deck, wireframes, and a Notion doc with notes from twelve agent interviews. The VCs wanted a working product before they'd commit.

He gave us seven working days, three constraints, and his agency interview transcripts:

  • The demo had to use a real GDS, not a mock. A travel-tech demo that doesn't surface real fares is the equivalent of a fintech demo with fake money. Amadeus was the call.
  • The booking had to actually book. A real PNR (Passenger Name Record) had to be issued during the demo. The investors knew enough to spot a fake confirmation screen.
  • It had to work on Tuesday at 11 AM IST. Not a beta build, not a "it works on my laptop", not a fall-back static page. A live booking, performed live.

How we approached it

A two-engineer pod paired with our QA lead and a Hashorn PM. We worked in 24-hour cycles — Bengaluru-aligned hours for engineering, with the QA lead picking up the build for testing during evening hours.

Day one was scope-and-kill. We took Arjun's twelve-feature list and cut to four: flight search, fare-hold, booking confirmation, PDF voucher. Everything else — agent management, accounting export, multi-passenger groups, fare-rule explanations — got deferred to post-pitch. He bought it because we could show him the demo path on paper.

Amadeus's sandbox keys came through on day one. We pre-loaded the eight routes the investors were likely to test (BLR-DEL, DEL-BOM, BOM-DXB, etc.) and cached the fare data so the live search call would be sub-second on stage.

What we shipped

Day 1 — Scope, kickoff, Amadeus access. Arjun's twelve-feature list trimmed to four. Amadeus sandbox credentials provisioned. One-page brief signed by 6 PM IST. Risk register locked.

Day 2 — Auth + search shell. Magic-link auth (via Resend), agency profile schema, and the Next.js search UI hitting Amadeus's sandbox. By EOD the team could enter "BLR to DEL on May 15" and see real fares come back.

Day 3 — Results + filtering. Stops/time/airline filters, seat-class selection, per-passenger pricing breakdown. Five-minute fare cache (Postgres-backed) so the same search wouldn't hammer Amadeus and so the demo would stay snappy.

Day 4 — Booking flow + payment. Passenger data capture, Amadeus fare-hold creation (15-minute hold window), Stripe payment intent generation, and the idempotent confirmation path. First real fare-hold confirmed in sandbox at 2 PM.

Day 5 — PNR + voucher. Payment success triggers Amadeus PNR creation, server-side PDF voucher generation (with proper fare rules, baggage info, and agency branding), and Resend emails to both the agent and the passenger. First end-to-end booking with a real PNR completed.

Day 6 — Hardening + load test. Playwright suite covering 12 critical paths. k6 load-test with 50 concurrent agents kept the search API under 800ms p95. A real travel agent (Arjun's friend) ran a booking and signed off on the voucher format.

Day 7 — Demo and pitch. Three full dress rehearsals Monday. Tuesday 10:50 AM: live test booking on a BOM-DXB route confirmed the demo path was hot. 11 AM: Arjun pitched. 11:35 AM: live demo with a real PNR. 12 PM: investors agreed terms verbally; written term sheet by Thursday.

The outcome

  • Seven working days from Notion doc to working B2B booking platform with a real GDS integration.
  • Live PNR demoed during the pitch — investors verified the confirmation independently via Amadeus's check-PNR endpoint right there.
  • Pre-seed round closed within 14 days of the pitch.
  • Zero critical defects at demo time. The seat-map rendering had a Safari-specific bug we'd caught on day six and shipped a fix for at 8 AM Tuesday.
  • The four-feature scope held. SafarFlight launched publicly six weeks later with the same architecture; we extended the pod for three more months to ship the rest.

What we'd repeat

The scope-kill on day one was the single highest-leverage decision of the week. Arjun's twelve-feature list looked tight to him; cutting to four felt brutal but turned the next six days from "we hope we ship" into "we know exactly what's done by Friday". Investors don't need agent management on day one — they need a working booking.

The other lesson: make the demo path the hardest path you build. The booking-and-PNR flow was the riskiest thing on the list. We built it on day four and five so we had two full days to harden it before the pitch. Easy stuff like profile pages and filters slotted in around the hard core. If we'd done it the other way around — easy stuff first, hard stuff at the end — the pitch would have happened on a half-tested booking flow.

I gave Hashorn a Notion doc and a Tuesday deadline. They gave me a working booking flow on the Friday before the pitch, with a real Amadeus PNR confirmed ten minutes before the investors walked in. That demo is what closed the round.
AV

Arjun Verma

Founder & CTO, SafarFlight

Want a result like this?

Tell us what you're building, we'll tell you how we'd ship it.

Book an intro call →