Standalone Prices
Learn about recent changes to Standalone Prices, and how to apply them using the TypeScript or Java SDK.
After completing this page, you should be able to:
- Identify how the changes affect the TypeScript and Java SDKs.
- Apply the updated features using the TypeScript or Java SDK.
Do you remember how many Embedded Prices can be stored inside a Product Variant? Not more than 100
.
With Standalone Prices, you can have up to 50 000
Prices for each Product Variant.
Standalone Prices offers you significantly more flexibility in how you can model pricing. They are a great alternative to Embedded Prices as they are detached from the Product, and are more efficient in managing and importing them.
In 2023, there were two major updates to Standalone Prices; hopefully you'll agree that these are all great features:
- Active and staged Standalone Prices became generally availabile
- Added support for creating and deleting staged values in Standalone Prices
Remember that when you create a staged price, it's of TypedMoneyDraft type—meaning it can either be Money (centPrecision) or HighPrecisionMoneyDraft (highPrecision).
The code samples in this module use our sample data. You are however free to use your own data.
Creating a Standalone Price
Let's look at how you can create a Standalone Price using the SDKs.
import { apiRoot } from '../impl/apiClient.js'; // Update to map to your API rootconst StandalonePriceDraft = {sku: 'RAM-095',key: 'RAM-094-list-4',value: {currencyCode: 'USD',centAmount: 20000,},active: true,//you can now include a staged price when creating a new Standalone Pricestaged: {value: {type: 'centPrecision', //you can also use "highPrecision"currencyCode: 'USD',centAmount: 20500,},},};async function standalonePrice(draft) {try {const response = await apiRoot.standalonePrices().post({ body: draft }).execute();console.log('Success', JSON.stringify(response.body, null, 2));} catch (error) {console.error('Error creating price', JSON.stringify(error));}}standalonePrice(StandalonePriceDraft);
Assuming the above code is successfully executed, we should see the following in the Merchant Center (navigate to Prices > Standalone Price list).
It is important to understand that Standalone Prices reference the Product Variant by SKU, so you must ensure that a valid SKU is used or the Standalone Price will be orphaned.
Deleting a Staged Price
Let's now look at how you can delete a staged value in Standalone Prices.
import { apiRoot } from '../impl/apiClient.js'; // Update to map to your API rootconst priceKey = 'RAM-094-list-1';async function deletePrice(priceKey) {try {const versionResponse = await apiRoot.standalonePrices().withKey({ key: priceKey }).get().execute();console.log('Version fetched',JSON.stringify(versionResponse.body, null, 2));const deleteResponse = await apiRoot.standalonePrices().withKey({ key: priceKey }).post({body: {version: versionResponse.body.version,actions: [{ action: 'removeStagedChanges' }],},}).execute();console.log('Version fetched',JSON.stringify(deleteResponse.body, null, 2));} catch (error) {console.log(JSON.stringify(error, null, 2));}}deletePrice(priceKey);
Using Standalone Prices
As you can see from the code samples above, Standalone Prices are very similar in structure to Embedded Prices, albeit a few minor differences:
- Standalone Prices carry a staged attribute that holds a staged value for the price.
- Standalone Prices need a SKU value to associate them with a Product Variant.
One important feature of Standalone Prices is that if your update or import operations are scheduled at different times, and the Standalone Price gets created in the Project before its corresponding Product, no error will be thrown.
You might wonder how Composable Commerce identifies which pricing mode to use for specific Products; this is controlled by the Product priceMode
. It's set to Embedded
and uses Embedded Prices, by default. To use Standalone Prices for your Products, set it to Standalone
.