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
- 1Allow your websiteIn 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. - 2Customize the embedOpen 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.
- 3Paste the codePress 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
| Mode | How it behaves | Use it when |
|---|---|---|
| Fit to content | The 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. |
| Fixed | The 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. |
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| Option | Values | What it does |
|---|---|---|
embed | 1 | Framed on another site: no company bar or title block, gear is paged, and the shop reports its height to your page. |
fit | 0 | Fixed frame: the shop scrolls inside the frame and keeps its pinned bars (see above). Leave it out to fit to content. |
header | 1 / 0 | Show the company bar (logo, city, Contact). Off by default when embedded. |
intro | 1 / 0 | Show the title, description and contact line. Off by default when embedded. |
per | 12, 24, 48 or 0 | Gear per page. 24 if left out; 0 shows everything on one page. |
view | grid / list | The layout the shop starts in. Visitors can still switch. |
lang | en / da | Language of the category names. Follows the visitor’s browser if left out. |
pad | s / 0 | Compact or no space around the shop, so it lines up with your own content. |
bg | rrggbb | The 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.
| Option | Example | Opens on |
|---|---|---|
cat | cat=Lighting | A category, by its name as the shop shows it. |
show | show=packages | All packages (or show=kits). |
q | q=600d | A search. |
brand | brand=Aputure&brand=Amaran | One or more brands. |
sort | sort=price-asc | alpha, price-asc or price-desc. |
from / to | from=2026-11-03&to=2026-11-05 | Rental dates (YYYY-MM-DD). The shop then shows what is free. |
avail | avail=1 | Only gear that is free on those dates. |
f.<spec> | f.mount=ef,pl | Spec filters, comma separated. |
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.
| Write | Adds |
|---|---|
add=1483 | One of gear 1483. |
add=1483*2 | Two of it. |
add=p7 | Package 7. |
add=1483,1501*2 | Several 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:
| Message | Direction | What it means |
|---|---|---|
pp-shop:ready | shop → your page | Sent once the shop has loaded, with the messages it understands: accepts: ['viewport', 'open']. |
pp-shop:open | your page → shop | Show 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:height | shop → your page | Fit to content only: the shop’s height in pixels, whenever it changes. |
pp-shop:scroll | shop → your page | Fit to content only: scroll your page so this point of the shop is in view (after a page turn). |
pp-shop:viewport | your page → shop | Fit 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>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:
- 1Split the page on small screensShow two tabs, for example Home and Shop. The Shop tab shows only the frame.
- 2Give the frame the screenOn the Shop tab, add
fit=0to the frame'ssrcand make it exactly as tall as the screen below your header. The shop scrolls inside, with its search bar and Review request bar pinned. - 3Send shop links to the tabMake your “See the gear” and “Rent this” links switch to the Shop tab, and let the phone's Back button return to Home.