Skip to content

Settings overview

Yatra Settings landing page — left tab list and General section open

The Settings screen at Yatra → Settings is one screen with 15 tabs in a left-hand sidebar (Pricing only appears when its Pro modules are active). This page tells you what each tab is for, lists every control inside it, and points at the deeper docs (Bookings, Payments, Email) when there's a dedicated guide.

Where Yatra stores settings

Each control writes to its own row in the WordPress wp_options table — for example, the Default currency dropdown writes to the yatra_currency option. Developers can read or override these programmatically — see the Reading settings programmatically section at the bottom of this page.

The 15 tabs

#TabWhat it controlsPro-only fields?
1GeneralCompany identity, address, regional formattingNo
2DesignFront-end brand colour and container widthNo
3BookingCheckout behaviour, expiry, cancellation, waitlistNo
4Booking FormDrag-and-drop builder for the checkout formNo (Pro extends per-trip)
5PaymentTest mode, deposits, partial / scheduled paymentsSome (deposit / scheduled = Pro)
6PricingDiscount stacking — how Advanced Discount and Dynamic Pricing combinePro-conditional (visible when both modules are on)
7CustomerAccount behaviour, registration, wishlistWishlist = Pro
8ReviewReview system toggles & moderationNo
9TaxTax rates, inclusive pricing, VAT numberNo
10CurrencyCurrency code, position, separators, decimalsNo
11IntegrationMailchimp, Facebook Pixel, GA4, Google Calendar, reCAPTCHAAll Pro-conditional
12PermalinkURL slugs for trips, destinations, activities, categoriesNo
13SEOMeta tags for the trip archiveNo
14AdvancedLogging, cache, legal pages, telemetryNo
15Search & ListingWhich trip search-bar fields show; collapse listing filters on mobile (sits between Booking Form and Payment in the admin)No

How to use this page

  • Looking for what a control does → find the tab heading and scan the table.
  • Looking for a setting key in code → the Setting key column is the wp_options row name (always prefixed yatra_<key> in the database; the schema uses the unprefixed name).
  • Looking for deep guidance on a specific area → the Bookings, Payments, and Email pages cover the matching admin modules in full.

Permissions

Saving settings requires the WordPress manage_options capability. The REST endpoint behind the page (POST /yatra/v1/settings) checks this on every write. See REST API → Settings for the full surface.


1. General

General settings tab — company information, regional formatting

Company identity, full address, website, and regional formatting.

Company Information

ControlSetting keyDefaultNotes
Company Namecompany_name(empty)Required-flagged in UI. Used in invoices, vouchers, and email "From" name.
Company Emailcompany_email(empty)Required-flagged in UI. Falls back to the WordPress admin email when blank.
Company Phonecompany_phone(empty)Surfaced on PDFs.
Company Addresscompany_address(empty)Street address line.
Citycompany_city(empty)Shown on invoices below the street.
State / Provincecompany_state(empty)Shown on invoices.
Countrycompany_country(empty)Free-text country name.
ZIP / Postal Codecompany_zip(empty)Shown on invoices.
Websitecompany_website(empty)URL. Linked from the company name on receipts.

Regional Formatting

ControlSetting keyDefaultNotes
TimezonetimezoneUTCSearchable dropdown of all WP-supported time zones. Affects how booking and travel dates are stored / displayed.
Date Formatdate_formatY-m-dDropdown with many PHP date-format presets. Affects all admin and customer views.
Time Formattime_formatH:iTwo options: H:i (24-hour) or h:i A (12-hour).

2. Design

Design settings tab — primary brand color picker and container max width

Front-end appearance — what your customers see on trip and booking pages.

ControlSetting keyDefaultNotes
Primary brand colorfrontend_primary_color#3b82f6Hex value with a color-picker and a paired text input. Reset to default button restores #3b82f6. Drives buttons, links, and highlights via CSS variables.
Container max widthfrontend_container_max_width(empty)Optional CSS length (1200px, 72rem, min(100%,80rem)). Empty = inherit your block theme theme.json / theme content width.

3. Booking

Booking settings tab — checkout behaviour, expiry, cancellation, waitlist controls

Day-to-day checkout behaviour. For the full operator guide, see Bookings & customers.

