All articles
Rental shop

Put Your Rental Shop on Your Website

Embed the public shop on your own site, size it to fit or give it a screen of its own, and build buttons that open a category or add gear to the request.

The short version

  1. 1
    Allow your website
    In Rentals → Shop → Settings, add your site's address under Allowed embed origins (for example https://yourcompany.com). Browsers refuse to show the shop inside any site that isn't on this list.
  2. 2
    Customize the embed
    Open Customize embed on the same page. Pick what to show, the spacing, the background colour and how the frame is sized. The preview shows the result.
  3. 3
    Paste the code
    Press Copy code and paste it into your website where the shop should appear.

That covers most websites. The rest of this article is for when you want more: buttons on your own pages that open a category or put gear on the visitor's request, or a layout of your own on phones.

Two ways to size the frame

ModeHow it behavesUse it when
Fit to contentThe frame grows to the full height of the shop and your page scrolls. The pasted code includes a small script that resizes the frame and keeps the shop’s pop-ups in view.The shop is one section of a longer page.
FixedThe frame keeps the height you give it and the shop scrolls inside it, like a visit to the shop itself. The search bar stays pinned at the top and, on phones, the Review request bar stays pinned at the bottom. The URL carries fit=0.The shop gets a screen of its own: a full-height page, an app-like layout, or a “Shop” tab on phones.
One site, both modes
You can use Fit to content on desktop and a full-screen fixed frame on phones. Set the frame's src with or without fit=0 depending on the screen size, and make the fixed frame exactly as tall as the space below your header. A fitted shop has no pinned bars, because they would sit at the bottom of a frame thousands of pixels tall.

Shop URL options

The embed is an ordinary link to your shop with options in the query string. The customizer writes these for you; you only need them by hand to build your own links.

https://productionpal.io/shop/<your-shop>?embed=1&pad=0&bg=f4f6f8&lang=da
OptionValuesWhat it does
embed1Framed on another site: no company bar or title block, gear is paged, and the shop reports its height to your page.
fit0Fixed frame: the shop scrolls inside the frame and keeps its pinned bars (see above). Leave it out to fit to content.
header1 / 0Show the company bar (logo, city, Contact). Off by default when embedded.
intro1 / 0Show the title, description and contact line. Off by default when embedded.
per12, 24, 48 or 0Gear per page. 24 if left out; 0 shows everything on one page.
viewgrid / listThe layout the shop starts in. Visitors can still switch.
langen / daLanguage of the category names. Follows the visitor’s browser if left out.
pads / 0Compact or no space around the shop, so it lines up with your own content.
bgrrggbbThe shop’s page colour, without the #, so it blends into your page.

Open a specific view

The same link can open the shop on a category, a search or a set of filters. These are the options the shop itself writes into the address bar while someone browses, so the easiest way to get one is to set the filters in your shop and copy the address.

OptionExampleOpens on
catcat=LightingA category, by its name as the shop shows it.
showshow=packagesAll packages (or show=kits).
qq=600dA search.
brandbrand=Aputure&brand=AmaranOne or more brands.
sortsort=price-ascalpha, price-asc or price-desc.
from / tofrom=2026-11-03&to=2026-11-05Rental dates (YYYY-MM-DD). The shop then shows what is free.
availavail=1Only gear that is free on those dates.
f.<spec>f.mount=ef,plSpec filters, comma separated.
Category names follow the language
Built-in categories are translated (Lighting is “Lys” in Danish), so a cat= link must use the name in the shop's language. Categories you named yourself are never translated.

Put gear on the visitor’s request

Add add= to the link to put gear straight onto the visitor's request list, for a “Rent this” or “Add to cart” button on your own page.

WriteAdds
add=1483One of gear 1483.
add=1483*2Two of it.
add=p7Package 7.
add=1483,1501*2Several at once (or repeat add=).

Gear is added on top of what the visitor already picked, never more than you have, and only gear that is listed in the shop. The option is removed from the address once it has been used, so a reload or a shared link doesn't add it again. Nothing is booked: the visitor still reviews and sends the request.

The ids are the gearId of each item in your shop's public data:

https://api.productionpal.io/public/shop/<your-shop>

Change the view without reloading

A link reloads the frame. Your page can instead send the shop a message, and it switches view in place. The shop and your page talk with postMessage:

MessageDirectionWhat it means
pp-shop:readyshop → your pageSent once the shop has loaded, with the messages it understands: accepts: ['viewport', 'open'].
pp-shop:openyour page → shopShow a view: { search: 'cat=Lighting' }. Takes the same options as a link, add= included. Options you leave out go back to their default; the visitor’s dates stay unless you send new ones.
pp-shop:heightshop → your pageFit to content only: the shop’s height in pixels, whenever it changes.
pp-shop:scrollshop → your pageFit to content only: scroll your page so this point of the shop is in view (after a page turn).
pp-shop:viewportyour page → shopFit to content only: which part of the frame is on screen, so pop-ups open where the visitor is looking.

A button that opens a category, using the message when it can and a new link when it can't:

<button data-shop="cat=Lighting">See our lights</button>

<script>
  const frame = document.querySelector('#pp-shop-your-shop');
  const origin = new URL(frame.src).origin;
  let canOpen = false;

  window.addEventListener('message', (e) => {
    if (e.source !== frame.contentWindow || e.origin !== origin) return;
    if (e.data?.type === 'pp-shop:ready') canOpen = (e.data.accepts || []).includes('open');
  });

  document.addEventListener('click', (e) => {
    const button = e.target.closest('[data-shop]');
    if (!button) return;
    const search = button.dataset.shop;
    frame.scrollIntoView({ behavior: 'smooth' });
    if (canOpen) {
      frame.contentWindow.postMessage({ type: 'pp-shop:open', search }, origin);
    } else {
      // Not loaded yet: load it on that view instead (keeps embed, pad, bg, lang …)
      const url = new URL(frame.src);
      new URLSearchParams(search).forEach((v, k) => url.searchParams.set(k, v));
      frame.src = url.href;
    }
  });
</script>
Only listen to your own frame
Check both e.source and e.origin before acting on a message, as above. The shop sends its messages to any page that frames it, but only sites on your allowed list can frame it in the first place.

Shop on its own tab on phones

On a long one-page site, a shop in the middle is hard to use on a phone: visitors scroll past thousands of pixels of gear to reach the rest of the page, and the request bar can't stay pinned. A pattern that works well:

  1. 1
    Split the page on small screens
    Show two tabs, for example Home and Shop. The Shop tab shows only the frame.
  2. 2
    Give the frame the screen
    On the Shop tab, add fit=0 to the frame's src and make it exactly as tall as the screen below your header. The shop scrolls inside, with its search bar and Review request bar pinned.
  3. 3
    Send shop links to the tab
    Make your “See the gear” and “Rent this” links switch to the Shop tab, and let the phone's Back button return to Home.
Put Your Rental Shop on Your Website — ProductionPal Learn — ProductionPal