=== Yatra - Travel Booking & Tour Management ===
Contributors: MantraBrain
Tags: tour-booking, travel-booking, tour-operator, travel, travel agency
Requires at least: 6.0
Tested up to: 7.0
Requires PHP: 7.4
Stable tag: 3.0.7
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

WordPress travel booking plugin for tour operators. Trips, departures, payments, OTAs, AI. Free + [Pro](https://wpyatra.com/pricing/) from $99/yr.

== Description ==

**✈️ Yatra** is the **WordPress travel booking plugin** built for **tour operators, activity providers, travel agencies and adventure businesses** that need real trip inventory — not a generic shop. The free version is a full booking office: trips, availability, checkout, customer records, transactional emails and a customer account area. **[Yatra Pro](https://wpyatra.com/pricing/)** unlocks [premium payment gateways](https://wpyatra.com/pricing/) plus a suite of [20 Pro modules](https://wpyatra.com/features/) you switch on as your business grows — from [Channel Manager (Viator + GetYourGuide)](https://wpyatra.com/features/channel-manager/) to [AI Assistant](https://wpyatra.com/features/ai-assistant/), [White Label](https://wpyatra.com/features/white-label/) and [WhatsApp Notifications](https://wpyatra.com/features/whatsapp/).

**Official site:** 🌐 [wpyatra.com](https://wpyatra.com/) · 📖 [docs.wpyatra.com](https://docs.wpyatra.com) · 💳 [Pricing](https://wpyatra.com/pricing/) · ✨ [All features](https://wpyatra.com/features/) · 🎯 [Live demo](https://demo.wpyatra.com/) · 💬 [Support forum](https://wordpress.org/support/plugin/yatra/)

= 🎬 See Yatra in action =

🎥 Watch the Yatra walkthrough on YouTube — trips, bookings, checkout, and traveler accounts in under five minutes. More tutorials on the **[MantraBrain YouTube channel](https://www.youtube.com/@MantraBrain)**.

	[youtube https://www.youtube.com/watch?v=cHmC-x7y0TQ]

= ✈️ Why tour operators pick Yatra =

* 🗺️ **Travel-first data model** — Departures, capacity, traveler types and itineraries match how tours are actually sold, not how an e-commerce shop sells products.
* 🧭 **One admin workspace** — Modern Yatra dashboard inside wp-admin; less tab-hopping than bolting travel onto a generic commerce stack.
* ⚖️ **Honest Free vs [Pro](https://wpyatra.com/pricing/)** — Core booking, CRM-style records, reviews and PayPal / Pay Later are in the free plugin. Card gateways and advanced modules are in [Pro](https://wpyatra.com/pricing/) — no surprise paywalls on basics.
* 🔒 **Your site, your data** — Bookings and customer data stay in your WordPress database; payments go through the gateways you configure. No proxy, no markup, no per-booking fee.
* ⭐ **700+ active installs · ★ 4.6 / 5 on WordPress.org** — Active development since 2018, weekly updates.

= 🎁 What you get in the free Yatra plugin =

**Trips and catalog (11 free features)**

* [Trips & Itineraries](https://wpyatra.com/features/trips/) — unlimited trips with rich descriptions, gallery, difficulty, duration, meeting points, included / excluded lists, day-by-day itinerary builder, per-trip FAQs and custom attributes
* [Departures & Availability](https://wpyatra.com/features/departures/) — scheduled departures, capacity, recurring availability rules
* [Customer Accounts](https://wpyatra.com/features/customer-accounts/) — booking history, payments, profile, and document access (invoices, vouchers, itineraries)
* [Reviews & Ratings](https://wpyatra.com/features/reviews/) — moderation and trip-level display
* [Sales Reports](https://wpyatra.com/features/reports/) — admin reports for bookings, revenue, and trends
* [Discounts & Coupons](https://wpyatra.com/features/discounts/) — sale and regular pricing, traveler-based pricing, coupon engine
* [Enquiries Inbox](https://wpyatra.com/features/enquiries/) — capture pre-booking questions per trip
* [PDF Documents](https://wpyatra.com/features/pdfs/) — generated invoices, vouchers, traveler itineraries
* [Transactional Emails](https://wpyatra.com/features/transactional-emails/) — booking confirmation, payment receipt, cancellation, reminder

**Free payment gateways**

* [PayPal](https://wpyatra.com/features/paypal/) — cards, PayPal balance, Pay-in-4
* [Pay Later](https://wpyatra.com/features/pay-later/) — book now, confirm or pay offline (ideal for bank transfer, cash on arrival, invoice workflows)

**Front-end + extensibility**

* Templates for trip listings, single trip, booking flow, checkout, and account
* **4 Gutenberg blocks** + **6 shortcodes** to place trips, search, login and account on any page
* Compatible with most well-coded block themes, classic themes and major page builders
* PHP 7.4 or newer, structured codebase, hooks and filters, template overrides
* REST-oriented flows for booking and account experiences

= 💎 Yatra Pro — 20 modules across 3 tiers =

**[Compare plans and buy Yatra Pro](https://wpyatra.com/pricing/)** — three plans (Starter · Growth · Scale), each available yearly or lifetime.

**Starter — $99/yr (sale, regular $149)** · 1 site license · everything below included

* [Dynamic Pricing](https://wpyatra.com/features/dynamic-pricing/) — seasonality, demand, early bird, last-minute, inventory rules
* [Flexible Payments](https://wpyatra.com/features/flexible-payments/) — deposits and partial payments
* [Scheduled Payments](https://wpyatra.com/features/scheduled-payments/) — instalment plans
* [Advanced Discount](https://wpyatra.com/features/advanced-discount/) — group-style discounts alongside coupons
* [Additional Services](https://wpyatra.com/features/additional-services/) — sell extras with the trip
* [Email Automation](https://wpyatra.com/features/email-automation/) — multi-step sequences, audience filters, per-send delivery logs
* [Abandoned Booking Recovery](https://wpyatra.com/features/abandoned-booking-recovery/) — recover incomplete bookings
* [Mailchimp Integration](https://wpyatra.com/features/mailchimp/) — sync travelers + bookings to lists
* [Facebook Pixel](https://wpyatra.com/features/facebook-pixel/) — server-side + browser events
* [Google Analytics 4 Enhanced](https://wpyatra.com/features/google-analytics/) — booking funnel + revenue events
* [Google Calendar sync](https://wpyatra.com/features/google-calendar/) — departures and bookings into Google Calendar
* [Custom Landing Pages](https://wpyatra.com/features/custom-landing-pages/) — per-trip conversion-focused landing pages
* [Dynamic Form Field](https://wpyatra.com/features/dynamic-form-field/) — drag-and-drop custom booking questions
* [Trip Consent](https://wpyatra.com/features/trip-consent/) — digital waivers and signatures
* **Premium payment gateways**: Stripe · Razorpay · Mollie · Paystack · Square · Authorize.Net · Bank Transfer

**Growth — $149/yr (sale, regular $199)** · 1 site license · everything in Starter, plus

* [AI Assistant](https://wpyatra.com/features/ai-assistant/) — generate itineraries, draft descriptions, suggest replies (bring your own OpenAI or Anthropic key)
* [WhatsApp Notifications](https://wpyatra.com/features/whatsapp/) — booking confirmations, payment receipts and departure reminders over WhatsApp (Meta Cloud API)

**Scale — from $349/yr (sale)** · 1-site $349/yr (regular $449) or 15-site $599/yr (regular $749) · everything in Growth, plus

* [Channel Manager](https://wpyatra.com/features/channel-manager/) — sell on Viator + GetYourGuide from one WordPress dashboard. Signed webhooks, anti-overbooking locks, real-time inventory sync.
* [White Label](https://wpyatra.com/features/white-label/) — rebrand the admin, emails, PDFs and frontend. Full agency theming.
* [Team & Access](https://wpyatra.com/features/team-access/) — granular roles + capability-based access for multi-staff agencies. 8 built-in roles, custom role builder, magic-link invitations, time-windowed access for contractors, scope filtering (per-destination / per-trip), append-only audit log. Defense-in-depth: every action gated on the server, UI mirrors via cap-aware controls.
* [Webhooks](https://wpyatra.com/features/webhooks/) — outbound HTTP delivery on booking / payment / customer events. HMAC-signed payloads, retry queue with exponential backoff, dead-letter queue, certificate pinning. Wire Yatra into Zapier, Make, n8n, or your own internal systems.

**Lifetime plans** also available: Starter $499 · Growth $699 · Scale $1,299 (1 site) / $1,999 (15 sites) — pay once, own it forever.

[See full plan comparison and pricing →](https://wpyatra.com/pricing/)

= 🥊 How Yatra compares =

Considering Yatra against a SaaS booking platform or another WordPress travel plugin? We've written honest, side-by-side comparisons against each major alternative:

* 🔄 **[Yatra vs Rezdy](https://wpyatra.com/yatra-vs-rezdy/)** — Sell on Viator + GetYourGuide without the $99–$499 / month Rezdy SaaS bill. Lifetime license · GPL · your data, your gateway.
* 🔄 **[Yatra vs Bokun](https://wpyatra.com/yatra-vs-bokun/)** — Skip the per-OTA-booking fee Bokun charges (typically 2.5% per booking). Independent open-source alternative to Tripadvisor-owned Bokun.
* 🔄 **[Yatra vs WP Travel Engine](https://wpyatra.com/yatra-vs-wp-travel-engine/)** — Same WordPress philosophy, modern architecture, broader Pro modules. Custom database tables for performance vs. WP Travel Engine's custom post types.

Each page covers the feature matrix, pricing math, migration steps and FAQ — written without overpromising. Read the verdict, then [try Yatra Pro free](https://try.wpyatra.com/try-yatra-pro/) before you commit.

= 🌐 Native integrations =

Yatra ships with bring-your-own-credential integrations — no proxy, no markup, no per-event fees. Full directory: **[All integrations on wpyatra.com](https://wpyatra.com/integrations/)**.

* **Payments**: PayPal · Pay Later · Stripe · Razorpay · Mollie · Paystack · Square · Authorize.Net · Bank Transfer
* **OTAs**: Viator · GetYourGuide · Other OTAs (by request)
* **Email & Messaging**: Mailchimp · WhatsApp Cloud API
* **Analytics & Marketing**: Google Analytics 4 · Meta / Facebook Pixel
* **Calendars & Scheduling**: Google Calendar
* **AI Providers**: OpenAI · Anthropic Claude
* **WordPress Ecosystem**: Gutenberg blocks (4 native) · Elementor (via Shortcode) · WooCommerce (coexistence) · Loco Translate

= 🧩 Blocks and shortcodes =

Use the **block editor** or **classic shortcodes** to drop catalog widgets, search and account UI into any page.

**Blocks** (search the inserter for "Yatra" or the block name):

* **Trip** — block name `yatra/tour` (trip grid; the registered name stays `yatra/tour` for backward compatibility, but the inserter title and UI now read **Trip**). **Trip Settings** (layout, **Featured Priority** — restrict to *Featured*, *New*, or *Limited Time* picked on the trip form's **Categorization → Featured Priority**) and **Filters**: each taxonomy (destinations, activities, trip categories, difficulty / fitness level) supports **Listing scope** — either **All published** (no ID filter saved) or **Only selected**, with **search plus checkboxes** to pick numeric classification IDs.
* **Activity** — `yatra/activity`: same taxonomy picker pattern (All published vs search + IDs) in the sidebar; matches **`[yatra_activity]`** ID rules.
* **Destination** — `yatra/destination`: same pattern; matches **`[yatra_destination]`** ID rules.
* **Trip categories** — `yatra/trip-category` (same card layout as destinations; links use your trip category base from Settings).

**Shortcodes** (all accept string values as in the plugin defaults — use `yes` / `no` or `0` / `1` where noted):

* **`[yatra_trip]`** — Trip listing. Alias: **`[yatra_tour]`**. Filters: `destination`, `activity`, `category` accept comma-separated classification IDs. Optional: `order`, `featured_priority` (`featured` / `new` / `limited`), `per_page`, `difficulty`, `price_min`, `price_max`, `duration_min`, `duration_max`, `search`, `columns`, `show_pagination`, `title`. Pagination: `trip_page`. Examples: `[yatra_trip]`, `[yatra_trip destination="44" activity="12"]`, `[yatra_trip featured_priority="new" per_page="6"]`.
* **`[yatra_activity]`** — Activity listing cards.
* **`[yatra_destination]`** — Destination showcase.
* **`[yatra_trip_category]`** — Trip category cards.
* **`[yatra_search]`** — Advanced trip search form. Per-field visibility attributes — `keyword`, `destination`, `activities`, `duration`, `budget` — each `yes` / `no`. Omit one to inherit its **Settings → Search & Listing** toggle; pass a value to force it on/off for that placement. Example: `[yatra_search budget="no" duration="no"]`. (The built-in listing page sets these automatically from your settings.)
* **`[yatra_login]`** — Customer login form.
* **`[yatra_my_account]`** — Account dashboard for logged-in users.
* **`[yatra_discount_and_deals]`** — Discounted trips.

**Empty-term filtering (`hide_empty`):** `[yatra_destination]`, `[yatra_activity]` and `[yatra_trip_category]` accept `hide_empty="yes"` to skip taxonomy terms that have zero published trips. Opt-in (default `no`).

**Note:** If you're migrating from an older build, `[yatra_cart]`, `[yatra_checkout]` and `[yatra_mini_cart]` are no longer registered — checkout and the booking flow now use Yatra's own front-end routes and templates. See **[docs.wpyatra.com](https://docs.wpyatra.com)** for full shortcode reference, URLs and page setup.

= 🎨 Compatible WordPress travel themes =

Yatra works with most well-coded block themes, classic themes and major page builders. **Recommended themes** (optional — Yatra works with any theme):

* 🧳 **[Resa — the official Yatra travel theme](https://wpyatra.com/best-wordpress-travel-theme/)** — Lighthouse-fast, mobile-first, Gutenberg + WooCommerce ready, free on the WordPress.org theme directory. Trip card grid, departure widgets, traveler-account dashboard all pre-styled for Yatra.
* 🧱 **[Blocksy](https://wordpress.org/themes/blocksy/?ref=yatrapluginorg)** — modern block theme
* ⚡ **[Kadence](https://wordpress.org/themes/kadence/?ref=yatrapluginorg)** — fast, flexible theme

= 🔗 Quick links =

* 🏠 **[wpyatra.com](https://wpyatra.com/)** — official site
* 💳 **[Pricing](https://wpyatra.com/pricing/)** — Starter · Growth · Scale · Lifetime plans
* ✨ **[All features](https://wpyatra.com/features/)** — full Free + Pro capability list
* 🌐 **[Integrations](https://wpyatra.com/integrations/)** — every native partner
* 🥊 **[Yatra vs alternatives](https://wpyatra.com/yatra-vs-rezdy/)** — head-to-head comparisons
* 🎨 **[WordPress travel theme (Resa)](https://wpyatra.com/best-wordpress-travel-theme/)** — recommended pairing
* 📖 **[Documentation](https://docs.wpyatra.com/)** — installation, blocks, shortcodes, operations
* 🎯 **[Live demo](https://demo.wpyatra.com/)** — see Yatra on a real WordPress demo
* 🆘 **[Support / contact](https://mantrabrain.com/contact)** — help and commercial support routing

= 💙 Join the community =

* ⭐ **[Rate Yatra five stars](https://wordpress.org/support/plugin/yatra/reviews/?filter=5)** — helps other tour operators find the plugin
* 💬 **[Facebook community](https://www.facebook.com/groups/yatrawordpressplugin)** — connect with other Yatra users
* 📧 **[Email support](mailto:mantrabrain@gmail.com)** — direct email for product questions
* 🐛 **[GitHub — issues & contributions](https://github.com/MantraBrain/yatra)** — bug reports and pull requests

= 🚀 Try Yatra risk-free =

* 🧪 **[Try the free Yatra plugin in WordPress Playground](https://try.new/plugins/yatra)** — spin up a temporary WordPress site with the free Yatra plugin pre-installed. No local setup, no signup, no credit card.
* 🎁 **[Try Yatra Pro free](https://try.wpyatra.com/try-yatra-pro/)** — full Pro trial environment with every module enabled. No credit card required.
* 💰 **14-day refund** on every paid Yatra Pro plan — see the [pricing page](https://wpyatra.com/pricing/) for the refund window terms.

== Installation ==

🛠️ **Quick setup**

1. Install and activate **Yatra** from this screen or upload the ZIP under Plugins → Add New → Upload.
2. Complete the setup wizard (currency, basics, permalinks as prompted).
3. Add destinations and activities, then create your first trip under **Yatra → Trips**.
4. Configure **PayPal** and/or **Pay Later** under Yatra payment settings (free). Add **[Yatra Pro](https://wpyatra.com/pricing/)** when you need card gateways or [Pro modules](https://wpyatra.com/features/).
5. Place the booking experience on your site using Yatra templates, **blocks**, or **shortcodes** (see **🧩 Blocks and shortcodes** in the description above and [docs.wpyatra.com](https://docs.wpyatra.com)).

== Frequently Asked Questions ==

= What is the best WordPress travel booking plugin for tour operators? =

Yatra is the **WordPress travel booking plugin** built around the operational reality of selling tours — scheduled departures, capacity, traveler categories, OTA distribution, dynamic pricing and deposit handling. The free plugin covers the entire booking lifecycle (trips, availability, customer accounts, reviews, reports, PDFs, transactional emails, PayPal + Pay Later); [Yatra Pro](https://wpyatra.com/pricing/) adds 20 modules across Starter, Growth and Scale tiers. Read the [head-to-head comparison vs WP Travel Engine](https://wpyatra.com/yatra-vs-wp-travel-engine/) or [vs Rezdy SaaS](https://wpyatra.com/yatra-vs-rezdy/).

= Is Yatra free? =

Yes. The plugin on WordPress.org is free and includes the core booking stack for many tour operators. **[Yatra Pro](https://wpyatra.com/pricing/)** is a paid upgrade for [premium gateways](https://wpyatra.com/pricing/) and [20 Pro modules](https://wpyatra.com/features/).

= Do I need code skills to use Yatra? =

No for day-to-day operation. Developers can override templates and use hooks for custom workflows.

= Which payments are free vs Pro? =

**Free:** [PayPal](https://wpyatra.com/features/paypal/) and [Pay Later](https://wpyatra.com/features/pay-later/). **[Pro](https://wpyatra.com/pricing/):** Stripe, Razorpay, Mollie, Paystack, Square, Authorize.Net, bank transfer (as supported for your account and region).

= Can I take bookings without charging a card immediately? =

Yes. Use **Pay Later** for offline confirmation, invoices, or pay-on-arrival flows.

= Can I distribute my tours on Viator, GetYourGuide and other OTAs? =

Yes — the [Channel Manager module](https://wpyatra.com/features/channel-manager/) (Scale tier) connects Yatra directly to **Viator** and **GetYourGuide** via their official APIs. Signed webhooks pull bookings back in real time; anti-overbooking locks prevent two channels selling the same seat. Other OTAs (Klook, TripAdvisor Experiences, Booking.com Experiences, Airbnb Experiences) are available by request.

= Does Yatra work with WooCommerce? =

Yes. Yatra runs alongside WooCommerce on the same WordPress site — Yatra stores trips in its own custom tables while WooCommerce uses WordPress orders. Both coexist without data conflicts. Many operators use Yatra for tours and WooCommerce for merchandise or gift cards.

= Does Yatra support multilingual and multi-currency travel sites? =

Yes. Yatra ships translation-ready POT files and is compatible with **WPML**, **Polylang** and **TranslatePress**. Currency configuration is at the site level — set your default currency in Yatra → Settings. RTL stylesheets ship in the bundled [Resa WordPress travel theme](https://wpyatra.com/best-wordpress-travel-theme/).

= Does Yatra work with my theme? =

It works with most modern WordPress themes. Yatra ships front-end templates; your theme controls global layout and typography. For the smoothest pairing, see **[Resa](https://wpyatra.com/best-wordpress-travel-theme/)** — the dedicated Yatra travel theme by MantraBrain, free on WordPress.org.

= Are invoices and vouchers only in Pro? =

Travelers can access invoices, vouchers and itineraries from the account area on the free plugin when your site is configured for it. [Pro](https://wpyatra.com/pricing/) expands payment choices and business modules — it does not remove core documents by default.

= How do saved trips / wishlist work? =

Saved trips appear when **[Yatra Pro](https://wpyatra.com/pricing/)** is active and **wishlist** is enabled in Yatra settings.

= Is Yatra GDPR-friendly? =

Use WordPress privacy tools together with Yatra: export or delete user-related data as required by your policy. Bookings and customer data live in your own WordPress database — Yatra does not ship data to an external SaaS. Payment data is handled by your chosen gateways under their terms.

= Where is documentation? =

See **[docs.wpyatra.com](https://docs.wpyatra.com)** and **[wpyatra.com](https://wpyatra.com/)** for features, **[Pro](https://wpyatra.com/pricing/)** and updates.

= Where are shortcodes and blocks documented? =

See **🧩 Blocks and shortcodes** in the description above. Full walkthroughs (pages, permalinks, checkout URLs) are in the documentation.

= Does Yatra provide cart or checkout shortcodes? =

**No.** Checkout and the booking flow run on Yatra's own front-end routes and templates — drop them on any page via the plugin's pretty permalinks (see the Permalink settings). Catalog, search, login and account still have shortcodes and blocks as listed in the description.

= What does Yatra Pro cost? =

Pricing starts at **$99/yr** (Starter, sale) and goes up to **$599/yr** (Scale 15-site, sale). Lifetime plans available from **$499** one-time. Every Pro tier includes a **14-day refund** window. See the **[full pricing breakdown](https://wpyatra.com/pricing/)**.

== Screenshots ==

📷 **Screenshots** (as shown on WordPress.org)

1. Yatra dashboard inside WordPress — bookings, revenue and quick access to daily tasks
2. Trip Creation Process — content, pricing, media and settings in one workspace
3. Trip list & All listing page — search, filters and status at a glance
4. Trip Booking Process — hero, itinerary and book flow
5. Global Settings - Payment Gateways etc.
6. Traveler account — bookings, payments and documents

== Changelog ==

= 3.0.7 =
* **Booking Form — Text Block field:** new display-only field type to place instructions, notes or a divider **between** booking-form fields in any section (contact, emergency, traveler). It is not an input — never validated, stored, or shown in emails — and supports safe basic HTML; the admin only sets content + width. Hardening: locked core fields (name/email/phone/country) can no longer be retyped, so their inputs can never be dropped from checkout. The builder is gated behind the Pro Dynamic Form Field module.
* **PayPal — bookings now actually confirm (Simple + Advanced):** Simple/IPN now records the payment and confirms the booking; Advanced captures the approved order on return **and** via a signature-verified webhook (configurable Webhook URL + Webhook ID in the admin). Deposits and partial payments settle correctly. Change is contained to PayPal — no shared recorder or other gateway is touched.
* **Square / Authorize.Net:** fixed "not configured properly" on checkout (the frontend gateway config is now built from each gateway's public data, so no gateway secret ever reaches the browser) and bookings now confirm after a synchronous charge, with deposit / partial / remaining-balance amounts settling correctly.
* **Decimals — single source of truth:** the **Number of decimals** setting now controls **every** price consistently — PHP-rendered (single trip page, destination/category/activity showcases, listings, booking confirmation, pricing summaries) and JS-rendered totals alike. Previously PHP prices ignored the setting and always showed two decimals. Backward compatible; existing Setup-Wizard choices are preserved.
* **Search & Listing:** new Settings tab to show/hide search-bar fields (keyword, destination, activities, duration, budget). The `[yatra_search]` shortcode honors those toggles and adds per-placement attributes — e.g. `[yatra_search budget="no"]` — while the trip listing page wires the settings to the shortcode automatically.
* **Itinerary:** fixed bulk delete for single-day trips and partial activity selection (only the ticked activities are removed); translated the action toasts.
* **Availability:** Alert Threshold, Block Reason and Block status now save and reflect on the edit form (clamped/capped to avoid strict-mode write failures).
* **Dynamic Form Field module:** robust contact/emergency/traveler handling at checkout (email-field resolution, traveler synthesis, server-side required-field validation), admin booking-edit round-trip, and dynamic `{{contact_*}}` / `{{emergency_*}}` email merge tags.
* **Admin UI hardening:** added an app-level ErrorBoundary, opted the React roots out of browser auto-translation, and auto-reload once on stale chunk loads — preventing white-screen DOM reconciliation crashes.
* **Internationalization:** translatable booking-form labels/placeholders and new strings throughout; regenerated the translation template (`yatra.pot`).
* **Other:** Google Calendar fixes; account page renders travelers + custom contact fields; email total/balance placeholder fixes; per-module "Learn more" links; wpyatra.com domain updates.
* Safe to update from 3.0.6 — no database changes and no migrations. Pair with **Yatra Pro 3.0.5**.

= 3.0.6 =
* **Pricing plans renamed:** Personal → **Starter**, Agency → **Scale** (Growth unchanged). Display-only rename across the admin — the Modules page tier badges, the premium-upgrade dialog, and the REST gate messages now read Starter / Growth / Scale. The internal capability slugs are **unchanged**, so existing Pro licenses keep the exact same feature access; only the visible plan name changed.
* **Scale 1-site / 15-site:** the Scale (formerly Agency) tier is now offered as a 1-site or 15-site license. Feature set is identical between the two — only the activation count differs.
* **UX:** White Label module re-categorised under "Branding" (was "Agency"); removed the leading icon before the plan name in the upgrade dialog badge.
* Safe to update from 3.0.5.x. No database changes, no migration, no gating-logic change — existing Growth/Agency (now Scale) licenses are unaffected. Pair with **Yatra Pro 3.0.4**.

= 3.0.5.1 =
* **Hotfix — admin 403 on REST routes:** site administrators on a free-only install were hitting `rest_forbidden` on Settings (and any other surface whose REST controller gates on a granular `yatra_*` cap). Root cause: the `user_has_cap` filter installer (`AdminServiceProvider::bootstrapMenuCapability()`) was only called from `registerAdminMenu()` — hooked on `admin_menu`, which doesn't fire during REST requests. The admin SPA loads everything via REST, so the admin fallback that grants `yatra_*` caps to users with `manage_options` never ran for those calls. Fix: the installer is now also invoked from `AppServiceProvider::register()` (always-loaded core path), so the filters install for every entry point — admin pageviews, REST, AJAX, frontend, CLI. An idempotency guard prevents double-registration. Filter logic, priorities, and the team-module-disabled strip branch are unchanged — this is a registration-timing fix, not a semantics change. Pair with **Yatra Pro 3.0.4** (Team & Access).
* Safe to update from 3.0.5. No database changes, no settings reset.

= 3.0.5 =
* **Capability registry foundation:** the free plugin now ships a `user_has_cap` filter at priority 7 (`AdminServiceProvider::bootstrapMenuCapability()`) that reads the `yatra_team_role_enforcement_active` filter signal to decide whether non-admin `yatra_*` caps resolve normally or get stripped. When the Pro Team & Access module is enabled (or its "keep access on disable" setting is on), the signal returns true and caps resolve. When Pro is deactivated or the module is off without that opt-in, non-admin yatra_* caps are stripped so existing role assignments become inert — re-activating restores everything. WP administrators always pass via the admin fallback regardless.
* **Cap-string consistency sweep:** every React page that gated UI on `manage_yatra` now references the canonical registered cap (`yatra_manage_settings`, `yatra_manage_emails`, `yatra_access_admin`). New caps registered: `yatra_view_reviews`, `yatra_edit_reviews`, `yatra_delete_reviews`, `yatra_manage_reviews`. Inline cap checks inside `TripController::restore_revision` and `SingleTripController` draft-preview gain `manage_options` fallback so site owners never fail.
* **`isWpAdmin` always injected:** `AdminAssetsProvider` now always injects `isWpAdmin` and `manage_options` into `window.yatraAdmin.capabilities` (was previously only set by the Pro Team module). Fixes the regression where Reviews + Email Templates didn't load data for admins on free-only or Team-disabled installs. React `usePermissions.can()` gets a triple admin-fallback (isWpAdmin → roles.administrator → capabilities.manage_options) so admins always pass regardless of injection edge cases.
* **Customer + Availability controllers:** `CustomerController::checkAdminPermission`, `AvailabilitySpecificDatesController::checkPermission`, and `AvailabilityRecurringRulesController::checkPermission` now accept the registered Team caps (`yatra_edit_customers`, `yatra_edit_trips`) in addition to the legacy `manage_options` and pre-existing legacy caps (kept as OR-arms for back-compat with any hand-grant filter).
* **Transactional email types are now extensible:** `TransactionalEmailTemplateService::typeToSettingsKeys()` exposes the `yatra_transactional_email_type_to_keys` filter so Pro modules can register their own type → settings-keys mapping. Default subject/body lookups expose `yatra_transactional_email_default_subject` and `yatra_transactional_email_default_body` so modules can supply baseline copy. Powers the new Team module's customizable invitation email surface.
* **Try Yatra Pro pill:** subtle amber pill appears next to the page title on every admin page when the Pro plugin is NOT active. Links to `https://try.wpyatra.com/try-yatra-pro/` (no credit card required). Hidden as soon as Pro is active.
* **UX polish:** `SharedTable` action-menu dropdown shadow reduced from `shadow-2xl` to `shadow-md` (matches the rest of the admin design); modal-body data loaders replaced with Skeleton blocks (Team page, MemberEditDrawer, RoleEditDrawer, AddMemberModal candidate picker); Departure save/cancel redirect now returns to the Departures page instead of the Trips page; Email page tabs (Delivery, Templates, Sequences, Logs) persist in the URL so direct links and reload work.
* **Reviews + Email registry:** `Layout.tsx` sidebar entry for Reviews now gates on `yatra_view_reviews` (was `yatra_view_trips`); `useEmailSettingsManager` gates on `yatra_manage_emails` (was the unregistered `manage_yatra`).
* **Version:** Yatra free **3.0.5**. Pair with **Yatra Pro 3.0.3** for the Team & Access module.
* Safe to update from 3.0.4.
* **NEW — Discount Stacking setting:** Settings → Pricing tab with four modes (Both apply / Best for the customer / Discount only / Dynamic Pricing only). Only renders when both Advanced Discount and Dynamic Pricing modules are enabled. Default `both` preserves legacy behaviour — zero change for existing sites unless an operator opts in.
* **NEW — `yatra_pricing_after_discount_stack` filter** in `CalculationService` lets premium modules rewrite the discount/DP combination per operator policy. `pre_dp_base_amount` ships in the snapshot so listeners detect DP-active without re-running rules. `calculateBaseAmount()` and `calculateGroupDiscount()` made public; new `computeBaseAmountWithoutDynamicPricing()` helper for the discount-only re-walk.
* **NEW — Channel Manager UI:** searchable TripPicker on the New Mapping form (replaces the numeric Trip ID input); Mappings list shows trip name with link instead of `#42`; All-channels filter + Add Mapping button stay on one row.
* **NEW — Module-page skeletons:** Webhooks, Channel Manager, AI Assistant, WhatsApp, WhiteLabel, Team now render shape-aware skeletons (not bare spinners) on initial load. New `ModulePageSkeleton` + variants component.
* **Booking confirmation:** Features tag row removed; featured-image always renders with a bundled placeholder fallback (no more lopsided text-only cards on trips without an image set).
* **Booking sidebar consistency:** per-category price (Adult × N) now always matches Trip Subtotal across JSON response, server-rendered HTML, and the React renderer — reconciled against CalculationService's authoritative `category_prices_post_dp` map.
* **Stripe / AuthorizeNet / Square checkout fix:** all three premium-gateway flows now forward `X-Yatra-Booking-Nonce` on `/booking/create`, fixing the `invalid_nonce` 403 that blocked card payments.
* **Booking confirmation fatal fix:** `BookingRepository::getResolvedBookingsTable()` → `getTableName()` (post-3.0.5 dangling refactor that crashed the confirmation page).
* **Booking-Form sub-tab gate:** truthy check on `yatraAdmin.dynamicFormFieldEnabled` so the sub-tab actually renders (wp_localize_script string-coercion bug — `true` arrives as `"1"`, strict-equality silently failed).
* **Repo housekeeping:** `BookingForm.tsx.backup` removed (71 KB orphan file).

= 3.0.4 =
* **Unicode / Cyrillic slugs (end-to-end):** `SlugHelper::generate()` now rawurldecodes percent-encoded UTF-8 and uses `mb_strtolower` with a Unicode-aware regex (`\pL\pN`), so Cyrillic / CJK trip, destination, activity, and category slugs round-trip cleanly through validators and pretty-permalink routing. `ActivityValidator`, `DestinationValidator`, and `TripValidator` now route raw user input through `SlugHelper` instead of `sanitize_title` (which stripped non-ASCII characters down to a single dash). `PrettyRouteMatcher` decodes captured slugs the same way before lookup, so a URL like `/trip/токио/` resolves correctly.
* **Pricing — single source of truth:** `create_booking` now uses `CalculationService::calculateFromSession` as its primary path, so the sidebar pricing summary, the AJAX summary refresh, and the actual amount sent to the payment gateway are all driven by the same code. The calculation result exposes `unit_price_before_dp`, `dp_total_adjustment`, `category_prices_post_dp`, and a `dynamic_pricing` breakdown so templates can render a clean "Trip Pricing → Services → Itinerary → Dynamic Pricing → Discount" stack with no double-counting and no sidebar/payment drift.
* **Pricing summary — UI cleanup:** services render as compact rows above Trip Subtotal (matching the traveler-row style instead of a separate card), Dynamic Pricing renders as one consolidated line (no "1 rule applied" caption), and service descriptions surface via a CSS `data-tooltip` hover (no native `title` attribute, no info-icon clutter). The duplicate-traveler bug (1 selected showing as 2) is fixed in `formDataToObject`'s handling of `name[]` array notation.
* **Coupon UI persistence:** `remove_coupon` now writes back via `yatra_set_booking_session()` so the transient stays in sync, and the applied-coupon row's visible state is server-rendered on first paint — the Remove button is now visible after a page refresh.
* **Session management:** `yatra_set_booking_session()` writes to both `$_SESSION` and a transient keyed by a `booking_token` in the URL, and `yatra_get_booking_session()` falls back to the transient when REST endpoints arrive without `PHPSESSID`. Service toggles, summary refresh, coupon apply / remove, and create-booking all resolve the same cart regardless of how the request authenticated.
* **Mobile sticky bar:** the sticky-bottom booking widget's flatpickr / traveler-sync JavaScript is extracted into `assets/js/single-trip-sidebar.js` so it can no longer be mangled by WordPress's `convert_chars` content filter (which previously rewrote `&&` operators inside inline scripts as `&#038;&#038;` and broke the bar on some themes).
* **FSE / block-theme support:** new `Yatra\Core\Template\FseTemplates` + `Yatra\Core\Routing\PageContext` provide a proper handoff between page handlers and the renderer so single-trip, booking, account, and confirmation pages render correctly inside the FSE template canvas.
* **Custom trip tab:** new `templates/partials/single-trip/content-custom.php` lets an admin-defined "Custom" frontend tab render through the same `yatra_render_tab_icon()` pipeline as the built-in tabs.
* **Pro toggle scaffolding:** Settings → Booking now has **"Show available dates as a dropdown"** with a PRO badge. The setting key (`date_picker_as_dropdown`) and free-side filter contract (`yatra_use_date_dropdown`, `yatra_single_trip_date_dropdown_options`) live in the free plugin; the actual behavior (gate, option-builder, flexible-trip date synthesis) is contributed by the corresponding Yatra Pro module.
* **i18n / Loco Translate:** `Bootstrap::loadTextDomain()` now installs a `load_script_translation_file` filter that falls back to `WP_LANG_DIR/loco/plugins/` for `.json` script-translation files. This mirrors the existing `.mo` fallback so React surfaces (account page, admin app, blocks) pick up Loco-managed translations from Loco's standard private workspace.
* **CI / DevOps:** the PHP-lint pipeline's silent-failure bug (subshell counter in `find | while`) is fixed; `xargs -0 -P 4 php -l` now aggregates failures correctly. Added `concurrency`, least-privilege `permissions: contents: read`, and `timeout-minutes` to every job; `composer validate --strict` moved before `composer install`; debug noise and the inline AI-report preamble removed from `$GITHUB_STEP_SUMMARY`.
* Safe to update from 3.0.3.

= 3.0.3 =
* **Shortcodes:** **`[yatra_trip_category]`** — lists trip categories in the same card layout as destinations, with optional filters, pagination (`trip_category_page`), and AJAX-friendly behavior (see `TripCategoryShortcode` + `TripCategoryShortcodeAjax`).
* **Shortcodes / blocks (`[yatra_trip]`, Trip block):** **Featured Priority** filter (`featured_priority` = `featured` / `new` / `limited`; mirrors the trip form's *Categorization → Featured Priority*) and **Difficulty / fitness-level** filter (`difficulty="3,5"`) are now first-class attributes. Legacy `featured="1"` is retained as a back-compat alias for `featured_priority="featured"` (`featured_priority` wins if both are set). Centralised in `TripListingFilterBuilder` so the same rules apply to both shortcode and block inputs.
* **Trip block:** retired the legacy *Show only featured trips* toggle in favor of the unified **Featured Priority** dropdown; existing block instances saved with `featured: true` are auto-migrated to `featured_priority: "featured"` when reopened in the editor. Inserter title and labels read **Trip** (registered block name `yatra/tour` is preserved for back-compat with saved posts).
* **Cards (Destination / Activity / Trip Category — shortcodes + blocks):** the whole card is now a click target instead of just the title text. Implemented via the WAI-ARIA "stretched link" pattern (CSS pseudo-element on the existing title `<a>`) so a single canonical link is exposed to screen readers and crawlers; keyboard focus shows a card-wide outline.
* **Enquiry emails:** `{{trip_name}}` (and other trip merge tags) now resolve correctly when an enquiry is submitted from a single-trip page. The modal posts `trip_id` / `trip_slug` reliably; backend normalizes `tripId` casing and derives `trip_id` from slug or `HTTP_REFERER` when missing; `EnquiryService` now eager-loads joined trip data before firing `yatra_enquiry_created` so admin templates and Pro automation receive a complete object. Merge-tag regex now tolerates surrounding whitespace (`{{ trip_name }}`).
* **Payments admin (Add / Edit Payment):** the *Booking ID* text field is replaced with a searchable **booking picker** that queries `GET /yatra/v1/bookings?search=…` and matches against booking code (reference), customer name, and email — debounced server-side search with rich rows (code, customer, trip, email). The *Payment Date* field now uses the shared admin `DatePicker` for visual parity with every other date field in the admin and prevents future-dated payments by default.
* **Upgrades:** version-gated Free upgrade runner; legacy payment tokens table dropped when applicable (see `Upgrade_3_0_3`).
* **Discounts:** REST and repository hardening (writable column whitelist; safer updates).
* **Single trip:** group discount discoverability in the sidebar; **Similar trips** links respect plain permalinks via `yatra_get_trip_permalink()`; enquiry modal **Send Enquiry** uses `yatra-booking-button` so primary color matches **Check Availability** and global `--yatra-primary` tokens.
* **Admin / i18n:** Trip Builder meal plan strings use shared labels; attribute icon picker preserves Font Awesome `provider` after save; front-end Important Info shows translated meal plan labels (`yatra_meal_plan_label()`).
* Safe to update from 3.0.2.x.

= 3.0.2.9 =
* **Mobile booking bar:** Improved sticky booking UI on small screens (date + travelers layout, full-width travelers dropdown opening upward, and reliable click targets).
* **Admin caching:** Fixed service cache invalidation so updates (including SEO fields) reflect immediately when cache is enabled.
* Safe to update from 3.0.2.8.

= 3.0.2.8 =
* **Booking UI:** Added Advanced settings to select **Terms & Conditions** and **Privacy Policy** pages; booking form now links to these pages (Privacy falls back to WordPress Settings → Privacy when unset).
* **Fix (Usage Tracking):** Moved `StatsUsage` into `app/Services` and updated references to avoid case-sensitive autoload issues on Linux hosts.
* **Fix (Gallery Modal):** Hardened gallery modal image URL resolution against LiteSpeed Cache lazy-load placeholders.
* Safe to update from 3.0.2.7.

= 3.0.2.7 =
* **Fix (Gallery Modal):** Improved compatibility with LiteSpeed Cache lazy-load placeholders (base64 `src`) so the modal always opens the real image URLs.
* **Compat (LiteSpeed Cache):** Excluded Yatra hero/gallery selectors from LiteSpeed lazy-load and excluded Yatra trip assets from optimisation where needed.
* Safe to update from 3.0.2.6.

= 3.0.2.6 =
* **Fix:** Composer autoload path was declared as `includes/Admin/` (uppercase) but the directory on disk is `includes/admin/` (lowercase); caused fatal `include` warnings on Linux/cPanel servers (case-sensitive filesystems).
* **License:** Removed stub `LicenseController` from the free plugin — all `/yatra/v1/license/*` routes are now registered exclusively by Yatra Pro's own controller, eliminating any route conflicts.
* **Admin UI (Additional Services):** Added missing **Add New Service** button via the `PageHeader` component on the Additional Services screen.
* Safe to update from 3.0.2.5.

= 3.0.2.5 =
* Admin: add Review + Upgrade notices (React UI + WordPress notices) with smart dismiss scheduling.
* Setup wizard: save step settings when navigating between steps.

= 3.0.2.4 =
* **REST:** implemented **`TripService::permanentDelete()`** so **`DELETE /yatra/v1/trips/{id}/permanent-delete`** no longer fatals (fixes permanent delete from trash and bulk actions).
* **Admin (React):** bulk trip actions rely on **`BulkActionToolbar`** confirmation only (removed duplicate **`window.confirm`**); improved bulk dialog copy for **`mark_*`** actions.
* Safe to update from 3.0.2.3.

= 3.0.2.3 =
* **Admin (React):** moved fullscreen shell CSS into the document **head** to reduce wp-admin chrome flicker; added HTML/CSS **boot splash** and **`modulepreload`** for the admin bundle; primary **sidebar navigation** uses client-side URL updates so the PHP loading state does not repeat on every screen change.
* **REST:** registered **License** routes in the API registry so **`GET /yatra/v1/license`** works on the free plugin (License screen and scripts that probe it).
* **Admin UI:** hardened **Departures** and **Availability** trip dropdowns against **TanStack Query** cache shapes and `/trips` list payloads (fixes `map` / `find` errors when navigating without a full reload).
* Safe to update from 3.0.2.2.

= 3.0.2.2 =
* Maintenance / patch release. Safe to update from 3.0.2.1.

= 3.0.2.1 =
* **Readme (WordPress.org):** linked **Pro** gateways, modules, traveler features, and related mentions to **[wpyatra.com/pricing](https://wpyatra.com/pricing/)** throughout the long description, FAQ, and quick links.
* Patch release; safe to update from 3.0.2.

= 3.0.2 =
* **Readme (WordPress.org):** reorganized the long description — the **Yatra Pro** section now appears **before** **Blocks and shortcodes** for a clearer Free → Pro → integration flow.
* Documentation-only release for the plugin directory listing; no code changes required for existing 3.0.x sites.

= 3.0.1 =
* Maintenance release: updated WordPress.org **banner** and directory **assets** (including screenshots) for the 3.x listing.
* **Readme:** shortened the plugin short description to meet WordPress.org's **150-character** limit so imports are no longer truncated.
* Minor fixes and polish; see [wpyatra.com](https://wpyatra.com/) for release notes.

= 3.0.0 =
* Major 3.0 release: redesigned admin experience, streamlined booking and traveler account flows, expanded gateway and module architecture for Pro, and ongoing hardening for production travel sites.
* See the plugin's release notes and [wpyatra.com](https://wpyatra.com/yatra-3-0/) for highlights. **Always back up** before upgrading from 2.x; follow migration guidance in documentation.

= Earlier versions =
* For 2.x changelog entries, see the plugin's GitHub releases or historical notes on the vendor site.

== Upgrade Notice ==

= 3.0.4 =
Release **3.0.4** — Unicode / Cyrillic slug support end-to-end, pricing single-source-of-truth (sidebar = payment-gateway amount), pricing summary cleanup, services dedupe fix, Loco script-translation fallback so React surfaces (account page, admin) pick up `.json` translations from Loco's workspace, mobile sticky-bar JS extraction, FSE template support, and CI pipeline fixes. Safe to update from 3.0.3.

= 3.0.3 =
Release **3.0.3** (`[yatra_trip_category]` shortcode, versioned upgrades, discounts, single-trip and admin polish). Safe to update from 3.0.2.x.

= 3.0.2.5 =
Maintenance release (setup wizard autosave, admin notices). Safe to update from 3.0.2.4.

= 3.0.2.4 =
Bugfix release (trip permanent-delete REST endpoint, bulk trip confirmation UX). Safe to update from 3.0.2.3.

= 3.0.2.3 =
Maintenance update (admin UX, REST license route, trip list stability in Departures/Availability). Safe to update from 3.0.2.2.

= 3.0.2.2 =
Patch release. Safe to update from 3.0.2.1.

= 3.0.2.1 =
Readme update (Pro feature links to pricing). Safe to update from 3.0.2.

= 3.0.2 =
Readme / documentation listing update only. Safe to update from 3.0.1.

= 3.0.1 =
Maintenance update (banner, WordPress.org readme/assets, and small fixes). Safe to update from 3.0.0.

= 3.0.0 =
Major release. Back up your site and database before upgrading from 2.x. Update free Yatra from WordPress.org first; then align **[Yatra Pro](https://wpyatra.com/pricing/)** with a version compatible with 3.0.

== Additional Information ==

= Privacy =

Booking and customer data are stored in your WordPress database. Payment processing is performed by the gateways you enable; review each provider's privacy and PCI documentation. Yatra does not ship customer data to an external SaaS.

= Credits =

Yatra is developed by **MantraBrain**. Third-party libraries include components such as React (admin UI), Vite, TanStack Query, and others as shipped in the plugin package.

= Contributing =

Issues and contributions: [GitHub — Yatra](https://github.com/MantraBrain/yatra)

If Yatra helps your business, a ⭐ **five-star review** on WordPress.org and considering **💎 [Yatra Pro](https://wpyatra.com/pricing/)** when you need paid features both help sustain development. Thank you for using Yatra.