ControlSetting keyDefaultNotes
Enable Booking Confirmationbooking_confirmationtrueWhether to send the confirmation email after status change to Confirmed.
Auto-Confirm Bookingsauto_confirm_bookingsfalseSkip the Pending state — useful for instant-confirmation activities.
Require Login for Bookingrequire_loginfalseForces login at the start of checkout.
Allow Guest Checkoutallow_guest_checkouttrueIf off, customers must log in before they can complete checkout.
Allow Waitlistallow_waitlisttrueShow the Join waitlist CTA when a departure is sold out.
Waitlist Auto-Confirmwaitlist_auto_confirmfalseAuto-promote waitlisted bookings when capacity opens up.
Cancellation Policycancellation_policyfull_refundOne of no_refund, partial_refund, full_refund. Surfaces on confirmation.
Cancellation Days Before Departurecancellation_days7Days before travel after which a customer cannot self-cancel.
Refund Policyrefund_policy(empty)Free-text shown on the booking summary page.
Booking Expiry (hours)booking_expiry_hours24A booking left in Pending longer than this is auto-cancelled by the cron.
Booking Reminder (days)booking_reminder_days3How many days before travel to send the reminder email.

Where's the booking page picker?

The booking flow lives at /{booking_base}/{trip-slug}/ by default (configured on the Permalink tab). There's no "embed the booking app inside a WordPress page" toggle in this build — earlier versions of the doc mentioned use_booking_page and booking_page_id, but the source no longer exposes that setting.

4. Booking Form

Booking Form builder tab — drag-and-drop fields with type, width, and required toggles

This tab renders the Booking Form Builder component — a drag-and-drop builder for the three sections of the public checkout: Lead Traveler / Contact Information, Emergency Contact, and Per-Traveler.

  • The entire configuration is stored as one JSON blob under the booking_form_config option.
  • Defaults live in SettingsService::getDefaultBookingFormConfig() — the lead-traveler first_name, last_name, email, phone, and country fields are locked: you can hide them but cannot remove them.
  • Field types supported: text, email, tel, date, select (with options), country, textarea, number, checkbox, and Text Block (display-only — see below).
  • Per-field width: full, half, third — controls how many fields sit on a row.
  • Each field has a Required toggle, Label text, Placeholder, and (for select) an Options repeater.
  • Each section has its own on/off toggle. Turning a whole section off hides every field in it (including locked ones) from the checkout — see Turning sections on or off below.

Custom fields per trip

For per-trip overrides (e.g. a "Dietary requirements" question only on Food Tours), enable the Pro Dynamic Form Field module — it adds a Custom fields tab on each trip's edit screen. See Modules.

Text Block (display-only content)

Use a Text Block field to show read-only text between fields — booking instructions, a short policy note, a "Travellers" divider, a deposit reminder, etc. It is not an input: customers can't type in it, it's never required, it collects and stores nothing, and it never appears in emails as a value.

  • Add it like any field, then drag it to sit between whichever fields you want.
  • You only fill in Content and a Width — there's no label, field ID, placeholder, or Required toggle.
  • Basic HTML is allowed in the content (bold, links, lists); plain text gets paragraph spacing automatically.
  • It can go in any section (Contact, Emergency, or Per-Traveler). Placed in the Per-Traveler section it repeats once per traveler — handy for a per-traveller note, but keep that in mind.

Turning sections on or off

Each of the three sections — Contact, Emergency, Per-Traveler — can be switched off entirely. Existing/un-customised sites have all three on, so nothing changes unless you turn one off.

A booking always needs an email — don't strand checkout

