Skip to main content
A pricing group is a named price tier on your business — think “Mall”, “Airport”, “Street side”. Each branch can be assigned to at most one group, and each item can carry a separate price map per group. When klikit builds a store’s menu, the branch’s group picks which price map applies. Use pricing groups when the same menu needs different price points per location tier. If only one or two items differ at one store, a per-store price override (zoneStores on updateItemPrice) is the lighter tool.

How a store price is resolved

For each item on a store (brand × branch) menu:
  1. Does the branch have a price_group_id?
  2. Does the item’s groupPrices map have an entry for that group id?
  3. If yes to both → that entry’s provider/currency prices are used for the store.
  4. Otherwise → the item’s base prices map applies.
There is no partial merge: the group entry replaces the base prices wholesale for that store, so a group entry must carry every provider you sell on (klikit "1" included), same as the base PriceMap.

Managing your groups

Full CRUD lives under /v1/partner/price/groups — reads behind brands:read, writes behind brands:update: Two catalog realities behind create/rename/disable:
  • The catalog is shared and capped at 64 groups platform-wide. POST reuses an existing entry with the same title (case-insensitive) instead of minting a duplicate; a full catalog returns 400 — pick an existing title from ?all=true instead.
  • Rename and disable never touch other businesses. Rename is rejected while another business has the group enabled, and disable only clears the group from your set — the catalog entry survives.
Your current branch assignments are visible on listBranches / getBranch: each branch carries price_group_id and price_group_title (null = base prices).

Setting per-group prices on items

groupPrices is accepted anywhere prices is: createItem, updateItem, and updateItemPrice. The shape is one extra nesting level over PriceMap — the outer key is the group id as a string:
Read as: base price IDR 50,000; branches in group 2 (“Mall”) sell at 65,000; branches in group 3 (“Airport”) at 80,000. Prices are in display units (not cents), exactly like the base PriceMap. Tier prices can also be set at creation time — when building a menu via createItem, include groupPrices next to prices in the same payload:
The same field works on modifier options (onlyModifier: true), so a “Large” upcharge can differ per tier too. Business-level edits like the one above follow the same rollout round-trip as any other menu change — see the menu-publish reference:
  1. POST /menus/sync — replay business state into the store overrides.
  2. POST /menus/publish — rebuild the cached store menu blob that getMenu serves.

Assigning a branch to a pricing group

Set price_group_id via updateBranch:
Branch updates treat a missing price_group_id as “clear it”. If the branch currently has a pricing group and your PATCH body omits the field, the assignment is set back to null and the branch reverts to base prices. Once a branch is on a pricing group, include price_group_id in every branch update you send.

The full recipe

  1. POST /price/groups {"title": "Mall"} → note the returned id.
  2. PATCH /branches/{id} with price_group_id on each mall branch.
  3. PATCH /menus/items/price/{itemID} with groupPrices keyed by that group id, for every item that prices differently.
  4. POST /menus/sync, then POST /menus/publish.
  5. Verify with getMenu for a branch on the group.

Gotchas

  • The omit-clears-it PATCH semantic on branch updates (warning above). This is the most common way an integration silently knocks a branch back to base prices.
  • Group entries don’t inherit. A groupPrices["2"] entry with only provider "1" leaves your aggregator providers without a price on mall branches — repeat every provider/currency pair you sell on.
  • Disabling a group doesn’t unprice it. Branches keep their price_group_id and items keep their groupPrices entries; disable only trims the list. Move branches off the group first if you want them back on base prices.
  • Sync + publish still apply. A group price edit that “didn’t take” is almost always a skipped publishMenu — the same trap as every other menu write.