Advanced Pricing Exercise Guide2
Advanced Pricing Exercise Guide2
Exercise Guide
Version 1.0
Advanced Pricing
Exercise Guide
TABLE OF CONTENTS
Preface 5
Overview 5
What You Will Learn 5
Prerequisites 5
Repricing 68
Task 1: Activate the RepricingElementServiceImplementation 69
Task 2: Reprice order line items to reflect a price effectivity change 70
Task 3: Reprice an asset to reflect a context rule condition for an account 77
Preface
These training exercises are based on the Spring ’22 release of Salesforce Industries
Communications, Media, and Energy & Utilities Clouds. For additional information about
the topics covered in this module, see the documentation available in Vlocity Success
Community at https://success.vlocity.com.
Overview
● Attribute-based pricing
● Loyalty pricing
● Repricing orders and assets
● Event hooks
● Usage pricing
Prerequisites
The prerequisites for this training include successful completion of the Pricing and EPC
modules from the Build Salesforce Industries Configure, Price, Quote (CPQ) Solutions
training course. In addition, a solid understanding of basic Salesforce concepts and
functionality is required. You should also have a working knowledge of telecommunications,
media, or energy and utilities industry business objectives.
● Transitioning from older pricing to newer pricing for less expense and disruption.
Now, let’s dig a little deeper. Salesforce Industries CPQ provides standard and advanced
pricing capabilities for you to:
● Customize the pricing process by adding pricing plan steps or invoking an event
hook.
Goal
● Explain the concept of attribute-based pricing
● List the types of attribute-based pricing
● Set up attribute-based pricing using pricing plans
● Add data to lookup tables
● Create expression sets to price the line item in the Cart
● Add a new step to the default pricing plan
Tasks
1. Review Salesforce Industries Process Library
2. Configure post-install steps
3. Validate Apex classes
4. Set up AttributePricingMatrix
5. Set up RangeAttributePricingMatrix
6. Set up SourceTargetAttributePricingMatrix
7. Set up AttributePricingProcedure Expression Set
8. Set up RangeAttributePricingProcedure Expression Set
9. Set up SourceTargetAttributePricingProcedure Expression Set
10. Set up custom pricing steps
11. Refresh the platform cache
12. Add products to the Cart to initiate attribute-based pricing
Time: 25 mins
ALERT:
If you’ve just received your training playground, add your email address
to the system administrator profile to ensure you receive all system
notifications. In the upper-right, click on the Avatar and select Settings.
Enter your email address in the Email field on the Personal Information
page and click Save.
Attribute-Based Pricing
Assigning attributes to products provides a powerful and flexible way to describe product
characteristics. Consider a smartwatch with two product attributes – case size and
connectivity. Without attribute-based pricing you would need to create four products for
each configuration so that each is priced correctly.
But, with attribute-based pricing you create a single product, a set of attributes and use a
matrix to price each combination of attributes.
● Range – prices a product when the value falls within the defined range for each
attribute and field in the matrix.
You can implement attribute-based pricing using pricing plans, expression sets, and lookup
tables.
In this exercise, you’ll use preconfigured lookup tables and create expression sets to execute
attribute-based pricing. There are two forms of lookup tables: a decision matrix or a
decision table. Decision matrices are exact-match based lookup tables that match your
inputs to values in a row, and return the row’s output. Decision tables are complex lookup
tables that match your inputs to values in multiple rows, if applicable, and return multiple
matching outputs. An expression set is a procedure that performs a series of calculations on
matrix lookups and user-defined variables and constants. Together, expression sets and
lookup tables comprise the Business Rules Engine.
NOTE:
Expression sets and lookup tables are similar in function to calculation
procedures and calculation matrices, and are part of Salesforce core in
Summer ‘22 and later releases. Calculation procedures and matrices are still
supported and included in Industries packages, though we recommend using
expression sets and lookup tables for advanced pricing scenarios.
Salesforce provides a DataPack that can be downloaded from the Salesforce Industries
Process Library. This DataPack includes preconfigured matrices to support attribute-based
pricing. The Attribute/Volume Based Pricing DataPack has already been installed in your
training playground, and it imported the following records.
AttributePricingMatrix AttributePricingDataPack.json
SourceTargetAttributePricingMatrix SourceTargetAttributePricingDataPack.json
RangeAttributePricingMatrix RangeAttributePricingDataPack.json
ALERT:
Do not change the header names of the columns in the decision
matrices. The PricingPlanHelper.cls expects these column names and
will fail if they are not found.
The Range Attribute Pricing matrix also includes a Text column type to store the Quantity
API field name.
When implementing attribute-based pricing using pricing plans, you need to create a new
step in the default pricing plan. This step will call an expression set and lookup table that
stores the product attributes and pricing information. At runtime, the PricingPlanService
implementation passes the cart line items to the calculation service and retrieves the
correct price.
Pricing plans are implemented by the PricingInterface and require the PricingPlanService
implementation.
RESOURCE:
To optimize performance for large lookup tables or pricing plans that have
many attribute-based pricing steps refer to the topic, Caching Calculation
Matrices for Performance, in documentation on Vlocity Success Community.
3. Notice under the Process Package Includes section the files that are included in the
DataPack.
NOTE:
These files are required to be downloaded and installed before implementing
attribute-based pricing. We’ve already installed this DataPack in your training
playground.
a. Using the Lightning App Launcher, click the Configure Price Quote (CPQ)
app.
b. Navigate to the Vlocity Product Console.
c. Next to Pricing Plan in the Pricing area, click the search icon .
d. In the Search Pricing Plan… dialog box, press the return or enter key to
display the Default Pricing Plan.
NOTE:
This custom setting is used to indicate the default pricing plan used in the org.
NOTE:
The PricingPlanService implementation is required when using pricing plans. It
is the same implementation as the PricingElementServiceImplementation but
the PricingPlanService allows you to manage all of its pricing steps using a
pricing plan defined in Vlocity Product Console.
NOTE:
This Apex class is invoked by CustomPricingPlanStepImpl.cls which analyzes
the matrix and invokes the calculation procedure or expression set.
Due to code dependencies, when setting up these Apex classes they must be
created in the order demonstrated.
f. Review lines 100-103. What is the name of the method that retrieves the
price from the expression set (calculation procedure)?
g. Review lines 375-422 and lines 441-492. What is the code doing?
i. Review lines 1015-1034, what is the name of the method that sets the price
to return to the pricing plan service?
NOTE:
The CustomPricingPlanStepImpl.cls Apex class exposes the GetMatrix method
and invokes the PricingPlanHelper class. The
CustomPricingPlanStepImplTest.cls is an Apex test class.
1. Using the Lightning App Launcher, search for and select Lookup Tables.
7. Select Save.
8. On the Decision Matrix Version screen, notice the preconfigured columns showing
the Input and Output Data.
NOTE:
If more than one matrix version is enabled, the Rank field in the New Decision
Matrix Version configuration dialog determines which version to use. The
version with the higher number in the rank field will be used for calculation
procedures.
9. Click Add Row four times to add four rows to the matrix.
ALERT:
Data must be entered exactly as displayed, including spacing and proper case.
These columns match the product and its attributes; therefore, they must be
exact.
TIPS:
Notice a mistake in the matrix after enabling? Click Clone from the dropdown
arrow menu and correct the mistake in the new version of the matrix. Make
sure that the new version is Enabled once you’re done.
1. Navigate to the Lookup Tables tab. You may need to search for it again using the
Lightning App Launcher.
4. Click Clone.
6. Click Save.
7. On the Decision Matrix Version screen, click Add Row two times to add two rows to
the matrix.
TIPS:
Notice that the Quantity column uses a Text column type instead of a Number
Range column type. While either format is acceptable, it’s recommended that
you use Text column types for numeric ranges because they’re easier to
manage and maintain consistency when using several ranges in a single
matrix.
9. Select Save.
1. Navigate to the Lookup Tables tab. You may need to search for it again using the
Lightning App Launcher.
4. Click Clone.
6. Click Save.
7. On the Decision Matrix Version screen, click Add Row to add a row to the matrix.
TIPS:
You can enter the Target Product Name simply using the product name, which
will then price all occurrences of that target product throughout the order.
However, if you want to only price a specific occurrence of a product within a
bundle, you can use a path parameter as shown in this example. The path
parameter is described in the next task.
9. Select Save.
NOTE:
Due to the way that a lookup table requires input data to be unique across all
rows in the matrix, it’s not currently possible to use source-target
attribute-based pricing to change more than one child product in a bundle.
Now that Eliza has set up the lookup table, she’ll create expression sets to perform
calculations using the data entered in the matrices.
1. Using the Lightning App Launcher, search for and select Expression Sets.
2. Change the List Views to All Expression Sets and pin it so that All Expression Sets
display instead of Recently Viewed.
3. Click New.
a. In the Expression Set Builder window, select the + symbol to open the Add
Element dialog box.
b. Select Lookup Table from the list below the Search box to add a Lookup
Table element to the expression set.
d. With the Lookup Table element selected, click the Element Details tab in
the left panel, and check the Include in Output checkbox.
Field Entry
Decimal 2
c. Click Done.
Field Entry
Decimal 2
a. Under the Lookup Table element, click the + symbol to open the Add
Element dialog box, and select Calculation.
b. In the Formula field of the new Calculation element, search for and select
AttributePricingMatrix__MRC.
c. In the Output Variable field, search for and select REC_MNTH_STD_PRC.
d. With the new Calculation element selected, click the Element Details tab
a. Under the Lookup Table element, click the + symbol to open the Add
Element dialog box, and select Calculation.
b. In the Formula field of the new Calculation element, search for and select
AttributePricingMatrix__NRC.
c. In the Output Variable field, search for and select OT_STD_PRC.
d. With the new Calculation element selected, click the Element Details tab
15. Select Save in the top right corner of the Expression Set Builder, and then click
Activate.
a. Click Simulate.
b. Enter the following input variables into the fields:
Field Entry
SourceProductCode C-DSL-001
NOTE:
The sequence of the simulation parameters may be different in your org. Make
sure to insert the correct value for each field.
d. Notice the green check marks that indicate that each element executed
successfully. Also, notice the output of the REC_MNTH_STD_PRC calculation
step is $50.00. This price matches the value you entered in the 20 Mbps;2
Mbps row of the decision matrix.
1. Navigate to the Expression Sets tab. You may need to search for it again using the
Lightning App Launcher.
2. Click New.
7. Select Open in Expression Set Builder from the header in the upper right.
8. In the Expression Set Builder window, click the plus + symbol and select Lookup
Table.
10. With the new Lookup Table element selected, click the Element Details tab in
the left panel, and check the Include in Output checkbox.
11. Click the Resource Manager tab and select Add Resource.
12. As you did in the last exercise, add the recurring monthly standard price and
one-time standard price variables:
Field Entry
Decimal 2
Field Entry
Decimal 2
13. Add a new Calculation element and enter the following information:
Field Entry
Formula RangeAttributePricingMatrix__MRC
14. Add another Calculation element and enter the following information:
Field Entry
Formula RangeAttributePricingMatrix__NRC
15. For all three elements, make sure that the Include in Output checkbox is selected in
TIPS:
To help troubleshoot any potential errors, try simulating the expression set by
clicking Simulate and entering corresponding values from the connected
decision matrix.
Now that you’ve got the hang of expression sets, create and configure the
SourceTargetAttributePricingProcedure to perform calculations using information from the
SourceTargetAttributePricingMatrix.
8. For all three elements, make sure that the Include in Output checkbox is selected.
10. Optional: Simulate the expression set and troubleshoot any errors that occur.
Eliza has created lookup tables and expression sets and she’ll now configure steps in the
Default Pricing Plan so that the attribute-based pricing calculations will display at runtime in
the Cart.
2. Next to Pricing Plan in the Pricing area, click the search icon .
3. In the Search Pricing Plan… dialog box, press the return or enter key to display the
Default Pricing Plan.
6. Review the sequence of steps. Refer below for a description of each Pricing Plan
Service Step.
Field Entry
Sequence 5
Active ✔
ALERT:
All attribute pricing steps must occur before the Initialize Pricing Context step;
therefore, the sequence must be before 10.
ProcedureName AttributePricingProcedure
MatrixName AttributePricingMatrix
DecisionMatrix true
TIPS:
Click on the + multiple times to create blank rows avoiding the need to click
on the + each time a new row is needed.
e. Click Done.
f. Click Save in the General Properties pane.
8. Create a new pricing plan step for Source Target Attribute Pricing using the following
information.
Field Entry
Sequence 6
Active ✔
ProcedureName SourceTargetAttributePricingProcedure
MatrixName SourceTargetAttributePricingMatrix
DecisionMatrix true
TIPS:
When you identify a path, you are pricing a target product differently. It prices
the target product based on the bundle it is in. The target path must be
formatted as: [root product name]<[parent1 product name][parent2 product
name][…]<[product name].
d. Click Done.
e. Click Save in the General Properties pane.
Field Entry
Sequence 7
Active ✔
ProcedureName RangeAttributePricingProcedure
MatrixName RangeAttributePricingMatrix
RangeFields Quantity
DecisionMatrix true
IncludeAttrInfoInRangeKeys false
c. Click Done.
d. Click Save in the General Properties pane.
NOTE:
When you want to use range attribute pricing, you specify the API names of
fields or attributes using the RangeFields or RangeAttributes parameters. The
fields and attributes listed need to have corresponding columns in the
RangeAttributePricingMatrix.
NOTE:
The IncludeAttrInfoInRangeKeys parameter controls how the range column of
the decision matrix is handled based on the conditional attributes in the other
columns. In the range attribute matrix you created, the attributes are the
same across all of the rows, and the quantity fields alone control the price of
the product:
C-MOD-002 | Grade | Best | 1-4 | $65
C-MOD-002 | Grade | Best | 5-9 | $50
But what if you wanted to repeat the ranges and include another characteristic
value (e.g. “Good”) as a condition, as shown below?
C-MOD-002 | Grade | Best | 1-4 | $65
C-MOD-002 | Grade | Good | 1-4 | $50
Pricing plan steps and/or parameters are cached in the platform cache after they are
executed for the first time in the Cart. Anytime you make changes to a pricing plan
step/parameter you are required to run the maintenance jobs Clear Managed Platform
Cache and Refresh Platform Cache. When the Cart is invoked, the platform cache will be
populated with the new pricing plan step and/or parameter data.
1. Navigate to the Vlocity CMT Administration tab. You may need to click the More
dropdown menu to expand for additional tabs.
3. For the job Clear Managed Platform Cache, click Start and OK.
4. For the job Refresh Platform Cache, click Start and OK.
c. Click Save.
d. Click on the Power Launcher’s search field and select Configure Order.
e. Search for the product Back to School.
f. Add the Back to School Student Offer and Back to School Backpack to the
Cart.
g. Expand the Messages information bar to expose the Take Me There icon
to address the required missing attributes.
h. For DSL Service, select 40 Mbps for the Download Speed and 2 Mbps for the
Upload Speed.
i. For Home Hub Modem, select Better for the Grade.
j. Click Close.
k. Search for the product Home Hub Modem and add it to the Cart.
l. Click the Take Me There icon to address the required missing attribute.
m. Select Best for the Grade and click Close.
a. In the Recurring Charge column for DSL Service, click on the charge and
c. Click Close.
d. Change the Download and Upload Speeds to those identified in the matrix.
Does the recurring charge change according to the amounts entered in the
matrix?
a. In the One Time Charge column for the Home Hub Modem, (not part of the
Back to School Student Offer bundle) notice the price.
b. Change the quantity to 5. Did the price change to the amount identified in
your Range Attribute Pricing Matrix from Task 5?
c. In the One Time Charge column, click on the charge and select the Price
Details icon.
d. Notice that the price returned is from the Range Attribute Pricing Procedure
based on the data entered in the matrix.
e. Click Close.
a. Notice the price of the Back to School Backpack when added to the Cart not
as part of a bundle.
b. In the One Time Charge column for Back to School Backpack (part of the
Back to School Student Offer bundle), click on the charge and select the
c. Notice that the price returned is from the Source Target Attribute Pricing
Procedure based on the data entered in the matrix (Path1).
d. Click Close.
e. The custom pricing plan step parameter (Path1) and the target product
(Path1) in the matrix states that if the Back to School Student Offer is added
to the Cart with Full Service Install set as the Installation Type the Back to
School Backpack is $0.
Troubleshooting Guide
If you encountered issues while performing the simulation of an expression set, or aren’t
getting the intended results in the Cart after completing the above tasks, try the following.
● Check that all matrix row information and expression set variables are entered
correctly.
● Make sure that the MRC and NRC columns are configured as Currency and Output
column types.
Expression Set
● Make sure you’ve set the Rank of the expression set version to 1.
● Check that each expression set element has the Include in Output checkbox
selected in the Element Details tab in the Expression Set Builder.
● Make sure that the REC_MNTH_STD_PRC and OT_STD_PRC variables are configured
with the type Currency in the expression set.
● Verify that all data input is spelled correctly and has proper spacing.
Goals
● Explain how to set up loyalty pricing
● Pay for a product using loyalty points
Tasks
1. Enable loyalty pricing
2. Create pricing elements for loyalty point charges
3. Assign loyalty pricing to products
4. Refresh the cache
5. Create orders using loyalty pricing
Time: 10 mins
Loyalty Pricing
Loyalty pricing allows customers to pay for any product with loyalty points using their loyalty
credits. Once loyalty pricing is enabled, the following are available out of the box:
● One Time Loyalty pricing variable to set the one-time price type.
● Pricing variable with pricing variable bindings to ensure the correct calculation of
each line item in the Cart.
● Additional columns for the Cart to display the one-time loyalty price and one-time
loyalty total for each line item.
Industries CPQ provides the ability to pay for an item in currency or loyalty points.
Administering and managing point balances is handled by an external back office system.
Pricing elements are stored within their respective price lists. When you create price list
entries for products that have charges in loyalty points, you must have existing pricing
elements that contain those charges.
1. Navigate to the Vlocity CMT Administration tab. You may need to click the More
dropdown menu to expand for additional tabs.
5. Click OK to the message that the feature has been enabled successfully.
2. Next to Price List in the Pricing area, click the search icon .
3. In the Search Price List… dialog box, enter B2C and click the search icon.
6. Click New.
Sub-Type Standard
Name 500 OT
Code LP-500-OT
10. Enter the following data for the Loyalty Value fields:
Field Value
Active ✔
3. In the Search Product… dialog box, enter Samsung and click the search icon.
4. Click the Edit icon next to the Samsung Fast Charge Wireless Charging Stand.
Base Price ✔
Sub-Type Standard
Active ✔
NOTE:
This task is required as a one-time setup due to enabling the Loyalty Pricing
feature and creating price list entries for loyalty pricing in a new training
playground. Refreshing the platform cache will not be required when creating
additional price list entries to be used with loyalty pricing.
1. Navigate to the Vlocity CMT Administration tab. You may need to click the More
dropdown menu to expand for additional tabs.
3. For the job Clear Managed Platform Cache, click Start and OK.
4. For the job Refresh Platform Cache, click Start and OK.
3. Click Save.
4. Click on the Power Launcher’s search field and select Configure Order.
6. For the Samsung Fast Charge Wireless Charging Stand notice the List Price is now
$49.99 or 500 LP.
8. Add the Samsung Fast Charge Wireless Charging Stand to the Cart. Notice the One
Time Loyalty Price column is 500 PTS.
9. Click the One Time Loyalty Price link and select the Payment Type button to open
the Payment Choice dialog box.
11. Notice the One Time Loyalty Price is now 0 PTS and the One Time Charge is $49.99.
12. Change the Payment Choice back to Loyalty from the One Time Loyalty Price or One
Time Charge links and click Apply.
Goal
● Describe how to use repricing to reprice order line items and assets
● Explain how repricing adheres to context rules and effectivity dates on price list
entries
● Explain how to invoke the repricing service
Tasks
1. Activate the RepricingElementServiceImplementation
2. Reprise order line items to reflect a price effectivity change
3. Reprice an asset to reflect a context rule condition for an account
Time: 20 mins
Repricing
Repricing allows you to reprice line items in opportunities, orders, quotes, and assets as
needed by your business operations. You can use repricing to support products with prices
that fluctuate over time, like natural resources, or products that are priced based on usage
or currency exchange rates.
Repricing is done as a background process across one or more records. During repricing,
prices are evaluated to ensure that they still apply based upon the effectivity dates of the
price list entry for the product or the applied promotion. In addition, rules are re-run to
ensure that the line items still meet the criteria for any context rules applied to the price list
entry. Context rules for any manual adjustments can also be re-run to ensure that they are
still valid. If the manual adjustment is no longer valid, the pricing for that line item reverts
back to original pricing. Any price list entries that do not have a current effectivity date yields
no change when repricing is run.
ALERT:
Repricing utilizes the RepricingElementServiceImplementation whereas
attribute-based pricing utilizes the PriclngPlanService implementation.
Therefore, repricing does not support attribute-based pricing.
3. Click on RepricingInterface.
Due to changes in market conditions, the marketing team decides to lower the price of the
4G LTE Data Plan product starting on a certain date, and they want this new price to be
available to any orders that are still pending and have not been submitted for fulfilment. To
accomplish this, create a new price list entry and end-date the existing price list entry. Once
the price list entries are created and updated, run the repricing service in order to reflect the
new pricing on existing orders to ensure customers can take advantage of this new pricing.
Product Price List Entry Effectivity Start Date Effectivity End Date
1. Create a new price list entry and end-date an existing price list entry.
Base Price ✔
Frequency Monthly
Sub-Type Standard
Active ✔
k. Click Save. Notice the WARNING, you currently have two price list entries that
overlap.
m. Click the Edit icon to modify the $34.99 RM price list entry.
o. Click Save.
p. Notice the WARNING, you currently have two price list entries that overlap.
q. Click the X to close the Warning message.
e. Click on the Power Launcher’s search field and select Configure Order.
a. From the Developer Console, click Debug > Open Execute Anonymous
Window.
b. The following Apex code will be used to reprice the Adv Pricing Data Plan
Order. Copy this code and paste it in the Enter Apex Code box from the
Developer Console.
Apex Code
ALERT:
You will replace the OrderId in the Apex code with the OrderId from your
training playground. The OrderId used in this example will not be the same in
your environment.
c. Copy the OrderId from your text editor and paste it over the OrderId in the
Apex code in Line 1.
a. Navigate back to the tab where the 4G LTE Data Plan is in the cart for the Adv
Pricing Data Plan Order.
b. Refresh the browser page.
c. Notice the Recurring Charge is now $24.99 from the new price list entry.
3. Review an existing asset that was discounted based on the account’s SLA status.
a. Using the Lightning App Launcher, select Assets and open in a new tab.
b. Change the List Views to All Assets.
c. Select Blast! Pro Internet for Acme.
d. On the Details tab notice the Recurring Charge for the asset is $20 according
to the context rule for platinum accounts.
d. In line 1, replace the Account Id currently in the code with the Account Id
copied from Acme’s account.
c. Notice the Recurring Charge for the asset is now $25 according to the price
list entry for all customers other than Platinum.
Goal
● Explain what a hook is used for
● Describe how to implement a pricing hook
● Explain how to modify the Cart to display a custom field
Tasks
1. Review the billing zip code custom field
2. Create an attribute pricing matrix for billing zip code
3. Create an attribute pricing procedure expression set for billing zip code
4. Create a custom pricing plan step for billing zip code
5. Create a new Apex class
6. Create the CpqAppHandlerHookImplementation
7. Add a new column to the Cart
8. Add billing zip code as a custom field in the Cart
9. Test in the Cart
Time: 60 mins
In software development, hooking is a concept that allows you to modify the original
behavior of the application without changing your code. By intercepting the commands,
you can change the action that would have been performed originally. It is very useful in the
case of adding new functionality to applications, exposing additional fields in pricing
calculations or altering how products are priced, to name a few of its applications.
Industries CPQ allows you to write custom Pre-invoke and Post-invoke hooks for each
interface to implement custom logic. Pre-invoke hooks get executed before the actual
interface is executed whereas Post-invoke hooks get executed after the actual interface is
executed.
The CpqAppHandlerHook can be used on inputs and outputs of the CPQ methods to:
● Conditional processing.
● Preload information that will be used further down the execution chain.
● Process custom fields.
● Implement custom functionality.
● Do callouts.
Injecting custom code is powerful when executed correctly, but you also need to be aware
of the ramifications if executed poorly. Salesforce recommends the following when
implementing a hook:
● Validate that a feature doesn’t already exist that addresses your need for a hook.
● Ensure the custom code in the hook does not cause the execution to exceed any
Apex governor limits.
● Put a try-catch around the hook code to catch any exceptions thrown by the custom
code.
● When unit testing the hook code, it may be possible to mock the inputs expected by
the hook code to minimize test setup and get better code coverage. Use
Test.isRunningTest() to extract the mock input from the inputMap or from a static
map.
Users must not be allowed to order the same product more than once in the same order.
And, check to see if the product exists as an active asset on the account.
● In the Preinvoke hook, if the product exists in active line items or assets, null the
items and create a new node that will be checked in the post-hook.
● In the Postinvoke hook, if the new node exists, display an error in the UI.
● When the user tries to add a duplicate product, they will get an error in the cart.
Let’s take a look at another example. Consider how pricing works in the Cart. You add an
iPhone X to the cart. It displays a one-time charge of $1000. That’s all good, but as a
customer I want to know the total price of the iPhone X, which includes the sales tax cost.
How can I display the cost of the iPhone X plus applicable taxes in the one-time charge
column in the Cart? You would do this by implementing a pricing hook to alter how the
pricing is calculated. Instead of calculating Quantity*Price and displaying the price in the
One Time Charge column, you would create a pricing hook to calculate the One Time
Charge as Quantity*Price*Sales Tax Rate. What if I didn’t want to include the sales tax in the
one-time charge column, but rather wanted to display it as a separate column? No problem,
you can modify the cart to display a custom field for the applicable sales tax.
In this exercise, we will price products using the account’s zip code. This would allow you to
vary pricing for each line item based on the customer’s location, such as the billing or
shipping location. To do this, we must add a custom field to store the zip code on each
order line item, and then use attribute-based pricing to calculate the price for each zip
code. However, the pricing service has no idea that this new field exists. So, we also must
use a pricing hook to alert the pricing service to the existence of this new field and ensure
that it is passed in the input map to attribute-based pricing. Then, as the icing on the cake,
we’ll also expose the custom field (Billing Zip Code) in the Cart, so the user can see the
values that affect the price of the line item.
4. Click Fields & Relationships from the navigation pane on the left.
Billing_Zip_Code__c
6. Make a notation of the API name, here ______________________________.
Value(Order.Account.BillingPostalCode)
7. Make a notation of the formula, here _________________________________.
In this task, Eliza needs to create an attribute pricing matrix for all US billing zip codes.
1. Using the Lightning App Launcher in the upper left, search for and click Files.
4. Navigate to the Lookup Tables tab. You may need to reopen it using the Lightning
App Launcher.
5. Click New.
9. Click Save.
14. Edit the Header Information with the following and click Upload:
15. Click Done and wait for the file upload to process. Click Refresh, if necessary.
In this task, Eliza needs to create an attribute pricing procedure so that product pricing is
calculated based on the Billing Zip Code attribute pricing matrix.
1. Navigate to the Expression Sets tab. You may need to reopen it using the Lightning
App Launcher.
2. Click New.
4. Click Save.
5. Click the Related tab, and select Edit from the dropdown arrow next to
BillingZipCodeAttributePricingProcedure V1.
11. In the Lookup Table Details field, search for and select
BillingZipCodeAttributePricingMatrix.
12. Click the Element Details tab and select the Include in Output checkbox.
13. Select the Resource Manager tab and click Add Resource.
14. Enter the following information to create the recurring monthly standard price
variable and click Done and New:
Field Entry
Decimal 2
15. Enter the following information to create the one-time standard price variable and
click Done:
Field Entry
Decimal 2
16. Click the plus + sign and select Calculation from the Add Element dialog.
18. In the Output Variable field, search for and select REC_MNTH_STD_PRC.
19. With the Calculation element selected, click the Element Details tab and select
the Include in Output checkbox.
20. Click the plus + sign and select Calculation from the Add Element dialog.
22. In the Output Variable field, search for and select OT_STD_PRC.
23. With the Calculation element selected, click the Element Details tab and select
the Include in Output checkbox.
24. Click Save and then select Activate in the top menu.
Task 4: Create a custom pricing plan step for billing zip code
In this task, Eliza needs to add a pricing plan step to the Default Pricing Plan so that
products in the Cart are priced according to the Billing Zip Code Attribute Pricing Procedure
and Matrix.
3. In the Search Pricing Plan… dialog box, press the return or enter key to display the
Default Pricing Plan.
Field Entry
Sequence 9
Active ✔
ProcedureName BillingZipCodeAttributePricingP
rocedure
MatrixName BillingZipCodeAttributePricingM
atrix
RangeFields Billing_Zip_Code__c
DecisionMatrix true
IncludeAttrInfoInRangeKeys false
10. Run the Clear Managed Platform Cache and Refresh Platform Cache maintenance
jobs in CMT Administration.
In this task, Eliza needs to create a new Apex class to inject logic for the new custom field –
Billing Zip Code. Without this logic the new custom field will not populate.
1. Using the Lightning App Launcher in the upper left, click Files.
NOTE:
The CpqAppHandlerHookImplementation is an Apex Class that has been
written for this lab exercise.
5. From the Developer Console, click File > New > Apex Class.
7. Open the downloaded file and copy the Apex Class code.
8. Paste the code in the Enter Apex Code box. You will have 48 lines of code.
10. Review line 12. Note the String customFields API here, ____________________.
In this task, Eliza needs to create the interface implementation hook. The hook interface
provides a hook to the implementation method for pre-invoke and post-invoke handling.
1. Navigate to the Interface Implementations tab in the Configure Price Quote (CPQ)
app.
2. Click New.
NOTE:
The maximum length for a hook interface name is 36 characters.
5. Click Save.
6. From the Related tab, click New next to Interface Implementation Detail (0).
In this task, Eliza needs to modify the default CPQ product cart so that the new field –
Billing Zip Code – displays as a column in the Cart.
1. Using the Lightning App Launcher in the upper left, search for the Vlocity Cards app.
Two options appear. Choose the second Vlocity Cards app to open the Omnistudio
Layouts & Cards app. Verify you have opened the correct app by checking to see if
Omnistudio is listed in the header.
4. In the LAYOUT pane, scroll down to the DATA SOURCE section. Notice the selection
is Dual. This means that the API query will be performed using Apex when running
on a desktop, while a REST call will be performed while running on a mobile.
5. Notice the Remote Class, Remote Method and fields under the Desktop
ApexRemote Config section. The CPQ API CpqAppHandler.getCartItems returns all
products currently in the cart. The fields parameter controls which fields are returned
in the API for each product.
6. Scroll back to the top of the LAYOUT pane and click Clone.
7. In the CLONE LAYOUT window, change the Layout Author to your name. Do NOT
change the Layout Name or Layout Type.
8. Click Clone.
9. After cloning the card layout, it should contain an active card called
cpq-product-cart-item.
10. Open the active cpq-product-cart-item card. You can ignore any inactive versions of
this card that may also display.
13. In the CLONE CARD window, type cpq-product-cart-item as the Card Name.
16. On the LAYOUT pane, navigate to the fields parameter from the Input Map. This is a
comma-separated list of product fields that will be queried as part of the API call to
getCartItems( ). We need to append this list of fields to include the Billing Zip Code
custom field.
17. In the box next to fields, scroll to the end of the list to enter the following:
,Billing_Zip_Code__c. You must precede the custom field name with a comma.
18. On the LAYOUT pane, navigate to the Mobile Hybrid ApexRest Config Endpoint
field, expand the field, and type the following: ,Billing_Zip_Code__c.
Remember, you must precede the custom field name with a comma.
19. Remember, the DATA SOURCE field is Dual. If you want the new column to be
added to mobile versions of the CPQ cart you need to add the field to the Endpoint
under Mobile Hybrid ApexRest Config.
20. Make sure you have the correct cpq-product-cart-item card selected. It will be the
one with your name as the Author.
22. In the blank Fields box, select <<Custom Field>> and click Add.
Name Label
['Billing_Zip_Code__c']['value' ['Billing_Zip_Code__c']['label'
] ]
ALERT:
Do not perform a copy/paste from the exercise guide. The Name and Label
field input must be entered exactly as displayed using straight quotes and no
spaces between brackets.
24. Click the Activate button on the CARDS and LAYOUT pane.
In this task, Eliza needs to create a Field Setting so that getCartsItems (called when the cart
is loaded) and postCartsItems (called when you click Add to Cart) APIs return the Billing Zip
Code field and it displays in the Cart.
1. Go to Setup.
5. Click New.
Name Billing_Zip_Code__c
Inclusion ✔
Sequence 1
7. Click Save.
3. Click Save.
4. Click on the Power Launcher’s search field and select Configure Order.
6. In the One Time Charge column, click on the charge and select the Price Details
icon.
8. Click Close.
15. Notice the new Billing Zip Code column in the cart and the billing zip code returned
for Acme.
ALERT:
The custom field value can’t be null. If null, it will not be read and will not
display.
Troubleshooting Guide
Attribute-Based Pricing
Is the BeatsX Wireless Earphones product not displaying the correct price in the cart based
on the BillingZipCodeAttributePricingMatrix? Use the troubleshooting headings below to
assist in your evaluation.
● Verify that all input/output data in the matrix has proper spacing, punctuation, and
correct spelling.
● Verify that the matrix is enabled and has the highest rank (1).
● Verify that the procedure is working using the Simulate button on the Vlocity
Procedure page.
● Verify all variables has proper spacing, punctuation and correct spelling
● Verify all data input is spelled correctly and has proper spacing
● Step is active
Card Template
● Fields Input Map includes the Billing Zip Code custom field and is preceded with a
comma.
● Have you verified all the above and the column still isn’t displaying? Try clearing your
browser cache.
Goal
● Explain the concept of usage pricing
● Define how to configure usage pricing for products
● Use usage pricing in the Cart
Tasks
1. Enable usage pricing
2. Create charge measurements and assign usage pricing to products
3. Configure an attribute and an attribute binding for estimated usage quantity
4. Test usage pricing in the Cart
5. Configure attribute-based pricing for usage pricing
6. Edit an order to use attribute-based pricing
Time: 45 mins
Usage pricing is a type of pricing used when a customer is charged based on their usage
(consumption) of a product or service, such as water, gas or electricity. Typically, at the end
of a period (often, a billing cycle), a service provider collects information about actual
service consumption and calculates total charges for that period. Unlike fixed charges,
which are predefined, usage-based charges fluctuate from period to period. Then, the
customer is charged for their actual usage by the billing system.
This makes sense when you’re talking about services that are installed and already sold to a
customer. Most of us have experienced this type of pricing as home or business owners. But
things get more complicated when you think about how to price and sell these services
before they’re installed—because the usage or consumption hasn’t happened yet! So, during
quoting and order capture, you need a way to estimate usage, so you have a defined price
that you can share and discuss with your customer.
In Industries CPQ, usage pricing provides the ability to price a product or service during
quoting and order capture based on an estimate of usage.
It’s important to understand that the customer may not be charged the estimated usage
price that displays in the quote or order. Instead, that information can be shared with the
customer to help them understand the price they may pay in the future, or it can be used in
contracts to lock in a rate for a set period of time. (Note that administering and billing
actual usage is handled by an external back office system.)
Some of the most typical use cases for usage pricing are:
● Long-distance call charges depending on the destination country and call duration.
● Internet data overage charges when a service provider charges for each gigabyte
over a certain threshold.
● Cloud computing charges based on the total time of resources being used.
Eliza has been asked to create pricing for a fixed rate electricity product. Just like it sounds,
this product provides customers with a fixed rate for electricity for the length of their plan,
even if electricity prices fluctuate in the market. Sounds great, right? The tricky part is that
the price must be based on past usage or consumption data for their location, and it must
include a component for electricity as a commodity and also a standing charge for service
to the house or location.
So, Eliza creates a new Fixed Energy product bundle that contains two child products, Unit
Rate and Standing Charges. The Unit Rate product represents the rate that the customer will
pay for electricity based on their estimated usage, and the Standing Charges represent the
standard fee to supply the location (or service point) with electricity service.
At the completion of this exercise, you’ll be able to order the Fixed Energy product in the
Cart with a calculated usage price based on an estimate as shown below. The calculation
will multiply the Estimated Usage Quantity by the Usage Price for each product to get a
Usage Price Total amount, which then will be rolled up the product hierarchy to get a total
for the product bundle. We’ll also implement attribute-based pricing to make the Usage
Price for each child product variable based on Distribution Region and Payment Method
using attribute-based pricing.
ALERT:
Several elements, such as object types, attribute categories, attributes,
picklists, and products, have been pre-configured in your training playground
to expedite the usage pricing exercise. In a sandbox or production
environment, the setup of these elements would have been done in
conjunction with the decision to enable usage pricing.
Eliza’s first task at hand is enabling the usage pricing feature so that B2B customers can
purchase energy products. Under the hood, there are a number of activities occurring to
ensure the feature is set up correctly, so you don’t have to. Once enabled, usage pricing
variables and usage pricing variable bindings (we’ll learn about bindings later) are created.
In addition, usage pricing fields are available in the Cart and are used for calculations based
on the usage pricing variables defined. You’ll see all this in action when we create a usage
pricing order later in this exercise.
1. Navigate to the Vlocity CMT Administration tab. You may need to click the More
dropdown menu to expand for additional tabs.
5. Click OK to the message that the feature has been enabled successfully.
Charge measurements describe units of measure that are used to price products or services
using usage pricing. For example, electricity can be measured in kilowatt hours (kWh). To
price based on electricity usage, you would need to create a charge measurement for
“kWh”.
So, in our scenario, Eliza needs to create two charge measurements, kWh and day. The kWh
charge measurement will be used with the Unit Rate product to price electricity usage, and
the day charge will be used with the Standing Charges product to price daily service charges.
Below you can see how the charge measurements you’ve just created will display in the
Cart.
Next, Eliza needs to create two pricing elements for the B2B price list that will be used to
create price list entries for the Unit Rate and Standing Charges products.
Creating pricing elements should be familiar to you as this topic was covered in earlier
modules. However, when creating pricing elements for usage pricing, you need to use a
special Charge Type: Usage Std Price. This allows you to specify a Usage Unit of Measure
(a.k.a. Charge Measurement). In this way, we can create one pricing element for the
electricity rate that will be priced using kWh and another pricing element for standing
charges that will be priced per day of service.
Name $0.0123
Code U-0.0123
Amount 0.0123
Active ✔
Name $0.87123
Code U-0.87123
Amount 0.87123
Active ✔
Lastly, Eliza needs to create price list entries and assign usage pricing to two child products,
Unit Rate and Standing Charges. Creating price list entries should be familiar to you as this
topic was covered in earlier modules.
e. Enter the following on the PRICE LIST ENTRY tab and click Save:
Field Value
Base Price ✔
Active ✔
f. Search for the product Standing Charges from the Vlocity Product Console
and select it.
g. Click on the Pricing facet.
h. On the CHARGES tab, click New.
i. Enter the following on the PRICE LIST ENTRY tab and click Save:
Field Value
Base Price ✔
Active ✔
The screen capture below displays the price of the energy products (using attribute-based
pricing – we’ll get to that soon!) and the field name on the Order Product (OrderItem)
object in the Cart.
Now that Eliza has created charge measurements and pricing elements for usage pricing
and assigned a usage price list entry to each product, next she needs to configure the
variable element in the pricing calculation: Estimated Usage Quantity.
Estimated Usage Quantity will store the estimated amount of electricity the customer will
use, so that it can be used in the usage pricing calculations for the quote or order.
Remember that the Usage Price Total is calculated by multiplying the Usage Price by the
Estimated Usage Quantity. But notice that the estimated quantity has a double burden; not
only does it need to be visible and editable by users within the Cart, it also needs to be
included in the pricing engine’s calculations and rollups. To achieve this, Eliza will create an
attribute binding.
An attribute binding links an attribute to a field on an object, so that as you change the
attribute’s value in the Cart, it is also changed in the bound field.
ALERT:
Attribute bindings are a one-way street. You cannot change the bound field’s
value and have the new value populate the attribute’s value in the
JSONAttribute field. The attribute always drives the bound field—and not the
other way around.
Usually, it’s because you want to use the value in some kind of calculation or process. When
an attribute value is embedded within the JSONAttribute field, it’s very accessible to the end
users in the Cart, allowing them to change its value easily. But, as it turns out, it’s not very
accessible to any other processes! You can’t monitor its value and trigger a workflow from it,
for example. And importantly for our usage pricing scenario, the pricing engine can’t use
attribute values embedded in the JSONAttribute field for its calculations. They need to be
stored in a field on the line item.
So, in order to enable usage pricing, we must create an attribute binding to link the
attribute to a field, and then the field can be added to the pricing engine’s calculation logic
(via a pricing variable binding).
In our usage pricing scenario, we will bind the Estimated Usage Quantity to an existing field
that’s provided as part of the application, Usage Quantity
(vlocity_cmt__UsageQuantity__c) on the Order Product (OrderItem) object.
Then, if you plan to use the attribute binding in pricing, you must also:
NOTE:
In our scenario, we will use an existing field that is already bound to an
out-of-the-box pricing variable, so essentially, it’s been done for us. But it’s
important to note that if you were using a custom field, this is a key step that
would need to be done.
You might have noticed in the steps above that you need to create a Vlocity Object as part
of creating an attribute binding, and naturally, you’re probably wondering what that is.
While Salesforce Industries has many objects that it has added to Salesforce’s data model,
there are some specific objects that the shared catalog considers its responsibility to
manage. These objects are called Vlocity Objects, and they can be viewed in the Vlocity
Objects and Object Types tab. You’ll recognize most of them because they are precisely the
objects you work with using the Product Console—objects like Product2, Attribute, Price List,
Rules, and so on. Vlocity Objects adds a layer of metadata around the object itself, and the
shared catalog uses the metadata to perform its functions.
So, when you create an attribute binding to a field on an object that is outside the shared
catalog’s “field of vision”, so to speak, you must also define the object as a Vlocity Object so
that the shared catalog knows about it. You only need to do this once for each object. In
our scenario, we need to do it for the Order Product (OrderItem) object, and then you
could create multiple attribute bindings to different fields on the Order Product object. If
we wanted to enable usage pricing during quoting, we’d need to also create a Vlocity Object
for the Quote Line Item (QuoteLineItem) object. And so on, for each object that has a
field for which you want to create an attribute binding.
1. Create an attribute.
Code ATT_EST_USAGE_QTY
Active ✔
a. Using the Lightning App Launcher, enter Vlocity Objects and Object Types
in the search box and click to select.
b. Click New.
c. Select Object as the record type on the New Vlocity Object or Object Type
window and click Next.
Next, Eliza needs to bind the Estimated Usage Quantity attribute to the Usage Quantity field
on the Order Product (OrderItem) object.
a. Navigate to the Vlocity Attribute Categories tab. You may need to click the
More dropdown menu to expand for additional tabs.
b. Select List View All.
c. Select the Usage Pricing category.
d. Click on the Estimated Usage Quantity attribute.
e. Click on the Related tab and click New.
f. Enter the following to create a New Vlocity Attribute Binding:
Field Value
g. Click Save.
Lastly, Eliza will assign the bound attribute, Estimated Usage Quantity, to the Fixed Energy
child products, Unit Rate and Standing Charges.
e. Repeat these steps to assign the Estimated Usage Quantity attribute to the
product Standing Charges.
Remember earlier when we enabled the usage pricing feature and we mentioned
that several activities occur behind the scenes when features are enabled? Well,
when usage pricing was enabled, pricing variables for usage and usage pricing
variable bindings were created. You’ll notice that these usage pricing variable
bindings are similar to the attribute binding you just created.
e. Click on the edit icon next to Usage Std Price and then click on the Pricing
Variable Bindings facet.
f. Notice the field binding associated with each sObject type.
The screen capture below displays the attribute (Estimated Usage Quantity) bound to the
vlocity_cmt__UsageQuantity__c field on the OrderItem object where the pricing engine
detects it and can perform calculations, based on the pricing variables defined, in the Cart.
3. Click on the Power Launcher’s search field and select Configure Order.
5. Click the down arrow to Configure the Unit Rate order line item.
6. Enter 1000 for the Estimated Usage Quantity attribute. Close the Configure window.
7. Click the down arrow to Configure the Standing Charges order line item.
8. Enter 500 for the Estimated Usage Quantity attribute. Close the Configure window.
9. Notice how the pricing engine calculates the Usage Price Total from the bound
attribute and pricing variable bindings created.
NOTE:
If usage pricing doesn’t display or calculate correctly in the cart verify that you
have configured usage pricing correctly for each step. Then, run the
maintenance jobs -- Clear Managed Platform Cache and Refresh Platform
Cache.
In many Energy & Utilities deployments, usage pricing alone is not enough. The cost of
energy commodities fluctuates and will vary based on customers’ geographic location.
Therefore, in addition to usage pricing, Eliza needs to create a decision matrix to change the
usage price of the Unit Rate and Standing Charges products using attribute-based pricing.
And, in order to use attribute-based pricing with usage pricing, you need to extend
attribute-based pricing to work with new usage pricing variables.
UP Currency Output
CM Text Output
l. Click Done and wait for the file upload to process. Click Refresh, if necessary.
m. Notice the following:
i. Products in the matrix, along with their attributes and values in the
Characteristic Name and Characteristic Value columns.
ii. UP column = usage pricing
iii. CM column = charge measurement
Once the decision matrix is defined, Eliza then needs to create a usage pricing procedure
expression set so that the energy products assigned usage pricing are calculated based on
the UsagePricingMatrix.
a. Navigate to the Expression Sets tab. You may need to reopen it using the
Lightning App Launcher.
b. Click New.
c. In the New Expression Set dialog box, enter UsagePricingProcedure for
the Name and click Save.
d. Click the Related tab and next to UsagePricingProcedure V1, click the
f. Click the Start Date Time / Date field and select yesterday’s date from the
calendar, and select Save.
k. With the Lookup Table element selected, click the Element Details tab in
the left panel, and check the Include in Output checkbox.
Field Value
Decimal 2
Field Value
Decimal 2
Decimal 5
Resource Name CM
q. Click Done.
r. Click the plus + sign and add a Calculation step to the expression set.
i. In the Formula field, search for and select UsagePricingMatrix__MRC.
ii. In the Output Variable, search for and select REC_MNTH_STD_PRC.
iii. Click the Element Details tab in the left panel, and check the
Include in Output checkbox.
s. Click the plus + sign and add a Calculation step to the expression set.
i. In the Formula field, search for and select UsagePricingMatrix__NRC.
ii. In the Output Variable, search for and select OT_STD_PRC.
iii. Click the Element Details tab in the left panel, and check the
Include in Output checkbox.
t. Click the plus + sign and add a Calculation step to the expression set.
i. In the Formula field, search for and select UsagePricingMatrix__UP.
ii. In the Output Variable, search for and select USAGE_STD_PRC.
iii. Click the Element Details tab in the left panel, and check the
Include in Output checkbox.
u. Click the plus + sign and add a Calculation step to the expression set.
i. In the Formula field, search for and select UsagePricingMatrix__CM.
ii. In the Output Variable, search for and select CM.
iii. Click the Element Details tab in the left panel, and check the
Include in Output checkbox.
Sequence 9.5
Active ✔
ALERT:
All attribute pricing steps must occur before the Initialize Pricing Context step;
therefore, the sequence number must be before 10.
ProcedureName UsagePricingProcedure
MatrixName UsagePricingMatrix
DecisionMatrix true
j. Click Done.
Finally, Eliza needs to extend the PricingPlanHelper Apex Class to include the
USAGE_STD_PRC variable mapping to ensure the USAGE_STD_PRC value coming from the
expression set is saved into the vlocity_cmt__UsageUnitPrice__c field.
f. Click Save.
Eliza will now see all her hard work come together to price an energy product in the Cart
based on values defined in the ABP matrix and estimated usage consumption attribute
field.
1. Navigate to the Orders tab and select the Energy Usage Pricing Order.
2. Click on the Power Launcher’s search field and select Configure Order.
3. In the cart line item for Unit Rate, click the down arrow and select Configure.
4. Enter A for the Distribution Region attribute. Close the Configure window.
5. What price displays in the Usage Price column and Usage Price Total column?
________________________________________________________
6. Change the Distribution Region to B and the Estimated Usage Quantity to 1050.
Close the Configure window.
7. In the Usage Price column for Unit Rate, click on the price and select the Price
Details icon. Notice that the price returned is from the UsagePricingProcedure
based on the data entered in the matrix. Close the Price Details window.
NOTE:
The Usage Price column displays as five decimal places which was defined
when you created the UsagePricingProcedure. However, it defaults to two
decimal places in the Details window. Custom configuration of the Details
window would be required to alter the precision of decimal places.
8. In the Usage Price Total column for Unit Rate, click on the price and select the Price
Details icon. Notice the calculation to arrive at the total usage price. Close the Price
Details window.
9. In the cart line item for Standing Charges, click the down arrow and select
Configure.
10. Enter A for the Distribution Region attribute. Close the Configure window.
The screen capture below displays all the relevant fields in the Cart after enabling Usage
Pricing and binding an attribute to a field.
Goal
● Review the requirements below and challenge yourself to create attribute-based
pricing for the iPhone Xs product
● Challenge exercises solidify what you learned in the exercises, build your skills, and
allow you to make mistakes -- which is how you will master this application
Tasks
1. Review product attributes
2. Set up attribute-based pricing matrix
3. Test attribute-based pricing in the Cart
Time: 45 mins
1. The Apple iPhone Xs (Product Code C-PHO-010) is available in three finishes – Silver,
Space Gray and Gold.
3. Customers have two payment choices: Pay in Full or Pay Monthly. Use the graphic
below to understand the one-time and recurring pricing models.
4. Volume discounts are available to customers buying over 50 units. Use the graphic
below for volume discount pricing.
TIPS:
● Did you enter the data in the matrix using proper case and/or
appropriate spacing?
● Are multiple attribute names separated with proper punctuation?
● Have you double-checked your spelling?
● Does the color of the Apple iPhone Xs affect pricing? Does it need to
be included in the matrix?