Skip to content

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

  1. Open the product in cPanel and go to its pricing.
  2. 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.
  3. 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.
  4. If the product has child products (sizes, fitments, colours), zero every child as well as the parent. See What breaks for why.
  5. Save the product in cPanel. Saving refreshes the cached product page and cards for that product.
  6. 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

WherePrice areaButton
Standard product page”Contact us for price”. No RRP, SAVE, WAS/Now, sale countdown, Afterpay or ZipEnquire about this product, which opens the contact form
Bike-rack product page”Contact us for price”. No quantity selectorEnquire 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 badgeEnquire, which goes to the product page, not the contact form
Child product table on a parent’s page”Contact us for price” on that rowQuantity box disabled on that row
Kit components”Contact us for price”, unless the kit sets its own component priceNone
Search results”Contact us for price”Enquire, to the product page
Google structured dataPrice 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:

FieldNormal card buttonWith price on request
Direct Ship Only (misc12)See Options (not live yet, AUD-23)Enquire
Special Order Only (misc25)Special OrderEnquire
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 / backorderOut Of Stock, Notify Me or BackorderEnquire

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 groupGroup IDTreated asShopper sees
Default (retail, and anyone logged out)1Not tradeRetail price, RRP and sale badges
Wholesale2Not tradeWholesale group price inc GST, with RRP and sale badges
F&F - DT7Not tradeF&F group price inc GST, with RRP and sale badges
The “… - DT” tiers, such as Tier 2 - DT8, 9, 10, 11, 12, 13TradeEx-GST trade display, no badges
Any other group—Not tradeThat 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

  1. The customer applies with Apply for Trade Account, on the login page or the account registration page. This opens the Trade Account Application form.
  2. Their new account stays in the default (retail) group until someone moves it.
  3. In cPanel, open the customer and change their customer group to the right “… - DT” tier (IDs 8–13).
  4. 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.
  5. 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 nameWhere it showsIf empty
Wholesale Form TextThe “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 buttonLogin 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_termsOn the Trade Account Application, the agreement checkbox gets a Terms of Trade link that opens this zone in a “Terms of Trade” windowNo 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: sets por from promo_price when inpromo, else price
  • products/includes/trade_group.template.html: the only list of trade group IDs (8–13), sets is_trade
  • products/includes/trade_price.template.html: ex-GST display, price / 1.1
  • products/includes/buying_options.template.html: standard product page price and buy arms
  • products/includes/bikerack/buycard.template.html and bikerack/buybar.template.html: bike-rack price, buy arms and mobile buy bar
  • thumbs/product/template.html, list.template.html, box.template.html: cards, price_hide (config:wholesale). home-card.template.html also has the por arm, but nothing loads it on development or main
  • products/includes/child_products.template.html and components.template.html: child table and kit components
  • products/includes/reviews.template.html: JSON-LD offers omit price when por is 1
  • footers/includes/contactModal.template.html: data-contact-enquiry handler, inp-msg prefill, reset on close
  • cart/shopping_cart.template.html: no por or trade handling
  • customer/login.template.html, customer/register/template.html, customer/wholesaleregister/template.html, footers/template.html (terms zone): trade application pages and zones
  • src/algolia-search/altapac_instantsearch-app.*.js: search hit price and Enquire button. It reads window.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.md FE-26, .claude/skills/base-templating/references/caching.md