Book a workshop
Account
Case study · tour operator · live

Website, CRM and three portals for a tour operator

Enruta360 is a tailor-made travel studio. They needed a product, not a brochure: public catalogue, requests, bookings, payments and three private areas. I built it from scratch.

In production · bilingual IT/EN

Enruta360 homepage: waterfall hero and headline Journeys designed for those who refuse the ordinary

Home · photographic hero, IT/EN switch, portal login

Enruta360 is a full digital product for a tour operator: bilingual public site, experience-tour catalogue with dates and prices, 5-step request wizard, Stripe gift cards, wedding lists, newsletter, and three portals (admin, travel designer, client) with CRM, bookings and travel documents. Stack: Next.js, TypeScript, Supabase, Stripe, Resend.

What they needed

A small tour operator, founders on the road, a network of travel designers. No WordPress plugins to update every month: a product they own, with client data at the centre.

  • A public site that sells trips, not only describes them
  • Structured requests instead of scattered emails
  • Tour catalogue with dates, prices, itinerary and FAQ
  • Gift-card payments without a separate shop
  • Client area for documents and vouchers
  • One admin for leads, bookings, network and content

The public site

Every page is a sales surface. Screenshots are from the live site.

Enruta360 catalogue with category filters and ROOTS OF ARGENTINA card

Experience tours · Sport, Retreat, Photography, Cultural filters

Catalogue

Tours filterable by category

Experience tours managed from the CMS: categories, partner card, duration, copy. A tab changes the grid without a reload.

Enruta360 tour page with price, dates and inclusions list

Tour page · 20 Feb–3 Mar 2027 · €4,695

Product page

Dates, price and what's included

Each tour has a day-by-day itinerary, gallery, team, FAQ and a booking box with departure and per-person price. Content lives in the database, not on a static landing page.

Enruta360 trip-request wizard, Who you are step

Build your trip · step 1 of 5

Leads

A 5-step wizard, not an endless form

Who you are, where, when, style, confirm. The draft saves in the browser. On submit it lands in admin as 'new' and a transactional email goes out.

Enruta360 gift-card purchase flow with amounts and Stripe

Gift card · 3 steps: amount, personalise, preview

Payments

Stripe gift cards, custom amounts

Presets from €100 to €1,000 or a custom amount. Email delivery, 12-month validity, partial balance across trips. Stripe checkout, webhooks, codes in admin and in the client portal.

Enruta360 wedding-list landing with request-your-page CTA

Wedding lists · personal page for guests

Wedding lists

A page for guests, not a generic portal

Hero with the names, trip stops, photos and bank details. Admin creates the list, the couple shares the link. No third-party platform fees.

Enruta360 about page with camper and headline We don't plan trips from a desk

About · founders on the road

Network

Founders, designers, partners, coordinators

Each profile has bio, specialty and photo, shown or hidden from admin. The commercial network is a CMS, not an about page edited by hand.

Three portals, one login

Same product, three roles. Admin sees everything. The travel designer manages their tours and assigned requests. The client finds trips, documents and vouchers.

Admin

Who runs the company

Dashboard, stats, catalogue, network, bookings, requests, contacts, newsletter, vouchers and gift cards. One menu, all the data.

Travel designer

Who builds the itinerary

Sees their own tours, assigned requests and linked bookings. They never enter the full admin: only their perimeter.

Client

Who travels

Profile, trips, travel documents uploaded by the studio, vouchers and gift cards. No PDFs lost in a WhatsApp chat.

What the CRM does

This is not HubSpot with an integration. Leads, bookings and content live in the same database as the site.

Sales pipeline

  • Trip requests

    They arrive from the wizard. Statuses: new, in progress, proposal sent, closed. Assignable to a travel designer.

  • Contacts

    Site form plus a timeline: email sent, call, follow-up, note, status change. History stays on the record, not in three inboxes.

  • Waiting list

    When a tour is full, the contact stays in queue. Admin manages it without a separate spreadsheet.

  • Newsletter

    Signup with GDPR consent, IT/EN locale, list in admin. Same database as the leads, no Mailchimp.

Operations and payments

  • Bookings

    Statuses pending, confirmed, completed, cancelled. Linked to the client, the tour and passengers.

  • Travel documents

    Admin uploads files on the booking. The client finds them in their portal, no scattered attachments.

  • Stripe gift cards

    Checkout, webhook, unique code, balance in cents, expiry, partial use. Visible in admin and to the client.

  • Vouchers

    Credit assignable to a profile, with balance and expiry. Useful for refunds or gifts without touching Stripe.

Catalogue and network

  • Tour builder

    Title, itinerary, gallery, FAQ, categories, publish flag, Stripe price if the tour is buyable online.

  • Partners and designers

    CMS cards with bilingual bio, specialty, visibility. Linked to tours and assigned requests.

  • Wedding lists

    Public guest pages, created and reviewed in admin. Itinerary, photos, bank details.

  • Statistics

    Requests this week, open bookings, published tours, monthly lead and revenue trend.

Stack

One Next.js app, one Postgres database, native payments and email. No plugins to keep alive.

Next.js 16React 19TypeScriptSupabasePostgreSQLStripeResendnext-intlGSAPThree.jsTailwind CSS

Auth and storage on Supabase with role-based RLS. React Email. Stripe checkout and webhooks. GTM analytics.

Need the same kind of product?

Site, CRM, bookings and payments in one stack, without four separate subscriptions.

enruta360.com