Our Q4 2026 calendar is open — first consultation and technical review are free.
Skip to content
Tourism

Kızkıza Heryerde

A booking platform for women-only group tours: occupancy-driven tiered pricing, cash and token refunds and authorisation audited across 38 tables. 57k lines of code, two locales, pre-rendered SEO.

Kızkıza Heryerde kizkizaheryerde.com
57Ksatır kod
38 tabloyetki denetimi
Kademelifiyat merdiveni
Open the site
Technical profile

What it is built with

StackReact 18 + TypeScript, Vite, Tailwind CSS, Framer Motion
BackendPostgreSQL with edge functions and row-level security
Codebase~57,000 lines · 351 files
Interface145 components · 34 pages
Database38 tables · 74 versioned migrations
Server functions23 (payments, refunds, email, automated blog)
LocalesTR · EN via a dictionary-based translation layer
Payments3-D Secure card payments, deposits and balance tracking
SEOPre-rendered pages served to search bots
What makes it different

Not a standard website

  • Price climbs with occupancy. A tiered price ladder, where administrator-entered virtual sales do not count and an empty final tier no longer pins the price to the first one. On a standard tour site price is a single field.
  • Refunds in two currencies. Cash and token refunds run through separate database functions; cancellation tiers and the token deduction rate come from one settings hub and recalculate instantly by selection.
  • It passed a security audit. A missing status trigger that allowed free tickets was closed, the role-check function's public grant was revoked, and row-level authorisation was verified across all 38 tables.
  • The itinerary is not a wall of text. The day-by-day programme sits in tabs, and included/excluded services are edited inline.
  • Search engines see the full page. Although the interface is built in the browser, bots are served pre-rendered pages.
  • Bilingual support was not bolted on. The whole interface translates through a dictionary, and the loading order that froze the header on switch was fixed.
What we did

The solution in six parts

01

Booking and capacity

Itineraries, departure dates, capacity and waiting list; deposits with remaining balance tracking. Capacity for recurring tours is now calculated per date.

02

Tiered price ladder

Prices rise as occupancy grows. Virtual sales entered by an administrator do not count towards the ladder, and leaving the last tier empty no longer pins the price to the first tier.

03

Refund and cancellation policies

Separate functions for cash and token refunds; cancellation tiers and the token deduction rate were consolidated into one settings hub and are calculated dynamically at refund time.

04

Security audit

The free-ticket gap was closed with a trigger, and the role-check function's public grant was revoked. Row-level authorisation was verified across all 38 tables.

05

Interface and readability

A bottom ticket sheet with a fixed mobile action bar, scroll-to-error warnings, a day-by-day itinerary in tabs, inline editing of included/excluded services, and corrected currency formatting.

06

English edition

The whole site was opened up in English through a translation dictionary, and the loading order that froze the header on language switch was fixed.

Components

What was built

  • Row-level authorisation and anonymous access audit across 38 tables
  • Separate database functions for cash and token refunds
  • Tiered price calculation with virtual sales excluded
  • Payment provider migration and 3-D Secure flow
  • Pre-rendered pages for search engines
  • Dictionary-based bilingual interface
  • Image optimisation chain and a hero resolution fix
  • Participant notifications and reminder flows

Want a similar system?

Most of the problems we solved on Kızkıza Heryerde repeat across sectors. Tell us about yours and we will scope it together.