How to specify fees

The following tutorial describes how to specify fees on Reserve with Google.

Per Ticket/Order fees

Reserve with Google supports per ticket (e.g. service charge, facility fee, taxes) and per order (e.g. processing fees, delivery fees) fees for your inventory. The changes needed to implement fees and taxes are:

  • Services feed
  • CheckOrderFulfillabilityResponse (booking server)
  • CreateOrder

Services feed

Specify PerTicketFee under TicketType and PerOrderFee under Services in the Services feed.

message TicketType {
  ...
  // The price of a single ticket of this type, exclusive of any taxes. The tax
  // rate of Service is applied to its tickets.
  Price price = 3;

  // Additional fees for purchasing this ticket.
  PerTicketFee per_ticket_fee = n;
}

// Fees that must be paid for each ticket the user purchases. These fields
// must add up to the total per ticket fee.
message PerTicketFee {
  // An extra charge assessed for a service.
  Price service_charge = 1;
  // A fee that goes to the venue/facility.
  Price facility_fee = 2;
  // Per ticket taxes.
  Price taxes = 3;
}

// Fees that must be paid once per order, regardless of number of tickets. These
// fields must add up to the total per order fee.
message PerOrderFee {
 // A fee that can vary by delivery method.
 Price delivery_fee = 1;
 // A fee to process the user's payment method.
 Price processing_fee = 2;
}

Services feed snippet

{
  "service": [
    {
      "name": "Beyonce Concert World Tour",
      "merchant_id": "10000001",
      "service_id": "20000001",
      "description": "The Beyoncé World Tour and will feature all the hits from her latest album.",
      "per_order_fee": {
        "delivery_fee": {
           "price_micros": 2000000,
           "currency_code": "USD"
        },
        "processing_fee": {
           "price_micros": 1000000,
           "currency_code": "USD"
        }
      },
      "ticket_type": [
        {
          "short_description": "General Admission",
          "price": {
            "price_micros": 195000000,
            "currency_code": "USD"
          },
          "per_ticket_fee": {
            "service_charge": {
              "price_micros": 2000000,
              "currency_code": "USD"
            },
            "facility_fee": {
              "price_micros": 1000000,
              "currency_code": "USD"
            },
            "taxes": {
              "price_micros": 1000000,
              "currency_code": "USD"
            }
          },
          "ticket_type_id": "1001"
        }
      ],
      "rules": {
        "min_advance_booking": 10800,
        "admission_policy": "TIME_STRICT"
      },
      "prepayment_type": "REQUIRED",
      "require_credit_card": "REQUIRE_CREDIT_CARD_ALWAYS",
      "ticketing_vertical_specific_data": {
        "event_category": "EVENT_CATEGORY_CONCERT",
        "event_url": "www.selltickets.com/event/beyonce/1234",
        "entity": [
          {
            "id": "501",
            "name": "Beyoncé Knowles",
            "url": "www.beyonce.com"
          }
        ],
        "entity_type": "ENTITY_TYPE_CONCERT_TOUR",
        "entity_role": "ENTITY_ROLE_HEADLINER"
      }
    }
  ]
}

CheckOrderFulfillabilityResponse

After ticket selection, the CheckOrderFullfilability call will retrieve the latest fees associated with the order to ensure that the most accurate price and fees are displayed to the user. Our system then places a check to see if the sum of the per ticket and per order fees from CheckOrderFulfillabilityResponse matches the expectation of what was provided in the services feed.

message CheckOrderFulfillabilityResponse {
  ...
  // Total processing fees & taxes that need to be paid for this order.
  // (required if fees and taxes will be charged on this order). This field
  // will be deprecated; new users should populate fees instead.
  Price fees_and_taxes = 2;

  // Breakdown of per-ticket and per-order fees and taxes.
  Fees fees = 3;
}

message SpecificPerTicketFee {
  // ID of a ticket type.
  string ticket_id = 1;
  // A localized partner-provided name for this fee or tax.
  string fee_name = 2;
  // The amount of the fee or tax.
  Price fee_amount = 3;
}

