How Tos

Inline Checkout

The Paddle checkout can also be embedded into your web store page rather than being presented as an overlay. This option allows you to build a more customized checkout flow that collects additional data points, while using Paddle to seamlessly handle the payment.

To implement the inline checkout, you will need to specify a div element within your form where the Paddle iframe should be rendered. You also need to pass the parameter method: 'inline' to Paddle.js.

Displaying product information

The content rendered in the inline checkout is a minimal version of the overlay checkout so that you have the flexibility to display sale information in the way that you want. For this reason, you will need to show the following information elsewhere in your page:

  • Product name or subscription plan name
  • Product price or subscription plan price and billing period
  • Quantity information

Collecting and passing in the below details is also recommended. This ensures that the only checkout stage rendered is the payment information stage:

  • Email Address
  • Country Code (See the Checkout Parameters documentation for accepted country code values)
  • ZIP/Postal Code (See the Checkout Parameters documentation for countries requiring this field)

Required parameters

The following parameters are required to ensure the checkout is displayed correctly:

  • frameTarget: (String) the class name of the div element where the checkout should be rendered
  • frameStyle: (CSS String) styles to apply to the checkout div, for example background color. Note that frame height should not be set here, but in the next parameter.
  • frameInitialHeight: (int) height in pixels of the div on load
		<title>My Checkout</title>
		<meta charset="utf-8" />
		<script src=""></script>
	    <div class="checkout-container"></div>
		<script type="text/javascript">
				vendor: 12345          // Replace with your Vendor ID.
				method: 'inline',
				product: 543210,       // Replace with your Product or Plan ID
				allowQuantity: false,
				disableLogout: true,
				frameTarget: 'checkout-container', // The className of your checkout <div>
				frameInitialHeight: 416,
				frameStyle: 'width:495px; min-width:495px; background-color: transparent; border: none;'    // Please ensure the minimum width is kept at or above 495px

Loading behaviour

The inline checkout can be loaded in response to an event, or triggered on page load. There may be a slight delay before it is rendered after the main page contents have loaded.

The loadCallback parameter can optionally be specified to trigger a function when the checkout is opened. This can be used, for example, to display a spinner or loading bar while the checkout is initialising, and then hide it when the checkout is ready.

Updating in-page information

Checkout prices may update in response to events such as adding a coupon or removing sales tax by submitting a VAT registration number. When implementing the inline checkout, it is recommended to update your in-page pricing in response to these changes.

The following example shows how in-page elements displaying the net price, sales tax amount, total price and subscription billing periods could be refreshed at each stage in the checkout, including changing the checkout currency.

  vendor: 15839,
  eventCallback: function(eventData) {

function updatePrices(data) {
  var currencyLabels = document.querySelectorAll(".currency");
  var subtotal = - data.eventData.checkout.prices.customer.total_tax;

  for(var i = 0; i < currencyLabels.length; i++) {
    currencyLabels[i].innerHTML = data.eventData.checkout.prices.customer.currency + " ";

  document.getElementById("subtotal").innerHTML = subtotal.toFixed(2);
  document.getElementById("tax").innerHTML = data.eventData.checkout.prices.customer.total_tax;
  document.getElementById("total").innerHTML =;

  if (data.eventData.checkout.recurring_prices) {
    var recurringCurrency = data.eventData.checkout.recurring_prices.customer.currency;
    var recurringTotal =;
    var intervalType = data.eventData.checkout.recurring_prices.interval.type;
    var intervalCount = data.eventData.checkout.recurring_prices.interval.length;

    if(intervalCount > 1) {
      var recurringString = '<div class="is-line-label">Then</div><div class="is-line-value">'+recurringCurrency+" "+recurringTotal+" / "+intervalCount+" "+intervalType+"s</div>";
    else {
      var recurringString = '<div class="is-line-label">Then</div><div class="is-line-value">'+recurringCurrency+" "+recurringTotal+" / "+intervalType+"</div>";

    document.getElementById("recurringPrice").innerHTML = recurringString;

Questions? Get in touch with us for guidance on best practice.