{ Project / Live }

Bókun × Bank of Georgia Checkout

A custom booking application for Views Georgia Tours connecting Bókun reservations, a branded checkout, GEL conversion, and Bank of Georgia payments.

{ At a glance }

Project overview.

Client
Views Georgia Tours
Role
Solution architecture, full-stack development, API integration & deployment engineering
Status
Live
Discipline
Applications, Integrations
Visit the checkout application

{ Business outcomes }

What this makes possible.

One booking and payment flow

Travelers can select a tour and pay in GEL through a branded checkout connected to Bókun.

Payment before confirmation

Server-side payment verification controls the move from a temporary reservation to booking confirmation.

Clear recovery states

Payment and booking exceptions have explicit states so an interrupted transaction can be identified and handled.

{ Context }

The problem.

Views Georgia Tours needed a Bank of Georgia payment journey connected to its existing Bókun reservation system and Duda website. The integration had to retrieve availability, respect participant and pricing rules, collect product-specific booking details, hold inventory during payment, and confirm a reservation only after payment verification. It also needed to preserve Bókun’s original totals while presenting the corresponding GEL amount.

{ Role & implementation }

My contribution.

I translated the booking and payment requirements into the application architecture and implemented the connection across the website, Bókun, and Bank of Georgia. My work covered the embedded selector, hosted checkout, exchange-rate handling, provider APIs, persistent booking states, and deployment configuration. The supplied project notes describe a client-specific integration for one vendor, website, and merchant account.

{ The solution }

What I built.

I built a standalone application with three parts: an embedded booking selector for Duda tour pages, a branded hosted checkout, and server-side payment-to-booking orchestration. The selector resolves the tour from the dynamic page, while the server validates it against Bókun. Checkout follows the current product’s required contact, passenger, pickup, extra, and booking questions instead of using a fixed form.

{ The customer journey }

From tour selection
to booking outcome.

//01

Select the tour

Choose participants, a date, and an available departure time through the embedded selector.

//02

Validate the selection

Check the product and selection against Bókun, then create a signed, time-limited checkout session.

//03

Collect booking details

Display the relevant contact, passenger, pickup, extras, and product-specific questions.

//04

Review the GEL quote

Convert the authoritative Bókun total using the National Bank of Georgia rate feed and refresh it when selections change.

//05

Reserve and hand off

Create a temporary Bókun reservation before opening the bank-hosted payment page.

//06

Verify and resolve

Verify the bank transaction server-side, then confirm the booking or retain an explicit pending, failed, or review state.

{ Technical decisions }

Why this approach.

Bókun remains authoritative for product data, availability, pricing, questions, reservations, and final bookings. Signed, expiring checkout sessions carry validated selections into the hosted flow. The customer’s return from the bank is never used as proof of payment: the server verifies the transaction, amount, and currency with Bank of Georgia before attempting booking confirmation.

{ Engineering detail }

An embedded selector for dynamic pages

A shared vanilla JavaScript selector works through Duda’s HTML controls. It resolves the activity identifier from published page data, and the server validates that identifier. Participant categories, group-size tiers, participant limits, and available departure times are part of the selection logic.

{ Engineering detail }

Questions that follow the booking

The checkout retrieves the questions and options associated with the selected booking. Answers are validated and mapped to Bókun’s booking structure; changes refresh the relevant questions while preserving answers that still apply.

{ Engineering detail }

Traceable currency handling

The application retains the original product total, GEL amount, exchange rate, and rate date. Bókun keeps its original-currency amounts; the bank receives the GEL total. Missing exchange-rate data stops checkout rather than allowing an unverified charge.

{ Engineering detail }

Durable coordination between providers

PostgreSQL stores order state, payment references, provider events, transitions, and operation attempts. A verified payment with an incomplete booking remains confirmation-pending, giving recovery a clear state rather than asking the customer to pay again.

{ Recovery & exceptions }

When payment and booking
do not finish together.

SituationApplication behavior
Payment verified; reservation confirmedMark the order confirmed.
Payment verified; confirmation incompleteRetain a paid, confirmation-pending state and retry booking confirmation safely.
Repeated callback or requestDeduplicate events and guard against repeated operations.
Payment failed or cancelledHandle reservation release or expiry without confirming an unpaid booking.
Amount mismatch or reservation expired after paymentRoute the order to manual review.

{ Technology & architecture }

The implementation stack.

LayerTechnology
ApplicationNext.js App Router, React & TypeScript
Checkout interfaceTailwind CSS & Zod validation
Embedded selectorVanilla JavaScript in Duda HTML Content
PersistencePostgreSQL & Drizzle ORM
BookingBókun App API & REST Booking API
Payment & currencyBank of Georgia Payment Manager & National Bank of Georgia rate feed
ObservabilityPino & Sentry
DeliveryDocker, GitHub Actions & GitHub Container Registry

{ Security model }

Keep the trust boundary clear.

The supplied implementation notes describe server-side credentials, encrypted stored provider credentials, signed checkout sessions, and bank-hosted card entry. Card details are entered on the bank’s page rather than stored by the application. These design choices are not presented as an independent security certification.

{ Delivered capabilities }

What changed.

The integration is running for Views Georgia Tours, and the client has received payments through it. It connects the existing Bókun booking setup with a branded checkout and Bank of Georgia payment collection in GEL. The delivered application includes inventory-aware selection, product-driven booking forms, temporary reservations, server-side payment verification, and explicit recovery states. No transaction volume, conversion uplift, revenue total, or time-saving metric is claimed.

{ Scope }

Built for this client’s setup.

This is a client-specific integration, not a public Bókun marketplace payment gateway. Automated refunds, multi-vendor support, and a customer portal are outside the documented V1 scope. Additional vendors or payment providers would require further development and validation.

{ Screens & walkthrough }

The experience.

Bókun and Bank of Georgia checkout landing page showing its test-environment status
Checkout application landing page, captured during testing. The system is now live and the client has received payments through it.
Views Georgia Tours website homepage
The existing Views Georgia Tours website provides the customer-facing entry point.
Views Georgia Tours tour catalogue
Tour catalogue on the existing website; Bókun remains the source of tour information.
Custom checkout showing participant categories and pickup selection
Hosted checkout with participant categories and pickup selection, captured during testing. The displayed prices and dates belong to that screenshot.
Bank of Georgia hosted payment screen for Views Georgia Tours
Bank of Georgia hosted payment interface for Views Georgia Tours. The client has confirmed receiving payments through the live integration.

{ Today }

Current status.

The booking and payment system is active and running for Views Georgia Tours. The client has received payments through the integration, as confirmed by Luka. The screenshots were captured during testing and may show earlier test-environment labels; they do not represent the current operational status.

{ Let’s build }

Need to connect your booking platform with a local payment provider?

Discuss an integration
Back to work