// The specific partner-named fees that must be paid once per order, regardless
// of number of tickets.
message SpecificPerOrderFee {
  // A localized partner-provided name for this fee or tax.
  string fee_name = 1;
  // The amount of the fee or tax.
  Price fee_amount = 2;
}

// Breakdown of the specific, partner-named per-ticket and per-order fees and
// taxes.
message Fees {
  // Fees and taxes that must be paid for each ticket the user purchases.
  repeated SpecificPerTicketFee per_ticket_fee = 1;
  // Fees and taxes that must be paid once per order, regardless of the number
  // of tickets purchased.
  repeated SpecificPerOrderFee per_order_fee = 2;
}

CheckOrderFulfillabilityResponse examples

Per Ticket Fee

{
  "fulfillability": {
    "result": "CAN_FULFILL",
    "item_fulfillability": [
      {
        "item": {
          "service_id": "10001-1",
          "start_sec": "1556556970",
          "duration_sec": "3600",
          "tickets": [
            {
              "ticket_id": "10001-1-adult",
              "count": 1
            }
          ],
          "price": {
            "price_micros": "25000000",
            "currency_code": "AUD"
          }
        },
        "result": "CAN_FULFILL"
      }
    ]
  },
  "fees": {
    "per_ticket_fee": [
      {
        "ticket_id": "10001-1-adult",
        "fee_name": "Service Charge",
        "fee_amount": {
          "currency_code": "USD",
          "micros": "1500000"
        }
      },
      {
        "ticket_id": "10001-1-adult",
        "fee_name": "Taxes",
        "fee_amount": {
          "currency_code": "USD",
          "micros": "1500000"
        }
      }
    ]
  }
}

Per Order Fee

{
  "fulfillability": {
    "result": "CAN_FULFILL",
    "item_fulfillability": [
      {
        "item": {
          "service_id": "10001-1",
          "start_sec": "1556556970",
          "duration_sec": "3600",
          "tickets": [
            {
              "ticket_id": "10001-1-adult",
              "count": 1
            }
          ],
          "price": {
            "price_micros": "25000000",
            "currency_code": "AUD"
          }
        },
        "result": "CAN_FULFILL"
      }
    ]
  },
  "fees": {
    "per_order_fee": [
      {
        "fee_name": "Processing Fee",
        "fee_amount": {
          "currency_code": "USD",
          "micros": "3950000"
        }
      },
      {
        "fee_name": "Delivery Fee",
        "fee_amount": {
          "currency_code": "USD",
          "micros": "6950000"
        }
      }
    ]
  }
}

Per Order Fee and Per Ticket Fee

{
  "fulfillability": {
    "result": "CAN_FULFILL",
    "item_fulfillability": [
      {
        "item": {
          "service_id": "10001-1",
          "start_sec": "1556556970",
          "duration_sec": "3600",
          "tickets": [
            {
              "ticket_id": "10001-1-adult",
              "count": 1
            }
          ],
          "price": {
            "price_micros": "25000000",
            "currency_code": "AUD"
          }
        },
        "result": "CAN_FULFILL"
      }
    ]
  },
  "fees": {
    "per_ticket_fee": [
      {
        "ticket_id": "10001-1-adult",
        "fee_name": "Taxes",
        "fee_amount": {
          "currency_code": "USD",
          "micros": "1500000"
        }
      },
      {
        "ticket_id": "10001-1-adult",
        "fee_name": "Service Charge",
        "fee_amount": {
          "currency_code": "USD",
          "micros": "1500000"
        }
      }
    ],
    "per_order_fee": [
      {
        "fee_name": "Processing Fee",
        "fee_amount": {
          "currency_code": "USD",
          "micros": "3950000"
        }
      }
    ]
  }
}

CreateOrderRequest

Add validation logic to ensure that the total fee amount calculated by Google (order.payment_information.fees_and_taxes) matches your system's expectation before charging the user.