Price on request and trade customers
This page covers two pricing behaviours that stock Maropost doesn’t have:
- Price on request. Any product the shopper would pay $0 for shows “Contact us for price” and an enquiry button instead of a price and Add to Cart. Use this when a product should stay listed but its price can’t be shown, for example when a supplier’s price list is out of date.
- Trade display. Customers in the trade groups see an ex-GST price with the inc-GST price under it, and none of the sale badges.
There is no “price on request” field and no “trade” switch. The site works both out from the product’s prices and the customer’s group. Zeroing prices was chosen over a custom field because, per the owner, Maropost already leaves $0 products out of Google Shopping and refuses them at checkout.
Price on request
How the site decides
The site looks at the price this shopper would actually pay:
- If the product is on promotion, it uses the promotion price only.
- Otherwise it uses the price for the shopper’s customer group. A logged-out shopper gets the default group’s price.
If that price is $0 or less, the product is price on request for that shopper. Prices are checked per customer group, so a product can be price on request for retail shoppers and still show a price to a group whose own price isn’t zero.
Make a product price on request
- Open the product in cPanel and go to its pricing.
- Set the price to 0 for every customer group: the default (retail) group, Wholesale, F&F - DT, and each “… - DT” trade tier. If a group still has a price, its customers keep seeing that price.
- If the product is on promotion, end the promotion or set the promotion price to 0. While a promotion is running, the site ignores the group prices and looks only at the promotion price.
- If the product has child products (sizes, fitments, colours), zero every child as well as the parent. See What breaks for why.
- Save the product in cPanel. Saving refreshes the cached product page and cards for that product.
- Log out (or use a private window) and check a category page and the product page. You should see “Contact us for price” and an Enquire button.
To bring the price back, enter the prices again and save.
What shoppers see
| Where | Price area | Button |
|---|---|---|
| Standard product page | ”Contact us for price”. No RRP, SAVE, WAS/Now, sale countdown, Afterpay or Zip | Enquire about this product, which opens the contact form |
| Bike-rack product page | ”Contact us for price”. No quantity selector | Enquire about this product. The sticky mobile buy bar hides its button |
| Product cards (category, brand, list and box views) | “Contact us for price”. No ”% OFF” or Sale badge | Enquire, which goes to the product page, not the contact form |
| Child product table on a parent’s page | ”Contact us for price” on that row | Quantity box disabled on that row |
| Kit components | ”Contact us for price”, unless the kit sets its own component price | None |
| Search results | ”Contact us for price” | Enquire, to the product page |
| Google structured data | Price left out | — |
Stock and delivery information still shows as normal. A price-on-request product can still say “In stock”, “Shipped from supplier” or “Final stock”.
The enquiry button
On the product page, Enquire about this product opens the site-wide contact window:
- The window title changes from “Get in Touch” to Price enquiry.
- A line under the title shows the product name and SKU.
- The Message box is pre-filled with: “I’d like a price for the product name (SKU code).” On a product with options, the SKU is the option the shopper has selected.
- The shopper fills in Name and Email Address (both required) and, if they like, Contact Phone Number. These are never pre-filled.
The enquiry is sent through the same email form as every other message from the contact window, so it arrives the same way. When the window closes, the title and message reset, so the next enquiry from that window starts clean. If the window can’t open (scripts blocked or failed to load), the button goes to the Contact Us form page instead, with no pre-filled message.
Direct ship, special order and discontinued products
Price on request takes priority over every other buy-button state:
| Field | Normal card button | With price on request |
|---|---|---|
| Direct Ship Only (misc12) | See Options (not live yet, AUD-23) | Enquire |
| Special Order Only (misc25) | Special Order | Enquire |
| Discontinued Run Out (misc26), no stock | ”No longer available”, no button on the product page or cards (cards not live yet, AUD-25) | Enquire |
| Out of stock / backorder | Out Of Stock, Notify Me or Backorder | Enquire |
The “This product has been Discontinued” notice and the stock labels still show. A discontinued product with no stock left that you also zero will invite enquiries for something you can’t supply. Leave its price alone, or hide the product, if you don’t want enquiries.
What breaks: price on request
The cart has no price-on-request handling of its own. The site removes every Add to Cart for these products, so they shouldn’t get there. If one does, the cart shows it at $0.00.
Trade customers
Which groups are trade
| Customer group | Group ID | Treated as | Shopper sees |
|---|---|---|---|
| Default (retail, and anyone logged out) | 1 | Not trade | Retail price, RRP and sale badges |
| Wholesale | 2 | Not trade | Wholesale group price inc GST, with RRP and sale badges |
| F&F - DT | 7 | Not trade | F&F group price inc GST, with RRP and sale badges |
| The “… - DT” tiers, such as Tier 2 - DT | 8, 9, 10, 11, 12, 13 | Trade | Ex-GST trade display, no badges |
| Any other group | — | Not trade | That group’s price inc GST, with RRP and sale badges |
The list of trade groups is set by group ID in the theme, not by name. Renaming a group in cPanel changes nothing. A new group isn’t trade until a developer adds its ID to the theme. Until then its customers get their own group price, shown like a retail price.
The “… - DT” groups (IDs 7 to 13) were created on the store on 2026-10-20 for the Drive Trade customers. The owner set 8 to 13 as trade and F&F - DT (7) and Wholesale (2) as not trade. A pricing probe on 2026-10-20 confirmed that a Wholesale (group 2) login gets the group-2 price, and logged-out shoppers are in the default group (1).
What changes for a logged-in trade customer
Wherever the site prints a product price (product pages, the bike-rack page, product cards and the child product table), a trade customer sees:
- The ex-GST price followed by +GST, for example “$90.91 +GST”.
- The inc-GST price under it, for example “$100.00 inc GST”.
- ”From” in front for a parent product.
They don’t see the RRP strikethrough, ”% OFF”, “On Sale” or “Sale” badges, the SAVE line, WAS/Now, or the “Sale ends in” countdown. If the product is on promotion, the trade price is worked out from the promotion price, but nothing marks it as a sale.
Buy buttons are the same as for every other shopper. Trade status doesn’t change Add to Cart, Special Order, See Options or Notify Me.
If the trade group’s price for a product is $0, that customer gets price on request, not “$0.00 +GST”.
Some places don’t use the trade display:
- Cart, checkout and invoices are priced by Maropost and show inc-GST prices to everyone. A trade customer sees “$90.91 +GST” on the product and $100.00 in the cart.
- Search results show the one indexed price, inc GST, with any ”% OFF” badge, to every shopper including trade.
- Kit component prices show the normal inc-GST price.
Set up a trade customer
- The customer applies with Apply for Trade Account, on the login page or the account registration page. This opens the Trade Account Application form.
- Their new account stays in the default (retail) group until someone moves it.
- In cPanel, open the customer and change their customer group to the right “… - DT” tier (IDs 8–13).
- Check the products they buy have a price for that tier. Whatever price the tier holds is the price they’re shown. If the tier’s price is blank, they see the retail price instead. They get “Contact us for price” when the tier’s price is $0, or when it’s blank and the retail price is also $0.
- Log in as the customer, or as a test account in the same tier, and open a category page. Cards should show “+GST” with an “inc GST” line under it, and no sale badges.
Step 2 is how the store is set up: there’s no pending group, and applicants stay in the default group until the owner moves them.
Trade account content zones
Two content zones feed the trade account pages. Both are optional.
| Zone name | Where it shows | If empty |
|---|---|---|
Wholesale Form Text | The “Fleet Manager, Reseller or Mechanic?” box on the login page, and the “Reseller or Mechanic?” box on the registration page, above the Apply for Trade Account button | Login page: “Apply for a Trade Account and get trade pricing and priority support.” Registration page: “Apply for a Trade Account and get wholesale pricing, priority support and advance notice of new product releases.” |
wholesale_terms | On the Trade Account Application, the agreement checkbox gets a Terms of Trade link that opens this zone in a “Terms of Trade” window | No Terms of Trade link. Applicants agree only to the Terms & Conditions (the terms zone) and the Privacy Policy |
Zone names must match exactly, including capitals and spaces, because the theme looks each zone up by name. A zone under any other name won’t be found, and the page shows the default text instead without any error.
Wholesale Form Text is placed inside a single paragraph, so keep it to one or two plain sentences. Headings, lists or several paragraphs won’t lay out properly.
What breaks: trade
For developers
This page is based on these files in Altapac-ReDev (branch development), under src/templates/ unless noted:
products/includes/price_state.template.html: setsporfrompromo_pricewheninpromo, elsepriceproducts/includes/trade_group.template.html: the only list of trade group IDs (8–13), setsis_tradeproducts/includes/trade_price.template.html: ex-GST display,price / 1.1products/includes/buying_options.template.html: standard product page price and buy armsproducts/includes/bikerack/buycard.template.htmlandbikerack/buybar.template.html: bike-rack price, buy arms and mobile buy barthumbs/product/template.html,list.template.html,box.template.html: cards,price_hide(config:wholesale).home-card.template.htmlalso has theporarm, but nothing loads it ondevelopmentormainproducts/includes/child_products.template.htmlandcomponents.template.html: child table and kit componentsproducts/includes/reviews.template.html: JSON-LD offers omit price whenporis 1footers/includes/contactModal.template.html:data-contact-enquiryhandler,inp-msgprefill, reset on closecart/shopping_cart.template.html: noporor trade handlingcustomer/login.template.html,customer/register/template.html,customer/wholesaleregister/template.html,footers/template.html(termszone): trade application pages and zonessrc/algolia-search/altapac_instantsearch-app.*.js: search hit price and Enquire button. It readswindow.neto_is_default_group, which the theme never sets, so the “View your price” branch never runs- Design records:
docs/records/2026-10-20-price-on-request/spec.md,docs/records/2026-10-15-wholesale-pricing/spec.md,docs/front-end-backlog.mdFE-26,.claude/skills/base-templating/references/caching.md