An email address is always required to complete a booking (it's used for the confirmation email, the customer account, and the voucher). The lead-traveler Email field lives in the Contact section and is locked — but you can still switch the whole Contact section off, which hides that email field too.

When the Contact section is off, Yatra recovers the email from the Per-Traveler form: it uses the first traveller that has a valid email and treats that traveller as the booking's contact (adopting their name and phone as well).

So if you turn the Contact section off, first add an email-type field to the Per-Traveler form. The default Per-Traveler form has no email field — if neither the Contact section nor the Per-Traveler form collects an email, no customer can check out (every attempt is rejected with "A valid email address is required to complete this booking").

The builder shows a banner when no section is set to collect an email — heed it. (The Emergency section never captures the booking email.)

5. Payment

Payment settings tab — test mode, partial payments, deposits, scheduled balance, gateway list

Test-mode, payment-flow toggles, and deposit / scheduled-payment behaviour. For per-gateway setup and the Payments admin page, see Payments.

Global

ControlSetting keyDefaultNotes
Test Modepayment_test_modetrueMaster test-mode switch — applied to every gateway. Turn off when you go live.
Auto-Confirm Pay Later Bookingsauto_confirm_pay_laterfalseConfirm "Pay Later" bookings immediately instead of leaving them in Pending.

Partial Payments PRO

ControlSetting keyDefaultNotes
Enable Partial Paymentpartial_paymentfalseCustomer pays a percentage at booking; rest collected later.
Partial Payment Percentagepartial_payment_percentage50Shown only when Enable Partial Payment is on.

Deposit PRO

ControlSetting keyDefaultNotes
Require Depositdeposit_requiredfalseForce a deposit at booking time.
Deposit Percentagedeposit_percentage25Shown only when Require Deposit is on. Percentage of the trip price taken upfront.

Scheduled Payments PRO

ControlSetting keyDefaultNotes
Enable scheduled balance paymentsenable_scheduled_paymentsfalseMaster toggle for auto-charging the remaining balance on a future date.
Schedule typescheduled_payment_typesinglesingle (one balance charge) or installments.
Days until first chargescheduled_payment_days7How many days after booking to attempt the first charge.
Number of installmentsscheduled_payment_installments3Shown only when type = installments.
Days between installmentsscheduled_payment_interval30Shown only when type = installments.
Payment reminder (days before)scheduled_payment_reminder_days3Reminder email this many days before the charge attempt.

Gateways

The list of available gateways (PayPal, Pay Later — free; Stripe, Razorpay, Mollie, Paystack, Square, Authorize.Net, Bank Transfer — Pro) is rendered as a row of cards lower on the tab. Each card has an Enable toggle and a Settings button that expands the gateway's credentials form. Full per-gateway details: Payments.

Server-authoritative amounts (3.0.4+)

The POST /payment/create-intent endpoint ignores any client-supplied amount and recomputes from the booking row when a booking_id is provided. See Payments → security model.

6. Pricing PRO

Controls how the Advanced Discount module (group + coupon discounts) and the Dynamic Pricing module combine when both can fire on the same booking.

Conditional tab

This tab is only rendered when both the Advanced Discount module and the Dynamic Pricing module are enabled under Yatra → Modules. On installs that have only one (or neither) of those Pro modules on, the Pricing tab is hidden — the underlying setting still exists in wp_options but has no effect.

When the tab is visible, a status banner at the top reports the current state ("Active" — both modules enabled, your choice is being applied to every new booking) or which module(s) still need to be enabled before the choice takes effect.

Discount Stacking

ControlSetting keyDefaultNotes
Discount Stackingdiscount_stacking_modebothOne of four modes (below). Backend silently coerces any other value to both so a malformed POST can't change pricing behaviour.

The four modes:

ModeValueBehaviour
Both apply (default — legacy stacking)bothDynamic Pricing and the discount both apply against the trip's catalog price; the customer gets the larger combined saving. Matches the math every existing site uses today.
Best for the customerbest_for_customerCalculates the booking total under "DP-only" and "discount-only" scenarios, then picks the cheaper for the customer. Never combines.
Discount onlydiscount_onlyWhen a coupon or group discount is valid for the booking, Dynamic Pricing is skipped — the discount applies against the un-adjusted catalog price.
Dynamic Pricing onlydynamic_pricing_onlyWhen a Dynamic Pricing rule reduced the trip price, any coupon / group discount is ignored for that booking.

Default preserves legacy behaviour

After upgrading to a build that ships this setting, every site stays on Both apply (both). That's the math your sidebar already uses today: catalog price × Dynamic Pricing → customer-shown per-unit price; group / coupon discount % calculated against the original catalog base. Nothing changes until an operator explicitly switches modes.

How to choose a mode

  • You're not sure / you don't want anything to change — leave it on Both apply. Same bottom-line math as before this setting existed.
  • You want a single, easy-to-explain discount on the displayed price — pick Discount only. The customer sees the catalog price, the discount comes off that, and Dynamic Pricing operates as an internal pricing lever you don't need to expose.
  • You only use Dynamic Pricing for occasional flash sales — pick Dynamic Pricing only. Coupon codes still work in normal periods; during a DP-driven sale they're blocked so customers can't double-dip.
  • You want the strict customer-friendliest single discount — pick Best for the customer. Yatra computes both alternatives and silently uses whichever produces the lower total.

See Advanced Discount → How Dynamic Pricing and discounts combine for the fully-worked example showing the exact line-by-line numbers each mode produces.

7. Customer

Customer settings tab — registration, account page, wishlist, email verification

Account behaviour on the customer-facing site.

ControlSetting keyDefaultNotes
Enable Customer Registrationcustomer_registrationtrueIf off, only WP-admin-created accounts can log in.
Customer Account Pagecustomer_account_page(empty)URL path segment for the account area (e.g. my-account). A View Page button next to the field opens the page on the front-end.
Enable wishlist (saved trips)enable_wishlistfalsePro-only field. The control is only rendered when Pro is active (window.yatraAdmin.isPro === true). Without Pro, a "Saved Trips — Pro feature" call-out appears in its place.
Require Email Verificationrequire_email_verificationfalseCustomers must click the verification link before account activation.

8. Review

Review settings tab — enable reviews, require booking, moderation, minimum rating, reminder days

Trip-review form behaviour.

ControlSetting keyDefaultNotes
Enable Reviewsenable_reviewstrueMaster toggle for the entire review system.
Require Booking to Reviewrequire_bookingfalseWhen on, only customers with a confirmed booking can leave a review.
Auto-Approve Reviewsauto_approve_reviewsfalseSkip moderation queue.
Enable Review Moderationreview_moderationtrueReviews go to a Pending queue (visible at Yatra → Reviews).
Minimum Ratingmin_rating1Lowest star value the form accepts (1–5).
Review Reminder Daysreview_reminder_days7Days after trip completion to email the Leave a review link.

9. Tax

Tax settings tab — multiple-taxes editor, inclusive pricing, VAT number

ControlSetting keyDefaultNotes
Enable Taxenable_taxfalseMaster toggle. The remaining controls only appear when this is on.
Taxesmultiple_taxes[]Custom repeater (the Multiple Taxes Editor component) of { name, rate } rows — e.g. { name: "VAT", rate: 20 }. Live total shown below the editor.
Tax Inclusive Pricingtax_inclusivefalseWhen on, prices are displayed with tax already included.
VAT Numbervat_number(empty)Your tax ID; appears on invoices.

Per-country tax (advanced)

The schema supports per-country tax bands (multiple_taxes_by_country) for site owners that need it. There's no UI yet — set the value via the REST API or a custom plugin if you need it today.

10. Currency

Currency settings tab — default currency, position, separators, decimal places

Display formatting for monetary values across the site.

ControlSetting keyDefaultNotes
Default CurrencycurrencyUSDSearchable dropdown of all ISO currency codes. Base for all transactions.
Currency Positioncurrency_positionleftleft, right, left_space, right_space. Each option shows a live preview in the dropdown.
Thousand Separatorthousand_separator,Single character.
Decimal Separatordecimal_separator.Single character.
Decimal Placescurrency_decimals20–4. Most fiat = 2; 0 for JPY / KRW.

Multi-currency switching

Per-trip currency overrides and a customer-facing currency switcher are provided by Pro modules. The free schema stores only a single base currency.

11. Integration

Integration settings tab — third-party module config populated by active Pro modules

Configuration for built-in third-party integrations. Most blocks only appear when the matching Pro module is active (see Modules for the toggles).

Google Calendar PRO

Renders conditionally when the Google Calendar module is enabled. Exposes OAuth credentials, target calendar ID, and sync direction. See Modules → Google Calendar.

Mailchimp PRO

ControlSetting keyNotes
Mailchimp API Keymailchimp_api_keyPassword-style input. Tested with a Verify button.
Audience / Listmailchimp_list_idDropdown populated after a successful API-key verification.
Sync customers on bookingmailchimp_sync_on_bookingPush booking customers as Mailchimp contacts.
Double opt-inmailchimp_double_optinSend a confirmation email before adding to the list.
Field mappingmailchimp_field_mappingDynamic key/value mapping of Yatra fields → Mailchimp merge tags.
Add tagsmailchimp_add_tagsTag synced contacts.
Default tagsmailchimp_default_tagsComma-separated tag list applied to every synced contact.

Facebook Pixel PRO

ControlSetting keyNotes
Pixel IDfacebook_pixel_idYour Meta Pixel ID.
Track ViewContentfb_track_view_contentPer-event toggle.
Track InitiateCheckoutfb_track_initiate_checkoutPer-event toggle.
Track Purchasefb_track_purchasePer-event toggle.
Use Conversions APIfb_use_conversions_apiServer-side event posting in addition to the browser pixel.
Conversions API access tokenfacebook_access_tokenPassword-style input. Shown only when Use Conversions API is on.

Google Analytics 4 Enhanced PRO

ControlSetting keyNotes
Measurement IDga4_measurement_ide.g. G-XXXXXXXX.
Track view_itemga4_track_view_itemPer-event toggle.
Track add_to_cartga4_track_add_to_cartPer-event toggle.
Track begin_checkoutga4_track_begin_checkoutPer-event toggle.
Track purchasega4_track_purchasePer-event toggle.
Use Measurement Protocolga4_use_measurement_protocolServer-side event posting in addition to the browser tag.
Debug modega4_debug_modeEnables GA4 DebugView.
API secretga4_api_secretPassword-style input. Shown only when Measurement Protocol is on.

reCAPTCHA

ControlSetting keyNotes
Enable reCAPTCHArecaptcha_enabledAdds Google reCAPTCHA v3 to the public checkout / enquiry forms.
Site Keyrecaptcha_site_keyFrom Google reCAPTCHA admin.
Secret Keyrecaptcha_secret_keyPassword-style input.

For a full list of integrations and their setup guides, see Pro modules overview.

Permalink settings tab — URL slugs for trips, destinations, activities, categories with live preview

URL slugs for Yatra's content types. Changing any of these requires a rewrite-rule flush — Yatra triggers it automatically on save, but if you ever see 404s, visit Settings → Permalinks in WP-admin and click Save to force a flush.

ControlSetting keyDefaultResulting URL example
Trip Basetrip_basetrip/trip/everest-base-camp
Booking Basebooking_basebook/book/everest-base-camp, /book/confirmation/
Destination Basedestination_basedestination/destination/nepal
Activity Baseactivity_baseactivity/activity/trekking
Trip Category Basetrip_category_basetrip-category/trip-category/adventure

Live preview

Each input shows the resulting public URL beneath it, with a View link so you can verify the page renders before navigating away.

The whole permalink set passes through the yatra_permalink_bases filter — useful if you're enforcing localised slugs from a custom plugin. See Hooks & filters → Front-end routing.

Customer account URL lives elsewhere

The slug for the customer-account area is configured under Customer → Customer Account Page as customer_account_pagenot on this tab. Older revisions of this page listed an account_base here; the source doesn't expose that field.

12. SEO

SEO settings tab — meta title, description, keywords, and image picker for the trip archive

Meta tags for the trip archive page (/{trip_base}/).

ControlSetting keyNotes
Trip Archive Meta Titleseo_trip_meta_titleAppears in <title> and search-result links for the trip archive.
Trip Archive Meta Descriptionseo_trip_meta_description150–160 characters recommended.
Trip Archive Meta Keywordsseo_trip_meta_keywordsComma-separated. Most search engines ignore this; included for completeness.
Trip Archive SEO Imageseo_trip_meta_imageStores the WP attachment ID. Recommended 1200×630 for OG / Twitter. Selector uses the WP media library.

If you use Yoast / RankMath / SEOPress

Those plugins emit their own <title> and meta tags for the archive page and override Yatra's. Use Yatra's SEO tab only if no SEO plugin is active.

13. Advanced

Advanced settings tab — logging, debug mode, cache toggle, legal pages, telemetry opt-in

Diagnostics, caching, legal-page wiring, and telemetry.

Logging & debug

ControlSetting keyDefaultNotes
Enable Loggingenable_loggingfalseWrites Yatra-specific events to the system logs (visible in Yatra → Tools → Logs).
Debug Modedebug_modefalsePlugin-side diagnostics. Bypasses the Yatra object cache while on (same effect as WP_DEBUG=true).
Enable Cachecache_enabledtrueYatra's internal cache layer. Auto-disabled while Debug mode or WP_DEBUG is on.
ControlSetting keyNotes
Terms & Conditions pageterms_page_idDropdown of published WP pages. Linked from the I agree to terms checkbox in checkout.
Privacy Policy pageprivacy_policy_page_idLinked from the privacy-consent checkbox. Falls back to the WP Settings → Privacy page when blank.

Telemetry (opt-in)

The Help us improve Yatra section enables anonymous usage tracking via the yatra_usage_tracking_enabled option. What gets collected is documented at wpyatra.com/what-we-collect/. It is off by default — switch it on to help the team prioritise features.

The endpoint behind it is POST /yatra/v1/usage-tracking.


Search & Listing

Controls the storefront trip search bar (the [yatra_search] form) and the filter sidebar on the trip listing page. In the admin this tab sits between Booking Form and Payment. Every option here defaults to the previous behaviour, so existing sites are unchanged until you opt in.

Search bar fields

Turn individual fields of the search bar on or off for a cleaner search. All default to shown.

ControlSetting keyDefaultNotes
Keyword searchsearch_show_keywordtrueFree-text "trip name or keyword" field.
Destinationsearch_show_destinationtrueDestination dropdown.
Activitiessearch_show_activitiestrueActivity dropdown.
Durationsearch_show_durationtrueTrip-length range slider.
Budgetsearch_show_budgettruePrice-range dropdown.

Hiding a field only removes it from the bar — searching by that criterion via a URL parameter still works.

Mobile filters

ControlSetting keyDefaultNotes
Collapse filters by default on mobilecollapse_filters_on_mobilefalseOn screens ≤768px, the listing filter sections start collapsed so trip cards are visible immediately; visitors tap a section to expand it. Desktop is unaffected. Off by default, so existing sites keep today's expanded layout until you enable it.

Reading settings programmatically

Every saved value is one WP option. You can read them anywhere with the SettingsService facade:

php
use Yatra\Services\SettingsService;

// Generic getters (return the schema default if the option is unset)
$currency      = SettingsService::getCurrency();
$timezone      = SettingsService::getString( 'timezone', 'UTC' );
$expiryHours   = SettingsService::getInt( 'booking_expiry_hours', 24 );
$reviewsOn     = SettingsService::isEnabled( 'enable_reviews' );

// Or fetch everything (for export / debugging)
$all = SettingsService::all();

// Force-reload from the database after an update_option() call
SettingsService::reload();

Or via REST (admin auth required):

bash
curl -u "user:application-password" \
     https://example.com/wp-json/yatra/v1/settings
bash
curl -u "user:application-password" \
     -H "Content-Type: application/json" \
     -d '{"settings":{"booking_expiry_hours":48}}' \
     https://example.com/wp-json/yatra/v1/settings

The REST endpoint also exposes POST /yatra/v1/settings/flush-rewrites (re-flush WP rewrite rules without changing settings) and GET /yatra/v1/settings/pages (list candidate WP pages for the booking / account / TOS dropdowns). See REST API → Settings.

Pro settings (3.0.2+)

Yatra Pro adds its own REST endpoint at POST /yatra/v1/settings (overlaid on top of the free one) for Pro-specific keys. Since 3.0.2 the Pro endpoint whitelists which keys it will write — anything not in the schema is reported back in rejected_keys rather than silently overwriting wp_options.

If you write a custom Pro module that needs to expose a setting via this endpoint, register it via the filter:

php
add_filter( 'yatra_pro_writable_settings_schema', function ( array $schema ): array {
    $schema['my_module_enabled'] = static function ( $value ): bool {
        return (bool) $value;
    };

    $schema['my_module_api_key'] = static function ( $value ): string {
        return sanitize_text_field( (string) $value );
    };

    return $schema;
} );

The map is key => sanitiser-callable; the sanitiser must return the value to persist. See Hooks & filters → Payments for the full hook signature.

Where to go next