Using Local Payments¶
Some of our trips include costs that the traveller pays on the ground, in cash, in the currency of the destination. A national park entrance fee, a transit card, or a mandatory port tax are some examples. G Adventures does not collect these amounts. They are not part of the price you charge your customer, though they are listed on the booking invoice so the traveller knows what to expect on the ground.
We refer to these as Local Payments. Historically, the G API listed them on the departure as a short informational list. Regulations in a growing number of markets now require that any unavoidable charge is included in the headline price a customer sees, rather than being surfaced later in the funnel. The United Kingdom’s ban on drip pricing is one example. To help you meet these requirements, the G API now exposes each local payment as its own resource, and provides an approximate all-in price wherever a departure price is advertised.
In this tutorial, we’ll cover:
What a Local Payment is, and the two types you will encounter
Reading local payments inline on a departure
Fetching the full Local Payment resource
Displaying an all-in price using
approximate_amount_with_local_paymentsOur recommendations for presenting local payments to customers
What Is A Local Payment¶
A Local Payment has a label you can present to the traveller, an
amount, and the currency it is paid in. That currency is the one
typically accepted in the destination, and it is often different from the
currency you sell in.
Every local payment has a price_type, which is one of:
FIXED- The exactamountis known ahead of time. Theminimum_amountandmaximum_amountfields arenull.VARIABLE- The exact amount depends on conditions that are only known on the ground, such as the traveller’s nationality or the size of the group. Theamountfield isnull, and instead theminimum_amountandmaximum_amountfields describe the expected range.
Finally, every local payment carries an included_in_total boolean. When it
is true, the payment is unavoidable and is added into the
approximate_amount_with_local_payments fields described later in this
tutorial. When it is false, the payment is listed for information only and
is left out of that total.
Reading Local Payments On A Departure¶
Local payments vary by departure, so the departure resource is the place to
read them. Fetch the departure and look at the local_payments list:
GET /departures/1387990/ HTTP/1.1
Host: rest.gadventures.com
Accept: application/json
And in the response, snipped for focus:
{
"id": "1387990",
"href": "https://rest.gadventures.com/departures/1387990",
"sku": "GAPSEGL261003-O1",
"local_payments": [
{
"id": "475004",
"href": "https://rest.gadventures.com/local_payments/475004",
"label": "Galapagos Park Fee",
"amount": "200.00",
"minimum_amount": null,
"maximum_amount": null,
"currency": "USD",
"price_type": "FIXED",
"included_in_total": true
},
{
"id": "475005",
"href": "https://rest.gadventures.com/local_payments/475005",
"label": "Transit Control Card",
"amount": "20.00",
"minimum_amount": null,
"maximum_amount": null,
"currency": "USD",
"price_type": "FIXED",
"included_in_total": true
},
{
"id": "475006",
"href": "https://rest.gadventures.com/local_payments/475006",
"label": "Tipping Kitty",
"amount": null,
"minimum_amount": "30.00",
"maximum_amount": "50.00",
"currency": "USD",
"price_type": "VARIABLE",
"included_in_total": false
}
]
}
The inline entries carry everything you need to list local payments on a trip
page. For a FIXED payment, show the amount. For a VARIABLE
payment, show the range described by minimum_amount and
maximum_amount. In both cases, show the currency alongside the value,
since it is the currency the traveller must have on hand.
A departure with no local payments returns an empty list, so you can always iterate over this field without checking for its presence first.
Fetching The Local Payment Resource¶
Each inline entry includes an id and href that point to the full
Local Payment resource. Fetch it when you want
to show the local payment converted into the currency you sell in:
GET /local_payments/475004/ HTTP/1.1
Host: rest.gadventures.com
Accept: application/json
The response, snipped for focus:
{
"id": "475004",
"href": "https://rest.gadventures.com/local_payments/475004",
"label": "Galapagos Park Fee",
"description": null,
"amount": "200.00",
"currency": "USD",
"price_type": "FIXED",
"included_in_total": true,
"minimum_amount": null,
"maximum_amount": null,
"rate_as_of": "2026-07-01",
"sell_currencies": [
{
"amount": "174.00",
"currency": "EUR",
"minimum_amount": null,
"maximum_amount": null
},
{
"amount": "151.00",
"currency": "GBP",
"minimum_amount": null,
"maximum_amount": null
},
{
"amount": "200.00",
"currency": "USD",
"minimum_amount": null,
"maximum_amount": null
}
]
}
Two fields are only available on the full resource:
sell_currencies- The local amount converted into each of the standard Currencies & Prices the G API sells in. Each entry mirrors the shape of the parent, so aVARIABLEpayment reports convertedminimum_amountandmaximum_amountvalues and anullamount.rate_as_of- The date of the exchange rate used to computesell_currencies. Rates are refreshed monthly, so the converted values are a guide for the customer rather than the exact figure they will pay on the ground.
The description field, when present, contains additional context about
the payment that you may present alongside the label.
Displaying An All-In Price¶
Wherever the G API advertises a departure price, it now also provides an
approximate_amount_with_local_payments field next to the existing
amount. This is the amount with every local payment on that departure
whose included_in_total is true converted into the price’s currency
and added on.
The total is approximate for the same reason the sell_currencies above
are. Local payments are paid in the local currency, and the conversion into
the sell currency uses an exchange rate that is refreshed monthly. Any
difference between the converted figure and what the traveller pays on the
ground is not owed to, or collected by, G Adventures.
On The Departure¶
The field appears in every place a departure exposes a price:
rooms[].price_bands[].prices[]- The price of each room and price band in each currency.rooms[].price_bands[].prices[].promotions[]- The promotional price, when a promotion applies.lowest_pp2a_prices[]- The lowest per person, two adult price in each currency, used for listing and calendar views.
Continuing with the departure above, its two FIXED local payments total
220 USD. The VARIABLE one has included_in_total set to false, so
it is left out. The response, snipped for focus:
{
"id": "1387990",
"rooms": [
{
"code": "STANDARD",
"name": "Standard",
"price_bands": [
{
"code": "ADULT",
"name": "Adult",
"prices": [
{
"currency": "EUR",
"amount": "2999.00",
"deposit": "350.00",
"promotions": [],
"approximate_amount_with_local_payments": "3191.00"
},
{
"currency": "USD",
"amount": "3699.00",
"deposit": "350.00",
"promotions": [],
"approximate_amount_with_local_payments": "3919.00"
}
]
}
]
}
],
"lowest_pp2a_prices": [
{
"currency": "USD",
"amount": "3699.00",
"approximate_amount_with_local_payments": "3919.00"
},
{
"currency": "AUD",
"amount": "4949.00",
"approximate_amount_with_local_payments": "5264.00"
}
]
}
Notice that the USD price gains exactly 220.00, while the EUR and AUD prices
gain the converted equivalent. When a departure has no local payments, or
none with included_in_total set to true, the field equals amount.
On The Tour Dossier¶
A tour dossier landing page often advertises a “from” price before a
customer has chosen a departure. The advertised_departures list on the
tour dossier resource carries the same field for exactly this purpose:
GET /tour_dossiers/3_JAHSIP/ HTTP/1.1
Host: rest.gadventures.com
Accept: application/json
The response, snipped for focus:
{
"id": "3_JAHSIP",
"name": "Spirit of India",
"advertised_departures": [
{
"room": null,
"departure": {
"id": "1472857",
"href": "https://rest.gadventures.com/departures/1472857"
},
"previous_amount": "3499.00",
"currency": "GBP",
"amount": "3299.00",
"approximate_amount_with_local_payments": "3299.00",
"promotion": {
"id": "283656",
"href": "https://rest.gadventures.com/promotions/283656",
"name": ""
}
},
{
"room": null,
"departure": {
"id": "1472851",
"href": "https://rest.gadventures.com/departures/1472851"
},
"previous_amount": null,
"currency": "USD",
"amount": "4449.00",
"approximate_amount_with_local_payments": "4449.00",
"promotion": null
}
]
}
Each advertised departure is a specific departure, so the total reflects the
local payments of that departure only. In this example, the tour has no local
payments, and the field equals amount. Follow the departure reference
if you need to list the individual local payments behind the total.
Recommendations For Display¶
Use the all-in price as the headline price. Wherever you show a price
before checkout, be it a tour landing page, a departure calendar, or a search
result, display approximate_amount_with_local_payments as the primary
figure. This is the amount the customer is required to pay in total, and in
some markets it is the only figure you are permitted to advertise. Presenting
the base amount and revealing local payments later in the funnel is the
partitioned pricing pattern that drip pricing regulations prohibit.
Show the breakdown alongside it. The all-in price tells the customer what
the trip costs. The local_payments list tells them how much of that they
must carry in cash, and in which currency. We recommend showing both, with
wording that makes it clear the local portion is paid on the ground and not
to you or to G Adventures.
Label the total as approximate. Because local payments are converted at a rate that is refreshed monthly, the total is a close estimate. A short qualifier such as “approx.” or “includes approximately 220 USD in local payments” is sufficient.
Treat the checkout amount separately. Local payments are not part of
what you collect. The purchase_price and deposit on a
departure service, and the amount_owing on a booking, exclude local
payments. When building a checkout, charge the customer based on those
fields, and continue to display the local payments as an amount to bring with
them. The local payments are also listed on the booking invoice for the
traveller’s reference. See Deposits for the checkout workflow.
Handle variable payments gracefully. For a VARIABLE local payment,
present the range from minimum_amount to maximum_amount rather than a
single figure. If a variable payment has included_in_total set to
true, the all-in price already accounts for it, and the range explains to
the customer why their cash requirement may differ from the estimate.