SAP CPQ Setup and Administration Guide
SAP CPQ Setup and Administration Guide
SAP CPQ Setup and Administration Guide
1 Administration. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.1 Setup Home. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.2 Supported Browsers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.3 System ID (Object Identifier). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11
1.4 SAP CPQ Tenant URL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
6 Workflow-Approvals. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416
6.1 Workflow. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416
6.2 Workflow Permissions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421
6.3 Workflow Actions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424
Standard Workflow Actions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .425
Action Details. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429
Reprice, Reconfigure, and Conditional Reconfigure - Differences. . . . . . . . . . . . . . . . . . . . . . . 432
Approval Reminder Action. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433
Auto Quote Expiration. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433
Global Condition for Quote Action. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434
6.4 Statuses. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434
6.5 Outbound SAP CPQ Emails. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435
6.6 Notifications. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439
Notification Implementation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441
Approval via PDA. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443
One-click Approval HTML Email Template. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443
6.7 Email Lists. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448
6.8 Approvals. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
Approval Rules. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
Likelihood of Approval. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470
Approval Auto-Reminder. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471
Out of Office for Approvers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472
Approving Quotes in One Click. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .473
6.9 Required Fields By Workflow Action. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475
6.10 Item Actions Workflow. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477
7 Pricing/Calculations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479
7.1 Cart Fields Administration. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480
Status - User Group Grid. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
Adding/Removing Editable Fields. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483
Editable Quote Comment Field. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487
Recurring Rolled-Up Fields. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489
Rolled-Up Cost and Margin. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493
7.2 Pricebooks. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .493
Effective Dates for Price Book Entries. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496
Pricing Dynamic Part Numbers and Attributes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502
Promotions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506
7.3 Currencies. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517
7.4 Markets. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519
11 Scripting. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 712
11.1 Create a Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 712
Scripting General Guidelines. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 713
11.2 Global Script Events. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .716
11.3 Custom Actions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 720
11.4 Custom Calculations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 722
11.5 Script Workbench. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 723
15 Security. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 791
15.1 Automatic Data Deletion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 792
Blocked Data. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 793
General Deletion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 796
Audit Trail Deletion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .803
15.2 Personally Identifiable Information. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 804
Personal Data Log. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 806
View/Export Personally Identifiable Information. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 807
15.3 WSDL and Certificate Management. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 811
Certificate Management. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 812
WSDL Management. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 816
15.4 Access Rights. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 817
Assign Access Rights for Setup Sections and Entities. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 819
Select Access Rights Administrators. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 820
Access Rights and Custom Table Deployment. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 820
View Access Rights Permissions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 821
15.5 DKIM Support for Outbound Emails. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 821
Test DKIM Signature. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 823
15.6 Content Security Policy in SAP CPQ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 823
15.7 Credential Management. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 825
15.8 Multi-factor Authentication. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 826
15.9 Security Recommendations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .826
Explanation of Table Headings. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .828
This guide is intended for administrators to understand SAP CPQ features and learn how to use them. The
descriptions in this guide are comprehensive and make the central source of documentation for all existing and
new SAP CPQ functionalities.
Note
For information and instructions on SAP CPQ integration capabilities, check the SAP CPQ Integration
Guide.
If you are a beginner user of SAP CPQ, first read the Getting Started Guide to get familiar with the system.
Once logged in, you can access the administrative side by clicking Setup, which is located in the main
navigation toolbar on the left side of the page. Clicking this button displays the Setup Home page.
• Script Performance - the top five scripts with the longest average execution time that were executed during
the previous day are listed here. You can view the script name, longest execution time, average execution
time, and the number of executions. In addition, you can click View More to access the Script Performance
page, where you can find a detailed overview of script performance.
• Storage Status in Current Month - two graphs visually representing the usage of the file system and the
database are available. There’s also a numerical representation of the total and used storage space in
gigabytes.
• Storage Usage per Data Type - a graphic and numeric overview of storage usage for the last six month is
displayed here, according to each data type: images, documents, proposals and the database.
• Release Updates and Documentation - here, you are provided with quick access to the What's New
documentation and the release schedule.
Related Information
This topic contains the list of browsers currently supported by SAP CPQ.
For SAP CPQ to function properly, enable cookies and Javascript for all browsers.
Different objects in SAP CPQ have their own unique identifiers or system IDs.
System ID is the identifier for: products, attributes, attribute values, categories, product types, tabs,
configuration templates, details templates, user types, shipping method, global scripts, custom actions,
custom calculations, product-level scripts, and responsive design templates.
Note
System ID is required when creating global scripts, custom actions, custom calculations, product-level
scripts and responsive design templates, both in Setup and via API. It is automatically generated when one
of these entities is created in Setup, and it needs to be provided when they are created via API.
System ID is one of the fields that are displayed when you add or edit an existing object. It’s displayed under
the name field or next to it (such as the Attribute Value form). System ID is created automatically based on the
name that you type in the name field. As soon as you finish typing and leave the name field, either by clicking
elsewhere or by pressing Tab on the keyboard, the System ID field is populated with the value that is unique for
this entity. System ID is constructed by replacing the spaces in the entity name with underscores and adding
the suffix _cpq at the end. For example, if you create product with name Product One, SAP CPQ creates
the system ID with value Product_One_cpq. If this value is already assigned to another product, SAP CPQ
attempts to create Product_One_1_cpq, then Product_One_2_cpq, and so on.
• For attribute values, the system ID is created based on the attribute value code (not display value) +
attribute name.
• During product export, the column Product System ID is added to the Microsoft Excel file.
• During product import, the system decides, based on the Product System ID column, whether the product
is going to be updated or created. If the column has a value for the particular product, the product is going
to be created if the system ID doesn’t exist in the SAP CPQ, or updated if it already exists. If the column is
missing or it’s empty, SAP CPQ assigns a system ID to the product the same way as if the administrator
created the product manually.
• When products, attributes, attribute values, categories, product types, tabs, configuration templates,
details templates, user types, shipping methods, global scripts, custom actions, custom calculations,
product-level scripts, or Responsive Design templates are deployed/sent to other environments, their
system ID remains the same. If an entity with several versions is deployed to another environment, all
versions will have the same system ID, and the entity can be filtered according to the creation dates of its
versions.
Due to the effort to make the SAP CPQ infrastructure more flexible and to improve the overall agility and
resilience of the system, the format of the SAP CPQ URL needs to be changed.
The new tenant-specific URL format will be an improvement over the current URL format, providing you with
the following benefits:
• An SAP-wide standard URL format that will facilitate integrations and third-party cookies
• Improved bookmarking
• Faster login
• An easy way to see which tenant you are using
• DC-agnostic URL format (stable in case of tenant moving)
• An easier way to configure SSO per tenant (the limitation for the IDP-initiated scenario is removed)
New URLs will contain the tenant name and end with cpq.cloud.sap (for example, https://
domainName.cpq.cloud.sap). It is possible that the domainName in the URL will be slightly different from
the actual tenant name in order to standardize the format and make it unique globally, although in the majority
of cases it will remain the same.
You can double-check whether the new URL format is set up in your tenant in the Setup Home page. If the new
URL is set up, it will be displayed in the top left corner.
Once the tenant URL is enabled, you need to make changes in the system to avoid breaking changes. Check the
section Tenant URL Migration to find out what you need to adjust in SAP CPQ and learn how to do it.
In addition to preventing the breaking changes, once the tenant URL is enabled, you will need to switch
from using the old URL to using the new URL. The final deadline for switching to the new URL completely
is July 31, 2023. Up to that point, you can adjust to the new tenant URL at your own pace, by managing
• Allow Old URL – when this setting is selected, you can use both the existing environment URL and the new
tenant URL interchangeably.
• Allow Old URL with Warning – when this setting is selected, you can use both the existing environment URL
and the new tenant URL interchangeably, but every time the old environment URL is used, a warning will be
recorded in the Log, informing you about the occurrence where the old URL needs to be replaced with the
new one. Warnings will be recorded in the Log every time user login is performed, which includes logging in
via the login page, federated single sign-on, SOAP APIs, receiving tokens for APIs, and so on.
• Forbid Old URL – when this setting is selected, you can access SAP CPQ only via the new tenant URL. The
old environment URL can no longer be used if this option is selected. This is the default value for all new
tenants.
When the tenant URL is enabled for you, the parameter will first be set to Allow Old URL. After the users and
administrators of SAP CPQ have been instructed to switch to using the new URL, you will need to change
the parameter to the Allow Old URL with Warning mode. Note that the end users of SAP CPQ will need to be
informed about updating their personal bookmarks. Once you have done that, you will be able to track every
use of the old environment URL in the Log, which will allow you to rectify these situations. For example, if you
forgot to replace the old URL with the tenant URL in the settings of an integration during the migration phase,
the logged warning will inform you about that issue and you will be able to resolve it.
Note
Records in the Log aren’t permanently retained, which is why we recommend that you regularly track the
use of the environment URL.
Finally, once you have successfully adapted to the new URL and warnings are no longer appearing in the log,
you need to switch the parameter mode to Forbid Old URL. This should be done no later than July 31, 2023.
Learn how to adjust your environment to use the tenant URL instead of environment URL.
Federation Module
To avoid breaking changes, administrators need to download the SAP CPQ metadata file and upload it to their
identity provider.
Make sure that you don’t make any other changes, all other settings should stay unchanged.
Edit the connected environment, replace the old with the new tenant specific URL. Select Tenant URL to disable
the domain field.
Make these changes in both the source and the target environment.
Guest User
Users who are logging in using their credentials no longer need to enter the domain in the login page.
Certificate Management
Existing certificates are valid after you migrate to tenant URL. You don’t need to delete or update them.
However, if in your models you are relying on the URL from the certificate issuer, then you need to generate a
new certificate which will contain the new URL. That way you will ensure uninterrupted work.
Set the parameter Tenant URL Mode to Allow Old URL with Warning. Check the Log for warnings. Replace the
URLs in the requests and remove the domain.
Hardcoded URL
If you’ve hardcoded the SAP CPQ URL in scripts, email notifications and document generation templates, make
sure you replace the link with the new tenant URL link.
IP Address Whitelisting
If you have previously whitelisted the SAP CPQ IP address, note that the new URL has another IP address,
which needs to be whitelisted, too. You can check if your current URL is whitelisted by opening the command
prompt and pinging the current URL.
Integrations
If in the configuration of any integration you had to specify the SAP CPQ domain, you no longer need to do that.
The system has been adapted for this change and the field for entering the domain has been removed from the
user interface.
Note
Wherever you’ve used the old URL, you now need to replace it with the new SAP CPQ tenant URL. Make
sure to revise your models and make updates of the URL where needed.
Below are detailed instructions for specific adjustments that you need to make for various integrated systems.
On the AdobeSign side, go to API Acrobat Sign API Configure OAuth for Application . Update the field
Redirect URL by replacing the old environment URL with the new tenant URL.
DocuSign
On the DocuSign side, go to Settings Apps and Keys Actions Edit Additional Settings
Redirect URLs . Update the redirect URL to the following format: {tenantUrl}/admin/
DocuSignAuthentication.aspx, where the {tenantUrl} is the new tenant URL of your SAP CPQ
environment.
Log in to Oracle NetSuite CRM. Go to Setup Integration SuiteSignOn . Open the existing settings and
in the Connection Points tab, replace the old URL with your new tenant URL. Additionally, remove the domain
name.
MS Dynamics CRM
Update the script in step 5 in the section Customize SAP CPQ Quote form by replacing this code:
with this:
In the CRM Setup, under the URL field, replace the existing URL with the new tenant URL (https://
domainName.cpq.cloud.sap/sso/mscrm.aspx) and remove the SAP CPQ domain. You should perform
the same steps for CRM 4.0.
Log in the environment with the tenant URL enabled and go to Providers SAP Integrations SAP Cloud for
Customer . Copy the landing URL from this page and replace the old one with it in SAP Cloud for Customer.
The path in SAP Cloud for Customer is explained in the documentation.
Salesforce
Go to your Salesforce environment and replace the existing SAP CPQ environment URL with the new tenant
URL in Custom Metadata Type and in Remote Site Settings.
Known Issues
There are two known issues that may be experienced when using the new tenant URL. These issues will be
resolved with the deployment of the 2305 release. However, up to that point, workarounds have been provided:
• The SAP CPQ SOAP API allows authentication using client certificates. In that case, the name of the
domain is passed in the request header. However, if the domain name is removed from the request header,
the API will not recognize the new tenant URL.
Workaround: if you are using client certificate authentication for the SAP CPQ SOAP API, make sure that
you do not remove the domain name from the request header.
• If you are using the new tenant URL and federated single sign-on, and the option SignOut is set to
Federated, a known issue can occur. Namely, once you sign into SAP CPQ via federation and then sign out,
a sign-out request is sent to the Identity Provider, and the subsequent response will log you out of SAP
CPQ. Following that, SAP CPQ triggers another sign-in request and redirects you to the login page of the
Identity Provider. However, if you log in at that point, you will be redirected to the old environment URL
instead of the new tenant URL.
Workaround: in this specific scenario, you will need to trigger the sign-on request from the Identity Provider
again, but using the tenant URL instead of the environment URL.
The following topics explain the administration of products and attributes in the SAP CPQ Setup.
Attributes provide users with additional preferences they can choose from when configuring products to be
added to a quote.
For example, if the configurable product is a Desktop Computer, its attributes can be RAM Memory, Hard Drive
and Processor. Attributes usually contain values. In the case of the RAM Memory attribute, the values can be
32GB and 64GB (one value can be selected here, but in some cases multiple choice is possible). In short, you
can select a specific set of characteristics for the product before adding it to a quote
Attributes are most commonly used for product characteristics, but apart from that, they can be used for:
• Calculations – formulas can be added as attribute values to perform calculations separate from the
Responder.
• Free input by the user – users can populate attribute values in the Configurator.
• Display of text to the user – certain information added to attribute values during attribute creation can be
displayed to users in the Configurator.
Attributes can be created, edited, copied and viewed in Setup Product Catalog Attributes . Here, you
can see the list of all existing attributes in the system. Attributes can also be created in the Attributes tab during
editing or creation of a configurable product. In both sections you can create one attribute at a time. If you wish
to import multiple attributes at once, you can do so in the Import/Export Setup section.
Initial four steps for creating attributes are the same for all attribute types and they are described in the
following procedure. Step 5 is used for creation of all attribute types except containers, autocomplete and
measurement attributes.
Procedure
The creation procedures for container, autocomplete and measurement attributes have different steps
from other attribute types. If those are attribute types you're creating, follow one of these procedures:
• Click Add Products as Values and select products you wish to use from the table that pops up.
• Populate the Value and Value Code for as many rows as you need for the attribute.
The Add Values button is used for adding additional rows.
You can use Ranking to arrange the order in which attribute values are displayed in the Configurator.
Related Information
This table contains description of general fields that should be populated when creating or editing each
attribute type.
Attribute Name Required field that should contain the name under which
the attribute is going to be displayed to the user.
Attribute Type Refer to Attribute Types [page 22] for more information.
Check if attribute is in use See which products currently reference this attribute. This
button isn't interactive when a new attribute is created,
since it isn't yet in use.
Note
Rules that are created before the 2208 release and use
CTX tags are not displayed on the Check if attribute is
in use list. As a workaround, open the rule that has the
CTX tag and save it again without making any changes.
After this, the rule should be visible on the list of used
attributes.
Contains Personally Identifiable Information By selecting this checkbox, you confirm that the
information [page 804] in the attribute can be used
to identify an individual uniquely (passport number,
for example), or that the information can be used
in combination with other information to recognize an
individual (for example, race and date of birth).
Suppress Information Logging The toggle can be activated only if the Contains Personally
Identifiable Information toggle is active. By activating it you
confirm that the attribute contains information whose old
and new values shouldn't be logged, as the unauthorized
acquisition could be harmful to the concerned individual.
Related Information
There are several attribute types you can choose from when creating an attribute.
This attribute type has a tabular structure which can be dynamically expanded with other attributes
or products. Its columns are defined in Setup, while its rows can be added and deleted during product
configuration.
Container attributes are the most customizable attribute type in SAP CPQ. They are a good choice for
business scenarios in which you need to offer customers a product with multiple options, each one configured
individually. One container attribute can use multiple simple products as source of its values, as well as other
attributes. You can also build formulas for retrieval of values from custom tables.
You can create and update container attributes in Setup Product Catalog Attributes . Compared with
other attribute types, these attributes have the most complex creation procedure, which is performed in
several tabs.
Prerequisites
Follow the first four steps of the common attribute creation procedure [page 20].
Procedure
The container will use No products - The container does not reference any
products, but its columns can reference other attributes.
Note
Only simple products can be looked up by their part
numbers.
Enable Paging for Container Breaks down the extensive number of rows added during
configuration into several pages.
Default number of rows per container page Determines the number of rows displayed per a page by
default (can be edited by users during configuration).
Min Container Rows The minimum number of rows that need to be added during
configuration.
Max Container Rows The maximum number of rows that can be added during
configuration.
To add a new column, go to Setup Product Catalog Attributes Columns tab and click Add
Column. The following options are displayed in the tab:
Footer Label The text displayed below the column. It can be used for
displaying totals of a formula.
• Sum
• Average
• Formula
Data Type The format of data (String, Number, Currency and Date).
Display Type The visual appearance of input fields. The available choices
are Label, TextBox, CheckBox, DropDown, SelectList, RadioB
utton, Multiline, Selector Radio Button, Selector Check Box, A
utocomplete With Custom Table, Autocomplete With Quote T
able.
Decimal Places (required) The number of decimal places of entered values. Displays if
Number or Currency are selected in Data Type.
Note
If you select the Product Attribute column type, you
can't change the attribute values that will be displayed
to users, as their visibility is determined by the
product's settings. If you wish the column to reference
some values of an attribute, but not all of them, you
can opt for the Stand-alone Column type and one of the
display types listed above.
Calculation Formula Used for automatic evaluation of column value. Enter the
formula or construct one with the Formula Builder.
Always include in KO context Used for exposing a hidden column in knockout context if
some information stored within needs to be sent through
a JSON file via the HTTP response. Activating this toggle
switch does not make the column visible to end users.
Applicable in responsive design only.
Contains Personally Identifiable Information Information that can be used to identify an individual
uniquely [page 804] (passport number), or information
that can be used in combination with other information to
recognize an individual (for example, race and date of birth)
Once you define a column, you can edit permissions that user types and permission groups will have during
configuration.
Column Permissions
In this section, you can select the permissions which will be applied to the columns depending on the
user types and permission groups users belong to. If you enable the Same permission for all Permission
Groups toggle switch, all users will see the column in the same way. However, if you deselect the toggle switch,
you have more freedom in assignment of different column rights to different user types and permission groups.
Properties are useful if you wish to reference a parent product from a container via rules, rather than
referencing the parent product from the container manually, when creating a container.
You can set a property from a rule in parent products and then use that property inside the container.
Procedure
The formula will be evaluated on each configuration modification. You can also leave the calculation
formula empty and apply container property from a parent product rule with a CTX tag.
4. In the Data Type (required) select one of the following: String, Number, Currency or Date.
If you select Number or Date, enter the number of decimal places the property will contain.
5. Enable the Include in JSON toggle switch if you wish it to be available in knockout context, so it can be sent
through a JSON file via the HTTP response.
Next Steps
Once you add properties, you can edit their ranks by clicking the Ranking button. The Rank popup
window displays, and you can drag and drop available properties in any order you wish.
Here, you can enable actions that can be executed on container rows in the Configurator.
Global Actions
Note
During configuration of a container row in its separate configurator, rules of the parent product are
executed along with the rules of the row product.
Row Actions
• Delete a Row
• Copy a Row
• Allow Multiple Copies - Users can choose how many copies of rows can be created and select which fields/
columns will be copied.
You can add rules which determine what can and can’t be done during configuration. If a validation rule is
violated, its message is displayed below the container.
For example, you can check whether the container is valid (that it contains properly entered or selected
values) by entering the <*CTX( Container(AttributeContainerName).IsValid )*> tag in Validation
Formula and when the rule is applied, the container validity will be checked once it is configured.
This topic contains the procedure for creating new validation rules.
Procedure
Container rows can be added or deleted during configuration, either manually or by a product rule. Minimum
and maximum numbers of rows that can be added are defined in Setup. Users need to select one product per a
row.
If there are no products in the container, or if there is just one, you can use the following tag in product rules to
add a row:
Container(Container Name).Rows.Add(1)
Related Information
When certain actions are performed in a container, the following events are triggered:
• Script on row added (onRowAdded) – executes when a user adds a new row.
• Script on row copied (onRowCopied) – executes when the existing row is copied.
• Script on row deleted (onRowDeleted) – executes when a row is deleted from the container.
• Script on row edited (onCellEdited) – executes when the cell content is updated .
These events are triggered only on user interaction. If a container is altered via another script (such as
adding a new row via Iron Python scripts), the events will not be triggered. For more information on available
contexts and arguments check this scripting help page.
If you want to give users an option to customize a complex product, such as a computer with several
configurable parts, you can do so by creating several User Selection attributes, which you will later store in a
single container attribute. For example, you can create a user selection attribute Operating System which will be
sold with the computer and add values such as Windows 7 and Windows 10 to it.
All of these attributes can then be stored into a container attribute as columns in the Configurator (user side).
This is done in the Columns tab of a container attribute.
Note
The selected column type is Stand-alone Column and the display type is DropDown in this example.
Each of the attribute values you select will be displayed in rows in the Configurator, in the form of a dropdown
list, for example.
Next, you need to establish according to which criteria you want the product to be priced. In this example,
we’ve added a Price column to the container attribute, which calculates the product price according to the
Term users select during configuration (for example, 12 months). To establish the pricing mechanism which
calculates the price according to the term, we’ve added the following CTX tag into the calculation formula while
setting up the Price column:
This tag multiplies each term by $20 for a monthly support fee per a computer.
After this is done, you can add the container attribute to the configurable product of your choice. It’s important
to add the pricing mechanism to the product, as well, to make sure the tag you’ve supplied during container
attribute creation works in the Configurator. This is done in the Pricing tab during the product creation.
Once all of this is done, the product configuration should be displayed like this in the Configurator:
You should choose this attribute type if you want to have values coming from other systems (CRM) and if they
are stored in custom/quote tables in SAP CPQ.
Autocomplete attributes sourced from either custm or quote tables are created in a relatively similar way. The
procedure contains steps for creating both types.
Prerequisites
Complete the first four steps of the common attribute creation procedure [page 20].
Procedure
1. Select Autocomplete – sourced from a quote table or Autocomplete – sourced from a custom
table in Attribute Type dropdown.
Once you select a quote table or a custom table as a source, its columns display in Columns.
3. Place these columns in Selected Searchable Columns, Display Label, Selected Display
Columns and Selected Column Value Code by clicking arrows next to each one of them.
4. Click Save.
This table contains description of fields and options that you should populate when creating the autocomplete
attribute type.
Custom Table/Quote Table Choose either a custom table or a quote table as a source
of attribute values. Quote tables are only supported by
the Responsive Design, so Classic Design users can't
select them as a source for autocomplete attributes.
Show Only Distinct Values (displays if a custom table is used Applicable if the same column is added to Display
as the attribute source) Column box and the Column Value Code. If this checkbox
is selected, the system does not retrieve duplicate values
from a column and only distinct values are displayed to
users.
Searchable (max 4) The values of columns you select can be looked up in the
dropdown search box in the Configurator.
Search Placeholder Text Once you tick a box in the Searchable (4) column, the
corresponding cell in the Search Placeholder Text column is
automatically populated with the text from Column Name.
You can fill in with the textual value you wish to be displayed
in the Configurator instead of the existing column name.
Column value code Values of the column you select in this field are exposed for
use in scripts and formulas.
Here, you can see an example of an autocomplete attribute sourced from a custom table.
There is a product Phone Case to which we wish to add an attribute. We can use a custom table
as a source to create an autocomplete attribute Decoration that has Price and Design columns. The Price column
should contain price values which correspond to the design value in the same row. After that,
The Price column was selected in the Column Value Code and its values were exposed in construction of a
pricing formula in the Products Phone Case Pricing tab:
This ensures that the Price column values are used for the pricing mechanism in the product configuration. For
each selected value in the dropdown, a corresponding price appears in the Configurator.
These attributes can be used for displaying values of measurement types which were previously defined in
Setup Product Catalog Unit of Measurement .
You can use this attribute type when you wish to give users an option of configuring measurable aspects of a
product, such as cable length, for example.
Prerequisites
• Add a unit of measurement [page 92] which is going to be associated with the values you add for this
attribute.
• Complete the common attribute creation procedure [page 20].
Procedure
A table displays.
4. Enter the Value and Value Code for each row.
The Value System ID will be generated automatically, according to the value you’ve entered.
5. Click Save.
By selecting the attribute type User Selection, you create an attribute with a list of selectable values. This
attribute type can also be used for calculations and other uses for attributes if you prefer that it not be
restricted to any specific data type.
User selection is a commonly used attribute type which doesn’t have any specific limitations and can be used
in a variety of scenarios. The simplest scenario is for the user to select one or more attribute values in the
Configurator. For example, a configurable product that is a computer system can have an attribute Operating
System, with a list of selectable values representing specific systems. The attribute type used for that attribute
would be User Selection. Depending on the business specifics, different display types can be set for this
attribute on the product level: for example, Dropdown or Radio Button types allow selecting only one value,
while Checkbox allows selecting multiple values.
With this attribute type, the user can’t change the attribute quantity in the configuration. Instead, attribute
quantity is inherited from the main item. For example, if an operating system is selected for the product
Computer System with the product quantity set to 50, 50 computers will be ordered with 50 licenses for the
selected operating system). To enter a specific quantity for the attribute value, you need to use the attribute
type User Selection w/ Quantity Inputs for each Attribute Value [page 38].
In addition, the value selected by the user can trigger a product rule, or a formula can be calculated on that
attribute. For example, an attribute may offer a selection between values A and B and selecting the value B can
trigger a product rule causing another attribute to become available. In another example, if a numeric attribute
value is selected by the user, attribute quantity can be multiplied with that number. The selected attribute value
can be used in a formula in or outside that attribute.
Related Information
By selecting the attribute type User Selection with Attribute Quantity Input, you create an attribute with a list of
selectable values, and a quantity input field in the Configurator that applies to the entire attribute.
This attribute type is not restricted to any specific attribute display type. In the configurator, the user can only
set the quantity for the entire attribute, and not for individual attribute values. If multiple attribute values are
selected, the quantity of each value becomes equal to the quantity of the attribute.
Note
The User Can Enter Quantity function can’t be set for this attribute type.
In this example, the product is a computer system, with the attribute Keyboard, and a list of selectable
keyboard types as its attribute values. If the attribute type is User Selection, the quantity selected for the
product is applied to the attribute (if the product quantity is 50, you will order 50 computer system together
with 50 of the selected keyboards). However, if the attribute type is User Selection with Attribute Quantity Input,
the quantity of the keyboards you order is defined in the quantity input field in the configurator. That way, you
are able to order 50 computer systems and 25 keyboards.
However, this attribute type allows you to set the quantity for the entire attribute, but not for the specific
values. For example, if the Keyboard attribute has Checkbox selected as its attribute display type, you are able
to select multiple values (that is, different keyboards). In that case, the quantity for each selected value will
be the same as the quantity set for the entire attribute (by entering the quantity 25 and selecting the values
Keyboard A and Keyboard B, you will order 25 keyboards of each type). If you want to be able to specify a
number for each specific keyboard type, you will need to use the attribute type User Selection w/ Quantity
Inputs for each Attribute Value [page 38], instead.
Related Information
By selecting the attribute type User Selection w/ Quantity Inputs for each Attribute Value, you create an
attribute with a list of selectable values that each have a quantity input field in the Configurator.
The quantity input field displays only if Check Box is selected as the display type for that attribute on the
product level. The user is able to set the quantity for each attribute value in the Configurator, even when
multiple values are selected.
For example, the product is a computer system, and the attribute is Operating System with the values OS 1
and OS 2. For the purposes of your business, you wish to order 100 computers, but you want 75 of them to be
licensed for the operating system OS 1 and 25 of them to be licensed for OS 2. To achieve that, the attribute
Operating System needs to have the attribute type User Selection w/ Quantity Inputs for each Attribute Value
selected in attribute definition, and the attribute display type Check Box selected on the product level. As a
result, in the configurator, the values for the attribute Operating System will appear as check boxes, and next to
each check box there will be a separate quantity input field.
Related Information
By selecting the attribute type User Input or Computed (date, number or string), you create an attribute which
can contain the user’s personal input or a calculation. The value entered by the user, or the result of the
calculation, must be in the selected format: date, number, or string.
This attribute type can be matched with various attribute display type, but they can all be matched with the
display type Free Input, no Matching (to select this display type, make sure the attribute has only one value).
Note
User input attributes can also allow users to upload file attachments if the appropriate display type is
selected on the product level.
Date
The simplest way to use this attribute type is to combine it with the display type Free Input, no Matching and
make sure it only has one value. As a result, in the Configurator, the attribute appears as a date picker.
With this attribute type, your user input is limited to numeric values. By selecting the display type Free Input, no
Matching, a user input field appears in the Configurator where you can enter a number as a value.
For example, if the attribute is Number of Monthly Installments, in this field you can specify the number of
installments for your payment. However, if you wish to limit your user to entering numbers of installments
between 1 and 12, you can define this limit for the attribute on the product level, using the fields Valid Input
is From and To. By setting these fields to 1 and 12, the user will not be able to enter 13 as a value in the
Configurator, and if they attempt to do that, a message will appear. That message is also defined by you on the
product level, in the field Custom Range Error Text (for example: Only values between 1 and 12 are allowed).
Fields such as Valid Input is From/To and Custom Range Error Text can also contain formulas if you want them
to retrieve their values from custom tables. That way, these values can be maintained externally, which is useful
if the attribute is used in multiple products, and at some point, you wish to edit the value globally rather than
edit every individual product with that attribute.
String
In the most basic scenario, if this attribute type is combined with the display type Free Input, no Matching, you
can enter any type of string as a value.
Additionally, with the display type Display Only Text, you can create a text that will appear in the configuration.
One way to use this attribute type to create headers in the configurator to separate groups of attributes in
a single tab (if that is the preferred option for your model). For example, your product is a computer system
and has 10 attributes. You wish to separate them into two groups on the same product tab: the former 5 are
hardware, and the latter 5 are software. For that, you will need to create two attributes of the string data type
(one for each header). On the product level, edit the attribute and enter the text you wish to display in the
header in the field Hint (for the first attribute enter the hint Hardware and for the second, Software). Following
that, enable the toggle switch Spans Across Entire Row in Configurator, and in the layout, place the Hardware
header attribute before the 5 hardware attributes, and the Software attributes before the 5 software attributes.
Related Information
The Contract Duration attribute should be used to state the length of the contract for a subscription product.
This attribute type inherits all general attribute characteristic. It can be used in product rules and it can affect
the product price. For example, if the contract duration for a product subscription lasts for 1 year, the price is
1000$, and 1800$ for a two-year contract.
As of the 2011 release, this attribute type can be used outside the SAP CPQ – SAP Billing and Revenue
Innovation Management integration, in other billing scenarios, in both quote engines. In the Quote 2.0 engine,
the attribute values are propagated from the Configurator to the quote, and in the old quote engine, custom
implementations are required to create the connection between the attribute in the Configurator and the quote.
You can create and update contract duration attributes in Setup Product Catalog Attributes .
Prerequisites
Follow the first four steps of the common attribute creation procedure [page 20].
Procedure
• Rank – automatically set when rows are added. It can be altered at any time if you click Ranking and
rearrange the values.
• Value – attribute value, displays concatenated with the unit in the Configurator (for example, 1 year).
• Value Code – the value which is retrieved in scripting and formulas.
• Unit – a predefined value (Day, Month and Year).
• Value System ID – the ID of the attribute value, used to match attribute values during the product
deployment process.
3. Click Save.
Related Information
Billing Cycle attribute shows the billing frequency for a subscription product.
Billing Cycle is introduced mainly for the SAP CPQ – SAP Billing and Revenue Innovation Management
integration for Quote 2.0. In the integration scenarios, the new attribute is created automatically on all SAP
Billing and Revenue Innovation Management products.
As of the 2011 release, this attribute type can be used outside the SAP CPQ – SAP Billing and Revenue
Innovation Management integration, in other billing scenarios, in both quote engines. In the Quote 2.0 engine,
the attribute values are propagated from the Configurator to the quote and in the old quote engine, custom
implementations are required to create the connection between the attribute in the Configurator and the quote.
You can create and update billing cycle attributes in Setup Product Catalog Attributes .
Prerequisites
Follow the first four steps of the common attribute creation procedure [page 20].
Procedure
• Rank – automatically set when rows are added. It can be altered at any time if you click Ranking and
rearrange the values.
• Value – attribute value.
• Value Code – the value which is retrieved in scripting and formulas.
• Billing Period - predefined values.
The calendar billing periods start on the first day of a month and end on the last day of the billing
period. The rolling periods start on the day when the contract was made effective and end on the last
day of the billing period. The billing periods are month, quarter, half-year, and year.
• Value System ID – the ID of the attribute value, used to match attribute values during the product
deployment process.
3. Click Save.
This section contains information on how you can use IronPython scripts to control the appearance and
behavior of attributes in certain situations.
Using Iron Python, you can define whether an attribute is read-only, editable, or hidden.
• Read-only – attribute is disabled but it’s possible to set or change attribute value through Iron Python and
regular rules. In other words, the attribute behaves as if it was editable (in its default state), except that the
end user can’t interact with the attribute on the UI.
• Editable – attribute is enabled. This is default state of each attribute
• Hidden – attribute isn’t displayed in the Configurator.
This feature allows administrators to have attributes appear differently to various user types, or become
read-only once the quote reaches a certain status, or have a set of attributes that are read-only for certain
user-types, and so on. The Hidden option in Iron Python is an extension and override of Attribute Visibility
Restrictions that you can define in the Setup. Whatever you configure there’s reflected on the Hidden property
of the attribute, with the ability to be overridden by an Iron Python script.
Example 1
The snippet demonstrates how an Iron Python script can be used to check whether the particular attributes
should be made read-only based on the user-type. The script triggers when the configurator is entered to
configure the product. This
if User.UserType.Name == 'Customer':
Product.Attr("Interior Color").Access = AttributeAccess.ReadOnly
script checks if SAP CPQ is being accessed by a user that belongs to the user type "Customer". If this is true,
attributes “Interior Color” and “Exterior Color” become read-only. However, if the user doesn’t belong to the
“Customer” user-type, then all the attributes are enabled.
Example 2
In this example, the Iron Python script disables two attributes – “Interior Color” and “Exterior Color” only if the
quote status is Negotiation. The script triggers when the configurator is used to configure the product. When
the quote gets its status changed to Negotiation, two attributes get disabled.
Example 3
This example demonstrates how administrators are able to update the attribute value even if the attribute is
marked as read-only. The underlying Iron Python script of the Update value button is as follows:
Clicking the button updates the attribute-value through scripting even though the attribute is read-only.
Related Information
The purpose of this feature is to enable administrators to attach an IronPython script on button attributes. This
gives you the option to define a script that is executed when users click the attribute button. This can include
adding rows in the container, selecting attributes, as well as any other operation associated with attributes.
Administrators can attach existing global IronPython script on product attributes tab under the product
administration page, when the chosen attribute type is a Button.
If the autocomplete search doesn't find the script you’re looking for, the following message pops up:
Autocomplete search didn’t find any script with this name.
When the autocomplete search locates the script, it’s displayed at the top of the list. Arrow icons become
available for you to navigate and set the execution of the scripts. A Delete icon is also available if you want to
remove the added script.
A magnifying icon is located next to the autocomplete search box. When you click on it, a list of all global scripts
pops up.
• Name
• Execution Time
• Code
• Description
• Active
• Modified by
You can search the script by typing the text in each of these columns. You need to select the script by clicking
the Select button. Once you click the Select button, the script is added to the top of the multiple-select list.
Quantity can be entered by a user for an attribute at the attribute level, or at the attribute value level. This is
determined by what the attribute is set as at in the Attribute administration section. Attribute quantity can be
changed by the user in the configuration if the attribute type is either User Selection w/ Quantity Inputs for
each Attribute Value or User Selection w/ Attribute Quantity Input. If User Selection w/ Quantity Inputs for each
Attribute Value is selected as the attribute type, then in the configuration, the user is able to select the quantity
of each attribute value that is selected. So, if multiple attribute values are selected, the user is able to select the
quantity for each one individually. Attributes set as User Selection w/ Quantity Inputs for each Attribute Value
can only be check boxes.
If User Selection w/ Attribute Quantity Input is selected, then in the configuration the user is only able to select
the quantity of the attribute not the quantity of each individual attribute value. If multiple attribute values are
selected, then the quantity of each attribute value changes to equal the quantity of the attribute. With User
Selection w/ Attribute Quantity Input, the Can Enter Quantity function can’t be set.
If the attribute type is User Selection, then the user isn’t able to change attribute quantity in the configuration.
The attribute’s quantity is based on how it either inherits the main item’s quantity or the value entered in the
Attribute Quantity field depending on how you have the attribute set up on the attribute definition page.
Attribute type can be changed for existing attributes in the Attributes administration section. It’s also set when
creating a new attribute in the Attributes tab [page 60] of products.
Note
Attribute quantity can only be entered after a product that is already selected. The default attribute
quantity can’t be edited globally.
Related Information
The system looks specifically for the attribute named “ItemQuantity”. This controls not only the main item, but
if any pricing schemes are attached to it, then prices in the cart are affected also. There are a few different ways
that you can use the ItemQuantity attribute:
• You can expose the attribute to the user so that they can pick their quantity, which is then reflected in the
cart. In this situation, you would likely not allow the users to edit the quantity of the main item in the cart.
Quantity for the product would be handled within the configuration.
• Calculate ItemQuantity as a hidden attribute, which then is reflected in the cart. ItemQuantity in this
situation would be based on selections made from the user.
Related Information
Quantity in SAP CPQ can be defined on item level, attribute level, and attribute value level.
ItemQuantity Attribute
To allow defining quantity of product items in the Configurator, you need to add the ItemQuantity attribute to
a product and list it as line item. The attribute is predefined in the tenant when you register. The Quantity field
displays in the Catalog when configuring that product.
In quotes that contain simple products, editable Quantity field displays automatically. You don't need to add the
ItemQuantity attribute to simple products if you don't want to reference it somewhere in the application (for
example, container or for attribute values).
The following scenarios describe how the ItemQuantity attribute is typically handled:
• In the tier pricing model, pricing is based on ItemQuantity, and users are enabled to edit the quantity in
quotes by selecting User Can Enter Quantity. Example: a product costs $15 when buying one, $12 when
buying two, or $8 when buying three. If a user adds the product to a quote with a quantity of 1, the price
is $15. After changing the quantity to 2, the system passes it to the Configurator through the ItemQuantity
attribute. As pricing is based on this attribute, the price of the product changes accordingly to $12.
• You can expose the attribute to users so that they pick the quantity when configuring an item. Each change
of quantity is reflected locally in the quote, not in the Configurator.
• Calculate ItemQuantity via formulas as a hidden attribute. The formula is based on other selections a user
makes in SAP CPQ. The quantity is reflected on the quote.
In case of parent/child configurations, the system treats the ItemQuantity attribute and properly propagates
the quantity set up in the Configurator to quotes. However, the quantity doesn't propagate from quotes to the
Configurator (the quantity remains as it was initially defined).
For two attribute types (User Selection w/ Quantity Inputs for each Attribute Value and User Selection w/
Attribute Quantity Input) added as line items to products, the quantity box displays automatically in the
Configurator.
There are four quantity-related options that administrators can manage for all attributes listed as line items
(applies to all attribute types):
• User Can Enter Quantity - a checkbox in Products Product Attributes/Options Attribute Definition .
Selecting this option enables users to enter quantity to line items independently from the main item.
Whatever quantity is entered in the quote, it’s propagated back in the Configurator. The quantity users
enter in quotes overrides the default quantity, if defined.
• Inherit Quantity from Parent - a checkbox in Products Product Attributes/Options Attribute
Definition . When this option is enabled, the quantity of the line item is multiplied with the quantity of
the main item every time the quantity of the main item changes. The quantity is multiplied locally in the
quote and not propagated in the Catalog. If you go back to the Catalog, the product quantity remains as
initially defined.
• Default quantity (if not 1) - you can define default quantities of values in an attribute line item, so that
whenever the attribute is listed as a line item, the selected quantity is shown for each value. To define
default quantity, edit an attribute assigned to a product and in the Attribute Values section, select Show
More Columns. The Default quantity (if not 1) column is shown for editing quantity. The default quantity is
always overridden by the quantity users define in quotes or the quantity inherited from the parent item.
The NRC price of the item is multiplied by the default quantity and the multiplied price is shown in the
quote. However, the default quantity doesn't affect the recurring price, meaning that the recurring price
isn't multiplied by the default quantity like it’s the case with the NRC price.
• Formula for Calculating Attribute Quantity - to define a formula for calculating quantity on attribute level,
edit the attribute and find the field in the Additional Attribute Definition section. The maximum allowed
number of characters is 2500.
• Execute rules on attribute value’s quantity change – the system triggers rules after changing the quantity of
attribute values in the Configurator.
• Calculate Auto-Reconfigure only items with modified ItemQuantity attribute – defines whether SAP CPQ
automatically reconfigures only those items whose item quantity attribute value is changed.
• Propagate Quantity to Nested Products – propagates quantity from the main item to all its underlying
items.
• Quantity Sign – enables administrators to select if the quantity is ONLY NON-NEGATIVE, ONLY POSITIVE,
or POSITIVE AND NEGATIVE.
Managing attribute and attribute value quantity can differ depending on the type of the attribute listed as line
item. What follows are specific scenarios explained through an example:
Item Quantity
1.Laptop computer 1
1.1. Keyboard 1
1.3. Pen 1
When you enable users to enter quantity for attribute line items, the attribute quantity in the Configurator
displays the quantity of the last edited attribute in the quote.
Example
If you change the quantity of the line items in this order (Wireless mouse (Qty 2) > Pen (Qty 4) > Keyboard (Qty
2)), the quantity of the item in the quote is 2.
If the attribute inherits quantity from the parent item and has default values set for attribute values, the default
quantity of the value that was edited first displays in the Configurator.
Example
If you change the quantity of the line items in this order (Wireless mouse (Qty 4) > Pen (Qty 3) > Keyboard (Qty
2)), the quantity of the item in the quote is 4. The default value of the first selected item applies as quantity
to all other attribute values in the quote and can be overridden by changing the value of the parent item. If the
quantity of the parent item changes, the quantity of the line items changes accordingly. The same behavior
applies if users define the quantity of the attribute value and if there are default values defined in Setup. The
quantity of the value that was edited first applies to all quantities in the Configurator. If users change the
quantity of items in the quote, the quantity of the last edited item propagates back to the Configurator and it
applies to all quantities. After updating the quote, the new value applies to all items.
For container attribute line items, there are two additional fields you need to manage when adding columns to a
container attribute:
Note
To handle quantity, a column in a container attribute needs to reference the ItemQuantity attribute.
If quantity inheritance from parent items is enabled, and you add a configurable product with multilevel line
items to a quote, the quantity of the underlying line items is multiplied by the quantity of the most immediate
main item.
1 Computer 1
1.1 Monitor 1
1.2 Case 1
1.2.2 Motherboard 2
1.2.2.1 RAM 2
1.2.2.2 GPU 1
If users change the quantity of Computer to 3, the quantity of the underlying line items changes accordingly:
1 Computer 3
1.1 Monitor 3
1.2 Case 3
1.2.2 Motherboard 6
1.2.2.1 RAM 12
1.2.2.2 GPU 6
To translate multiple attributes via one Microsoft Excel file, you can export individual attributes or an entire
attribute type, update attribute translations in the resulting Microsoft Excel file, and import the file back to SAP
CPQ.
Procedure
• Export Attributes Translation - exports translations for all attribute types except Container.
• Export Containers Translation - exports translations only for Container attributes.
A Microsoft Excel file is downloaded to your computer. Attribute IDs, default names, and translations in
the selected languages, if defined, are displayed in the file. Also, a separate sheet contains attribute values
with corresponding translations. If Container attributes are exported, the file contains separate sheets for
translating container columns, properties, and validation messages.
5. Update attribute translations in the dedicated columns.
6. In Step 3, upload the Microsoft Excel file. The button on the right is for uploading files with container
attribute translations, and the button on the left for files with all other attribute types.
a. Click .
b. Browse for your file.
Otherwise, if the import file contains invalid records, an error message pops up.
d. Click Import report.
Invalid records are marked in red and errors are described in the Error column.
When you or your underlying users select a language in SAP CPQ, if translations were imported for the
attributes, the system displays them in the Catalog.
In the Attribute Import page, you can export/import attributes in several ways.
• Download a sample template, fill out attribute details, and then import the file.
• Export all attributes in SAP CPQ.
• Export all attributes, change details, and add new attributes, then import the file.
Sample Template
The sample template lets you easily upload multiple new attributes in SAP CPQ. To download the import
template, click Sample Template in the Attribute Import page. The Excel file contains three sheets:
• Attributes - enter attribute details having in mind the restrictions detailed in the following section. The
layout of the sheet matches the layout of the file that you get when downloading all attributes in the
system.
• IMPORTANT INFO - instructions on filling out the columns.
• Data Type Defn - the first column lists the attribute types supported for upload. The second column lists
the possible values for the Contract Duration attribute type and the third column lists the possible values
for the Billing Cycle attributes.
Upload Restrictions
When you are populating the Excel template to upload or update attributes, have in mind the following
restrictions:
• Each line in the Attributes sheet corresponds to one attribute value. If an attribute has multiple values, the
attribute name, attribute external Id, and data type are the same for each value of one attribute.
• The column ID needs to remain empty for new attributes. If you are updating an existing attribute, do not
change the values in this field.
• The first cell in the column Index needs to always have the value 1 and the number should increment by one
in the subsequent cells.
• The maximum length of values in the Attribute Name cells is 50 characters.
• Attributes that are already in the system must have the system ID. Do not change or remove their system
ID in the list. If you are adding a new attribute, leave this column empty. If you are adding a new attribute
value to an existing attribute, you need to provide the system ID of that attribute or otherwise the system
will create a new attribute.
To update attributes that are already in the system, download all of them in an Excel file, update data and then
upload the file.
Note
Other than updating the existing and adding new attribute values, don't make any other changes in the
template. The template must contain all the columns described in Sample Template for the upload to be
successful. No special characters are supported.
This type of Attribute Import is useful when you want to make an attribute that is determined by a unit of
measurement. It helps to remember that a unit of measurement, for example, Pressure, can’t be used on its
own without being attached to an attribute in a product.
Once you’ve defined your unit of measurement, you must create an attribute determined by that unit. In our
case, we have created unit Length and an attribute TestUnit; you must enter Measurement as your Attribute
Type. We've flagged Length M (meter) value as our Default unit of measurement.
Now, Attribute Import needs to be conducted. When you export your file, the Excel file includes a Measurement
column. The Sample Template also includes a new Measurement Column.
You must enter your Display Values (100 m and 500 m, respectively, in our case) and your unit of measurement
in the Measurement column. These values must be entered in the file being exported in order to be able to
convert these values from your default value (meters, in our example), to another value (kilometers and miles,
in our example).
Now, the file containing these conversions needs to be imported. You need to add the attribute to the product
you wish to configure.
Once you’ve done that, you’re ready to configure your product in Catalog. Length measurement values in the
Configurator have been converted to kilometers from meters.
Note
SAP CPQ supports the deployment [page 669] of products containing Attribute Measurement Types. If the
chosen Unit of Measurement hasn’t been defined by the destination environment, the system creates that
unit. If the unit exists, the values of the deployed Attribute Measurement Type are added to the Conversion
Excel file.
The Products administrative section allows setting up new and editing the existing products.
Accessing this administrative section from the Products administrative menu displays a list of all existing
products in the system. From here, you can also create new products manually, or import them [page 111] via
Excel.
Note
Products obtained via synchronization with SAP ERP and SAP Variant Configuration and Pricing have the
value Yes in the column Synced from Back Office. The column Synced from Back Office is visible only when
SAP CPQ is integrated with a back-office application, such as SAP ERP.
Note
Variant Configuration product versions cannot be added or deleted in SAP CPQ, because they are obtained
along with their own effectivity periods via knowledge base synchronization. Product versions of Variant
Configuration products are permanently active in SAP CPQ as this behavior is controlled by the back-end
system and SAP Variant Configuration and Pricing (one product can have multiple active product versions
at the same time). If a product has multiple active product versions, you can distinguish them by their
different knowledge base versions.
• Simple
• Configurable
• Collection of configurable products
• System (list) of configurable products
• Parent/child system (list) of configurable products
Note
While loading the product, all related products are loaded and rules for each of them are executed. After
that, catalog code, price, cost, image, and product name of the related product will be used as catalog
code, price, cost, image, and display value of the attribute value. All related products have to be loaded
because it takes too long to load the product in the Configurator.
If the formulas for catalog code, price and cost of the related product are simple (there’s no need to load
related product and execute rules in order to evaluate them) this option can be used to increase the speed
of product loading. In that case, formulas for catalog code, price, and cost of the related product are used
as formulas of the attribute value.
Product Changes
In the product table, columns Date Modified and Modified By include fields that show at what time and on what
day the currently active product revision was modified last time, as well as who executed the change. If none
When you click Edit, you can see Created and Modified data. The data is displayed for the version that you’re
editing (you can edit different product versions, not just the currently active one).
SAP CPQ logs a rule change only when the rule was changed (not every time you click the Save button). This is
checked for all rule fields: Rule Name, Description, Condition, Action, and so on.
Product Copy
A Copy button gives you an option to copy existing products in the system. It’s displayed for all products,
including aliases.
SAP CPQ copies the product’s active revision. If no revision is active, the revision with the highest revision
number is copied. All product fields are copied – all fields from the product setup, database, ASPX pages and
so on.
Context
Procedure
The list of all existing products displays. From this page, you can manually add new products, import them,
or import the products' translations.
2. Click Add New Product.
This tab is used for defining the basics of a product. It contains several logical segments for entering product
data.
General Fields
System ID (required) Generated automatically from the product's name and the
addition _cpq.
Order Item Type Order Item Type [page 81] determines the product model
in SAP CPQ (which fields are available for product adminis
tration, what columns are available on quote items and the
type of order that is created out of quote items when SAP
CPQ is integrated with a backend system, such as SAP S/
4HANA). Available only in Quote 2.0.
Product Type If a group of products with the same specifications (for ex
ample, hardware, software) isn’t available, clicking the Add
New button next the dropdown list creates a new Product
Type.
Unit of Measure This field enables you to quantify and track products. You
can only enter a three-character ISO code in the field, for
example, EA(each), PCE(piece), PK(pack).
Dynamic Description Displayed to the user in a quote. You can create it by combin
ing text and tags.
If Visible to Everyone option is enabled, all users can see the product. If not, only the selected user types,
companies, brands, and so on, can see it. The Start Date and End Date determine the period during which the
product is available.
Products for which a user has restricted visibility don't display in the product search results to that user.
Furthermore, users can’t add those products to the quote. For example, if a product is visible to everyone and
its category is visible only to a Sales Manager, the logged-in Sales Representative will not be able to view the
product because it’s part of a category for which they don’t have the visibility rights.
The following options and fields are optional. They simply offer a finer layer of product personalization.
Product Version There can be only one active product version [page 87].
The active product version can't be deleted.
External ID Used for referencing the product with the ID from an external
system.
UPC (Universal Product Code) Can be used for the European Article Number (EAN) or In
ternational Standard Book Number (ISBN).
MPN (Manufacturer Part Number) Needs to be used if the manufacturer part number is differ-
ent from part number used to mark the product (when sell
ing through channels).
Lead Time Used to describe how long it takes to get the product.
Family Code The family code is the key to validating that a consumer has
purchased a qualifying family of products.
Product Weight The label of this property depends on the value of the
application parameter Unit of Measurement. The value of
the product property is one of following: Product Weight in
GRAMS, Product Weight in KGS, Product Weight in LBS.
Large Image Displayed on user side when you visit the product's Details
page or modal, only when Large Image tag is used in the
ProductDetails templates.
Long Product Description A more detailed description can be added here, if needed.
Note
Product’s quantity can be changed with a special attrib
ute called ItemQuantity [page 45]. If this attribute exists,
then the system uses its value to determine the quantity
of the main item in the quote.
Allow Product Configuration Import Enables import of product configuration via an Excel file. An
IronPython script needs to be written in order to read the Ex
cel file and assign values from a file to the product attributes.
Configuration Tab .
Shipping Costs
This section contains shipping method [page 538] fields in which you can add or build a shipping cost formula
for each product.
When users add products to a quote, they can choose a shipping method which is calculated according to
shipping costs of products defined in this section by administrators.
In the Pricing tab, you can choose the Pricing Type for the created product. From the dropdown list, you can
select either Pricebook Lookup or Custom Pricing.
When checkbox Use recurring price and cost has been activated under in Setup General Application
Parameters , a new field for Base Recurring Price is added. For more details, see Recurring and Non-Recurring
Prices [page 533].
The base recurring price can be retrieved via CTX tags and scripting. BaseMRCListPrice object is
available in Quote.CurrentItem in CTX tag wizard and it has the following properties: DefaultDecimal,
DefaultDisplay, MarketDecimal, and MarketDisplay.
A Base Price can be entered for the product. If the price consists of more than just the base price plus the sum
of the attribute prices, then an expression can be entered through the Pricing Formula.
• Product price formula: Product price or main item price is calculated by computing the pricing formula if it
exists. Otherwise, if the formula is left blank, the product price is equal to the Product Price field plus a sum
of individual attribute prices, except for attributes that are marked as line items. Attributes that are marked
as line items display their own price and aren't included in the main item price. You can enter an expression
in the Cost field to determine the cost of the product.
• Product Cost Formula: Product cost or main item cost is calculated by computing this formula and adding
all attribute costs for all attributes that aren’t marked as line items to the formula. Attributes that are
marked as line items display their own cost and aren't included in the main item cost.
When Pricing Mechanism is Pricebook Lookup, pricing fields are hidden. A link View Prices is shown. Clicking on
View Prices brings back a popup window showing all pricebooks and all records for this part number in those
pricebooks.
Related Information
You can add attributes to individual products directly from the product configuration in Setup. It is also possible
to create new attributes there, and they will automatically be available in the list of all attributes.
By clicking Define New Attribute, you will be redirected to the Attributes creation screen. From there, you can
follow the attribute creation procedure [page 20].
By clicking Add Attribute, a popup displays with a list of available attributes, and you can select the attribute
[page 19] you wish to use in the product.
It's possible to define attribute behavior within each product separately. None of these options are mandatory.
Note
Not all options presented in the following tables refer to all attribute types.
Custom Label Replaces the default attribute name for this product only.
Formula Builder can also be used to retrieve the label from
other places in the application.
List as Line Item Attributes marked as line items are listed as separate items
in the quote and can be configured independently from the
products.
Hint Creates a tooltip next to the attribute label. The hint isn’t
displayed if the selected attribute display type is Hidden
Calculated.
The following options are displayed only if List as Line Item option is active.
Description What you enter here will be displayed below the line item
when it is configured.
User Can Enter Quantity Users can enter the quantity of child items independently
of the parent item quantity. If enabled, you can create a
formula with conditions which determine which permission
groups can edit quantity
Inherit Quantity from Parent Line item inherits the quantity of the parent item. If enabled,
you can create a formula to expand the basic conditions
(yes/no).
Rank within the Cart If there are several items, their rank determines the order in
which they are displayed in the Configurator.
In this section, you can define optional attribute values, which have an impact on the attribute’s behavior in the
Configurator.
Formula for Calculating Attribute Quantity You can add a formula which calculates the attribute
quantity during configuration. For example, the quantity of
one attribute can be conditioned by the quantity of another
one. The maximum allowed number of characters is 2500.
Custom Range Error Text You can define an error message which displays if users
enter an incorrect value.
Valid Input is From/To These options are displayed for container attributes. You
can build formulas which determine the input validity
period.
Spans Across Entire Row in Configurator The attribute stretches across the entire row, so no other
attributes are positioned next to it.
Show One Time Price Enabling this option shows the one-time priceof the
attribute in the Configurator. By default, they are disabled,
so the price of the product is the only one displayed.
Show Recurring Price Enabling this option shows the recurring price of the
attribute in the Configurator. By default, they are disabled,
so the price of the product is the only one displayed.
Triggers Execution of Rules When the attribute value is changed in the Configurator,
a product rule is executed. Applicable only if rules are
attached to the product.
Start Date/End Date The dates between which the attribute is available on the
product.
If the attribute is a container [page 22], this panel is displayed, and you can add scripts to the following
events which will be triggered once the listed events occur:
Attribute Values
Attribute values are automatically retrieved from the attribute's definition and displayed in the table of values.
Alternatively, you can add attribute values manually or you can add one of the products as a source of attribute
values.
• Add Values Manually – If selected, a table in which you can enter values, value code and rank displays.
• Add Values from Product List - If selected, a table with products displays, and you can select products from
which you will source the values.
After you make the selection of values, they will be displayed in the table below. You can use both manually
entered values and product values in one attribute. Values need to be selected in the Display to User checkbox
in order to appear in the Configurator.
Related Information
Attribute display types define how and if the attribute appears in the Configurator. They are selected in product
attribute definition. Specific attribute display types are associated with specific attribute types.
Autocomplete – Quote Table • Autocomplete – Sourced from a Used for autocomplete attributes
sourced from quote tables. The attrib
Quote Table
ute is displayed as a dropdown list with
• User Selection an input field, where the user can enter
• User Selection w/ Attribute a value. The attribute will automatically
Quantity Input suggest values based on what the user
entered.
• User Selection w/ Quantity Inputs
for each Attribute Value
Autocomplete – Custom Table • Autocomplete – Sourced from a Used for autocomplete attributes
sourced from custom tables. The attrib
Custom Table
ute is displayed as a dropdown list with
an input field, where the user can enter
a value. The attribute will automatically
suggest values based on what the user
entered.
Checkbox • User Selection All attribute values are visible and there
is a clickable checkbox next to every
• User Selection w/ Attribute
value. You can select multiple values.
Quantity Input
• User Selection w/ Quantity Inputs
for each Attribute Value
• Measurement
Radio Button • User Selection All attribute values are visible and there
is a clickable button next to every value.
• User Selection w/ Attribute
You can select only one value.
Quantity Input
• User Selection w/ Quantity Inputs
for each Attribute Value
• Measurement
Custom Control • User Selection This display type is used with the Drill
down [page 78] functionality.
• User Selection w/ Attribute
Quantity Input
• User Selection w/ Quantity Inputs
for each Attribute Value
Display Only Text • User Selection Create text that is displayed in the con
figuration. One way to use this attribute
• User Selection w/ Attribute
display type is to combine it with the
Quantity Input User Input or Computed – String [page
• User Selection w/ Quantity Inputs 38] attribute type, to create headers in
for each Attribute Value the configurator to separate groups of
attributes in a single tab.
• User Input or Computed – String,
Date, Number
File Attachment • User Selection The user is able to upload a file attach
ment.
• User Selection w/ Attribute
Quantity Input
• User Selection w/ Quantity Inputs
for each Attribute Value
• User Input or Computed – String,
Date, Number
List Box • User Selection A list displayed in a box, where you can
select a single value. This type is used
• User Selection w/ Attribute
the same way as the dropdown list but
Quantity Input appears different visually.
• User Selection w/ Quantity Inputs
for each Attribute Value
List Box Multi-select • User Selection A list displayed in a box, where you
can select multiple values. Multiple val
• User Selection w/ Attribute
ues are selected using the Shift key
Quantity Input
(for a range of subsequent) or the
• User Selection w/ Quantity Inputs Control key (for choosing multiple
for each Attribute Value specific values).
Free Input, No Matching • User Selection This display type is used with all three
User Input or Computed [page 38] at
• User Selection w/ Attribute
tribute types. It can only be selected
Quantity Input when the attribute has only one value.
• User Selection w/ Quantity Inputs When it is combined with Date, a date
for each Attribute Value picker is displayed in the configura-
tor, allowing for a single choice. With
• User Input or Computed – String,
Number and String, users can enter any
Date, Number
numeric or string value.
Free Form, Exact Match • User Selection The user needs to enter the exact at
tribute value in the field. If the match
• User Selection w/ Attribute
isn’t exact, no value is saved. This dis
Quantity Input play type has a similar function to the
• User Selection w/ Quantity Inputs dropdown display type. However, it is
for each Attribute Value more practical than the dropdown when
it comes to exceedingly large numbers
of attribute values, which would be diffi-
cult to navigate in a dropdown menu.
Free Form, Exact Match w/ Otherwise • User Selection The user enters the desired attribute
Option value in the field. If the value entered
• User Selection w/ Attribute
does not exactly match a defined attrib
Quantity Input ute value, it is overwritten by a different
• User Selection w/ Quantity Inputs value. This display type is obsolete and
for each Attribute Value should not be used.
Free Form, Match Lower • User Selection The user enters the desired attribute
value in the field. The entered value is
• User Selection w/ Attribute
then matched with the adjacent lower
Quantity Input value. For example, if the attribute val
• User Selection w/ Quantity Inputs ues are 25, 30, and 35, and the user
for each Attribute Value enters 32, the display value is saved as
32 in the configurator, but the attribute
value code selected in SAP CPQ is 30.
Free Form, Match Upper • User Selection The user enters the desired attribute
value in the field. The entered value is
• User Selection w/ Attribute
then matched with the adjacent higher
Quantity Input value. For example, if the values are 25,
• User Selection w/ Quantity Inputs 30, and 35, and the user enters 32, the
for each Attribute Value display value is saved as 32 in the con
figurator, but the attribute value code
selected in SAP CPQ is 35.
Free Form, Set Match Lower • User Selection The user enters the desired attribute
• User Selection w/ Attribute value in the field. If the entered value
Quantity Input does not match any attribute values,
• User Selection w/ Quantity Inputs the value in the configurator is overwrit
for each Attribute Value ten with the adjacent lower value and
that value is saved in SAP CPQ.
Free Form, Set Match Upper • User Selection The user enters the desired attribute
• User Selection w/ Attribute value in the field. If the entered value
Quantity Input does not match any attribute values,
• User Selection w/ Quantity Inputs the value in the configurator is overwrit
for each Attribute Value ten with the adjacent higher value and
that value is saved in SAP CPQ.
Hidden calculated, Match Lower • User Selection Attributes with the Hidden calculated
• User Selection w/ Attribute display types are not visible in the
Quantity Input Configurator. Instead, they are used
• User Selection w/ Quantity Inputs in calculations, for which they use val
for each Attribute Value ues from other fields. This display type
overwrites the value with the lower ad
jacent attribute value.
Hidden calculated, Match Upper • User Selection Attributes with the Hidden calculated
• User Selection w/ Attribute display types are not visible in the
Quantity Input Configurator. Instead, they are used
• User Selection w/ Quantity Inputs in calculations, for which they use val
for each Attribute Value ues from other fields. This display type
overwrites the value with the higher ad
jacent attribute value.
Hidden, Calculated, no Matching • User Selection Attributes with the Hidden calculated
• User Selection w/ Attribute display types are not visible in the
Quantity Input Configurator. Instead, they are used
• User Selection w/ Quantity Inputs in calculations, for which they use val
for each Attribute Value ues from other fields. This display type
keeps the received value and does not
• User Input or Computed – String,
overwrite it with any attribute value.
Date, Number
Calculations in hidden calculated attrib
utes are performed before rules are
executed.
Related Information
To access this section, go to Setup Product Catalog Attribute Visibility Restrictions . Here, you can see
the list of all available attributes.
Visibility restrictions are user type-based, so you first need to select a desired User Type in the dropdown
menu. You can make any attribute invisible in the Catalog and the Configurator by ticking a checkbox next to it
for users who belong to the selected User Type.
Furthermore, if you wish to use the same attribute visibility restrictions for more than one user group, you can
copy the settings with the Copy Settings From option.
Formula rules, attribute triggers, simple rules, and product messages are displayed under the Rules and
Messages tab.
Rules can be used for limiting the configuration of the product. This ensures that the user is only able to create
an accurate and valid configuration of the product based on rules you've established in Setup. The Rules and
Messages tab allows creating complex rules through the use of SAP CPQ tags. The Formula Builder, which can
be accessed during the creation of every rule, can help in creating these rules in a user-friendly way.
Order of Execution
While modeling a product you may use different administrative methods of performing actions on attributes to
achieve desired results. These may include triggers or rules. When using both, you may run into trouble if the
actions begin to affect the same attributes. Knowing the order that these actions are run in the system may
help you when modeling your product. The system runs these methodsin the following order:
1. Triggers
2. Simple rules
3. Formula rules
Any time the user makes a selection or a product is loaded, these processes are run in this order. This is
important because if you create a trigger that selects the Color Red then have a rule created that selected the
Color Blue, then Blue will be the final selection despite the rule ranking of either the Trigger or the Rule.
Related Information
You can create complex rules which impact the product behavior during configuration.
Each rule is created with a condition, which determines whether or not the action will run, and an action, which
tells the system what to do when the condition is true. Each rule is, in essence, an IF statement. IF the condition
is true, THEN the anything in the action field will run. There are SAP CPQ tags used especially for rules (and
attribute triggers) to create the condition and the action statements.
You can also import and export formula rules, and rank them in the order of execution.
Active Manually turns the rule on or off. This is useful for diagnostic
or testing purposes.
Start Date/End Date The dates between which the rule will be applicable.
Condition (required) Restricts the rule’s execution in certain cases. If the condi
tion is fulfilled (true), the rule will be executed, and vice
versa. You can use the Formula Builder for assistance when
creating a condition expression. Maximum allowed number
of characters is 3000.
Action (required) The action which occurs when the rule is executed. You can
use the Formula Builder for assistance when creating an ac
tion expression. Maximum allowed number of characters is
3000.
Related Information
Triggers allow you to perform an action, or actions, when an event occurs on a product attribute. They’re useful
for situations when you want to reset an attribute when another attribute is selected or has changed selections.
Note
For example, there’s a Unit of Measure attribute that determines what length is going to be entered in another
attribute, Length. Unit of Measure includes the values Inches and Centimeters. If a user selects Inches, types in
12 in the Length attribute, but then decides to change Unit of Measure to Centimeters, then we need to reset
Length so that the user knows to enter a centimeter measurement instead of an inch measurement.
You can define triggers for each individual attribute in Rules and Messages Attribute Trigger . There are
three types of triggers that can be defined:
• Change Trigger - activates when the user changes the previously selected value within the attribute.
• Select Trigger - activates when the user selects any values from the attribute without the previous
selection.
• Reset Trigger - activates when the user deselects a previously selected value within the attribute.
It's also possible to have multiple triggers in the same attribute, and multiple actions in each trigger (separated
by a semicolon). Conditional expressions can also be used within each trigger to determine whether or not an
action tag can be run. Triggers can be entered manually, or by using the Formula Builder. In the Formula Builder
window, the Actions box under Triggers/Rules only contains actions appropriate for triggers. Conditional Tags
that return TRUE or FALSE, such as the ANYSEL tag, aren't available for Trigger expression-building in the
Formula Builder, but they can be used.
In the Rules and Messages tab, you can create simple rules that are less complex than formula rules.
Simple Rules are displayed if the application parameter Display table for simple product rules is set to TRUE.
Note
When you click Add Simple Rule a new screen is displayed where you can define the rule:
Start Date/End Date The dates between which the rule will be applied.
Note
If the application parameter Show Allow Option for
Simple product rules is set to TRUE, the action Allow is
also displayed in the dropdown.
Selected Values Here, you can add the values which will be impacted by the
action selected in the Then dropdown
Related Information
Product validation messages are similar to product rules, but instead of executing an action during the
configuration change, they display as a message if the condition is satisfied. They’re executed after the
configuration change (that is, when a user selects attribute value in the Configurator).
Product messages have the following structure: validation name + condition stating when the message
displays + the message that is displayed in the Configurator.
Note
Inactive, or expired (current date is outside of the specified start and end dates) validation messages are
ignored.
If Make product incomplete is checked, and the condition evaluates to 1 (true), and message is displayed, the
product is still incomplete even though all required product attributes are selected.
If Make product incomplete isn't checked, and Show in responder isn't checked, and the condition evaluates to
1 (true), the message isn't displayed but can be checked with a CTX tag Product.Validation(validation
name).
The CTX tag Product.Validation(validation name) is meant to only be used in attribute labels, to show
a message in addition to the responder. If used in product rules it returns unexpected results depending on the
rule order and configuration, since all rules haven't been executed and configuration hasn't been stabilized.
This tab enables you to define scripts in a product and specify events that trigger the execution of those
scripts. You can verify the execution of the script in the Log.
You can define a local script or attach a global script to individual products, in the Setup Product Catalog
Products Scripts tab. The purpose of local scripts is to be used on specific product for which they are
created, while global scripts are universal in their nature, and can be attached to multiple different products.
Local Scripts
If you wish to add a new local script, navigate to the Scripts tab, and click Add Script New Script . The
following fields and options are available when new local scripts are created.
Start Date/End Date The dates between which the script will be executed.
Force Proxy Generation Loads and refreshes the WSDL web services as the system
does not do it by default. The checkbox needs to be selected
only once when the script is saved for the first time.
Script You can only enter the IronPython script engine type.
If you wish to attach a global script to a product, navigate to the Scripts tab, and click Add Script Global
Script .
In the Global Script dropdown, you can select a global script you wish to attach to a product, and then the event
which will trigger the script.
Related Information
How-to Examples
Scripting [page 712]
Guided Selling [page 95]
To change the position of attributes, drag and drop them as you see fit. You can also use Configuration Preview
to see what the product will look like when configured.
In Configuration layout, attributes can also be dragged and dropped to another tab.
Additionally, you can add global tabs that were previously created in General Tabs , and define tab
visibility directly in the Configuration layout.
Code matching is used along with Intelligent Serialization (see the chapter on Sequence Substitution [page
101]) and the reverse part number lookup used in the Quick Search. This saves time for a user when
Code Matching is where this connection is defined between the part number and the product. This is done by
setting up Code Matching within a specific product. This allows the system to do a reverse part number search
when the user enters a part number in the Quick Search. Reverse part numbering is done with the Catalog Code
Generator field of the product.
This field can build the part number of the product through the use of attribute values/catalogue codes
and static text. For instance, the SMB2 Desktop Computer has this in its Catalog Code Generator field:
SMB2<*CATCODE(Processor) *><*CATCODE(Memory) *><*CATCODE(Hard Drive) *><*CATCODE(CD
or DVD Drive) *><*CATCODE(Monitor) *> This expression has the static text of “SMB2” to start out the
part number. This is then followed by the catalog code (CATCODE) of Processor, Memory, Hard Drive, CD or
DVD Drive, and Monitor. The CATCODE tag pulls the catalog code for the selected value of the attribute.
When the software does a reverse search of a part number, it checks if any of the values in the part number
are included in the attributes that make up the part number of the product. It does this in the order that the
attributes are entered for the part number. For instance, the part number SMB2-A3-102422H16-Com5T17 is
a result of the dynamic catalog code generation. To reverse search this part number, the software finds the
product to check (discussed later how) then checks if there’s a catalog code value for the attribute Processor
(<*CATCODE(Processor) *>) equal to -A3. It then moves to the next value and checks if the attribute
Memory contains a catalog code value (<*CATCODE(Memory) *>) equal to -1024. Once all the values of the
part number are found, the software opens that product and selects each value of the part number.
Note
The user needs to enter a part number that includes all the attributes included in the catalog code
generator. If they don’t, then the system returns that it can’t find a product.
In order for the system to check the attributes of a product, it needs to know which product to look at. This
is where Code Matching comes in. Code Matching tells the system which product to look at for a given part
number. This is generally the static text used in the product’s part number.
To access Code Matching, choose Products under the Products admin menu and find the product that the serial
number corresponds to. Choose the manual definition method and open Code Matching under the Current
Product menu.
Enter the unique codes used to reference this product. Click Change/Add More Values to add more fields. To
delete a reference, select the check box next to it and click the Change/Add More Values button. When finished,
click the Finish button. This saves the values and creates the references to the product.
Related Information
Users who use custom configurator XSLT transformation should replace a part of custom transformation in
order to enable attribute span functionality.
<xsl:for-each select="/Configuration/Tabs/Tab[@selected='1']/Attributes/
Attribute[@DisplayAs != 93 and @DisplayAs != 94 and @DisplayAs != 96 and (@Rank
= $CurrentStep or @Rank = '1') and @IsPositionAbsolute = '0' and @AliasDisplay !
= '2' and not(@SimpleRefProduct='1') ]">
<xsl:sort select="@SubRank" data-type="number" order="ascending" />
<xsl:if test="(position()-1) mod $Columns = 0">
<xsl:variable name="parentPosition" select="position()"></xsl:variable>
<tr>
<td valign="top">
<xsl:if test="Allowed='True'">
<xsl:attribute name="class">inputborder</xsl:attribute>
</xsl:if>
<xsl:attribute name="width"><xsl:value-of select ="$ColumnWidth"/></
xsl:attribute>
<xsl:call-template name="ShowAttribute">
<xsl:with-param name="StdAttrCode" select="@StdAttrCode"></
xsl:with-param>
<xsl:with-param name="PA_ID" select="@PA_ID"></xsl:with-param>
<xsl:with-param name="SelectedTabId" select="$SelectedTabId"></
xsl:with-param>
<xsl:with-param name="CurrentStep" select="$CurrentStep"></
xsl:with-param>
</xsl:call-template>
</td>
<td valign="top">
<xsl:if test="Allowed='True'"><xsl:attribute
name="class">inputborder</xsl:attribute></xsl:if>
<xsl:attribute name="width"><xsl:value-of select
="$ColumnWidth"/></xsl:attribute>
<xsl:call-template name="ShowAttribute">
<xsl:with-param name="StdAttrCode" select="@StdAttrCode"></
xsl:with-param>
<xsl:with-param name="PA_ID" select="@PA_ID"></xsl:with-param>
<xsl:with-param name="SelectedTabId" select="$SelectedTabId"></
xsl:with-param>
<xsl:with-param name="CurrentStep" select="$CurrentStep"></
xsl:with-param>
</xsl:call-template>
</td>
</xsl:if>
</xsl:for-each>
<xsl:for-each select="/Configuration/Tabs/Tab[@selected='1']/Attributes/
Attribute[@DisplayAs != 93 and @DisplayAs != 94 and @DisplayAs != 96 and (@Rank
= $CurrentStep or @Rank = '1') and @IsPositionAbsolute = '0' and @AliasDisplay !
= '2' and not(@SimpleRefProduct='1') ]">
<xsl:sort select="@SubRank" data-type="number" order="ascending" />
<xsl:if test="@IsFirstInRow ='1'">
<xsl:text disable-output-escaping="yes"><![CDATA[<tr>]]> </xsl:text>
</xsl:if>
<td valign="top">
<xsl:attribute name="colspan"><xsl:value-of disable-output-
escaping="yes" select="@Colspan"/></xsl:attribute>
<xsl:if test="Allowed='True'">
<xsl:attribute name="class">inputborder</xsl:attribute>
</xsl:if>
<xsl:attribute name="width"><xsl:value-of select ="$ColumnWidth"/></
xsl:attribute>
<xsl:call-template name="ShowAttribute">
<xsl:with-param name="StdAttrCode" select="@StdAttrCode"></
xsl:with-param>
<xsl:with-param name="PA_ID" select="@PA_ID"></xsl:with-param>
<xsl:with-param name="SelectedTabId" select="$SelectedTabId"></
xsl:with-param>
<xsl:with-param name="CurrentStep" select="$CurrentStep"></
xsl:with-param>
</xsl:call-template>
</td>
Related Information
Let’s say you are a transport vehicle manufacturer that produces 20,000 different vehicles and also services
the vehicles it sold to customers. While many of these models and types of services offered are completely
different from one another a high number of them are very similar, with a few distinguishable details. Making
a unique selection of the entity you want can be complex and very time consuming. This is where Drilldown
comes in: it allows you literally to drill through the many options and arrive at your final selection quickly and
efficiently.
When you arrive to your desired result, whether it’s data you need for your product configuration or the product
itself, you can use it to configure your product and continue creating your quote.
It helps to think of the Drilldown feature as a product attribute with two important entities – Source and Result
columns.
That said, the first step in the Drilldown process is creating a Custom Table that will contain your selection data.
You can create your Custom Table manually or import an Excel file containing table data. You must fill out the
table with source columns representing possible choices – with each choice followed by its sort column – and
the Result columns representing the final outcome.
The second step is adding the custom control (Hierarhical Drilldown) attribute, and other attributes that will
support Drilldown, into the product. We will explain this later in the document after we show you how to create
a custom table. The final step is drilling through your options in order to configure your product and complete
your quote (this is explained in the Doing the Drilldown section of this Help document).
You can download a sample Excel file populated with the required data. Click on next link to download
the sample: Vehicle Drilldown Template .
Click Browse to locate the Excel file and click Save. Now go back to the Custom Table Administration page,
find your table and click the Eye icon to make sure all fields are in.
Now that you have created a Custom Table you should create a product that will have attributes with a display
type custom control and attributes which will present results. In our mock-up scenario we will use three
attributes but you can create as many attributes as it is needed for your drilldown model.
We will be using three because we need one attribute for custom control (we called it Drilldown_Vehicle) and
two attributes where results will be displayed. In our mock-up example the Results No. 1 and No. 2 are Part
Number and Model Year, respectively.
Enter the name of your custom table in the Table field, (in our example it is Vehicle_drilldown). You will notice
that there are two tabs, Source column and Result tabs. Click Add New Column.
Now you are going to fill out relevant Source column fields. Consult the definition of the fields below:
• Label: Enter text that will be displayed in the Configurator for that selection.
• Type: Select a display type of your selection. The display type can be radio button, image button or
drop-down. If you select Image Button as a column type, two more input fields will be displayed on the form
- Image On Column and Image Of Column
• Image On Column: Enter name of the column in custom table that holds a name of the image that will be
displayed as attribute value when the value is selected.
• Image Off Column: Enter name of the column in custom table that holds a name of the image that will be
displayed as attribute value when the value is not selected. To upload attribute “on/off” images, use File
Management in SAP CPQ located at Setup General File Management .
• Rank: Select the position in the hierarchy of your Source Columns.
• Sort column: Enter the name of the appropriate Sort Column as it appears in your custom table.
• Db Key Column: Enter a unique database Key indicator of your item. In this case it would be the name of the
column listed in your custom table but you can also generate the key through a SAP CPQ expression or a
regular string. Note that you should not change the Db Key column indicator - it ensures consistency of the
Drilldown process by preventing system error when its value changes.
• Db Value Column: Enter the value attached to the Key column.
• Condition for making field editable (leave empty if always editable): Enter a condition that will limit the
editability of this field (for example, you can limit it to a certain user, or user type, or place time frames
during which the field is editable).
• Preselection Expression enables you to preselect your attribute values that are determined by the attribute
value selections made earlier in the Drilldown process.
Now that you have created your product with custom control, you can exit setup, configure the product and
complete your quote. During product configuration, make your selections from the Choose Drilldown dropdown
menu as you wish, and you will drill down to the result.
Related Information
Product Aliases are used to create different variations of the same product.
Context
Aliases can be useful when setting up several default configurations. This approach saves the user clicks or
allows marketing campaigns to configure products that are targeted to the end user. The original product
becomes the master and can be either active or inactive. There are no limits to the number of aliases created.
Different attribute values can be chosen as defaults when the product is configured. This is only possible if
rules haven’t already been created to prevent the default value selections.
Procedure
The currently valid attribute values are listed in the Selected attribute values box.
6. Click Save to save alias.
A product alias inherits all the properties of the parent product except the properties that can be
configured in the alias itself, even if the property on the original product is changed after the alias is
created.
When a user logs on, they see the alias in the category defined. The master product is the base with no
attributes selected.
Note
Aliases don’t inherit the original product’s preselected attribute values. Use the default selections to
set preselected values.
Related Information
A Copy button gives you an option to copy existing products in the system. It’s displayed for all products,
including aliases.
If you click on the button, a popup window displays and you can enter the name of the copied product. By
default, the name of the copied product is Copy of <original product name>.
SAP CPQ copies the product’s active revision. If no revision is active, the revision with the highest revision
number is copied. All product fields are copied – all fields from the Product Setup Wizard, database, ASPX
pages and so on.
Order Item Type is introduced primarily to enable mapping of complex product types coming from back-end
systems.
The value in the Order Item Type field determines the product model in SAP CPQ (which fields are available for
product administration, what columns are available on quote items and the type of order that is created out of
quote items when SAP CPQ is integrated with a backend system, such as SAP S/4HANA).
• Sales - products that can be created either in SAP CPQ or imported from a back-end system
(IsSyncedFromBackOffice set to either TRUE or FALSE, respectively). They use the standard product
model is expanded with three system attributes: SAP CPQ product model. In the integrated scenario with
SAP S/4HANA, this type of product corresponds to physical products.
• Subscription - the standard SAP CPQ product model is expanded with three system attributes: Contract
Duration, Billing Cycle and Contract Extension Period which is consequently reflected in a different layout
on quotes. Depending on the value of isSyncedFromBackOffice, there are two groups of subscription
products in SAP CPQ:
• If isSyncedFromBackOffice is set to TRUE, the product is originating in SAP Billing and Revenue
Innovation Management.
• If isSyncedFromBackOffice is set to FALSE, this is a standalone SAP CPQ subscription product
[page 82].
• Subscription Billing - IsSyncedFromBackOffice is always FALSE. These products are created in SAP
CPQ and used in the integration with SAP Subscription Billing. Product model is defined via rate plans.
• Service Contract - the standard SAP CPQ product model is expanded with the following system attributes:
Service Profile, Response Profile, Settlement Period, Billing Date and Service Contract Duration which is
consequently reflected in a different layout on quotes. IsSyncedFromBackOffice can have either of the
two possible values:
• TRUE - the product is coming from SAP Billing and Revenue Innovation Management and it is created
via the ImportMaterialsFromERP API.
• FALSE - SAP CPQ standalone service contract product [page 83].
Once a product is created or imported into SAP CPQ, the value of Order Item Type can’t be changed neither
via the API nor in the application, except when the integration with SAP Subscription Billing is enabled. In that
case, it is possible to change the Order Item Type value from Sales to Subscription Billing (and provide a rate
plan for the product).
Clients with Quote 2.0 tenants can create and manage subscription products in SAP CPQ without having to
integrate with an external system. To do so, during product creation, administrators need to select Subscription
in the Order Item Type field and set the flag isSyncedFromBackOffice to FALSE if creating products via API.
Standalone subscription products have three system attributes (Contract Duration, Billing Cycle and Contract
Extension Period) and the quote layout different than the standard layout. Basically, standalone subscription
products have the same product model and system attributes as subscription products originating in SAP
Billing and Revenue Innovation Management, the only difference being that the standalone subscription
products can use only standard SAP CPQ pricing and they can only be used in standalone SAP CPQ scenarios.
Clients with Quote 2.0 tenant can create service contract products without having to integrate with an external
system. To do so, during product creation, administrators need to select Service Contract in the Order Item
Type field and set the flag isSyncedFromBackOffice to FALSE if creating products via API.
Standalone service contract products have five system attributes (Billing Date, Response Profile, Service
Contract Duration, Service Profile, and Settlement Period) and the quote layout different than the standard
layout.
Basically, standalone service contract products have the same product model and system attributes as service
contract products originating in SAP Billing and Revenue Innovation Management, the only difference being
that the standalone service contract products can use only standard SAP CPQ pricing (pricebook lookup and
custom pricing) and the standard configuration type.
The product display type depends on the the configuration level of a product. It is selected in the Product
Definition tab of the Product Editor.
• Simple Product - A simple product is one that can have attributes assigned to it, but they can't be
configured. Because of nonexisting configuration of attributes, users can add the product to a quote
directly from Catalog. In addition to defining simple products, simple products can be imported from
Microsoft Excel.
• Configurable Product - Configurable products have attributes associated with them and they need to be
configured before being added to a quote. This is generally the standard configuration type used in the
system. Note that the quote contains a System (List) of Configurable Products, and that its default behavior
is as follows: if you delete one item from the system the entire system is deleted as well.
• Collection of Configurable Products - Each included product can have its own attributes and each can be
independently changed or reconfigured.
• System (List) of Configurable Products - Each product can have its own attributes, but added products
can't be independently changed or reconfigured. The entire system needs to be changed or reconfigured.
• Parent/Child System (List) of Configurable Products - A child product’s existence in SAP CPQ is determined
by its function in relation to the parent product. Each parent can have a range of child products and each
child can assume the role of a parent and have a range of its own child products.
A Simple Product doesn't require any attributes/options to be selected in order to be added to a quote.
Since simple products don't require, the, Configuration Layout and Rules tabs are inactive when the Simple
Product display type is selected
Simple products and their attributes are most often imported through the Product Import. See Bulk Product
Import/Export [page 111] for more information.
From the Catalog, simple products can be checked and added to a quote. By default, they aren’t displayed with
a Configure button, but an inactive Configure button can be shown by changing the Show customize button for
simple products setting in Setup General Application Parameters Product Catalog tab.
When added to a quote, a simple product is displayed as a single main item. Only the Copy and Delete actions
(Item Actions Workflow) are available in the quote.
Related Information
A Configurable Product requires attributes to be selected in order to be added to a quote. These attributes can
have inclusion, exclusion, or bundling rules enforced between them.
The Configuration Layout and Rules tabs are both active when the Configurable Product display type is
selected.
Attributes can be added and updated through the Product Attributes Tab [page 60].
Configurable products and their attributes are most often imported through the Bulk Product Import/Export
[page 111]. The import doesn’t provide a way to set up attribute pricing, display types, or product references.
From the Catalog, configurable products can be configured through the Configure button.
Note
If all the required attributes in the configuration are preselected, then the Add button is active in the
Catalog, which allows the user to add the product to a quote without entering the configuration. This
behavior is also available if there are no required attributes in the configuration.
When added to a quote, a configurable product is displayed as a single main item. If the option List as Line
Item is selected for any attribute, they’re displayed as child items to the configuration in the quote. The Copy,
Delete, Edit, and Refresh actions (Item Actions Workflow [page 477]) are available for configurable products in
the quote.
Attributes added through the Product Attributes Tab [page 60] must reference other products (child
products). Attributes that reference products must also be set as List as Line Item.
Since this product display type is used in product nesting or hierarchical product structure, which involves
referencing other products, it can't be imported through the Product Import.
From the Catalog, a collection of configurable products can be configured through the Configure button. The
configuration behaves in the same way as it does for a Configurable Product.
Note
If all required attributes in the configuration are preselected, then the Add button becomes active in the
Catalog, which allows the user to add the product to a quote without configuring it. This behavior is also
available if there are no required attributes in the configuration.
When added to a quote, the collection of configurable products adds the products referencing the selected
attributes to the quote. These products are displayed as main items in the quote, not as child items (which
is true for configurable products). Only the products referenced by attributes (child products) are taken into
account. The parent product, which includes the fields under the Product Definition Tab [page 57], is ignored
when added to the quote.
This product display type differs from the System (List) of Configurable Products or Parent/Child System (List)
of Configurable Products display types in that the products added to the quote aren't a part of any system. They
become independent products in the quote. The parent product's configuration is also lost and can't be edited.
System (List) of Configurable Products behaves as a Configurable Product in that it requires attributes to be
selected before being added to a quote. Inclusion, exclusion, or bundling rules can be enforced between those
attributes. This display type is used when setting up product nesting or hierarchical product structure.
Attributes added through the Product Attributes Tab [page 60] must reference other products (child
products). Attributes that reference products must also be set as List as Line Item.
Since this product display type is used in a product nesting or hierarchical product structure, which involves
referencing other products, it can't be imported through Product Import.
From the Catalog, the system (list) of configurable products can be configured through the Configure button.
The configuration behaves in the same way as it does for a Configurable Product.
Note
If all required attributes in the configuration are preselected, then the Add button becomes active in the
Catalog, which allows the user to add the product to a quote without entering the configuration. This
behavior is also available if there are no required attributes in the configuration.
This product display type differs from the Collection of Configurable Products display type in that the products
added to the quote are still part of the system. The parent product's configuration isn't lost and can be edited
by clicking the Edit action next to any products that are a part of that system.
The System (List) of Configurable Products display type differs from the Parent/Child System (List) of
Configurable Products display type in that the main item is ignored, and only the products referencing
attributes are taken into account.
Attributes added through the Product Attributes Tab [page 60] must reference other products (child
products). Attributes that reference products must also be set as List as Line Item.
Since this product display type is used in a product nesting or hierarchical product structure, which involves
referencing other products, it can't be imported through Product Import.
From the Catalog, parent/child system (list) of configurable products can be configured through the Configure
button. The configuration behaves in the same way as it does for configurable products.
Note
If all the required attributes in the configuration are preselected, then the Add button is active in the
Catalog, which allows the user to add the product to a quote without entering the configuration. This
behavior is also available if there are no required attributes in the configuration.
When added to a quote, parent/child system (list) of configurable products add the products referencing the
selected attributes to the quote. These products are displayed in the quote as main items, not child items
(which is true for configurable products). Not only are the products referenced by attributes (child products)
taken into account, but the parent product is also added to a quote, which includes the fields under the Product
Definition Tab [page 57]. Basically, this display type is a combination of a Configurable Product and a System
(List) of Configurable Products. Not only are the referenced products displayed in the quote, but also the main
item and any attribute line items that aren't referencing products.
This product display type differs from the Collection of Configurable Products display type in that the products
added to the quote are still a part of the system. The parent product's configuration isn't lost and can be edited
by clicking the Edit action next to any of the products that are part of that system.
The Parent/Child System (List) of Configurable Products display type differs from the System (List) of
Configurable Products display type in that the main item and the products referencing attributes are added
to the quote.
In the Workflow edit page ( Setup Workflow/Approval Workflow ) there are two options for all quote
actions:
• Prompt Users For Update to New Product Versions - If the selected quote action is executed, a message
states that there’s a new product version available for some items and requires confirmation from you
whether to update those items or not.
If you confirm, all appropriate items are upgraded and the quote action is executed. Otherwise, the action
is executed without upgrading items to the new version.
• Automatically Update Items to New Product Version - If the selected quote action is executed, all items are
automatically upgraded to their new product versions if a new version is available.
Note
By default, these options don't apply to quote items created from product aliases, but only to regular quote
items. To make either of these options apply to quote items created from aliases, in addition to enabling the
option in the Workflow, you need to set the application parameter Prompt user to upgrade product aliases to
new versions on opening the quote to TRUE.
Alternatively, you should enable the Upgrade to New Product Version action (and set the workflow permissions
for it) so it's always available on the quote and users can manually upgrade the product at any time.
Note
If a container attribute is related to a product and that product has a new version, the container keeps the
reference to the old product version because the old version was the one that was active at the time the
relation with the container was established. However, on the user side in the Configurator, the system finds
the latest product version for users to configure it.
A limitation affects container attributes with part number lookup referencing a product whose different
versions have different part numbers. When a child product referenced by such a container is upgraded to
a new version, and the parent item is updated on the quote, the old version of the child product remains
displayed in the Configurator, although the new version of the child product is used on the quote. However,
if both versions of the referenced product have the same part number, the version is correctly updated both
on the quote and in the Configurator.
This feature enables you to preconfigure the product based on the XML configuration that you’ve already
defined. For this purpose, tag <*SetConfigurationBasedOnXML(xml)*> has been introduced.
The tag accepts XML as an input string parameter, which is parsed and used to preconfigure the product.
While parsing the input XML, SAP CPQ tries to match attributes from XML to attributes in the product. If
some attribute from XML couldn’t be matched to any product attribute, it’s skipped. SAP CPQ continues with
matching other attributes and setting their values without interruption and doesn't display any error.
The only thing that can break the process is an invalid XML input (XML wasn't well formed). SAP CPQ doesn't
display an error but it can't process any attributes.
Besides standard usage, this tag can be used through Iron Python scripting as well.
Since the <*SetConfigurationBasedOnXML(xml)*> tag doesn't support setting multiple attribute values,
you can use this script to select multiple values in a checkbox attribute:
Product.Attributes.GetByName('AttributeName').SelectDisplayValues('NameOfCheckBox1'
, 'NameOfCheckBox2', 'NameOfCheckBox3').
Example
This simple example shows how the input XML is supposed to look like if you want to set configuration for the
product that doesn’t contain any containers.
For this example, we use our sample product named e-car CallidusCloud, which has a few attributes. We added
an attribute Set configuration, which is of type Button. Also we’ve developed an IronPython script that provides
an input XML and parses the <*SetConfigurationBasedOnXML()*> tag. This script is attached to the Set
configuration button and once the button is clicked, the product becomes preconfigured based on the provided
XML.
Here is the underlying XML file that has been provided as input to the SetConfigurationBasedOnXML tag:
<Attributes>
<Attribute><Name>Exterior Color</Name><Value>gray</Value></Attribute>
<Attribute><Name>Number of airbags</Name><Value>8</Value></Attribute>
<Attribute><Name>Equipment</Name><Value>Classic</Value></Attribute>
<Attribute><Name>Fuel</Name><Value>Petrol</Value></Attribute>
<Attribute Quantity="5"><Name>warranty</Name><Value>YES</Value></Attribute>
</Attributes>
The entire process is driven by the IronPython script that was attached to the Set configuration button. Here is
the script:
Example
This example shows how the input XML looks like if the product contains container attributes.
<Attributes>
<Attribute Quantity="2">
<Name>AttrWithQuantity</Name>
<Value>1</Value>
</Attribute>
<Attribute>
<Name>Memory</Name>
<Value>256</Value>
</Attribute>
<Attribute>
<Name>Monitor</Name>
<Value>F19</Value>
</Attribute>
<Attribute>
<Name>Processor_name_of_att</Name>
<Value>P2</Value>
</Attribute>
<Attribute>
<Name>Warranty</Name>
<Value>4 yrs</Value>
</Attribute>
<Attribute>
<Name>Hard disk</Name>
<Value>60</Value>
</Attribute>
<Attribute>
<Name>Nested-FirstAttribute</Name>
<Rows>
<Row>
<Product>
<Name>Nested-First</Name>
<CatalogCode>PN-SMB10</CatalogCode>
<Attributes>
<Attribute>
<Name>Memory</Name>
<Value>3GB DDR2</Value>
</Attribute>
<Attribute>
<Name>Processor_name_of_att</Name>
<Value></Value>
</Attribute>
<Attribute>
<Name>Monitor</Name>
<Value>T17</Value>
</Attribute>
<Attribute>
<Name>Hard disk</Name>
When these attributes are created, their values are expressed in default units. You can select measurement
units for any measurement type. Based on your selection of the measurement unit, SAP CPQ converts
attribute values to the selected unit. The purpose of this functionality is to display values of Unit of
Measurement attributes in the units that you select.
The default unit of measurement is set up per user. The Unit of Measurement is available in Setup Product
Catalog .
• You can add as many measurement types and measurement units as needed.
• Once a measurement type and its units are added, the default unit can’t be changed anymore.
• If the default unit has to be changed, you need to delete the existing measurement type and to create it
again.
• If a measurement type that needs to be deleted is used in attributes, you need to delete those attributes
first, or change the attribute type, in order to remove the measurement type.
Once you've added at least one default unit, you can download a Unit Mapping Table from Setup Product
Catalog Unit of Measurement by clicking Export Conversions. You can add the table once you export the
converted values.
If there are no attributes belonging to a certain measurement type, the exported Unit Mapping Table is empty.
For example, if you download a table containing no attributes whose measurement type is Pressure, the
downloaded table is empty.
If you already completed the conversion of a certain value, the Unit Mapping Table contains converted values as
well.
When two attributes use the same measurement, for example Pressure, the display value can be shown with a
space (25bar) or without a space (25 Bar). The format of the display value is defined by the system (or by
administrators) which creates Unit of Measurement attributes. When a Unit of Measurement attribute is loaded
in product configuration, the attribute display values are read from the Unit Mapping Table. The attribute values
format is as follows: 0.25 Bar and 0.25 bar are the same values, but one of the values exists in the unit
mapping table. The format of the first value entered in the system is applied to all other attributes with the
same values.
Example
New attribute: Attribute A with values 0.25 Bar, 0.35 Bar, 0.45 Bar.
New attribute: Attribute B with the following values, 0.25 bar, 0.35 bar, 0.45 bar, is displayed the
same way in configuration. However, in table mappings, the values 0.25 Bar, 0.35 Bar, and 0.45 Bar are
displayed.
Note
0.25Bar and 0.25bar are the same values, but one value is present in the Unit Mapping Table. The format
of the first value entered in the system is applied to all other attributes with this value.
If a new value is compared to a value entered when you've completed a conversion for the last time, the new
values are added to the column Pressure, but values aren't converted into other units.
You need to download a Unit Mapping Table, conduct a conversion, and put the table back into the system.
This topic contains the procedure for importing units of measurement into SAP CPQ.
Procedure
The import is completed automatically once you upload the file. Creating measurement types and units
has to be completed prior to creating the attribute of the Unit of Measurement type.
Measurement attributes need to be created in the system to support Unit of Measurement in product
configuration.
You can create a new attribute type ( Setup Product Catalog Attributes ). As soon as Measurement
is chosen as an attribute type, a Unit of Measurement field is displayed. Here, you can select one of the
measurement types you've previously added to the system. This field is required.
At this point, you can add attribute values and attribute value codes, in the same way you do for other attribute
types; and add the attribute to the product.
Units of measurement can also be accessed from User Menu User Page .
As soon as a new measurement type is added to the system, that measurement type becomes a standard field
on the User Page and User Setup.
The Unit of Measurement field labels can be translated to the user’s language by adding its key to the
dictionary. The content of these fields, however, can’t be translated. You can add a default value to the Unit of
Measurement fields in User Setup. A default value can't be added through import, Users functionality, or user
API.
This topic contains scopes and limits of the Unit of Measurement functionality.
• When a user edits a saved configuration, Favorites, or a configuration from an existing quote, and if
measurement attributes have selected values, the system shows the selected value of measurement
attributes in unit selected when the Edit action was executed.
• When a new product is created via API, the Unit of Measurement attribute type is supported. API is
expanded to support the Measurement type along with the attribute type.
• Creating an attribute type Unit of Measurement through Export/Import functionality is supported.
Importing attributes with Unit of Measurement type is required when you want to make an attribute
determined by a unit of measurement. When you conduct your Attribute Import, the Excel file needs
to include a column called Measurement where you can enter your Display Values and your Unit of
Measurement.These values must be entered in the exported file in order to be converted from your default
value (meters, for example) to another value (kilometers, for example).
• Making rules with this type of attribute and IronPython scripts is supported.
• Attribute Unit of Measurement tags - all SAP CPQ attribute tags have to work with this new attribute.
• Attribute Unit of Measurement in Deploy/Send Changes functionality – entire settings regarding
Measurement and the Unit of Measurement are deployed to a new environment.
• Attribute Unit of Measurement translation - values of measurement attribute can’t be translated into other
languages. For example, translating 25,000 Pаscale in English to 25,000 Паскаль in Russian isn’t
supported.
• Attribute Unit of Measurement in quote - tags in the quote return the value of the default unit. The
converted values in the quote aren’t supported by the design; only tags in the Configurator return
converted values.
Guided Selling is an automated Catalog filtering process which helps sales representatives easily find products
matching their needs by narrowing down the products in a category based on their attribute value selections.
When there is a category in which products share multiple attributes, you can create guided selling, which
users can activate if they need assistance while browsing the Catalog. For example, the Cars category consists
of multiple products which have attributes such as year of manufacture, body style and speed. You can list the
values of those attributes in a guided selling, and users can select the ones they are interested in browsing. If a
user wishes to find all minivans which were manufactured between years 2000 and 2009, with top speed of at
least 70 mph, they can do so more quickly in this way.
Guided selling can be either simple or complex, depending on the use case. You can only add attributes, or you
can create rules and scripts for more complex business scenarios.
Procedure
You can create, edit or rank formula rules [page 69], simple rules [page 71] or attribute triggers [page 71] in
this tab.
8. (Optional) Move on to the Scripts tab.
You can create a new script or attach an existing global script [page 73] in this tab.
9. (Optional) If you’ve previously added any attributes, you can move on to the Layout tab.
You can configure what the guided selling will look like to the users. You can add new attributes and store
the available information into several tabs.
Note
Make sure you've added attributes to the guided selling layout if you want it to be displayed in the
Configurator.
The guided selling is now created and can be used to filter the Catalog.
In this tab you can provide general information about the specific guided selling process. The table provides
explanation of fields and options.
Category (required) The list of categories for which the guided selling process will
be available.
Number of Search Result Groups The default number of search result groups is 3. The lowest
number you can enter is 1.
Results Are Grouped According to The parameters for equal distribution of products are:
Guided Selling Visibility Parameters If Visible to Everyone checkbox is ticked, all users can see
use the guided selling. If not, only the selected user types,
companies, brands, and so on, will be able to see the guided
selling.
Start Date/End Date The dates between which the guided selling process will be
active.
In the Attributes tab, you select which attributes are considered as filtering criteria when users search for
products/services in the Catalog.
All the attributes you add can be customized. Once you click Edit next to an attribute, the following fields and
options are displayed:
Display Type Attribute display types define how and if the attribute ap
pears in the Guided Selling page in the Catalog.
Spans Across Entire Row The attribute stretches across the entire row, so no other
attributes are positioned next to it.
Triggers Execution of Rules When the attribute value is changed in the Configurator,
a product rule is executed. Applicable only if rules are at
tached to the product.
Custom Label Replaces the default attribute name in this guided selling
only. Formula Builder can also be used to retrieve the label
from other places in the application.
Start Date/End Date The dates between which the attribute is active.
Use Attribute as Search Parameter The attribute is included in the product-filtering process.
Use Attribute Only to Select in which Categories Values will be Select a category or a subcategory for which the search will
Searched be performed, while the products from other categories and
subcategories will be ignored.
You can also select which attribute values will be displayed to users and used as search criteria and rank them
in order in which you want them to be displayed to users.
2.4 Categories
Categories and subcategories are used to logically group products in the Catalog according to specific criteria.
On the user side of the application, the list of categories available to the user is displayed in the Catalog.
Additionally, on the Categories page in the Catalog, categories can be displayed alongside an image and a
description. A category can be accessed only by users with the appropriate permissions.
Users can sort and filter the products in categories, as well as switch between a tabular view and a list view.
As an administrator, you can create new and manage existing categories in Setup Product Catalog
Categories .
A category name is limited to 50 characters. You can also add an optional description, which can include HTML,
to provide a summary of the products in the category.
Using the Active toggle switch, you can control whether the settings defined in category administration are
applied in the system.
Categories can be organized into hierarchies, meaning that a category can have a parent category and
subcategories. You can select a parent category by clicking Parent Category, as well as create and manage
subcategories in the Sub-Categories section, which display in a grid. When selecting a parent category, you
can choose to apply the parent category’s permission settings to the category you are creating or editing.
However, to apply the permission set for the current category to its subcategories, you need to use the option
in Permissions and Effectivity Dates.
In addition, by setting a Rank for a category, you can define the order in which categories appear on the user
side of the system. Likewise, you can define a redirection URL which will be triggered when users try to open
that category.
Moreover, you can upload up to three images which will display when users open the category in the catalog.
The image uploaded in the Image field is the main image, which is always displayed in the Catalog. The two
Note
Additional images are available only in the classic design and aren’t displayed by default. To see them in the
Catalog, you need to modify the XSLT by going to Setup UI Design Custom Category UI . When
you click Add New, you can select the Category for which you want to define the images. Then you can
select the XSLT file for transforming these images. You can define your own transformation file, select the
default file, or change the default file if needed.
For this feature to work properly, the appropriate transformation must be applied for all categories in the
Catalog. You can do this in Setup UI Design Catalog Layout . There, you can select the appropriate
XSLT file.
In Category Visibility Permissions, if the switch Visible to Everyone is enabled, the category is visible to all
permission groups. However, if you disable this option, you can define which permission groups are able to see
this category in the Catalog, by moving them from Available to Selected Permission Groups.
In addition, you can optionally define the start and end dates of an effectivity period during which the category
will be visible to users.
Category visibility permissions are not automatically applied to the products in the category, its subcategories,
or the subcategory’s products. If you decide that the same visibility rules defined for the category should apply
to its products and subcategories, you can manage this behavior by enabling the following options:
• Apply above specified category permission rules to all products in this category (not including products in
sub-categories).
• Apply above specified category permission rules to all subcategories and all products in those subcategories.
In Default Catalogue View, you can choose between a tabular, list, or custom view. The view you select here will
be applied by default to this category on the user side. If no selection is made here, the view which is set for the
user type in Users User Types Default category view is applied for this category, instead.
Product Types can be used in tracking quotation and order information. You can also separate subtotals in the
quote for each product type, which gives users the ability to use different discounts for different product types.
Each product created in the system can be assigned one Product Type. Multiple product types within a product
can be achieved by setting attributes within a product to a different product. This is discussed more in depth
later.
Selecting the Product Types link under the Products menu gives you access to the Product Types administrative
section. Here, Product Types can be Deleted or Edited. You can add a new Product Type by clicking the Add New
button.
Products can have only one product type. However, it's possible for a product to have multiple product types.
To achieve this, you need to configure attributes within the product to a different product type. This is done
through the Ref Product field in the product attributes definition screen.
The Ref Product field is used for connecting an attribute to another product. In this way, it’s possible to create
a parent child relationship between products. There are many benefits in doing this, including the ability to
configure the child product within the parent product. This is discussed more in depth in the Product Display
Types [page 83] topic.
One benefit of creating this parent child relationship between products is the sharing of product types. When
you reference another product in an attribute through the Ref Product field, the attribute takes on the same
product type as the product it’s referencing. This is useful when the referenced product has a product type
other than the parent product.
To take full advantage of a referenced product’s different product type, it's best to mark the attribute that
references the product as a line item. This way the attribute shows up separately from the main item in the
quote and includes a different product type. The quote then has separate product type subtotals, which can be
discounted (assuming you have the permission to do so).
Here is a simple example of how an attribute can be set up to have a separate product type from the main
product. We’ll use the SMB2 Desktop Computer product, which has a product type of Hardware in this example.
This product contains an attribute called Software that we set up with a product type of Software.
First we need to make sure that we have a separate product with the product type of Software. This product
can be a simple product without any attributes. Next we’ll go to the SMB2 Desktop Computer and go to the
attribute’s administration. In the Reference Product field we need to click the Select button. This displays a
pop-up window where you can search for the product that you’re going to reference. Here we will choose
the Software product. It’s named the same name as the product type to help us quickly identify it. Once it’s
selected the product is entered in the Referenced Product field.
Note
In this example, we’re using the Product Editor to define the referenced product. This can also be done
through the manual product definition, but instead of a Select button you see a dropdown box.
Part numbers can become lengthy and sometimes need to be limited in length by the underlining business
systems (ERP). Because of this, there’s a need to serialize an entire part number. or a part of it. Intelligent
Serialization implies that a part number can be serialized while preserving the part number logic; hence the
same configuration always yields the same serial number.
A simple example of this would be four attributes with three values each: Color (Blue, Red, Green), Material
(Wood, Aluminum, Steel), Voltage (120, 480, 600), and Size (Small, Medium, Large). If it's necessary to
uniquely capture these selections in the part number, then characters to represent these values. In this
scenario, a part number can be: Prefix-BW1M for a Medium-sized Blue widget, made out of Wood that works
with 120 Volts. However, if restricted to only two characters in the part number to represent these 4 attributes,
an intelligent Sequence Substitution would be defined, where any combination of these four attributes would
be replaced with a sequence. The sequence would be defined to range from 1 to 81 (34) and an attribute
mentioned above.
To define a Sequence Substitution, you first need to define a numeric sequence; for this example we’re using
1–81. You can find the Sequence Substitution page in Setup Product Catalog SEQ Substitution .
Here Sequence Substitution can be edited, deleted, or copied by selecting the appropriate button next to the
substitution's name. New sequence substitutions can be created by clicking Add New. When you're creating a
new sequence substitution, you need to fill in several fields:
Once a sequence substitution is defined, it can be used in a formula for building a part number using a special
tag called <*CXSUB(sequence substitution name) *>. Using sequence substitution in a product can be
performed by entering <*CXSUB(SEQsub)*> in Product Catalogue Code Generator. In this example, SEQsub is
the created sequence substitution. To the user, the product number looks like any other product number or a
serial code.
Create Favorites Permissions enables you to limit users who are permitted to share Favorites.
Let’s say you’re a large industrial manufacturer, comprising a tools unit and an equipment unit, with one unit
having no involvement in the operations of another. In this case, you want only the tools unit, and not the
equipment unit, to be able to see the tools Favorites, and vice versa. Create Favorites Permissions allows you
• Define user types who will be able to define favorites on company level
• Select user types from the list view in the first panel. Those users can grant permission to other users
within their company to view the shared favorites.
• Tick the Everyone checkbox to give everyone the permission within their company to share Favorites.
Note
Favorites created by a user with the appropriate rights will remain visible inside their company even if
the option Define user types who will be able to define favorites on company level is later disabled for
that user. In that scenario, the user will no longer be able to create favorites, but those they created
previously will still be accessible on the company level.
• Define user types who will be able to define favorites on system level
• Select user types from the list view in the second panel. Those users can grant permission to all users
within SAP CPQ to view the shared favorites.
• Tick the Everyone checkbox to give everyone the permission within SAP CPQ to share Favorites.
Tip
• Hold down the Ctrl key to select more than one user type while making your selections.
• Click Save when you're done making your selections.
SAP CPQ allows the use of data from nonstandard tables during the configuration process. Adding, editing, and
deleting tables along with their entries is done through Custom Tables.
• Define New – Create a new table by defining table and columns names
• Import New – Create a new table by importing an Excel file
• Edit Table – Add new columns to an existing table
Note
When you’re editing existing custom tables, all column and types are read-only and they can't be
changed.
When defining a Table Name, bear in mind that it can't begin with sys_. Table Name is a required field, it must
start with a letter and can only contain lowercase (a-z) and uppercase (A-Z) alphabetic characters, numbers,
and the underscore character.
In Audit Trail Level you can define the level at which changes are logged in the audit trail. You can choose
between Audit at Field Level, Audit at Row Level and No Audit. You can learn more in Custom Table Logging
[page 105].
As soon as the custom table name is defined, the next step is to define columns. Column Name is a required
field. You can also define the type of each column. The following types are supported:
• bit
• int
• date
• datetime (displayed in the date format and date separator format selected for the logged-in administrator)
• nvarchar(size) [default(250)]
• decimal(decimal places) [default(2)]
Note
Length/Decimal places column type is valid only for NVARCHAR, in which case it represents the length of
the string sequence, and the Decimal, in which case it represents decimal places.
By selecting the Personally Identifiable Information checkbox an administrator flags information as PII.
You can choose to prevent old and new values of personally identifiable information from being logged by
enabling the Suppress Information Logging toggle switch.
When you create a table via API, you can provide a type for each column within the attribute <DbType></
DbType>.
When a new table is created, primary auto increment key CpqTableEntryId is added to the table, which is later
used for manipulating entries. When Add New Column is clicked, the system adds a new blank column. Clicking
Undo Column removes the last created column.
A new table can be defined by importing it. When a new table is created, the primary auto increment key
CpqTableEntryId is added to the table. If a table name isn’t provided, the table name is populated with the
All Entries is the default selection. You can choose export format. Supported file formats are:
• Excel
• ZIP
Excel file is the default selection. If you choose the ZIP file, then XLS file is compressed to a ZIP file.
• Import
• Used for appending/updating data in existing table.
• If you just want to insert new rows, the Excel file mustn't contain a CpqTableEntryId column. However, if you
want to update and insert new rows, CpqTableEntryId is necessary for existing entries, while for new rows
this cell needs to be left blank.
Note
If the application parameter Export All Custom Table Data as Strings by Default is set to True, all data is
treated as text data by the spreadsheet application. This parameter only influences data formatting when
exporting custom tables. Setting this parameter to True prevents trailing zeros from being removed from
text type columns in custom table column definition.
This page is for adding or editing entries. When Save And New is clicked, the current data is saved, and this
page is displayed again, so a new entry can be added to the same table. When editing the existing entry,
CpqTableEntryId is displayed.
Audit Trail provides you with the ability to see when custom table was created/modified and who performed the
action. Audit Trail is written every time you:
The timestamp and the performer of actions performed on custom tables are logged for each individual
row in the columns CpqTableEntryDateModified and CpqTableEntryModifiedBy, and displayed in the date and
separator format selected for the logged-in administrator.
From the administrator side, the columns are visible in Setup Product Catalog Custom Tables View
Entries , and from the user side, they’re visible in User Menu Manage Tables View Entries . The
columns are automatically populated with the date and time the table was modified, and the username and
the full name of the person that modified it. The action itself isn't logged. The columns are populated after the
following actions are performed:
• Add table
• Add row
• Edit row
• Copy row
• Import entries
• Import custom table
• Add column to the table
• Any actions affecting custom tables in Deploy/Send Changes
Moreover, the new columns are also populated when the following actions are performed via SOAP API:
• CREATETABLE
• DELETETABLE
• EXPORTROWS
• EXPORTTABLE
• INSERTROWS
• UPDATEROWS
• UPSERTROWS
• DELETEROWS
• Add new table (via SOAP API, Excel, IP script or manually; also logged in the new columns)
• Add column to the table (also logged in the new columns)
• Changing the PII and Suppressed Information Logging flags
• Delete row
• Delete table
In custom table definition, you can define the level at which changes are logged by choosing between the
following options in Audit Trail Level:
• Audit at Field Level – when the table is edited, a record is logged in the audit trail for every field that is
edited. The record contains information about the values in that field before and after the change.
• Audit at Row Level – when the table is edited, only one record per row is logged in the audit trail. The record
contains information about the values in the fields in that row before and after the change.
• No Audit – if this option is selected, no records are logged for that custom table, regardless of edits. As
of November 2022, this option is selected by default on all new tables and no changes are logged until
administrators select another option.
Hidden custom tables are custom tables that are conditionally visible in SAP CPQ Setup, depending on whether
you’ve marked the tables as Hidden.
When you create a new custom table (by clicking Define New), you need to decide whether to mark the tables
as Hidden or not. The tables can be Hidden with values True and False. The default value is always False.
Many projects require storing data on custom tables that shouldn't be shown in SAP CPQ Setup. These kinds
of tables are a part of clients’ SAP CPQ model, but SAP CPQ system administrators aren’t responsible for them
and, as a result, they aren't visible in SAP CPQ Setup.
Note
Input parameters for creating a new custom field via API call have been expanded to support this property.
The IPython CreateTable method has also been expanded to support this property.
This parameter is located on the Custom Table page in Setup. When the value of this parameter is set to True,
SAP CPQ shows hidden tables. The parameter's default value is False. The value of this parameter is saved only
during your session. In other words, your selection is valid only you log out or unselect this parameter.
If this parameter is set to True, custom tables are displayed in the Configurator. They look the same as other
custom tables. You can edit them, delete them or change their content.
Messages can be displayed to users either in the Configurator (for example, in attribute labels) or in the
Responder. They’re also used for enforcing product business rules because, if displayed, they can render
product incomplete.
Messages are similar to product rules - they both have a condition that is evaluated against the current product
configuration. If message condition evaluates to 1 (true), this message is displayed in the Responder, and the
product configuration is rendered incomplete.
Message conditions are evaluated after product rules have been executed (after user selects an attribute,
product rules are executed followed by message condition evaluation).
Note
To retrieve message text (and use it in attribute labels, for example), the tag
<*CTX(Product.Validation(message name))*> needs to be used. This tag shouldn't be used in
product rules because it returns incorrect values due to execution dependency between rules and message
evaluation.
Message can be displayed in the Responder and in the attribute label (via the tag) at the same time.
In order to translate content of product message, syntax {{Dictionary_Key}} can be used. It retrieves the
value from selected dictionary with the key Dictionary_Key.
2.10 Sequences
Sequences are typically used in constructing part numbers where an entire part number or a portion of a part
number is serialized.
Sequences can be defined as numeric or alpha sequences. They’re referenced using tags, which are discussed
later in the topic. Sequences can be administrated by clicking on Sequences link under the Products admin
menu. Here you can easily copy, delete, or edit existing sequences.
User can add a new Sequence by clicking the Add New button. It brings up a blank Sequence Definition page.
Editing a Sequence brings up the same screen.
• Seqname - Name given to the Sequence. This name is used when referring to the sequence in an
expression for part numbers or other definition area.
• Description – Describe a sequence using additional details such as intended use, and so on.
A to Z Sequence
One method of creating an A to Z Sequence would be to type A, B, C, …, Z into the Stringlist field. An easier
way is to use the CHAR function in the Presentation dropdown box to generate an A to Z Sequence. To create an
A to Z Sequence, enter 1 for Startno, 26 for Endno and 1 for Stepval. Make sure the Order is Ascending, Alpha
is set to Y, and Presentation is set to CHAR. CHAR converts the Sequence value into an Alphabetic character. If
Lowercase is desired, use 33 for the StartNo and 58 for the Endno.
Sequences are used with part numbers to uniquely identify a configuration. There are two options for a
Sequence being attached to a product number: the Sequence can be assigned in the Configurator when the
product is being configured, or it can be assigned when the product has been added to the quote. If assigned
in the quote, sequence values are more likely to be assigned to configurations that turn into orders. Otherwise,
sequence values can be wasted.
There are two ways (in the standard functionality) to make this happen. There are a few settings under
Application Parameters (under General administrative menu) that relate to sequences and how they behave.
One setting is called Delay Sequence Generation. If it’s set to TRUE, a sequence can be assigned when the
product is being configured. Once a product has been flagged as complete, a button labeled Get Cat Code
shows up in the Responder. Clicking this button generates the sequence value in the Configurator. If Delay
Sequence Generation is set to FALSE, the Sequence Value is generated when the product gets added to the
quote. Another setting on the Application Parameters page is Do Not Recycle Sequences. It specifies whether
the system goes through the sequence again once the Endno has been reached. Setting it to TRUE notifies the
system not to go through the sequence again.
In order to include a sequence in the part number or other definition area, you can use one of these tags:
PSEQ (syntax: <*PSEQ(sequence name)*>) is a product sequence, which allows several products to use the
same sequence independently of each other. In other words, under this scenario, two products can use the
same sequence in their part numbers.
For example, product ABC part numbers can be: ABC0001, ABC0002, ABC0003… Product XYZ part numbers
can be: XYZ0001, XYZ0002, XYZ0003, and so on. Both products have the same sequences (0001, 0002,
0003…).
GSEQ (syntax: <*GSEQ(sequence name)*>) is a global sequence, which allows several products to share the
same sequence. In other words, under this scenario, two products increment the same sequence and therefore
a sequence number is only used once.
For example, product ABC part numbers can be: ABC0001, ABC0002, ABC0004… Product XYZ part numbers
can be: XYZ0003, XYZ0005, XYZ0006…
Here Product ABC uses the sequence numbers 0001 and 0002. Product XYZ uses the sequence number
0003. Since 0003 had already been used, the next sequence number available for Product ABC was 0004.
Note
In order for GSEQ to work correctly, all products that are incrementing the Sequence need to have GSEQ
used in their expressions.
SSEQ (syntax: <*SSEQ(sequence name1, sequence name 2, …, sequence name n)*>) allows
sequences to be nested. For example, two sequences go from 1 to 3, and they are named sequence One
and Two. The expression <*SSEQ (one, two)*> would result in 11, 12, 13, 21, 22, 23, 31, 32,
33.
Another example would be to have one sequence name of ABC with string elements A, B, C, and another
sequence named Ten going from 1 to 10, then expression <*SSEQ(ABC, Ten)*> would result in A1, A2, A3,
A4, A5, A6…, A9, A10, B1, B2, …, B10, C1…, C10.
Similarly, if a portion of a part number is defined as <*SSEQ(Ten, ABC)*> then the results would be 1A, 1B,
1C, 2A, 2B, …10C.
For example, if there’s an attribute called Number of Poles and it needs to use numbers from 2000 to 2999
from a sequence named 2000-2999 when the number of poles is 2, but use numbers from 3000 to 4999, from
a sequence named 3000-4999, when the number of poles is greater than 3, the expression entered into the
Product Catalog Code generator would be as follows:
Bulk Import/Export is a functionality you can use if you need to import or export extensive user, product,
product translation, or pricebook records in one go.
To use it, navigate to Setup Import/Export Bulk/Import Export . Once there, you can select which entity
you wish to import or export.
Bulk Import/Export feature gives administrators more flexibility in defining product export filters, while
improving error handling, process stability and saving administrators’ time.
Large product data files aren't interrupted by an error and large files don't need to be split into several smaller
files. This feature is not a replacement for the existing Import/Export functionality, both methods will be
available in SAP CPQ setup.
The Bulk Import/Export process starts by exporting products. Since the number of products can be very large,
this process had been designed as an asynchronous background process. This means that the administrator is
free to leave the page once the export process is initiated and continue with their administrative activities on
other pages, or leave SAP CPQ completely. Upon completion of the process, the administrator will be notified
via email, and provided with a link to the exported template.
Note
The maximum number of products that can be imported with the Bulk Import/Export feature in one
instance is 10 000. If a larger number of products is imported, they will be imported in multiple instances.
This feature is accessed from Setup Import/Export Bulk Import/Export Bulk Product Import/Export .
It is also possible to reach the Bulk Import/Export screen from the Products section in Setup.
The first tab Filter Export by is used to define filter criteria for the common product properties, such as Product
Name, Part Number, Category and more. If an export involves multiple part numbers, you should enter them
one per line. If you want to constraint a number of columns, or define a list of attributes that you want to export,
you can do this under Columns and Attributes to export tab.
Clicking Apply Filter and Export starts the background export process. You can leave the page (or applicatio)
and come back later to check the download status and download the exported document.
After making the desired changes, you can upload the template document to SAP CPQ. When importing, you
must provide the Product Identifier column so that SAP CPQ can know whether to insert or update the existing
products. Available product identifiers are the same as for regular product export/import.
Import of product data also works as a background process. If any error occurs, they will be logged into the
same file uploaded for import. The column that holds the information about the row is named Status. You can
download the file at the end of the process, make corrections according to any reported errors and upload the
file again.
The system decides which value to export for the product price, cost, recurring price and recurring cost based
on the pricing type selected in product administration.
Custom Pricing Exports the value cal Exports the value de Exports the value de Exports the value de
culated from the pric fined in the Cost field. fined in the Recurring fined in the Recurring
ing formula, if the for Price field. Cost field.
mula is defined. Oth
erwise, it exports the
value from Base Price.
Pricebook Lookup Price defined in the Cost defined in the Recurring price de Recurring cost defined
user's pricebook (in user's pricebook (in fined in the user's pri in the user's pricebook
User Page), multiplied User Page), multiplied cebook (in User Page), (in User Page), multi
by the reverse fac by the reverse fac multiplied by the re plied by the reverse
tor (1/(MarketFactor * tor (1/(MarketFactor * verse factor (1/(Mar factor (1/(MarketFac
Currency Rate)) Currency Rate)). ketFactor * Currency tor * Currency Rate)).
Rate)).
Note
When Variant Configuration and SAP Subscription Billing products are exported, the price, cost, recurring
price and recurring cost fields are empty.
The structure of the Excel file for product upload has changed in the 2202 release. If you are uploading
products after this release, make sure that you download the upload template first because if you use the
old template, it will lead to errors in the system.
Related Information
This functionality allows importing and exporting multiple users into or from SAP CPQ.
The following properties of the Bulk User Import/Export make it a more efficient solution than the standard
User Import:
• Optimized importing (you initiate export/import and leave the action running in the back while managing
other SAP CPQ features).
• Email notifications when the process is finished.
• User-oriented interface.
There are different workflows you can follow in SAP CPQ to manage Bulk User Import. When you access
Setup Import/Export Bulk Import/Export Bulk User Import/Export , you can:
This workflow allows you to export a predefined template, fill it out with user details and reimport it into SAP
CPQ.
Context
Importing users through templates is recommended when you only wish to import new users without altering
the existing ones.
Note
Exported files don’t contain columns Password, Must Change Password and Password Locked, and you can’t
import a file which contains those columns.
Procedure
Find the instructions for filling out the templates in Template Guidelines [page 115].
4. Drag and drop the Microsoft Excel template in the Import Users section or browse for it.
The import is automatically recorded in the list of jobs. The status of the import shows Queued until
Finished (Download). A progress bar visually shows the progress.
5. (Optional) Select the Email me when done checkbox.
A notification is emailed to you when the import is finished. Once the Status column indicates Finished
(Download), the import is completed. To check the success of the import, click Finished (Download) and
open the file on your computer.
6. Check the Status column in the Users sheet.
If a row is highlighted in red, update it according to the status message and reimport the template.
Otherwise, if no rows are highlighted, the users are imported successfully. If you cancel an import before
the processing is completed, the file is still available for download.
This topic contains the instructions for filling out the templates for user bulk import.
• Users - the import sheet with columns that match fields in SAP CPQ.
• IMPORTANT INFO - restrictions and requirements for each field.
• Timezones - timezone IDs and descriptions.
The Users sheet is a container for information related to users that are to be imported. Each user is placed in
a separate row. The system uses IDs to match the records in the template to existing users in SAP CPQ. When
importing new users, the column ID should not be populated. However, when updating the existing users, you
should not change the ID in the exported file. If you delete or modify the ID of an existing user during editing,
the user may be duplicated in SAP CPQ.
Note
The order of columns and column names must stay unchanged, otherwise the import will not be
successful.
The Password, Must Change Password and Password Locked columns don’t exist in exported templates and
the import of those columns isn’t allowed. The exported templates contain the IsSSOUser column, the value of
which should be set to TRUE if a user is going to log in using the Federated Single Sign-On. The default value of
IsSSOUser cells is FALSE, and SAP CPQ sets them to FALSE if they are imported without any values.
A populated template that has already been imported into SAP CPQ contains the Status column indicating if a
user is successfully imported. In case of an error, a message explains what caused it. Additionally, users that
have not been imported are highlighted in red in the template. Unlike in the standard import where you supply
the ID for the managing, ordering and approval parents, in Bulk Import you supply their usernames. Also, in
Bulk User Import you can define the default market, default dictionary, date format, number format and the
expiration date for the underlying users.
Related Information
SAP CPQ allows you to export a Microsoft Excel file with all users in the system, update their data and reimport
it into SAP CPQ.
Context
Although you may add new users to the list, this workflow is recommended when updating the details of users
that are already in the system.
Procedure
The job is recorded in the list and its status changes accordingly (Queued > In Progress > Finished
(Download)).
2. Click Finished (Download) in the Status column.
3. Open the Microsoft Excel template on your computer.
Column order and column names must stay unchanged, or else the import won’t be successful. Also, make
sure not to change the user IDs as it may lead to duplication in the system.
5. Drag and drop the Microsoft Excel template in the Import Users section or browse for it on your computer.
6. (Optional) Select the Email me when done checkbox to receive an email when the import is finished.
Related Information
The filtering option in Bulk User Import/Export allows you to export only the users that match your search
criteria.
Context
Procedure
A pop-up message informs you that the export has started and a job entry displays in the list.
6. Click Finished (Download) in the Status column to download the export file.
The system has filtered the users per your search criteria.
Related Information
Bulk Import/Export feature gives you more flexibility in defining pricebook export filters, as well as improved
error handling and quicker export/import speed.
You can import/export pricebooks in bulk in Setup Import/Export Bulk Import/Export Bulk User
Import/Export .The page is divided into three sections:
• Export Pricebook - contains buttons for initiating different exports in SAP CPQ:
• Export Template - exports a Microsoft Excel template with two sheets: Pricebooks (template for
defining pricebook details) and Template_Glossary (contains descriptions of columns in the Pricebooks
sheet).
Pricebooks are imported sequentially, that is, if several import jobs are submitted, pricebooks will be imported
one by one.
Note
The import process may take some time if there is an extensive number of rows in the pricebook, since the
system checks validity of each individual row and provides validation messages, which let you know if any
rows should be modified. If the import is taking too long, you can tick the Email me when done option and
check in as soon the import process is completed.
SAP CPQ administrators can upload translations for many products using XLSX or XLS files. You can export
translations of all products or products that match the filter criteria you provide. Product fields and languages
that are selected on Product Translations Import page are displayed in the exported file.
In Setup Product Catalog Products Product Translation Import , you can choose a language that
needs to be translated from product fields (reference language) and a target language.
Note
It is also possible to perform import/export of product translations directly from the Products page in
Setup.
When importing product translations, you can choose to use either SAP CPQ ID or Part number as a product
identifier when you want to import product translations. When SAP CPQ ID is selected, you can import or
export fields associated to the product object as well as the attribute and the attribute value object. When the
part number is selected, only the fields associated with the product object can be translated. The attribute
object and the attribute value object are disabled.
Exporting product translations is very similar to the process of exporting products – with ability to export
products from categories and to export all products.
Export Template - SAP CPQ exports a Microsoft Excel template with two sheets: Specification (explanation of
columns that can be populated) and Example (what the template that is ready for import should look like).
Export All Product Translations - SAP CPQ exports all selected product translation fields – fields from the
product object, the attribute object, and the attribute value object.
You can export translations for any product type (simple, configurable, collection, system, or parent/child
system).
Filter and Export - allows filtering pricebooks per the criteria you provide, and exporting the results in Microsoft
Excel.
• Useful Guidelines
SAP CPQ checks if the object (product, attribute, and attribute value) exists in the system. If product
system_Id doesn’t exist in the system, that row is skipped, and translations aren't inserted. The same
behavior is applied on attributes and attribute values. If they don’t exist in the product, they aren't inserted.
• Product
• Attribute
• Attribute value
• Reference language column – this column will be populated with chosen Translate from language. US
English is default.
• Language 1, Language 2 … - Each selected language for translation will be a separate column in xlsx file.
• If you rename column name, appropriate error message should be shown during the import.
• Columns and properties values should not be case sensitive.
Updating Product Translation: When you import a file, SAP CPQ should be able to understand whether product
translations already exist in the system for provided system_id. If yes, they will be updated.
The following topics guide the administrator through the Users section of the Setup.
A guest user in SAP CPQ is a user with limited access rights. For example, guest users may need to log in only
to browse products in the catalog with or without making the final purchase.
Administrator Side
To enable the guest user feature and allow browsing through products, administrators must first make
adjustments in the Setup.
• Create a user account that will be used for guest users and set the privileges for the categories and
products that should be visible to guest users. Make sure that the user is active, otherwise logging is
disabled.
• Create a company and a permission group for the guest user.
• Set up the workflow actions and permissions. Since a guest user has limited access to SAP CPQ features,
only some actions should be enabled (Add Item, Reprice, Save Quote and Copy).
All settings for guest users can be managed in Users Guest User and Default User Settings Guest User
Settings . The Guest User Settings tab contains the basic settings for guest users.
1. In Single Sign-On key and Single Sign-On vector, enter values to encrypt and decrypt a username.
You need to provide unique values.
2. Enable the Send Single Sign On Link to the Quote as result of NewQuote API method field.
3. Click Save.
Guest users can log into SAP CPQ in the following ways:
• login page - administrators should provide the username/password/domain. After logging, users land to
the catalog.
• direct link - the format of the link should be app_name/mt/domain_name (for example,
v60.webcomcpq.com/mt/Your_Domain). The login screen is skipped and users land to the catalog.
Before creating a new user account that will be used for guest users, there are some preparations to be done.
First, in administration under Users it’s necessary to click the Companies option to create a new company
(such as “GuestUserCompany”). After that, user has to click the User Groups option – leave the Start Page
option empty and don’t change Visual Styles (except for Shopping Cart/Quote if necessary, since all other
changes won’t be visible). After the user group has been created, it’s necessary to set up the privileges for
categories (and products) that are wanted to be visible for guest users (for more information see Product
Administration [page 18]).
Guest users should have at least the Add Item action available, which is why Workflow Actions must also be
set. Next step is to open the Work-flow/Approval menu and click on the Workflow Permissions option. User will
choose the by User Types Premission type of listing and select the guest user’s group he’s created by clicking
. This brings up the Workflow Permissions Edit screen.
In addition to the Add Items action, user can also add Calculate and Save Quote actions. All other actions aren’t
available for guest users and selecting them here won’t make any difference.
Now, Guest User account can be created. Click on the Users option under the Users menu and choose Add
New. Make sure that the newly created company and user group had been selected for Companies and User
Group, respectively.
After a guest user account has been successfully created, user can go to the Guest User and Default User
Settings option and select a Guest user.
Note
Inactive users won’t be able to log in, so try not to get into situations where your SAP CPQ is set up to use
inactive user as a guest account.
Related Information
User Registration allows users to create an account if you haven't previously created one for them.
Administrator Side
To allow users to register from the login page, activate the Allow User Registration toggle switch. If the toggle
switch isn't active, users can't register in the User Registration page and they are prompted to contact their
administrator.
1. In Custom Message, enter a message that appears on the User Registration page.
You can use HTML tags.
2. Activate the Allow User Registration toggle swich if you wish to allow users to self-register in the
environment.
3. Activate the Make New Self-registered Users Active toggle switch if you wish to allow new self-registered
users to be immediately active followiing their registration.
Note
he toggle switch is by default turned off, which means that newly registered users are inactive until
administrators make them active. If you wish to allow users to self-register in their environments (via
the Allow User Registration toggle switch), but not to be active by default, they need to select at least
one administrator who will receive self-registration email notifications and activate new users.
4. In Default User Type, select a user type that is assigned to all self-registered users (see User Types [page
144]).
5. In Default Password Expiration Period in Days for Self-Registered Users, define the number of days before a
password expires.
To prevent users from self-registering to SAP CPQ, enter -1 in this field.
6. In Default Ordering Parent and Default Managing Parent, select the users that will be assigned as the
ordering and managing parents [page 450], respectively, to self-registered users.
The field offers autocomplete suggestions as you type in characters.
7. In the Optional Fields list, select the fields that the user can optionally fill out during registration on the User
Registration page. The unselected fields are mandatory. Additionally, all fields that users must fill out are
listed in the dedicated list. All user custom fields [page 142] display in the registration page and they are
listed in this page as well.
8. Click Save.
The settings for the User Registration page are now set up.
9. Choose which administrators from the Available Administrators will oversee self-registered users and
approve their registrations. The Selected Administrators will be notified via emails whenever new users
register in their environment and will then be able to approve them.
When you create users, they receive an email notification, which you can customize, containing their account
information, such as username, password, first name, and so on.
The information displayed represents user field values that are accessed in Dictionaries [page 702]. For each
value, there’s a corresponding tag that pulls the value from the dictionary when a new user is created. By using
value-tag pairs, you can customize the email notification that the newly created users and self-registered users
receive.
To customize the email notification that the newly registered users receive:
The following table displays supported user field tags and the corresponding values the tags pull when new
users are created.
Values Tags
Username {{Username}}
Password {{Password}}
Email {{Email}}
Address1 {{Address1}}
Address2 {{Address2}}
URL {{URL}}
Domain {{Domain}}
City {{City}}
Province {{Province}}
Country/Region {{Country}}
State {{State}}
Phone {{Phone}}
Fax {{Fax}}
Title {{Title}}
Territory {{Territory}}
ID code {{IDCode}}
Brand {{Brand}}
Customizing the email notification for self-registered users is done in the same way as for the newly created
users, the only difference being the key used - UserRegistration.NotificationUser.Body. The following table
displays supported user field tags and the corresponding values the tags pull when users self-register an
account.
Values Tags
Username {{Username}}
Password {{Password}}
Email {{Email}}
Address {{Address}}
Address1 {{Address1}}
Address2 {{Address2}}
URL {{URL}}
Domain {{Domain}}
City {{City}}
Province {{Province}}
Country/Region {{Country}}
State {{State}}
Phone {{Phone}}
ID code {{IDCode}}
In addition, values and tags that are supported for self-registered users, Password being the exception, can
also be applied to the email notification administrators receive when users self-register. In this case, the
UserRegistration.NotificationAdmin.Body key is used.
Related Information
4.3 Users
The Users administration page enables you to manage the existing users in the system and add new ones.
To view a list of all users in the system or add new users, go to Setup Users Users . A list of all existing
users displays, and their total number is visible in the top-right corner of the page.
Users can be filtered by specific and advanced criteria. To quickly filter users, enter one of the following search
queries in the search box:
• username
• first name
• last name
• user type
• email address
Additionally, when using the Advanced Search, users can be filtered by:
• username
• first name
• last name
• user type
• email
• company
• address
Values in all columns can be sorted in ascending/descending order by clicking the column headings. Clicking
opens a pop-up where you can select the columns displayed on the Users page. Alternatively, clicking
the check mark in the upper-right corner of the Display Settings pop-up selects all columns.
Note
The additional columns display in the grid only the first time they’re added.
Editing user’s information is done by clicking the Edit button next to the corresponding username. In addition,
copying or deleting a user is done by clicking and selecting the appropriate action.
To create new user, go to Setup Users Add New User . All the information needed to create a user is
organized into the following four tabs: General, Address, Date and Number Settings, Additional Settings, and
Custom Fields. The Custom Fields tab contains all user custom fields [page 142].
General Tab
On the General tab, you define general information for the new user.
Note
Note
You can't create, import or change passwords of other regular users and SSO users during user
creation either via user import/export, user management in the Setup, or API.
7. Enable the Set temporary password toggle switch to create a temporary password for your underlying
users [page 131].
Administrators and users with delegated authority can create temporary passwords, which is useful when
users forget their passwords, when their accounts are locked, or when they have issues with resetting the
existing password.
Note
Enabling temporary passwords should be avoided whenever possible. Even though the password is
temporary, it is still shared with other users before it’s changed on the first login, and this may
potentially lead to security issues.
Address
On the Address tab, you define the contact information for the new user. The following table explains each field
displayed under the Address tab.
Field Description
Tip
Clicking Save & Go Back saves your changes and takes you back to the Users administration page.
On the Date and Number Settings tab, you define how the user views dates and numbers in SAP CPQ. The
following table explains each field displayed under the Date and Number Settings tab.
Field Description
Allow User to Change Time Zone When the toggle switch is enabled, the user is allowed to
change the time zone.
Tip
Clicking Save & Go Back saves your changes and takes you back to the Users administration page.
Additional Settings
On the Additional Settings tab, you define additional information for the new user. Depending on the type, the
settings are grouped into Market and Hierarchy sections.
Note
The following table explains each field displayed under the Additional Settings tab.
Field Description
Show Quotes Within (up to the current date) Specifies which quotes are visible to the user.
Default Market The default market retrieved for all new quotes.
Default Pricebook The default pricebook retrieved for all new quotes.
Default Dictionary A dictionary with default SAP CPQ UI text (button labels,
tooltips, warning messages, and so on).
Approval Parent Receives quotes submitted for approval. Whether or not the
user’s approval parent receives a quote depends on how the
rules are set up on the Approval Rules page.
Managing parent Can edit or delete child users. The managing parent can
also reassign quotes between child users.
Ordering Parent Receives all orders placed by child users for confirmation.
Tip
Clicking Save & Go Back saves your changes and takes you back to the Users administration page.
By default, regular users (who aren’t using the Federated Single Sign-On to log into SAP CPQ) receive two
emails. One of these emails contains a username and a domain, while the other one contains an URL, which the
email recipient needs to use in order to create a password. You can prevent SAP CPQ from sending emails after
registration is complete if the Do not email login details to users created by admin parameter is set to TRUE.
SSO users don’t receive any emails after they are created, regardless of the selected value of Do not email login
details to users created by admin as they are managed by another system, the client’s internal IdP. They can
only use Federated Single Sign-On method to log in. .
Companies who have SSO users to whom they wish to send email notifications [page 439] attached
to actions (for example, notifications for quote approval or quote rejection) need to update the
SAP CPQ URL which will be sent as a part of the emails. For example, if the URL was http://
tenantID.webcomcpq.com/Login.aspx, it should now consist of the user's IdP like this: https://
tenantID.webcomcpq.com/fed/domainName/Login.aspx?quote=CFCECFCACFCFC7CA.
Related Information
A temporary password gives users a possibility to log into SAP CPQ just to be able to create a new password
which won’t be shared with the administrator.
Administrators and users with delegated authority can create temporary passwords for their underlying users
in the General tab of the user creation process. Temporary passwords are useful in case users forget their
passwords, their accounts are locked, or they have issues with resetting the existing password.
To enable creating temporary passwords, set the application parameter Allow Admins to Set Temporary
Password to TRUE.
The application parameter Do not email login details to users created by admin defines whether the user will
receive email notifications. If the parameter is set to FALSE, the following occurs:
• if a temporary password is set for a new user, the user receives one email with the username, and another
email with the URL and the domain for which the temporary password was set.
• if a temporary password is set for an existing user, the user receives only the email with the URL and the
domain for which the temporary password was set.
In either case, you must communicate the temporary password to the user outside SAP CPQ (for exampe, via
email). After the user logs in with the provided temporary password, they are redirected to set a new password.
Note
This feature is available only for regular SAP CPQ users, not for SSO users.
The temporary password can also be set up through other features for creating/updating users:
If you forgot your password, you can reset it and regain access to your account. If you attempt to reset your
password three times within five minutes, you have to wait an hour before submitting a new password reset
request.
Procedure
Instructions on how to reset your password are sent to your email address.
4. Go to your inbox and find an email with the subject Reset your password.
5. Click the Reset Password button in the email or copy and paste the provided link to your browser.
Note
To ensure that your new password meets the required criteria, refer to the Password Requirements section.
7. Click Submit.
You're redirected to the login page. An email stating that the password is successfully changed is sent to
your address.
8. Go to the login page and use your new password to log in.
After logging in, you can easily change your password in User Page or in user settings in Setup. We advise
changing the password regularly to ensure better security and protect the privacy of your data.
User Page
Setup
In Users [page 126], administrators can create temporary passwords for users or define password expiration
periods.
4.4 Companies
Once companies are set up, you can assign individual users to a particular company. To view a list of all
companies in the system or add new companies, go to Setup Users Companies . A list of all existing
companies displays, and their total number is visible in the top-right corner of the page.
Companies can be filtered by specific and advanced criteria. To quickly filter companies, enter one of the
following search queries in the search box:
• name
• company code
• address(1)
• city
• state
• country/region
Additionally, when using the Advanced Search, companies can be filtered by:
• name
• company code
• address
Values in all columns can be sorted in ascending/descending order by clicking the column headings.
Clicking opens a pop-up where you can select the columns that are displayed on the Companies
page. Alternatively, clicking the check mark in the upper-right corner of the Display Settings pop-up selects all
columns.
Note
The additional columns display in the grid only the first time they’re added.
Editing company information is done by clicking the Edit button next to the corresponding company name. In
addition, copying or deleting a company is done by clicking and selecting the appropriate action.
All the information needed to create a company is organized into the following two tabs: General and
Permissions.
General
On the General tab, you define general information for the new company.
Note
Permissions
On the Permissions tab, you define permission groups that can administer the company. To move permission
groups from Available Permission Groups to Selected Permission Groups, you can:
• Type a search query into the Available Permissions Groups search box.
Permission groups matching the entered search query display as you type.
• Expand the group (for example Companies) and select a specific group from the list that displays (for
example SAP).
Alternatively, to expand all available permission groups, click Expand All. Selecting a specific permission
group from the list is done by either clicking on the name of the group in question or by clicking the arrow
which appears when hovering over the name of the group.
• Add all groups belonging to the main permission group.
To do so, hover over the name of the main permission group and click either Add all or the rightward-
pointing arrow.
The selected permission groups are listed in Selected Permission Groups.
Additionally, each of the selected permission groups can be removed from the list. Alternatively, to remove all
selected permission groups, click Clear All. Once permission groups are selected, click Save.
Alternatively, if you want to save your changes and go back to the Companies page, click Save and Go back.
Alternatively, if you want to save your changes and go back to the Companies page, click Save and Go back.
Related Information
In organizations that support multiple companies within a single SAP CPQ environment, administrators can
easily export/import multiple companies at once
In the Companies Export/Import page you can export/import companies following one of these workflows:
Import Template
The sample template lets you easily upload multiple new companies in SAP CPQ. To download the import
template, click Download Template in the Companies Export/Import page. The Excel file contains two sheets:
• Companies - enter details of the companies that you wish to import in this sheet.
• Important info - displays which fields are required and what are the restrictions for some fields. Required
fields are Company Name, Country/Region, Company code and System Id. Do not edit this sheet.
This procedure describes how to export all companies in the system, change their details, add new companies,
and import the updates in SAP CPQ.
Context
The best practice for importing new companies in the system is to do it through the import template. To update
existing company details, you need to export them from the system, change the data and then import them
again.
Procedure
1. Click Export.
Company Name, Country/Region, State, Company code, and System Id are required fields. Don’t
populate the MEMBER_ID column as these values are automatically generated by the system.
Additionally, you shouldn’t change the member id of the existing companies.
3. In Import, click .
4. Select the file for import.
5. Click Apply Template.
Invalid records are marked in red and errors are described in the Error Message column.
Related Information
If you have been granted access to another user’s account, you can log into SAP CPQ on their behalf to
troubleshoot and resolve the issues they encountered.
Note
The visibility of the Login as Proxy User page in default SAP CPQ tenants is now assigned via the Access
Rights feature. It can’t be accessed in other tenants regardless of the assigned access rights.
You can log in as a proxy user for both regular and SSO users [page 126].
If you’re an administrator and a user granted you access to their account, take the following steps to log in on
their behalf.
Related Information
The Permission Groups section in Setup Users allows administrators to add new and modify existing
permission groups.
Users should be included in a permission group to share access rights over SAP CPQ objects (Pricebooks,
Tables on Quotes, etc.). As a result, administrators can assign access rights to multiple users in one click.
Permission groups can be filtered by specific and advanced criteria. To quickly filter permission groups, enter
one of the following search queries in the search box:
Additionally, when using the Advanced Search, permission groups can be filtered by:
To add users to a group, administrators can perform simple and/or advanced search or browse for specific
users. To do a simple search, you select User Types, Companies, Markets, and Brands. The logic AND is applied
between each of the groups. However, if multiple values are selected within a group, the logic OR is applied.
When combining simple and advanced search, the logic AND is applied. The advanced search is performed
through formulas you can create when Advanced mode is selected.
To enable the same permission rights to all Sales Administrators who work in SAP Sales Cloud, you should
combine simple and advanced search. Selecting Sales and Sales Management user types and SAP Sales
Cloud company filters a group of Users that match both criteria. After an advanced formula such as
CTX(Visitor.IsAdmin ) is applied, the group is additionally filtered to Administrators. Due to AND logic between
the simple and advanced search, the Permission Group contains Sales Administrators from SAP Sales Cloud.
Advanced Mode
The Advanced Mode allows you to filter Users per custom fields and also per fields that aren’t included
in the simple search. To perform a search, you create a formula using SAP CPQ tags. Note that formulas
should primarily be used to inspect the field values for the logged User. Retrieving values from the Quote and
Configurator-related fields won’t return valid results.
Once a Permission Group formula is created, the system re-evaluates it on the following occasions to include/
exclude Users:
If you create a formula inspecting a Quote field, the system doesn't re-evaluate it every time a change is made
on the respective Quote but only when the Quote is loaded. The re-evaluation of formulas isn’t triggered by
the changes on Quotes and consequently, the formula filters the same Users as before the change was made.
Reloading the Quote re-evaluates the formula and corresponding Users are included in the Permission Group.
To create a Permission Group, you can either apply simple and advanced filter criteria or browse for exact
Users you wish to include in the group.
Procedure
Note
If you know the names of Users you wish to include, you should skip the simple and advanced search
and enter their name in the Users search field. Multiple selections is allowed and the list of Users is
displayed below the search field.
For more details on defining permission groups, click See how to combine fields into permission group,
placed above Available Permission Groups.
The SAP CPQ catalog can be searched via the quick search or the advanced search.
Quick Search
Catalog Quick Search works with an autocomplete option. Users conduct the search by entering a key word(s)
for the name/description of the product they are looking for. Quick Search will look for the product’s name/
description in the user selected language. If it doesn’t find the translation, Quick Search will then look for the
product name/description in the user default dictionary. The Quick Search result will always contain an entire
text body of the product name/description that users enter. In other words, if you search for a product with
the word “window” in it, and you enter the word “indow,” your Quick Search result will comprise all products
containing the word “indow” in them.
We have defined several parameters to improve search performance in Catalog Quick Search with an
autocomplete option. For now, if a number of products in the system exceeds 100,000 for search by Part
Number and Product Name, and 10,000 for search by Description, Word or Phrase, the words entered in the
Search box must equal the starting sequence of the text searched. Hidden parameters may be modified by SAP
CPQ administrators in the capacity that will not affect search performance.
These parameters are not used when using options Show more results and Advanced Search.
Advanced Search
Advanced search works a bit differently. When the user enters the search box field, Advanced Search will divide
the text into word segments (the search will follow the same search logic of the user selected language; if
it doesn’t find the translation, Advanced Search will then look for the product name/description in the user
default dictionary). The role of the functionality’s application parameter, “When users enter several words in
search box, SAP CPQ will find products based on each entered word (instead of searching based on entire
phrase)” is to define if the result of the product name or description must contain all individual words in the text
entered, (though not necessarily in the same order) within their textual values; or if it can contain at least one
word from the text entered.
The explanation provided in this document refers only to using the search by entering the product name/
description field.
User custom fields allow you to add additional fields for users.
To view a list of all user custom fields in the system and/or add new custom fields, go to Setup Users
User Custom Fields . A list of all existing user custom fields displays, and their total number is visible in the
top-right corner of the page.
User custom fields can be filtered by specific and advanced criteria. To quickly filter user custom fields, enter
one of the following search queries in the search box:
• name
• label
Additionally, when using the Advanced Search, user custom fields can be filtered by:
• name
• label
• rank
• type
• whether information logging is suppressed or not.
Values in all columns can be sorted in ascending/descending order by clicking the column headings.
Clicking opens a pop-up where you can select the columns displayed on the User Custom Fields
page. Alternatively, clicking the check mark in the upper-right corner of the Display Settings pop-up selects all
columns.
Note
The additional columns display in the grid only the first time they’re added.
Editing a user custom field is done by clicking the Edit button next to the corresponding field name. In addition,
copying or deleting a user custom field is done by clicking and selecting the appropriate action.
To create a new user custom field, go to Setup Users User Custom Fields Add New User Custom
Field . All the information needed to create a user custom field is organized into the following two tabs:
General and Permissions.
Note
General
On the General tab, you define general information for the new user custom field.
Permissions
On the Permissions tab, you define user custom field permissions. The tab displays:
• Same permission for all Permission Groups - the switch is enabled by default, allowing all users in the
system the same type of access to the user custom field.
• Field permission dropdown list - here you select the type of access for the users.
• Editable - the user custom field can be edited.
To grant the same access to users, leave the toggle switch enabled and select the type of access from the
dropdown list.
When the toggle switch is disabled, you define permission groups for each of the four field permissions by
moving permission groups from Available Permission Groups to Selected Permission Groups. If a user custom
field is hidden for all permission groups, it can’t be seen or changed on User Page > Modify Personal Details, but
the local administrator can still manage that field for the users.
Related Information
For example, products, reports and workflow actions can have permissions set according to user types. To view
a list of all user types in the system and/or add new user types, go to Setup Users User Types . A list of
all existing user types displays, and their total number is visible in the top right corner of the page. User types
can be filtered by specific and advanced criteria. User types can be quickly filtered by group name. Additionally,
when using the Advanced Search, user types can be filtered by:
• group name
• group description
• XSLT file
• start category
• whether or not a user is able to create a quote from an incomplete configuration.
Values in all columns can be sorted in ascending/descending order by clicking the column headings. Clicking
opens a pop-up where you can select the columns that will be displayed on the User Types page.
Alternatively, clicking the check mark in the upper-right corner of the Display Settings pop-up selects all
columns.
Note
The additional columns will display in the grid only the first time they are added.
copying or deleting a user type is done by clicking and selecting the appropriate action.
You can add a new user type in Setup Users User Types Add New User Type .
Context
Group name is the only required field. However, it’s recommended to fill out other fields too.
Procedure
• Select Product – a list of configurable and parent/child product items. The system saves the system ID
of the selected product so it can be used in scripting (User.UserType.LandingProductSystemId).
• Select Page – a predefined list of pages:
• Home Page (default) – default page on which users land, for example Catalog
• Quote List – a list of existing quotes.
• New Quote – an empty quote.
• New Quote – Customer Tab – the Customer Info tab of an empty quote.
Categories with a downward-facing arrow next to it contain subcategories. Clicking the arrow expands the
category.
Note
For more details on setting up landing page for a user type refer to Setting Up a Landing Page [page
147].
Alternatively, to save your changes and go back to the User Types page, click Save & Go Back.
Note
Selections made in Start page and Start category apply to users logging directly into SAP CPQ and
users landing from external CRM systems (Salesforce, MS Dynamics and NetSuite CRM systems).
XSL and XSLT files, which are also referred to as transformations, are used to customize the layout and the
information displayed on the following pages: Shopping cart/Quotes, My Quotes, Waiting for Approval, Place
Order, Other Quotes, and Preview.
A different XSL/XSLT file can be assigned to each visual style available in the Legacy UI Design section
by selecting a file from the dropdown list. Alternatively, files specially tailored for company’s needs can be
uploaded by clicking Upload new file. You can download or delete the XSL or XSLT files you selected or
uploaded. If no files are selected for the above-mentioned pages, the system uses the default transformations
defined in Setup General Application Parameters .
NameName Description
Visual styles (Shopping cart/Quotes) Defines the XSL file that is used to render a quote page.
Visual Style (My Quotes) Refers to the tab displayed on the Existing Quotes page.
Visual Style (Waiting For Approval) Refers to the tab displayed on the Existing Quotes page.
Visual Style (Place Order) Defines the XSL file for the screen that shows a summary of
the order.
Visual Style (Other Quotes) Refers to the tab displayed on the Existing Quotes page.
Visual Style (Preview) Defines the XSL file for the page used to display a quote
preview (Preview action).
Related Information
To define where users land after they exit Setup, log into SAP CPQ and land from CRM, these settings need to
be managed.
To determine the landing page for a user, the system first evaluates the start page. If the start page isn’t
defined, users land into Catalog, regardless of the value of other parameters. If the start page is Catalog -
With empty quote and New Quote, the system also evaluates the value of When creating a new quote, require
customer to be selected first, Default (Pre-populate) with User Info, and Default(Pre-populate) with User's
Company Info. If the selected start page isn’t in the quote context, the parameters aren’t treated and users land
to the selected start page.
Note
If When creating a new quote, require customer to be selected first is enabled and the parameters for
prepopulating user and company info are on, users land into the Catalog and an empty quote is created in
the background.
Related Information
If When creating a new quote, require customer to be selected first is on and the two options for prepopulating
data on the Customer Role Defaults page are selected, users land into Catalog with an empty quote in
the background since the Customer Info tab has been prepopulated. If When creating a new quote, require
customer to be selected first is disabled and Create Empty Quote First is TRUE, users land on the Quotation tab
of an empty quote.
Note
Whenever When creating a new quote, require customer to be selected first is enabled, regardless of other
settings, a new quote is created in the system. The only scenario in which a new quote isn't created is if
Related Information
This section contains description of all features that are related to creating and managing quotes in SAP CPQ.
This feature allows administrators to create document templates with tags that retrieve specific quote details.
Users, on their side, can generate documents based on those templates. The format and style of the resulting
printable document, including fonts, colors, and images, is entirely based on the layout of the document
template. Once users create a quote, they often need to email the details to customers for further review.
The Document Generation feature provides a practical solution for that, while providing administrators with
sufficient autonomy to define the format and the style of the document. Users can generate simple documents
with only one section, as well as section documents to be later included in multisection documents.
For data to be displayed in generated documents, you need to enter dedicated tags in the template. Each tag
can retrieve any specific quote details, configuration, customer, or user-related information that is meant to
be displayed in the output document. The list of all tags and a detailed explanation with examples is in the
Document Generation Tags [page 153] section. Alternatively, you can use the standard CTX tags instead of
quote template tags to retrieve data.
Tip
If you need to create templates with basic quote details and you don't have experience with document
generation tags, use the Template Creation Tool.
In addition to tags, you can also insert any object that Microsoft Word supports into a Microsoft Word template,
such as an image or another document file (which can be another document template). Administrators can
configure document templates in Setup Quotes Document Generation Templates . This feature owes
its flexibility to the fact that administrators can define the visibility and format permissions, as well as select
additional fields and documents to be included in the generated document. Additionally, administrators can
enable users to administer templates on the user side.
5.1.1.1 C Tags
C tags retrieve data for each item in a quote. The system processes C tags only if they are within C2 tags.
Tag Description
<<C_TAG()>> The basic C tag. Add any modeling tag (CTX tag, table tag,
etc.) in the parenthesis.
<<C_ROLLED_UP_LIST>> Sum of extended list prices for all line items. Applicable only
when added to main items.
tag should be used only when the document that you want
to insert doesn't have any data that is dynamically retrieved
via tags. In that case, when there's dynamic data in the
file, use the <<C_PATTR_FILE()>> tag. The name of the file
must contain the extension.
The following C tags are considered to be obsolete and can be replaced with CTX tags [page 731].
<<C_ID>> Retrieves the ordinal number of the item in the quote. For
child items with cart IDs 5.1 and 5.2, for example, the tag
retrieves 6 and 7 as items' ID.
<<C_ROLLED_UP_DESIRED>> Sum of net prices for all line items. Applicable only when
added to main items.
<<C_ROLLED_UP_LIST>> Sum of extended list prices for all line items. Applicable only
when added to main items.
<<C_ROLLED_UP_BASE>> Sum of base list prices for all line items. Applicable only
when added to main items.
5.1.1.2 Q Tags
Q tags retrieve quote data (currency, user and owner data, etc.).
The following tables display Q tags that you can add anywhere in the document template to retrieve data from
quotes. Q tags mainly retrieve general quote information (currency, user and owner data, etc.).
Tag Description
Tags Description
Other Tags
In these tags, we'll use an example custom field Company Policy.
The following Q tags are considered to be obsolete and can be replaced with CTX tags [page 731].
Tag Description
<<Q_QUOTE(DATE_CREATED)>> Retrieves the date when the quote was created, displayed in
the user's date format. For other formatting, use the CTX
tags:
<<Q_TAG(<*CTX(Quote.DateCreated.Format(dd.MM.yy) )*
>)>> and
<<Q_TAG(<*CTX(Quote.DateCreated.Format(dd,MMMM
yyyy))*>)>>.
<<Q_QUOTE(DATE_MODIFIED)>> Retrieves the date when the quote was last modified,
displayed in the user's date format. For other formatting,
use the CTX tags:
<<Q_TAG(<*CTX(Quote.DateModified.Format(dd.MM.yy)
)*>)>> and
<<Q_TAG(<*CTX(Quote.DateModified.Format(dd,MMMM
yyyy))*>)>>.
Company Tags
Tag Description
Tags Description
Tags
<*CTX(Quote.Cus
tomer(BillTo).Custom
Field(FieldName))*>
Note
Every tag that inserts files supports these formats: DOCX, PDF, and images (BMP, EMF, GIF, ICO, JPG,
JPEG, PCX, PNG, TIF, TIFF, WMF).
This page lists various tags that don't belong to any of the categories.
• HTML [HTML(…)] HTML tag takes the content and interprets is as HTML and inserts it
in the document. For example, [HTML(<<C_DESC>>)] . If <<C_DESC>> returns <a href=“http://
www.webcominc.com”>Webcom, Inc.</a>, the link is inserted in the document. If there's any text before
or after the HTML tag, the HTML content will be inserted in a new paragraph right before it. For example:
text before - [HTML(<<C_DESC>>)] - text after. Will result in: html returned content text before - - text
after. To include static text and have it on same line, just simply put it inside HTML tag. [HTML(text before -
<<C_DESC>> - text after)]
Tag Description
<<ST_USERFILE()>> Used for embedding files in the templates. Add this tag to
the part of the template in which you wish the file to be
displayed and add its name in the parenthesis. When a user
generates a document, they can upload a file and select it
from a dropdown list which is named after the value you've
entered in the tag parenthesis.
<<ST_USERFILE_IMG()>> Images can be uploaded and placed exactly where the tag
is located in the template. The name of the file with the
extension must be stated in the parenthesis.
<<ST_GROUP_LABEL()>> Returns the label of the cart items group with the id you
provided. (for example, << ST_GROUP_LABEL (A)>>).
<<ST_PTYPE_NETPRICE()>> Calculates the Netprice for the product type provided by tag
(for example, <<ST_PTYPE_NETPRICE(Accessories)>>)
Example
Assuming that SAP CPQ administrator has already defined a custom table named
additional_options_custom_table with two columns: additional_description and options, you can create a
template section to display data from the custom table as follows:
<<C2>>
<<MAIN>>
<<CUSTOM_TABLE(additional_options_custom_table)>>
<<CUSTOM_TABLE_HEADER>>
Additional description —- Options
To display parent/child product structure in generated documents, you should add MAIN tags for children
products inside parent MAIN tags.
The first main item in the tag structure can be any root item from the quote, which satisfies the condition. All
main tags inside that tag act as children items. Furthermore, there can be a child main tag inside a child main
tag, and so on. Main tags should be marked with a number according to their level (the root main item (parent
product) is marked with 1 and children main items are marked with 2, 3, etc, respectively). Nesting is possible
up to 9 main items.
<<QUOTE_PRODUCTS>>
<<NESTED_PRODUCTS>>
<<MAIN_1>>
<<CONTENT>>
<<CONTENT_END>>
<<LI>>
<<CONTENT>>
<<CONTENT_END>>
<<LI_END>>
<<MAIN_2>>
<<CONTENT>>
<<CONTENT_END>>
<<LI>>
<<CONTENT>>
<<CONTENT_END>>
<<LI_END>>
<<MAIN_3>>
<<CONTENT>>
<<CONTENT_END>>
<<LI>>
<<CONTENT>>
<CONTENT_END>>
<<LI_END>>
<<MAIN_END_3>>
<<MAIN_END_2>>
<<MAIN_END_1>>
<<NESTED_PRODUCTS_END>>
<<QUOTE_PRODUCTS_END>>
Tip
If you add conditions for retrieving nested products, the <<CONDITION_END>> tag isn't required.
Note
• without sorting preferences - takes one parameter, for example a CTX formula, and orders items by the
parsed value of that formula.
• with sorting preferences - takes two parameters, for example a CTX formula and sorting preferences, and
orders items by taking the items that were filtered out and sorts them in the specified order.
<<MAIN_1:
SORT_BY(<*CTX( Quote.CurrentItem.PartNumber )*>::PartNumber1,PartNumber2,PartN
um3)>>
Conditions
If needed, you can add a condition to the <<MAIN>> and <<LI>> tags to limit which items are displayed in the
document. The condition on each tag is parsed independently. If the condition is not met, the content of that
tag and the underlying tags are not displayed.
In order to set the condition, it is necessary to define a formula. This formula is parsed during document
processing. The condition is satisfied if the result of formula is 1.
Note
Examples
Example 1
<<QUOTE_PRODUCTS>>
<<NESTED_PRODUCTS>>
<<MAIN_1:CONDITION(Hardware)>>
<<CONTENT>>
…Some Parent Item Information…
<<CONTENT_END>>
<<MAIN_2:CONDITION(Software)>>
<< CONTENT>>
…Child Item 1 Information…
<<CONTENT_END>>
<<MAIN_END_2>>
<<LI:CONDITION(Memory)>>
<<CONTENT>>
…Parent Line Item Information…
In this example, children main tags are nested inside parent main tags. The parent main tag range is marked
with MAIN_1 and MAIN_END_1, and a child main tag is marked with MAIN_2 and MAIN_END_2 inside a parent
tag. The system prints information for the parent item, which is of type Hardware. After that, child item
information will be printed (for all children items of type Software), and then again parent item information will
be printed, followed by a parent line item information of type Memory. This way, information from the child item
is printed multiple times in the parent item. Also, child tag can have another child MAIN tag inside, to describe
real SAP CPQ product nesting.
Example 2
There can be multiple CONTENT tags defined, so HEADER, and FOOTER tags are redundant. The example
below shows a MAIN root tag structure:
<<MAIN_1>>
<<CONTENT>>
…Some Parent Item Information…
<<CONTENT_END>>
<<MAIN_2>>
<< CONTENT>>
…Child Item 1 Information…
<<CONTENT_END>>
<<MAIN_END_2>>
<<CONTENT>>
…More Parent Item Information…
<<CONTENT_END>>
<<LI>>
<<CONTENT>>
…Parent Line Item Information…
<< CONTENT_END>>
<< LI _END>>
<<MAIN_END_1>>
In the example illustrated above, there are two different CONTENT tags, which pull information from the root
item, and between them there's information from the child main item. Following that, information from a
root line item are printed. Also, HEADER and FOOTER tags are redundant in this case, since CONTENT could
replace both of them.
Example 3
If we have an EP String root item information that we want to print, and we want to print some EP Compressor
and EP Steam Turbine child information inside the parent, printed on different places (multiple times inside a
parent) this is how it should be possible to do that (LINE item tags are left out in an example because it's easier
to focus on main item nesting):
<<QUOTE_PRODUCTS>>
<<NESTED_PRODUCTS>>
<<MAIN_1:CONDITION([EQ](<*CTX( Quote.CurrentItem.ProductTypeName )*>,EP
String))>>
<<CONTENT>>
…Some String Information…
<<CONTENT_END>>
<<MAIN_2:CONDITION([EQ](<*CTX( Quote.CurrentItem.ProductTypeName )*>,EP
Compressor))>>
<<CONTENT>>
…Some Compressor Information (repeat for as many compressors)…
Use container tags to display data from a container in SAP CPQ in a generated document.
<<MAIN>>
<<CONTAINER(ContainerName)>>
<<CONTAINER_HEADER>>
<<CONTAINER_HEADER_END>>
<<CONTAINER_ITEM>>
<<CONTAINER_ITEM_END>>
<<CONTAINER_FOOTER>>
<<CONTAINER_FOOTER_END>>
<<CONTAINER_END>
<<MAIN_END>>
Inside CONTAINER sections, use CONTAINER_TAG with a CTX tag to retrieve data (for example,
<<CONTAINER_TAG(<*CTX(Container(Project Tasks).Row(2).Column(Total).GetFormatted))*>)>> returns
the value of the Total column for the second row in the container, keeping the original format).
You can use the C2 tags when you wish the system to iterate through all items in a quote.
You can add C2 tags only to main and line items. You can't add a C2 loop inside a C2 loop, but you can add a
condition inside a C2 loop. Make sure you don't add too many C2 tags (500 tags and more) because that will
affect the performance poorly.
Note
If you separate C2 loop into two or more sections by placing them inside table cells, or in any other way, the
output will not work.
Below is the outline of the structure of a C2 tag. You can copy/paste the structure in your template and enter
any additional tags.
<<C2>>
<<HEADER>>
<<HEADER_END>>
<<MAIN>>
<<C_STOP>>
<<MAIN_END>>
<<LI>>
<<C_STOP>>
<<LI_END>>
<<FOOTER>>
<<FOOTER_END>>
<<C_END>>
Note
Opening and closing tags (for example, <<LI>> and <<LI_END>>) must each be displayed in a separate
row.
A C2 tag can optionally have four sections (header, main items, line items, and footer) and each of them is
described in more details below.
Header
A header is displayed only once at the beginning of a C2 tag. You can add only Q tags inside the header because
other tags aren't parsed. If there's a table in your template, the table header should be displayed in the header
tags.
Note
If you have a table that displays on more than one page, check the Repeat as header row at the top of each
page in Word to display the header on each page.
The main tag retrieves all main items in a quote (there should be one set of MAIN tags for each main item). For
the system to properly process the items, you need to add the <<C_STOP>> tag before the closing main tag.
If there’s parent/child item structure, the system treats child items as main items. If tabular representation is
needed, you should add table rows that contain item data.
Line Items
The line item tag retrieves all line items in a quote (there should be one set of LINE ITEM tags for each line
item). For the system to properly process the items, you need to add the <<C_STOP>> tag before the closing
line item tag. If you need to represent line items in a table, you should add table rows within the line item tags.
Footer
A footer is displayed only once at the end of a C2 tag. You should add only Q tags inside the footer because
other tags aren't parsed. If there's a table in the template, the table footer should be displayed in the footer
tags.
Note
There has to be at least one blank space (or a new line) after <<C_END>> for the system to process it
properly.
Other C2 Tags
Tag Description
<<C2_PTYPE_ALL_SortByRankButStartWith(First,Second, This tag enables you to sort product type rank order, but
Third...)>> you can state which rank order to start with product types.
If you have four product types, such as Drive ranked 5,
Hardware ranked 2, Services ranked 3, and Computers
ranked 1, tag
<<C2_PTYPE_ALL_SortByRankButStartWith(Drive,Hardwa
re, Services)>> sorts all your products by Drive, Hardware,
and Services first. In this case the sorting starts with
Computers, followed by the remaining product types in
order by rank. The new sort type enables you lots of
flexibilities when ordering your product types.
<<C2_PTYPE_ALL_SortByNameButStartWith(Drive, This tag enables you to sort the product type in the
Services, Hardware, Computer)>> alphabetical order, but you can state which rank order
to start with. If you have four product types, such as
Drive ranked 5, Hardware ranked 2, Services ranked 3, and
Computers ranked 1, this tag sorts all your products by
Drive, Services, and Hardware first; then, it starts sorting
the types in the alphabetical order, and would start with
Computers followed by the remaining product types in
the alphabetical order by name. This tag gives you lots of
flexibilities when ordering your product types.
<<C2_CONSOLIDATE(...)>>
This tag consolidates items based on a common denominator. For example, if we have 2 items with the same
part number, using consolidate (<<C2_CONSOLIDATE(C_PNUM)>>) lists it only once.
<<HEADER>>
<<HEADER_END>>
<<ITEM>>
Item number: <<UNIQUE(C_PNUM)>>
Item QTY: <<SUM(C_QTY)>>
Item IDs: <<APPEND(C_ID)>>
<<C_STOP>>
<<ITEM_END>>
<<FOOTER>>
<<FOOTER_END>>
<<C_END>>
In the above example, items are consolidated based on the part number. <<UNIQUE(C_PNUM)>> lists the
unique part number. Important thing to note is that the inner tag (C_PNUM) in this example shouldn’t be
<<C2>> tag can be used in Excel template as well. In Excel, you define a cell range where you want to render
information. You don’t need to define the range for tags that retrieve simple data, for example C and Q tags.
This example shows scenarios in which you want to display line items that are optional. Notice that 10 rows
and 10 columns are allocated for this information to be rendered and for each main and line item that are being
allocated one more row. Also notice that main item aren't displayed, based on the condition we have set, but
<<MAIN>> tag must exist in the template to follow a valid template tags sequence.
5.1.1.9 Conditions
Standalone conditions and tag-dependent conditions let you restrict what data tags retrieve.
Standalone conditions can be added anywhere in the template and they aren’t dependent on any tags.
Standalone conditions are used to control if section of a document are displayed or not. Conditions are
processed after all the other tags have been processed. Using conditions may slow down a performance if large
number of conditions are used to determine in the end if one section is displayed or not. On the left side is a
tag whose value is compared and on the right side is list of values to compare with. Values are separated by “|”
Conditions can use the OR logic. To check if value is equal use ”=” and if not equal use ”!”. Typical examples of
conditions are as follows:
[CONDITION,<<Q_QP(myproperty)>>=golf|soccer|basketball]
Any static text or tables or tags
[CONDITION_END]
As seen in the example, condition tags can't be used in a single line - they must be separated into multiple lines.
Conditions can also consist of several expressions connected by the AND (&&) operator. All expressions within
the combined condition need to be TRUE for the condition to be fulfilled.
Note
The AND logic can only be used in the new document generation engine.
Caution
[CONDITION,…] tags don’t support table tags (<*Table(SQL query)*>). Also, [CONDITION,…] tags must
not be nested.
Conditions aren’t required in templates. They allow you to retrieve data only when the condition is fulfilled.
Tag Conditions
Tag conditions can be applied to every tag to perform an action based on the value the tag returned. Not all
condition tags can be used in both document generation engines and in both Microsoft Excel and Microsoft
Word templates.
D Deletes a line.
P Inserts a page break after the value that the tag retrieves.
p Inserts a page break before the value that the tag retrieves.
DELETE_TABLE Deletes the content of the entire table, if the value is dis
played in a table.
The content of quote tables can be included in documents generated in SAP CPQ. To retrieve the content, use
the following tags:
• «QUOTE_TABLE(TableNameHere)»
• «QUOTE_TABLE_HEADER» (Enter column definitions or what you want to display on header for the table).
• «QUOTE_TABLE_HEADER_END»
• «QUOTE_TABLE_ROW»
• «QUOTE_TABLE_COLUMN(NameOfColumnHere)» …
• «QUOTE_TABLE_COLUMN(AnotherColumnHere)»
• «QUOTE_TABLE_ROW_END»
• «QUOTE_TABLE_FOOTER» (Enter column totals or what you want to display on footer for the table).
• «QUOTE_TABLE_FOOTER_END»
• «QUOTE_TABLE_END»
Note
When SAP CPQ is integrated with SAP Subscription Billing, you can use these tags in the document generation
template to retrieve elements specific to the integration.
See Quote Item Fields on SAP Subscription Billing Products for a list of CTX tags which you can use to retrieve
the values of standard subscription item fields in the quote.
<<C2>>
<<MAIN>>
<<C_PNAME>>
<<CHARGES>>
One Time
<<One_Time>>
Recurring
<<Recurring>>
<<Rate_Plan_Element>>
<<Price>>
<<Discount>>
<<Total>>
<<Recurring_End>>
<<Block_Pricing>>
<<Rate_Plan_Element>>
<<Included_Quantity>>
<<Block_Size>>
<<Price>>
<<Discount>>
<<Total>>
<<Block_Pricing_End>>
<<Tiered_Pricing>>
<<Rate_Plan_Element>>
<<Minimum_Blocks>>
<<Block_Size>>
Pricing Tiers
<<Pricing_Tiers>>
<<Up_To>>
<<Price_Per_Block>>
<<Discount_Per_Block>>
<<Total_Per_Block>>
<<Pricing_Tiers_End>>
<<Tiered_Pricing_End>>
<<Volume_Pricing>>
<<Rate_Plan_Element>>
<<Minimum_Blocks>>
<<Block_Size>>
Tiers
<<Tiers>>
<<Up_To>>
<<Price_Per_Block>>
<<Discount_Per_Block>>
<<Total_Per_Block>>
<<Fixed_Price>>
<<Fixed_Discount>>
<<Fixed_Total>>
<<Tiers_End>>
<<Volume_Pricing_End>>
<<Percentage>>
<<Rate_Plan_Element>>
<<Price_Per_Unit>>
<<Discount>>
<<Total>>
<<Ratio>>
<<Percentage_End>>
<<CHARGES_END>>
<<MAIN_END>>
<<C_END>>
The SECTIONS loop makes SAP CPQ iterate through all Solution Design sections and retrieve information such
as their names, hierarchy Ids, ranks (the ordinal numbers of the sections’ rows), values from all their custom
fields, and section totals.
Below is the structure of a SECTIONS loop. You can copy/paste the structure in your template and enter any
additional tags.
<<SECTIONS>>
<<SECTIONS_HEADER>>
<<SECTIONS_HEADER_END>>
<<SECTIONS_LOOP>>
<<SECTIONS_LOOP_END>>
<<SECTIONS_FOOTER>>
<<SECTIONS_FOOTER_END>>
<<SECTIONS_END>>
To filter only a specific type of sections, add the section type in the opening loop tag:
• Regular «SECTIONS(Regular)»
• Distribution «SECTIONS(Distribution)»
Section Products
To retrieve all products in a section, you should use the SECTION_PRODUCTS tag. Check the following example
for the document structure:
<<SECTIONS>>
<<SECTIONS_HEADER>>
This is the document header.
<<SECTIONS_HEADER_END>>
<<SECTIONS_LOOP>>
<<C_TAG(<*CTX(Quote.Sections.CurrentSection.Name)*>)>>
<<SECTION_PRODUCTS>>
<<C_TAG(<*CTX(Quote.CurrentItem.ProductInfo.ProductName)*>)>>
<<SECTION_PRODUCTS_END>>
<<SECTIONS_LOOP_END>>
<<SECTIONS_FOOTER>>
This is the document footer.
<<SECTIONS_FOOTER_END>>
<<SECTIONS_END>>
Header
The header is displayed only once below the opening SECTIONS tag. It can contain a table with the section
name, rank, hierarchy, and any custom fields, the values of which you wish to add. It’s also possible to add Q
Tags [page 155] in the header, if needed.
Loop
Section items you’ve filtered in the opening SECTIONS tag are processed in this part. C Tags [page 154] can be
used inside the loop, along with CTX Tags [page 731] for retrieving hierarchy Id, rank, and the section name, as
well as custom fields.
Footer
In Microsoft Excel templates, the SECTIONS loop has the following structure:
<<SECTIONS>>
<<SECTIONS_HEADER>>
<<SECTIONS_LOOP>>
<<SECTIONS_FOOTER>>
For filtering section items in the opening SECTIONS tag, you can use the condition SECTION_TYPE (not case
sensitive), with the allowed values ALL, REGULAR, DISTRIBUTION, DISTRIBUTED (not case sensitive).
Example of the syntax for the use of the SECTIONS loop in a Microsoft Excel template: <<SECTIONS(13X5 |
SECTION_TYPE: Distributed, Regular)>>. In this example, the tag retrieves 13 rows and 5 columns of
sections of the type Distributed and Regular.
Template Structure
Below is the outline of the structure of a template with INVOLVED_PARTIES tags. You can copy/paste the
structure in your template and enter any additional tags.
The INVOLVED_PARTIES_LOOP should contain the CTX tags inside the C_TAG. Below are listed the supported
CTX tags:
<<C_TAG(<*CTX( Quote.InvolvedParties.CurrentInvolvedParty.PartnerFunctionName)*>
)>>
<<C_TAG(<*CTX( Quote.InvolvedParties.CurrentInvolvedParty.PartnerFunctionKey)*>)>
>
<<C_TAG(<*CTX( Quote.InvolvedParties.CurrentInvolvedParty.ExternalId)*>)>>
<<C_TAG(<*CTX( Quote.InvolvedParties.CurrentInvolvedParty.Name)*>)>>
<<C_TAG(<*CTX( Quote.InvolvedParties.CurrentInvolvedParty.FirstName)*>)>>
<<C_TAG(<*CTX( Quote.InvolvedParties.CurrentInvolvedParty.LastName)*>)>>
<<C_TAG(<*CTX( Quote.InvolvedParties.CurrentInvolvedParty.Country)*>)>>
<<C_TAG(<*CTX( Quote.InvolvedParties.CurrentInvolvedParty.State)*>)>>
<<C_TAG(<*CTX( Quote.InvolvedParties.CurrentInvolvedParty.Region)*>)>>
<<C_TAG(<*CTX( Quote.InvolvedParties.CurrentInvolvedParty.CityName)*>)>>
<<C_TAG(<*CTX( Quote.InvolvedParties.CurrentInvolvedParty.PostalCode)*>)>>
Note
Filtering by partner function key is possible in both .docx and .xlsx documents:
• in a .docx template, pass the partner function key as an argument to the <<INVOLVED_PARTIES>> tag (for
example, <<INVOLVED_PARTIES(BLT)>> ).
• in an .xlsx template, add the partner function key as a condition for the <<INVOLVED_PARTIES>> tag (for
example, <<INVOLVED_PARTIES(7X25 | PARTNER_FUNCTION: BLT)>>).
Related Information
Here you can download Microsoft Word and Microsoft Excel templates that contain several frequently used
tags for document generation and CTX tags for retrieving specific data.
The templates contain some simple examples and can be used as a reference for the proper usage of
document generation tags. [page 153]
Download the Excel Templates Examples zip file that contains these templates:
• Container Tags Example - a simple template for retrieving data from a container column using CTX tags.
• C2 Loop with PTYPE and Condition - this template contains three examples for using the C2 loop with
product type tags and condition tags.
• Quote Tables Excel - a simple template for retrieving data from a quote table.
• C2 Loop Listing Items - an example Microsoft Excel template with two sheets. The first sheet contains Q
tags for retrieving basic quote information and a C2 loop for listing items. The second sheet contains Q
tags and CTX tags for retrieving customer details.
• Involved Parties - a simple Microsoft Excel template for getting business partner and partner function
detailes using document generation tags and CTX tags.
• Custom Table Excel - a simple Microsoft Excel template for retrieving custom table data in a generated
document.
• Solution Design Regular - a simple Microsoft Excel template for retrieving details of regular sections [page
174] in the Solution Design tab.
Download the Word Templates Examples ZIP file that contains these templates:
• C2 Loop Simple - a simple template that lists items, their descriptions and product types. This template
also contains CTX tags that retrieve the list price of items and the total list price.
• C2 Loop with PTYPE Tag - a template with the C2 loop and the PTYPE tag. The PTYPE tag retrieves items
that have the Software product type in the first block and the Hardware product type in the second block.
• C2 Loop with Container Tags - the tags in this template retrieve data from columns in a container.
• Quote Tables Word - a simple Microsoft Excel template for retrieving data from a quote table.
• C2 Loop with Conditions - the C2 loop lists all items that have a product type different from Service.
Additionally, a condition is added so that items that have a list price equal to 0 are not displayed in the
generated document.
• Involved Parties - a simple Microsoft Word template for getting business partner and partner function
detailes using document generation tags and CTX tags.
• Custom Table Word - a simple Microsoft Word template for retrieving custom table data in a generated
Microsoft Word document.
• Solution Design Simple Regular - a simple template to access section information [page 174] in the
Solution Design tab in Quote 2.0.
The Document Generation Templates page displays a list of all document templates in the system, letting you
manage, create, and delete templates and translate their names.
Context
Here, you can manage the format and language settings that apply to all existing and new templates:
• Select Language - select the language in which template names and descriptions are displayed. If a
template name or description has no specified value in the selected system dictionary, the values are
retrieved from the default dictionary instead. To translate a template name or description, click,
select the target language, and enter the new value.
To see the translated template names and descriptions from the user side, after a translation is entered
here, the user can choose the language for which the translations were added in the Default Dictionary on
the User Page. Following that, template names and descriptions display in the selected language for that
user (given that translations are available).
• Default Output Format - select the format in which all documents are generated by default. If format
permissions [page 184] are enabled for a user type, the pertaining user has the possibility to choose in
which format a document is generated. You can only choose between DOC, DOCX, and PDF files here
because Microsoft Excel templates are always generated as XLSX files.
• Users can choose customer’s language when creating documents - if selected, users can select the
language in which the document is generated in the Customer’s language dropdown menu when selecting
On this page, you can create simple, multisection, and section templates. All templates that exist on the tenant
are organized in the Output Templates and Section Templates lists. In addition to the template name and type,
the lists display other relevant details (visibility permissions, dates when the templates were last modified and
the names of administrators who last modified them, and so on).
In the Output Templates list, administrators can organize in which order templates appear when they’re
presented to the user. When users are selecting the template for their documents, only output templates
(both simple and multisection) are available on the user side.
Depending on the type of template that you’re creating, you have access to different tabs when editing
a template. For simple templates, Sections is disabled, and for multisection templates, Additional Content
is disabled. Additionally, when creating section templates, you can’t manage the Sections and Format
Permissions tabs. Additional Documents is available when editing multi-section or simple templates.
The Filename column is always blank for multisection templates. The Master Section column indicates which
section controls the header and the footer of the document. Moreover, the Contained Sections column lists all
the sections in a multisection template.
The initial steps are the same for creating any type of template:
Procedure
In Output Templates, you create simple and multisection templates, and in Section Templates, you create
sections that are included in multisection templates.
2. Enter the template name.
3. Click Save.
A new page displays with multiple tabs. The Template Definition tab opens by default.
Note
If you upload a Microsoft Word template, you can generate a DOC, DOCX, or PDF document. However,
if you upload a Microsoft Excel file (either an XLSX or XLS file) in the new document generation engine,
you can only generate an XLSX file.
The Template Creation Tool [page 193] button gives you access to a tool that creates a document template so
you don’t have to manually add tags.
Depending on the template type that you’re creating, one of the following types is selected by default:
Note
If you add sections to a template and then make it a Simple Template, the sections become unavailable.
However, they aren’t deleted (even if you click Save) - you can make them available again by choosing Multi-
sections template in Template Definition. Similarly, the file revisions table is disabled when Multi-sections
template is selected, but file revisions aren’t deleted when you click Save.
In Override Document Processing Engine [page 189] for this template, select one of these options:
• Use Global setting from application parameters page - default value, follows the selection on the Application
Parameter page.
• Use Old Engine - overrides the global setting to the old engine.
• Use New Engine- overrides the global setting to the new engine.
After you’ve defined the general template details for a simple or a section template, you need to select the
DOCX template based on which the document will be generated. Click Add New Document and browse for the
document.
Uploading documents for multisection templates isn’t available in the Template Definition tab. Instead, you
need to separately upload a document for each pertaining section that is listed in the Sections [page 183]
tab of that multisection template.
When simple or section templates are selected, files and file revisions are listed in the table below. The
template name and the revision number are displayed in a row. Furthermore, clicking the icons in the table lets
you preview, download, and delete the document.
Note
When in the preview mode, enter the quote composite number to preview the generated document for the
selected quote.
Although a template can have multiple revisions, only one revision can be active at a time. When multiple
documents are uploaded, click [activate] next to the document you wish to activate. If there’s only one
document, that file is active by default.
Before you add tags to a Microsoft Word template, first adjust the header and footer in Microsoft Word.
If you wish the table header to be displayed on each page where the table is spanning across the pages, in
Microsoft Word, you need to check Repeat as header row at the top of each page for the row which should be
displayed in the header, and to turn off the option Allow row to break across pages for the rows that shouldn't be
displayed in the header.
If there are tables inside a C-loop in the header, footer or main part of the template and you want them to
merge into one table when processing the template, they must share the same format and style. Column
number, width, and style must be matching.
All the styling of the template should be done in Microsoft Word so you can later only add tags without
any styles. The styles that are applied to the tags in the template are also applied to the retrieved values in
the generated document (for example, if you make a tag bold, the value that it retrieves is also bold in the
generated document). This is applicable for all standard Microsoft Word formatting (bold, italic, underline, font
sizes, text effects, text color, text background, text highlighting, text alignment, paragraph settings with spacing
before and after, table formatting with all previous mentioned variations in cells, and so on). Text effects aren’t
applied correctly to the tag output if the document is generated in the DOC file format.
Note
Texts effects are available only for the DOCX file format, which is available in Microsoft Word 2007 and later
versions.
Avoid copying and pasting tags and the text in templates in order to achieve the best performance of the
Document Generation tool. Otherwise, if you must copy something in your template, make sure to first remove
all styling and formatting. Visit the Document Generation Tips and Tricks [page 198] page to read about the
most frequent styling issues and possible workarounds.
Here you can select the section templates that are included in the document. Other than selecting section
templates, on this tab you can set up the following settings:
• User can sort sections - enables users to sort sections before generating the document. Once users sort
the sections, the order remains unchanged the next time users generate documents from the same quote,
regardless of the default order of sections set up in the Setup.
• User can upload their own sections - lets users upload their own DOCX section templates when
customizing the template on user side. When the checkbox is selected, a formula box appears. The formula
entered here is used to narrow down the conditions under which Add Section appears during the document
generation process. The default value of the field is 1, meaning that all users can upload sections manually.
Consider this example: for enterprise-grade deals, users shouldn't be able to manually add sections. Deal
type is defined in a custom field. By entering the condition [NEQ](<* QuoteProperty(Deal Type)
*>, Enterprise), users are only allowed to add sections if the deal type isn’t enterprise.
• Sections will inherit formatting (header,footer etc.) from first section in the template - enables format
inheritance from the first (master) section to all subsequent sections. If the checkbox isn’t selected, each
section maintains its own formatting. This checkbox is selected by default for new documents.
Note
If Sections will inherit formatting (header,footer etc.) from first section in the template is selected, the
standard Page Break will be used by default. If it's not selected, Section break new page page break type
will be used. You can also specify the page break type you wish to use in templates via the Type of break
used in generated documents application parameter [page 190].
Note
If the application parameter Heading style used in generated documents is set to Keep source formatting
and the checkbox Sections will inherit formatting (header,footer etc.) from first section in the template is
selected, the sections of the output document inherit the header and footer from the first section of the
template, but the heading style is kept for each individual section.
Prerequisites:
The list displays the name of the section template and the name of the respective DOCX file. To delete and edit
The Sort column shows the order of section templates as they’ll be generated in a document. The order
defined here is default and users can override it if the User can sort sections checkbox is selected. To change
the order of sections, enter the numbers in the Sort column in ascending order, starting from the section that
should be generated first, and click Re-Sort.
You can allow users to access specific templates when quotes are in a certain status. When setting the visibility
of a section template, you allow/disallow access to that section only, not to the entire multisection template
in which the section is included. Visibility is controlled via permission groups. To limit the visibility, unselect
the Visible to all permission groups checkbox that is selected by default, and move the permission groups that
should have access to the template to the Selected Permission Groups column. The logic between multiple
permission groups is OR. In Step 2, click , and create a condition under which the template is visible to
the selected permission groups. By default, 1 displays in the condition box, meaning that the template is visible
under all conditions.
By default, all permission groups are able to generate templates only in the format selected in Default Output
Format in the Document Generation Templates page. Users that belong to the permission groups selected
in Format Permissions also have other template formats available for selection. The logic between multiple
permission groups is OR. In Step 2, click , and create a condition under which format selection is available
The Related Fields tab specifies the quote custom fields that are related to the entire template or to the section,
in case of a section template.
Users are prompted to fill out related fields when customizing a document that is being generated. Depending
on the template type you’re editing, the fields are related to a section (in case of a section template) or to the
entire output document (in which case, they’re displayed in the Template Details panel in the Customize tab on
the user side). In the screenshot below, you can see an example of each case: Quote Expiration Date and Terms
are related to the Introduction section and Additional Comments and Customer Comments are related to the
document in general.
Note
In Quote 2.0, custom fields should be populated in the quote and not in the Customize tab because this
is currently not supported. Although users can successfully populate the custom fields during document
customization in Quote 2.0, the values will not be displayed in the document, neither when it's previewed
nor generated.
This tab is for selecting the files that are attached to the generated document (for example, descriptions of
quote items, data sheets, terms and conditions, and so on). Before you can add files to the template, you need
to upload them in the Manage Content Documents [page 192] section.
Note
The additional content is included in the generated document only if the following tags are in the template:
<<INCLUDE_DOCUMENTS>>
<<INCLUDE_DOCUMENTS_END>>
The tags must be used in separate lines.
Files are included in the same order in which they’re displayed to the user. If the checkbox Don’t include
same file more than once is selected on the user side, SAP CPQ doesn’t include duplicate files. Otherwise,
duplicate files are included if found.
• Image settings - specify which settings are applied to PDF files that are inserted as images into generated
documents. You can choose between Default settings (format: PNG, resolution: 300, quality: 100) and
Custom settings. Selecting Custom settings allows you to choose between two formats:
• • PNG (choosing PNG allows you to further specify Image resolution)
• JPG (choosing JPG allows you to further specify Image resolution and Image quality)
Configuring image settings allows you to control the size of the output additional content. Namely,
PNG is a high-quality image format and choosing it results in large output additional content. On the
other hand, choosing JPG results in additional content of a smaller size and lower quality.
• Also Include Quote Items in Formula Evaluation - select the checkbox to attach files to each quote item in
the generated document, not to the quote globally.
• File Name - add the name of the file that you wish to attach to the generated document. File names must
contain the file extension (for example, ABCCaseStudy.docx). The system supports DOC, DOCX, PDF, PNG
and JPG files. Alternatively, click to create a formula that dynamically retrieves file names from a
custom table.
• File Description - enter a description of the file manually, or define a formula that retrieves the description
dynamically.
• Add More Files - click it to add another File Name and File Description fields so that you can add more than
one file to the template.
• File Selection - select Check Boxes to let users select multiple files to attach to the generated document.
Alternatively, select Radio Buttons and users are allowed to select only one file.
• Separate files with page break - select this checkbox for the system to separate additional files with a page
break.
Files found for the first quote item are displayed first (in the same order as defined in Setup), followed by
the files found for the second item, and so on.
In this tab, you can define and select mandatory additional files that are enclosed in the same email as the
generated document.
This feature is available only for the new document generation engine. Similar to Additional Content, before you
can add files to the template, you need to upload them in the Manage Content Documents [page 192] section.
The differences between additional documents and additional content are the following:
• Additional documents are mandatory additions to the generated document, while additional content files
are optional.
• If PDF files are included as additional content in multi-section documents, they are converted into images
and added into Microsoft Word documents in the output. However, if they are added in the Additional
Documents tab, they remain in the PDF format as separate files.
• Convert Microsoft Word Files into PDF – additional documents in DOC or DOCX format are converted into
PDF files in the output.
• Also Include Quote Items in Formula Evaluation – expand the context of formula evaluation so that files can
be included for each quote item, and not just the quote globally. If the checkbox is not selected, the defined
formula is evaluated only once.
• File Name - add the name of the file that you wish to include in the same mail as the generated document.
File names must contain the file extension (for example, ABCCaseStudy.docx). The system supports DOC,
DOCX, PDF, PNG and JPG files. Alternatively, click to create a formula that dynamically retrieves file
names from a custom table.
• Add More Files - add another File Name field so that you can add more than one file to the template.
The resulting email created at the end of the document generation process contains the generated document
and any additional documents included via Additional Documents. On the user side, users can see the
additional documents in the Documents tab of the quote. There, they can also download previously generated
documents together with any additional documents as a ZIP file.
For example, if a regional SAP CPQ administrator responsible for several markets wishes to authorize certain
users in a specific market to create document templates, this feature can make that possible. Alternatively, if
you select Visible to all permission groups, all users can manage the template locally.
In Step 2, click , and create a condition under which the template is available locally to the selected
permission groups. By default, 1 displays in the condition box, meaning that the template is available locally to
the selected permission groups under all conditions.
When users are given the authority for managing a document generation template, the template becomes
available in the Manage Global Document Templates section of the User Menu. Just like the administrators,
users can select the language in which the template names and descriptions are displayed. The selection
of languages on the administrator and user side is codependent (the language selected in one page is
automatically selected in the other).
Templates which users can manage are organized into Output Templates and Section Templates sections. When
users open a simple template, they can manage the details in Template Definition, Related Fields, and Additional
Files tabs.
By default, Quote 1.0 uses the new document generation engine. However, you can alter the engine selection
within the application using the parameter Use new engine for Document Templates Processing in General
Application Parameters Shopping Cart and Quotes .
Additionally, if needed, you can override the engine selection for a specific template (for example, if you wish to
use the new engine in general, but you have a single template whose format isn’t supported in the new engine)
by following these steps:
The Quote 1.0 engine uses both the old and new document generation engines. On the other hand, Quote 2.0
only uses the new document generation engine.
The old document generation engine generates PDF, DOC, DOCX, XLS, and XLSX files. On the other hand,
the new engine generates PDF, DOCX, and XLSX files (in both Quote 1.0 and Quote 2.0). Furthermore, when
uploading Microsoft Excel templates to the new engine, you can import both XLS and XLSX templates, and the
new engine generates them as XLSX files.
Note
If a Microsoft Word template is used, the output format can be a Microsoft Word document, PDF file, or
both. On the other hand, the output of a Microsoft Excel template is always a Microsoft Excel document.
While the new document generation engine is faster than the old engine, it may not support all the templates.
Therefore, when switching from the old to the new engine, it’s advisable to test the templates in a sandbox
environment to verify that there are no issues. Otherwise, it may be necessary to fix the layouts or to reupload
the templates.
Note
Unless specified otherwise, the procedures explained in the related topics describe the new document
generation engine and Quote 1.0.
This page covers the workflow adjustments that need to be made to enable document generation and the
parameters that need to be set.
Workflow Adjustments
To enable your users to generate documents in SAP CPQ, on top of creating a template with the appropriate
tags, you need to make the following workflow adjustments:
• make sure that the Generate Documents action does not have any conditions [page 421] that prevent it
from displaying to users.
• add the Generate Documents action in the workflow matrix [page 416].
Listed below are all the application parameters that influence how documents are generated in SAP CPQ.
• Display generated documents in Recent Items - if TRUE is selected, the generated documents are displayed
in the Recently Viewed list.
• Define prefix for generated document name - the name of generated documents starts with this prefix.
• Define suffix for generated document name - the name of generated documents ends with this suffix.
• Share document customizations - allows you to share all customizations during document generation
among all users for each quote. If FALSE is selected, all customizations are stored only for the user
making the customizations. If multiple users work on one quote, customizations are saved only for each
individual user. Users working on one quote can’t view each other’s customizations. If TRUE is selected,
customizations are shared between users.
• Reconfigure products during document generation - if TRUE is selected, the system retrieves the latest
changes made on products from the Setup before generating a document.
• Users can see previously generated documents - if set to TRUE, the View Previously Generated Documents
button displays in the Download Document and Send Email tab on the user side allowing users to access
documents that were previously generated on that quote.
• Allow users to download documents that have been generated for templates that have been deleted - if
set to TRUE, users can download documents generated using templates that administrators have deleted.
Users can download documents only if they have access to previously generated documents (if Users can
see previously generated documents is set to TRUE).
• Allow users to download documents that have been generated prior to CPQ 2012 January release - if TRUE is
selected, users can download documents generated before January 2012, regardless of whether they have
permission to view the template.
• Hide Items With No Files on document generation - if Also Include Quote Items in Formula Evaluation is
enabled on the Additional Content tab, the system won’t display in the generated document any items that
don’t have an additional file due to a condition.
• Use new engine for Document Templates Processing - if set to TRUE, the system uses the new document
generation engine.
• Heading style used in generated documents- allows administrators to control the heading styles used in
the document. Selecting Use destination styles applies the heading style of the first section to all sections.
Selecting Keep source formatting allows each section to maintain its individual heading style.
If Sections will inherit formatting (header,footer etc.) from first section in the template is active in
Setup Document Generation Templates Edit (a multi-section template) Sections , and Keep
source formatting is the selected value for this parameter, sections of the document inherit header and
footer formatting from the first section of the template, but keep their own individual heading styles. This
parameter is available only for the new document generation engine.
• Type of break used in generated documents - allows administrators to override the default breaks between
the sections of the document and to apply the selected type of break instead. Administrators can choose
between the following breaks: Paragraph break, Page break, Column break, Section break continuous,
Section break new column, Section break new page, Section break even page, Section break odd page, Line
break. This parameter is available only for the new document generation engine.
Documents that you wish to attach as additional content or additional documents to a generated document
must first be uploaded in the Manage Content Documents section in Setup Quotes .
The list of uploaded documents displays the file name, format, and destination directory. Also, you can see
in the list who created the file, who last modified it and when it was last modified. The Permissions column
displays the companies to whose local administrators the file is visible.
In the list, you can click , and to delete, edit, and preview the file, respectively. After clicking
the edit icon, a pop-up displays where you can select and unselect the companies that will see the file. After
clicking the preview icon, enter the number of the quote that the system will use as a source of data and click
Note
When a ZIP file is uploaded as a content document, an email notification is sent, stating whether the upload
is finished, the names of the compressed files unpacked during the upload, and whether the upload is
successful or not. Moreover, the email also informs the administrator if the upload is unsuccessful because
of an incorrect extension or folder name.
In this section, you can delete multiple documents from the section with a single action.
• Delete documents listed above - selecting this option before clicking Delete deletes all the documents
currently visible on the page.
• Delete all documents that match entered criteria - selecting this option before clicking Delete deletes all the
documents that are filtered after you enter a search term in the search boxes above.
• Delete all documents - selecting this option before clicking Delete deletes all content documents.
The Template Creation Tool lets you create templates with basic document tags so you don’t need to add them
manually.
Prerequisites
Context
The tool is convenient for administrators who need simple templates and who don’t have experience working
with document generation tags. The Template Creation Tool isn’t available for multisection templates.
Procedure
A table displays all documents uploaded in Manage Content Documents that you can include in the
generated document.
c. Select a file.
d. Expand the Create Tags for Conditional Data/File inclusion/insertion section.
Here, you can optionally create conditions under what the data you selected in the first section is
displayed in the generated document.
The tags selected here display in a C2 tag that loops through all items in the quote.
1. Select Show data as a table
These fields display:
A document with all the tags you selected in the previous steps is downloaded.
You can now either delete the descriptions in the generated template and proceed with the upload [page
179], or copy and paste only the tags into another document.
Check the Document Generation Tips and Tricks [page 198] page to avoid any possible issue with
generating your document.
The purpose of this feature is to visually guide new, less experienced or less frequent users through the process
of selecting products, creating a shopping cart, generating a quote document.
Leading Actions
Document Translation
When users start the document generation process, they can translate the quote or template, for example into
the customer's language, by choosing a dictionary for the document language.
• After users select a template for generating a document and customize it, they can download the
document and send it as email attachments from the application.
• The recipients’ details and the email subject and body are predefined, but users can change the details and
select who receives the email.
• The email body contains a predefined text that neither users nor administrators can change (for this,
please contact the SAP CPQ Support team).
Note
On Quote 2.0 tenants, where Involved Parties are used instead of Customers, in the email form in the end
of the document generation process, you can select one or multiple partner functions as recipients of the
generated document. Only the partner functions with a defined email address are offered for selection.
The generated document is sent as an email attachment if Email Attachment is selected. Selecting Include
Proposal Link includes a link in the email.
Note
If the option Send Mail using your default mail client… is selected, it’s necessary to manually attach the
generated document (the generated document won't be automatically attached to your email). Also, the
Plain text body type must be selected.
This page lists the workarounds and methods of avoiding issues with document generation in SAP CPQ.
• Don’t change the color of the tags to white to make a document cleaner. The system pulls values of tags
and it doesn’t display the tags in the generated document, so you shouldn’t change the color of tags to
white to hide them in the template.
• Don’t switch fonts in one tag.
• Always use the same font for tags within one document.
• Make sure to show paragraph marks and other hidden symbols in Microsoft Word by clicking in
the toolbar. This shows all characters that may have been entered accidentally or while copying content
and that will potentially cause errors in generating documents in SAP CPQ. Make sure to delete such
characters.
• Everything inside a C loop must be in the same font.
• If all sections after the second section in a multisection template inherit the formatting from the second
section, and the Sections will inherit formatting (header,footer etc.) from the first section in the template
option is off, select the Different Odd and Even checkbox in the word-processing program.
• Make sure to add a new line after each C2 tag (press ENTER on your keyboard).
• If there are tables inside a C loop in the header, footer and the main part of the document, they all must
have the same format (for example, they must have the same columns).
• Use template versions when adding new tags in an existing template. When you create a template and
properly generate a document, the next time you want to add new tags, create a new version of the
document and make it active. This way, you make sure to always have a template version with tags
that properly retrieve data. Also, if something isn’t properly retrieved in the new document, you limit the
debugging only to the recently added tags.
• Don’t add table tags in conditions.
• Don’t add conditions into conditions.
• Protected DOC and DOCX files can’t be uploaded into SAP CPQ.
• If your template isn’t being properly generated, try adding an enter or a space character at the end of the
section.
• If Q_QP_FILE tag is found inside the text (paragraph), the file is embedded above that paragraph, not inside
the paragraph where the tag was placed. This is applicable for all tags that insert additional files in the
document (docs, images, and so on).
• The following tag returns numbers in the user’s selected number format:
<*CTX( Number(<*EVAL(15000)*>).ToFormat(<*CTX( Number(1234.56).Format )*>) )*>
• The application of conditional logic depends on the type of tags used for document generation: C2 or
QUOTE_ITEMS. If the C2 approach is used, the system will first parse content and later, based on the
parsed conditional logic, display, and parse the document content. On the other hand, QUOTE_ITEMS
parses the condition and process only the content data that satisfies the condition. Row spacing should be
reduced to minimum to ensure correct tag parsing. Below are the syntax examples for both approaches,
which enable the user to print the content of the main and line items under specific conditions.
• Tags for including additional content in documents must be placed in separate lines.
• If your Word document generation template contains an excessive number of C2 tags, you won’t be able to
upload it. Instead, make sure you convert it to a multi-section document before you upload it.
• Using document generation tags in Excel charts is not supported.
<<C2>>
<<HEADER>>
This is a header.
<<HEADER_END>>
<<MAIN>>
Repeat once for each main item.
<<C_STOP>>
<<MAIN_END>>
<<LI>>
[CONDITION,<<C_TAG(CTX,EQ,IN,GT,LT... TAGS GO HERE)>>=1]
*CONTENT GOES HERE*
[CONDITION_END]
<<LI_END>>
<<FOOTER>>
This is a footer.
<<FOOTER_END>>
<<C_END>>
QUOTE_ITEMS Example
<<QUOTE_ITEMS>>
<<HEADER>>
<<HEADER_END>>
<<MAIN: CONDITION(CTX,EQ,IN,GT,LT... TAGS GO HERE)>>
<<MAIN_HEADER>>
<<MAIN_HEADER_END>>
<<MAIN_CONTENT>>
<<MAIN_CONTENT_END>>
<<MAIN_FOOTER>>
<<MAIN_FOOTER_END>>
<<MAIN_END>>
<<LI>>
<<LI_HEADER>>
<<LI_HEADER_END>>
<<LI_CONTENT>>
<<LI_CONTENT_END>>
<<LI_FOOTER>>
<<LI_FOOTER_END>>
<<LI_END>>
<<FOOTER>>
<<FOOTER_END>>
<<QUOTE_ITEMS _END>>
Quote 2.0 is the improved quote engine available since June 2018. The new quote engine was developed as a
part of the initiative to make SAP CPQ the state-of-the-art software that allows users to create large quotes
more quickly than in Quote 1.0.
Most SAP CPQ features that are available for Quote 1.0 are available for Quote 2.0 as well. These features are
described throughout the Setup and Administration Guide [page 10]. The differences between the two engines
This guide is intended primarily for Quote 1.0 administrators and clients who are considering migrating their
models to the Quote 2.0 engine and to those who have decided to migrate and need guidance on the required
steps.
Additionally, in this document, you can find a comparative overview of the features available in Quote 1.0 and
in Quote 2.0 [page 204], as well as the specifics relevant for the migration of each administrative section [page
233].
Note
Before diving into the migration, take a look at the list of the most frequently asked questions [page 279].
Quote 2.0 is the improved quote engine available since June 2018.
The new quote engine was developed as a part of the initiative to make SAP CPQ the state-of-the-art software
that allows users to create large quotes more quickly than in Quote 1.0. After the responsive design was made
public in 2015 and the new Document Generation engine made available in 2017, clients needed a new Quote
engine that would additionally boost their performance.
Note
Quote 1.0 is still the default quote engine in SAP CPQ. New clients may use Quote 2.0 from the beginning (this
requires initial setup before the modeling starts) and existing clients need to migrate from Quote 1.0 to Quote
2.0.
Compatibility
Before initiating the migration from Quote 1.0 to Quote 2.0, check the following list to understand the
compatibility of the new quote engine with the rest of the system:
• Quote 1.0 and Quote 2.0 can’t be used in parallel on the same tenant.
• Only responsive design is supported in Quote 2.0.
• The user interface is the same, although some tweaks have been made (for example, Load Existing Project/
Quotation is redesigned).
• Only the new Document Generation [page 189] engine is supported in Quote 2.0.
Related Information
Clients who are using Quote 1.0 can decide to migrate their tenants to Quote 2.0. In such case, clients should
first contact the Professional Services team and ask for their assistance. Migration will be handled as a
separate project under the terms agreed with Professional Services. Depending on the number of items and
the complexity of client models, the migration is different for each client.
Note
We do not offer an out-of-the box migration solution, nor a migration tool. Migration should be handled as a
separate project under the terms agreed with Professional Services.
SAP CPQ doesn’t switch automatically to Quote 2.0, nor should administrators initiate the transition on their
own. Quote 2.0 isn’t backward compatible with old quotes and there are functionalities in Quote 1.0 that are yet
to be developed for the new engine.
Note
Old quotes are not visible after the Quote 2.0 engine is turned on. There is no feature to migrate old quotes.
New SAP CPQ tenants are automatically set to Quote 1.0. To move to Quote 2.0 before you begin modeling,
contact the SAP CPQ Support team.
If you are thinking about migrating from Quote 1.0 to Quote 2.0 and you are wondering about the effort it will
require, you can download the Quote 2.0 Migration Checklist that will help you with the analysis. The checklist
Note
Download the ZIP file and unpack it to get the Quote 2.0 Migration Checklist.
Migration Procedure
Make sure you have read the Quote 1.0 vs Quote 2.0 - Feature Differences [page 204] and Feature Specific
Migration Instructions [page 233]. At this point, you should be familiar with the differences between the two
engines and you understand how that may reflect on your model in SAP CPQ.
If you are ready to migrate your Quote 1.0 tenant to Quote 2.0, follow these steps
1. Contact your SAP Account Executive to check out the options for getting you a temporary tenant to
prepare the migration.
The temporary tenant should be a copy of your production tenant that you’ll use only to adjust the model
in Quote 2.0. After you've adjusted your model on the Quote 2.0 temporary tenant, you’ll move everything
from the temporary tenant back to the production tenant.
SAP CPQ does not provide a free of charge tenant for this purpose. You need to follow the standard
procedure for getting a tenant that is subject to licensing, as agreed with the SAP Account Executive.
2. Ask the Support team to turn on Quote 2.0 in the temporary tenant.
3. Contact the SAP CPQ Professional Services to discuss the modeling in Quote 2.0.
The team analyzes your request and suggests the best approach. Have in mind that old quotes aren’t
visible in the tenant after the Quote 2.0 engine is turned on. There is no feature to migrate old quotes.
The team considers your model in SAP CPQ and then propose a solution.
4. Model the new tenant according to what you agreed with the Professional Services.
Make sure to keep a detailed record of the changes you made in the temporary tenant so you can replicate
them later in the original (production) tenant.
Note
Here is a list of documents with all the relevant information that you need to set up your tenant:
• Quote 1.0 vs Quote 2.0 Feature Differences [page 204] lists the differences between the two quote
engines and provides a workaround for each feature that exists in Quote 1.0, but is incompatible
with Quote 2.0. This document also contains the features that aren’t available in Quote 2.0.
• Administrator guide describes SAP CPQ standard features and those features that are available
only in Quote 2.0 [page 199].
• Scripting Help list methods and variables for Quote 2.0.
If administrators can’t handle the setup on their own, they should contact the SAP CPQ Professional
Services team.
5. Test if everything is working as expected in the temporary tenant before performing the production
upgrade.
6. Contact the SAP CPQ Support team to turn on the Quote 2.0 in the original (production) tenant.
7. Replicate all the adjustments that you have made in the temporary tenant in the production tenant.
Related Information
This page contains a comparative overview of Quote 1.0 vs Quote 2.0 features. For more details on the
differences and the migration instructions, check Feature Specific Migration Instructions [page 233].
All the features listed here are supported in Quote 1.0 unless stated otherwise with the status Only in Quote
2.0.
Features that are limited to Quote 2.0 engine and the features that are available in both quote engines, but their
usage is different for each engine are listed here, as well as the features that are obsoleted from Quote 2.0.
Note
If a feature is not listed in this page, then it is the same as in Quote 1.0.
Integrations
SAP ERP Central Component (ECC) Project-based implementation, not available out of the box.
SAP Billing Revenue and Innovation Management (Solu Only in Quote 2.0
tion Quote in SAP S/4HANA) (subscription and service
contract products)
SAP Master Data Service for Business Partners Only in Quote 2.0
Salesforce Supported
CLM To do
CX AI Supported
DocuSign Supported
AdobeSign To do
Enablement Obsoleted
NetSuite Obsoleted
Quote
Bulk Quote Deletion Redesigned Bulk Deletion [page 379] works the
same as in Qupte 1.0, except that you
can only delete quotes in bulk (not
users or customers). In Quote 2.0, you
select quotes for deletion, whereas in
Quote 1.0, you select users and delete
their quotes.
Load Existing Project/Quotation Redesigned The list of quotes in Quote 2.0 is rede
signed for a better user experience.
Quote Teams Only in Quote 2.0 Allows quote owners to create adminis
trator and solution teams [page 326].
Administrators and quote owners can
manage sections and assign them to
solution teams. Each solution team has
access only to the sections assigned to
them.
Solution Design Only in Quote 2.0 Allows users to create sections in the
Solution Design [page 314] tab and add
items to them.
Section Distribution Only in Quote 2.0 The value of sections with the Sum ag
gregate type can be distributed to other
sections [page 322] as indicated in the
distribution calculation.
Bulk Update of Quote Item Custom Only in Quote 2.0 This feature facilitates the process of
Fields in Sections mass updating the section fields with
one value.
Quote Visibility Only in Quote 2.0 Quote visibility [page 367] can be set
in the same way in both Quote 2.0 and
Quote 1.0. However, the dynamic set
tings should be done only in Sql Where
and Sql Join because conditions are not
available for Quote 2.0.
Fields, Calculations, Layout Only in Quote 2.0 Available only in Quote 2.0. This section
groups the features for managing quote
layout, fields and calculations and dis
tribution calculations.
Quote Layout
Layout Redesigned In Quote 2.0, quote layout is defined in Quotes Fields, Calculations,
Layout Layout .
Layout Permissions Redesigned In Quote 2.0, quote layout permissions are defined in Quotes Fields,
Calculations, Layout Layout Permissions .
Quote Layout Col Redesigned These columns are not available in Quote 2.0:
umns
• MonthlyFeeA mount
mount • OverallDiscount
• MPN Percent
• Multiplier • SubTotalAmount
• MultiplierAmount • TotalChannel
GrossMarginPer
• PROD
cent
UCT_WEIGHT
• ProductModel
• TotalChannelMar
kupAmount
Price
• ProductVersion
• TotalChannelMar
kupPercent
• PromoDiscountA
mount
• TotalMonthly
FeeAmount
• PromoDiscount
Percent
• TotalShippingCost
• RolledUpCartItem
• TotalUpfrontA
mount
• TotalWeight
• RolledUpEndCus
tomerExtended
Price
• RolledUpEndCus
tomerUnitPrice
• UnitDiscountA
mount
• UnitMultiplierA
mount
• UPC
• UpfrontAmount
• UpfrontPercent
• Weight
Quote Item Custom Fields Redesigned In Quote 2.0, quote item custom fields
should be created and managed in
Fields and Calculations [page 284].
To delete a quote item custom field,
go to Setup Quotes Quote Item
Custom Fields .
Support for formulas on quote item Obsoleted Use quote calculations or scripts on
custom fields Item added and Item updated events.
Design
Application Parameter (Calculate Dis Only in Quote 2.0 This parameter is available on the
counts only for Changed Items) Discounts page in Setup and it checks
the discount rules only for the changed
items
Promotions Obsoleted /
Enable Formula Reevaluation Condition Only in Quote 2.0 Administrators of Quote 2.0 engines
and Formula Reevaluation Condition in have the possibility to decide whether
the Discounts section. the discounting rules [page 521] are
reevaluated every time their users open
a quote and every time reconfigure
and recalculate actions are triggered in
quotes.
Calculation Types (Once, when quote Redesigned In Quote 2.0, you can choose between
is created, Every time quote is modi creating scripts, or using the low-code
fied and Always) approach by creating formulas directly
in custom field definition. In custom
field definition, you can select an event
that specifies the moment when the
dedicated calculation formula is trig
gered, and create the relevant formula
for that event. This way, it is possible
to create certain scripts directly on
the custom field, instead of always us
ing global scripts. You can select the
events Once, when quote is created,
On Involved Parties Changed, and After
changing the value of custom fields.
Global Information (GI) Variables Obsoleted CTX tags should be used instead.
Quote Actions
E-Sign Accepted To Do
E-Sign Declined To Do
Preview To Do
Replace Items To Do
Void Document To Do
Document Generation
Old Document Generation Engine Obsoleted Only the new document generation en
gine [page 189] is supported in Quote
2.0.
Emails are sent by CPQ Mailer To Do In Quote 2.0 only User's Mail Client
can be selected in the Emails are sent
by field in Email Customers / Quote
Acceptance Settings.
<*SHIPPINGMETHOD*> Obsoleted /
<*FREIGHTAMOUNT*> Obsoleted /
<*IAAVAILABLE(Copy)*> Obsoleted /
<*TOTALMULTIPLIERAMOUNT*> Obsoleted /
<*ADDITIONALMULTIPLIER*> Obsoleted /
<*ADDITIONALMULTIPLIERA Obsoleted /
MOUNT*>
<*TOTALCHANNELMARKUPA Obsoleted /
MOUNT*>
<*TOTALGROSSMARGINAMOUNT*> Obsoleted /
<*TOTALCHANNELCOST*> Obsoleted /
<*TOTALCHANNELGROSSMARGIN Obsoleted /
PERCENT*>
<*TOTALCHANNELGROSSMARGINA Obsoleted /
MOUNT*>
<*TOTALCHANNELCOMMISIONPER Obsoleted /
CENT*>
<*TOTALCHANNELCOMMISIONA Obsoleted /
MOUNT*>
<*TOTALUSERCOMMISIONPER Obsoleted /
CENT*>
<*TOTALUSERCOMMISIONA Obsoleted /
MOUNT*>
<*VATPERCENT*> Obsoleted /
<*VATAMOUNT*> Obsoleted /
<*STATETAXPERCENT*> Obsoleted /
Products
Order Item Type Only in Quote 2.0 The value in the Order Item Type field
determines the product model in SAP
CPQ (which fields are available for
product administration, what columns
are available on quote items and the
type of order that is created out of
quote items when SAP CPQ is inte
grated with a backend system, such as
SAP S/4HANA). After migrating prod
ucts from Quote 1.0 to Quote 2.0, the
default order item type is sales and ad
ministrators do not need to make any
changes after the migration.
Product Events
When product is added to quote (On Obsoleted Other than an ability to attach a script
ProductAddedToQuote) to specific product, it is the same
as After adding products to quote
(AfterItemAdded/AfterItemUpdated).
Application Parameters
Consult the documentation on application parameters to find out if a parameter is available in Quote 2.0. [page
637]
Scripting
Quote Save (in scenarios when multiple Redesigned Quote is saved at the end, after the last
scripts are executed after an event is script is executed (the pipeline is done).
triggered)
Trigger events on adding items to Redesigned Events are triggered only once for all
quote items that are being added to quote.
This way, all items that are being added
to the quote are available in the script
ing context.
ContainsAnyProductType Obsoleted
ContainsAny* can be replaced with
ContainsAnyProduct lambda expressions that allow more
flexibility, for example:
ContainsAnyProductByPartNumber
• Quote.GetAllItems().Con
tains(lambda x:
x.ProductName == "SQL"
• x.PartNumber.Contains("
PN-"))
CRM Integration Variables: Obsoleted The CRM context is currently not avail
able in Quote 2.0 scripting so you can
• MSCrmServiceContext not build custom CRM integrations in
• MSCrmService scripting.
• MSCRMOpportunityId
• MSCRMUserId
• SalesforceProxy
• SFEnvironment
• NsEnvironment
ParentItemGuid Obsoleted /
Every time quote is changed (OnEver Obsoleted In Quote 1.0, runs every time a quote is
yTimeQuoteChanged) changed. Instead of attaching a script
to this event so it triggers every time a
quote is changed, think about attaching
it only to the events where the scripting
logic is actually needed.
When user is on quotation tab (OnU Obsoleted In Quote 1.0, runs every time quote is
serOnQuotationTab) saved while user is on the Quotation
tab. Instead of attaching a script to
this event so it triggers every time the
quote is saved while on the Quotation
tab, think about attaching it only to the
events where the scripting logic is ac
tually needed.
OnCustomerMappings Event Obsoleted This event was rarely used in the old
quote engine, so it has been obsoleted
in Quote 2.0. You can uninterruptedly
map fields from CRM to SAP CPQ with
out this event.
Related Information
CTX tags are supported in both quote engines, but there are differences in the supported properties for the
Quote object.
The table below shows Quote CTX tags that are different in the two engines.
Note
If a tag is not listed in this page, then it is the same as in Quote 1.0.
Legend
Tags available only in the Quote 1.0 engine are marked blue.
Tags available only in the Quote 2.0 engine are marked green.
Tags marked yellow exist in both quote engines but with a different syntax.
<*CTX( Quote.SelectedShipping.Editable /
)*>
<*CTX( Quote.SelectedShipping.Selected /
)*>
<*CTX( Quote.CurrentItem.AttributeByExte /
rnalId)*>
<*CTX( Quote.CurrentItem.AttributeRank /
)*>
<*CTX( Quote.CurrentItem.AttributeSubRan /
k)*>
<*CTX( Quote.CurrentItem.BaseItem)*> /
<*CTX( Quote.CurrentItem.BaseMRCListPric /
e)*>
<*CTX( Quote.CurrentItem.BaseQuantity)*> /
<*CTX( Quote.CurrentItem.CanOverrideMinM /
axValues)*>
<*CTX( Quote.CurrentItem.CartItem)*> /
<*CTX( Quote.CurrentItem.CartItemGuid)*> /
<*CTX( Quote.CurrentItem.CategoryId)*> /
<*CTX( Quote.CurrentItem.ChannelCommisio /
nAmount)*>
<*CTX( Quote.CurrentItem.ChannelCommisio /
nPercent)*>
<*CTX( Quote.CurrentItem.ChannelMarginPe /
rcent)*>
<*CTX( Quote.CurrentItem.ChannelMarkupPe /
rcent)*>
<*CTX( Quote.CurrentItem.AttributeByExte /
rnalId(ff) )*>
/
<*CTX( Quote.CurrentItem.CustomColumn1)*
>
<*CTX( Quote.CurrentItem.CustomColumn2)*
>
<*CTX( Quote.CurrentItem.CustomColumn3)*
>
<*CTX( Quote.CurrentItem.CustomColumn4)*
>
<*CTX( Quote.CurrentItem.CustomColumn5)*
>
<*CTX( Quote.CurrentItem.CustomColumn6)*
>
<*CTX( Quote.CurrentItem.CustomFieldComp /
utedValue)*>
<*CTX( Quote.CurrentItem.DefaultMRCMulti /
plier)*>
<*CTX( Quote.CurrentItem.DefaultMultipli /
er)*>
<*CTX( Quote.CurrentItem.EndUserExtended /
Amount)*>
<*CTX( Quote.CurrentItem.EndUserNet)*> /
<*CTX( Quote.CurrentItem.ExternalCartIte /
m)*>
<*CTX( Quote.CurrentItem.ExternalId)*> /
<*CTX( Quote.CurrentItem.FamilyCode)*> /
<*CTX( Quote.CurrentItem.ForwardCurrency /
Rate)*>
<*CTX( Quote.CurrentItem.GroupId)*> /
<*CTX( Quote.CurrentItem.Inconsistent)*> /
<*CTX( Quote.CurrentItem.Inventory)*> /
<*CTX( Quote.CurrentItem.IsAlternative)* /
>
<*CTX( Quote.CurrentItem.IsChildItem)*> /
<*CTX( Quote.CurrentItem.IsMainItem)*> /
<*CTX( Quote.CurrentItem.IsOptional)*> /
<*CTX( Quote.CurrentItem.IsVariant)*> /
<*CTX( Quote.CurrentItem.ItemDeliveryMet /
hod)*>
<*CTX( Quote.CurrentItem.ItemDeliverySta /
tus)*>
<*CTX( Quote.CurrentItem.KeyAttribute)*> /
<*CTX( Quote.CurrentItem.LeadTime)*> /
<*CTX( Quote.CurrentItem.MainItem)*> /
<*CTX( Quote.CurrentItem.ManufacturesGro /
ssMargin)*>
<*CTX( Quote.CurrentItem.MarginHealthCol /
or)*>
<*CTX( Quote.CurrentItem.MarginHealthIma /
ge)*>
<*CTX( Quote.CurrentItem.MasterParentIte /
m)*>
<*CTX( Quote.CurrentItem.MaxMRCMultiplie /
r)*>
<*CTX( Quote.CurrentItem.MaxMultiplier)* /
>
<*CTX( Quote.CurrentItem.MinMultiplier)* /
>
<*CTX( Quote.CurrentItem.MonthlyFeeAmoun /
t)*>
<*CTX( Quote.CurrentItem.MPN)*> /
/
<*CTX( Quote.CurrentItem.MRCChannelMargi
nAmount)*>
<*CTX( Quote.CurrentItem.MRCChannelMargi
nPercent)*>
<*CTX( Quote.CurrentItem.MRCChannelMarku
pAmount)*>
<*CTX( Quote.CurrentItem.MRCChannelMarku
pPercent)*>
<*CTX( Quote.CurrentItem.MRCEndUserExten /
dedAmount)*>
<*CTX( Quote.CurrentItem.MRCEndUserNet)* /
>
<*CTX( Quote.CurrentItem.MRCGrossMarginP /
ercent)*>
<*CTX( Quote.CurrentItem.MRCMarginHealth /
Color)*>
<*CTX( Quote.CurrentItem.MRCMarginHealth /
Image)*>
<*CTX( Quote.CurrentItem.MRCMultiplier)* /
>
<*CTX( Quote.CurrentItem.MRCMultiplierAm /
ount)*>
<*CTX( Quote.CurrentItem.MRCRolledUpEndC /
ustomerExtendedPrice)*>
<*CTX( Quote.CurrentItem.MRCRolledUpEndC /
ustomerUnitPrice)*>
<*CTX( Quote.CurrentItem.MRCRolledUpGros /
sMargin)*>
<*CTX( Quote.CurrentItem.MRCRolledUpNetD /
ifferenceFromBaseItem)*>
<*CTX( Quote.CurrentItem.MRCUnitMultipli /
erAmount)*>
<*CTX( Quote.CurrentItem.Multiplier)*> /
<*CTX( Quote.CurrentItem.MultiplierAmoun /
t)*>
<*CTX( Quote.CurrentItem.NetAmountDiffer /
enceFromBaseItem)*>
<*CTX( Quote.CurrentItem.ParentItem)*> /
<*CTX( Quote.CurrentItem.ParentItemGuid /
)*>
<*CTX( Quote.CurrentItem.ParentRolledUpC /
artItem)*>
<*CTX( Quote.CurrentItem.PRODUCT_WEIGHT /
)*>
<*CTX( Quote.CurrentItem.ProductCost)*> /
<*CTX( Quote.CurrentItem.ProductDisplayI /
nfo)*>
<*CTX( Quote.CurrentItem.ProductModelPri /
ce)*>
<*CTX( Quote.CurrentItem.ProductName)*> /
<*CTX( Quote.CurrentItem.ProductNameInDe /
faultLanguage)*>
<*CTX( Quote.CurrentItem.ProductSystemId /
)*>
/
<*CTX( Quote.CurrentItem.ProductTypeAddT
oCRM)*>
<*CTX( Quote.CurrentItem.ProductTypeId)*
>
<*CTX( Quote.CurrentItem.ProductTypeName
)*>
<*CTX( Quote.CurrentItem.ProductTypeName
)*>
<*CTX( Quote.CurrentItem.ProductTypeName
InDefaultLanguage)*>
<*CTX( Quote.CurrentItem.ProductTypeRank
)*>
<*CTX( Quote.CurrentItem.ProductTypeSyst
emId)*>
<*CTX( Quote.CurrentItem.ProductVersion /
)*>
<*CTX( Quote.CurrentItem.PromoDiscountAm /
ount)*>
<*CTX( Quote.CurrentItem.PromoDiscountPe /
rcent)*>
<*CTX( Quote.CurrentItem.Rank)*> /
/
<*CTX( Quote.CurrentItem.RolledUpCartIte
m)*>
<*CTX( Quote.CurrentItem.RolledUpEndCust
omerExtendedPrice)*>
<*CTX( Quote.CurrentItem.RolledUpEndCust
omerUnitPrice)*>
<*CTX( Quote.CurrentItem.RolledUpGrossMa
rgin)*>
<*CTX( Quote.CurrentItem.RolledUpItemCus
tomField)*>
<*CTX( Quote.CurrentItem.RolledUpItemCus
tomFieldComputed)*>
<*CTX( Quote.CurrentItem.RolledUpNetDiff
erenceFromBaseItem)*>
<*CTX( Quote.CurrentItem.StdSelection)*> /
<*CTX( Quote.CurrentItem.SystemID)*> /
<*CTX( Quote.CurrentItem.TotalPriceWithL /
ineItems)*>
<*CTX( Quote.CurrentItem.TotalPriceWithL
ineItems)*>
<*CTX( Quote.CurrentItem.UnitMultiplierA /
mount)*>
<*CTX( Quote.CurrentItem.UPC)*> /
<*CTX( Quote.CurrentItem.UpfrontAmount)* /
>
<*CTX( Quote.CurrentItem.UpfrontPercent /
)*>
<*CTX( Quote.CurrentItem.UserCommisionAm /
ount)*>
<*CTX( Quote.CurrentItem.UserCommisionPe /
rcent)*>
<*CTX( Quote.CurrentItem.Weight)*> /
/ <*CTX( Quote.CurrentItem.ContractEndDate
)*>
/ <*CTX( Quote.CurrentItem.ContractLength
)*>
/ <*CTX( Quote.CurrentItem.ContractStartDa
te)*>
/ <*CTX( Quote.CurrentItem.ExternalItemId
)*>
/ <*CTX( Quote.CurrentItem.HasCompleteConf
iguration)*>
/ <*CTX( Quote.CurrentItem.HasIncompleteCh
ildren)*>
/ <*CTX( Quote.CurrentItem.IsCreatedFromPr
oduct)*>
/ <*CTX( Quote.CurrentItem.IsLineItem)*>
/ <*CTX( Quote.CurrentItem.ItemNumber)*>
/ <*CTX( Quote.CurrentItem.MinimumTerm)*>
/ <*CTX( Quote.CurrentItem.MinimumTermEndD
ate)*>
/ <*CTX( Quote.CurrentItem.ProductInfo)*>
/ <*CTX( Quote.CurrentItem.RolledUpItemNum
ber)*>
/ <*CTX( Quote.CurrentItem.RootItemId)*>
<*CTX( Quote.Customer(Unknown).BlockedFr Not available in Quote 2.0 since the Customer feature has
omDeletion )*> been replaced with Involved Parties.
<*CTX( Quote.Customer(x).CRMAccountId )*
>
<*CTX( Quote.Customer(BillTo).CRMContact
Id )*>
<*CTX( Quote.Customer(BillTo).CustomerPa
ssword )*>
<*CTX( Quote.Customer(BillTo).DirtyFlag
)*>
<*CTX( Quote.SelectedMarket.CurrencyDefa /
ult )*>
<*CTX( Quote.SelectedMarket.CurrencyQuot /
e )*>
/ <*CTX( Quote.SelectedMarket.ExchangeRate
)*>
<*CTX( Quote.SelectedMarket.MarketFactor /
.DefaultDecimal )*>
<*CTX( Quote.SelectedMarket.MarketFactor /
.DefaultDisplay )*>
<*CTX( Quote.SelectedMarket.MarketFactor /
.Value )*>
<*CTX( Quote.Total.AdditionalMultiplier /
)*>
<*CTX( Quote.Total.AdditionalMultiplierA /
mount )*>
<*CTX( Quote.Total.AverageMRCProductMult /
iplier )*>
<*CTX( Quote.Total.AverageProductMultipl /
ier )*>
<*CTX( Quote.Total.AveragePromoDiscountP /
ercent )*>
<*CTX( Quote.Total.ChannelCommisionAmoun /
t )*>
<*CTX( Quote.Total.ChannelCommisionPerce /
nt )*>
<*CTX( Quote.Total.ChannelGrossMarginAmo /
unt )*>
<*CTX( Quote.Total.ChannelGrossMarginPer /
cent )*>
<*CTX( Quote.Total.ChannelMarkupAmount /
)*>
<*CTX( Quote.Total.ChannelMarkupPercent /
)*>
<*CTX( Quote.Total.Cost.DefaultDecimal /
)*>
<*CTX( Quote.Total.Cost.DefaultDisplay /
)*>
<*CTX( Quote.Total.EndUserSubTotalAmount /
)*>
<*CTX( Quote.Total.EndUserSubTotalAmount /
)*>
<*CTX( Quote.Total.GrossMarginPercent )* /
>
<*CTX( Quote.Total.ItemCustomField(x) )* /
>
<*CTX( Quote.Total.ItemCustomFieldComput /
ed(x) )*>
<*CTX( Quote.Total.MRCEndUserSubTotalAmo /
unt )*>
<*CTX( Quote.Total.MRCMarginHealthColor /
)*>
<*CTX( Quote.Total.MRCMarginHealthImage /
)*>
<*CTX( Quote.Total.OverallDiscountAmount /
)*>
<*CTX( Quote.Total.OverallDiscountPercen /
t )*>
<*CTX( Quote.Total.OverallMRCDiscountAmo /
unt )*>
<*CTX( Quote.Total.OverallMRCDiscountPer /
cent )*>
<*CTX( Quote.Total.ShippingStaticPrice /
)*>
<*CTX( Quote.Total.TotalCustomColumn2 )*
>
<*CTX( Quote.Total.TotalCustomColumn3 )*
>
<*CTX( Quote.Total.TotalCustomColumn4 )*
>
<*CTX( Quote.Total.TotalCustomColumn5 )*
>
<*CTX( Quote.Total.TotalCustomColumn6 )*
>
<*CTX( Quote.Total.TotalMonthlyFeeAmount /
)*>
<*CTX( Quote.Total.TotalMRCChannelCost /
)*>
<*CTX( Quote.Total.TotalMRCChannelGrossM /
arginAmount )*>
<*CTX( Quote.Total.TotalMRCChannelGrossM /
arginPercent )*>
<*CTX( Quote.Total.TotalMRCChannelMarkup /
Amount )*>
<*CTX( Quote.Total.TotalMRCChannelMarkup /
Percent )*>
<*CTX( Quote.Total.TotalMRCGrossMarginAm /
ount )*>
<*CTX( Quote.Total.TotalMRCGrossMarginPe /
rcent )*>
<*CTX( Quote.Total.TotalMRCProductMultip /
lierAmount )*>
<*CTX( Quote.Total.TotalOptionalItems )* /
>
<*CTX( Quote.Total.TotalProductModelPric /
e )*>
<*CTX( Quote.Total.TotalProductMultiplie /
rAmount )*>
<*CTX( Quote.Total.TotalPromoDiscountAmo /
unt )*>
<*CTX( Quote.Total.TotalUpfrontAmount )* /
>
<*CTX( Quote.Total.UserCommisionAmount /
)*>
<*CTX( Quote.Total.UserCommisionPercent /
)*>
Related Information
For Quote 2.0, you should primarily use the REST APIs that are developed specifically for this quote engine and
that are not supported by the old quote engine.
Note
We encourage you to use the REST APIs specific to Quote 2.0 whenever possible and avoid using the SOAP
and REST APIs that were developed for the old quote engine. Although most of the old APIs can work with
the new quote engine, there might be issues since those APIs were not developed primarily for Quote 2.0.
Since Quote 2.0 is still under development, not all new APIs are currently available. They are, however,
being developed in each release to support the improved functionalities of the new quote engine.
REST API
All REST APIs that are available for Quote 1.0 are available for Quote 2.0 as well. However, since they were
developed primarily for the old quote engine, their usage with Quote 2.0 is not recommended. Instead, you
should use the APIs developed specifically for the new quote engine.
REST APIs developed for the new quote engine (/api/v1/quotes) are listed and documented in the REST
APIs documentation page . The /api/v1/quotes APIs are not supported in the old quote engine.
SOAP API
The following SOAP APIs are not supported in Quote 2.0:
• NewQuote
• SearchQuotes
• CreateNewQuoteAndGetQuoteData
• NewQuotefromSF
Other SOAP APIs can be used in the Quote 2.0 engine, although this is not recommended. They can be found in
the SAP CPQ API Documentation guide.
Related Information
Each following page is dedicate to a Setup section in SAP CPQ. Each page contains a diagrma with a visual
overview of features in Quote 1.0 and an indicator of whther the feature exists or not in Quote 2.0. After that, a
table shows the effort it takes to migrate features to Quote 2.0 and a link to respective migration isntructions.
Eventually, for each feature, we have provided migration instructions.
5.2.1.4.1 Pricing/Calculations
Migration Effort
Setup Section Availability in Status in Quote Estimate [page Migration Instruc
Name Quote 2.0 2.0 Description 278] tions
Pricing Procedures Available Quote 2.0 Exclu Quote 2.0 offers S Migration Instruc
sively an out-of-the-box tions [page 236]
solution for pricing
that in Quote 1.0
you need to set up
manually. Pricing
procedures are rel
evant only for the
integrations with
SAP S/4HANA
Sales Order and
Solution Quote.
Market Visibility
Step 3 of the Market Visibility page allows the use of CTX tags. Some CTX tags have changed in Quote 2.0. For
example, the CTX tags for customers have been deprecated and new tags for involved parties are added.
To check if you need to make any changes, go to Setup Pricing/Calculations Market Visibility . Scroll
down to Step 3 (in your 1.0 environment). If the Visibility condition has a 1 (Always) or 0 (Never), no changes
are required.
If there is a formula/tag, check to see if the tag is available in Quote 2.0 by browsing through tags in this
list [page 204]. If a tag in use is not available in Quote 2.0, the formula/tag will need to be rewritten with a
supported tag. For example, if you were using the End User to drive what Markets were visible, you can rewrite
with the following:
Deprecated Tag:
<*END_USER_INFO (FirstName)*>
Updated Tag:
Discounts/Multipliers
To check if you need to make any changes, edit every entry in Setup Pricing/Calculations Discount/
Multipliers in your Quote 1.0 environment. Note every entry where the minimal value, default value, or
maximum value are anything other than 1 for the Multiplier and Recurring Price Multiplier rows. If the value is 1
(100% of the price), no changes are required.
If there are any formulas, or tags, or a number other than 1, this suggests that multipliers may be in use. One
way to confirm this is by checking Setup UI Design Quote Layout and Setup Quote Layout and Setup
Quotes Quote Layout Permissions to see if multiplier fields are visible to any user group.
If you are using multipliers in Quote 1.0, you would need to reimplement your multipliers as either discounts or
custom calculations in Quote 2.0.
The Cart Fields Administration section has been redesigned in Quote 2.0. All quote field custom calculations
and editability settings in Cart Fields Administration in the Quote 1.0 environment need to be reimplemented
in Setup Quotes Fields, Calculations, Layout in the Quote 2.0 environment. The Fields, Calculations,
Layout section in the new engine comprises three sections from the old engine: Cart Fields Administration,
Quote Layout, and Quote Layout Permissions.
In Quote 1.0, calculations are based on editable field groups - you add fields to an editable group and then
you choose the calculations that will trigger when the value in those fields is changed. You do this for unique
combinations of quote statuses and user types. This concept is obsoleted in Quote 2.0. In the new engine, you
choose for each field the calculations that will trigger when the field's value is changed. It is no longer possible
to group fields and assign them the same calculations. In Quote 2.0 you would need to choose the calculations
All new tenants, both Quote 1.0 and Quote 2.0, have system calculations set up by default. If you haven't
changed anything in the default calculations in Quote 1.0, you won't need to change anything in Quote 2.0 after
the migration because the same calculations are set up by default in the new engine as well. There are three
system calculations in Quote 1.0 (All Item Fields - Direct ver. 1, Product Type All Fields - Direct, and Total All).
In Quote 2.0, they are broken down into separate calculations so instead of three, by default there are multiple
system calculations in Quote 2.0 [page 293].
All calculations other than these system calculations in Quote 1.0 are custom quote calculations that you
need to recreate in Quote 2.0. For each quote status/user type in Quote 1.0, check the list of calculations
in Calculations on Add/Copy/Delete Item to see which are custom (custom are all those other then the
three system calculations). Go to Develop Custom Quote Calculations , find the custom calculation
and recreate each one in Quote 2.0 ( Quotes Fields, Calculations, Layout Fields and Calculations
Calculations on Add/Copy/Delete Item Add calculation ). After that, in Quote 2.0, add the calculation to
the list of calculations that trigger on item add/copy/delete.
Additionally, check the editable groups and which calculations they trigger. In quote 2.0, for each field in the
editable group set up which calculations need to be triggered and in which order.
After setting up the calculations, you need to define the editability settings. In Quote 1.0, open each quote
status/user type, and find the Editable Field Groups and Related Calculations. Go to Quote 2.0, Quotes
Fields, Calculations, Layout Field Editability , find the same user type, then the quote status, and then select
which fields are editable.
Quote 1.0
Quote 2.0
Also, the option Fix Quote Amount After Currency Conversion to stick fractional differences after quote
conversion to the items or totals has been deprecated in Quote 2.0. For example, if after currency conversion,
the item price for 3 items is 33.33 and the total price is 100, in Quote 1.0 there was an option to add 0.01 to one
of the items.
In Quote 2.0, an improvement is made in regards to how rounding works. In Quote 2.0, it is possible to include
and exclude certain rounding rules for each currency. For example, a rounding rule can be added to specifically
round the net prices to four decimal places for the Japanese Yen.
Shipping
No change in functionality, please review manually to ensure that all your Shipping rules migrated over after the
initial copy. Please additionally double check if you are using any deprecated CPQ tags.
Promotions/Special Pricing
The Promotions/Special Pricing feature in Quote 1.0 has been deprecated in Quote 2.0. If you are using
promotions in Quote 1.0, you would need to reimplement your promotions and special pricing with scripting
and quote custom calculations in Quote 2.0. More information around scripting is available in the Develop
section [page 266].
Pricing Procedures
In Quote 1.0, you were able to map pricing conditions from back-end pricing procedures to SAP CPQ quote
fields using scripting to a limited degree. In Quote 2.0, pricing condition mapping can be done in an improved
way on the user interface using the dedicated Pricing Procedures feature. You will need to define pricing
condition mappings again in your Quote 2.0 environment. More information is available in Pricing Procedure
Mapping.
Migration Effort
Setup Section Availability in Status in Quote Estimate [page Migration Instruc
Name Quote 2.0 2.0 Description 278] tions
Migration Instructions
Products
The Collection of Configurable Products and System(List) of Configurable Products product types are not
supported in Quote 2.0. Products of this type are visible in the list of products after the migration but they can't
be added to the quote. You should revise products of this type and recreate them using a supported product
display type.
After the migration, check the existing rules in the Rules and Messages tab and see if there are any obsoleted
CTX tags that need to be replaced with a Quote 2.0 alternative [page 218]. Additionally, you should review all
other ocurrencies of CTX tags in the product administration.
The primary changes and updates in the Products are visible in rules and messages, local scripts, and triggers.
In Quote 1.0 you can use quote CTX tags in the Configurator, because the quote object is available in memory.
However, Quote 2.0 is stateless and doesn’t support objects in memory, so accessing quote data directly is not
supported.
TagParser has been deprecated in Quote2.0 so leveraging CTX tags within scripts is not possible. Any formula
using CTX Quote tags for calculations in the Catalog and the Configurator needs to be refactored. Below are
two typical use cases when CTX Quote tags are used in Quote 1.0 with an alternative for Quote 2.0:
• market-based pricing referencing the selected market on the quote (for example,
CTX.Quote.SelectedMarket). The selected market can be accessed directly from the Catalog
and the Configurator. Instead of using <* CTX( Quote.SelectedMarket.MarketCode ) *>, use
<*CTX( Market.CurrencyCode )*> in Quote 2.0.
• customer-specific pricing referencing one of the customer roles in the quote (for example,
CTX.Quote.Customer(BillTo) ). Instead of using CTX.Quote.Customer(BillTo).Field, use
<*CTX( Quote.InvolvedParties.PartnerFunctionKey(PY).Field )*> in Quote 2.0.
TagParser has been removed to improve the performance of the system as the system will not have to load
every data source and will be purely event based. In every instance of TagParser used in your system, please
replace it with the correct IronPython method or property that will populate the data you need.
TagParser Workarounds
Quote 1.0:
Quote 2.0:
quote_id = context.Quote.Id
user_id = context.Quote.OwnerId
sql_str = “SELECT returncolumn FROM qt__quotetablename
WHERE wherefilter = {wf} AND
id = {u} AND
quoteid = q}”.format(wf=item[“Package_Number”].Value,q=quote_id,u=user_id)
res = SqlHelper.GetFirst(sql_str).returncolumn
Quote 1.0:
Quote 2.0:
context.Quote.GetCustomField(‘Subgeomarket’).Value
Market TagParser
Quote 1.0:
Quote 2.0:
market = context.Quote.SelectedMarket
currency_code = market.CurrencyCode
The product event When product is added to quote (OnProductAddedToQuote) is not supported in Quote 2.0.
You need to select a supported event in Quote 2.0 and, if needed, rewrite the script accordingly. Alternatively,
you can either create a quote calculation or a global script.
In Quote 1.0 scripts, you can read and write the configuration and the quote at any time. In Quote 2.0, after
triggering an action, the system triggers an event that retrieves only the context of avilable objects that are
relevant for that specific action. Every event has the quote object in context (context.Quote). Other available
objects depend on the event that was raised. Consequently, you can handle only the part of the quote that is
available in the context of that event.
For configurable products, once the Configure event is triggered from the Catalog, SAP CPQ opens the
underlying product as a product configuration object. The product configuration object has access to all the
product fields, attributes, layout, rules, and all other properties added to product by administrator in SAP CPQ
Setup. In addition to the product configuration object, Quote 1.0 also has access to the Cart (in memory). In
Quote 2.0, the configuration and the cart are segmented, so the Cart only loads after the Add to Quote event is
triggered.
This means that in Quote 1.0 scripts can read and update quote data from the configuration at any point.
Example: Company Orange Computers wants to keep track of every computer that is quoted with its new
ARM processor. In Quote 1.0, Orange SAP CPQ administrator, Greg, writes a script that when Processor
Type = ARM, quote item custom field “Contains ARM” should be set to Yes. The script in Quote 1.0
might look like this:
With the script attached to either Before Add to quote and When product is added to quote.
In Quote 2.0, a quote calculation can be added in Fields, Calculations, Layout to Calculations on Add/Copy/
Delete Item with script:
Check the Develop [page 266] section for more information. Also, more examples are described in the same
section [page 266].
To write to product level fields, you need to loop through context.Quote.GetAllItems() and for each item
for which you want to update attributes from the quote level, you need to call AsMainItem.Edit().
For example, the user selects the monitor size, and this change is reflected in the configurator (the attribute
(line item) changes accordingly). Configurator is edited inline via the python script.
Quote = context.Quote
for item in Quote.GetAllItems():
if item.PartNumber == "KY6440":
# cast or return as mainItem
MainItem = item.AsMainItem
# edit the product inline
Product = MainItem.Edit()
# assign based on the custom field value
valueToSelect = Quote.GetCustomField("Monitor").Value
Product.Attributes.GetByName("Monitor").SelectValue(valueToSelect)
# update
Product.UpdateQuote()
# intention break
break
The code is added as global script with event type on custom field change.
Example: Company Orange Computers wants to allow a certain partner to order printers directly from an
online portal so they create a custom API to accept those orders. The Printer product in SAP CPQ accepts a
free text entry for the location of the printer, the brand, model and the color of the printer. In Quote 1.0, Orange
Computers SAP CPQ administrator, Greg, writes a custom API script that saves the parameters from the API
call, creates a new quote, configures the Printer product and adds it to the quote.
To make an update to the product via API, in Quote 1.0 the script would look like this:
The same script to update the product in Quote 2.0 would look like this:
5.2.1.4.3 Quotes
Migration Effort
Setup Section Availability in Status in Quote Estimate [page Migration Instruc
Name Quote 2.0 2.0 Description 278] tions
Key Attributes Not Available Obsolete This can be re M Migration Instruc
implemented us tions [page 252]
ing item custom
fields in Quotes
Fields,
Calculations,
Layout.
Cart Level Not Available Obsolete Cart level aggre L Migration Instruc
Aggregates gates can be im tions [page 252]
plemented using
quote item custom
fields and script
ing.
Migration Instructions
Note
You may be using deprecated SAP CPQ tags and we highly recommend you review the list in CTX Tags -
Quote 1.0 vs Quote 2.0 [page 218].
Note
While the functionality has not changed, there is one minor change to the way quote tables are managed in
the database and this results in the fact that you no longer need to use QuoteTable.Save(). In Quote 2.0,
quote tables are automatically saved in scripts. Please remove QuoteTable.Save() from any scripts that
interact with quote tables.
Custom Fields
In Quote 2.0, instead of formulas, you need to use scripts. In Quote 2.0, two calculation types are available:
None and Once, when quote is created. To rewrite your formulas to scripts, consult the Develop [page 266]
section. Have in mind that modifying custom fields via scripts or APIs no longer triggers any attached global
scripts On the Custom Field Changed event.
Key Attributes
This feature has been deprecated in Quote 2.0 and will need to be reimplemented using the Fields,
Calculations, Layout administrative subsection. In Quote 2.0, you need to create an item custom field and
add a script to it that will summarize the amount of all the fields.. More information about scripting can be
found in the Develop [page 266] section. Also, here you can find examples of how to assign values to item
custom fields.
Search Fields
The list of available standard fields has changed in Quote 1.0. Compare the lists in the two engines and make
the necessary updates.
Quote Visibility
Quote Visibility [page 367] no longer accepts SAP CPQ tags, instead the controls are handled by SQL. If you’ve
used tags for quote visibility, you need to update the logic using SQL.
To replicate the Cart Level Aggregates functionality in Quote 2.0, create a new quote item custom field in
Setup Quotes Fields, Calculations, Layout and create a global script that loops through all the items in
the quote to set the item custom field to 1 or 0 (for example, item.Item["aggregate"] = 1 (based on the
aggregate condition), keep a running total in the loop and assign the total to the Total of the item custom field,
for example, context.Quote.Totals.Item["aggregate"] = total).
count = 0
for item in context.AffectedItems:
attribute = [attr for attr in item.SelectedAttributes if attr.Name ==
'YesOrNo']
Log.Write('From Add/Update/Delete Event')
isYes = 0
if attribute:
if attribute[0].Values[0].ValueCode == 'Yes':
isYes = 1
count = count + 1
item.Item["aggregate"] = isYes
context.Quote.Totals.Item["aggregate"] = count
The quote acceptance link is automatically inserted at the end of the email in Quote 1.0. In Quote
2.0, a new tag has been introduced that allows admins to put the link anywhere in the email
(<*CTX( Quote.Link.CustomerAcceptance )*>). Also, you can only use User's Mail Client in Emails are
Sent by option. Please see this page for more details: Email Customers / Quote Acceptance Settings [page
381].
This feature has been moved into Fields, Calculations, and Layout. More information can be found in Fields and
Calculations [page 284].
5.2.1.4.5 Users
Migration Overview
Migration Effort
Setup Section Availability in Status in Quote Estimate [page Migration Instruc
Name Quote 2.0 2.0 Description 278] tions
User Types
The option When creating a new quote, require customer to be selected first [page 148] (available in user page
administration in Quote 1.0) has been deprecated in Quote 2.0. In Quote 1.0, after creating a quote, the user is
redirected to the Customer page. To achieve the same in Quote 2.0, you need to edit the respective user type
and in Start Page select New Quote and a new quote will be created when the user logs in.
Permission Groups
The Advanced Mode of permission groups settings [page 138] allows the use of CTX tags in both quote engines.
However, some CTX tags have changed in Quote 2.0 [page 218]. For example, the CTX tags for customers
have been deprecated and new tags for involved parties are added. To check if you need to make any changes,
edit a permission group in Setup Users Permission Groups . Scroll down to the Advanced mode. If the
Advanced Mode toggle is disabled, no changes are required. If Advanced Mode is enabled, check to see if the
tag is available in Quote 2.0 by browsing through tags in this list [page 218].
Migration Effort
Setup Section Availability in Status in Quote Estimate [page Migration Instruc
Name Quote 2.0 2.0 Description 278] tions
Migration Instructions
Migration Overview
Migration Effort
Setup Section Availability in Status in Quote Estimate [page Migration Instruc
Name Quote 2.0 2.0 Description 278] tions
CX AI Available No Change
SAP Cloud for Available Improved Quote 1.0 and L Migration Instruc
Customer Quote 2.0 use dif tions [page 261]
ferent iflows.
Migration Instructions
Subscription to Events
In both Quote 1.0 and Quote 2.0, there are product and attribute-related events: ProductCreated,
ProductUpdated, ProductDeleted, AttributeCreated, AttributeUpdated, and AttributeDeleted. In Quote 1.0
for quote-related events, there is only OnQuoteDelete, and in Quote 2.0 there are these events as well:
OnPlaceOrder, QuoteStatusChanged, OnQuoteSaved, OnItemAdded, OnItemRemoved, and onQuoteCreated.
Quote 2.0 is event-based so you need to set the order place event with the URL of the new iflow. If you
have customized your iflow in Quote 1.0, you now need to go into SAP Cloud Integration and make the same
adjustments in the Quote 2.0 iflow. Additionally, if you've manually mapped your quote and quote item custom
fields in the iflow, you now need to map them again in Quote 2.0. The new engines offer an automatized way for
condition mappings.
Check which CTX tags have changed in Quote 2.0 [page 218] and update your mappings based on that.
Have in mind that Quote 2.0 supports Business Partners (and not Customers) so you will need to update
customer-related CTX tags.
Integration Suite
Go to Common Settings and update the iflow URL in the REST API base URL address field. Additionally, change
the username and password.
Since Quote 1.0 and Quote 2.0 use different iflows, after the migration, you need to update the iflow URLs.
SAP Commerce
Quote 2.0 is event based so you need to set the order place event with the URL of the new iflow.
5.2.1.4.8 UI Design
Migration Effort
Setup Section Availability in Status in Quote Estimate [page Migration Instruc
Name Quote 2.0 2.0 Description 278] tions
Migrating
Responsive Templates
In Quote 2.0, the system uses the QuoteList page instead of the CartList page. Any customizations made to
CartList in Quote 1.0 need to be reimplemented in QuoteList in Quote2.0.
Migration Effort
Setup Section Availability in Status in Quote Estimate [page Migration Instruc
Name Quote 2.0 2.0 Description 278] tions
Migration Instructions
Actions
Check which actions are obsolete and which are still not implemented in Quote 2.0 [page 204] to see if there
is anything that you need to change in your implementation. The most common actions like Add Item and
Generate Document have been implemented. The workaround for any missing system actions is to create
custom actions instead.
Workflow
Check which CTX tags have been deprecated and updated [page 218] and update your conditions.
Approval Rules
Check which CTX tags have been deprecated and updated [page 218] and update your approval rule conditions
and dynamic approvers.
5.2.1.4.10 Develop
Migration Effort
Setup Section Availability in Status in Quote Estimate [page Migration Instruc
Name Quote 2.0 2.0 Description 278] tions
Migrating
Your product scripts, global scripts, custom action scripts, and custom quote calculation scripts used in Quote
1.0 need to be reviewed and rewritten in the Quote 2.0 syntax. Scripting namespace with properties and
methods are explained in the scripting documentation [page 329]. Migration of custom quote calculations is
described in Pricing/Calculations [page 234].
Global Scripts
Functionally, creating and maintaining scripts in Quote 2.0 has not been changed, but the logic behind scripting
has been changed. After you migrate to Quote 2.0, you need to do the following:
• check for obsolete events. For reference, see the list of events that are triggered and executed in SAP CPQ
Quote 1.0 in some typical scenario. For comparison, check the event pipeline for Quote 2.0.
Quote 2.0
headers = buildApiHeaders()
url = ("https://{}".format(RequestContext.Url.Host)
+ "/api/v1/quotes/{}".format(quoteId)
+ "/actions/{}/invoke".format(actionId)
)
postResponse = RestClient.Post(url, body, headers)
Additionally, not all actions are supported, including reconfigure, save, reprice, and so on. Instead
of the Change Status action, you can use Quote.ChangeStatus() instead in Quote 2.0 to
change the quote status. To execute other actions, use the REST API (make a POST call
to this endpoint: https://cpqbaseurl/api/v1/quotes/{quoteId}/quoteTables/{tableName}/
actions/{actionId}/invoke). This will trigger all related pre and post actions. For more information,
check the online REST API Swagger documentation .
IsMain line item property is not available in Quote 2.0 scripting. All scripts leveraging IsMainItem as a
conditional need to be reworked to operate on the desired item. For example:
Quote 1.0
Quote 2.0
Quote 2.0
Product.UpdateQuote() from Quote 1.0 was replaced with Quote.AddItem() in Quote 2.0:
Quote 1.0
prod = QuoteHelper.Get(167).GetItemByItemNumber(1).AsMainItem.Edit()
prod.UpdateQuote()
Quote 2.0
quote = QuoteHelper.Get(167)
prod = quote.GetItemByItemNumber(1).AsMainItem.Edit()
qty = quote.GetItemByItemNumber(1).Quantity
quote.AddItem(prod, qty)
Blocking products from being added to the quote doesn’t work via Product.ok now. In Quote 2.0, the
product must be blocked before it's added to quote.
Quote 1.0
Product.ok = False
Quote 2.0
To prevent a product from being added to the quote, make the product incomplete using rules, messages,
and so on.
The following table shows some methods that have been obsoleted in Quote 2.0 and alternative solutions
for Quote 2.0:
Quote Item for Scripting docu IQuoteItem for item Scripting docu
mainItem mentation in mentation
in context.Qu
Quote.Main ote.GetAll
Items: Items():
for item for item
in in
Quote.GetI context.Qu
temsByProd ote.
uctTypeSys GetItemsBy
temId(): ProductTyp
for eId():
mainItem for item
in in
Quote.Main context.Qu
Items: ote.
for GetItemAnd
lineItem HisAncesto
in rs():
mainItem.L context.Qu
ineItems: ote.
Quote.GetI GetItemByI
temByQuote temId(Int3
Item(Int32 2)
) context.Qu
Quote. ote.
GetItemByQ GetItemByI
uoteItem(S temNumber(
tring) Int32)
Quote. for item
GetItemByU in
niqueIdent context.Af
ifier(Stri fectedItem
ng) s:
for item
in
context.It
ems:
Quote Item Cus for item Scripting docu IQuoteItemCus for item Scripting docu
tom Field in mentation tomField in mentation
Quote.Item context.Qu
s: ote.GetAll
Items():
item["Fiel
d item.Item[
Name"].Val "Field
ue = Name"] =
"value" "value"
Set the Address1 field of the first Involved Party on the quote
import clr
clr.AddReference("System.Core")
import System
clr.ImportExtensions(System.Linq)
quote = context.Quote
ips =
quote.GetInvolvedParties().ToList()
ip = ips[0]
ip.Address1 = 'test333'
Custom Actions
Each occurrence of the Quote object in the scripts needs to be modified to context.Quote. Any use of
GetCustomField().Content needs to be updated to .Value instead. Check the following examples:
Quote 1.0:
Quote2.0:
WorkflowContext properties still exist in Quote 2.0 as in Quote1.0. However, they need to be updated so that
they leverage the new context. Add context. in front of any line with WorkflowContext. This example uses
Quote 2.0 syntax:
The quote level messages functionality has been inherited from Quote 1.0 and additionally improved in the
following ways in Quote 2.0:
• Four types of messages are supported: Success, Error, Info and Warning.
• Messages have a distinct look and feel based on the message type.
• The isTemporary property defines whether the message is removed automatically from the screen after
the first request or if the user is to remove it manually (temporary vs persisted messages, respectively).
The following is the interface for adding and deleting scripting messages:
Example
5.2.1.4.11 General
Migration Overview
Migration Effort
Setup Section Availability in Status in Quote Estimate [page Migration Instruc
Name Quote 2.0 2.0 Description 278] tions
Application Parameters
List Price is not editable in Quote 2.0, you can't add it to the Fields, Calculations, Layout section and there
aren't any application parameters that interact with this field. If you are using these application parameters
(for example, Allow Edit List Price on the Cart), you need to consider refactoring how and why these are in
use. Additionally, the application parameters allowing users to select responsive design have been obsolete
because responsive design is mandatory for Quote 2.0.
Review the list of application parameters and check their availability in Quote engines [page 637].
Deploy/Send Changes
Deployment packages created in Quote 1.0 will not work in Quote 2.0 because you can only send/deploy
packages within the same quote engine. Recreate the packages from Quote 1.0 in Quote 2.0.
5.2.1.4.12 Import/Export
Migration Effort
Setup Section Availability in Status in Quote Estimate [page Migration Instruc
Name Quote 2.0 2.0 Description 278] tions
5.2.1.4.14 Security
All security-related sections will be migrated from Quote 1.0 to Quote 2.0 without the administrator needing to
take any actions.
All sections related to developer tools will be migrated from Quote 1.0 to Quote 2.0 without the administrator
needing to take any actions.
All sections related to the audit trail will be migrated from Quote 1.0 to Quote 2.0 without the administrator
having to take any actions.
Migration Effort Estimate gives a T-shirt estimate of the effort it takes to migrate a feature from Quote 1.0 to
Quote 2.0.
The estimates are not based on any real numbers (they don’t represent a number of days or hours). This type
of sizing should help you get a general understanding of the effort and make it easier to decide whether to
migrate or not.
• S - the feature has been slightly altered and you only need to make a few specific changes. You should see
most of the data unchanged in Quote 2.0.
• M - the feature works in the same way, but the user interface has been altered, some fields were removed
or added, or tags need to be updated. Migration doesn’t require a new strategy, like the L effort features,
but it requires more action by the administrator than S effort features.
Related Information
This page contains a list of common questions related to Quote 2.0 and the migration from Quote 1.0 to Quote
2.0.
Related Information
In Fields, Calculations, Layout you can define options for basic quote elements in the Quote 2.0, such as quote
fields, calculations, their layout and so on.
Note
If using Quote 1.0, calculations should be administered under Pricing/Calculations > Cart Field
Administration UI Design Quote Layout and Quote Quote Visibility Permissions respectively.
In the Layout section you can change the look and feel of quotes in the environment, by reordering their current
columns and sections or adding new ones. This functionality is available in Responsive Design only, and in
Quote 1.0 engine, it can be found in UI Design Quote Layout .
Once you navigate to this tab ( Setup Quote Fields, Calculations, Layout Layout ), you will see all
sections and columns which are in the current quote layout (some of them are hidden from the user side via
permissions). All available columns are displayed in the ProductTypes and Items sections. They are reordered
globally, which means that when you move them to another spot, they are simultaneously reordered in all
sections in which they are displayed. Sections can also be reordered via drag-and-drop.
Note
Visibility permissions aren’t assigned in this tab. Go to the Layout Permissions tab if you wish to restrict or
give access for certain columns/sections in an established quote layout to specific user types.
In this tab, you can set up which permission groups will be able to access the selected parts of the quote layout.
This tab is accessed via Setup Quote Fields Calculations, Layout Layout Permissions in Quote 2.0
and via Setup Quotes Quote Layout Permissions in Quote 1.0. To assign permissions, you need to
select a permission group, and then the layout items you wish to give the permission group’s members full
access to.
Related Information
To manage calculations for Quote 2.0, access the Fields and Calculations tab in Setup Quotes Fields,
Calculations, Layout . The page shows in Setup only when Quote 2.0 is on. Otherwise, if using Quote 1.0,
calculations should be administered under Pricing/Calculations > Cart Fields Administration.
Note
Note that in the context of calculations, terms quote fields and columns may be used interchangeably when
referring to fields on quotes that are calculated via formulas (for example, One-Time List Price, Extended
Cost, One-Time Cost, etc.). Additionally, terms formula and calculations may be used interchangeably as
well.
The Fields and Calculations tab allows you to manage existing quote default and custom fields in the system
and to add new fields.
After you select a field from the list, a list of calculations attached to it will display on the right. Calculations
execute from top to bottom. To change the order or calculations, click on next to a calculation and move it up
or down. To remove a calculation, click .
Note
Due to dependency between certain default calculations, the system must execute them in a specific order
described in Item Update Calculations Order [page 293]. Ordering calculations differently may cause an
error.
To attach another calculation, click Add calculation below the list of existing calculations. A pop-up shows all
the remaining calculations that can be attached to a field by clicking . Additionally, the system lets you define
calculations that are triggered when a new item is added. The list of calculations shows on the right if you click
Calculation on Add/Copy/Delete Item. These calculations should also be organized in a predefined order as
shown in Item Add Calculations Order.
Note
When Quote 2.0 engine is enabled, a parameter Calculate discounts only for changed items is visible on the
Discounts page. Selecting the parameter optimizes calculations by checking discount rules only on affected
(changed) items.
In Quote 2.0, every calculation represents only one calculation that is executing in the system. Administrators
have a full control over the order of calculations and they can easily insert a custom calculation between
standard calculations. For example, they can insert an item custom field between two standard fields and insert
a calculation so that the custom field affects the standard fields, without having to completely rewrite the
entire quote calculation for quote lines. Those calculations have items that are affected by the calculation in the
context (context.AffectedItems). This applies also to sections and product types.
The concept of editable groups is removed from the system with Quote 2.0. In the new engine, calculations are
managed on field level for all users on the tenant. Calculations are to be set up for each field separately, one
field at a time. The system allows you to make all quote fields editable (main items, line items, product types,
and totals).
Note
When on a quote, users just need to double-click the underlined amount in a column and all amounts in
the column become editable. After changing a value, users can trigger the calculations by clicking Reprice,
clicking anywhere outside the active field or by pressing Enter.
On the Quote Fields and Calculations page, the list on the left shows all fields calculated via formulas that
display on quotes. Once you click a field, the list on the right will display all calculations that are triggered in the
system after the value in the field has changed. Changing a value causes a chain reaction in which calculations
are performed one after another. When changing the default order of calculations, make sure to organize them
so that the system has the value of all constituent elements before triggering the calculation.
To organize calculations properly, administrators should understand which values does a calculation use
and according to their specific customization, organize calculations in a logical manner.
Additionally, you can create custom calculations via scripting. To access the window for creating scripts, click
Add calculation Add New Calculation . In the pop-up, define the following:
More details on scripting are available in Scripting for Quote 2.0 [page 329].
To see the editing rights for a field, click Show editing permissions for this field. The pop-up displays the
permission groups that have the rights to edit the field and quote statuses in which editing is enabled.
Most quote fields are calculated via one predefined formula. However, the value of some of them is calculated
via multiple formulas.
Example
The first calculation is attached to the One-Time Discount Amount and it's triggered once users change the
value in this field. The second calculation will be triggered after One-Time Net Price is changed and the third
after One-Time Extended Amount is changed.
You can find below formulas that are used for calculating all quote fields (main items, line items, product
type, and total items). The first column contains the name of the field as it is displayed on quotes. Calculation
contains calculation names as defined in the Quote Fields and Calculations section. In addition, a description of
each field is provided as well as the formula for calculating the field.
One-Time List Price Item One-Time List Price Calculates item One-Time list Item.ListPrice = Item.Exten
price from item One-Time ex dedListPrice / Item.Quantity
tended list price.
Recurring List Price Item Recurring List Price Calculates Recurring List Item.MrcListPrice =
Price from Recurring Ex Item.MrcExtendedListPrice /
tended List Price. Item.Quantity
One-Time Discount Percent Item One-Time Discount Per Calculates item One-Time Item.DiscountPercent = 100
cent (from Discount Amount) discount percent from item * Item.DiscountAmount /
discount amount. Item.ListPrice
One-Time Discount Percent Item One-Time Discount Per Calculates item One-Time Item.DiscountPercent = 100
cent (from item net price) discount percent from net - 100 * Item.NetPrice /
price. Item.ListPrice
One-Time Discount Percent Item One-Time Discount Calculates item One-Time Item.DiscountPercent = 100
Percent (from Extended discount percent from item - 100 * Item.ExtendedA
Amount) extended amount. mount / Item.ListPrice *
Item.Quantity
Recurring Discount Percent Item Recurring Discount Per Calculates item Recurring Item.MrcDiscountPercent =
cent (from Recurring Dis discount percent from item 100 * Item.MrcDiscountA
count Amount) Recurring discount amount. mount / Item.MrcListPrice
Recurring Discount Percent Item Recurring Discount Per Calculates item Recurring Item.MrcDiscountPercent =
cent (from Recurring Net discount percent from item 100 - 100 * Item.MrcNet
Price) Recurring net price. Price / Item.MrcListPrice
Recurring Discount Percent Item Recurring Discount Per Calculates item Recurring Item.MrcDiscountPercent =
cent (from Recurring Ex discount percent from item 100 - 100 * Item.MrcExten
tended Amount) Recurring extended amount. dedAmount / Item.MrcList
Price * Item.Quantity
One-Time Extended Amount Item One-Time Extended Calculates item One-Time Item.ExtendedAmount =
Amount extended amount from item Item.NetPrice * Item.Quan
net price and quantity. tity
Recurring Extended Amount Item Recurring Extended Calculates item Recurring ex Item.MrcExtendedAmount
Amount tended amount from item = Item.MrcNetPrice *
Recurring net price and Item.Quantity
quantity.
Recurring Cost Item Recurring Cost Calculates item Recurring Item.MrcCost = Item.MrcEx
cost from item Recurring ex tendedCost / Item.Quantity
tended cost and quantity.
One-Time Extended Cost Item One-Time Extended Calculates item One-Time item.ExtendedCost =
Cost extended cost from item item.Cost * item.Quantity
One-Time cost and quantity.
Recurring Extended Cost Item Recurring Extended Calculates item Recurring ex Item.MrcExtendedCost =
Cost tended cost from item Recur Item.MrcCost * Item.Quan
ring cost and quantity. tity
One-Time Extended List Price Item One-Time Extended List Calculates item One-Time Item.ExtendedListPrice =
Price extended list price from Item.ListPrice * Item.Quan
item One-Time list price and tity
quantity.
Recurring Extended List Price Item Recurring Extended List Calculates item Recurring ex Item.MrcExtendedListPrice
Price tended list price from item = Item.MrcListPrice *
Recurring list price and quan Item.Quantity
tity.
One-Time Discount Amount Item One-Time Discount Calculates item One-Time Item.DiscountAmount =
Amount (from One-Time dis discount amount from One- Item.ListPrice * Item.Quan
count percent) Time discount percent. One- tity * Item.DiscountPercent /
Time discount amount also 100
includes item quantity.
One-Time Discount Amount Item One-Time Discount Calculates item One-Time Item.DiscountAmount =
Amount (from One-Time net discount amount from item Item.ListPrice - Item.Net
price) net price. Price
One-Time Discount Amount Item One-Time Discount Calculates item One-Time Item.DiscountAmount =
Amount (from One-Time ex discount amount from One- (Item.ListPrice - Item.Exten
tended amount) Time extended amount and dedAmount / Item.Quantity)
quantity. * Item.Quantity
Recurring Discount Amount Item Recurring Discount Calculates item Recurring Item.MrcDiscountAmount
Amount (from Recurring dis discount amount from item = Item.MrcListPrice *
count percent) Recurring discount percent. Item.MrcDiscountPercent /
100
Recurring Discount Amount Item Recurring Discount Calculates item Recurring Item.MrcDiscountAmount
Amount (from Recurring net discount percent from item = Item.MrcListPrice -
price) Recurring net price. Item.MrcNetPrice
Recurring Discount Amount Item Recurring Discount Calculates item Recurring Item.MrcDiscountAmount
Amount (from Recurring ex discount amount from Re = Item.MrcListPrice -
tended amount) curring extended amount. Item.MrcExtendedAmount /
Item.Quantity
One-Time Net Price Item One-Time Net Price Calculates item One-Time item.NetPrice = item.List
net price from item discount Price * (1 - item.DiscountPer
percent. cent / 100)
Recurring Net Price Item Recurring Net Price Calculates item Recurring Item.MrcNetPrice =
net price from Recurring dis Item.MrcListPrice -
count amount. Item.MrcDiscountAmount
One-Time Manufactures Item One-Time Gross Margin Calculates item One-Time Item.GrossMarginPercent
Gross Margin Percent gross margin percent from = 100 * (Item.Exten
item One-Time extended dedAmount - Item.Exten
amount and item One-Time dedCost) / Item.ExtendedA
extended cost. mount
Recurring Manufactures Total Recurring Gross Margin Calculates total Recurring Totals.MrcGrossMarginPer
Gross Margin Percent gross margin percent from cent = 100 * (Totals.MrcNet
totals Recurring net price Price - Totals.MrcCost) / To
and totals Recurring cost. tals.MrcNetPrice
Product Type One-Time Product Type One-Time Dis Calculates product type One- ProductType.DiscountPer
Discount Percent count Percent Time discount percent from cent = 100 * Product
product type One-Time dis Type.DiscountAmount / Pro
count amount. ductType.ListPrice
Product Type Recurring Product Type Recurring Dis Calculates product type Re ProductType.MrcDiscount
Discount Percent count Percent curring discount percent Percent = Product
from product type Recurring Type.MrcDiscountAmount /
discount amount. ProductType.MrcListPrice
One-Time Extended Amount Product Type One-Time Net Calculates One-Time net NetPrice = Sum(Item.Exten
Price price as a sum of all item ex dedAmount)
tended amounts.
Recurring Extended Amount Product Type Recurring Net Calculates Recurring ex ProductType.MrcNetPrice
Price tended amount as a sum of = Sum(Item.RecurringExten
all item Recurring extended dedAmount)
amounts.
One-Time Extended Cost Product Type One-Time Cost Calculates One-Time ex Cost = Sum(Item.Extended
tended cost as a sum of Cost)
all item One-Time extended
costs.
Recurring Extended Cost Product Type Recurring Cost Calculates Recurring ex ProductType.MrcCost
tended cost as a sum of = Sum(Item.RecurringExten
all item Recurring extended dedCost)
costs.
One-Time Extended List Price Product Type List Price Calculates NRX extended list ListPrice = Sum(Item.Exten
price as a sum of all item ex dedListPrice)
tended list prices.
Recurring Extended List Price Product Type Recurring List Calculates product type Re ProductType.MrcListPrice
Price curring list price as a sum of = Sum(Item.RecurringExten
all item Recurring extended dedListPrice)
list prices.
One-Time Discount Amount Product Type Discount Calculates One-Time dis ProductType.DiscountA
Amount count amount from product mount = ProductType.List
type One-Time net price. Price - ProductType.NetPrice
Recurring Discount Amount Product Type Recurring Dis Calculates Recurring dis ProductType.MrcDiscountA
count Amount count amount from Recur mount = Product
ring net price. Type.MrcListPrice - Product
Type.MrcNetPrice
One-Time Manufactures Product Type Gross Margin Calculates One-Time manu ProductType.GrossMargin
Gross Margin Percent factures gross margin from Percent = 100 * (Pro
product type net price. ductType.NetPrice - Pro
ductType.Cost) / Product
Type.NetPrice
Item Total One-Time Total One-Time List Price Calculates total One-Time Totals.ListPrice
Extended List Price extended list price as a sum = Sum(Item.ExtendedList
of all item extended list pri Price)
ces.
Item Total One-Time Total One-Time Net Price Calculates total One-Time Totals.NetPrice =
Extended Amount extended amount as a Sum(Item.ExtendedAmount)
sum of all item extended
amounts. This is the total
amount of all items without
any added expenses or ap
plied discounts.
Item Total Recurring Total Recurring List Price Calculates item total Recur Totals.MrcListPrice
Extended List Price ring extended list price as a = Sum(Item.RecurringExten
sum of all item Recurring ex dedListPrice)
tended list prices.
Item Total Recurring Total Recurring Net Price Calculates item total Recur Totals.MrcNetPrice
Extended Amount ring extended amount as a = Sum(Item.RecurringExten
sum of all item Recurring ex dedAmount)
tended amounts.
Item Total Recurring Amount Total Recurring Amount Calculates total Recurring Totals.MrcAmount = To
amount as a sum of all tals.MrcNetPrice
item Recurring extended
amounts.
Item Total One-Time Total Cost Calculates item total One- Totals.Cost = Sum(Item.Ex
Extended Cost Time extended cost as a sum tendedCost)
of all item extended costs.
Item Total One-Time Total Product Discount Calculates item total One- Totals.ProductDiscountA
Extended Amount Amount Time extended amount from mount = Totals.ListPrice -
total net price. Totals.NetPrice
Item Total One-Time Discount Total Average Product Dis Calculates item total One- Totals.AverageProductDis
Percent count Percent Time discount percent countPercent = 100
from total product discount * Totals.ProductDiscountA
amount. mount / Totals.ListPrice
Item Total Recurring Total Recurring Cost Calculates total Recurring ex Totals.MrcCost
Extended Cost tended cost as a sum of = Sum(Item.RecurringExten
all item Recurring extended dedCost)
costs.
Item Total Recurring Total Recurring Product Dis Calculates item total Recur Totals.MrcProductDiscoun
Extended Amount count Amount ring extended amount from tAmount = Totals.MrcList
total Recurring net price. Price - Totals.MrcNetPrice
Item Total Recurring Discount Total Average Recurring Calculates item total Recur Totals.AverageMrcProduct
Percent Product Discount Percent ring discount percent from DiscountPercent = 100
Recurring product discount * Totals.MrcProductDiscoun
amount. tAmount / Totals.MrcList
Price
Recurring Manufactures Total Recurring Gross Margin Calculates total Recurring Totals.MrcGrossMarginPer
Gross Margin Percent manufactures gross margin cent = 100 * (Totals.MrcNet
from Recurring net price. Price - Totals.MrcCost) / To
tals.MrcNetPrice
In the Field Editability tab, you can select the quote fields that are editable, the permission groups that are able
to edit them and the status of the quotes in which the fields are editable. Unlike in the old quote engine, in
Quote 2.0, the editability is set per column. This means that if a column is editable, all fields in that column, for
all items, are editable. By default, all fields on quotes are read-only until their editability is defined.
When you access the Field Editability tab, only permission groups are displayed in the Select Permission
Group column. After selecting a permission group, quote statuses display in the Select Quote Status column.
Multiple selection of permission groups and quote statuses isn’t enabled so you have to define field editability
for each permission group/status separately. Clicking Default Settings in a respective column applies the
selection to all permission groups or statuses.
If you want the same fields that are editable for a permission group/quote status pair to be editable for another
permission group/status pair, click Apply field selections from. A pop-up displays enabling you to search the
permission group and the quote status.
Note
The logic between multiple permission groups is OR (if a user belongs to multiple permission groups, and if
editing a field is enabled for only one of the groups, the user has the right to edit that field).
Default Settings
Default editing settings allow administrators to select fields that are editable for all permission group/status
pairs by default until administrators select other fields. The purpose of the default settings is to cover the
scenarios in which the administrator hasn’t defined what fields are editable for a permission group or a status,
or both.
After defining default settings that all permission group/status pairs inherit, selecting a pair and clicking Save
breaks the link between the default settings and the respective pair. All future changes made to the default
settings won’t apply to the respective pair.
Tip
Default settings apply to permission group/status pairs only before any other change is made. For example,
if default fields are selected for a pair and you deselect one of the fields and select two others fields, you
can’t apply the default settings again. You can only select fields manually.
To decide what quote fields are editable for a user, the system first looks for the fields that are selected in
Fields, Calculations, Layout > Field Editability for that permission group and the status of the current quote.
The system follows this workflow after default settings have been applied and before any other change on the
selected fields has been made for a permission group/status.
When a new item is added to a quote or an existing item is updated with new configuration, these calculations
are triggered in the following order:
Item One-Time Extended List Price Calculates item One-Time extended list Item.ExtendedListPrice = Item.ListPrice
price from item One-Time list price and * Item.Quantity
quantity.
Item One-Time Discount Amount (from Calculates item One-Time discount Item.DiscountAmount = Item.ListPrice
One-Time discount percent) amount from One-Time discount per * Item.Quantity * Item.DiscountPer
cent. One-Time discount amount also cent / 100
includes item quantity.
Item One-Time Net Price Calculates item One-Time net price item.NetPrice = item.ListPrice * (1 -
from item discount percent. item.DiscountPercent / 100)
Item One-Time Extended Amount Calculates item One-Time extended Item.ExtendedAmount = Item.NetPrice
amount from item net price and quan * Item.Quantity
tity.
Item One-Time Extended Cost Calculates item One-Time extended item.ExtendedCost = item.Cost *
cost from item One-Time cost and item.Quantity
quantity.
Item One-Time Gross Margin Percent Calculates item One-Time gross margin Item.GrossMarginPercent = 100 *
percent from item One-Time extended (Item.ExtendedAmount - Item.Exten
amount and item One-Time extended dedCost) / Item.ExtendedAmount
cost.
Product Type List Price Calculates NRX extended list price as a ListPrice = Sum(Item.ExtendedList
sum of all item extended list prices. Price)
Product Type One-Time Net Price Calculates One-Time net price as a sum NetPrice = Sum(Item.ExtendedA
of all item extended amounts. mount)
Product Type Discount Amount Calculates One-Time discount amount ProductType.DiscountAmount = Pro
from product type One-Time net price. ductType.ListPrice - ProductType.Net
Price
Product Type One-Time Discount Calculates product type One-Time dis ProductType.DiscountPercent = 100
Percent count percent from product type One- * ProductType.DiscountAmount / Pro
Time discount amount. ductType.ListPrice
Product Type One-Time Cost Calculates One-Time extended cost as Cost = Sum(Item.ExtendedCost)
a sum of all item One-Time extended
costs.
Total One-Time List Price Calculates total One-Time extended list Totals.ListPrice = Sum(Item.Extended
price as a sum of all item extended list ListPrice)
prices.
Total One-Time Net Price Calculates total One-Time extended Totals.NetPrice = Sum(Item.Extende
amount as a sum of all item extended dAmount)
amounts.
Total Product Discount Amount Calculates item total One-Time ex Totals.ProductDiscountAmount = To
tended amount from total net price. tals.ListPrice - Totals.NetPrice
Total Average Product Discount Percent Calculates item total One-Time dis Totals.AverageProductDiscountPercent
count percent from total product dis = 100 * Totals.ProductDiscountA
count amount. mount / Totals.ListPrice
Total Recurring Gross Margin Percent Calculates total Recurring manufac Totals.MrcGrossMarginPercent = 100 *
tures gross margin from Recurring net (Totals.MrcNetPrice - Totals.MrcCost) /
price. Totals.MrcNetPrice
Item Recurring Extended List Price Calculates item Recurring extended list Item.MrcExtendedListPrice =
price from item Recurring list price and Item.MrcListPrice * Item.Quantity
quantity.
Item Recurring Discount Amount (from Calculates item Recurring discount Item.MrcDiscountAmount =
Recurring discount percent) amount from item Recurring discount Item.MrcListPrice * Item.MrcDiscount
percent. Percent / 100
Item Recurring Discount Amount (from Calculates item Recurring discount Item.MrcDiscountAmount =
Recurring discount percent) amount from item Recurring discount Item.MrcListPrice * Item.MrcDiscount
percent. Percent / 100
Item Recurring Extended Cost Calculates item Recurring extended Item.MrcExtendedCost = Item.MrcCost
cost from item Recurring cost and * Item.Quantity
quantity.
Item Recurring Gross Margin Percent Calculates item Recurring gross margin Item.MrcGrossMarginPercent = 100
percent from item Recurring extended * (Item.MrcExtendedAmount -
amount and item Recurring extended Item.MrcExtendedCost) / MrcExtende
cost. dAmount
Product Type Recurring List Price Calculates product type Recurring list ProductType.MrcListPrice =
price as a sum of all item Recurring ex Sum(Item.RecurringExtendedListPrice)
tended list prices.
Product Type Recurring Net Price Calculates Recurring extended amount ProductType.MrcNetPrice =
as a sum of all item Recurring extended Sum(Item.RecurringExtendedAmount)
amounts.
Product Type Recurring Discount Calculates product type Recurring dis ProductType.MrcDiscountPercent =
Percent count percent from product type Recur ProductType.MrcDiscountAmount /
ring discount amount. ProductType.MrcListPrice
Product Type Recurring Cost Calculates Recurring extended cost as ProductType.MrcCost = Sum(Item.Re
a sum of all item Recurring extended curringExtendedCost)
costs.
Total Recurring List Price Calculates item total Recurring ex Totals.MrcListPrice = Sum(Item.Recur
tended list price as a sum of all item ringExtendedListPrice)
Recurring extended list prices.
Total Recurring Net Price Calculates item total Recurring ex Totals.MrcNetPrice = Sum(Item.Recur
tended amount as a sum of all item Re ringExtendedAmount)
curring extended amounts.
Total Recurring Product Discount Calculates item total Recurring ex Totals.MrcProductDiscountAmount =
Amount tended amount from total Recurring net Totals.MrcListPrice - Totals.MrcNet
price. Price
Total Average Recurring Product Calculates item total Recurring dis Totals.AverageMrcProductDiscountPer
Discount Percent count percent from Recurring product cent = 100 * Totals.MrcProductDis
discount amount. countAmount / Totals.MrcListPrice
Total Recurring Gross Margin Percent Calculates total Recurring manufac Totals.MrcGrossMarginPercent = 100 *
tures gross margin from Recurring net (Totals.MrcNetPrice - Totals.MrcCost) /
price. Totals.MrcNetPrice
Click on a field to see the default order of calculations that trigger once the value of the respective field is
changed. For each field, you will see the name of the calculation as defined in Quote Fields and Calculations, the
description of the calculation and the mathematical formula used for calculating the value.
Item One-Time Discount Percent (from Calculates item One-Time discount Item.NrcDiscountPercent = 100 -
One-Time Extended Amount) percent from item One-Time extended 100 * Item.NrcExtendedAmount /
amount, One-Time list price and quan Item.NrcListPrice * Item.Quantity
tity.
Item One-Time Net Price Calculates item One-Time net price item.NetPrice = item.ListPrice * (1 -
from item list price and item discount item.DiscountPercent / 100)
percent.
Item One-Time Extended Amount Calculates item One-Time extended Item.ExtendedAmount = Item.NetPrice
amount from item net price and quan * Item.Quantity
tity.
Product type Net Price Calculates product type net price as a ProductType.NetPrice = Sum(Item.Ex
sum of all item extended amounts. tendedAmount)
Product Type Discount Amount Calculates One-Time discount amount ProductType.DiscountAmount = Pro
from product type One-Time net price. ductType.ListPrice - ProductType.Net
Price
Product Type One-Time Discount Calculates product type One-Time dis ProductType.DiscountPercent = 100
Percent count percent from product type One- * ProductType.DiscountAmount / Pro
Time discount amount. ductType.ListPrice
Total One-Time Net Price Calculates total One-Time extended Totals.NetPrice = Sum(Item.Extende
amount as a sum of all item extended dAmount)
amounts.
Total Product Discount Amount Calculates item total One-Time ex Totals.ProductDiscountAmount = To
tended amount from total net price. tals.ListPrice - Totals.NetPrice
Total Average Product Discount Percent Calculates item total One-Time dis Totals.AverageProductDiscountPercent
count percent from total product dis = 100 * Totals.ProductDiscountA
count amount. mount / Totals.ListPrice
Item Gross Margin Percent Calculates item gross margin percent Item.GrossMarginPercent = 100 *
from item extended amount and item (Item.ExtendedAmount - Item.Exten
extended cost. dedCost) / Item.ExtendedAmount
Total Average Gross Margin Percent Calculates item total Recurring manu Totals.MrcGrossMarginPercent = 100 *
factures gross margin from total Recur (Totals.MrcNetPrice - Totals.MrcCost) /
ring net price and total mrc cost. Totals.MrcNetPrice
Item One-Time Discount Amount (from Calculates item One-Time discount Item.DiscountAmount = Item.ListPrice
One-Time discount percent) amount from One-Time discount per * Item.Quantity * Item.DiscountPer
cent. One-Time discount amount also cent / 100
includes item quantity.
Item One-Time Net Price Calculates item One-Time net price item.NetPrice = item.ListPrice * (1 -
from item discount percent. item.DiscountPercent / 100)
Item One-Time Extended Amount Calculates item One-Time extended Item.ExtendedAmount = Item.NetPrice
amount from item net price and quan * Item.Quantity
tity.
Product Type One-Time Net Price Calculates One-Time net price as a sum NetPrice = Sum(Item.ExtendedA
of all item extended amounts. mount)
Product Type Discount Amount Calculates One-Time discount amount ProductType.DiscountAmount = Pro
from product type One-Time net price. ductType.ListPrice - ProductType.Net
Price
Product Type One-Time Discount Calculates product type One-Time dis ProductType.DiscountPercent = 100
Percent count percent from product type One- * ProductType.DiscountAmount / Pro
Time discount amount. ductType.ListPrice
Total One-Time Net Price Calculates total One-Time extended Totals.NetPrice = Sum(Item.Extende
amount as a sum of all item extended dAmount)
amounts.
Total Product Discount Amount Calculates item total One-Time ex Totals.ProductDiscountAmount = To
tended amount from total net price. tals.ListPrice - Totals.NetPrice
Total Average Product Discount Percent Calculates item total One-Time dis Totals.AverageProductDiscountPercent
count percent from total product dis = 100 * Totals.ProductDiscountA
count amount. mount / Totals.ListPrice
Item One-Time Gross Margin Percent Calculates item One-Time gross margin Item.GrossMarginPercent = 100 *
percent from item One-Time extended (Item.ExtendedAmount - Item.Exten
amount and item One-Time extended dedCost) / Item.ExtendedAmount
cost.
Total Recurring Gross Margin Percent Calculates item total Recurring manu Totals.MrcGrossMarginPercent = 100 *
factures gross margin from Recurring (Totals.MrcNetPrice - Totals.MrcCost) /
net price. Totals.MrcNetPrice
Item One-Time Discount Amount (from Calculates item One-Time discount Item.DiscountAmount = Item.ListPrice
One-Time discount percent) amount from One-Time discount per * Item.Quantity * Item.DiscountPer
cent. One-Time discount amount also cent / 100
includes item quantity.
Item One-Time Discount Percent (from Calculates item One-Time discount Item.DiscountPercent = 100 * Item.Dis
Discount Amount) percent from item discount amount. countAmount / Item.ListPrice
Item One-Time Net Price Calculates item One-Time net price item.NetPrice = item.ListPrice * (1 -
from item list price and item discount item.DiscountPercent / 100)
percent.
Item One-Time Extended Amount Calculates item One-Time extended Item.ExtendedAmount = Item.NetPrice
amount from item net price and quan * Item.Quantity
tity.
Product Type One-Time Net Price Calculates One-Time net price as a sum NetPrice = Sum(Item.ExtendedA
of all item extended amounts. mount)
Product type discount amount Calculates One-Time discount amount ProductType.DiscountAmount = Pro
from product type One-Time net price. ductType.ListPrice - ProductType.Net
Price
Product Type One-Time Discount Calculates product type One-Time dis ProductType.DiscountPercent = 100
Percent count percent from product type One- * ProductType.DiscountAmount / Pro
Time discount amount. ductType.ListPrice
Total One-Time Net Price Calculates total One-Time extended Totals.NetPrice = Sum(Item.Extende
amount as a sum of all item extended dAmount)
amounts.
Total Product Discount Amount Calculates item total One-Time ex Totals.ProductDiscountAmount = To
tended amount from total net price. tals.ListPrice - Totals.NetPrice
Total Average Product Discount Percent Calculates item total One-Time dis Totals.AverageProductDiscountPercent
count percent from total product dis = 100 * Totals.ProductDiscountA
count amount. mount / Totals.ListPrice
Item One-Time Gross Margin Percent Calculates item One-Time gross margin Item.GrossMarginPercent = 100 *
percent from item One-Time extended (Item.ExtendedAmount - Item.Exten
amount and item One-Time extended dedCost) / Item.ExtendedAmount
cost.
Total Gross Margin Percent Calculates item total manufactures Totals.GrossMarginPercent = 100 * (To
gross margin from net price. tals.NetPrice - Totals.Cost) / Totals.Net
Price
Item One-Time Gross Margin Percent Calculates item One-Time gross margin Item.GrossMarginPercent = 100 *
(from Discount Percent) percent from item One-Time extended (Item.ExtendedAmount - Item.Exten
amount and item One-Time extended dedCost) / Item.ExtendedAmount
cost.
Item One-Time Discount Amount (from Calculates item One-Time discount item.DiscountAmount = item.ListPrice
Discount Percent) amount from item discount percent. * item.Quantity * item.DiscountPer
cent / 100
Item One-Time Net Price Calculates item One-Time net price item.NetPrice = item.ListPrice * (1 -
from item discount percent. item.DiscountPercent / 100)
Item One-Time Extended Amount Calculates item One-Time extended Item.ExtendedAmount = Item.NetPrice
amount from item net price and quan * Item.Quantity
tity.
Product Type One-Time Net Price Calculates One-Time net price as a sum NetPrice = Sum(Item.ExtendedA
of all item extended amounts. mount)
Product Type Discount Amount Calculates One-Time discount amount ProductType.DiscountAmount = Pro
from product type One-Time net price. ductType.ListPrice - ProductType.Net
Price
Product Type One-Time Discount Calculates product type One-Time dis ProductType.DiscountPercent = 100
Percent count percent from product type One- * ProductType.DiscountAmount / Pro
Time discount amount. ductType.ListPrice
Total One-Time Net Price Calculates total One-Time extended Totals.NetPrice = Sum(Item.Extende
amount as a sum of all item extended dAmount)
amounts.
Total Product Discount Amount Calculates item total One-Time ex Totals.ProductDiscountAmount = To
tended amount from total net price. tals.ListPrice - Totals.NetPrice
Total Average Product Discount Percent Calculates item total One-Time dis Totals.AverageProductDiscountPercent
count percent from total product dis = 100 * Totals.ProductDiscountA
count amount. mount / Totals.ListPrice
Total One-Time Gross Margin Percent Calculates total One-Time manufac Totals.NrcGrossMarginPercent = 100 *
tures gross margin from One-Time net (Totals.NrcNetPrice - Totals.NrcCost) /
price. Totals.NrcNetPrice
Item Recurring Discount Percent (from Calculates item Recurring discount per Item.MrcDiscountPercent = 100
Recurring Discount Amount) cent from item Recurring discount * Item.MrcDiscountAmount /
amount. Item.MrcListPrice
Item Recurring Net Price Calculates item Recurring net price Item.MrcNetPrice = Item.MrcListPrice -
from Recurring discount amount. Item.MrcDiscountAmount
Product Type Recurring Net Price Calculates Recurring extended amount ProductType.MrcNetPrice =
as a sum of all item Recurring extended Sum(Item.RecurringExtendedAmount)
amounts.
Product Type Recurring Discount Calculates product type Recurring dis ProductType.MrcDiscountPercent =
Percent count percent from product type Recur ProductType.MrcDiscountAmount /
ring discount amount. ProductType.MrcListPrice
Total Recurring Net Price Calculates item total Recurring ex Totals.MrcNetPrice = Sum(Item.Recur
tended amount as a sum of all item Re ringExtendedAmount)
curring extended amounts.
Total Recurring Product Discount Calculates item total Recurring ex Totals.MrcProductDiscountAmount =
Amount tended amount from total Recurring net Totals.MrcListPrice - Totals.MrcNet
price. Price
Total Average Recurring Product Calculates item total Recurring dis Totals.AverageMrcProductDiscountPer
Discount Percent count percent from Recurring product cent = 100 * Totals.MrcProductDis
discount amount. countAmount / Totals.MrcListPrice
Item Recurring Gross Margin Percent Calculates item Recurring gross margin Item.MrcGrossMarginPercent = 100
percent from item Recurring extended * (Item.MrcExtendedAmount -
amount and item Recurring extended Item.MrcExtendedCost) / MrcExtende
cost. dAmount
Total Recurring Gross Margin Percent Calculates total Recurring manufac Totals.MrcGrossMarginPercent = 100 *
tures gross margin from Recurring net (Totals.MrcNetPrice - Totals.MrcCost) /
price. Totals.MrcNetPrice
Item Recurring Discount Amount (from Calculates item Recurring discount Item.DiscountAmount = Item.ListPrice
Recurring discount percent) amount from Recurring discount per * Item.Quantity * Item.DiscountPer
cent. Recurring discount amount also cent / 100
includes item quantity.
Item Recurring Net Price Calculates item Recurring net price Item.MrcNetPrice = Item.MrcListPrice -
from Recurring discount amount. Item.MrcDiscountAmount
Product Type Recurring Net Price Calculates Recurring extended amount ProductType.MrcNetPrice =
as a sum of all item Recurring extended Sum(Item.RecurringExtendedAmount)
amounts.
Product Type Recurring Discount Calculates product type Recurring dis ProductType.MrcDiscountPercent =
Percent count percent from product type Recur ProductType.MrcDiscountAmount /
ring discount amount. ProductType.MrcListPrice
Total Recurring Net Price Calculates item total Recurring ex Totals.MrcNetPrice = Sum(Item.Recur
tended amount as a sum of all item Re ringExtendedAmount)
curring extended amounts.
Total Recurring Product Discount Calculates item total Recurring ex Totals.MrcProductDiscountAmount =
Amount tended amount from total Recurring net Totals.MrcListPrice - Totals.MrcNet
price. Price
Total Average Recurring Product Calculates item total Recurring dis Totals.AverageMrcProductDiscountPer
Discount Percent count percent from Recurring product cent = 100 * Totals.MrcProductDis
discount amount. countAmount / Totals.MrcListPrice
Item Recurring Gross Margin Percent Calculates item Recurring gross margin Item.MrcGrossMarginPercent = 100
percent from item Recurring extended * (Item.MrcExtendedAmount -
amount and item Recurring extended Item.MrcExtendedCost) / MrcExtende
cost. dAmount
Total Recurring Gross Margin Percent Calculates total Recurring manufac Totals.MrcGrossMarginPercent = 100 *
tures gross margin from Recurring net (Totals.MrcNetPrice - Totals.MrcCost) /
price. Totals.MrcNetPrice
Item Recurring Discount Amount (from Calculates item Recurring discount Item.MrcDiscountAmount =
Recurring extended amount) amount from Recurring extended Item.MrcListPrice - Item.MrcExtende
amount. dAmount / Item.Quantity
Item Recurring Discount Percent (from Calculates item Recurring discount per Item.MrcDiscountPercent = 100
Recurring Discount Amount) cent from item Recurring discount * Item.MrcDiscountAmount /
amount. Item.MrcListPrice
Item Recurring Net Price Calculates item Recurring net price Item.MrcNetPrice = Item.MrcListPrice -
from Recurring discount amount. Item.MrcDiscountAmount
Product Type Recurring Net Price Calculates Recurring extended amount ProductType.MrcNetPrice =
as a sum of all item Recurring extended Sum(Item.RecurringExtendedAmount)
amounts.
Product Type Recurring Discount Calculates product type Recurring dis ProductType.MrcDiscountPercent =
Percent count percent from product type Recur ProductType.MrcDiscountAmount /
ring discount amount. ProductType.MrcListPrice
Total Recurring Net Price Calculates item total Recurring ex Totals.MrcNetPrice = Sum(Item.Recur
tended amount as a sum of all item Re ringExtendedAmount)
curring extended amounts.
Total Recurring Product Discount Calculates item total Recurring ex Totals.MrcProductDiscountAmount =
Amount tended amount from total Recurring net Totals.MrcListPrice - Totals.MrcNet
price. Price
Total Average Recurring Product Calculates item total Recurring dis Totals.AverageMrcProductDiscountPer
Discount Percent count percent from Recurring product cent = 100 * Totals.MrcProductDis
discount amount. countAmount / Totals.MrcListPrice
Item Recurring Gross Margin Percent Calculates item Recurring gross margin Item.MrcGrossMarginPercent = 100
percent from item Recurring extended * (Item.MrcExtendedAmount -
amount and item Recurring extended Item.MrcExtendedCost) / MrcExtende
cost. dAmount
Total Recurring Gross Margin Percent Calculates total Recurring manufac Totals.MrcGrossMarginPercent = 100 *
tures gross margin from Recurring net (Totals.MrcNetPrice - Totals.MrcCost) /
price. Totals.MrcNetPrice
Item Recurring Gross Margin Percent Calculates item Recurring gross margin Item.GrossMarginPercent = 100 *
(from Recurring Discount Percent) percent from item Recurring extended (Item.ExtendedAmount - Item.Exten
amount and item Recurring extended dedCost) / Item.ExtendedAmount
cost.
Item Recurring Discount Amount (from Calculates item Recurring discount item.DiscountAmount = item.ListPrice
Recurring Discount Percent) amount from item Recurring discount * item.Quantity * item.DiscountPer
percent. cent / 100
Item Recurring Net Price Calculates item Recurring net price Item.MrcNetPrice = Item.MrcListPrice -
from Recurring discount amount. Item.MrcDiscountAmount
Product Type Recurring Net Price Calculates Recurring extended amount ProductType.MrcNetPrice =
as a sum of all item Recurring extended Sum(Item.RecurringExtendedAmount)
amounts.
Product Type Recurring Discount Calculates product type Recurring dis ProductType.MrcDiscountPercent =
Percent count percent from product type Recur ProductType.MrcDiscountAmount /
ring discount amount. ProductType.MrcListPrice
Total Recurring Net Price Calculates total Recurring manufac Totals.MrcNetPrice = Sum(Item.Recur
tures gross margin from Recurring net ringExtendedAmount)
price.
Total Recurring Product Discount Calculates item total Recurring ex Totals.MrcProductDiscountAmount =
Amount tended amount from total Recurring net Totals.MrcListPrice - Totals.MrcNet
price. Price
Total Average Recurring Product Calculates item total Recurring dis Totals.AverageMrcProductDiscountPer
Discount Percent count percent from Recurring product cent = 100 * Totals.MrcProductDis
discount amount. countAmount / Totals.MrcListPrice
Total Recurring Gross Margin Percent Calculates total Recurring manufac Totals.MrcGrossMarginPercent = 100 *
tures gross margin from Recurring net (Totals.MrcNetPrice - Totals.MrcCost) /
price. Totals.MrcNetPrice
Item Recurring Discount Amount (from Calculates item Recurring discount per Item.MrcDiscountAmount =
Recurring net price) cent from item Recurring net price. Item.MrcListPrice - Item.MrcNetPrice
Item Recurring Discount Percent (from Calculates item Recurring discount per Item.MrcDiscountPercent = 100
Recurring Discount Amount) cent from item Recurring discount * Item.MrcDiscountAmount /
amount. Item.MrcListPrice
Product Type Recurring Net Price Calculates Recurring extended amount ProductType.MrcNetPrice =
as a sum of all item Recurring extended Sum(Item.RecurringExtendedAmount)
amounts.
Product Type Recurring Discount Calculates product type Recurring dis ProductType.MrcDiscountPercent =
Percent count percent from product type Recur ProductType.MrcDiscountAmount /
ring discount amount. ProductType.MrcListPrice
Total Recurring Net Price Calculates item total Recurring ex Totals.MrcNetPrice = Sum(Item.Recur
tended amount as a sum of all item Re ringExtendedAmount)
curring extended amounts.
Total Recurring Product Discount Calculates item total Recurring ex Totals.MrcProductDiscountAmount =
Amount tended amount from total Recurring net Totals.MrcListPrice - Totals.MrcNet
price. Price
Total Average Recurring Product Calculates item total Recurring dis Totals.AverageMrcProductDiscountPer
Discount Percent count percent from Recurring product cent = 100 * Totals.MrcProductDis
discount amount. countAmount / Totals.MrcListPrice
Item Recurring Gross Margin Percent Calculates item Recurring gross margin Item.MrcGrossMarginPercent = 100
percent from item Recurring extended * (Item.MrcExtendedAmount -
amount and item Recurring extended Item.MrcExtendedCost) / MrcExtende
cost. dAmount
Total Recurring Gross Margin Percent Calculates total Recurring manufac Totals.MrcGrossMarginPercent = 100 *
tures gross margin from Recurring net (Totals.MrcNetPrice - Totals.MrcCost) /
price. Totals.MrcNetPrice
Item One-Time Discount Amount (from Calculates item One-Time discount Item.DiscountAmount = Item.ListPrice
One-Time net price) amount from item net price. - Item.NetPrice
Item One-Time Discount Percent (from Calculates item One-Time discount Item.DiscountPercent = 100 * Item.Dis
Discount Amount) percent from item discount amount. countAmount / Item.ListPrice
Item One-Time Extended Amount Calculates item One-Time extended Item.ExtendedAmount = Item.NetPrice
amount from item net price and quan * Item.Quantity
tity.
Product Type One-Time Net Price Calculates One-Time net price as a sum NetPrice = Sum(Item.ExtendedA
of all item extended amounts. mount)
Product Type Discount Amount Calculates One-Time discount amount ProductType.DiscountAmount = Pro
from product type One-Time net price. ductType.ListPrice - ProductType.Net
Price
Product Type One-Time Discount Calculates product type One-Time dis ProductType.DiscountPercent = 100
Percent count percent from product type One- * ProductType.DiscountAmount / Pro
Time discount amount. ductType.ListPrice
Total One-Time Net Price Calculates total One-Time extended Totals.NetPrice = Sum(Item.Extende
amount as a sum of all item extended dAmount)
amounts.
Total Product Discount Amount Calculates item total One-Time ex Totals.ProductDiscountAmount = To
tended amount from total net price. tals.ListPrice - Totals.NetPrice
Total Average Product Discount Percent Calculates item total One-Time dis Totals.AverageProductDiscountPercent
count percent from total product dis = 100 * Totals.ProductDiscountA
count amount. mount / Totals.ListPrice
Item Gross Margin Percent Calculates item gross margin percent Item.GrossMarginPercent = 100 *
from item extended amount and item (Item.ExtendedAmount - Item.Exten
extended cost. dedCost) / Item.ExtendedAmount
Total Average Gross Margin Percent Calculates total average gross margin Totals.GrossMarginPercent = 100 * (To
percent from total net price and total tals.NetPrice - Totals.Cost) / Totals.Net
cost. Price
Item One-Time Extended List Price Calculates item One-Time extended list Item.ExtendedListPrice = Item.ListPrice
price from item One-Time list price and * Item.Quantity
quantity.
Item One-Time Extended Amount Calculates item One-Time extended Item.ExtendedAmount = Item.NetPrice
amount from item net price and quan * Item.Quantity
tity.
Item One-Time Extended Cost Calculates item One-Time extended Item.ExtendedCost = item.Cost *
cost from item One-Time cost and item.Quantity
quantity.
Item One-Time Discount Amount (from Calculates item One-Time discount Item.DiscountAmount = Item.ListPrice
One-Time discount percent) amount from One-Time discount per * Item.Quantity * Item.DiscountPer
cent. One-Time discount amount also cent / 100
includes item quantity.
Product Type One-Time Net Price Calculates One-Time net price as a sum NetPrice = Sum(Item.ExtendedA
of all item extended amounts. mount)
Product Type List Price Calculates One-Time extended list price ListPrice = Sum(Item.ExtendedList
as a sum of all item extended list prices. Price)
Product Type Discount Amount Calculates One-Time discount amount ProductType.DiscountAmount = Pro
from product type One-Time net price. ductType.ListPrice - ProductType.Net
Price
Product Type One-Time Discount Calculates product type One-Time dis ProductType.DiscountPercent = 100
Percent count percent from product type One- * ProductType.DiscountAmount / Pro
Time discount amount. ductType.ListPrice
Product Type One-Time Cost Calculates One-Time extended cost as Cost = Sum(Item.ExtendedCost)
a sum of all item One-Time extended
costs.
Product Type Product Model Price Calculates product model price by mul ProductType.ProductModelPrice =
tiplying quantity by product model Sum(Item.Quantity * Item.ProductMo
price. delPrice)
Total One-Time List Price Calculates total One-Time extended list Totals.ListPrice = Sum(Item.Extended
price as a sum of all item extended list ListPrice)
prices.
Total One-Time Net Price Calculates total One-Time extended Totals.NetPrice = Sum(Item.Extende
amount as a sum of all item extended dAmount)
amounts.
Item Recurring Extended List Price Calculates item Recurring extended list Item.MrcExtendedListPrice =
price from item Recurring list price and Item.MrcListPrice * Item.Quantity
quantity.
Item Recurring Discount Percent (from Calculates item Recurring discount per Item.MrcDiscountPercent = 100 -
Recurring Extended Amount) cent from item Recurring extended 100 * Item.MrcExtendedAmount /
amount. Item.MrcListPrice * Item.Quantity
Item Recurring Extended Cost Calculates item Recurring extended Item.MrcExtendedCost = Item.MrcCost
cost from item Recurring cost and * Item.Quantity
quantity.
Product Type Recurring Net Price Calculates Recurring extended amount ProductType.MrcNetPrice =
as a sum of all item Recurring extended Sum(Item.RecurringExtendedAmount)
amounts.
Product Type Recurring List Price Calculates product type Recurring list ProductType.MrcListPrice =
price as a sum of all item Recurring ex Sum(Item.RecurringExtendedListPrice)
tended list prices.
Product Type Recurring Discount Calculates product type Recurring dis ProductType.MrcDiscountPercent =
Percent count percent from product type Recur ProductType.MrcDiscountAmount /
ring discount amount. ProductType.MrcListPrice
Product Type Recurring Cost Calculates Recurring extended cost as ProductType.MrcCost = Sum(Item.Re
a sum of all item Recurring extended curringExtendedCost)
costs.
Total Recurring List Price Calculates item total Recurring ex Totals.MrcListPrice = Sum(Item.Recur
tended list price as a sum of all item ringExtendedListPrice)
Recurring extended list prices.
Total Recurring Net Price Calculates item total Recurring ex Totals.MrcNetPrice = Sum(Item.Recur
tended amount as a sum of all item Re ringExtendedAmount)
curring extended amounts.
Total Product Discount Amount Calculates item total One-Time ex Totals.ProductDiscountAmount = To
tended amount from total net price. tals.ListPrice - Totals.NetPrice
Total Average Product Discount Percent Calculates item total One-Time dis Totals.AverageProductDiscountPercent
count percent from total product dis = 100 * Totals.ProductDiscountA
count amount. mount / Totals.ListPrice
Total Recurring Product Discount Calculates item total Recurring ex Totals.MrcProductDiscountAmount =
Amount tended amount from total Recurring net Totals.MrcListPrice - Totals.MrcNet
price. Price
Total Average Recurring Product Calculates item total Recurring dis Totals.AverageMrcProductDiscountPer
Discount Percent count percent from Recurring product cent = 100 * Totals.MrcProductDis
discount amount. countAmount / Totals.MrcListPrice
Item Recurring Gross Margin Percent Calculates item Recurring gross margin Item.MrcGrossMarginPercent = 100
percent from item Recurring extended * (Item.MrcExtendedAmount -
amount and item Recurring extended Item.MrcExtendedCost) / MrcExtende
cost. dAmount
Item One-Time Gross Margin Percent Calculates item One-Time gross margin Item.GrossMarginPercent = 100 *
percent from item One-Time extended (Item.ExtendedAmount - Item.Exten
amount and item One-Time extended dedCost) / Item.ExtendedAmount
cost.
Total Average Gross Margin Percent Calculates total average gross margin Totals.GrossMarginPercent = 100 * (To
percent from total net price and total tals.NetPrice - Totals.Cost) / Totals.Net
cost. Price
Total Average Recurring Gross Margin Calculates total Recurring manufac Totals.MrcGrossMarginPercent = 100 *
Percent tures gross margin from Recurring net (Totals.MrcNetPrice - Totals.MrcCost) /
price. Totals.MrcNetPrice
Rolled up Calculations
The following settings must be performed in the Setup so that the rolled up columns display on quotes for a
user type:
• to have the permission to manage rolled up columns enabled in Quotes Quote Layout Permissions .
Rolled up columns should be moved from available to selected in the Visible Columns section.
• to move the rolled up columns from available to selected in UI Design Quote Layout.
• to have all the columns in one list, either in the list of available or the list of selected columns.
To calculate a rolled up amount of a quote field, add the respective rolled up calculation to the end of the list of
calculations that are executed when the value of that field is changed. The rolled up calculations should also be
added in the list of calculations in Item Add/Update Calculations that are triggered when an item is added to a
quote.
Reverse rolled up calculations are available only in Quote 2.0. This calculation type lets you change the rolled up
amount so that the system would calculate the respective amount for each item.
For example, if you change the rolled up extended amount of a main item, the system will calculate the rolled up
amount of each item and consequently the extended amount of each item.
When a rolled up amount is changed, the discount percent will first change accordingly. From there on, other
calculations will be executed to calculate the amount of each item. In the calculation setup, only the discount
percent calculations are set up by default. Administrators should add subsequent calculations based on their
model of SAP CPQ.
Note
You can set up the calculation order for rolled up fields only for main items. Therefore, line item rolled up
fields should not be editable on quotes.
Reverse calculations in Quote 2.0 let you change the amount in Product Types and Total fields so that the value
in the respective item fields changes accordingly (the discount percent is first changed and then other fields
set up for the calculation).
When integration with SAP Subscription Billing is enabled, the SubscriptionItem section displays in Fields and
Calculations. This section contains only standard quote fields available on quotes when the two applications
are integrated. SAP Subscription Billing products don’t support quote item custom fields.
Quotes with SAP Subscription Billing products contain standard quote fields and the standard fields available
only for SAP Subscription Billing products. Calculations for the SAP Subscription Billing integration should be
managed and set up in the same way as other calculations in Quote Fields and Calculations [page 284].
Note
Discount fields on rate plan charges are only editable on the quote if they are defined as parameters in the
rate plan template.
Contract End Date Subscription Billing - Calcu Calculates end dates from Contract End Date = Start
late End Dates from Start the start date and the con Date + Contract Length
Date and Months tract duration. This calcula (months)
tion is by default present
on the fields Start Date,
Item Effective Date, Contract
Length, and Minimum Term.
One-Time Charge Discount Subscription Billing - Calcu Calculates item One-Time ItemOne-TimeNetPrice
late Item One-Time Net Price net price from one-time = SUM(OneTimeChargeList
from One-Time Charge charge. Price - OneTimeChargeList
Price* OneTimeChargeDis
countPercent/100)
Recurring Charge Discount Subscription Billing - Calcu Calculates item Recurring ItemRecurringNetPrice
late Item Recurring Net Price net price from recurring = SUM(RecurringChargeList
from Recurring Charge charge. Price - RecurringChar
geListPrice*RecurringChar
geDiscountPercent/100)
One-Time Discount Percent Subscription Billing - Calcu Calculates one-time charge affectedChargesTotalList-
and any fields affecting the late One-Time Charge from from item One-Time discount
Price = SUM(OneTimeChar
discount percent via calcula Item One-Time Discount Per percent.
geWithDiscountListPrice) -
tions cent
sum of one-time charge
list prices that could be
discounted. If affectedChar-
gesTotalListPrice is equal
to zero, an error message
displays, stating that all
one-time charges have fixed
prices and couldn’t be dis
counted.
averageChargeDiscount =
item.ListPrice * item.Dis
countPercent / affected-
ChargesTotalListPrice - Apply
averageChargeDiscount to all
one-time charges that can be
discounted.
Recurring Discount Percent Subscription Billing - Calcu Calculates recurring charge affectedChargesTotalMr-
late Recurring Charge from from item Recurring discount
cListPrice
Item Recurring Discount Per percent.
= SUM(RecurringCharge
cent
WithDiscountListPrice) - sum
of recurring charge list
prices that could be dis
counted. If affectedCharges-
TotalMrcListPrice is equal
to zero, an error message
displays, stating that all
recurring charges have fixed
prices and couldn’t be
discounted.
averageChargeDiscount
= item.MrcListPrice
* item.MrcDiscountPer
cent / affectedChargesTo-
talMrcListPrice - Apply aver
ageChargeDiscount to all re
curring charges that can be
discounted.
In Quote Fields and Calculations, calculations for those SubscriptionItem fields that contain them should be set
in the following order:
Start Date Subscription Billing - Calculate end date from start date and
months
Item Effective Date Subscription Billing - Calculate end date from start date and
months
Contract Length Subscription Billing - Calculate end date from start date and
months
Minimum Term Subscription Billing - Calculate end date from start date and
months
One-Time Charge Discount Subscription Billing - Calculate item One-Time net price
from one-time charge
Total Amount
Recurring Charge Discount Subscription Billing - Calculate item Recurring net price from
recurring charge
Related Information
The Solution Design feature enables users to organize items into sections and subsections in a separate tab on
quotes.
The Solution Design tab is just another view of the items that are already in the quote (if there are same items
in the new tab and the Quotation tab, they aren’t treated as duplicates but as the same and all changes made
on an item in either one of the tabs are applied to the same item in the another tab).
Also, the calculations are upgraded to cover sections as well - currently, section calculations are available only
for quote item custom fields.
John is a sales lead in a furniture manufacturing company. The company applied to a call for tender for
furnishing a new business complex in Stockholm. The tender proposal contains more than 1000 items (chairs,
desks, coat hangers, and so on) that are distributed into 3 buildings, each with 11 floors and dozens of offices.
The tender documentation contains a tender proposal form in Excel with sections for each building and
subsections for floors and offices, respectively.
John uploads the Excel form in the Solution Design tab in SAP CPQ and the system creates sections in the
hierarchy indicated in the file. Afterwards, John indicates which sections and subsections can contain products
and inserts items either directly within the sections or from the quote.
Once the solution has been completed, John downloads it in an Excel file and submit it for the tender call
respecting the required form.
To enable users to create sections, you must first create a dedicated tab on quotes. Go to Setup General
Application Parameters Shopping Cart and Quotes and set the parameter Enable Solution Design to TRUE.
A new tab, Solution Design, is automatically displayed on quotes. Alternatively, you can create the tab manually,
using the implementation file (this file isn’t available by default. Contact the SAP CPQ Support team to enable
this for your tenant.)
You can create sections either in Excel or using the in-built tool Section Builder. For both workflows, you need to
have the Quote 2.0 engine enabled on your tenant and have the Solution Design tab created.
The ability to import sections through Excel allows users to handle multiple sections easily, with minimal
manual effort. This feature can be useful for handling tender documentation, when there’s a predefined set of
sections in an Excel file that you aren’t allowed to change. In that case, you can upload the Excel with sections,
populate them with products, handle the calculation and consequently download the Excel with values for each
section.
Procedure
The file name contains the quote number. All cells are formatted as Text and the local formatting of Excel
files isn’t automatically applied.
2. Populate the file with this data:
• Hierarchy - the ordered number of sections and subsections
• Section Name - names of sections and subsections
• Can contain products (Yes/No) - populate with either 1, Yes or True each section to which you wish to
add products.
If there are quote item custom fields for which users have the editing rights, they also have a dedicated
column in the Excel and you can populate them with values.
• Can be distributed (Yes/No) - populate with either 1, Yes or True each section that you wish to
distribute.
• Solution Team - populate with the name of the team to which the section should be assigned. If the
team doesn't already exist in the system, it’s created automatically [page 327]. You can add multiple
teams if they’re separated by a comma. Also, each team must have a unique name.
Tip
The first row in the Excel template is hidden and you shouldn't remove or change it in any way. The
row contains original names of quote item custom fields and the system updates those fields based
on their original names. Since quote item custom field names are unique in the system and their
translated names aren’t, if there are multiple fields with the same translated value, the correct field is
updated.
Sections and subsections are created following the hierarchy in the template.
The Section Builder is an SAP CPQ tool for manually creating sections.
Procedure
To edit the existing sections and add new ones, click above the sections grid. To download sections in an
Excel file, click . The downloaded file contains the sections’ hierarchy, sections’ names and the quote item
custom columns.
The button allows users to update a single quote item custom field throughout multiple sections at once. The
update can be applied to all field types, but only one field can be updated at a time. After a field value is
updated, all calculations defined for that field are triggered as when changing the value manually.
Note
The button for bulk update is enabled when there is at least one editable column in sections and after a
user has selected the sections in which the field is updated.
Filter Sections
Sections can be filtered by name (only the exact match returns results) and by the value of quote item custom
fields that administrators have marked for filtering (Use column value to filter quote items is selected on the
field in Setup). Also, users have the following options for filtering sections:
• Show only my sections - displays only the sections assigned to the team the user belongs to.
• Show Sections
The logic between filter options is AND. After a filter is applied, only the sections that match the entered criteria
and their pertaining products are displayed. The applied filter is saved locally in the browser for a user and
quote. If that user opens the quote in another browser or reassigns the quote, the filter won’t be applied. Also,
different users on the same quote can apply different filters. The applied filters display in pills above sections
in the Solution Design tab and users can easily remove them, which refreshes the display of sections. Excel
download is available while filters are applied and, in that case, only the filtered sections are downloaded.
Standard quote fields aren’t displayed in the Solution Design tab, but administrators can add quote item
custom fields and manage calculations for them. The prerequisite is to make the field visible on quotes in
Layout Permissions [page 282].
Reverse calculations aren’t enabled for sections. Consequently, a quote item custom field in a section can
either be made editable or you can select an aggregate type for it.
The following procedure describes how to add a section calculation to the list of calculations that are triggered
every time an item is added and updated in the quote.
The following example shows you how to create a custom calculation that calculates a discounted value of a
quote item custom field in a section.
x = context.AffectedSection
x[“Discount_Value”] = x[“Sum”] * x[“Discount_Percent”] / 100;
3. Save the changes and open the Solution Design tab in a quote.
The Sum column is populated with values for each item and a summed up value displays in the section
field. If you change the percent in the Discount_Percent field, and refresh the section, the Discount_Value
field is populated with the new discounted values.
Related Information
You can either add products to sections from the Solution Design tab or allocate items from the Quotation tab.
Next to each item on quotes, there’s the icon for allocating items. After clicking on the icon, you can find the
section to which you want to allocate the item. Once an item is allocated, the icon is grayed out, but you can
always click on it again and change the section.
Products in sections have the icon displayed next to them. Clicking the icon opens a dropdown list with
actions that users can perform on a product:
• make a copy of the product in the same section and also on the quote
• delete the product from the section and from the quote
• edit the product so that the changes are applied in both the section and on the quote - if you’re editing
line items, they are automatically removed from the section. You need to go back to the quote and allocate
them to the section again.
• refresh the product so that all settings from the quote are applied on that product in the section -
recommended when handling calculations in the Quotation tab.
• move the product to a different section
• remove the product from the section
A quote section can be distributed into other sections in the Solution Design tab.
When the distribution is initiated, a new distributed section is created in each section to which the source is
being distributed. The value of the distributed section is split between the target sections as indicated in the
distribution method [page 322].
To be able to distribute a section to other sections, you first need to enable the distribution for it either in the
Section Builder or the excel file when creating/editing a section [page 315]. Consequently, the button
displays in the Solution Design tab, next to the section that can be distributed.
A distribution method defines how the values from the source section are distributed to target sections.
You can either create a custom calculation in Setup Quotes Fields, Calculations, Layout Distribution
Calculations or manually enter the percentages. There’s also the Split Evenly action that distributes the
section evenly to the target sections. When applying a custom distribution method, every time you make a
change (for example, change the price of an item), you should click and the values are redistributed
according to the distribution method. The Redistribute action is above the section grid, next to other section
actions. The action is available only when there are sections selected for distribution in the Can be distributed
column and there is a custom distribution method applied.
The following calculation method is selected for distributing a section when users want to keep the same ratio
in the sections that are distributed as between target sections.
itemsToBeDistributed = context.Quote.GetSectionItems(context.Source)
sumOfItems = 0
for item in itemsToBeDistributed:
sumOfItems += item["Wholesale_Price"]
targetSum = 0
for target in context.Targets:
targetSum += context.Quote.GetParentSection(target)["Wholesale_Price"]
for target in context.Targets:
target.DistributionPercent = context.Quote.GetParentSection(target)
["Wholesale_Price"] / targetSum *100
for target in context.Targets:
for section in context.Quote.GetSectionAndHisAncestors(target.SectionPath):
section["Wholesale_Price"] += sumOfItems * target.DistributionPercent /
100
context.Source["Wholesale_Price"]-=target["Wholesale_Price"]
Before Distribution
Prerequisites
To have a distribution method created in Setup Quotes Fields, Calculations, Layout Quote Fields and
Calculations .
Context
Only a section that has a calculation of the aggregate type Sum can be distributed. Sections with other
aggregates types can’t be distributed. The Retract action removes the distributed sections from the target
sections.
• Select section to distribute - the field is grayed out and it displays the name of the field that is being
distributed. If multiple sections are selected, you should select in this field one section at a time and
manage other fields in the pop-up.
• Distribution Method - list of custom distribution calculations. Additionally, the Manual method is the
default value. If this method is selected, you’ll be able to set up the percentages according to which the
value of the source section is distributed to target sections.
2. Click next to Distribute to.
3. Click the empty field and the available target sections are displayed (all the sections that aren’t enabled for
distribution).
4. Select one section.
5. Repeat the previous steps to add other target sections.
6. Click Split Evenly.
New subsections are added to target sections, one level below the target sections.
The value of the source section is evenly split between the target sections.
You can change the percentage manually and remove the target section by clicking .
The sections grid in Solution Design contains a row for displaying the total value of each quote item custom
field whose type is currency and number. The row is added automatically to the grid, after you create at least
one section.
You can select one of the predefined calculations or create a custom calculation for calculating the section
totals.
If you need a calculation more complex than the standard calculations Sum and Average, you can write a script
for calculating the section totals in Custom Total Calculation under Section Fields.
Note
There can only be one script that calculates custom total calculations for all fields (you can’t create a
separate script for each field).
Custom calculations are triggered after standard section total calculations, so if you write a new calculation
formula for a field for which you’ve already selected a standard calculation (SUM or AVERAGE), the custom
calculation will override it.
In the History tab in Custom Total Calculation, you can view all the versions of scripts created up to that
moment. If needed, you can also compare the scripts.
Tip
The methods available for managing section totals via scripting are described in the Scripting Help.
Grouping users into teams enables parallel work on one quote and allows quote owners to assign quote
sections to different teams.
Quote owners create administrator teams that manage sections and assign users to solution teams. Each
solution team has access only to the sections assigned to it. Consequently, multiple teams can work on the
same quote and on different sections at the same time, without altering each other's work.
• Quote Owner - the default user with maximum rights. Only quote owners can create administrator teams
and they can also create solution teams.
• Administrator Team - unlike the solution team users, administrator team users can create, edit, and delete
sections. Administrator teams create solution teams, add users to teams, and assign teams to sections.
There can only be one administrator team per quote.
• Solution Team - a group of users that can be assigned to a section. Only members of a team assigned to
a section have access rights to it. Users in the team assigned to a parent section don’t have access to its
subsections. The users in this team can’t add any new teams, nor can they edit the existing ones. They can
only view the grid with the existing teams.
Here are some facts and limitations that you should keep in mind when assigning sections:
Teams that are created through the Excel template for creating sections [page 316] are without members, and
the assigned user shoud add other members to the team following the procedure below.
By default, the tab contains a grid with the quote owner's name and the role. The following procedure describes
the steps for creating an administrator team, but they apply to creating a solution team as well.
1. Click Add.
The Add Team modal displays.
Party Role is automatically populated with Administrator Team.
2. Define the name of the team.
3. Find users for the team in the Team Users search field.
Enter the name or the email of the user and the system offers matching results.
You can add both users from the same company as yours or from a different company to the team.
However, inactive and blocked users aren’t available to be added to a team.
Note
If a user is a member of a team on a quote, that quote displays in the My Quotes tab.
Quote Filtering allows users to filter out quote items by specific values in quote item custom fields and in some
standard SAP CPQ fields (Part Number, Product Type and Product Name). Filtering is available only in Quote
2.0.
After you allow filtering for a quote item custom field and users select or enter a value in that field on the quote,
the system can filter out only the items that have a specific value in the quote item custom field. To enable this,
users need to enter the field value as a filter criterion in Filter Items.
Note
You can search for quotes using multiple statuses in the filter.
Setup
To enable filtering per quote item custom fields, you need to make the following adjustments in the Setup:
• Create a quote item custom field [page 391] and select Use column value to filter quote items. Filtering is
supported for all field types.
• Select the quote item custom field in Quote Layout [page 394].
• Make the quote item custom field visible to users in Quote Layout Permissions [page 394].
User Side
The Filter Items button opens the Filters pop-up with the filtering criteria. All quote item custom fields that are
enabled for filtering are displayed in the pop-up. Depending on the type of the quote item custom field, users
can enter, pick a value, or set a range of minimum and maximum values. The logic between multiple filters is
AND.
Users should follow the search logic described below when entering search criteria in standard SAP CPQ fields:
• Part Number - enter the exact value or use % to expand the search (for example, AB23% filters all quote
items whose part number starts with AB23).
A filter remains applied on a quote as long as it’s opened in the same browser. The first time the user opens it in
a different browser, the filter is refreshed. The filter is visible on the quote only to the user who applied it.
If a filter is applied, the filtering criteria is visible above the list of items and the total number of filtered items is
displayed on the right.
If users manage sections in the Solution Design tab, they’ll have the following two checkboxes available:
• Show Only Unallocated Products - filters only the items that aren’t allocated to any sections.
• Show only products assigned to my sections - filters the items that are allocated to the section to which the
user has rights.
Additional Restrictions
• Even if you enable filtering for a quote item custom field, if the field isn’t visible for a user, they can’t apply
the field’s values as filters on the quote.
• When a quote with applied filter is copied and a new revision is created, the filter isn’t applied.
• Filters are available on quotes in the view mode, when the user has no rights to perform any actions on the
quote.
The Quote 2.0 scripting is event-based which adds to the performance of the system when working with
complex scripts.
After triggering an action in Quote 2.0, the system triggers an event that retrieves only the context of
avilable objects that are relevant for that specific action. Every event has the quote object in context
(context.Quote). Other available objects depend on the event that was raised. Consequently, you can handle
only the part of the quote that is available in the context of that event. This boosts the performance of the
entire system when executing complex scripts.
The scripting for Quote 2.0 is different from the scripting for Quote 1.0, primarily because it's event-based and
the logic is different. Consequently, if you wish to migrate from the old quote engine to the new one, you’ll have
to adjust your scripts because most of them won't fit to Quote 2.0 logic.
Note
Methods and properties for Quote 2.0 are listed under Scripting.Quote in the scripting documentation.
The global scripting scope is created for Quote 2.0 with these variables:
• User
• WebServiceHelper
• Session
• FederationUtility
• ScriptExecutor
• LogTrace
• SqlHelper
• XmlHelper
• RestClient
• UserPersonalizationHelper
• FileHelper
• Translation
• Assert
This scope is independent from Quote 1.0. Global scope is accessible without a prefix. For example,
User.FirstName / Trace.Write('test').
Event scopes should have a context prefix and contain variables that are specific for appropriate scopes. For
example, context.Quote.DateModified
Quote variable is removed from configurator events (you can’t call quote context from the configurator). To
read quote data from the configurator, you should use CTX tags. Additionally, you can’t write data in the quote
from the configurator. You can retrieve the quote comment via context.Quote.Comment, but you can’t insert
the comment using context.Quote.Comment = ‘Test Comment’.
Note
context.AffectedItems fetches all items that the user changed on quote. For example, if the user
changes the discount for three out of 10 items on the quote, context.AffectedItems fetches those
three items.
Unsupported Variables
The following variables aren’t currently supported for the Quote 2.0 scripting:
Scope Variables
Global TagParserProduct
TagParserQuote
CRM MSCrmServiceContext
MSCrmService
MSCRMOpportunityId
MSCRMUserId
SalesforceProxy
SFEnvironment
NsEnvironment
Some variables that were in the global scope in Quote 1.0 are moved to event-specific scopes in Quote 2.0:
• Quote
• Product
• CustomerHelp
• SAP
• TechnicalDocumentation
You should avoid fetching any Quote 2.0 data directly from the database since the quote object may have
different states while processing the user action. For example, fetching the number of items in the quote while
adding a single item to the quote:
clr.AddReference('System.Core')
import System
clr.ImportExtensions(System.Linq)
result = SqlHelper.GetFirst ('select count(*) as Count from sys_QuoteItem where
QuoteId = {}'.format(context.Quote.Id))
Trace.Write(result.Count) # 0 since quote has not been saved yet
Trace.Write(context.Quote.GetAllItems().Count) # 1 since there is one item in
memory that will be saved at the end of the processing pipeline.
Scripting Examples
In Quote Fields and Calculations you can create basic scripts that are triggered either after a value in a quote
field is changed, after an item is added to a quote or when an item is updated.
• The following custom calculation sets the default discount to 10% when items are added/updated:
• This script updates the quantity of the maintenance item so it matches the total number of items in the
quote. This calculation should be triggered before extended list price is calculated.
maintenance = context.Quote.GetItemByItemNumber(1)
for item in context.AffectedItems:
maintenance.Quantity += 1
#add maintenance item to affected items so that the rest of the
calculations run for this item as well
If you want to default the item discount based on the DiscountLevel attribute value in Quote 1.0, you should
write:
sender.DiscountPercent = GetDiscountForLevel(Product.AttrVal('DiscountLevel'))
Business partners of an organization are all the entities that have business relations with that organization.
The following sections explain business partners, partner functions and involved parties in more detail. The
sections also contain how-to instructions for creating these entities and provide all the relevant details for using
involved parties on quotes.
Create Business Partner in External Systems and Import into SAP CPQ [page 341]
Business partners can be created in external systems and imported into SAP CPQ. In such a case, the
external system is the master for business partners.
Create Partner Functions in External Systems and Import into SAP CPQ [page 343]
Partner functions can be created in external systems and imported into SAP CPQ. In such a case, the
external system is the master for partner functions.
The Business Partners is the default functionality for managing customers and other involved parties in quotes
in the Quote 2.0 engine.
Business partners of an organization are all the entities that have business relationships with that organization.
A business partner can be an organization, a person, a group of organizations, a group of persons, and so on.
Typically, the business partners of an organization or company are customers, vendors, employees, contact
persons, organizational units, and so on.
Partner functions determine how a certain business partner is related to a transaction. The most common
partner functions are Sold-To Party (entity to which goods are being sold), Ship-To Party (entity to which goods
are being shipped), Payer (entity responsible for payment), Bill-To Party (entity to which invoice is issued), and
so on.
Partner functions are assigned to quotes, and business partners are, on their end, assigned to partner
functions based on their involvement in the transaction made via quote, sales order, contract, opportunity,
and so on. By assigning a business partner to a partner function, the SAP CPQ user creates an involved party.
This way, it is possible to track, from a legal and business perspective, all the parties that have participated in a
business transaction. Partner functions essentially show how a business partner is involved in a transaction.
Example
A Jamie Peters is the recipient of the goods sold through a quote. The SAP CPQ administrator creates the
business partner Jamie Peters, while the partner function Ship-to party is already in the system, created by
default when the Business Partner feature is enabled. On the quote, the user creates a new involved party by
selecting Jamie Peters from the list of existing business partners and Ship-to party from the list of partner
functions.
Related Information
The Customers [page 544] feature has been replaced with Involved Parties in Quote 2.0 primarily to streamline
the integration flow between SAP CPQ and other SAP products that already have Business Partners up and
running. Business partner data can easily be maintained and transferred between SAP CPQ and all other SAP
systems involved in the sales cycle. Additionally, the overall efficiency of the development and implementation
of SAP CPQ is improved with Business Partners.
Both Customers [page 544] and Involved Parties are available in SAP CPQ, but their availability depends on the
quote engine:
• The old quote engine currently uses and will continue to use only the Customers feature (as Quote 2.0
will become the default quote engine in the future, Involved Parties and similar new features won’t be
developed for the old engine).
• All Quote 2.0 tenants created after the 2011 release (November 2020) by default only have Involved
Parties.
• Existing clients with the Quote 2.0 engine will continue to use the Customers feature until they migrate the
existing customer data to Business Partners. For more details on the migration procedure and how we will
assist you during the transition, please contact the SAP CPQ Support team. Please have in mind that the
Involved Parties won't show by default in these tenant until the SAP CPQ Support team enables it.
Related Information
The two quote engines in SAP CPQ use different features for recording and managing business relationships
on the quote. Quote 1.0 uses Customers and Quote 2.0 uses Involved Parties. However, clients who have been
using the Quote 2.0 engine before the release of SAP CPQ version 2011 (November 2020) have also been using
the Customers feature up to that point.
Note
In the first quarter of 2023, the Customers feature will be obsolete and replaced by the Business Partners
feature in existing Quote 2.0 tenants. To be able to use your data uninterruptedly after the first quarter of
2023, you need to migrate customers to business partners.
In the SAP CPQ release 2011 we have released Involved Parties, which consequently lead to existing clients on
Quote 2.0 needing to migrate their customer data to involved parties and make additional related adjustments
throughout SAP CPQ. However, SAP CPQ Support team first needs to enable the Involved Parties feature on
your teanant (it won't show by default) so you could proceed with the migration. This guide is meant to provide
guidance on the migration process.
Note
Involved Parties are the default engine for all new tenants using Quote 2.0. In Quote 1.0 Customers will
continue to be the only feature and Involved Parties will not be implemented. [page 333]
As part of the Involved Parties concept in SAP CPQ, we have introduced business partners and partner
functions.
Business partners of an organization are all the entities that have business relationships with that organization.
Partner functions determine how a certain business partner is related to a transaction. This page explains in
more details business partners and partner functions. [page 333]
Administrators create business partners and partner functions either in SAP CPQ or they import them from an
external system as explained in the following pages:
For importing business partners and partner functions, and for data synchronization, use the following APIs:
• Quotes API
• GET /api/v1/quotes/{quoteId}/involvedParties
• DELETE /api/v1/quotes/{quoteId}/involvedParties/{involvedPartyId}
• PATCH /api/v1/quotes/{quoteId}/involvedParties/{involvedPartyId}
• POST /api/v1/quotes/{quoteId}/involvedParties/{partnerFunctionKey}
• Business Partners
• Partner Functions
On the user side, there’s the Involved Parties tab dedicated to maintaining and managing involved parties.
There, users can create involved parties with a new business partner [page 346] or with an existing business
partner [page 345], they can also edit and delete business partners [page 347].
The involved parties have their set of dedicated document generation tags [page 176] and CTX tags [page 731].
Also, new methods are available in scripting for managing involved parties, business partners and partner
functions. This is the home page of scripting documentation. Search it by involved parties, business partners
and partner functions to check for methods.
Migration Overview
In this section, you can find a list of all areas and features in SAP CPQ that need to be revised and adjusted
when migrating from Customers to the Involved Parties concept.
Quotes
• Data Migration
To migrate data from the Customer tab to the Involved Parties tab, the SAP CPQ product team will work in
coordination with customers and partners.
• Document Generation Templates
The existing customer tags should be replaced by the relevant involved parties tags [page 176].
Customers
• Master Data Synchronization
To synchronize involved parties data, use these APIs:
• Quotes API
• GET /api/v1/quotes/{quoteId}/involvedParties
• DELETE /api/v1/quotes/{quoteId}/involvedParties/{involvedPartyId}
• PATCH /api/v1/quotes/{quoteId}/involvedParties/{involvedPartyId}
• POST /api/v1/quotes/{quoteId}/involvedParties/{partnerFunctionKey}
• Business Partners
• Partner Functions
• Custom Fields
Currently, SAP CPQ doesn’t have an option to create involved parties custom fields.
Scripting
All scripts that are related to customers should be adjusted to fit the involved parties concept. This refers
to global scripts, product scripts, custom actions, custom calculations and responsive templates. This is the
home page of scripting documentation. Search it by involved parties, business partners and partner functions
to check for methods.
Formulas
All formulas that are used in rules and conditions, and are related to customers, should be adjusted to use the
CTX tags specific to involved parties. [page 731]
Workflow
The Required Fields by Workflow Actions [page 475] page in Setup is changed to contain the active partner
functions. When you migrate from Customers to Involved Parties, you should make sure to select which fields
are required for partner functions, as you did for customers.
Salesforce Integration
If you’re using SAP CPQ in integration with Salesforce, you need to change mappings in Setup CRM
Integration Partner Functions Mapping . When Customers feature is used, mapping is handled in the
Customer Roles Mapping page.
Related Information
Business partners are created and managed in a dedicated section in the Setup by administrators with enabled
access rights for this feature.
Procedure
Note
You can manage the permissions for business partners in the Business Partner Permissions [page 341]
section. Before any business partner permission rules are defined, no business partners are accessible
to any users.
Related Information
The following table describes the mandatory and optional general data for maintaining a business partner.
Name (required) The name of the business partner, as it will display on the
quote. This can be the name of an organization or the name
of a person.
First Name The first name of the contact person. If the business
partner is an organization, then this should be the first
name of the contact person of the organization.
Last Name The last name of the contact person. If the business partner
is an organization, then this should be the last name of the
contact person of the organization.
ZIP Code The ZIP code of the city of the business partner.
VAT Number The value added tax identification number of the business
partner.
Related Information
You can create custom fields on business partners, which display on involved parties on the quote and in
business partner master data.
Business partners can be used for a variety of custom, business-specific purposes. An example of such a
purpose is sorting your customers into categories such as Gold, Platinum, or VIP.
Once it is defined in the Setup, a business partner custom field is automatically present on all business
partners, involved parties in the Involved Parties tab on the quote, and in business partner master data.
However, you can manage the values for that field as they pertain to specific business partners, as well as the
permissions and visibility rules for that field.
You can reference business partner custom fields using CTX tags [page 176], and read and update them via
IronPython scripting.
Boolean You can choose between the values Yes and No using a
toggle switch.
4. In the Permissions tab, manage the permissions for the busines partner custom field:
1. If the option Same permission for all permission groups is enabled, the same permission level for
this field applies for all permission groups. In that case, you can select a Field permission: Hidden,
Read-Only, or Editable. When you first create a business partner custom field, the toggle switch is
enabled, and the field permission Hidden is selected by default.
2. If the option Same permission for all permission groups is disabled, you can assign the permissions
Read-Only or Editable to specific permission groups.
5. Click Save.
The business partner custom field is now created. It will appear on all business partners in the Setup and
on involved parties on the quote.
Note
The value you enter for a business partner custom field in the Setup displays on the quote by default
whenever that field appears. However, if a user has the permission to edit a business partner custom field,
they can overwrite that value on the quote or enter a new value. The values which the user enters directly
on the quote apply only to the quote in question.
Note
You can manage business partner custom fields via the API. Learn more in the API documentation .
You can create rules to define which users have the permissions to access and edit business partners.
Note
Before any business partner permissions are defined, no business partners are visible to any users. An easy
way to make all business partners available to all users is to create a rule in which you will select all available
permission groups and enable the switch All business partners are visible to selected groups.
Business partners can be created in external systems and imported into SAP CPQ. In such a case, the external
system is the master for business partners.
To import business partners from external systems into SAP CPQ, use the following APIs:
• Business Partners
Related Information
Partners functions are managed on the dedicated page in the Quotes section. There are some partner
functions which are available by default, so before you start creating a partner function, check to see if it’s
already there.
Context
Note
The following partner functions come out-of-the-box with the Business Partner feature: Sold-to part, Ship-
to party, Bill-to party, Payer, Contact person, and Sales representative.
Procedure
Field Description
Key (required) The unique identifier of the partner function, input type
string, usually four characters. Used for mapping partner
functions between SAP systems.
Valid From The date after which the partner function is available in
the Involved parties tab.
Valid To The date until which the partner function is available in the
Involved parties tab.
Show by default on new quotes If enabled, the partner function will be added to the
Involved parties tab by default on all new quotes.
Can be used only once on quote If enabled, the partner function can’t be reused in the
Involved parties tab (for example, you can’t have two Ship-
to party functions.)
The name of a partner function can be translated to any of the system languages.
Procedure
A submenu displays.
3. Click Translate this item.
The Partner Function Information contains the name of the partner function as defined in Setup, and the
partner function value in the default language.
4. Click Add New Translation.
5. Find the target dictionary in Dictionary.
6. Enter the translation in Translation value.
7. Click Save.
Next Steps
When the target language is selected as user’s language, the translated value displays in quotes. In the list of
partner functions in Setup, the name of the partner function always displays how it was defined, not translated.
Related Information
Partner functions can be created in external systems and imported into SAP CPQ. In such a case, the external
system is the master for partner functions.
To import partner functions from external systems into SAP CPQ, use the following APIs:
Related Information
Since involved parties are used in other SAP systems, it is possible to synchronize business partners and
partner function data between SAP CPQ and those other systems. In that case, the external system holds the
master data which is being replicated in SAP CPQSAP CPQ.
• Quotes
• Business Partners
• Partner Functions
The Involved parties tab is where users choose partner function and choose or add business partners to create
an involved party. An involved party on a quote is a business partner matched with the partner function they
perform on the quote.
The prerequisite for managing involved parties on the quote is to create the Involved parties tab following this
procedure [page 397]. The tab is empty if there are no partner functions selected to be added by default on the
quote.
The icons on the right side, above the grid, allow users to manage the involved parties:
• - choose from the list of available columns those that are visible in the grid.
A partner function is a mandatory minimum field in an involved party. This means that an involved party must
contain a partner function, but it doesn’t need to have a business partner.An involved party can be created with
a business partner already defined by the administrator.
Procedure
To search for an existing business partner, you can filter any of the standard business partner fields.
Note
You can only search for business partners using standard business partner fields. Using business
partner custom fields for filtering business partners isn't supported.
5. Click Save.
Related Information
A partner function is a mandatory minimum field in an involved party. This means that an involved party must
contain a partner function, but it doesn’t need to have a business partner.An involved party can be created with
a new business partner, created locally.
Context
Note
If you want to allow your users to create new business partners in the Involved parties tab, set the
parameter Allow adding business partners on quotes without creating them first in Setup to TRUE in
Setup General Application Parameters (Shopping Cart and Quotes) .
The business partners created on the quote are not accessible in the Setup and can’t be used for other
quotes and other partner functions. They are created locally, only for that partner function.
Procedure
Related Information
If you add only a partner function without a business partner in the Involved parties tab, you can afterwards
search for and add a business partner directly from the grid.
Additionally, you can remove a business partner by clicking next to it in the grid. If the partner is created
by the administrator in the Setup, this will only remove the partner from the quote, it won’t delete it. If
the business partner is created locally, only for that partner function, removing it from the grid removes it
altogether.
Once a business partner is added to a quote, the relation between the business partner on the quote and that
business partner in the Setup no longer exists. In other words, if you edit a business partner in the Involved
parties tab, the changes are not propagated in the Setup. Likewise, if you edit a business partner in the Setup,
the changes are not propagated to existing quotes.
Related Information
With this feature, you can import or export business partners in bulk on the new Bulk Business Partner Import/
Export page in the Import/Export section of the Setup. You can export a template that can be populated with
new or updated business partners and subsequently imported into SAP CPQ. You can also export all business
partners at once, as well as specify whether the ID or the system ID of imported business partners should be
used to determine if new business partners should be created or if existing ones should be updated.
SAP CPQ supports tabular structure for displaying dynamic data on Quotes. Quote Tables can be a useful
resource for displaying Customer purchase history, capturing payment details, etc.
Note
Quote tables can be managed via the Quote Tables API. Information about this API is available in the
dedicated section on Swagger .
You can create a Quote Table for your users to keep a record of the payment schedule in a milestone-based
quote payment. The screenshot below shows a possible table design in such a scenario.
The Total Milestones is a quote-level custom field for inputting the number of milestones for the payment of
the quote total amount. Clicking Populate Milestones triggers a script that adds a row for each milestone and
divides the total amount into equal installments. The date of each milestone is calculated with a month of
difference, starting from the date in Payment Start Date. Any comments and notes users might have, can be
added in the Milestone column.
If users change an allocated amount, the unallocated amount is automatically recalculated. The unallocated
amount equals to $200 in the example as the amount of the first milestone is decreased by $200. The action is
triggered by the On Cell Changed script defined in Setup:
total= 0.0
cf_TotalUnassigned=Quote.GetCustomField(“Quote Total Unassigned”)
tbl=Quote.QuoteTables[“Payment_Schedule”]
for row in tbl.Rows:
total+=row[“Amount”]
cf_TotalUnassigned.Content = “$ ” + str(Quote.Total.TotalAmountInMarket - total)
The script subtracts the total amount in all rows from the total quote amount to display the unallocated
amount.
Tables on quotes are quote-related and can’t be created for each product item. The data in the table can either
be retrieved automatically from other systems and SAP CPQ or users can input/select entries for each cell.
Note that quote tables are available only in the responsive version of SAP CPQ UI.
Note
Once created in the Setup, a quote table is visible on all quotes in the tab selected during creation. All quote
tabs, except Documents, can host one or more tables, but a quote table can be located only within one tab.
Table content isn’t shared between tables.
Different column types require different input in the search fields so correct results are displayed:
• Attribute and Boolean columns - the search terms render in a dropdown list or with checkboxes so users
can select one.
• Date columns - users can either find a date in the on-demand calendar or input it manually.
• Other column types - the search term needs to be keyed in. The character limit for cells in string type
columns is 2000 characters per cell.
Note
The numeric, decimal, and money columns accept < and > characters to be used for “lower than” and
“greater than” operations. In textual search fields, if a user enters one or two letters, the rows containing
the item that starts with these letters are filtered. If more than 2 letters are entered, the system shows the
items that contain the two letters, not necessarily begin with them.
After entering or selecting from a dropdown menu a search term for one column, only the rows consistent
with the search remain in the table. Those rows are filtered further on when a new search term is applied in
another column.
Table data is organized in columns. Multiple columns with the same denominators can be visually represented
to users as a group.
Quote table columns can either pull data via IronPython scripts (the system supports a maximum of 3000
rows) or users import data manually.
Validation Rules
Validation rules show users that data input is required and that a limit on the data users enter is required.
The table shows which validation rules are available for which column types:
Number Minimum
Decimal
Maximum
Money
String Required
Contains
Date Required
Attribute
To manage validation rules for a column, access Validations when editing the column. After selecting a
validation rule and entering the value, you should define the validation message that will display to users if
they break the rule. The validation message is required, otherwise you can’t save the columns.
If one or multiple validation rules are broken, the validation of the entire table fails and an informational
message displays above the table. However, users will still be able to save the quote table and the quote and
manage other sections independently.
A rule's activity is handled through the Active checkbox. If a rule becomes temporarily unneeded, but may
become required in the future, unselect the checkbox.
A flag on quote tables, with values True or False, denotes the validation status. As the flag is exposed for
scripting, scripts can be created for users to perform actions based on the validation status.
Quote table columns are exposed for scripting so that you can create scripts for complex calculation of the
tabular data. Additionally, you can manage validation rules and column labels via scripts:
• Validation Rules - the new method ExecuteValidations triggers the validation rules. To check if a
validation rule is broken, use the HasValidationsFailed method. Also, you can activate/deactivate
a rule via scripting (for example, add a pre/post action to actions and cell events in the Actions tab).
Changing the activity via scripting doesn’t influence the behavior of the Active checkbox in Setup (the
activity must be changed manually).
• Column Labels - column labels are exposed for scripting so you can rename them to meet specific
business needs of your users. You can create a global script that renames the labels after users execute the
event to which the script is attached in Events.
Example
A script affecting the Payment Schedule quote table is attached to the action of changing the date of the first
payment in the designated quote custom field. After users change the date, the script is triggered and the First
Installment label is replaced with October 15.
Note that in the example quote, the parameters Quote.QuoteTables and GetColumnByName retrieve quote
and column names, respectively, not labels.
Quote.QuoteTables[“Payment_Schedule”].GetColumnByName(“First_Installment”).Label =
“October 15”
Example
When tracking the installment schedule plan for a product over a year,
create a column for each month and group the months in four quarters.
Note
• All columns, including those that are standalone (outside of groups), must be moved to Column
Groups. Otherwise, you can’t save the group.
• The ordering of columns and groups is set in Column Groups.
• Once you add a column to a group, you can only move it to a different group or outside of groups, but
you can’t move it back to the list of available columns.
Quote table groups are currently not exposed for scripting. To calculate the sum and average values of a group,
you can use the sum and average of columns as shown in the example snippet:
table = Quote.QuoteTables['Price_Overview']
rows = table.Rows
sum=0
for row in rows:
sum = sum + row.GetColumnValue('January')
#sum for column January
Trace.Write(sum)
#average for the column January (to calculate average on multiple columns,
multiply rows.Count by the number of columns first)
Trace.Write(sum/rows.Count)
Standard and custom quote table actions allow users to manage rows and cells in Quote Tables.
Add row, Delete row, and Copy row are standard actions available on Quote Tables. On the Administration side,
you can activate/deactivate actions, choose permission groups that can see them and define actions that are
executed before and after the standard actions. In addition to managing the table and row actions, you can also
activate/deactivate the On Cell Changed event on the same page.
Only those actions that have the Active checkbox selected are visible to users when interacting with Quote
Tables. To further control the visibility, click Permissions and select the groups to which the actions are visible.
The Pre Script and Post Script buttons provide access to a Script Editor where you can define actions that are
executed before and after the standard action, respectively. The blue flags on Permissions, Pre Script, and Post
Script buttons denote that permission groups are selected and/or scripts are defined.
Below are the available contexts for the scripts that can be attached to Quote Table events:
Copying rows
Available argument: EventArgs.
Table represents the quote table on which the action has been triggered.
NewRow represents a new quote table row copied from the source row.
Table represents the quote table on which the action has been triggered.
Row represents a newly created quote table row that will be added to the quote table.
In order to cancel adding a row to the quote, you need to set the Cancel property to True.
Table represents the quote table on which the action has been triggered.
Row represents a newly created quote table row that has been added to the quote table.
Table represents the quote table on which the action has been triggered.
Row represents a newly created quote table row that will be deleted from the quote table.
In order to cancel deleting a row, you need to set the Cancel property to True.
Table represents the quote table on which the action has been triggered.
Row represents the table row that has been deleted from the quote table.
On Cell Changed
In the Cell Events section, you activate the On Cell Changed event and attach a script that will be executed after
users make a change in a quote table cell. To use this event, you need the following context information:
As the system automatically saves every change made in a quote table cell, the list of changed cells and old
values will have only one element. An example code snippet below demonstrates how to access the changed
cell and log its current and previous values:
i = 0
while i < len(EventArgs.Cells):
cell = EventArgs.Cells[i]
Trace.Write('Column: {0}, value: {1}, display value: {2}, old value:
{3}'.format(cell.ColumnName,
The list of changed cells and the list of old values are sorted so that related entries have a matching index
(position) on both lists.
Administrators create custom actions so their users could manage specific tasks on quote tables. In the
example scenario detailed in Quote Tables, the custom action Populate Milestones creates as many rows as
there are milestones defined in Total Milestones.
To create an action that isn’t standard on Quote Tables, click Add Custom Action. In the Script Editor, define the
action's name and the script that will be executed upon clicking the action button. The custom action buttons
appear above Quote Tables and their labels in the default language can be translated in the Actions section in
the Translations tab.
Scripts acting as Custom actions on Quote Tables have the following variables available in their context:
Note
Scripts attached to standard table and row actions and cell events don’t run when you interact with rows
via scripts. They only run when a user interacts with a Quote Table through the user interface.
Quote Table events can also be accessed via Iron Python Scripts. New rows can be added, data can be
read from them, permissions can be set, etc. The interfaces to do this are described in SAP CPQ Scripting
Documentation .
Users can import data into quote tables by importing Excel files on both quote engines.
The following procedures contain step-by-step instructions on how to upload Excel files into quote tables.
General Prerequisites
This functionality can be accessed by navigating to the quote tab in which the quote table is placed. There,
users can:
Instead of manually adding rows into quote tables, users can download empty Excel templates, fill them out
and upload them into the quote table.
4. Click .
5. Upload the file with new data.
A message informs you whether the upload was successful or not.
When managing extensive quote tables, it’s easier to download the existing data in an Excel file, update it and
upload the template back into the quote table. The prerequisite is to have data in the quote table.
4. Click .
5. Upload the file with the updated data.
A message informs you whether the upload was successful or not.
Template Guidelines
The Excel template contains a sheet with all columns and rows that exist in the quote table for which a user has
editing rights.
Note
Quote table rows are distinguished by ID numbers, so if existing entries need to be updated, you shouldn’t
change the ID numbers in the template.
If users populate the Excel file incorrectly by entering an inadequate value format and try to upload it into a
quote table, an error message appears. Additionally, users are prompted to download the file again and enter
the correct data to ensure a successful upload. The incorrect data in the Excel file is marked in red and the new
Error column is also displayed in the file. You don’t need to change the color of the cells and delete the Error
column before reimporting the file.
An Excel template is always downloaded in .xlsx format, but it can be uploaded in any of the following Excel
formats: .xlsx , .xls, .xltx, and .xlt.
Note
There’s a new event When Excel is uploaded into a Quote Table available in the Global Scripts. A global script
can be triggered after an Excel file is successfully uploaded to a quote table.
The Translations tab allows you to translate the Quote label, column and action labels and validation messages.
Each label has a dedicated row with a value in the default language and a value in the target language, if
defined. To add a translation, first choose the target language in the Language drop-down list. You are now able
to add the translated value in the Translation column.
The Quote Tab Permissions allows managing visibility of the quote tabs based on the workflow statuses and
permission groups.
Unless you select a status and/or a permission group, all defined quote tabs are visible in all status and to all
permission groups. Quote tab permissions are managed under Setup Quotes Quote Tab Permissions .
When you access the page, a list with the following data for all existing permissions is displayed:
• Tab - the name of the tab for which the permission is created.
The Show drop-down list allows you to filter the list per specific tabs or display all tab permissions in the list.
5. In the Additional visibility restriction section, click to create a condition formula [page 762] for a more
specific restriction.
6. Click Save to finalize the creation.
Tip
Quote.CurrentItem CTX tag can’t be used for defining additional visibility restrictions.
Note that the condition formula additionally restricts the tab visibility related to permission groups and
statuses, it doesn’t overrule it. The system re-evaluates the condition formula every time the quote is modified.
The Custom Fields administration allows creating custom fields in the shopping cart for users to include
additional information, such as terms of payment or other specific information to your company.
The fields can also be useful in helping to define what a generated document includes. Field selections can also
affect the configuration of the products. Each custom field is assigned to a tab defined as a quote tab and gets
permissions set to define how the field will be used based on the user and the status of the quote.
Custom Fields administration can be found under the Quotes admin menu. Here user can copy, delete, and edit
existing custom fields. Clicking Add New allows adding a new custom field.
Creating a new custom field comes in two steps. First step is to define the field, including the label, the type
of field it is, what tab it is displayed in and the order, and the label. Once defined, user can then assign
permission to the field. The permissions determine how the field is displayed to the user, such as hidden,
required, editable, and read- only.
Quote custom fields have a limit of 2000 characters per field. Additionally, the maximum number of quote
custom fields that can be created in SAP CPQ is 1024. This is applicable for both Quote 1.0 and Quote 2.0.
Definition
• Name - Custom fields can be created with any name, or label. This label can then be different for other
users based on user group.
• Type - This determines how this custom field is used :
• Free Input - Field appears as a text box in which users input a value. No restrictions on what the user
can enter.
• Attribute - This type allows you to connect your custom field to an attribute. This way, in the quote, you
get the text box where you can select custom field value from the list of attribute values. If you set an
attribute of type „Auto-complete“ to be connected to your custom field, then in the quote, instead of
drop box, you get the autocomplete text box where you can type a value that you want to assign to your
custom field. As you start typing, autocomplete offers a list of values that either starts with the typed
combination of letters, or contains it.
You can also set the value of autocomplete custom fields via scripting by using the Value Code
property, as explained in Autocomplete Attributes [page 32].
• Date - Field appears as a text box in which the user enters a date. The date the user enters must match
the date format the user has set on the User’s Page. Next to this field, the user is able to click an icon to
display a calendar where the date can be chosen.
You can’t change the Date field to any other type, nor can you switch other types to Date. You can
switch fields to and from Free Form, Attribute and Long Text.
• Long Text - Field appears as a large text box in which the user can enter multiple lines of text. No
restrictions on what the user can enter.
• Tab - Select one or multiple quote tabs under which this field will be displayed. The only tabs available are
those tabs that have been defined as a quote tab in the Quote Tabs administrative section. It’s important
to keep in mind that the tabs that are used for the cart, customer info, and attachments are available
selections. This means that user can place custom field not only in custom tabs, but also within the cart,
customer info, or attachments.
• Order within Tab - Determines where this field will be displayed in relation to the other fields on that tab.
The lower ranked fields will be displayed on the top, while the higher ranked will be displayed after.
• Calculation Type (Quote 1.0 only) - If “Once, when quote is created” or “Every time quote is modified”
Calculation type is selected, a new Formula field is shown. The evaluated formula value is assigned
to the content of the custom field. This way a custom field value can be defaulted to some
value. Some of the tags aren’t supported for “Once, when quote is created” calculation type option
(<*CTX(Quote.QuoteNumber)*>,<*GI(CART_OWNER_ID)*>,…).
When application parameter “Enable quote custom field calculation ranking” is true, the new field is
added in custom fields administration “Calculation rank”. This field is visible only when “Calculation
type” is not “None”. For example, admin can add three dependent custom fields: Custom field
“A” ,Custom field “B” ,Custom field “C” . Custom fileds B i C have calculation type 'Every time quote is
modified'. Custom field B has formula <*EVAL(<*CTX(Quote.CustomField(A))*> * 2)*>, custom field C:
<*EVAL(<*CTX(Quote.CustomField(B))*> * 2)*>. Calculation rank is set to 1 for B and to 2 for C. When the
Note
When using the Transfer-to-item functionality it will cause Quote Reconfigure – not only when the
custom field value is changed, but also when the Calculate action is triggered (on item discount
change, list price change or any other field value change).
clicking this icon displays a list of all the user groups in the system where user can define what the
label will be for each group. This is most beneficial when quotes are being shared among user types. Users
that open quotes from another user group will see their label with the other user’s value.
For instance, if we have a custom field called quote name, we may want the managers to see the label
‘Project Name’ but the sales rep to see ‘Quote Name’. When a sales rep user creates a quote they’ll enter a
value for Quote Name. Then when the manager opens the same quote, they’ll see the same value the sales
rep enter but under the label Project Name.
• Contains Personally Identifiable Information - All information that could potentially be used to identify an
individual should be flagged as PII [page 804]
Permissions
The Permissions tab defines how the custom field will be displayed to the user based on the user group and
status of the quote. There are four options that you can define for the field:
• Hidden - This is used for the statuses or user groups that you would not like the field displayed for. The field
is not displayed at all to the user. If the field is required the user will not be prompted to enter a value for
the field.
• Read-Only - This is generally used for statuses after the quote has been completed, such as Order Placed
or Received Order. The field is not editable. Whatever value had been entered for the field will be displayed
as uneditable text. Even when a custom field is read-only for a user type, a script will change the value
when triggered.
• Editable - This is generally used for the initial statuses in which the quote is being created, such as Open.
The field is displayed in whatever format it was defined in.
• Required - This is used when user would like the user to define this field before they are allowed to Place
Order on the quote. Field marked as required are editable and are displayed with a red asterisk. If they try
to Place Order on the quote or save the custom fields on that tab, then they will be prompted to define the
field.
One of these options can be defined for each cell in the matrix of user groups and statuses. To set an option to
a cell click the cell to display a pop-up where the option can be selected. There are six different types of cells in
the matrix that can be defined:
• All Permissions - Sets the same option for all the cells in the matrix. Click the upper left corner of the matrix
to define.
• All Statuses for One User Group - You can set all the statuses for one user group by clicking the user group’s
name on the left side of the matrix.
• All User Groups for One Order Status - You can set all the user groups for one order status by clicking the
status on the top of the matrix.
• Individual Cell Intersection - You can set a cell intersection between a status and a user group. For instance
the Sales Rep group should have the custom field Read-Only when in the Order Placed status.
• Default (For New User Groups) - Set how the custom field will be displayed to the users added to new user
groups that haven’t been set in this matrix yet.
• Default (For New Order Status) - Set how the custom field will be displayed in a new statuses that haven’t
been set in this matrix yet.
The default cells make administration easier so that when you create a new user group or status you do not
need to go through and define all the custom field permissions again.
Note
Selecting an option for a cell that includes all statuses or all user groups might take a little bit of time to set
depending on the number of statuses and user groups created in the system. Large number of groups or
statuses means there are a lot of cells to set, so there might be a slight delay in setting them all.
In Quote 1.0, quote custom fields are stored as strings in the database, and in Quote 2.0, dates are stored in the
datetime format. If you are setting the date in a quote custom field in Quote 1.0 through scripting, you’ll first
need to convert the date to string, using the ToUserFormat function. Check the following examples:
Quote 1.0
Quote 2.0
Key attributes provide you with an option to set up attributes as search criteria on the user side.
Users can search for quotes based on the value of key attributes in the environment. For example, if Memory is
a key attribute, users can make Memory a search field. When users browse quotes, they can search quotes with
the Memory value of 1024MB-DDR, and all quotes containing this value are listed.
You can find the Key Attributes administrative section under Setup Quotes . There, you can add new key
attributes, change the label of the existing key attributes, and modify the expression used to compute the value
of the key attribute.
You can create a new key attribute by clicking Select. This brings up a pop-up window where you can search for
the attribute you would like the key attribute to reference.
The Label field determines what the default label for this key attribute will be. Users can change the label when
the key attribute is added as a search field.
The Expression for computing key attribute value field must contain a standard SAP CPQ tag which determines
what value will be used when searching for this key attribute. Generally this field contains tags such as Value
or ValueCode. You can also include a much more complex expression here if necessary.
In order to do this you can use arguments of the tag LoadCartItems consisting of the prefix KeyAttribute-
and key attribute name. For example:
• KeyAttribute-Memory
• KeyAttribute-Processor
• KeyAttribute-Printer
In the syntax checker, only non-empty key attributes will be displayed. This tag will be
used to populate the appropriate column with value of item’s key attribute. The complete
tag may look like this: <*CTX( Container(Test_Container).LoadCartItems(KeyAttribute-
Memory).ToColumns(Memory) )*>
• Create a container attribute that will be populated with contents of the quote. This container will be
displayed in configurable product. The container should contain quote item fields.
• Add key attributes to be displayed in a container (String, Numeric, Date)
• Create a quote and add several items. Some items should have these key attributes empty.
• You will see that quote contents are displayed in the container and that key attribute values are will be
displayed for all items.
They can be defined on a per user group basis and can ordered. The search fields available include quote
information, customer information, key attributes, or user information.
When users want to save default number of quotes that will be displayed, SAP CPQ will save maximum 50
quotes per page.
The Search Fields administrative section can be accessed under the Quotes admin menu. Here user can add,
remove, and modify the search fields.
To add a new search field, click the Add New button. This displays the search field definition page.
Available Fields displays the fields that can be searched by. These include any Key Attributes, Custom Fields,
and default fields, which include cart information, customer information and user information. The Label
field determines what the search field label will say on the user side. Because the search field name can be
sometimes not very descriptive or not custom for user's company, the Label field allows displaying any label
that is needed.
The Operator field determines how the system will search the value entered by the user. There are 6 options
available as an operator:
• =number - requires the value entered by the user and the selected field is a number
• =date - requires the value entered by the user and the selected field is a date
• =string - requires the value entered by the user and the selected field is a string, or text
• like - allows user to enter any value, this value is then searched by for in the selected field. An exact match
is not needed with this query. For example, if a user enters the value “com”, the system will match that with
“computer”, “communication”, “combination”, etc.
• number interval - user is given two fields to enter a number. The system then returns the values that fall
between the entered numbers.
• date interval - user is given two fields to enter dates. The system then returns the values that fall between
the entered dates.
Tip
Searches done with the =number, =date, and =string operators must be exact matches in order for the
system to return the result.
The All User Types field refers to user types for which no search fields have been defined. What this means is
that, if a search field has been defined for a certain user type, that user type will not have access to search
fields defined for All User Types. For example, if a Project Name search field has been defined for a Sales user
type, the Sales user type will only have access to the Project Name search field, and to no other. This also
means that All User Types will not have access to the search field defined for a Sales user type.
Selected Fields lists all the search fields currently being displayed to users. The fields are listed in the order that
they will be displayed to the users from top to bottom.
To add a new search field, user must select the field from the Available Fields and click to send the field to
the Selected Fields. Then it is possible to order the selected fields by selecting the field and clicking the up and
down arrows.
User can only add one search field at a time. To add another search field, save the current addition, then go
back into the search field administrative section and click Add New.
When editing a search field, if desired, user can only remove and edit the label of the field that you edited. User
can, though, modify the ordering of all the fields while editing.
Note
To make the Advanced Search feature available on the Existing Quotes page, you must tick the Show Fields
in a Quote Search/Filter check box on the User Types [page 144] Help page.
As an administrator, you can use quote visibility rules to define which quotes are accessible to users in the
Other Quotes tab.
By default, users can only view quotes that they have created, in the My Quotes tab of the Load Quotes page.
However, given the appropriate permissions, users can also access other quotes in the Other Quotes tab.
To allow a user to see the other quotes, you must create quote visibility rules in Setup Quotes Quote
Visibility . Quote visibility rules can be defined on both quote engines. However, there are differences between
how the feature works in Quote 1.0 and Quote 2.0.
Note
Users won’t be able to see any quotes in the Other Quotes tab if no quote visibility rules are defined. This
behavior is the same in both quote engines.
In the Quote Visibility section in the Setup, you can see all existing quote visibility rules. You can filter the rules
using the parameters Group (which refers to user types), User, Company, and Condition (only in Quote 1.0).
Note
When the system determines which rule is applied, groups have priority over users, and users over
companies.
By clicking Add New, you access the quote visibility rule definition page, where you can define a new rule by
completing the following steps:
• In step 1, you need to specify to which users the rule is applied, by adding individual users, user types, or
companies.
• In step 2, you can limit the quotes that the users specified in step 1 can view. You can allow the specified
users to only view their company's quotes, quotes created by other users for whom the specified user is
the approval parent, or quotes created by users for whom the specified user is the managing parent.
• Step 3 is available only for Quote 1.0 users. Here, you can specify a condition under which the rule is
applied. Since conditions aren't available in Quote 2.0, you can use SQL pre-filtering to create dynamic
settings, instead. SQL pre-filtering conditions can be used to improve performance in both quote engines.
If you defined prefiltering conditions but you’ve noticed that they aren’t applied, contact the SAP CPQ
Support team to enable prefiltering for your tenant.
SQL prefiltering can affect the way regular filters work. Results which would be included if using regular
filters may be discarded due to prefiltering.
It is only possible to create one rule per combination of User Group, User, and Company. In addition, you can
only create one rule for a specific user (for example, John Smith). However, you can create a rule for the user
group Sales, even if John Smith belongs to that group. In this case, though, the visibility rule created for the
Sales group would have priority over the rule create for John Smith.
When a user opens the Other Quotes tab, the system runs the visibility rule for every quote in the system. If the
condition is met for a quote, then the specific user will be able to see that quote. The actions which the user
can perform on these quotes are defined in the Workflow Actions administrative section.
In Quote 1.0, only quote tags can be used in the condition field for visibility rules. You can use the formula
builder to create complex conditional statements. Any quote information can be retrieved to be used in the
calculation, including user information, customer information, custom fields, discounts, cart amounts, and
many others. Entering 1 in the condition field allows the selected user to see all quotes generated in the system.
For example, we can create a rule in which the Sales group can see all quotes where the quote creator’s user
group is Sales, by specifying the user type Sales and the condition <* SameGroup *>. This rule states that
any user in the Sales group will be able to see quotes from the users that are within their group. The <*
SameGroup *> tag checks the quote creator’s user group and the user group of the user currently logged in
and returns true if the same.
We then want John Smith, who is part of the Sales group, to only see quotes within his ZIP code. To achieve
that, we need to create a rule that specifies the user John Smith, the user type Sales, and the condition <*
SameZipCode *>. This way, the previous visibility rule for Sales also applies to John Smith, but in addition, the
tag <* SameZipCode *> matches the ZIP code of the currently logged in user with that of the quote creator.
The rule states that John Smith will only see quotes where his ZIP code matches that of the quote creator. In
addition, since the Sales user type is also specified, John Smith is now allowed to see only those quotes where
he has the same user group and the same ZIP code as the quote creator.
All companies have unique needs but there are some commonalities which will be used for quote visibility
rule examples. Companies can have many different ways of distributing products and services and hierarchal
structures to manage them. For example, a Sales Management group needs to see all quotes that its groups
or salespeople generate, which may include individual users, Value-Added Resellers, Wholesale Distributors,
Outside Sales Reps, etc. Several quote sharing rules must be created in order to specify who can and cannot
see the quotes that have been generated.
• Sales Management: The internal management staff which needs access to all quotes.
• Sales: The internal sales rep staff which work in territories or specific companies.
• Channel Rep: Wholesalers, VARs, Distributors.
• Direct Sales: Center sales personnel, customer service, etc.
The Sales group will be divided into 2 territories, East and West. The Channel Rep group has 4 major stocking
wholesalers, 2 in each territory. In addition, they have 5 Value-added resellers assigned to each.
Rule 1
Sale Management needs access to ALL quotes. Administrator should select Sales Management as user type
and in Condition, enter 1.
Rule 2
The Sales group should see only quotes within their territory. Jerry Thompson is assigned to East and Anna
Windfree is assigned to West. In order to make sure each rep can only see quotes that belong in their respective
territory a rule is created using the <*SAMETERRITORY*> tag. Administrator should select Sales as user type
and in Condition, enter <*SameTerritory*>.
Now every Sales user will be able to see all quotes located within their respective territory. Based on this
rule Jerry Thompson will not be able to see Anna Windfree’s quotes, because in there user profile they are
in different territories. For more information on assigning users to a territory, see the chapter on Users in the
Users section.
The way this rule works is very simple as well. When a user from the group Sales accesses the Other Quotes
tab, every quote is evaluated against the tag <*SAMETERRITORY*>. This tag evaluates to 1 (true) if a user who
created a quote (quote owner) has the same territory as the logged in user. All quotes will then be visible to the
logged in user through the Other Quotes tab.
Rule 3
Channel Reps should see only those quotes they have generated (My Quotes) and all
quotes created by their own distributor companies. The Channel Rep group supplies Westcoast
Distribution Inc. and Eastcoast Distribution Inc. They need to view all quotes generated by
those two distributor companies. In this case the condition is a bit more complex and requires
the following expression: [OR]([EQ](<*CO_INFO(COMPANY_NAME)*>,Eastcoast Distribution Inc),[EQ]
(<*CO_INFO(COMPANY_NAME)*>,Westcoast Distribution Inc)). Administrator should select Channel Rep as
user type and in Condition, enter [OR]([EQ](<*CO_INFO(COMPANY_NAME)*>,Eastcoast Distribution Inc),[EQ]
(<*CO_INFO(COMPANY_NAME)*>,Westcoast Distribution Inc)). The way the above rule works is also very
simple. When a user from the Channel Rep group accesses the Other Quotes tab, every quote is evaluated to
Rule 4
By default the employee from each company (Westcoast and Eastcoast) can only see their own quotes (My
Quotes). In order to allow each user to see quotes from their own company we need the following rule: User
Type should be set to Direct Sales, My company's quotes checkbox selected and Condition set to 1. The way
this rule works is also very simple. After a user from Direct Sales accesses the Other Quotes tab the user will
see all quotes where the quote owner has been added to the same company as the logged in user.
In the Sql Join box, join condition needs to be set for sys_QuoteInvolvedParties and
sys_PartnerFunctions tables:
Before setting up the prefiltering, check the query in the Developer Console. The query shows that q.Id
references Quote Id (alias q is used for sys_Quote table).
This example uses the partner function key bt to check if the business partner is not from the United States.
JOIN with sys_PartnerFunctions table can be avoided if PartnerFunction id can be used instead
(sys_QuoteInvolvedParties.PartnerFunctionId).
Note that in cases when one quote contains multiple involved partners with the same partner function key (for
example, there are two involved parties with the bt partner function key) and you want to show the quotes in
which all involved parties are outside of the United States, you should use only the Sql Where prefiltering since
using GROUP BY and JOIN would result in duplicate rows.
For example, if you want to exclude quotes in which any of the involved parties is located in the United States,
then you can use the following condition in the Sql Where prefiltering.
NOT EXISTS (
SELECT 1
FROM sys_QuoteInvolvedParties qip
WHERE qip.QuoteId = q.Id
AND qip.Country = 'US'
)
The Reporting Module allows authorized users to create reports, such as how many configurations have been
completed in a certain time frame, who completed them, how many quotes were generated or how many
projects were created, their status, activities by departments, individual users, customers, etc. SAP CPQ
administrators can set these reports up by using the administrative interface for the reporting module.
Reports link under the Quotes admin menu. The picture below shows a list of existing reports and some action
buttons which are used to Reporting Module administration is invoked by clicking on the Add, Change (edit),
Copy or Delete reports.
Clicking the Add New button brings up a new screen where user can choose to create a Standard Report (which
can have filters) or a Common TreeView Report.
Creating either a standard or a tree report requires the administrator to select from a list of standard views or
stored procedures.
Note
Currently SAP CPQ does not provide any stored procedure as report source.
Reporting Module administration is invoked by clicking on theThe following picture, (Standard Report → View),
shows a typical list of standard views. Views are similar to tables that combine data from 2 or more SAP CPQ
database tables. After selecting the desired view, user will see a report definition screen as shown in the image
below:
The first column lists all the fields from the database that are available for the report using the selected “view”
from the previous screen.
Column order specifies which data (columns) should be included in the report and the order in which the
columns will appear from left to right.
Example 1
The first report has the following columns: Quote Creator, Customer Name, Total Quote Amount. Sort Order,
Sort Type, Group By and Total are also defined. The report will display quotes grouped by Quote Creator and
Customer Name, and a sum of the Total Quote Amount.
Clicking the Preview button will bring up a screen with a preview of the report as shown in the following image:
To sucessfully preview the report, you first must select the Group By option for each column in which no
aggregate function has been applied (that is, each column in which Total is set to None).
Please note that all records that have the same Quote Creator and Customer Name are combined into one
row. The number displayed in the Total Quote Amount column is a sum of amounts of all quotes created by the
user whose name is displayed in the Quote Owner column and sold to the customer displayed in the Customer
Name column. In order to successfully define such a report, the administrator needs to specify what operator
to apply to all the fields (columns) that are not being grouped. These operators are located in the Total column
and the choices are Count, Sum, Max, Min, Ave, etc.
Example 2
Since database field names are not always user-friendly the Alias column is used to allow the administrator to
specify a more user-friendly name for each column. In some of the examples above, the column Name uses the
alias Quote Creator which is the name presented to the user.
It is also possible for the administrator to specify if a user should be able to use any search criteria. This is
accomplished by specifying the Condition operator as shown in the following image:
User Entry implies that the user will enter the desired search value.
User ID implies that only the data pertaining to a particular user will be provided in the report.
Search criteria can also be set to return only the record created on that particular day (Current Date).
The user can also select from the list of values (select one or more of those values). If the administrator selects
User Select (Single) or User Select (Multiple), the user will be presented by a drop down or a multi select list box
of search criteria.
In the case of User Select the administrator must select a source for the search data, which will be presented to
the user.
Here are two examples of user-selected searches. The first one has a condition operator of ”>” and User entry.
The LIKE operator is used on a value typed in by the user. Here is the output:
First select the User Group(s) that will have access to the report. The number of records per page has default of
10, which can be changed. A Report Description can be added. The report can then be previewed by selecting
the Preview button. All parameters can be reset by selecting the Reset button or the report can be saved by
selecting the Save button.
Other than attribute values, in the product rules administration page you may set and read global variables
(globals, GI). Global variables are stored at cart level and are common for each main item/product
configuration in the cart. Global variables may be used to model the interactions between items and to define
action availability within the configuration. For details see the chapter on Global Variables [page 760].
Cart Level Aggregates are special Global Variables. When you define an aggregate you provide its name and
formula. This formula is evaluated for each main item in the cart. The evaluated formula is then converted to
a numeric value. If it can not be converted to a numeric value, the aggregate value for that particular item is
set to be zero. SAP CPQ will implicitly multiply each formula with the quantity of the item. The final value of
an aggregate is assigned to a Global Variable with the same name as the aggregate. This means that when you
define an aggregate you actually define a Global Variable.
Tip
Since Quote Properties are also global, you must be careful to define unique aggregate names.
Cart Level Aggregates are a favorable method for calculating the sum of the numeric values in the cart. They
are calculated when an item is added to the cart, and during the Reconfigure action. Cart tags and some CTX
Tags [page 731] should be used in its formulas.
Example 1
Note
As stated earlier, SAP CPQ will implicitly multiply each formula with the quantity of the item. This is why the
formula reads “1” – because if your item count is 3, the end result will be 3. In other words, this will create a
global variable “Item Count” and its value will be equal to a count of the main line items – number of added
configurations – in the cart.
Example 2
• Aggregate Name: “Total Hard Drives”
• Formula: <*CTX(Quote.CurrentItem.Attribute(attributename).Value)*>
This will create a global variable “Total Hard Drives” and its value will be equal to a product of quantities of
“Hard Drive” attributes in each item in the cart. If an item or a configuration does not have a “Hard Drive”
attribute, the aggregate value for that particular item will be set to zero, thus such items will not affect the final
aggregate sum value.
This aggregate/global variable can also be used in an action condition, for example:
This condition will allow an action if global “Total Hard Drives” is greater than 10. For more details on conditional
workflow actions see the chapter on Workflow Actions [page 416].
The Bulk Deletion section allows administrators to delete other users, their quotes or their customers.
Administrators can clean up the system database by deleting old users, their quotes and customers. You can
access this feature in Quotes Bulk Deletion . Bulk deletion of quotes is only available for the Quote 1.0
engine.
On the Bulk Deletion page, you can choose whether to delete users and their quotes, or to delete local and
global customers in the system.
Note
In Quote 2.0, you can only delete quotes using bulk deletion, not customers or users.
Delete customers
In this section, you can delete a user’s customers or global customers. To delete global customers, search for
customers in the table and select the checkbox next to the customers you want to delete. Next, click the Delete
button.To delete a user’s local customers, click the Select button next to Select User, and click the selection
icon in the list of users. The selected user's customers display in the section, where you can delete them by
selecting the checkbox next to the user and clicking Delete. Only active users can be selected in this menu.
Before deleting a user, that user's customers must be deleted. Users can't be deleted if they are the
administrator of a company, an approval parent, managing parent, ordering parent, or have customers
associated with their account.In this section, you can delete a user’s account, quotes, or both. Search for
the users in the table. Two checkboxes display next to the name of the user. To delete a user from the system,
select the left-hand side checkbox. To delete only the user's quotes, select the right-hand side checkbox next to
the name of the user.
Deleting a user’s account automatically deletes their quotes as well. If you wish to keep the user’s quotes and
still delete the user, first reassign the quotes to another user, and then delete the user’s account. If you only
delete a user’s quotes, the account remains intact.
You can restrict the visibility of column headings to specific user types or you can make them visible for all
user types. You can also select the order in which the columns will be displayed on a quote. Available column
headings may include quote information, customer information, key attributes, custom fields and/or user
information. Any field available to users on the Existing quotes page can be sorted.
The Column Headings administrative section can be accessed via Setup Quotes . Here administrators
can add, remove, and modify the column headings.
To add a new Existing Quotes Column, click Add New. A blank definition page will be displayed. Selecting Edit
would bring up the same page. Fields starting with the blue asterisk symbol, (*), are required in order to save
the new column. When you add/edit a column heading, two additional check-boxes are enabled if the column
represents a quote custom field:
• Label : Editable - If this is checked users are able to change the value of this field from the Existing quotes
page.
• Label : Changing field value triggers quote recalculation - When users edit a field from the Existing quotes
page, the quote will be recalculated. This feature can be used when the field is used in other calculations in
the quote or when its value is transferred to quote items.
This feature will enable users to edit custom fields from the Existing quotes page. Users can change quote level
custom fields directly on the existing quotes page. For example, this can be very useful when changing the
expected close date for several quotes without opening them one by one. Additionally, you can define which
fields are editable and whether or not changing that field causes the entire quote to be recalculated.
Custom field types that are supported for edit are: Text Field, Attribute and Date.
When a user enters values in one of the editable quote fields and clicks Save, SAP CPQ will identify quotes
where the user has entered a value and save the quotes one by one. Unless you have marked the column to
• Available Fields contains the fields that can be displayed. These include any key attributes, custom fields,
and default fields, which include cart information, customer information, and user information.
• Label field determines which text will be displayed in the column heading on the user side.
• User Type determines which user types will be able to see this specific column heading:
• All User Type option allows all users to see the column heading.
• Selecting any specific user type will enable only that user type to see the column heading.
Consequently, as soon as you click Save, the user type in question will only be able to view column
headings assigned to them, while the column headings assigned to All User Type will become
inaccessible to them. (For example, if all user types have access to column headings A, B, C and
D, while users from the Sales user type have access only to B, they will not be able to view A, C and D,
even though they are assigned to All User Type).
• Search Fields Order lists all the column headings currently being displayed to users. The fields are listed in
the order that they will be displayed to the users. The fields listed at the top will be displayed on the left
side of the quote list.
To add a new column heading, select the heading field from the Available Fields and click Add to Column
Headings to add to column to the Existing quotes page. User can then order the selected fields by selecting the
column heading and clicking the up and down arrows in the Search Fields Order list box.
Note
User can only add one column heading at a time. To add another column heading, save the current
addition, then go back into the column heading administrative section by clicking Add New.
When editing a column heading, if desired, users can only remove and edit the label of the heading that is being
edited. Users can modify the ordering of all the headings while editing a particular column heading though.
This option can be used when there is need to customize default settings when sending an email after
generating documents.
• Don't preselect TO on Send Mail - Set to TRUE in order not to preselect To on Send Mail.
• Don't preselect CC or BCC on Send Mail - Set to TRUE in order not to preselect CC or BCC on Send Mail.
• Emails are sent by - In Quote 1.0, emails can be sent via the CPQ Mailer, User's Mail Client, or they can
choose between the two during the document generation process. In Quote 2.0, only the User's Mail Client
option can be used.
• User used for Quote Acceptance - In this field, you can set up a user who will be able to open proposal links
from the emails. Their password expiration date mustn't be exceeded.
• Show Generated Document On View Proposal - You can set if generated document can be downloaded from
View Proposal.
• Show Quote On View Proposal - You can set if generated document is shown on View Proposal.
• Users can send quotation link in the Email to customer for electronic acceptance process. This option is - You
can define whether option to send quotation link is hidden, visible, or pre-selected for the user.
Tip
To make action Send Document to CRM visible on the Download Document and Send Email page, set
application parameter Hide option to send document to opportunity from user (located in the Email
Customers/Quote Acceptance Settings, in the Quotes submenu) to False.
You can translate a Predefined Email Subject or a Predefined Email Body using Dictionaries and CTX tags (our
example illustrates how to translate the Predefined Email Body). To translate a Predefined Email Subject, you
must first choose the Dictionary Key [page 702] of the value you want to appear in the email body. Once you
have done that, you should complete the following:
1. Go to Quotes Email Customers/Quote Acceptance Settings where you will click the syntax checker
button, select CTX from Available Tags and click Construct CTX tag.
2. Select Dictionary from the Select CTX tag object dropdown menu; select Current from the Select Dictionary
object
3. To insert the value of your previously chosen Dictionary Key, select Value from the Select Current object
dropdown menu.
4. Click the AB button (Show Editable Argument) from the Select Value argument to be able to insert your key
between brackets in the Your CTX tag: field
8. Made sure that the Predefine Email Body entry field has been populated with your CTX tag and click Save.
9. Once you have downloaded documents in Quote and you are ready to send your email, your Predefined
Email Body will be translated and populated in the Email Form (Figure 6). Note that the system will
translate your Predefined Email Body to the language set by the Default Dictionary option on User Page.
5.14 Favorites
Favorites will be presented to users in a widget that will be placed in different pages in SAP CPQ (quote, catalog,
configuration and special page for Favorites).
For each favorite, users will be able to see favorite’s name, favorite’s description, part number, product that
is used as favorite’s base and category where this product belongs to. Users will be able to search favorites
based on all these fields. User will be able to sort all columns in this table. Search There are three check boxes
on which user will specify whether they want to search My Favorites, Company Favorites and All Favorites. By
default, all three check boxes will be selected.
Users will be able to add favorites to current quote or to create new quote (if one is not loaded yet in session)
by choosing one or more favorites from table and clicking on ‘Add to quote’. If result is success for favorite, it is
added to the quote. If at least one favorite is incomplete, user will not be immediately taken to quote. Instead,
User will be able to delete only favorites they have created. System will prompt user whether he/she is sure
favorite should be deleted.
To enable favorites, the application parameter Users are able to create product favorites needs to be set to
TRUE.
• Add to Favorites - Users will be able to add both simple and configurable products to favorites from the
catalog (for simple product there will be only ‘Add to Favorites’ icon).
• View Favorite Configurations for this product - In catalog, users will be able to see icon for configurable
products (as well as systems and collections).Mouse over for icon will be ‘View Favorite Configurations for
this product’. When user clicks on ‘Favorite Configurations’ link, favorites for that product will be displayed.
Users will be able to add favorites to current quote from the widget. New quote item action ‘Create Favorite’ will
be added. When users click on it, pop-up will be displayed where users will be able to enter favorite’s name and
description. Item action will be available for all main items (both configurable and simple products).
The purpose of this feature is to enable images for quote actions so that users can easily spot them.
User Side
In quote, depending on value of application parameter,actions will be displayed with images. Actions will be
sorted by sort order (actions with empty sort order field will be displayed at the end). If actions have empty
sort order (applicable for all existing clients), quote actions will be displayed in the same order as before. Some
actions will always be displayed and some will be collapsed.
There will also be a flag (application parameter) – ‘Display images for quote actions’. When this flag is selected,
users will see quote actions in the quote. Default value for flag will be FALSE.
Admin will be able to edit action. When he clicks on ‘Edit’, he will be able to change :
The purpose of this feature is to allow MRC total amount as column in the list of existing quotes.
In Setup Quotes Column Headings and in Setup Quotes Search Fields administrator should
add new field ‘Total MRC Amount’ to the list of Available Fields.
This field will return total MRC amount on user’s side in the same way as field ‘Total Amount’ returns total NRC
price.
The purpose of the Quick Config functionality is to provide a shortcut for searching and configuring the
configurable product at the same time.
This is achieved by entering a part number and attribute values that you would like to configure for the
particular product. If your search query matches the search pattern for that product (previously defined
through SAP CPQ setup by administrator), then SAP CPQ finds your product, preselects attributes that you
stated in your search query and finally adds product to the quote.
In classic design, the Quick Config field is located at the right side of the main menu. In responsive design it is
located in the quote.
If you are using classic design quick config, you should choose “Part Number Search” from the dropdown, type
your search term and click on search button.
If you are using responsive design you should enter the quote, type your search term and click on the “gear”
button at the right side.
Note
To make the next example applicable, make sure that parameter Setup General Application
Parameters tab General Parameters Optimize Part Number Search For Simple Products has its value
set to false. This parameter must be set to true only if you want to search simple products. If this parameter
is turned on, then Cat Matching table search is ommited, and search is only performed against products
table
Example
This example explains how to set up a Quick Config for the product. It also demonstrates this functionality in
action.
Steps for administrator to create a product that will be searchable by Quick Config.
1. 1. Go to SAP CPQ Setup Products and add a new configurable product named: Mercedes Benz w204
C class
2. 2. Define three attributes for this product as follows:
1. attribute Color with four possible values: gray, black, white, red
2. attribute Fuel with two possible values: petrol, diesel
3. attribute Equipment with four possible values: classic, elegance, avantgarde, amg
3. Create a part number as follows: mercedes-c-w204-<*VALUE(Color)*>-<*VALUE(Fuel)*>-
<*VALUE(Equipment)*>.
Note that, this way, you defined a dynamic part number that depends on selected values for three
attributes.
4. Under Current product click on Code Matching item.
Here define a code matching searching string that will be checked during quick config searching
5. Enter matching string as follows: mercedes-c-w204-
Now, when you are done with quick config set up you can see how it works.
In classic design type search term as follows: mercedes-c-w204-gray-diesel-classic. SAP CPQ will check if
there is a product in your list of products that has this particular part number. Since there is no product
with this part number, quick config search begins. In the essence, quick config will check your list of Code
Matching strings to check if any code matching string matches your search term. If it is found (in our
example ”mercedes-c-w204-” code matching string will be found), quick config will then check if the rest of the
search term contains values of product attributes. If it contains, and values are valid (in our example they are),
quick config will redirect you to the Configurator with the product configured according to your search term.
Apparently, you will get the product Mercedes Benz w204 with preselected attributes color, fuel and
equipment. Their preselected values will be gray, diesel and classic, respectively.
Note that there is an assumption that each product that you want quick config to take into consideration,
should have unique part numbers and code matching strings. Also, quick config must find only one product
and configure it if your search term contains the appropriate, valid attrbiute values in the right order as you
defined it in part number field. If the order of attributes is not good, or attribute values provided through the
search term does not fit, then quick config will not be able to find the product and the appropriate message will
be displayed.
If you want to add more than one products to the quote this way, you should use the Add Items in Bulk feature.
Here is an example how to add and configure two different products by using Add Items in Bulk and add them
to the quote.
Let's assume that there is another product named “BMW Serie 3” in our product list and that Code matching
string bmw-e90-3- is defined for that product. Two attributes, color and fuel are defined and part number of
this product is bmw-e90-3-<*VALUE(Color)*>-<*VALUE(Fuel)*>
Go to Add Items in Bulk and type search terms bmw-e90-3-white-petrol and mercedes-c-w204-white-petrol-
elegance and click on validate button.
If you entered valid search term, quick config will find your products and offer you to add them to the quote.
Quick product search on ‘Add Products’ section is used for finding all types of product (simple or configurable)
or favorites by typing any part of its part number, product name or description.
When user enters search criteria, SAP CPQ will look for products that have entered search criteria anywhere in
the part number/name/description, or on the beginning of the word(depends on how application parameter is
set).
When search doesn’t produce any results (both within favorites or products), SAP CPQ will show the messages
for part number search: Auto-complete search didn’t find any products or favorites with this part number. The
same message will be displayed if the appropriate name/description is not found.
When users click on See more results link in the message, SAP CPQ will try to find products by using standard
product search (as if user clicked on the product part number search) in the top right corner of the screen. If
SAP CPQ finds any results, user will be taken to the catalog where results are displayed (in the same way as if
Quick product search from the quote will be controlled with new application parameters, Product Search On
The Quote Can Find Configurable Products and Product Search On The Quote Can Find Product Favorites.
They are set on TRUE by default. If parameter Product Search On The Quote Can Find Configurable Products
is set to TRUE, SAP CPQ will look for configurable products when user starts typing either part number of
name/description (SAP CPQ will look for matching part numbers/names/descriptions in the same way as it
looks for simple products – there will be no reverse configuration done, parsing of descriptions and so on)
If parameter Product Search On The Quote Can Find Product Favorites is set to TRUE, SAP CPQ will look for
favorites when user starts typing either part number of name/description (SAP CPQ will look for matching
part numbers/names/descriptions in the same way as it looks for simple products – there will be no reverse
configuration done, parsing of descriptions etc.) When user clicks on the product, he will be taken to the
product configuration. If user came from the quote (and not from the catalog), breadcrumbs will be different –
Current Quote link will be displayed instead of categories. It is important to note that there will be no products
loading, processing of product rules, description parsing etc. when search results are displayed. This will
happen only when user clicks on the product.
User has entered SAP CPQ and goes to catalog start page. Instead of browsing through categories, user can
start typing product, category or favorite name and find appropriate item. This will reduce the time it takes
for user to find the item that she is looking for – typically users know what they want to quote. This behavior
will be controlled with application parameters: Enable auto-complete product search in catalog by part number
and show part number in results and Enable auto-complete product search in catalog by product description and
show description in results. If those params are set to TRUE, user can choose will search be done via product
part number or product name/description.
User has different search options for categories: Entire catalog (Search is done for entire catalog) and Category
Name specified (Search is done within this category and all its sub-categories and their sub-categories and so
on).
When user clicks on ‘See more results’, they will be taken to the catalog where SAP CPQ will search for the
products in the same way as if user entered part number or name/description in the top right search box (in
top menu) and clicked on Search.
When search doesn’t produce any results (both within product or favorites), SAP CPQ will show following
messages for part number search: Auto-complete search didn’t find any products, categories or favorites with
this part number.
• Configurable product - In this case, user is taken to the product configuration page
• Simple product - View details pop-up is displayed for this simple product
• User has the option to Add to quote. If this is clicked, product is added to the quote and user is taken to the
quote screen (if quote doesn’t exist at this moment, new quote gets created)
• Favorite - By using the same logic as for products, user is either taken to product configuration screen or
product details page is displayed with favorite name and description displayed instead of product name
and description
• Category - User is taken to this category
Custom fields on quote items are able to hold values of different types.
Users are able to edit values of item custom fields in the quote. When administrators add new (or edits
existing) custom field, they are able to administer item custom field:
• Name- This field is required. You cannot save two or more custom fields with the same name
• Label- When you are defining new fields, after you finish typing a name, the label is populated with what
was typed in the Name field.This field is required.
• Type- Once you define the type of the field, it cannot be changed. Five types are available:
• Number - (selected by default). Custom fields of this type can have decimals. They can also have
negative values.
• Date - Custom fields with Date type will be saved in the same way quote custom fields that are dates
are saved (in default format mm/dd/yy).
• Currency - Custom fields of this type are calculated and saved in the same way as other prices in
SAP CPQ (list price, cost, extended amount etc.). Values will be saved in default currency (dollar) and
current market and currency factors will be applied when displaying this value.
• Text - all characters are supported.(When admin is editing existing field, this field is displayed as
read-only)
• Attribute - This type allows you to connect your quote item custom field to an autocomplete attribute
(other attribute types are not supported). This way, in the quote, you get the text box where you can
select the quote item custom field value from the list of attribute values. If you set an attribute of the type
„Auto-complete“ to be connected to your custom field, then in the quote, instead of drop box, you get the
autocomplete text box where you can type a value that you want to assign to your quote item custom field.
As you start typing, autocomplete offers a list of values that either starts with the typed combination of
letters, or contains it. You can also set the value of autocomplete item custom fields via scripting by using
the Value Code property, as explained in Autocomplete Attributes [page 32].
• Order of calculation - This field can accept only numbers. Default number is 10. If admin deletes everything
and clicks on the field, value 10 is saved for the field.
• Calculation Formula - This field will accept standard SAP CPQ tags.
• Display summary in the quote - Default value is FALSE.
• Always include in KO context - When the checkbox is selected, the field is included in the knockout
context and sent to the user's browser. Consequently, you can use the hidden quote item custom field for
processing in responsive templates. (Example: A quote item custom field controls whether a product’s cost
used for calculating the line item’s list price is editable. The field is hidden from quotes as users do not
need to see its value. However, if Always include in KO context is selected, administrators can use the field’s
value when defining the responsive templates to control whether the list item’s price is editable or not.)
• Contains Personally Identifiable Information - All information that could potentially be used to identify an
individual should be flagged as PII.
Note
If a quote item custom field is not visible on the quote layout, and the Always include in KO context is
selected, the field value will be visible in the hiddenValues observable array. To retrieve the field value, use
getHiddenValue(“QICF_Name”). If a field does not exist, the function returns FALSE. The function does not
have to contain the complete name of a quote item custom field. You can enter only a part of the name and
the system will find the first field whose name starts with the defined string and it will return its value.
Example
Log into SAP CPQ as an administrator and go to Setup. You need to create a new attribute of type Auto-
complete, and then select it as an underlying for your custom field. If you need instructions on how to create an
Auto-complete attribute, take a look at Autocomplete Attributes [page 32].
Once you have created the attribute, you want to create new Quote Item Custom Field by going to Setup
Quotes Quote Item Custom Fields and clicking on Add New button.
Fill out Name field, select Attribute from the Type dropdown list and select the particular attribute (that you
have previously created). Click Save.
In order to be able to see your newly created Quote Item Custom Field, you need to do three things:
More information on how to add the custom field to the appropriate permission group is available on this link -
Quote layout permissions [page 394]
More information on how to move the custom field to the list of visible fields is available on this link - Visible
fields [page 394].
Also, you will have to insert a translation for your custom field into SAP CPQ dictionary. You can find more
information on how to achieve this by following next link - Creating Custom Dictionary [page 703]
Now, your Quote Item Custom Field is set up. To see how it works, go to catalog and create a new quote. Your
custom field is displayed in the quote as a column and you are able to select a value for it.
Once you define the type of the field, it cannot be modified. (When admin is editing existing field, this field is
displayed as read-only)
Order of calculation - This field can accept only numbers. Default number is 10. If admin deletes everything and
clicks on the field, value 10 is saved for the field.
Calculation Formula - This field will accept standard SAP CPQ tags.
If certain field is found among quote editable fields (found in Editable Field group), it will be displayed as every
other editable field. When developing this template in xslt, we should make an effort to make it as easier as
possible for the admin to show item custom fields in the quote. When user clicks to edit currency item field, it
will be displayed as every other price field on the quote. When user edits number field, it will be displayed in
the same way other numbers (e.g. Quantity) are displayed on the quote. After user changes value for particular
field, SAP CPQ will display icon indication that currently displayed value is different from default value (default
value is calculated every time other quote item custom fields are calculated). This icon will be displayed only if
default value is not empty (if it is empty and user entered something in the field, no icon will be displayed).
Note
Quote item custom fields are created and evaluated once quote items have been created, so they should
not be used in any item calculation, including item discount, multiplier, etc. Additionally, they should not be
used in any item information, including information regarding the product or attribute, such as description,
part number, price, cost, among others. That said, it is possible to use quote item custom fields in item
calculations or item information – but this can be carried out only with a Reconfigure action which can
negatively affect system performance. For this reason, it is not recommended.
SAP CPQ will execute calculation only if any of the data used by the quote has been changed. For example,
if the entered value of a particular custom field was 100, and has remained 100 following any changes, the
calculation will not be executed.
• CurrentItem:
• <*CTX(Quote.CurrentItem.CustomField(“CustomFieldName”) )*>
• Total:
• <*CTX(Quote.Total.ItemCustomField(“CustomFieldName”).Summary )*>
• <*CTX(Quote.Total.ItemCustomField(“CustomFieldName”).Maximum )*>
• <*CTX(Quote.Total.ItemCustomField(“CustomFieldName”).Minimum )*>
• <*CTX(Quote.Total.ItemCustomField(“CustomFieldName”).Count )*>
• Rolled-Up Items:
• <*CTX(Quote.CurrentItem.RolledUpItemCustomField(“CustomFieldName”).Summary )*
>
• <*CTX(Quote.CurrentItem.RolledUpItemCustomField(“CustomFieldName”).Minimum )*
>
• <*CTX(Quote.CurrentItem.RolledUpItemCustomField(“CustomFieldName”).Maximum )*
>
This functionality enables system administrators, and selected users, to personalize their shopping cart/quote.
This functionality is available in Responsive Design only.
To use Quote Layout, open Setup UI Design Quote Layout . Once you complete this entry, a page
comprising Quote Columns and Quote Sections will open up.
The Available Columns list box contains all available quote columns. From this list, admins can choose which
columns they will be displayed in the quote. Admins can use left and right arrows to move selected columns
from an Available Columns list box to the Selected Columns list box.
The Available Selections list box contains all available sections. From this list, admins can choose which
sections they will be displayed in the quote. Admins can use left and right arrows to move selected columns
from an Available Selections list box to the Selected Sections list box.
The administrator will be able to set permissions for layout based on permission groups. She/he will be able to
set which columns/sections will be allowed to chosen permission group.
Quote Layout Permissions enables administrators to set permissions for the quote layout based on permission
groups. To determine which columns and sections will be allowed to which permission groups, go to Setup
Quotes Quote Layout Permissions. Once you click Add New you will be redirected to the Quote Layout
Permissions page where you can select which column/sections will be open to which permission group.
On this page you will be able to define one permission group that will be allowed to see Quote sections/
columns. You will be able to find this permission group from a list of User Types, Companies, Brands and
Manually Created Groups.
The permission group Visible to Everyone will be added by default. This permission group contains all
permission groups and cannot be deleted.
User Side
Users will be able to set their own Quote Layout and change behavior set for their permission group. This is
done on the User Quote Layout entry on the User Page menu. Once you click this link, a page will open up where
you will see:
• Quote columns
• Quote sections
The Available Columns and Available Sections: only columns and sections selected for the user’s permission
group will be displayed in the Available Columns and Available Selections lists. Selected columns will be
populated based on the selection in the Quote Layout Permission. Users can override this by hiding columns
When Display summary in the quote is checked on the Quote Item Custom Field in Quotes in Setup: related data
should appear in Total Summary and Totals in the quote if the field is selected in Quote Layout in Setup and on
the User Side.
Note
Note that the value entered in the Type field must be Number or Currency. The system will not recognize
the Text value type.
Before viewing your Quote Item Custom Field in the quote, don’t forget to add your it to the appropriate Quote
Layout Permission Group and Quote Layout.
Related Information
Quote Troubleshooting
A quote revision is a copy of the quote from which the revision was created.
You can create as many revisions as needed and they do not have to be directly sourced from the master quote.
All revisions with a common master quote have the same quote composite number.
When you create a quote revision, all the data from the source revision will be copied to the new revision. All the
subsequent changes will not be propagated from the source quote to the revision and vice versa.
Quote revisions allow sales representatives to create multiple quote versions before the final agreement on
the offer is reached. Additionally, they can track how the offer changed over time by accessing the revisions’
history.
Example
A sales representative John is creating a quote for a family looking to refurnish their kitchen. The family wishes
to buy a table and a cupboard, so John creates a quote for the pieces that fit into their budget. Additionally,
John creates a quote revision and adds a set of chairs that match the design of the table and the cupboard.
The family likes the new offer but they think the price is a bit out of their range. John creates a new revision,
changes the discount and sets the revision as active. From there on, the revision will go through the approval
process and if the revision gets approved and the family accepts the offer, the deal will be closed. If new
changes to the offer are needed, John will create new revisions accordingly.
Setup Prerequisites
Handling quote revisions is completely on the user side of SAP CPQ, and other than the workflow settings, no
other adjustments need to be made by administrators.
First, you need to allow the user type to access the revisions-related actions. In Workflow/Approval
Workflow Permissions , allow the user type to access these actions:
• Edit
• View
• Delete
• New Active Revision
• New Revision
• History
• Set Active
Also, in Workflow/Approval Workflow , add the actions to the quote status. Secondly, in General
Application Parameters , find the parameter Available actions for Inactive Revisions and select one of these
values:
Note
If you delete an active quote revision, it's pertaining master quote and all related revisions will be deleted as
well.
Application Parameters
• Reset Quote Expiration Date on New Revision - if set to TRUE, the system resets the expiration date of every
new revision. The parameter is supported by both Quote 1.0 and Quote 2.0.
• Copy Opportunity Id On New Revision - if set to TRUE, opportunity Id is copied to every new revision of the
quote. Supported only by Quote 1.0.
Context
There are several default quote tabs which enable you to access and edit billing and shipping information,
upload files to a quote and so on. You can also add new tabs if needed.
Quote tabs can only be created after general tabs [page 701] are created. To create a quote tab:
Procedure
The Tab Name dropdown list shows all existing general tabs, including the ones you created.
Note
If you've created multiple quote custom tabs with the same implementation file before the 2208
release, the settings will stay unchanged after the release. However, you won’t be able to edit the
tabs with the same implementation file unless you first select different files.
• /quotation/ShippingInfo.aspx
• /quotation/ResponsAbilityCollaboration.aspx
• /quotation/OrderConfirmation.aspx
• /quotation/Opportunity.aspx
• /quotation/CustomPage.aspx
• /quotation/Cart.aspx
• /quotation/Attachments.aspx
• IFrame: when selected, you can develop custom logic on your own, or connect your tab to a custom
page you have developed. For example, you can create a new quote tab that will display key attributes.
For more information on creating custom logic for retrieving and displaying key attributes, refer to this
page [page 615].
5. Enter the rank in the Rank field.
6. Click Save.
The page where all the custom tabs are listed is displayed.
When a quote tab is created, it will be visible on the quote. You can manage the visibility of the quote tabs
on the Quote Tab Permissions [page 359] page.
Renewal of product and services is one of the key business operations in many industries, especially in Service
oriented industry.
Note
This feature is currently available only in Responsive Design and for the Quote 1.0 engine. There is an
improved Renewal Management feature that is available only for Quote 2.0 in the integration with SAP
Billing and Revenue Innovation Management.
Products or services sold to some client are usually recorded in external system, (e.g. CRM) in the form
of “Assets”. Assets provide details on the existing products/services that Customer is using, like Product
name, Price, Install date, Usage end date, etc. All information contained in the “Assets” is usually sufficient to
understand when and what should be renewed for particular Customer.
SAP CPQ offers its own renewal process, so all assets can be stored locally. On this page, you will find more
information on how to set up a Renewal Process in SAP CPQ, and how to utilize it.
The first step in creating and enabling Renewal Process is to create an Asset table. This table is going to be
used to store details on each asset created in your SAP CPQ environment. Note that you can define only one
Asset table.
To create Asset table, log into SAP CPQ as an administrator and go to Setup Renewal Administration
Define Asset Table
There is a list of available fields, list of selected fields and a list of fields that you want to be visible
on UI. Note that in column Selected Fields, some fields are pre-selected and you cannot deselect them.
You can add more available fields, or create new custom columns and add them. Once you define
a list of visible columns, you can proceed by clicking on Save button. Your asset table is created.
While you are using SAP CPQ, the asset table can be accessed anytime, since the link to the Asset
When you sell a product or service to some customer, you have the option to create an Asset. Later, when you
want to resell the asset to the client, you can go to your list of assets, pick the desired asset and add it to the
quote (renew the asset). Depending on how you setup your Renewal Process, once the quote is completed,
either existing asset is going to be updated, or new asset is going to be created.
You define the phase when the asset is to be created through Workflow. There is an action named Create Asset
that can be set in workflow as a post action for some quote status (e.g. Quote Won status), that will trigger
automatically.
• Purchased – Meaning that the asset is added to the asset table after the quote is completed
• Pending – Meaning that the asset is added to the new quote which is not yet completed
• Renewed – Meaning that the asset is renewed (Update Asset option is not checked), and new asset is
created from it
• Obsolete – Meaning that the asset is linked to inactive product version
In the next section, you will read some details on how to setup your Renewal Process.
This is the action which creates Assets for you. To find and set up the action, go to Setup Workflow/
Approval Actions , and find action Create Asset from the list of actions. Click on edit icon.
The purpose of this action is to record products from the quote into the Asset Table. On edit page of the action
you can set conditions under which the action will be performed.
You may decide that only particular user group(s) should be able to perform Asset renewal. You can set up
this by setting action condition and/or workflow permissions. Action could be attached to the quote status,
and once the quote reaches the desired status (e.g. Closed/Won), the Main Line Items along with the product
configuration will be automatically recorded in the Asset Table.
Two options are available to control product behavior in the renewal process (Update Asset and Always Allow
Renewal). They can be found in the Additional Product Data section under Setup Products Product
Definition .
Update Assets
If this option is selected, then when Create Asset action is triggered, the existing asset is updated. It changes
status from Purchased to Pending. In the contrary, if this option is not selected, then the existing asset changes
its status to Renewed, and the new version of the asset with status Purchased is created (recorded in Asset
table).
If this option is selected, it will be possible to renew assets in the obsolete status. Those are assets that have
underlying product with an inactive product version.
Renewal management fully supports complex product configurations, including configurable products and
parent-child product configurations. When the user adds a configurable product from the asset table into the
quote, the entire configuration that was initially sold to the customer will be automatically added into the
quote. All line items from the parent-child configuration will be independently recorded as separate assets into
Note
Example
In this example, we will show you the life cycle of the asset and how the renewal process works. We have a
configurable product named „Hosted email“. We want to sell this product and also to have an asset once it is
sold.
Earlier, we have configured our workflow in the way that our action „Create Asset“ triggers as a post action on
the quote status „Quote Won“.
The quote is in status Open. We worked on the quote, entered billing and shipping information, generated
quote, and finally completed quote (meaning that quote is now moved to status „Quote Won“).
By completing the quote, action „Create Asset“ is triggered, since, previously it has been set as a post action.
Since action is triggered, our asset is recorded and we are able to find it in our Asset table (list of assets).
Assuming that we want to resell „Hosted email“ product to the same client, configured exactly the same, we
can select the asset in our Asset table and click on Renew button above asset table.
Note that only assets that are in „Purchased“ status can be renewed. Therefor, we are not able to select our
assets yet, since the quote is not yet completed.
Now, we go to the quote, and update quantity field from 10 to 15, and complete the quote. Since the quote is
completed, action „Create Asset“ is triggered one more time.
Since the option „Update Asset“ is selected for our product, our asset is updated with new values (quantity is
now 15), and it moved to „Purchased“ status again.
If the option „Update Asset“ was not selected, then our previous asset would have gotten status „Renewed“,
and a brand new asset would had been created with status „Purchased“.
Now, if we go to product setup and make a product version 1 inactive, and option „Always Allow Renewal“ is not
selected, our asset will be in status „obsolete“.
But, if you select option „Always Allow Renewal“, then asset will be in „Purchased“ status and therefore
renewable.
This feature gives users a Reports and Dashboards Overview Page that includes a list of existing reports in the
system. As an SAP CPQ administrator, you can search reports and executed different actions on them.
Here is a list of all actions available on each report: edit, clone, view, and delete.
A Delete button is located at the top right corner. Administrators can select several report actions and delete
reports in bulk. This enables administrators to avoid having to delete one by one. To create a new report click
New Report and to create a new dashboard, click New Dashboard. The list on the left contains all existing labels
created by admins users. Labels help admin users organize reports into categories. Administrators can add
more than one label to a report, which makes it easier to find a report when searching for it.
Labels help administrators organize reports or dashboards into any category. Labels do all the work that
folders do, but with an added bonus: more than one label can be applied to a report or dashboard.
By selecting a particular label, you can filter out items contained only in that label in which case the active label
will be marked red. You can reset the label selection by clicking the root node Labels view all items.
When viewing reports, you can tick the checkbox next to the reports, click Labels, and click the label you want
to associate with the report(s). You can also check the boxes next to several labels and click Apply.
To manage labels, you must locate one of the existing labels on the left-hand side and click it. When you
right-click it, it will open a context menu with the following actions: add, rename and delete.
Labels can be added as a sub folder of a root label, or as a sub folder of existing labels. You can also rename the
label as well as delete it.
The sub-label can be created below a label that already exists by selecting which label you would like to place
it under. Then click Add Label in the context menu. The hierarchy can also be changed by moving nodes using
drag and drop.
Create New
When you click New, you can choose to create the following: report, dashboard, and predefined report.
You can also create a new report using the Report Wizard. To do so, you must choose New Report to go to
Report Wizard.
The first step of the Report Wizard contains the following fields:
The Report data source field contains a list of views/tables or stored procedures that were configured to be
a possible source of data for this report. All tables/view and queries that are created in the Report module
administration will be listed when creating a new report. You will also be able to create a data source, which
can be done in the administration section of the Report module. Report Type supports three types of reports:
Table, Chart and Gauge. Depending on the selected report type, you will have different screens for entering the
remaining information needed to complete the report creation process.
In the Cache Frequency dropdown, you can select the frequency for refreshing the report results, for each
report type. For example, if you select daily frequency, the system will cache the report results, and then, after
one day, it will refresh the report and show the latest results.
A report module enables report creators to add custom filter conditions, to group and organize them and
to provide report parameters (called dynamics and dynamic inputs). This will allow end users to provide
additional data for retrieving records from the data source and displaying them on the report.
You can add a filter condition for any of the available fields from the selected data source by choosing a value
from the Select drop-down list.
The default option for any of the new conditions is a predefined value. A predefined value is used to filter
records from the data source and it cannot be changed when executing the report.
Report Filtering
Creating filters lets you narrow down the data contained in the data source used for the report. A data source
can be used in multiple reports, but the filtering criteria is specific for the report in which it was created.
• set the maximum number of results that will be displayed after the filter is applied. If this number is lower
then the number of records retrieved from the database, the system won't be able to run the report and the
following error message will be displayed: An error occurred while processing your request.
• choose how fields are sorted.
• set the logic between multiple filtering groups (And and Or).
• add multiple filters in filtering groups.
• clear the defined queries.
In the central part of the page, you define the actual filtering conditions by selecting the values in three
dropdowns:
1. Select the column from the data source used in the report that should be filtered.
2. Select the logical operator (equals, Is empty, Ends with, and so on).
3. Select the condition type:
• L - Literal – filters one specific entry. For example, if you are filtering users by their username, you can
enter a username here.
• @ - Parameter – name of the field used as a search field in the next step. For example, if you’ve
selected the data source column with usernames in the first step, you can name the parameter
Username and apply the filter. The system will show all users in the system and in the User field you
can enter the username of one specific user.
• C – Context – conditions that filter users dynamically. Available conditions are $UserId and
$UserName.
Dynamic Conditions
Dynamic or context conditions allow filtering users by the ID and the first and last name of the logged in user.
The advantage of using dynamic over other conditions is that when a dynamic condition is applied, different
users can run the same query report and they get the results for their respective users. Unlike the literal and
parameter conditions which return values for one specific user.
For example, you can combine the dynamic conditions with other conditions to get a list of all quotes that
pertain to the logged in user.
The following dynamic conditions are available in the Report Module for SAP CPQ:
• $UserId – searches for a user whose ID is the same as the ID of the logged in user.
• $UserName – searches for a user whose first and last name match the first and last name of the logged in
user.
Grouping Conditions
With grouping, a report creator can organize existing conditions in a hierarchical way and connect them with
either AND or OR logical operator. This new group section can contain any number of simple conditions or child
groups. You can change the position of the simple element or group using a drag and drop functionality.
While we don't recommended it, it is possible to nest an unlimited number of subgroups within any group of
conditions. A logical operator for a group can be changed from AND to OR and vice versa by clicking a toggle
button in the group header which shows the current logical operator. You can collapse and expand a group and
unigroup's conditions at any point, as well as delete a group.
The Tabular Report Type contains one step that must be completed in order to add the information needed for
the generation of this report type. You must choose what fields will be included in the report and decide if you
want to create a row or column groups. You can make the selection by dragging and dropping the fields from
the area “Available fields” to areas, such as “Row Groups”, “Column Groups” or “Values.”
The Chart Report Type Page provides many different types of charts. As an administrator, you can choose bars,
pies, columns and other graphic types.
Fields for a chart report are selected in the same way as fields for a tabular report type.
The Report Viewer Page contains the report and, alternatively, report parameters defined using dynamic input
fields created in the Report Criteria page. Based on the report filter definition, some fields can be made
mandatory or can use existing lookup views as the data source for selection.
Microsoft Report Viewer Control is used for report rendering on the page. It contains standard controls for
paging, searching and exporting (pdf, excel, word).
A Report Viewer Page may contain several tabs for faster updating of the report definition or report filter
definition on the left-hand side: Report, Criteria Definition, and Report Definition.
Based on the report type a report view page can contain additional control with parameters related to the
current report. Chart types reports can be changed inline. This inline change is temporary and allows end-users
without administrative permissions to change parts of report layouts, as well as export such reports.
When you click Administration Data Source , the list of all data sources (table/query/view) is displayed.
You can create a new data source and when you click Add, the following fields are displayed: display name,
type, and name.
All fields are required. When Table or View is chosen, a list of all tables and views will be displayed, with an
administrator able to choose a desired table/view.
If Query is chosen, a field in which a SQL query should be written will be displayed.
Lookup Fields
Creating a lookup field can help improve the efficiency of the data entry process. The fields that are candidates
for lookup are usually the ones which are foreign keys. Let’s say that in a table called “Activity” we have a
“UserId” column, and we want to allow users a simple way of entering a value for this field when defining the
report filter. You can enter a value, but usually this information is hard to remember and prone to errors. Report
module allows end users to define what data sources can be used as lookup sources.
The first step is to enter a new data source and choose a User table.
The second step is to open another data source and locate an “uid” column from this source. When you open
a detail view of that column you will see a new field called “Lookup.” This drop down will now contain a “Users”
data source previously defined as lookup.
Instead of numeric control, the new lookup control will be displayed on a report filter page when once you
choose this column. This control is more advanced and contains one label and two buttons.
When you click the first button a window with advanced grid control will pop up. It will include search, paging
and a sorting functionality. At this point, you can make your selection by double-clicking a row in the grid, or by
selecting a row and then clicking OK.
The Grid Control will contain only those columns that we chose in the Display Name field. Once you select an
item from the grid, a label will contain the Display Name.
The Report Module supports adding RDL report templates which can define a standard layout for various
reports, such as defining the standard header and footer section on all reports. This RDL template file is
a standard RDL report, created using a Microsoft Report Viewer, Visual Studio or some other tool. An RDL
template can be any valid report definition file containing a placeholder element. This can be rectangle element
named “Report”. This rectangle element will define the actual size and position, so you can specify how much
space is allowed for a table, chart or gauge.
The Lookup Control used for report template selection also contains a preview functionality which enables you
to see the preview of the RDL Template. We recommended that the RDL template creator puts a visible border
on a rectangle placeholder so that a report creator can see its position and the dimension before generating a
report with a selected template. The placeholder border will be removed once the report is generated, so it is
used only for preview purposes.
New templates can easily be uploaded on the same control, by clicking the Add button.
Dashboards give you a bigger overview by displaying summaries of different reports as widgets on a single
page. With a dashboard, you can monitor more reports at once. A list of existing dashboards can be found on
the “Reports and Dashboards Overview Page” where you can easily find or create a new dashboard.
You can insert am existing report or frame in each widget on the dashboard page. You can choose to insert a
chart type report or a tabular report in iframe. To do so, you must specify the format type that will be used for
this report (pdf or image).
Internationalization and localization are supported in Report Module. The Application Client of Report Module
can specify culture and language which should be used. Appropriate Date, Time and Numeric Formats are
applied based on the culture used.
Adding New Languages is also supported in the administration part of Report Module. Import and export of
existing data enables you to edit translation in Excel and then easily upload it back onto the server.
User Side
When you click the Graphic Reports page, you will be redirected to the page where all reports visible to users
will be displayed in the iFrame. Users will be able to run/view reports on the User Page. All reports that are
visible to a user's permission group, will be displayed on this page. Default reports will be visible to users as
well. If the user is an SAP CPQ administrator, he or she will be able to view/run all default reports. But if the
user is not an SAP CPQ administrator, the user will be able to run only the context reports with associated him
or her.
Listed here are the standard quote fields that are present in the quote by default.
Market The market selected for the currently open quote, with a
defined currency, market factor, and pricebooks.
Pricebook The pricebook selected for the currently open quote, which
contains defined product prices.
Date Created The date when the currently open quote was created.
Date Modified The last time the currently open quote was modified.
Effective Date The date that determines which prices are displayed for
items in the quote, depending on the period for which the
selected pricebook entries are valid.
Cart Comment The field that allows users to leave comments on the quote.
The fields described in this table are standard quote item, product type, and total fields in the quote.
NRC Discount Percent The percentage discount that is given Item.DiscountPercent = 100 * Item.Dis
to the list price of the product. countAmount / Item.ListPrice
MRC Discount Percent The percentage discount that is given Item.MrcDiscountPercent = 100
to the MRC list price of the product on * Item.MrcDiscountAmount /
recurring basis. Item.MrcListPrice
NRC Extended List Price The list price of a product multiplied Item.ExtendedListPrice = Item.ListPrice
with its quantity. * Item.Quantity
MRC Extended List Price The MRC list price of a product multi Item.MrcExtendedListPrice =
plied with its quantity. Item.MrcListPrice * Item.Quantity
NRC Discount Amount The amount that is discounted from the Item.DiscountAmount = Item.ListPrice
list price of the product. * Item.Quantity * Item.DiscountPer
cent / 100
MRC Discount Amount The amount that is discounted from the Item.MrcDiscountAmount =
list price of the product on recurring ba Item.MrcListPrice * Item.MrcDiscount
sis. Percent / 100
NRC Net Price The value that customers pay to the item.NetPrice = item.ListPrice * (1 -
seller after discounts are subtracted item.DiscountPercent / 100)
from the list price.
MRC Net Price The value that customers pay to the Item.MrcNetPrice = Item.MrcListPrice -
seller after all discounts are subtracted Item.MrcDiscountAmount
from the list price on recurring basis.
NRC Manufactures Gross Margin The net revenue that the seller retains Item.GrossMarginPercent = 100 *
after deducing the costs of producing a (Item.ExtendedAmount - Item.Exten
product from the product's net price. dedCost) / Item.ExtendedAmount
MRC Manufactures Gross Margin The net revenue that the seller retains Item.MrcGrossMarginPercent = 100
after deducing the costs of producing a * (Item.MrcExtendedAmount -
product from the product's net price on Item.MrcExtendedCost) / MrcExtende
recurring basis. dAmount
NRC Rolled Up Gross Margin Percent The sum of percentage gross margin of Item.RolledUpGrossMarginPercent =
all child items. 100 * (Item.RolledUpExtendedA
mount - Item.RolledUpExtendedCost) /
Item.RolledUpExtendedAmount
MRC Rolled Up Gross Margin Percent The sum of percentage gross margin of Item.RolledUpMrcGrossMarginPercent
all child items on recurring basis. = 100 * (Item.RolledUpMrcExtende
dAmount - Item.RolledUpMrcExten
dedCost) / Item.RolledUpMrcExtende
dAmount
NRC Rolled Up Discount Percent The sum of discount percent of all child Item.RolledUpDiscountPercent = 100
items. * Item.RolledUpDiscountAmount /
Item.RolledUpListPrice
NRC Rolled Up List Price The sum of list price of all child items. NA
NRC Rolled Up Extended List Price The sum of extended list price of all Item.RolledUpExtendedListPrice =
child items. Item.RolledUpListPrice * Item.Quantity
NRC Rolled Up Extended Amount The sum of extended amount of all child Item.RolledUpExtendedAmount =
items. Item.RolledUpNetPrice * Item.Quantity
NRC Rolled Up Extended Cost The sum of extended cost of all child item.RolledUpExtendedCost =
items. item.RolledUpCost * item.Quantity
NRC Rolled Up Discount Amount The sum of discount amount of all child Item.RolledUpDiscountAmount =
items. Item.RolledUpListPrice * Item.Quantity
* Item.RolledUpDiscountPercent / 100
NRC Rolled Up Net Price The sum of net price of all child items. item.RolledUpNetPrice = item.RolledU
pListPrice * (1 - item.RolledUpDiscount
Percent / 100)
MRC Rolled Up Discount Percent The sum of discount percent of all child Item.RolledUpMrcDiscountPercent =
items on recurring basis. 100 * Item.RolledUpMrcDiscountA
mount / Item.RolledUpMrcListPrice
MRC Rolled Up List Price The sum of list price of all child items on NA
recurring basis.
MRC Rolled Up Extended List Price The sum of extended list price of all Item.RolledUpMrcExtendedListPrice
child items on recurring basis. = Item.RolledUpMrcListPrice *
Item.Quantity
MRC Rolled Up Extended Amount The sum of extended amount of all child Item.RolledUpMrcExtendedAmount
items on recurring basis. = Item.RolledUpMrcNetPrice *
Item.Quantity
MRC Rolled Up Extended Cost The sum of extended cost of all child Item.RolledUpMrcExtendedCost =
items on recurring basis. Item.RolledUpMrcCost * Item.Quantity
MRC Rolled Up Discount Amount The sum of discount amount of all child Item.RolledUpMrcDiscountAmount =
items on recurring basis. Item.RolledUpMrcListPrice * Item.Roll
edUpMrcDiscountPercent / 100
MRC Rolled Up Net Price The sum of net price of all child items Item.RolledUpMrcNetPrice = Item.Roll
on recurring basis. edUpMrcListPrice - Item.RolledUpMrc
DiscountAmount
Product Type NRC Discount Percent The percentage discount that is given ProductType.DiscountPercent = 100
to the product type and applied to the * ProductType.DiscountAmount / Pro
list price of each product of the same ductType.ListPrice
type.
Product Type MRC Discount Percent The percentage discount that is given ProductType.MrcDiscountPercent =
to the product type on recurring basis ProductType.MrcDiscountAmount /
and applied to the list price of each ProductType.MrcListPrice
product of the same type.
Product Type NRC Discount Amount The amount that is discounted from the ProductType.DiscountAmount = Pro
list price of the product type and each ductType.ListPrice - ProductType.Net
product separately. Price
Product Type MRC Discount Amount The amount that is discounted from the ProductType.MrcDiscountAmount =
list price of the product type and each ProductType.MrcListPrice - Product
product separately on recurring basis. Type.MrcNetPrice
Product Type NRC Extended Amount The total extended amount of all prod NA
ucts in that product type.
Product Type MRC Extended Amount The total MRC extended amount of all NA
products in that product type.
Product Type NRC Extended List Price The total extended list price of all prod NA
ucts in that product type.
Product Type MRC Extended List Price The total MRC extended list price of all NA
products in that product type.
Product Type NRC Manufactures Gross The total NRC Manufactures Gross ProductType.GrossMarginPercent =
Margin Margin of all products in that product 100 * (ProductType.NetPrice - Product
type. Type.Cost) / ProductType.NetPrice
Product Type MRC Manufactures Gross The total MRC Manufactures Gross ProductType.MrcGrossMarginPercent
Margin Margin of all products in that product = 100 * (ProductType.MrcNetPrice
type. - ProductType.MrcCost) / Product
Type.MrcNetPrice
Item Total NRC Extended Amount The total extended amount of all items Totals.Amount = Totals.NetPrice
in the quote.
Item Total MRC Extended Amount The total MRC extended amount of all Totals.MrcAmount = Totals.MrcNet
items in the quote. Price
Item Total NRC Discount Percent The total discount percent of all items 100 * Total Product Discount Amount /
in the quote. Total List Price
Item Total MRC Discount Percent The total MRC discount percent of all 100 * Total MRC Product Discount
items in the quote. Amount / Total MRC List Price
Item Total NRC Discount Amount The total discount amount of all items Totals.ProductDiscountAmount = To
in the quote. tals.ListPrice - Totals.NetPrice
Item Total MRC Discount Amount The MRC total discount amount of all Totals.MrcProductDiscountAmount =
items in the quote. Totals.MrcListPrice - Totals.MrcNet
Price
Item Total NRC Extended Cost The total extended cost of all items in NA
the quote.
Item Total MRC Extended Cost The total MRC extended cost of all NA
items in the quote.
Item Total NRC Extended List Price The total extended list price of all items NA
in the quote.
Item Total MRC Extended List Price The total MRC extended list price of all NA
items in the quote.
Item Total NRC Manufactures Gross The total manufactures gross margin of Totals.NrcGrossMarginPercent = 100 *
Margin all items in the quote. (Totals.NrcNetPrice - Totals.NrcCost) /
Totals.NrcNetPrice
Item Total MRC Manufactures Gross The total MRC manufactures gross Totals.MrcGrossMarginPercent = 100 *
Margin margin of all items in the quote. (Totals.MrcNetPrice - Totals.MrcCost) /
Totals.MrcNetPrice
Deleting quotes from the list of quotes only removes them from the user interface (doesn't delete them from
the system) and marks them for a scheduled automatic deletion (soft delete).
The automatic deletion job is scheduled at 00:00 UTC each day, so quotes marked for deletion since the
last scheduled job will be removed from the system during the first following scheduled deletion. The deletion
is scheduled automatically, always at the same time, and it doesn't require any setup nor any action by the
administrator.
Between the time when you removed the quote from the list of quotes and the time when it is deleted from the
system (the automatic deletion is triggered), you can't delete the objects referenced in that quote because the
system considers that they are referenced in a quote that still exists in the system. After the quote is deleted
from the system, you'll be able to delete the related objects.
Errors that occur during the scheduled quote deletion are recorded in the Log.
Related Information
Quote 1.0 does not support parallel work on quotes. This means that only one user at a time can edit a quote.
Although the system won’t disable editing if there are multiple users, users should avoid making any changes
as that will cause errors and wrong values.
If there are multiple users working on the same quote, you can set up an alert to display on the quote and
inform users of the parallel work. The alert is administered via two application parameters:
• Alert users about simultaneous work on the same quote – defines whether users are informed that there
are other users that have recently opened the same quote. Also, administrators can use this parameter to
define whether the alert displays as a message in the top of the quote or as a pop-up after opening the
quote. By default, there will be an alert displaying in the top of the quote.
• Time out limit for inactive users in simultaneous work – when a user opens a quote in parallel with another
user, after the time period defined in this parameter passes, the system no longer considers that the user
is working on the quote and the user’s name won’t be displayed in the parallel work alert on the quote. This
parameter is applicable only when there are multiple users working on the same quote in parallel.
6.1 Workflow
After defining statuses, the administrator needs to define the actions that will change the quote/order status.
For example, a desired behavior may be to change quote status from Open to Order Placed if a user clicks on
the Place Order button. There are three states in the workflow actions. Each relates to a tab on the load quote
page.
• My Quotes - (available for all users) My Quotes tab displays all quotes that the currently logged in user
created. This will likely be the most robust workflow as it is how each user interacts with their quotes.
Note
Although some users might be marked as "inactive" in administration, their quotes are still visible, and they
might appear to some users on the "other quotes" tab.
The relationships between statuses and actions are specified through the Workflow Actions section of the
administration. This section is invoked by clicking on the Workflow Actions link under Workflow/Approval admin
menu.
The default view of the Workflow Actions section is the Table View. This displays the workflow in a grid pattern.
The table view is very efficient for defining workflow actions because it offers fewer mouse clicks and a table
that shows all defined actions on one screen. The left side of the table contains Pre-Action (Start) Statuses and
the top of the table contains Post-Action (End) Statuses. The list of actions in each intersecting square specifies
which actions will change the status listed all the way on the left side to the status listed all the way on the top.
For example, if a user clicks on Place Order while the quote is Open, the quote status will be changed to Order
Placed.
Alternatively you can view the workflow in a List View. This lists each start and end status along with the tab,
action name, conditions, pre actions, post actions and notifications. The List View is particularly useful for
viewing which actions have conditions, notifications, pre actions, and/or post actions defined. It also allows
you to quickly copy, delete, edit, and search for a workflow event. In this chapter we will discuss workflow
administration using the Table View.
Note
The status transitions with no actions defined have the sign. The status transitions with actions already
defined have the sign. When actions are already defined, click the sign to view the actions.
You can also click Expand All to view all defined actions, or click the [+] sign in each row or column to show all
defined actions in the row or column respectively.
Status relations can be defined, not only for User's own Quotes (My Quotes), but for Quotes assigned to the
user for approval (Waiting for approval), and for Other Quotes (for the users allowed to see quotes logged
by other users). To switch between My Quotes, Waiting for Approval and Other Quotes areas, select the
corresponding tab at the top left corner of the table. Consequently, status relationships can be defined for any
one or all three from this screen. The active status area has the same background color as the top border of the
table.
The following shows the Workflow Actions table for SMB computer store with the Open (start) row expanded:
On the user side, adding an item to quote creates a quote and sets the status to open (or whatever status is set
as the default). A first set of actions are visible from the quotation tab.
In the My Quotes tab under Existing Quotes on the user side, another set of actions are visible to the customer.
Editing a workflow event/intersection displays the status administration page where you can add and remove
actions for that workflow event/intersection. At the top of the page the Start Status is given and the End Status
is given.
Note
Next to the actions are buttons that will allow further tailoring. The following are available for each action:
• Automatic Reconfigure - Automatic configuration determines if the items in the quote use their initial
product rules and pricing (the product rules and prices used when the quote was generated) or if the
items in the quote need to be reconfigured (updated using the current product). Selecting the Automatic
Reconfigure checkbox adds a suffix of R to that action, like Copy-R, or Edit-R which means that the item
would be revised or reconfigured using the current rules and pricing every time the action is used.
Unchecking the Automatic Reconfigure checkbox ensures that the items in the quote keep the original
rules and pricing used at the time the item was added to the quote.
• Perform On - Will either be Cart or Cart Item. Cart Item actions are generally action buttons visible in the
Quotation tab, while Cart actions are generally actions performed on the quote from the load quote page.
• Condition - Allows a check to be performed to determine whether or not the action will be available.
• Notification - Gives the ability to send out email notifications when the action is performed.
• PreAction/PostAction - Custom actions can be done before or after the action is completed. Commonly
this is used for CRM actions such as Create/Update Account or Contact.
Note
Users will be unable to use the actions defined unless they have been given permission to see the actions.
This is defined in Workflow Permissions [page 421].
Next to option for switching views, there are two more options: to copy workflow (since there are three
workflow tabs sometimes it can be usefull to copy the workflow from one to another) and clear workflow.
Upgrade to New Product Version – when a product has a newer version than the one that is already in a quote,
and something is changed in the quote while this check box is selected, users will be prompted to update
products to newer versions, or products will be upgraded automatically.
When the action is triggered, a popup window with a progress indicator displays and shows how many of the
total number of items have been upgraded.
Note
To ensure these improvements work properly, the Upgrade to New Product Version action needs to be
enabled for the same quote status in both Workflow and Item Actions Workflow in Setup.
If you’re using Quote 1.0, you can check if a quote has incomplete items by using these CTX tags:
The Workflow Permissions section is used to control which user groups can perform which actions.
This administrative section is important because users will be unable to use any of the actions defined in the
Workflow [page 416] administrative section unless they have been given permission to use the action(s) here.
Defining these permissions can be done in two ways, through Actions Permissions or User Group Permissions.
The default is the Actions Permissions. Under Actions Permissions, each individual action is displayed and the
user groups that are allowed to perform each action are displayed in the User Groups column.
Click the or symbol by each item to add/modify the user groups that are allowed to perform that action.
On the next screen, select the user groups that are allowed to perform each action, and uncheck the user
groups that are not allowed to perform the particular action and click Save.
Under User Group Permissions, each individual user group is displayed and the actions that the user groups
are allowed to perform are displayed under the User Groups column.
Click the or symbol to add/modify the actions that the particular user group (on the left) is allowed to
perform. On the next screen select all the actions that the particular user group will be allowed to perform and
click Save.
Take a look at a section of the Workflow Permissions (by Actions Permissions) for SMB computer store.
Consider John Smith in Sales and Jane Smith in Sales Management, without any restraining conditions set,
both John and Jane would have access to the Edit, History actions, John would have access to the New
Revision action and Jane would have access to the Reassign action (based on the Actions Permissions for their
respective user groups).
On the user side, as expected, John sees all the actions his user group (Sales) is allowed to see, but he does not
see the Reassign action.
Jane also sees all the actions her user group (Sales Management) is allowed to see, but she does not see the
New Revision action her group is not set up to see.
If in the new quote status, the user doesn’t have the right to either view or edit a quote, they are redirected to
the Load Existing Project/Quotation page.
Accept Proposal After users access the proposal document from an email
and review it, if no changes are needed, they can accept the
proposal using this action.
Add Comment from CLM Retrieves comments from CLM and posts them in SAP CPQ.
This action isn't visible in the user interface, however, it
needs to be added in the workflow matrix and enabled in
the status in which the quote receives comments.
Add Item Opens the Catalog allowing users to browse through prod
ucts and add them to quote.
Approval History Opens an overview of the approval history [page 462] of the
quote (status changes, dates, approvers, rules, and so on).
Approve Approves the quote that has been submitted for approval,
allowing the user to break the defined approval rule.
Attach Document To SAP Opportunity Attaches the generated document to the opportunity. This
action is used only in the legacy SAP Cloud for Customer
integration.
Attach Document To SAP Opportunity And Sales Quote Attaches the generated document to the opportunity and
the sales quote. This action is used only in the legacy SAP
Cloud for Customer integration.
Attach Document To SAP Sales Quote Attaches the generated document to the sales quote. This
action is used only in the legacy SAP Cloud for Customer
integration.
Cancel Changes Retracts all the changes made on the quote since the last
time the quote was saved.
Change E-Sign Status This action is automatically triggered when user sends a
document to DocuSign. If document processing is success
ful, the action is triggered and quote moved to the next sta
tus. Otherwise, action isn’t triggered and quote status isn’t
changed.
Change Status Enables the dropdown list with statuses on the quote so
users can select the status manually.
Change Status From CLM The action isn’t visible in SAP CPQ user interface. It changes
the status of the contract in CLM, as defined in Status
Mappings.
Change Status In CLM The action changes the status of the contract coming from
CLM, as defined in Status Mappings.
Conditional Reconfigure Reloads the products in the quote, just like the Reconfigure
action. [page 432] However, products are reconfigured only
if the product version has been changed after the product
was added to the quote.
Create Assets Records the items from the quote in the asset table [page
398].
Create Custom Object From Quote Used in the Salesforce integration for creating custom ob
jects in Salesforce.
Create Quote In CRM Used in the Salesforce integration for creating quotes in
Salesforce.
Create Update SAP Sales Quote Available in the legacy SAP Cloud for Customer integration.
It either creates a sales quote or updates it, if there’s an
existing sales quote.
Create/Update objects From Quote Items Available in the Salesforce integration. It either creates ob
jects in Salesforce from quote items in SAP CPQ, or updates
them, if there are existing objects.
Detach From Opportunity Detaches the quote from the related opportunity [page 429].
Used in the integration with Salesforce.
E-Sign Accepted Triggered by AdobeSign and is not visible in the quote layout.
Triggered when the document is signed.
E-Sign Declined Triggered by AdobeSign and is not visible in the quote layout.
Triggered when the signer refuses to sign the document.
Generate Document For E-Sign Initiates the generation of documents that will be sent for
e-sign to AdobeSign.
Integration Change Quote Status Changes the status of the quote from Order Confirmation
Pending to Order Created with Errors, and from Order Cre
ated with Errors to Order Placed. This action should be
used in integration flows for the quote-to-order process in
the integration with SAP S/4HANA.
Margin Health Allows users to set the margin health [page 527] on the
quote after which the system recalculates the discount and
eventually all other calculations are triggered according to
the setup in Cart Fields Administration.
New Active Revision Creates a new quote revision [page 396] and sets it as ac
tive.
Order Status Update Used in the SAP Cloud for Customer integration solely for
changing the quote status as defined in the Workflow (in the
out-of-the-box scenario, from Order Confirmation Pending to
Order Placed).
Place Order Opens a page with a summary of the quote so users can re
view it and make any needed changes before actually placing
the order.
Post Quote Notes Into Account Chatter Sends quote comment to the account Chatter in Salesforce.
One comment can only be sent either to the account or the
opportunity Chatter.
Post Quote Notes Into Opportunity Chatter Sends quote comment to the opportunity Chatter in Sales
force. One comment can only be sent either to the account
or the opportunity Chatter.
Propose Changes After users access the proposal document from an email
and review it, they can enter comments into the quote and
propose changes to the document using this action.
Quote Lost Changes the status of the quote to Lost. Available in the list
of quotes and allows easy change of status.
Quote Won Changes the status of the quote to Won. Available in the list
of quotes and allows easy change of status.
ReApply Taxes Refreshes the country/region and the state tax selection.
Reconfigure Recalculates all items in the quote [page 432] and consid
ers all the changes that affect the values on the quote (for
example, if list price is calculated based on an amount in a
custom table, you should trigger the Reconfigure action after
changing the value in the custom table so that the list price
is recalculated in the quote).
Refresh Market and Currency The market and currency selection on the quote are re
freshed and in case the selection is different from the default
market and currency, those selected on the quote are ap
plied.
Reject Quote approvers use it to reject the quote sent for approval.
Reject Proposal After users access the proposal document from an email
and review it, if they don't accept the proposal, they can
reject it using this action.
Release Quote And Proposal to SAP Commerce Sends the quote with the generated document to SAP Com
merce Cloud.
Release Quote To SAP Commerce Sends the quote, without any documents if any are gener
ated, to SAP Commerce Cloud.
Replace Items If this action is enabled and the item part number is editable,
users can search for other items based on their part number
in the list of items in the quote.
Request Approval When an approval rule is broken on the quote, this action
leads to a new page where all approval rules for that quote
are listed and users can further submit the quote for appro
val.
Retract Approval Process Once a quote is sent for approval, this action can retract the
quote and no approval is any longer needed.
Save Quote Saves the changes made on the quote since the last time the
quote was saved.
Send Email Sends the email [page 429] with information on the gener
ated document. This action is available only in Quote 1.0.
Send Quote To CLM Displayed on the right side of the email form for sending
the generated document. This action opens the document in
CLM in a new tab.
Submit for Approval Sends the quote for approval when an approval rule is vio
lated.
Update Opportunity and Create Update SAP Sales Quote Updates the opportunity and create a sales quote. If there’s
already a sales quote, this action updates it. Used in the
legacy SAP Cloud for Customer integration.
Update Quote in CLM Sends all the changes made on a quote in SAP CPQ to the
respective contract in SAP CLM.
Update Sales Quote Updates the related sales quote in SAP Cloud for Customer.
Update SAP Opportunity Updates the related opportunity in SAP Cloud for Customer.
Upgrade to New Product Version Upgrades the product to a Create Product Version [page 87].
View Proposal When this action is enabled, an email with the generated
document is sent to the destination address with the link for
accessing the proposal document in SAP CPQ. This action
allows users to open the proposal.
Void Document Revokes the document that has already been sent to signers
in the DocuSig integration, avoiding the need for signers to
review an obsolete document.
You can translate each standard action by clicking and selecting the language you wish to translate to in the
Translate to dropdown list.
Related Information
The purpose of this functionality is to enable users to send SAP CPQ Quote XML explicitly (by invoking the
appropriate action on the quote), or implicitly (by setting this action to be a pre or post action for some other
quote action).
Workflow Setup - The action Send Quote XML should be set up in the workflow. This means that appropriate
user groups need to have privileges to execute this action, and that this action should be put in workflow. Send
Quote XML can also be defined as a pre or post action to some other action (for example to Place Order).
Send XML to FTP Address - If the administrator wants the action to send XML to an FTP Address, the following
parameters should be adjusted under Setup General Application Parameters :
• When action 'Send Quote Xml' is executed, send xml to FTP Address: This parameter is
required for FTP sending and it should be filled with the appropriate FTP Address.
• Action 'Send Quote Xml' sends quote xml under the name:This parameter should be
filled with the template for XML document name that will be sent to FTP server. Example: Quote
<*CTX(Quote.CartCompositeNumber)*> will create XML document that will contain the quotation
number in its name (for example – Quote00010024.xml).
• Ftp Path: This parameter should be filled with the local folder path of the FTP server, where the file will be
saved.
• Ftp Username: This parameter should be filled with the FTP server username.
• Ftp Password: This parameter should be filled with the FTP server password.
Action execution - Users can execute the action explicitly by invoking it from the quote, or implicitly by invoking
some other action, that will activate "Send Quote XML" as its pre or post action.
The purpose of this functionality is to enable users to send SAP CPQ BOM XML explicitly (by invoking the
appropriate action on the quote), or implicitly (by setting this action to be a pre or post action for some other
quote action).
Workflow Setup - The action Send BOM XML should be set up in the workflow. This means that appropriate
user groups need to have privileges to execute this action, and that this action should be put in workflow. Send
BOM XML can also be defined as a pre or post action to some other action (for example to Place Order).
Send XML to Http Address - If administrator wants the action to send XML to a Http Address , under Setup
General Application Parameters , on the Shopping Cart and Quote tab there is a parameter: When action
'Send BOM Xml' is executed, send xml to Http Address:. This parameter is required for Http
sending, and it should be filled with appropriate Http Address.
Send XML to FTP Address - If the administrator wants the action to send XML to an FTP Address, the following
parameters should be adjusted under Setup General Application Parameters :
• When action 'Send Quote Xml' is executed, send xml to FTP Address: This parameter is
required for FTP sending and it should be filled with the appropriate FTP Address.
• Action 'Send Quote Xml' sends quote xml under the name:This parameter should be
filled with the template for XML document name that will be sent to FTP server. Example: Quote
Action execution - Users can execute the action explicitly by invoking it from the quote, or implicitly by invoking
some other action, that will activate "Send BOM XML" as its pre or post action.
Action Detach Quote From Opportunity will enable users to break the link in SAP CPQ between CRM
opportunity and SAP CPQ quote. After a user has detached the quote from one opportunity, he will be able to
attach it to another opportunity, or to create a new opportunity from the quote.
If the CRM system is Salesforce, the SAP CPQ quote will be removed from the list of opportunity related quotes
in Salesforce.
Reapply Taxes
Action Reapply Taxes allows users to refresh country/region and state tax. This action does not have a big
impact on the performance unless the formulas for Country/Region Sales Tax (Country/Region Sales Tax [page
530]) or State Sales Tax (State Sales Tax [page 539]) are complex.
Send Email
Action Send Email is tied in with Generate Quote action. When Generate Quote action is completed, user is
presented with a button to create Email and download the document. When a user creates an email and clicks
Send Email, Send Email action will be executed.
Currently Send Email allows for an Activity to be added to Salesforce.com opportunity. To set it up:
• In Setup:
1. In Setup Quotes Email Customers / Quote Acceptance Settings section, set Update
Opportunity activity in Salesforce after sending Email to Customer to TRUE.
2. Make sure that Send Email action in added to the workflow
3. Make sure user groups have permissions set for Send Email action under Workflow Workflow
Permissions .
• On user side:
1. User has to come from Salesforce.com.
2. Generate a quote.
This page describes the Reprice, Reconfigure, and Conditional Reconfigure actions and explains when each of
these should be used.
Reprice Action
This action recalculates only the items whose values are changed in a quote, but only when the changes are
made in the quote (for example, when a user changes the value of a quote item custom field). If there are items
whose values are being calculated from external sources (for example, from a custom table), the Reprice action
doesn’t recalculate the values of those items after the external value is changed.
The Reprice action works with a snapshot of product data captured in the moment when the product was
added to the quote. Triggering this action doesn’t reload the product in the quote like the Reconfigure action
does.
Reconfigure Action
This action recalculates all items in a quote and considers all the changes that affect the values on the quote
(for example, if list price is calculated based on an amount in a custom table, you should trigger the Reconfigure
action after changing the value in the custom table so that the list price is recalculated in the quote). With
this action, products are reloaded in the quote, so all changes are applied, unlike with the Reprice action. The
Reconfigure action applies to all item data, not just the List Price.
Note
The Always Refresh List Price on Reconfigure parameter determines whether the list price is recalculated
every time Reconfigure is triggered or not.
Conditional Reconfigure
With the Conditional Reconfigure action, products are also reloaded in the quote, just like with the Reconfigure
action. However, products are reconfigured only if the product version has been changed after the product was
added to the quote.
There’s a flag in the workflow, next to Automatic Reconfigure, called Conditional Reconfigure, called . This is
available in the workflow for all actions where , called Automatic Reconfigure is available. When this flag is set
and action is executed in the workflow, same logic is applied as in action Conditional Reconfigure: iterating
through all quote items, compare product versions and reconfigure item and save current product version if
product versions are different.
Related Information
Action Approval Reminder can be used in both quote engines to remind approvers that there is a quote waiting
for them to approve or reject it.
Once quote is submitted for the approval, and approver does not take any actions, quote owner has no way to
request or remind approver to take action.
When action is executed, the system will verify who are all the approvers for that quote, and will send email
notification (same one as used for approval notification) to ALL approvers who have not take any actions
(approve or reject) for that quote.
Action Approval Reminder will not do anything by itself, it's just a transition in the action workflow where
a user can attach arbitrary notifications. These notifications should be addressed to the email lists with
"WaitingApprovers".
Email list with special tag "WaitingApprovers" will address all approvers of a quote that have not been approved
or rejected.
User can put any notification body to these approval reminders. They could be the same as initial submit for
approval notification, or you can make a new one specific for reminder purposes.
This is scheduled action that is executed once a day at midnight (server time) and it will automatically push all
quotes that are due to expire to Quote Expired status (or any other desired status), fire post actions or trigger
notifications for each quote. Since this feature is not enabled by default, there are certain steps that need to be
performed in order to enable it.
By default, quotes will expire 30 days after they have been created. This time period is controlled with the
custom field Quote Expiration Date ( Setup Quote Custom Fields ).
In the Quote Expiration Date window, you can see the Formula column is set to
<*CTX(Date.AddDays(30))*>, and Calculation Type to Once, when quote is created and there is
no selection for Tab (so it won't be visible to users).
After adjusting these settings, user will need to set up the Workflow ( Setup Workflow/Approval
Workflow ). Select Other Quotes tab and add Quote Expiration action for desired Start and End status
combination (For example: Start Status: Open; End Status: Quote Expired).
Note
When admin edits an action from the Workflow/Approval Actions list, he or she is able to see the
following fields:
• Name
• Global Condition
This is visible for all actions; defines global condition for executing action.
• Pre Action Condition
This is displayed only if action can be set up as pre action in the workflow.
• Post Action Condition
This is displayed only if action can be set up as post action in the workflow.
When action is executed as pre or post action, SAP CPQ evaluates appropriate condition defined for this action.
Note
If you’re not sure which action can be set as pre or post action, the best way to check this is to see what
actions can be found in the list for pre or post action in the workflow.
6.4 Statuses
The Statuses link under Workflow/Approval drop-down provides information about an order or quotation status
to users.
Additional Status Definitions can be added. For quotation tracking, Open Quoted, Closed Quote, Converted to
Order, could be added. For orders In Engineering, On Hold or at Assembly Floor, could also be used.
existing ones edited. Select Add New to add a new status or click the button next to the status name to edit
a status.
To delete a status, select the button corresponding to the status and click OK to confirm you want to delete
the item.
To make a status the default status, edit the status by clicking the button next to it and changing the
selection in the Default drop down to Yes.
If another status is already set as the default, user will receive a confirmation informing him that a status is
currently set as the default. Clicking OK will make the current status the default or Cancel will keep the current
default status intact.
Note that there cannot be two default statuses and that there has to be a status set as the default status at any
point in time. Therefore, editing a default status and changing the selection in the Default drop down from Yes
to No bring up a message saying that the only way to change the default status is setting another status as the
default.
A quote can be locked when in a certain status. When a quote is locked, it is in a read-only state and cannot be
edited. To set a status that will lock a quote, user will edit the status, change the selection in the Locked drop
down to Yes and click Save.
Outbound emails are all emails sent from SAP CPQ to clients.
Note
If you've been registered in SAP CPQ before the deployment of the 2005 release occurred, you need to
contact the SAP CPQ Support team who will assist you in implementing the listed email-related behaviors.
Note
If you're encountering any problems with receiving emails, you may need to whitelist the SAP CPQ SMTP
server IP address. The IP addresses of the SMTP server are:
• In the From Email Address application parameter enter the email that will be displayed in the From field of
the received email.
• The Sender address is taken from the Sender Email Address application parameter.
• Sender name is defined in the Sender Email Name application parameter.
Note
If there's no Sender Email Address, it remains empty and there's no Sender Email Name either.
• In the From Email Address application parameter enter the email which will be displayed in the From field of
the received email.
• The name displayed in the From field of the received email is the full name of the user who triggered the
action.
• The reply-to address should be the email of the user who triggered the action.
• The Sender address is taken from the Sender Email Address application parameter.
• Sender name is defined in the Sender Email Name application parameter.
Note
If there's no Sender Email Address, it remains empty and there's no Sender Email Name either.
• In the From Email Address application parameter enter the email which will be displayed in the From field of
the received email.
Note
If you haven’t added an email to the From Email Address parameter, the email won’t be sent.
• The Sender address is taken from the Sender Email Address application parameter.
• Sender name is defined in the Sender Email Name application parameter.
Note
If there's no Sender Email Address, it remains empty and there's no Sender Email Name either.
• In the From Email Address application parameter enter the email which will be displayed in the From field of
the received email.
Note
If you haven’t added an email to the From Email Address parameter, the email won’t be sent.
• The Sender address is taken from the Sender Email Address application parameter.
• Sender name is defined in the Sender Email Name application parameter.
Note
If there's no Sender Email Address, it remains empty and there's no Sender Email Name either.
• In the From Email Address application parameter enter the email which will be displayed in the From field of
the received email.
Note
If you haven’t added an email to the From Email Address parameter, the email won’t be sent.
• The Sender address is taken from the Sender Email Address application parameter.
• Sender name is defined in the Sender Email Name application parameter.
If there's no Sender Email Address, it remains empty and there's no Sender Email Name either.
• In the Place Order “From” Email Address application parameter, enter the email which will be displayed in
the From field of the received email.
Note
If no email is added to the parameter, the From field will be populated with the email address of the
currently logged-in user.
• The Sender address is taken from the Sender Email Address application parameter.
Note
If the Sender Email Address isn’t defined in the parameter, the email address of the currently logged-in
user will be used.
Emails which are sent through the document generation email form (in the
last step of document generation process)
• In the From Email Address application parameter enter the email which will be displayed in the From field of
the received email.
Note
If an email isn’t added to the application parameter, the From field will be populated with the email
address of the currently logged-in user.
• The name displayed in the From field of the received email is the name used in the Name field in the
document generation email form.
• The Sender address is taken from the Sender Email Address application parameter.
• Sender name is defined in the Sender Email Name application parameter.
Note
If there's no Sender Email Address, it remains empty and there's no Sender Email Name either.
The selected value on the Hide "From" Email Address and "Name" from the Generated Document Email
Form [page 637] application parameter determines whether the From and Name fields are visible in the
document generation form.
If email lists can be compared to the email recipients, notifications would be the rest of the email. Notifications
define the subject of the email and the body. Notifications can contain any number of messages, and each
message can have different content and email lists. Notifications can then be attached to any workflow action.
This makes it quick and easy to notify the necessary people of users’ actions. Once email lists have been
created, notifications can then be made to include them. To manage notifications, follow the steps below:
1. click the Notifications link under the Workflow/Approval drop down menu. All existing notifications are
listed.
2. To create a new notification, click Add New.
3. Enter an appropriate Notification Name and click Save. The option to add messages is then displayed.
4. All that is required when creating a notification is the name. This name is then used when assigning
the notification to a workflow action. Click Save to save the name. Once the name has been saved, the
message administration for that notification becomes available. Click Add New Message to add a new
message to the current notification.
Note
Clicking Go Back will only cancel the notification add or edit. This will not undo any message adds or
alterations.
Companies who have SSO users [page 126] to whom they wish to send email notifications attached to
actions (for example, notifications for quote approval or quote rejection) need to update the SAP CPQ URL
which will be sent as a part of the emails. For example, if the URL was http://tenantID.webcomcpq.com/
Login.aspx, it should now consist of the user's IdP like this: https://tenantID.webcomcpq.com/fed/
domainName/Login.aspx?quote=CFCECFCACFCFC7CA.
Creating a message is much like creating an email. The Subject, To addressee, and Text must all be entered to
create the message. The To addressee in this case, though, is an email list, or email lists. Users included in the
selected email list(s) will receive the message.
The email can be sent as HTML or plain text. Sending emails in HTML allows you to create a better looking and
more interesting emails. Two pictures below show an example of HTML notification formatting in SAP CPQ and
rendering in mail client.
Dynamic text can be entered in the subject, message text, and condition sections through tags using the syntax
builder. The syntax builder for the sections can be accessed through the symbol next to each section.
A condition can also be entered in the Condition section that has to be met to in order to send the notification.
Enter 1 in the Condition section to always send the notification.
The full list of the available tags can be accessed by clicking the Syntax builder for the "Message Text".
These tags with parameters have a list of available parameters, and a parameter must be chosen to use the
tag.
When a quote requires approval, an email notification is sent to the approver that looks like this:
Attachments can also be included with the email message. Only DOCX, DOC, XLS, XLSX, and TXT files can
be used as attachments. Existing attachments can be managed by selecting the file from the list and clicking
Delete or Download. New files can be uploaded into the system by clicking the Upload button.
Files added to the Parsable box will be compiled by SAP CPQ when the email is sent. This means that any Word
Quote tag used in the file to include Quote, Customer, or User information will be replaced by the information
of the quote that initiated the notification. Any files added to the Non-Parsable box will not be compiled by SAP
CPQ.
Note
For more information on word quote tags and creating documents that contain them, see Create Document
Generation Template [page 179].
When finished entering the information for the message, click the Save button to add the message to the
notification
Note
You can track the status of email notifications in the log. Every sent email notification is logged in a record
with the title Email Notification. The log contains the following data: Notification name, Notification Content
ID, Timestamp, Cart ID, Owner ID, Notification subject, Notifier name, Notifier email and a record indicating
that the notification is successfully sent.
Email notifications that are not sent are also logged in a record with the title Email Notification. In this case,
the log states that the notification condition is not fulfilled and contains the following data: Notification
name, Notification Content ID, Timestamp, Cart ID, Owner ID and Notification subject.
You can enable email notification logging via General Application Parameters Shopping Cart and
Quotes Use Additional Logging For Email Notification .
Once a notification and message have been created, it can be associated with a workflow action.
This is done in the Workflow Actions administration section. For any workflow event/intersection, click the
button to open the Status Administration page.
On this page, click the Edit button under the Notifications column of the appropriate action (make sure it’s
selected).
Note
For more information on the Workflow, see the chapter Action page in Workflow [page 416].
In the resulting pop-up window, all notifications are listed. Click the checkbox of each notification that will
be associated with that action. Click Update to save the selection(s) and Close to cancel the selection. Click
Save on the status administration page. When a user initiates this action, the notification is triggered and any
messages added will be sent. The information from the quote that the user performed this action on will be
used for any attachments using word quote tags. Email messages will include all information included on the
message definition page (as discussed earlier).
• user management notifications (user creation, password reset, password update, and so on)
• notifications attached to actions, sent in emails when actions are triggered
• notifications sent after bulk import is performed
• notifications sent if the knowledgebase synchronization is unsuccessful
• automatic reminders sent to approvers if they do not take action on quote approval requests
• email form in the last step of document generation process
SAP CPQ default "Place Order" Email is sent when user clicks on Place Order. In order to control the From
Address of this Email, we can use application parameter Place order “From” email address found in
SAP CPQ Setup General Application Parameters Shopping Cart and Quotes . If this app parameter is
not defined, user's Email is used as the From address.
Selecting Place Order on a complete quote that does not require approval. The Order Confirmation screen
displays.
Additional email addresses can be entered in the additional e-mails textbox. Clicking Confirm/Send Order
confirms that the Order has been placed and notifications are sent to the Bill To or Ship To email address if
checked and any other additional e-mail addresses entered. Although this is a hardcoded notification, it can be
changed by changing the visual style for Place Order page. For more information on Visual Styles, see Users
[page 126].
Approval Notifications
Your SAP CPQ installation comes with 3 predefined notifications for Approval Process:
Adjustments for these 3 notifications can be made easily with edit action.
The tag (<* PDAAPPROVAL *>) is used for notifications. Approval Email will contain both links, standard
QUOTELINK, and new PDAAPPROVAL. This PDA link will automatically log in user and redirect him to separate
page for approval via PDA. Here, he’ll be able to approve or reject quote and see cart summary info. For
security reasons, only ApprovalPDA.aspx will be accessible via PDA link. After the quote has been approved
or rejected, no other action will be available.
The one-click approval HTML email template helps you set up the approval request email Approvers receive
when Quotes are submitted for approval.
The email contains the Quote number, the description of the violated rules and customer information. By
using the HTML email template and following the steps outlined in Approving Quotes in One Click [page 473],
Approvers are able to accept or reject Quotes directly from the email, without logging into SAP CPQ.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
body {
padding: 0px;
overflow-x: hidden !important;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 14px;
line-height: 1.42857143;
color: #636466;
background-color: #fff;
margin: 0;
text-align: center;
}
a {
text-decoration: none;
}
a,a:hover {
color: #00ABE3;
}
h2 {
color: #636466;
font-weight: 500;
}
.cald_header_bar {
background-color: #fff;
color: #636466;
height: 64px;
margin: 0;
text-align: center;
vertical-align: middle;
width: 100%;
}
.cald_logo {
margin: 10px;
<body>
<div class="cald_header_bar">
<table class="cald_logo" width="181px" border="0"
cellspacing="0" cellpadding="20" background="https://c3.webcomcpq.com/mt/DEFAULT/
images/logo_left.gif" background-repeat = "no-repeat" style="height:
58px;background-repeat: no-repeat;background-position: center; margin:0 auto;
margin-bottom:5px;">
<tr><td></td></tr>
</table>
<table class="rainbow" width="100%" border="0" cellspacing="0" cellpadding="20"
background="linear-gradient( 90deg, #fab423 0%, #94c84a 25%, #00a7e0 50%,
#00ABE3 60%, #364CA0 80%, #904D9E 90%, #a96dae 100%)" style="height: 5px;
Creating an email list is the first step in creating notifications (Notifications [page 439]). Notifications allow
custom emails to be sent to any user with the option of an attachment included. Email lists determine which
users receive the email notifications. Email list administration can be accessed by clicking the link under the
Workflow/Approval drop down menu.
Here all existing email lists are listed. User can create a new email list by clicking Add New. Specific users
are added to email lists. All users an email list receive the notification sent with that email list. Email lists are
well integrated with SAP CPQ and provide a high level of customization. All users and user groups added to
the SAP CPQ database can be included in an email list. Custom emails not in the SAP CPQ database can
also be entered. Dynamic tags can also be used to determine who gets a notification. Tags provide a way
to send emails to users performing certain roles rather than specific predetermined users. Tags can be very
useful for sending notifications for approval rule violations, supervision, and general updates. The tags are self
explanatory and the user(s) fitting the selected tag gets the notification.
The Emails section allows entering a custom name and email. The name is optional, but a valid email address is
required.
Note that moving an email address from the selected section to the unselected section in the Emails lists
section deletes the email address.
The Tags area provides users with a dynamic method of sending emails. Selecting the appropriate tag
determines which user will receive the email:
Once all the users that should receive an email notification are entered or selected, clicking Save will save the
email list. Now notification of that email list can be created.
When you use Responsible Approvers tag in email lists, there is an application parameter that will control if the
approver is going to receive a notification per each violated rule or only one notification for all violated rules.
The parameter name is Remove duplicate approvers and can be found under Setup General Application
Parameters , tab Shopping Cart and Quotes. If this parameter is set to yes, only one email will be sent to the
approver per notification.
Note
If dynamic tags are used to define recipients (for example, “Approve parent”) it is important to know that
this user (for example, Approve parent) will get a notification only if they are marked as "active" in the
administration.
6.8 Approvals
Approval process is a SAP CPQ functionality that enables administrator to force users to obey a set of rules
when operating with theirs quotes. For instance, administrator can model the approval process so that he
To fully understand the approval process described in this manual, one should first get familiar with following
terms:
• Approver
• Submitter
• Approval Rule (condition)
1. Set up individual users' Managing/ Ordering/ Approving parents on user administration page (not
required).
2. Set up any additional things that you might need in approval process (For example, set discounting rules if
you wish to treat discounts in approval rules) (not required).
3. Set up one or more Approval Rules.
4. Set up Workflow to treat Approval Rules.
You can find more details on the approval process terms below:
• Approver
Approver is a SAP CPQ user that is selected to be responsible for managing the approval status for
a particular quote in approval process. Therefore, the approver usually gets to view or edit submitters'
quotes. Think of the approver as of a manager whose job is to decide if a quote is valid or invalid in some
way. The approver is the person that needs to review a quote submitted to him and to decide what to do
with it. By workflow, it usually means that he can either Approve or Reject a quote, or in some cases, submit
it for further approval – if he himself also violates some rules and therefore has not enough authority to
resolve the approval. In that case, this approver also becomes a submitter to his approver. This multilevel
approval process will be described later in this chapter in more details.
One approval rule must have at least one approver, but it's not limited to that one only. It can have as
many as needed. Since approvers are ordinary SAP CPQ users (with some more rights), it is important
to select only active users as approvers. If an inactive user is set to be an approver to someone, quotes
submitted for approval will be assigned to him(who can't log in) and sent quote will get stuck. This behavior
is by design. It is possible to have an approval rule that defines user (For example "John Smith") to be
the approver. Now, when that user is deactivated , the approval rule must still apply, because users could
violate rules and avoid approval process. If quotes are stuck in 'waiting for approval' status, please consult
approval history and double check that you don't have an inactive user set as approver to some rule
• Submitter
Submitter is a SAP CPQ user that some particular approval rule applies to at that moment. If the approval
rule is evaluated to "true" than this user can submit a quote for approval process, if that action is available
in the workflow. The submitter is usually the quote owner, or a user that is currently operating on a
particular quote, although, it is not always the case. In multilevel approval process, one user's approver can
also be submitter if he violates some approve conditions himself. More details will be explained later in this
chapter.
• Approval Rule (condition)
Approval Rule can be considered as condition that needs to be evaluated as "true" in order to get the
approval process going. Rules administration is found under Workflow/Approval Approval Rules
menu item in administration. The page contains a table that is displaying a list of approval rules in system.
Here user can edit or delete or add a new approval rule. It is important to know that every time a quote is
loaded or reconfigured, or when quote prices are refreshed, all these rules get re-evaluated and checked
Note
To ensure that the approval rules are triggered for the right user type or company, you may avoid
defining specific approval rules and set up all rules for All User Types/All Companies. However, have in
mind that this may slow down the system and lead to performance issues.
You have an option to define a Custom Approver Selection Logic. This Logic is also referred as a Dynamic
Approver in SAP CPQ. Custom Approver Selection Logic will determine an approver at the time a particular
approval rule is violated. Approver is determined depending on the expression that you defined through SAP
CPQ Workflow/Approval setup.
This expression can take into account a various elements regarding users, customers, quote calculations and
so on. For example, you can write a formula that will determine an approver based on the country/region the
customer is located in, or based on the total amount of the quote.
When you save a newly created Custom Approver Selection Logic, it is automatically added to the list of
selected Approvers.
Example
In this example we will create an dynamic approver named Regional Approver.
In this example, if you work on your quote, and you choose a customer that has territory set to "USA", your
approver will be a user with the email [email protected]. You will find the name of this user in the list
of Approval Rules below your quote.
You are able to edit a Custom Approver Selection Logic. Whatever changes you make will be valid for all approval
rules that use this dynamic approver. You can also use any Custom Approver Selection Logic defined by other
users.
You are able to delete a Custom Approver Selection Logic, but only if it isn’t part of some other rules. If you try
to delete Custom Approver Selection Logic that is in use, you will be informed with the error message and the
list of rules where this Custom Approver Selection Logic is used.
When you are working on the quote and a rule is triggered, you will be informed that the quote must be
approved by the approver that was selected based on the expression you entered while defining a Custom
Approver Selection Logic.
If for some reason SAP CPQ was not able to locate the user that you were referencing in your expression, then
the error Approver couldn't be identified. Please contact your SAP CPQ Administrator will be displayed in the
quote. SAP CPQ will not be able to locate the user if you typed a wrong identification field value (invalid email,
invalid name or invalid username).
Delegation of approvals
Delegation of approval is designed for cases when a quote is sent to the SAP CPQ user for approval, but
that user is absent or is not able to approve of reject the quote. If delegation of approval is enabled then any
member of the team can review, approve or reject that quote as a delegated approver.
• Managing Parent
The Managing Parent, with the appropriate rights, can edit or delete their child users. They can also
reassign quotes between their child users.
• Ordering Parent
The Ordering Parent receives all orders placed by their child users for confirmation.
• Approve Parent
The Approve Parent receives quotes from the user that have been submitted for approval. Whether or not
a user’s Approve Parent receives a quote, though, depends on how the rules are set up in Approval Rule
administration. Each approval rule determines which user(s) will receive the quote for approval. The user’s
ApprovalParent is one of these options.
Assigning approval permissions to any of these three relations means that you define a delegated approver.
Delegated approver is allowed to approve quotes that are assigned to its' approval team.
The Approval team is comprised of SAP CPQ users that are the first level descendants of the delegated
approver in approval hierarchy. Approval team members are also approvers for other SAP CPQ users. Follow
these steps in order to enable delegation of approval:
The Delegation of approvals table is used to define a delegated approver and control permissions for it. This
table contains three different SAP CPQ user approval relations.
You can delegate approve/reject permissions for any of the relation that it is approving or rejecting quotes. In
this example, approve parent has a permission to approve and reject quotes for its' approval team.
To summarize - when a user A request approval from its' approval parent B, then the user C which is set as
approval parent for user B and it is defined as a delegated approver can approve quotes that are in "Waiting For
Approval" queue of the user B.
User Kyle creates a quote which violates a previously defined approval rule. User Kate is defined as approval
parent for Kyle. Kyle requests approval from Kate and now Kate has a Kyle’s quote in approval queue.
If Kate is on vacation or for some reason is not able to log into SAP CPQ and approve the quote, then Mike can
complete the approval. Mike is selected as approval parent for Kate and approval parent relation is selected to
allow delegation of approval.
Once Kyle has sent the quote for approval, he is able to see the list of alternative approvers by selecting
approval history from the dropdown in the list of quotes.
Clicking Approval History in the quote actions opens a page with an overview of the quotes included in the
approval process. The table displays the quote status (approved, submitted for approval, etc.), names of users
who submitted the quote for approval and who performed the approval, related comments, and descriptions.
Also, the Resolving date column shows when an action was performed on the quote (approved, rejected, etc.).
Clicking on the button View alternative approvers, a list will be displayed as pop up.
Mike clicks on Approvals action for the particular quote. Approvals page is displayed and Mike is able to
approve or reject the quote.
Parallel Approval, or Branching, allows you to split the approval process into several components independent
of one another. If you don’t use the Branching feature one approver can reject all components of your quote
which will induce SAP CPQ to send the entire quote for approval all over again. This may take more time than
you can afford to lose, and cause unnecessary delays.
The standard approval process has three or four rules and the moment you decide to reject one rule only
the whole quote is rejected regardless of the fact that two unrelated rules have been approved. This means
you must repeat the process all over again and send the quote to your manager who then has to send it
over again to someone else. This can end up taking too much time. With the Parallel Approval process you
can simultaneously approve several rules which are independent of one another. Once you are done with one
branch you don’t care about the status of other branches. You have ensured independence of various different
rules, which are part of the same quote.
To show you what we mean, let’s say you are a regional dairy manufacturer that wants to expand by closing a
deal with a major food retailer outside your core market. This deal would not only give you access to a large
market, but might also lead to a possible expansion to neighboring markets. Before you are able to decide if
you can go ahead, you need to get the green light from your production department that first has to ensure you
have enough capacity for this kind of strategy. Then, you need to get the approval from the finance department
that must decide if the risk is justified. And, you need to get the thumbs up from the logistics department
that has to make sure your distribution network is able to partner up with the distributors in the new market.
This is where Parallel Approval comes in – it allows your company to segment your approval process so that
departments unrelated to one another can approve rules relating only to their own authority. Now, let’s say
the production department says boosting existing capacity won’t be a problem, but the finance department
says the pricing for the cheese assortment of products will have to be readjusted. With Parallel Approval, the
approval process will not have to go through the production channel again because pricing is the only property
that needs to be changed. Instead, it will be resubmitted along the finance branch only.
It helps to think of each rule as part of a branch. For the initial user, all three rules have been violated. This
means that, for all three rules, the condition has been set as true. And as the approval process is being carried
out, users approve the green rule in its entirety first, meaning they approve the first branch.
To start, type in the name of the Branching component in the Branch Name text-entry box in Step 2 of Approval
Rules. Check the following figure to see what this field looks like in SAP CPQ.
Note
Keep in mind that different approvers can approve rules within their branches without interfering in the
process of approval taking place within other branches. This is why we refer to Branching as the Parallel
Approval Process. In the mock-up example below, we are demonstrating only one approval scenario.
1. For the purpose of this demo process, imagine you have defined the rule as a general user. That said,
before you send the approval request to the first approver in the hierarchy, you must first violate the Green
Approval rule, followed by the Blue and Orange Approval Rules. Once you have completed this, you can
submit the three approval rules to Approver No. 1.
2. The approval rule process starts to branch at this point. The three approval rules will go to three different
designated approval parties: Approver No. 1, Approver No. 2, Approver No. 3 and Approver No. 5.
3. The Green Approval rule is the first in line that will get approved, that is Approver No. 1 must approve the
Green rule. Then Approver No. 5 must approve the rule and submit it for approval to Approver No. 6, the
last one in the trajectory of approvers.
4. Once Approver No. 6 approves the rule, the Green Rule approval process is considered complete.
5. Now that the Green Rule has been completed, the Blue Rule is next in line to be approved. To illustrate the
benefit of Branching we will create a scenario in which Approver No. 2 changes the container configuration.
Let’s say Approver No. 2 changes the value of discounted price and updates the quote. SAP CPQ will
update the script with a new configuration. In other words, the value entered, means that the rule has
been approved. Then someone opens up the cart and changes the value of that container, meaning that
although this value has been approved now this is a new value and it would have to be approved again.
Because the Green rule follows the configuration of the container, its existing value, but because the
value has changed the rule is being evaluated again, the condition has been violated again, the approval
calculation has been violated again, so the system again asks the user to again enable the rule. Without
the ability to use Branching, the Green Rule would have to be sent back to Approver No. 1 all over again.
But Parallel Approval allows the Green Rule to move along the hierarchy as initially planned, that is to be
submitted to Approver No. 4.
6. To demonstrate the benefit of Branching further, let’s say Approver No. 3, who must approve the Orange
rule, rejects the rule. Even so, the only rule that has to be resubmitted is Orange, while others continue
along the approval process without having to be resubmitted.
7. At this point, the original user must resubmit the Orange rule again because it was the only one that was
rejected (without branching, the approval process would have to be taken back to Blue).
8. Approver 1 has to resubmit the rule to Approver 3. Let’s say this has not yet been completed – parallel to
this approval, Approver 4 can approve the other two rules (Blue and Green) waiting to be approved.
9. Lastly, Approver 3 should log in to approve the last remaining rule, that is Orange.
10. Finally, if you log in as the original user you will see that the quote has been approved and is no longer in the
Waiting for Approval status.
The action Retract Approval Prrocess should be set up in Workflow to allow users to retract expired approval
rules. This action should be set up in Workflow to be available with the Change Status action (for example, it
should lead from Rejected to Awaiting for approval).
In this Use Case, there is a quote that violates two approval rules. Owner requests for approval. Approver
rejects it because one of the violated rules must be neutralized by the owner. Owner fixes quote and request
for approval again. Now, approver must retract the expired approval rule, and then actions approve and reject
become available for the approver. The example is as follows.
• CPQ user 1
• CPQ user 2
• Rule 1
• User: CPQ user 1
• Approval condition:
[IF]([EQ]
(<*Eval(<*CTX( Quote.Total.AverageProductDiscountPercent.DefaultDecimal )
*> > 30 )*>,True)){1}{0}[ENDIF]
• Approval calculation: 1
• Branch name: branch1
• Approver: CPQ user 2
• Rule 2
• User: CPQ user 1
• Approval condition: 1
• Approval calculation: 1
• Branch name: branch2
• Approver: CPQ user 2
CPQ user 1 creates a quote. Rule 2 is violated (since condition is set to 1).
CPQ user 1 inputs discount percent of 35. Rule 1 is violated too. (See the following figure).
CPQ user 2 opens quote and approves it. Now the quote is in approved status.
Note that the Blue Rule remembers the value of some custom field if the value of some custom field has
been changed in the approval calculation; the Orange Rule follows the value of another custom field, and the
last Green Rule follows the value in the container in the configuration. If something in this process has been
changed the rule is being re-evaluated again; even though this rule has been approved the system asks you to
go into the approval process and to approve that branch. This multilayered system of approval was introduced
to prevent any tempering by different users of your quote. If some custom field value has been selected, that
is, the value box is not vacant and a value has been entered in the custom field, and if the user isn’t among
specific users, the rules are limited. This means the rules are not triggered for a number of specific users and
follow the approval process only with certain users in mind. The calculation formula which is evaluated each
time the user logs in checks the value of that custom field. When, as a user, you approve the rule in a certain
cart status the value of that custom field is being saved. Each time the system checks that the saved value is
equal to the existing value of the custom field. This is all carried out according to the formula entered in the
Approval Calculation.
Approval Rule by itself doesn't do any work – Workflow must be set up in order to have working Approval
Process. Approval rule is just here to serve as a flag in workflow that will allow some actions to happen that will
move the quote throughout the approval process.
Owner edits his quote, and violates one of the approval rules (For example, exceeds discount). After clicking
on Approvals button, he is taken to the page where he can leave a comment, see who are approvers, and what
rules he violated. We can see that this rule defines two responsible approvers.
After submitting the quote for approval, his approver will have it on Waiting for approval tab on load quote page.
There, approver can edit the quote, view what triggered approval rule, and after clicking on Approvals button,
he can perform an action on that quote:
Approver can here either approve or reject the quote. Now, what about the second approver? Even though one
approver has accepted the quote, on the user side in My Quotes tab, quote is still pending approval.
Clearly, the quote is still pending approval, so other approver needs to approve it also. (Remember the
"AND" /"OR" types of approve logic – this rule is definitively an "AND" logic type, since the first approver
did approve and the quote still waits the other approver to either approve/reject. Now the second approver
decides what to do with the quote.
As can be seen on the picture, the approval history section clearly displays that the first approver approved
the quote, and can see all the comments enterred, etc. Whatever action does this approver choose to perform,
the approval process will end because there are no additional approvers for which this quote is still pending for
approval.
First of all, discounting rules have to be defined, that will limit quote owner when setting discount, so that 50
will trigger an exceeded discount flag. This section is described in Discounts/Multipliers [page 521] section of
this manual, so refer there for more details about this simple step. Once the discounting rule is defined, we can
add an approval rule that will treat discounting.
We choose "Workflow/approval", then "Approval rules" menu items to the left. Next we add new approval rule,
and we call it "Discount Exceeded" (enter something user friendly here – both users and approvers should be
able to know what this rule applies to by its descriptive name). Next we select one user to be the user that this
rule applies to. (We can also select a particular user group, company, or combination of these). Then, in the
condition box, we enter: „<*GI(EXCEEDEDISCOUNT)*>” . This formula will check the "EXCEEDEDISCOUNT"
global information variable flag, which will be set if discounting rules are violated. This condition ensures that
discounting rules are being treated in this approval rule.
From the Approvers list, we select two users that will be responsible for this rule.
After saving, we are done with creating approval rules. Now we need to take care of workflow, in order to
complete approvals setup. First of all, let's define what actions are used during approval process:
• Approvals
• Submit for approval
• Approve
• Reject
In the administration, we select Workflow/Approval then Workflow actions in the menu to the left, so that we
are now on the page that is used to set up workflow on "My Quotes" user tab.
There, we set up the following actions: From status open to status open, check the action "Approvals" and add a
condition to it: <*APPROVALREQUIRED*>. This will ensure that we have "Approvals" action only when we need
to submit the quote for approval.
Submit for approval action: we need to do just the same as for "Approvals" action, except from the
fact that "Submit for Approval" should change quote status, so we will place it to flow from "Open"
to "Waiting for Approval" rather than from "Open" to "Open". Also, we need to add condition formula
<*APPROVALREQUIRED*>. This will prevent users to submit for approval quotes that are not violating any
approval rules. User can also attach notifications to this action, so that for example Approvers can get email
when someone submitted a quote for approval to them.
That concludes workflow for "My quotes" tab, which is important to owner/submitter. Now on the admin menu
to the left click "Workflow/approval" then "Workflow" and on that page, click on "Waiting for approval" tab.:
This will open the similar workflow page, only that this one defines workflow for approvers, who use "waiting for
approval" tab rather than "my quotes".
In this tab, we need to have 3 approval actions: "Approve quote", "Reject quote", "Approvals" and "Submit for
approval".
"Approvals" action doesn't change status, so we will put it to flow from "Pending Approval" status to "Pending
Approval" status.
We need to add a condition: Approver can only submit for further approval if he is violating some rules.
Therefore, we add a condition to this action.
So we entered <*APPROVALREQUIRED*> tag, which evaluates to "TRUE" when user is violating approval rules.
The "Submit for Approval" action is useful when setting up multilevel approvals: For example, one approver
can have right to handle discounting up to 10, but for anything more, he cannot approve himself: he must also
submit for approval to the next approver, who can approve up to 20, and needs to further submit for more
discounting, and so on.
We place "Approve quote" action to flow from "Pending approval" to "Approved" status.
Also condition for this action has to be set up, so that we prevent approving quotes by approvers that should
not be able to approve (because they violate some approval rules themselves), so click on condition button and
enter [NOT](<*APPROVALREQUIRED*>) into condition field.
By clicking Update and Save, workflow changes will be completed. Finally, we need to set up Reject action on
Waiting for Approval tab. We will place it from "Waiting from Approval" status to "Rejected" status.
This rule can also be added an condition, if we need it. By default, Any approver can reject a quote if he wants
to. But we can also limit approvers to be able to reject a quote only if they don't violate any rules themselves.
For example, if an Approver needs to submit a quote for further approval, we already forbid him to approve it,
and we can forbid him to reject it, too. In that case, we need a condition on "Reject quote" action, so we click on
condition button and set up the following formula in condition field: "[NOT](<*APPROVALREQUIRED*>)".
After this has been set up, current workflow has to be saved and approval process has been successfully set up.
Getting Started
Approval Rules is an SAP CPQ feature in the Workflow submenu that enables you to enforce rules for users
operating with quotes. Let’s say you want to limit the number of users (or identify specific users) who are
permitted to apply a discount of 10% or more on a product. Or, you want the quote to comprise computers with
a hard drive capacity of up to 100 GB only. You can enforce these rules by assigning an approver, or a hierarchy
of approvers, designated with consenting or rejecting the discount.
Glossary of Terms
To understand the Approval Rules process, we recommend you familiarize yourself with the following terms:
Approver, Submitter and Approval Rule.
Approval Rules comprises two main sections: Creating a new approval rule and Delegation of Approval.
• Click Add New and enter the name of the rule in the Approval Name text-entry box.
• Describe the Approval Rule in the Description box or click the icon to enter an expression in the formula
builder. The description informs you about the restrictions defined by the rule that users can violate. Let’s
say you are authorized to apply a discount of 30% but you applied a discount of 40%. Going forward, you
must decide if you will stick with this decision or if you will send the quote up for further approval along the
approval hierarchy. In other words, you can modify the quote so that you no longer violate that rule or ask
for additional approval. First, make sure that the rule has been defined in the workflow, and perform the
steps below.
1. • Select a user/user type/company (or all three) for whom the approval rule will apply.
• Select the company users belong to from the Company drop-down menu.
2. • Enter a condition in the Condition text-entry box that will trigger the approval process (the condition
must be rendered "true"). The condition is the core of the approval process and defines an
expression on which the Approval Rule will be based. The condition text-entry box accepts all
standard SAP CPQ formulas which give administrators greater flexibility when creating approval
rules. Let’s say you want to limit the currency amount of your quote to 5,000. If the expression
is evaluated to 1 (true) the rule is violated which triggers the approval process: [GT](<*CTX
Quote.Total.TotalNetPrice.DefaultDecimal )*>, 5000).
• The Parallel Approval section of Approval Rules is explained in a separate document. See Parallel
Approval [page 458] for more details.
Check out the following figure and the text below to learn about Based on Hierarchy and Custom Approver
Selection Logic:
Based on Hierarchy list allows you to select the submitter’s managing, ordering and/or approving parent as an
additional approver or approvers. Click the arrow pointing left. To cancel your selection, click your selection in
the Selected Approvers box and click the arrow pointing right.
Custom Approver Selection Logic allows you to select a user based on the user’s characteristics related to
the quote, opportunity, customer or territory, rather than the person’s name. The purpose of this feature is to
enable you to select the approver on the fly when you are pressed for time and need to make a quick decision.
Follow the steps below to select a user based on the Custom Approver Selection Logic:
Note
Remember that the expression must be formulated so that its result always takes the form of the user’s
name, username or email.
• In the Result returned by expression, select the format of the generated approver you want to receive and
click Save.
Take a look at the following image to see what an expression in Custom Approver Selection Logic looks like.
Then take a look at the proceeding image too see SAP CPQ use of custom tables in forming that expression.
You have now defined Approval Rules. The submitter takes over the process at this stage. Follow the steps
outlined below if you are a submitter creating a new quote subjected to the defined Approval Rules.
• Click New Project/Quotation and select the product you want by ticking the Add to Quote check box.
• Click Add to Quote at the top right corner of the page. Then trigger the rule and click Request Approval once
the Quotation page opens up.
• Click Submit for Approval.
Delegation of Approval
The Delegation of approvals table allows you to select alternate approvers if existing approvers are away or
unable to approve the rules. The purpose of this feature is to prevent situations in which the quote gets stuck
in the user’s approval queue where no one can approve or reject it. In other words, when quotes are sent for
approval to an approver, and that approver is absent, there is no way for other users to pull them out of the
approver’s queue, unless you use the Delegation of approvals. If you want to delegate approval to the Managing
parent, Approve parent or Ordering parent, you must set your choice to True. Check the following figure to see
what it looks like in the Approval Rules submenu of SAP CPQ Setup.
When you delegate approval to someone else, this change will be visible in two tables for approving quotes:
Quotes that I need to approve and Quotes that my team needs to approve in the New Project or Existing Project
Quotation.
• Quotes that I need to approve refers to a list of quotes sent to you for your approval.
• Quotes that my team needs to approve comprises you as well as all alternative approvers. This group refers
to a list of quotes displayed if the administrator selects that only one of the following roles can approve or
reject quotes: Approving Parent, Managing Parent and Ordering Parent. The list also includes the current
user if that user is set as one of selected roles for at least one active user in the system. The list contains
all quotes found in the user team’s approval queue. Let’s say user A and user B have user C set as their
approving parent. In this case, the administrator has set up that the approving parent can approve or reject
quotes instead of the approval owner. This means user C can see all quotes found in the approval queue for
user A and user B. The same rule applies to the managing and ordering parent. Now, let's say user A has
user B as approval parent (or managing or ordering) and this role can approve/reject quotes (according to
what the administrator defined in Setup). In this case, user B will always have action Approvals (this will be
the only action) available over quotes that user A needs to approve under Quotes that my team needs to
approve. Take a look at the following figure for more details.
But when you click Approval History you will be able to see the approval history of your quote, including
the names of users who performed each action in the Performed By column. The column includes name of
approvers and alternative approvers which you can check by clicking the View alternative approvers. Refer to
the figure below. If the administrator hasn’t set up either of these roles, or if there are no rules that haven’t
been approved or rejected, this button will not be displayed.
User Side
When approver is approving a quote and the approval rules are taking away the submit action we need to make
it very clear, both visually and textually, what happened.
Instead of just not showing the approve action, the following message displays: This approval request is above
your authorized approval level. You can either reject a quote, or submit it upstream for approval.
If the approver does not have an Approve Quote button, because based on modeling it was not intended for this
button to be shown to the approver, this messages will not show up and the Approve Quote button, since it was
not supposed to be there, will not show up at all.
User can define slider definition and attach the definition to approval rules. Sliders allow users to see the
probability of the current quote to be approved. One slider definition can be attached to more than one rule, but
one rule can have only one slider definition. Slider definitions are listed in a standard table, with actions copy,
delete and edit.
Clicking Add New opens a page for adding/editing a slider definition. The first step is to choose which field is
related with this slider. For this slider field user must add an editable field and set corresponding maths (see
Cart Fields Administration [page 480]). The second step is to enter slider boundaries and finally, the third step
is to select the rules to which this slider will be applied.
On the user side, for every rule that has a slider definition, a user has the information about likelihood of
approval based on the color and/or image. The color and image is the same as for margin health and can be
defined in Margin Health Design and Visibility [page 530].
The user can change this probability by clicking the Adjust button.
When a user moves a slider, SAP CPQ will calculate the value of the slider based on the min and max value
and on the slider's current position. (ex: min=20, max=30, current position = 30, slider value = 20 + (30 -
20)***30 = 23). After calculating the slider value, SAP CPQ will find the field, which is defined in the second
step and meets the criteria from the third step, then applies the value of the slider to that field, then finds the
editable group which contains this field and executes maths for this editable group. So, for this functionality to
work properly the user needs to adjust cart editable fields (see Cart Fields Administration [page 480]) Ex: If
the administrator on the second step chooses Product Type Discount Percent , also administrator must
specified Editable group field where Product Type - Discount Percent will be editable with the corresponding
math.
The Approval Auto-Reminder feature enables you to schedule automatic reminder emails that are sent to
approvers if they do not take action on quote approval requests for a predefined number of days. As a result,
the number of quotes awaiting approval is reduced and the approval process is streamlined.
Example
Sales representatives are often on the road and have no time to log in to SAP CPQ to check which quotes are
not yet approved. To prevent quotes from getting stuck in the Waiting for Approval status for too long, you can
set an approval auto-reminder that notifies designated approvers to act on quote approval requests.
To go to a specific quote from the email, approvers need to click on the quote in question. When logged in to
SAP CPQ, approvers are taken straight to the quote. However, if approvers are not logged in to SAP CPQ, or if
the session expires, approvers are redirected to the login page.
The Out-of-Office feature for SAP CPQ approvals enables Approvers on leave to delegate their Approval
requests to substitute Approvers.
With this function, the requests are not held up during the original Approvers’ absence. The backup Approvers
can approve, reject or submit Quotes for further approval on behalf of the original Approver.
Example
You are in charge of Quote Approvals in your company. However, you plan to go on vacation, which means you
will be unable to respond to Approval requests during your time off. To ensure all Approval requests are dealt
with while you are away, you should make use of the Out-of-Office feature and choose one or multiple backup
Approvers to approve or reject Quotes on your behalf. The backup Approvers will receive a notification and
a copy of the approval requests addressed to you. They will be able to approve or reject Quotes, ensuring a
successful approval process while you are out of office.
To turn on the out-of-office mode and start assigning backup approvers, take the following steps:
Note
When searching for backup approvers, SAP CPQ filters active users who belong to the same company as
the original approver.
When a Quote is submitted, both the original and backup Approvers receive the Quote in their queue. Any
of the backup Approvers can approve/reject the Quote or submit it for further approval. If there are multiple
backup Approvers, a single backup Approver is enough to approve/reject the Quote.
When searching for available Approvers, SAP CPQ only looks into the first-level backup Approvers.
When the original Approver’s backup Approver is out of office (A→B), the Quote remains in the queue until
either A or B turns off the Out of office toggle switch.
In addition, if the original Approver has multiple backup Approvers (A→B, C, D, E, etc.), and they are at the
same level, SAP CPQ searches for the first available backup Approver. If all first-level backup Approvers are
unavailable, SAP CPQ stops searching for the next-level backup Approvers.
If the original Approver has Quotes awaiting approval, a warning message containing a link to the Waiting
for Approval tab displays when the Approver turns on the Out of office toggle switch. The Approver does
not have to clear the queue in order to set the out-of-office mode. However, the queued up Quotes are not
assigned to the selected backup Approvers. The backup Approvers receive Quotes that are submitted after the
out-of-office mode is turned on.
The backup Approver is determined when a User submits the Quote. If the Quote is already approved and then
resubmitted for a new approval, SAP CPQ reevaluates backup Approvers. For example, if the original Approver
disables the out-of-office mode or changes the list of backup Approvers, previous backup Approvers might not
be added.
The One-click Approval feature streamlines the approval process by enabling Approvers to accept or reject
Quotes directly from the email, without logging into SAP CPQ.
When Quotes are submitted for approval, they can be approved/rejected by one or multiple Approvers, as
previously defined in the chapter on Approval Rules. If a User violates certain rules, Approvers receive an
approval request email. The email contains all the information the Approvers asked for. Typically, the email
includes the Quote number, the description of the violated rule(s) and customer information. Approvers can
approve or reject Quotes directly from the email by clicking the Accept or Reject buttons.
Once a product is configured and added to Quote, a User can modify the discount. If the resulting discount
exceeds the defined discount limit, the Quote is submitted for approval and an approval request email is sent to
the Approver(s).
You can use a SAP CPQ-provided One-click Approval HTML Email Template [page 443] to create your own
One-click Approval template.
Note
Alternatively, you can set up the fields you want to display in the approval request email by following the
steps outlined below.
The following procedure illustrates how to create an example template for One-click Approvals.
Prerequisites:
• Define Approval Rules. For details, see Approval Rules [page 450].
• Create Email Lists. For details, see Email Lists [page 448].
• Set up the Workflow. For details, see
Approval Process Administration [page 462].
6. Click to create the subject line (Approval Request for <* SYSTEMQUOTATIONNUMBER *>).
7. Add your previously created email list to the notification.
8. Paste the SAP CPQ-provided One-click Approval HTML Email Template [page 443] into the Message Text
box. Alternatively, if you do not want to use the ready-made HTML template, you can create one. To add
CTX tags and formulas you want to apply to your email template, click next to the message box. The
most frequently used tags are outlined in the Email Template Tags section below.
9. Select HTML as email type to ensure your email is rendered properly. Alternatively, if you have decided not
to use HTML for formatting, choose Plain text.
10. If applicable, enter a condition and add attachments.
11. Click Save.
When a User changes the field value affected by a predefined rule, the designated tags check whether Approval
Rules are violated. If one or more rules are violated, the approval request email is automatically sent to the
Approver(s).
When clicking Accept or Reject, the Approver is automatically redirected to SAP CPQ where the corresponding
message Quote is accepted. or Quote is rejected is displayed, respectively.
The following is a list of tags that pull values from SAP CPQ fields.
You can add as many fields to your One-click Approval template as you need.
• <* CO_INFO(NAME) *>: pulls the name of the User who has submitted a Quote for approval.
• <* SYSTEMQUOTATIONNUMBER *>: pulls the Quote number.
• [IF]([EQ](<*CTX( Quote.Approvals.ApprovalRule(Name).IsViolated )*>,True))
{<*CTX( Quote.Approvals.ApprovalRule(Name).Description )*>}{}[ENDIF]: checks
whether a rule is violated and pulls its description.
• <*CTX( Quote.Customer(BillTo).Company )*>: pulls the Bill-to Customer’s company name.
• <*CTX( Quote.Customer(BillTo).Country )*>: pulls the Bill-to Customer’s country/region name.
• <*CTX( Quote.Customer(BillTo).Email )*>: pulls the Bill-to Customer’s email address.
• <*CTX( Quote.Total.TotalAmount.MarketDisplay )*>: pulls the total amount of the Quote.
Note
A tag must be created for each rule that might be violated in the Quote process.
The Required Fields by Workflow Action section determines which fields are required before a certain workflow
action can be performed.
Unlike Workflow Permissions and conditions that hide any action the user isn’t allowed to perform, Required
Fields by Workflow [page 416] ensures that certain fields are entered before the action is successfully
performed. The option to perform the action is visible to the user, but a message is displayed telling the
user certain fields must be entered before the action can be performed.
In administration, user can find this section by clicking on “Workflow/Approvals”, and then on Required Fields
by Workflow Action. The Workflow/Custom fields matrix shows up, which enables user to set up desired
behavior. Note that this page has 3 tabs, to set up workflow for My Quotes, quotes that are edited from Waiting
for Approval tab, and quotes from other users (Other quotes).
Clicking OK redirects the page to the Customer Info Tab where the Bill To field is located.
In general, there are three default fields, the Bill To, Ship To, and End User that can be set as required fields
before a user can perform a specified workflow action. A customer is fully defined only when all of the fields
that are required for that customer are filled.
Note
If business partners and partner functions [page 332] are used instead of customers (only on Quote 2.0
tenants), all partner functions are automatically added to the list and customer-specific fields are not
available.
The other fields that can be set to as required fields are custom fields (see the section on Custom Quote Fields
[page 360] for how to add custom fields). All custom fields added are automatically populated on the left
(Fields rows) of the Required Fields by Workflow Action table.
A field can be required for a particular action by checking the checkbox in the intersection of the field and that
action and clicking Save. Also, a condition can be set that must be true before the field is required. To set a
condition, click the button next to the checkbox by the intersection of the field and the associated action,
and enter a condition using the syntax builder. Click Save after setting a condition.
On the user side, when the user selects the action via a button or a drop down box, SAP CPQ checks if the
required fields have been filled out and if not, SAP CPQ displays a message box and then redirects the user to
the tab containing the required field.
After clicking OK button, user will be redirected to the appropriate quote tab so that he can enter the required
field.
In addition to controlling the visibility of Quote Actions based on the Quote Status, administrators can now hide
certain Quote Actions by using conditions (For example, text in a part number) without any need to customize
the Quote user interface. Item Actions define which actions can be performed on individual items in the Quote
depending on the status of the Quote. The functionality is managed in Setup Workflow/Approval Item
Actions Workflow .
Quotes are organized in My Quotes, Waiting for Approval and Other Quotes sections to match the Quote
organization on the user side in SAP CPQ. A table in each section has two columns:
Clicking or opens a page for managing visibility. For each status, you can manage the visibility of the
following actions by selecting/unselecting the respective checkbox:
The icon shows next to each action. Clicking it opens the formula builder for creating conditions for
additional visibility restrictions. When a condition is created, a flag icon shows next to the formula builder icon.
The conditions should be built on the following rules:
Example
To hide the Edit action for all Quote Items that have a part number SMB2, the following example formula could
be used:
To hide the Edit action for the User Type Contract Management, you could use the following example formula:
actions are available for each product in the Quote under the icon.
This section of online Help deals with pricing mechanisms and ways in which calculations are performed in SAP
CPQ.
The Cart Fields administrative section allows you to define which fields in the cart will be editable for each user
group and order status.
It is also possible to define which calculations will be executed on action calculate for each Editable Field
Group. An Editable Field Group is a set of cart fields, which are associated with the same calculations. Actions
performed in Cart Fields Administration are logged in Audit Trail Admin Actions .
The Cart Fields administrative section can be accessed by clicking Cart Fields under Pricing/Calculations. This
brings up the Status - User Group Grid as shown in the image below:
On mouse-over, user can see which fields are editable for each User Group - Status combination. For example,
Editable Fields for the User Group Sales and order status Quote won are shown in the image below:
To define Editable Fields and Calculations for a single User Group - Status combination, click the button.
To set Editable Fields and Calculations for all order statuses of a specific user group, click the User Group name
at the top of the grid as shown below.
SAP CPQ also allows user to set Editable Fields and Calculations for all user groups and statuses by clicking the
Set all link.
Note
The Default column allows setting Default Editable Fields and Calculations, which will be applied to each
newly added user group or order status.
Clicking the button, User Group name, Status name, or Set all link will bring up a screen where user may
define Editable Fields and Calculations. (See Adding/Removing Editable Fields [page 483]).
Clicking the button, User Group name, Status name, or Set all link in the Status - User Group Grid (See Status -
User Group Grid [page 481])will bring up a screen where user may define Editable Fields and Calculations.
• Fields – The Fields list box allows for the selection of available fields, which are not editable.
• Row Types – Editable fields from the Fields list box can be filtered by selecting the appropriate row type
from the Row Types drop down menu.
• Calculations – The Calculations list box lists all available calculations. When you click on a calculation, you
will see a detailed explanation of what that calculation exactly does.
• Copy From – The Copy From option allows you to copy existing settings from other User Group - Status
combinations.
Note
If you select List Price to be an editable field, you will also need to adjust the Allow Edit List Price on the Cart
application parameter. See Application Parameters [page 637] for more details.
If this parameter is set to Cannot Change List Price, List Price will not be editable even if specified in Cart Fields
Administration.
• Can Change List Price if it's 0 – the user can change the price only if the product’s price is zero.
• Can only increase List Price – the user is only allowed to increase the product's price.
• Can change any List Price – the user can change the price without restrictions.
Calculations listed in this section will be executed when add item or update actions are invoked. The three
calculations listed in this section (See the figure above) are the base calculations used for calculating all fields
in the cart.
The Editable Field Groups and Related Calculations section of the definition screen shows the Editable Groups
and related calculations.
The Add new field set link adds a new Editable Group. An Editable Group can be marked as default by selecting
the Default checkbox. This means that these fields will be editable when you enter the cart for the first time. If
no group is set as default, the system will sort visible columns (columns from the personal quote layout page)
based on the system sorting mechanism and make the editable group of the first column default. One active
editable group always needs to exist, which is why it's recommended to always set one as default. Only one of
the groups can be editable at a time, but more than one field can be a part of an Editable Group.
For settings shown in previous two figures, the cart will appear as shown in the following figure. The first time
you enter the cart, the Total Net Price is editable, but by clicking on Sub -Total this field becomes editable.
First, select ProductType - Multiplier and ProductType – DiscountPercent from the Fields list. Click on
(marked with a green circle in the figure above). This will add these fields to Editable Field Group 2, and remove
them from the list of available fields.
Note
From the Calculations list box in the Available Fields and Calculations section, select the calculations you wish
to add to these fields (use the Ctrl key to select multiple calculations). Click on (marked with a red circle
in the figure above). Sort the calculations by clicking on (marked with a blue circle in the figure above).
The order of the calculations is important. If you are having problems with the cart check to see if the order
of the calculations is correct. Usually the last three calculations for a group should be the ones listed in the
Item Add/Update Calculations section, in that order.
If you wish this Editable Field Group to be default, select the Default check box (marked with a yellow circle in
the figure above).
Finally, when you have finished defining the Editable Fields, click on Save at the bottom of the screen.
Note
If an editable group is in focus on the quote, the calculations tied to that group are executed even if users
change the value of some other field that is not in that editable group. Consequently, it may happen that
users change the value of one custom field and then the value of another field, but the system triggers the
calculations tied for the first field because that field is still in focus.
The Quote Comment field is a total field such as Total Amount, Total List Price, etc. Once the field has been
made Editable, users can use it to input comments related to the quote.
To see what a non-editable Quote Comment Field and an editable Quote Comment Field look like on the user
side, take a look at the following figures respectively.
This feature gives user ability to use rolled-up fields (rolled-up recurring list price, rolled-up recurring extended
list price, rolled-up recurring net price, rolled-up recurring extended amount, rolled-up recurring cost, rolled-up
recurring extended amount, rolled-up recurring gross margin, rolled-up recurring discount amount, rolled-up
recurring discount percent, rolled-up recurring net difference from base item, rolled-up recurring end customer
unit price and rolled-up recurring end customer extended price). Rolled up fields for main item are calculated
as summary of all items’ field amount belonging to same configuration (for example, rolled up list price is a
summary of all items' list prices).
Recurring rolled-up fields can be displayed in generated document and sent to CRM. These fields are
calculated only if application flag is set that recurring prices are used in the system.
For each of these fields, new CTX tag are developed on the CurrentItem tag.
Tag name is same as for non-recurring fields, with prefix MRC added (example -
<*CTX( Quote.CurrentItem.MRCRolledUpDiscountAmount.DefaultDecimal )*>)
When user edit rolled-up recurring net price recurring discount is recalculated for all (main and line) items.
Example:
Product total price is 1200 and product cost is 720. Recurring discount percent is 10%.
When user edit rolled-up recurring net extended amount recurring discount is recalculated for all (main and
line) items.
Example:
Product total price is 1200 and product cost is 720. Recurring discount percent is 10%.
When user edit rolled-up recurring gross margin recurring discount is recalculated for all (main and line) items.
Example:
Product total price is 1200 and product cost is 720.
When user edit rolled-up recurring discount percent recurring discount is recalculated for all (main and line)
items.
Example:
Product total price is 1200 and product cost is 720.
Recurring rolled-up extended amount is 1080. Rolled-up recurring discount percent is 10.
When user edit rolled-up recurring discount amount recurring discount is recalculated for all (main and line)
items.
Recurring rolled-up discount amount is 120. Recurring discount is 10. Rolled-up recurring extended amount is
1080.
Recurring discount is calculated to 8.33. Rolled-up recurring extended amount is calculated to 1100.
When user edit rolled-up recurring net price relative recurring discount is recalculated for all (main and line)
items according to their max and min discount percents.
Example:
Product total price is 1200 and product cost is 720. Recurring discount is 10%.
Max discount percent for main and line items is 40% and min discount percent for main and line items is 5%.
When user edit rolled-up recurring extended amount relative recurring discount is recalculated for all (main
and line) items according to their max and min discount percents.
Example:
Product total price is 1200 and product cost is 720.
Max discount percent for main and line items is 40% and min discount percent for main and line items is 5%.
When user edit rolled-up recurring gross margin relative recurring discount is recalculated for all (main and
line) items according to their max and min discount percents.
Example:
Product total price is 1200 and product cost is 720.
Max discount percent is 40% and min discount percent is 5% for main item.
Max discount percent is 20% and min discount percent is 5% for line item.
Recurring discount for main item is calculated to 26%. Recurring discount for line item is calculated to 14%.
When user edit rolled-up recurring discount percent relative recurring discount is recalculated for all (main and
line) items according to their max and min discount percents.
Example:
Product total price is 1200 and product cost is 720.
Max discount percent is 40% and min discount percent is 5% for main item.
Max discount percent is 20% and min discount percent is 5% for line item.
Recurring discount for main item is calculated to 21.8%. Recurring discount for line item is calculated to 12.2%.
When user edit rolled-up recurring discount amount relative recurring discount is recalculated for all (main and
line) items according to their max and min discount percents.
Example:
Product total price is 1200 and product cost is 720.
Max discount percent is 40% and min discount percent is 5% for main item.
Max discount percent is 20% and min discount percent is 5% for line item.
Recurring discount for main item is calculated to 15.5%. Recurring discount for line item is calculated to 9.5%.
This feature gives user ability to use rolled-up cost and margin on the item level.
Rolled-up cost is displayed on the main item level and represents sum of main item and line items costs. The
same applies for rolled-up margin.
When user edit rolled-up net price discount is recalculated for all (main and line) items
Example:
Product total price is 1200 and product cost is 720. Rolled-up margin is 40%. User edit rolled-up net price and
enters 1000. Discount is calculated for all line items to 16.67%. Rolled-up GM is calculated to 28%.
When user edit rolled-up gross margin discount is recalculated for all (main and line) items.
Example:
Product total price is 1200 and product cost is 720. Rolled-up margin is 40%. User edit rolled-up gross margin
and enters 25%. Discount is calculated for all line items to 20%. Rolled-up price is calculated to 960.
7.2 Pricebooks
A Pricebook contains prices for products in SAP CPQ. In case of multiple prices for one product (discounts,
special offerings, loyalty discounts, etc.), each price should be defined in a separate Pricebook. Multiple
Pricebooks are grouped under a Market.
Example
A company Europe Trucks sells truck tires through sales channels. The channels are organized into Bronze,
Silver and Gold. Each group has multiple underlying sales channels. Since Gold vendors have a long-lasting
So that the system could retrieve a Pricebook specific for a Customer (Customer 7 - Scandinavian Trucks)
administrators create a visibility formula [EQ](<*CTX( Quote.Customer(BillTo).Company )*>, Scandinavian
Trucks) and the specific Pricebook is retrieved when Users select Scandinavian Trucks as the Bill To Customer.
When the Vendor 3 logs into SAP CPQ, the system retrieves the prices from the Vendor 3 Pricebook. If no
prices are define in this Pricebook, the system pulls the prices from the parent Pricebook Gold.
Create a Pricebook
To create a Pricebook, you first need to group it under a Market, define who sees it and then add entries
(products and prices).
Visibility Conditions
Creating simple and advanced visibility conditions enables Administrators to support Users' complex pricing
scenarios. By setting corresponding visibility conditions, Administrators can relate a specific Pricebook to a
Customer so that it automatically displays once Users select the Customer. Note that the pricebook won't
To create a visibility formula, select the Advanced visibility checkbox and a dedicated box for the formula
displays. You can define the visibility formula in the formula builder by using the Quote-level and User-level
tags. Please note that by entering 1 in the dedicated box you enable visibility to all Users. The system activates
the advanced formula every time the respective Quote is modified.
The Visibility conditions section shows if advanced visibility is disabled. To create a simple filter, select a field
type, an operator and enter a value. Simple visibility relies on the User and Customer fields and the logic OR
is applied between the visibility conditions. If you need more complex conditions and the logic AND between
them, you should create an advanced formula. The system supports multiple filters.
Default Pricebook
When retrieving prices for products in a new Quote, the system first looks for the User's default Pricebook. The
feature is managed on the User Page.
A default Pricebook is Market-specific, so before selecting the default Pricebook on the User Page, Users
should first select the default Market. On their side, Administrators can select the default Market and
Pricebook for each underlying User in Setup.
Note
The fields for selecting the default Pricebook on the User Page and the Pricebook in Quote do not display in
the following scenarios:
• The logged User does not have the rights to see any Pricebooks.
• The visibility conditions set up for Pricebooks prevent the fields from showing on certain Quotes.
• The tenant does not have any Pricebooks defined because custom tables are used for pricing.
Pricebook Hierarchy
SAP CPQ enables Clients to manage complex pricing scenarios in which a Product's price depends on multiple
conditions. Pricebooks in SAP CPQ are organized in parent/children hierarchy in levels within a Market. You can
create as many parent and children Pricebooks as you need to achieve specific business goals.
When managing a Quote, Users first need to select its Market and the default Pricebook will display, if defined.
Additionally, the system loops through the Pricebooks from the bottom to the top to display other Pricebooks
visible in the same Market so Users could override the default selection. If only one Pricebook is available, the
system selects it by default. The system filters Users by the visibility rules defined by the Administrator.
• Pricebooks visibility hierarchy is kept when loading old Pricebooks in new SAP CPQ versions, meaning that
a Pricebook with the highest visibility level will have the highest level when loaded in the new version.
• When loading Quotes created in versions prior to 2017.4, the ID of the assigned Pricebooks is null. The
system selects the default Pricebook according to the logic used in previous versions (the Pricebook with
Note
If Users decide to change the Pricebook, the system recalculates the prices of all Quote items based on the
newly selected Pricebook.
• When copying and reassigning a Quote, if Users additionally reconfigure it, the entire Quote is copied/
reassigned and the Pricebook visibility is reconfigured. The system copies the selected Pricebook even if it
is no longer visible.
• When loading Quotes with inactive Pricebooks (removed from the system) and invisible Pricebooks (the
User does not have the necessary permission rights), a warning message displays next to the Pricebook
drop-down indicating that the Pricebook is no longer available and suggesting that the new Pricebook
should be selected.
• Regarding the Quotes in the Other Quotes tab, the logic applied for Markets is used for Pricebooks as well.
Previously selected Pricebooks are used on Quotes even though the visiting Users cannot access them.
Visiting Users can apply their Pricebooks which automatically recalculates Quotes. Pricebooks selected by
visiting Users also apply to the Quote owner.
Application parameter, which can be found in Setup General Application Parameters General
Parameters , named ‘Show effective dates for price book entries’, is responsible for ability to record different
prices for same combinations of part number + price code in price books but for different validation period.
When this parameter is set to TRUE user can define validation period for particular price book entries. In Setup
when accessing particular price books, two additional columns will be visible (‘Valid From’ and ‘Valid Until’) -
Figure 1, when this parameter is set to FALSE these two columns won’t be visible - Figure 2, and system will
behave as before (validation period for price book entries won’t be defined). Same will be if admin tries to add
or edit some price book entry - Figure 3 and Figure 4.
Note
The Show effective dates for price book entries parameter limits adding duplicate pricebook values (entries
with the same part number and the same price code) as explained in the Duplicate Pricebook Entries
section [page 540].
Figure 2
Figure 3
On user side same behavior will be defined, when parameter is set to TRUE columns Valid From and Valid Until
will be visible - Figure 5, in other case when parameter is set to FALSE they won’t - Figure 6. Same will be if user
tries to add or edit some price book entry - Figure 7 and Figure 8.
Figure 5
Figure 6
Exporting price books will behave as before, when application parameter is set to FALSE columns Valid From
and Valid Until won’t be exported - Figure 9, and when parameter is set to TRUE they will be shown - Figure 10.
Figure 9
Template for import will be the next - Figure 11. If application parameter is set to TRUE two new columns will
be taken into consideration, otherwise they won’t. Columns Valid From and Valid Until must be in date format
(‘mm/dd/yy’) or empty, or otherwise it won’t be imported in price book. Error will be shown.
Figure 11
For price book entries that were created before this application parameter was included in system, or columns
are left empty during the import, these entries will have unlimited validation period, and columns for Valid
From and Valid Until will be empty when application parameter is set to TRUE. This means if column Valid
From is empty and column Valid Until has some value (e.g. 12/12/12), price book entry won’t have valid
from restriction, and it will be valid until 12th of December 2012. If column Valid From has some value (e.g.
02/02/12) and doesn’t have value for Valid Until, price book entry will be valid from 2nd of February 2012, and
won’t have valid until restriction. If both columns are left empty price book entry won’t have any restrictions
and it will be valid always.
Note
Two validation periods must not overlap for the same part number (or part number and price code),
otherwise correct system behavior can’t be guaranteed.
This feature brings us ability to improve pricing mechanism so that it can handle part numbers that are
dynamically created in run time. This means that prices for products or attributes that have dynamical part
numbers, and use price books can be calculated through run time.
1. Prevent users from quoting part numbers that haven’t got a price in pricebooks
2. Prevent users from adding product selections containing attributes that don’t have a price in pricebooks
Depend on if these parameters are turned on or off, system will behave as described below:
• If the products part number is incomplete, or part number can’t be found in price book, and parameter 1
is turned on, although configuration is complete and user won’t be able to add that configuration to cart
(Figure 1), explanation will be given in responder, and price for product will be 0.
Figure 1
• If the products part number is incomplete, or part number can’t be found in price book, and parameter 1
is turned off, configuration is complete and user can add that configuration to cart (Figure 2), but price for
product won’t be found in price book and price for that product in cart will be 0.
Figure 2
Figure 3
• If the attribute part number is incomplete, or part number can’t be found in price book, and parameter 2
is turned off, configuration is complete and user can add that configuration to cart (Figure 4), but price
for attribute won’t be found in price book and price for that attribute will be 0 in cart, Total price will be
calculated.
Figure 4
• If both parameters 1 and 2 are turned off and product part number and attribute part number can’t be
found, although configuration is complete user won’t be able to add that configuration to cart, explanation
will be given in responder (Figure 5).
On Admin side there will be two application parameters in Setup General Application Parameters
Configurator :
1. Prevent users from quoting part numbers that haven’t got a price in pricebooks
2. Prevent users from adding product selections containing attributes that don’t have a price in pricebooks
If you go to Product/Attribute Options tab in product edit, and edit some attribute, you will see that for the
attribute values that are using price books there is a new field ‘Price Code’ (Figure 6). Depend on that (price
code and part number) prices from price book will be calculated, first from child price book, and if price code +
part number can’t be found there, SAP CPQ will look in parent price book for same codes.
If you click on ‘View prices’ on some attribute value that uses dynamic price code following message will
appear (Figure 7).
Figure 7
If you are on Product Definition tab, and your product is using price book lookup and has dynamic part number,
if you click on ‘View Prices’ following message will appear (Figure 8).
7.2.3 Promotions
SAP CPQ feature “Promotions” allows SAP CPQ administrators and sales representatives to configure and
offer special pricing for the particular product or group of them. Administrators have the possibility to define
different promotions that could be customized based on user type, company or condition(s).
SAP CPQ promotions feature in Responsive Design offers more flexibility when it comes to defining, organizing,
configuring, etc. Based on which design you’ve selected for your SAP CPQ environment, make sure you
are reading the right part of this help page which describes “Promotions” in Classic and Responsive design
respectively.
To add a new promotion, click on Add New button. This brings definition page for promotions which have two
tabs: Definition and Pricing Details. See the following figure.
As soon as you fill out the form, click on save and go to Pricing Details tab.
Under this tab, you should select product that you want to offer discount on, and conditional product(s) that
will provide condition rules for the promotion to be triggered.
You can select a discounted product by typing its Part Number, or by browsing through the list of products in
your system.
Type:
• Calculation Type “All Items Same Price” should be applied for scenarios where discounting actions are
applied equally to all items (example – ‘If you buy more than 20 items of the product, you get 5% discount
on all those items’).
Loop:
This option should be selected for discounting actions where users will get a discount on certain number of
items for every number of products they purchase (example – ‘For every 10 items that you buy, you get 2 for
free’)
Quantity Breaks: In this part, you define ranges (Quantity Breaks) in quantity to which the particular pricing will
be applied. Take a look at two examples
Example 1: If you select option "All Items Same Price" under “Calculaton type” and set up Quantity Breaks as
follows:
Discount Percent 10 1 5
Discount Percent 20 6 10
Discount Percent 30 11 15
Then, when you add 4 items into the quote, they will be discounted by 10% each. Also, if you buy 13 itmes, they
will be discounted by 30% each.
Example 2:
If you select option "Each Brake Own Price" then if you buy 4 items, they will be discounted by 10% each, but if
you buy 13 items then first 5 items will be discounted by 10%, next 5 items will be discounted by 20%, and the
remaining 3 items will be discounted by 30%.
If you go to Configurator and add one product (BMW 3D is selected as condition product in our example), then
you get informed in the quote that your order qualify for special promotion. (See the following figure).
This portion of page delivers information on "Promotions" functionality while using "Responsive Design". If you
are using "Classic Design", please refer to the previous section.
Under "Definition" tab you can choose a promotion type. There are two types, actually ways, to define
promotion details:
• Pricing Details – this option means that you are going to define promotion details under the tab “Promotion
Details” and will not use ”Scripting” for that purpose
• Scripts – this option means that you are going to write an IronPython script to define promotion details
Many fields on this form are self-descriptive. You can define a period of time in which the particular promotion
will be active. Also, you can choose an option “Subsequent rank override” that will cause all promotions with
rank lower than rank of the current promotion to be suspended.
Pricing Details
Under this tab, you can select product that you want to offer the discount on, and conditional product(s) that
will provide condition rules for promotion that is to be triggered. For example, if you want to create promotion in
the way that, if a user buys one product (conditional) then she can buy another product or number of products
at a lower price. You are allowed to define zero or more conditional products.
You can select a discounted product by typing its Part Number, or by browsing through the list of products in
your system.
Also, beside discounted product, the promotion can be set to be valid for the entire product type or product
category. You can set this in the appropriate setup form (See the following figure). Setup of product type
promotion and product category promotion is similar to the described setup for product promotion setup.
Setting the application parameter Search exact product part number for promotions to TRUE speeds up the
search of promotion products on the quote in cases when their name is not defined in Setup Pricing/
Calculations Promotions/Special Pricing , but only their part number. The parameter is by default set
to FALSE and before changing its value to TRUE, revise the existing promotions and make sure that all
products have unique part numbers.
Type:
• Calculation Type “All Items Same Price” should be applied for scenarios where discounting actions are
applied equally to all items (example – ‘If you buy more than 20 items of the product, you get 5% discount
on all those items’).
Loop: This option should be selected for discounting actions where users will get a discount on certain number
of items for every number of products they purchase (example – ‘For every 10 items that you buy, you get 2 for
free’)
Total Allowed Uses field refers to the quantity of the product offered under promotional conditions. The number
of products available for the promotion will decrease each time the product is added to the quote. If products
are offered outside of a promotion, the total allowed uses will not be calculated.
Quantity Breaks – In this part, you define ranges (Quantity Breaks) in quantity to which the particular pricing
will be applied. Take a look at two examples.
Example 1: If you select option "All Items Same Price" under “Calculaton type” and set up Quantity Breaks as
follows:
Discount Percent 10 1 5
Discount Percent 20 6 10
Discount Percent 30 11 15
Then, when you add 4 items into the quote, they will be discounted by 10% each. Also, if you buy 13 items, they
will be discounted by 30% each. Note that Promo Discount Percent displayed in the Quote is same for each
item.
Example 2:
If you select option "Each Brake Own Price" then if you buy 4 items, they will be discounted by 10% each, but
if you buy 13 items then first 5 items will be discounted by 10%, next 5 items will be discounted by 20%, and
the remaining 3 items will be discounted by 30%. Note that Promo Discount Percent displayed in the Quote is
calculated as overall discount, based on the promotion rules.
From time to time there might be a situation when you want to add one or more products as conditional
when setup promotion. SAP CPQ makes it possible and allows you to choose whether you are going to create
condition using "AND" or "OR" logic between conditional products, product types or categories. SAP CPQ
groups conditions based on the login operator you had chosen during promotion set up.
For promotions that have complex discounting rules, administrators now have the option to write IronPython
script. Scripts written during promotion setup will be executed on the "Add item to cart" event.
Scripting promotions can be applied in two ways depending on If selected product for triggering promotion is:
In the first case, Item of type "IQuoteItem" can be used in script. This is a current item whose properties can be
changed.
In the second case, promotion discount and amount need to be calculated through script in order to be applied
on defined item.
Currencies are used to convert the default currency to a foreign currency. SAP CPQ calculates foreign
currencies by multiplying the conversion rate given in table Currencies by default currency price. This amount
is then multiplied by Market Definition to get the final converted price. Market Definitions give the ability to vary
the amount of conversion for different areas. For instance, in the US, the Dollar is worth a standard amount,
but it may be worth a different amount if used somewhere else. To compensate for this, market definitions can
multiply the US Dollar, or any other currency, by a value greater or less than 1 to give the US Dollar a higher or
lower value.
One of the currencies has to be set as the default currency. The US Dollar (USD) is the default currency used
throughout the system and is the base currency. For the purpose of the manual, we’ll keep the US Dollar as the
The Currency column displays the common abbreviation of the currency, the conversion rate displays how
many units of that currency is equivalent to 1 unit of the default currency (the default currency has a
conversion rate of 1), the description displays the longer description of the currency, the sign displays the
sign entered for that currency, and the default column displays whether the status is the default status or not
(only one of the currency has a YES in the default column).
The fields in yellow are required. User will enter a short name of the currency in the currency column (because
this name would be used to refer to this currency throughout SAP CPQ), than will enter the conversion rate
of the currency relative to the base currency, brief description of the currency, a sign for the currency, and
choose whether the currency would be the default or not. If some other currency is currently set as the default
currency, a confirmation screen would pop up informing that another currency is currently set as the default
currency. Click OK to make the current currency the default or click Cancel to cancel changing the default
status to the current status.
Note
The other currencies are available to modify the currency factor. Because USD is the base and default
currency, its factor cannot be changed and is always constant at 1. Figure A shows the screen displaying the
current currency factors. The , and buttons are used to copy, delete or edit a currency respectively.
Currency symbol can be changed, but it is important to know that changing it you will affect all markets and
therefore all quotes that uses that currency. It is not possible to change currency symbol to one already used.
Note that a currency cannot be deleted while the currency is being used by a Market (See Markets [page 519]
for more information) or while the currency is the default currency. Attempting to delete a currency that is the
current default currency would result in an error message. Attempting to delete a currency that is being used
by a market would also result in an error message.
The left column displays the currency description, while the middle column displays the currency abbreviation.
The abbreviation is used on the Market Definition page to modify the value of the currency. To edit a currency
factory, delete the current factor, enter the new one, then click Save.
Once currency factors have been entered, Market Definitions need to be defined. Market Definition factors are
multiplied by the calculated currency to get the final price.
Market Definitions can be defined by clicking the Market link under the Pricing/Calculations menu.
Here Market Definitions can be Copied, Deleted, or Edited by clicking the respective symbol to the left of the
Market Code. To create a new Market Definition click Add New at the top. This brings up a blank definition
screen.
Every field is required and needs to be filled in order to save the definition. The Market Code is returned with
the tag <*MCODE*> which can then be used with an AUX or XWS tag to access additional information from
another source. Market Name is used to identify the Market Definition. When a user selects the Market in the
cart or on their user page, the Market Name is used for the selection. Currency Sign is the currency that, once
calculated, will be multiplied by the Market Factor to get the final price calculation.
Example:
The Currency factor for the European Monetary Union (EUR) is set to 0.95 and a Market Factor using EUR is set
to 1.2. If the total cart amount comes to $2000, then this amount will be multiplied by the EUR conversion rate
(0.95) then by the Market Factor (1.2) to get €1656. This is the final price calculation.
Once a Market has been defined, it is not visible until a user has been given permission to see the Market. This
is handled in Market Visibility [page 520].
Note
When SAP CPQ is integrated with SAP Subscription Billing, you can select a timezone for a market. The
contract duration and the start and end dates of the subscription product are observed as midnight in the
timezone specified for the market assigned to that product.
Once a Market has been defined, it is not visible until a user has been given permission to see the Market.
This is handled in Market Visibility under Pricing/Calculations. Here visibility rules can be created to determine
which user(s) see which Markets.
The Market Visibility Administration page is shown in the following figure. Here visibility rules can be Deleted or
Edited by clicking the respective symbol to the left.
To add a new rule, click Add New at the top of the administration screen. Creating a new visibility rule brings up
the screen shown below.
Three criteria fields are displayed at the top of the screen: User, User Type, and Company. Defined Users
(Employee), User Types (Type), and Companies are listed in each field. Selection of the criteria fields
The Market Name field displays the Market Definitions that have been created. To select multiple markets
(under the Market Name list-box), click and drag to select multiples, hold down the Ctrl key and make multiple
selections, or click one hold down the Shift key and click another to make multiple selections. The Condition
field can contain any valid expression that can be evaluated as “1” (True) or “0” (False). If the result is “0”
(False) the rule will not apply. If the expression evaluates to “1” (True) then the rule will be applied.
Note
SAP CPQ evaluates market visibility rules on user login, meaning that none of the quote-dependent tags
will work in the market visibility condition.
7.6 Discounts/Multipliers
Multiplier and discount administration allow discounting when a quote is created.
In addition to developing pricing rules for configured products, discount and multiplier rules can be created
also. These rules can be very specific, down to a particular user and a product, or very generic such as for a
particular user group, product category or a product type. Any combination of selections from 5 criteria groups
can be used to specify a discount or multiplier.
Multipliers and Discounts can be used individually or simultaneously. Minimum Value, Default Value, and
Maximum Value can be assigned for each. The Default Value is used when a user first generates a Quote.
Depending on the Shopping Cart style used (see Visual Styles in User Types [page 144]), the Default Discount,
or Multiplier Value, applied to the Cart Total can be modified. Users are allowed to enter values that are within
the Maximum and Minimum Value range. If a user enters a value outside of this range, then the Approval
Process (see the chapter on Approval Process) is initiated.
Note
Default Value is only applied to the Cart the first time that a user generates it. If the Discount or Multiplier
is modified then that value is contained as the Discount or Multiplier value. Reopened quotes will have the
modified Discount or Multiplier value.
The Discounts and Multipliers administration can be accessed through the Discounts/Multipliers link under
Pricing/Calculations.
Discounting rules can be deleted or edited by clicking or respectively. Rules can also be searched by
entering criteria in the text boxes at the top and clicking the Search button on the left. To add a new rule, click
Add New at the top of the screen. This brings up the screen shown below, which is also displayed if a rule is
edited.
Discounting rules can be specified from 5 criteria groups that are shown at the top of the page:
• User Group
• User
• Category
• Product
• Product Type
The priorities of these groups are determined by what is set in Discounting under the Discounting Priorities
menu (see Discount Priorities [page 524]). Fields displayed to the left have higher priority. For instance, in
the examples shown below, User Type has the highest priority. It should also be noted that the labels for each
criteria can be changed in Priority Administration. So label names may be different from what is discussed
here.
Multiple selections within each group are not allowed though. Multiple selections across different groups are
allowed. When selections are made across different groups, the discount or multiplier is applicable only when
all selections are true. Rules can to be created for each individual item in a criteria list if desired.
When check box ‘Use recurring price and cost’ has been activated under SAP CPQ Setup General
Application Parameters General , fields for ‘Discounts for Recurring Price’ and ‘Multiplier for Recurring
Price’ will be added. For more details see Recurring and Non-Recurring Prices [page 533] section.
Multipliers are values such as 0.5, 0.75, etc. that when applied to the list price will represent a percentage of the
price, such as 50 or 75.
Discounts, on the other hand, are values such as 50, 25, etc. that when applied to the list price will represent
that percentage taken off of the price.
The Condition field is used to enter expressions to determine when the rule will run. Any expression entered
must resolve to 1. Entering into the Condition field will make the rule active at all times.
The example above shows a rule that users Bane Purtic from the user group CUSTOMER, can sell Personal
Printer from the category Hardware using multipliers from 0.5 to 1 and/or discounts from 0 to 50, as long as
those products are of product type Product. Also, according to the condition statement, this rule will only run
when the user’s Zip Code is 53202.
More than one rule can be written for the same product using the same user. When this is the case, the
most restrictive rule will be used. This only works, though, when a rule is defined for the product, not for
product type.
Conditions can also be entered into the Multiplier or Discount fields to determine the value. In this way, multiple
rules do not need to be created for separate values.
This example shows that the user will have a Minimal Multiplier value of 0.25 and Default value of 0.5. The
Maximum value, though, is contingent on the user’s zip code. If their zip code is 53202, then the Maximum
value is 1. Otherwise, the Maximum value will be 0.75.
Conditional statements within the Multiplier or Discount fields can be used separately or in conjunction with
the Condition field.
Note
The User can override values? check box is used to determine whether or not a user can modify the Multiplier
or Discount with a value that is out of the Minimal and Maximum value range. When a user attempts to enter a
value that is out of that range, a warning is displayed alerting the user that the value is out of range.
If this box is unchecked, the user will be unable to enter the value. If checked, though, the user will be able
to enter the value, but the quote is automatically submitted for approval to the user’s approve parent. The
Approval Process is then initiated. See the chapter on Approval Process for more information on the Approval
Process.
Note
The Approval Process must be set up in order for the User can override values check box to work correctly.
In Quote 2.0, discounts are managed on the same page as in Quote 1.0. Since multipliers are obsoleted in Quote
2.0, this page contains only discount administration. In terms of administration and usage, discounts work in
the same way in both quote engines. However, the way the system reevaluates disounts has been optimized
in Quote 2.0. Administrators of Quote 2.0 tenants have the possibility to decide whether the discounting rules
are reevaluated every time their users open a quote and every time reconfigure and recalculate actions are
triggered in quotes. By deciding not to reevaluate discounting rules always but only when a specific condition is
met, administrators improve the overall performance of their systems.
Example
For example, you want to allow all sales representatives to discount a product to a maximum of 10%. However,
a sales representative in Paris can discount the product to a maximum of 20%, because you just opened the
store there and you want to give a better initial offer to buyers. In this scenario, you would create a discount rule
for the specific product with a minimum discount of 0 and the maximum discount 10. Then, you would create
another rule for the specific user in Paris, and the product and the rule would allow 0 as the minimum discount
and 20 as the maximum discount. The first rule would have the rank 1 and the second rule for the specific
user would have the rank 0. This way, when any user changes the discount of the before mentioned product on
the quote, the system checks user details, and if it’s not the user from Paris, the system then checks whether
the new discount is in the limits of the rule defined for that specific product. However, if the user from Paris
changes the discount, then the system only applies the rule which is defined for that user.
The discounting rules are set up in the Discount/Multipliers page for Quote 1.0 and the Discounts page for
Quote 2.0. Both pages are in the Pricing/Calculations section.
The discount rules can be set for a specific user, user type, a specific product, product type, and product
category. If needed, per company needs, you can define a custom label for each field.
Rank
The rank of rules can be set from 0 to 5, 0 being the highest rank and 5 the lowest. If you create a rule for a user
with the rank 0, and a rule for a user type with the rank 5, the system will first evaluate the rule set up for the
user, since it has the lowest rank.
The rules are applied when users change both item discounts and product type discounts, but the system
evaluates them differently. When you apply a discount to an item, all rules are evaluated and applied according
to their rank. However, if you apply the discount to a product type, the rules based on the product category
and a specific product will not be evaluated. The reason behind this is that products in one category can have
different product types. In the same way, if you change the discount on a product type, the system won’t
evaluate the discount set for a specific product because that product type probably contains other products as
well.
If Cart amount limit is exceeded then a workflow rule will reroute the Cart accordingly (see Approval Process
Administration [page 462]). This chapter will discuss creating rules which limit the Carts total amount limit
using simple and complex conditions.
Selecting the Total Amount Limit under Pricing/Calculations will bring up the Total Amount Limit screen.
Selecting Add New brings up the Total Amount Limit screen shown in the next picture. In this example, user Will
Peterson is limited to $1,000.
The Condition field can contain any valid expression that can be evaluated as “1” (True) or “0” (False). If the
result is “0” (False) the rule will not apply. If the expression evaluates to “1” (True) then the limit will be applied.
The same simple rule can be created, but applied to an entire group. At the next picture the Entire Inside Sales
group can only quote $5,000. If Will Peterson from the previous example was a part of the Inside Sales Group,
he would be able to quote up to maximum of $5,000 because of the Priority Rules used in this example.
Note
Using the 2 examples above we can also create complex rules that would evaluate to 0 or 1 in the condition
field. Instead of using a 1 for John Smith, let’s set his limit based on the location of the customer. At the
In the next example, the Channel Rep Group can only quote up to $5,000 if the Territory of the Customer
equals West. Uses the expression: [EQ](<*CUSTOMERTERRITORY*>, WEST)
When finished, click the Save button. This adds the new rule to list on the Total Amount Limit page. To Edit
or Delete a rule, click the respective symbol next to the group column. Total Amount Limit can be used in the
Approval Process Administration to delegate which user will receive any Submit for Approval requests from
selected users. For more information see Approval Process Administration [page 462].
The tag <*USERAMOUNT*> is used to retrieve the Total Amount Limit for a user
The Margin Health feature in both quote engines allows sales representatives to get a visual indication of
whether their profit margin is within the limits of what the administrator marked as a healthy profit margin.
A dedicated column in the quote shows the corresponding icon and the color depending on the margin health
indicators that the administrator set up.
Note
The profit margin in SAP CPQ is calculated by subtracting the cost from the extended list price (discounted
list price) and calculating the percentage of that amount in comparison with the list price.
Margin health indicators in Quote 1.0 can be set up globally for all users and all items, or for a specific user, user
type, item, and product type.
• in UI Design Quote Layout , move the Margin Health column from available to selected columns to
make it visible on quotes.
• in Quotes Quote Layout Permissions , set the visibility of the Margin Health column for a permission
group by moving the column from available to selected columns. Have in mind that you also need to set the
visibility of the column on the Margin Health Design and Visibility page.
• enable the Margin Health action (add it to the right status in Workflow/Approval Workflow and set
the permissions for it in Workflow Permissions). The Margin Health action allows users to set the margin
health on the quote after which the system recalculates the discount and eventually all other calculations
are triggered according to the setup in Cart Fields Administration.
Note
The Margin Health column is visible on the quote even when the product isn’t in the categories
selected here if the For items where list price is zero, display margin picture as and the For items
where cost is zero, display margin picture as are set to anything but None. Selecting None for these
two fields removes the column from the quote.
Note
If you are creating multiple indicators and some of them are for a specific product type or
a category, and some of them apply to the entire quote, make sure the rules don't overlap.
Otherwise, it may happened that SAP CPQ applies an overall rule to a product, even though there is
already a rule defined for that product.
5. In Step 3, enter the margin health indicators, in percent, for the price and the recurring price.
Note
Set Margin Health for Recurring Price is available only if the parameter Use Recurring Price And Cost is
set to TRUE in General Application Parameters General Parameters .
6. In Step 4, define a specific condition under which what was defined above is applicable.
The Margin Health column is now displayed on quotes.
Related Information
Margin health indicators in Quote 2.0 can be set up globally for all users and all items, or for a specific user,
user type and item.
• in Quotes Fields, Calculations, Layout Layout , add the Margin Health column to make it visible on
quotes.
• in Quotes Fields, Calculations, Layout Layout Permissions , set the visibility of the Margin Health
column for a permission group by selecting the permission group on the left and the MarginHealth column
on the right.
• in Quotes Fields, Calculations, Layout Fields and Calculations , set up the following calculations:
• add Item One-Time Gross Margin Percent calculation to all the quote fields that affect the One-Time
Manufactures Gross Margin calculation.
• add to One-Time Manufactures Gross Margin calculations for one-time discount percent and recurring
discount percent.
Note
The Margin Health column is visible on the quote even when the product isn’t in the categories
selected here if the For items where list price is zero, display margin picture as and the For items
where cost is zero, display margin picture as are set to anything but None. Selecting None for these
two fields removes the column from the quote.
Note
If you are creating multiple indicators and some of them are for a specific product type or
a category, and some of them apply to the entire quote, make sure the rules don't overlap.
Otherwise, it may happened that SAP CPQ applies an overall rule to a product, even though there is
already a rule defined for that product.
5. In Step 3, enter the margin health indicators, in percent, for the price and the recurring price.
Note
Set Margin Health for Recurring Price is available only if the parameter Use Recurring Price And Cost is
set to TRUE in General Application Parameters General Parameters .
6. In Step 4, define a specific condition under which what was defined above is applicable.
The Margin Health column is now displayed on quotes.
On this page, you can define the icon that displays on quotes as the margin health indicator, as well as the color
of the icon, on both quote engines.
The default colors and icons are applied if you don’t select other colors and upload other icons. If you’ve
already uploaded a new icon, you can use the default one again by clicking Restore Default. Have in mind when
uploading your own images that they should fit the size of the Margin Health column on the quote. There are no
restrictions on the supported format of uploaded images.
Furthermore, you can set up whether an icon displays in the Margin Health column, and which one, when the
list price and the cost are zero in the For items where list price is zero, display margin picture as and the For
items where cost is zero, display margin picture as dropdowns, respectively.
Additionally, in Quote 1.0, you need to select the user types for which the Margin Health column displays on
quotes.
Note
Although you have set the visibility for margin health for a user type as a prerequisite in Quotes Quote
Layout Permissions , you still need to select it in the list in the Margin Health Design and Visibility page.
This is applicable only for Quote 2.0.
Related Information
Overview
This feature enables admin to define VAT (per country/region) percentage that will be applied when calculating
quote amount. Admin has the option to define tax calculation based on the country/region found in the Ship To
role, to define formula that will calculate VAT percentage or to make the tax field editable in the quote.
To modify or add a tax percentage for a country/region, click the Country/Region Sales Tax link under the
Pricing/Calculations menu.
Tax percentages can be Deleted or Edited by clicking the corresponding buttons next to the Country/Region
Name. To add a new country/region tax click Add New at the top of the screen.
To create a new tax, on this screen, select the country/region and then enter the percentage that will be
associated with that country/region. Click Save to save the country/region sales tax.
Once created, country/region taxes are added to the quote total. The country percentage used on the quote is
determined by the country/region entered in the Ship to Address. Once a country/region is chosen for the Ship
to address on the Customer Info tab of the quote, the related percentage is added to the total amount.
Note
The result of the formula calculation will override the percentage calculated based on Ship To country/
region (table in the previous screen).If formula is left empty, tax will be calculated based on table values
By clicking on button 'Country/Region Tax Formula' you can define formula for country/region tax. On the user
side when calculating tax, value that is obtained based on this formula will override table values.
Note
If user wants to obtain value from the Country/Region Tax table and use it in formula, it is possible to use
this tag- <*CTX( Global.Tax.Country(<*CTX( Quote.Customer(ShipTo).CountryAbbrev )*>) )*>.
If you want to make country/region tax field editable for your users, you need to set up cart fields 'Total - VAT
Amount' and/or 'Total - VAT Percent' to be editable in the quote. It can be done through Adding/Removing
Editable Fields [page 483] in Cart Fields Administration.
When item is being edited in the quote and cost has been previously changed in the quote, based on the
value of parameter ‘When item’s cost is edited in the quote, upon changing item’s configuration, cost will be
recalculated’, SAP CPQ will recalculate cost based on configuration (if value is TRUE) or leave cost amount that
was entered by user in the quote (if value is FALSE).
Please note that this will only be applicable when item cost can be edited in the quote.
When item’s cost is edited in the quote, upon changing item’s configuration, cost will be recalculated parameter
is placed in Setup General Application Parameters Shopping Cart and Quotes .
Some XSLT transformation for cart doesn't have COST as field instead they have EXTENDEDCOST.
Here are all the steps to edit cost in the cart in that situations:
1. Set the application parameter “Allow Edit Cost on the Cart” to TRUE in Setup General Application
Parameters Shopping Cart and Quotes .
2. Add “Child Item - Cost” and “Main Item - Cost” to an Editable Field Group in Setup Pricing/
Calculations Cart Fields Administration .
3. Change all occurrences of “ExtendedCost” to “Cost” in all user type XSLT files where the costs should be
editable. This can be done by:
a. Downloading the Shopping Cart Visual Style in Setup => Users => User
Types =>
b. Editing the applicable user type =>
c. Downloading the "Visual styles (Shopping cart / Quotes)" XSLT file =>
d. Replacing all occurrences of "ExtendedCost" with "Cost" =>
e. Saving the updated file with a ".xslt" extension =>
Quote prices depend on market factor and currency rate, which can be updated through Setup. By default,
when users edit existing quotes and market factor and/or currency rate have been changed in the system, new
values will be applied to the quote.
If you want to preserve original market factor and currency rate on quotes, you should contact the Support
team to set this up for you. After enabling this option, when users edit existing quotes, original market factor
and currency rate will be applied to the quote.
If system is using original market factor and currency rates, users can still apply new market factor and
currency rates by executing action “Refresh Market and Currency”.
“Refresh Market and Currency” action can be added to cart either as a standalone action - for users to execute
it explicitly, or as a pre or post-action to some other quote action - for system to execute it implicitly without
informing users . This can be set up in Workflow/Approval Workflow menu in administration.
This new feature gives the ability to support MRC and NRC in the same product and on the same line item in
the cart. There will be two sets of prices, multipliers, discounts, margin indicators, margin sliders for each item
and product type. This allows businesses that have monthly billings to be able to accurately display this pricing
in their configuration and in the cart.
A single item can be defined with two prices, a one time fee (non-recurring cost or NRC) and a recurring fee
(monthly recurring cost or MRC). For example this can be very useful when selling software product with initial
installation/setup monthly fee or if some company is selling subscriptions with initial installation cost and
monthly subscription fee.
The cart fields have also been updated to reflect this update, if administrator has chosen to turn it on. In
product configuration, recurring price are added to responder for every attribute where check box ‘Show
Recurring Price’ is selected. This price is displayed under current price. At the bottom of responder (under Total
Price), there is new label ‘Total Recurring Price’ with product recurring price displayed.
All relevant fields in the quote and in quote items (Net Recurring Price, Multiplier, Multiplier Amount, Recurring
Extended Amount, Discount Amount, Recurring List Price, Channel Markup Percent, Recurring cost etc.) are
Only layout for ‘QuoteDefault.xslt’ will be changed to support recurring prices and cost. Parameter ‘Use
recurring price and cost’ will be used to determine whether recurring price and cost fields will be displayed.
In order to use this feature, user has to set up few parameters first.
1. In Setup General Application Parameters General , there will be a check box ‘Use recurring price
and cost’ (not selected by default). For more details, see Application Parameters [page 637] section.
When this is activated MRC/NRC fields in Discounts/Multipliers and Margin Health will be active.
2. In Setup Pricing/Calculations Discounts/Multipliers , fields for ‘Discounts for Recurring Price’ and
‘Multiplier for Recurring Price’ will be added. For more details see Discounts/Multipliers [page 521].
3. In Setup Pricing/Calculations Margin Health Indicators , in step 3, new fields for ‘Margin For
Recurring Price’ are added. For more details see Create Margin Health Indicators in Quote 1.0 [page 527].
4. On Tab 1 of the Product Administration, there is a field for ‘Base Recurring Price’ in ‘Pricing’ section.
5. On Tab 2 of the Product Administration, there are fields for attribute value ‘Recurring Price’ and ‘Recurring
Cost’ in table for attribute values. Also, there is a check box that is labeled ‘Show Recurring Price’.
In Setup Pricing/Calculations Rounding Setup , you can create and apply rounding rules to columns on
quotes. Rounding rules determine how many digits are used in price calculations, how many decimal places are
displayed to users and, in Quote 2.0, which currencies are affected by these calculations.
Note
There is always the Default rounding rule which is used in all calculations whenever specific values are not
provided. This rounding rule can be edited.
Since the Rounding Setup on Quote 1.0 differs from the one in Quote 2.0, they are covered separately in the
following text.
There are two available parameters in Setup Pricing/Calculations Rounding Setup that can be applied
to the rounding logic you wish to be used in your environment.
• Types of Decimal Rounding - determines the rounding method which will be applied to a certain rounding
rule. Its values are:
• Rounding Away from Zero - when a number is halfway between two other numbers, it is rounded
towards the nearest number that is away from zero.
• Rounding to Even - when a number is halfway between two other numbers, it is rounded towards the
nearest even number.
3.5 4 4
2.8 3 3
2.5 3 2
2.1 2 2
-2.1 -2 -2
-2.5 -3 -2
-2.8 -3 -3
-3.5 -4 -4
• Fix Quote Amount After Currency Conversion - This parameter checks if there is a difference between the
total net price and the summed (and rounded) extended amount. For example, if the total net price is 100
and the price of each item is 33.33 (99.99 in total for three items), there will be a difference of 0.01 between
the total net price and the extended amount. If there is a difference, that amount is added to:
• the item with a maximum extended amount if the Fix Items value is selected.
• the total amount if the Fix Totals value is selected.
In Quote 2.0, you currently can't define if the system should round values away from zero or to even because
the parameter Types of Decimal Rounding is not available in Quote 2.0
Note
Identical currencies cannot be selected twice for the same quote column.
When you are setting up a different number of decimal places for displaying or calculating Item or Total
columns on quotes, it is not enough to simply change the rounding setup for that column. Since different quote
columns’ mathematics are executed (on adding/updating items on the quote, changing that column value and
so on) you must know to what decimal place numerical values (quote columns that other columns depend on)
in the mathematical logic are rounded off.
Troubleshooting
Some issues may occur when the rounding is applied to quote columns.
• The Total NRC discount amount exists in SAP CPQ, although neither of the items has a discount value set.
This may appear as a result of a calculation error, which can be caused by an invalid setting in the Rounding
section. One example of this would be items, which have an extended amount with a decimal residue (for
example, 100.5). If the value of the rounding setting is not greater than zero, the value right of the decimal
separator may be truncated, leading to the rounding issue.
The Shipping section provides a means to add shipping and other associated costs to quotes or orders based
on the shipping method selected.
UPS shipping can be integrated into the SAP CPQ configurator. See UPS Shipping Integration for details.
Shipping Definition can be found under the Pricing/Calculations menu by selecting Shipping.
From this screen different shipping methods can be added, deleted, edited or copied. Shipping Methods can be
searched by entering the Method Name, Price Builder Data, Description, or whether the method is editable or
not into the boxes on the Shipping Methods Definition page, and then clicking Search. More Methods can be
seen by clicking the page numbers or the > symbol at the bottom of the page.
To add a new Shipping Method, click Add New. A blank Shipping Method Definition page will be displayed as
shown in the following figure. Existing Methods can be Copied, Deleted, or Edited by clicking the respective
symbol to the left of the Method Name. Selecting Edit would bring up the same page seen in the following
figure. Fields shaded in Yellow are required in order to save the Shipping Method.
Fill in the Name and any Description that would be helpful to the user. This description is what appears in the
shopping cart.
Selecting the Editable check box makes the shipping method an Editable Filed (see Cart Fields Administration
[page 480]).
When complete choose Save. This brings up the first figure again, with the new shipping method included.
On the user side, the Shipping method can be selected through the Freight dropdown.
This feature enables admin to define state tax percentage that will be applied when calculating quote amount.
Admin has the option to define tax calculation based on the state found in the Ship To role, to define formula
that will calculate state tax percentage or to make the tax field editable in the quote.
Tax percentages can be entered for states in Canada and the US. To modify or add a tax percentage for a state,
click the State Tax link under the Pricing/Calculations menu.
Tax percentages can be Deleted or Edited by clicking the delete or edit buttons next to the State Name. To add
a new state tax click Add New at the top of the screen.
To create a new tax, on this screen, select the state and then enter the percentage that will be associated with
that state. All the states in the United States and Canada are available in the State Name dropdown box. Click
Save to save the state sales tax.
Once created, state taxes are added to the quote/cart total. The state percentage used on the quote is
determined by the state entered in the Ship to Address. Once a state is chosen for the Ship to address on the
Customer Info tab of the quote, the related percentage is added to the total amount.
State tax allows for a general tax to be associated with each state. If more specific tax is required within each
state, the use of an external web service (XWS) may be necessary. With this function, complete and updated
sales tax information within each state is available.
Note
The result of the formula calculation will override the percentage calculated based on Ship To state (table in
the previous screen). If formula is left empty, tax will be calculated based on table values
By clicking on button 'State Tax Formula' user can define formula for state tax. On the user side when
calculating tax, value that is obtained based on this formula will override table values.
Note
If user wants to obtain value from the State Tax table and use it in your formula, he can use the tag-
<*CTX( Global.Tax.State(<*CTX( Quote.Customer(ShipTo).StateAbbrev )*>) )*>
If you want to make state tax field editable for your users, you need to set up cart fields 'Total - Tax Amount'
and/or 'Total - Tax Percent' to be editable in the quote. It can be done through Adding/Removing Editable
Fields [page 483] in Cart Fields Administration.
Simple products can have price code defined. If price is derived from SAP CPQ standard pricebooks, it will be
calculated based on part number and price code.
Example
Same product is sold through different channels. For each channel there is a difference price. Administrator
creates several products with same part number and specifies price code for each channel. Prices are
maintained in pricebooks (part number + price code drive the price).
There can't be multiple pricebook entries with the same part number and the same price code, unless they are
effective in different time periods [page 496]. This behavior is managed with two application parameters:
• Show effective dates for price book entries [page 496] – when set to TRUE, the columns Valid From and
Valid Until are displayed in the pricebook table entries. This parameter is by default set to FALSE which
means that administrators can’t enter multiple pricebook entries with the same part number and price
code. If set to TRUE, multiple pricebook entries with the same part number and the same price code can be
entered, in which case different effective dates for the entries should be defined.
Since duplicate values in a pricebook may cause issues with pricing, before changing this parameter to
TRUE, administrators should review their pricebooks and remove duplicate entries.
In case there are already duplicate values in the pricebook and the parameter is then set to FALSE, there is
now a message informing administrator to review and adjust their pricebook.
• Calculate price only based on part number and ignore price code – when set to FALSE, the prices are
calculated based on both the part number and the price code of a pricebook entry. However, if set to TRUE,
the system disregards the price code and calculates prices only based on the part number of the entry.
If both parameters are set to FALSE, the system doesn’t allow adding duplicate values in pricebooks (entries
with the same part number and the same price code), when they are added either manually or via import.
This section details ways in which Customers can be managed in SAP CPQ.
Note
Customers are available only in Quote 1.0. In Quote 2.0, organizational and transactional relationships are
recorded via involved parties [page 332].
The types of customer entities available in SAP CPQ are local and global customers.
Note
Customers are available only in Quote 1.0. In Quote 2.0, organizational and transactional relationships are
recorded via involved parties [page 332].
Local customers can be created either in Manage Customers or by directly adding a customer in the Customer
Info quote tab. By default, local customers are visible only to the user who created them. However, their
visibility can be expanded to the user’s entire company to via Setup Customers/Customer Roles Local
Customer Visibility . Local customers can also be automatically created when landing to SAP CPQ from an
external system, in which case they are visible to the user who landed to SAP CPQ, and are also affected by the
SAP CPQ local customer visibility rules.
Local customers are different from global customers, which are created and maintained by administrators in
the Setup, where their visibility is defined in Global Customer Visibility. Global customers can’t be related to any
individual user. Instead, they exist on the domain level.
When customers are created via API, local customers are created when the payload contains the OwnerId
node, in which case they are assigned to the user with that ID. If the payload doesn’t contain OwnerId, a global
customer is created, instead.
Note
Editability of customer roles depends on whether you are the customer owner or not. Ship-to is the only
role that is always editable for all users. Other roles are editable only for the respective customer owners.
Related Information
Manage Customers
Global Customers [page 550]
Local Customer Visibility [page 548]
Global Customer Visibility [page 549]
The Customer Field Permissions administrative section gives you the option to define how the fields in
customer roles are displayed to the user.
Note
Customers are available only in Quote 1.0. In Quote 2.0, organizational and transactional relationships are
recorded via involved parties [page 332].
Permissions can be defined based on an order’s status and the user group the current user is in. The following
permissions can be defined for each customer role field:
• Hidden - Used for the statuses or user groups that you wouldn’t like the field displayed for. The field isn't
displayed to the users.
• Read-Only - Used for statuses after the quote has been completed, such as Order Placed or Received
Order. The field isn't editable. Whatever value had been entered for the field, it’s displayed as uneditable
text.
• Editable - Used for the initial statuses in which the quote is being created, such as Open. The field is
displayed in whatever format it was defined in.
• Required - Used when administrators want to define this field when they create new customers. Fields
marked as required are editable and displayed with a red asterisk. If users have a customer role set as
Required in the Required Fields by Workflow Action administrative section, then users are required to define
any required fields when that action is performed.
To access the Customer Field Permissions administrative section, click the link under the Customers/Customer
Roles administrative menu. From this screen, you can define permissions for each customer role: Bill To, Ship
To, and End User. You can switch between each through the tabs at the top of the screen.
Customer role fields are displayed for each customer role. The same fields are used for all customer roles. Click
a permission name next to a field to define permissions for that field. This defines that permission for every
user group in every order status.
To set an option to a cell, click the cell to display a pop-up where the option can be selected. You can easily copy
permissions from another customer role’s field, by choosing that field from the dropdown box in the upper
right corner of the screen. There are six different types of cells in the matrix that can be defined:
• All Permissions - Sets the same option for all the cells in the matrix. Click the upper left corner of the matrix
to define.
• All Statuses for One User Group - You can set all the statuses for one user group by clicking the user group’s
name on the left side of the matrix.
• All User Groups for One Order Status - You can set all the user groups for one order status by clicking the
status on the top of the matrix.
• Individual Cell Intersection - You can set a cell intersection between a status and a user group. For instance,
the Sales Rep group should have the customer role field Read-Only when in the Order Placed status.
• Default (For New User Groups) - Set how the customer role field is displayed to the users added to new user
groups that haven’t been set in this matrix yet.
• Default (For New Order Status) - Set how the customer role field is displayed in new statuses that haven’t
been set in this matrix yet.
Note
Selecting an option for a cell that includes all statuses, or all user groups can take some time to set
depending on the number of statuses and user groups created in the system. Large number of groups or
statuses means that there are many cells to set, so there can be a slight delay in setting them all.
When finished defining the advanced customer role field permissions, click Save at the bottom of the page. You
aren't redirected to another page in case you would like to further to define the field.
Note
Customers are available only in Quote 1.0. In Quote 2.0, organizational and transactional relationships are
recorded via involved parties [page 332].
Customer Action in administrative section is available by clicking the link under the Customers/Customer Role
administrative menu. This displays a matrix of user groups and order statuses for each customer role. You can
switch the customer role that is being defined by clicking the tabs at the top of the screen. You can easily copy
action settings from another customer roles by choosing that customer role from the dropdown in the upper
right-hand corner of the screen.
To set actions to a cell, click the cell to display a pop-up where one or more actions can be selected. There are
six different types of cells in the matrix that can be defined:
• All User Groups and Statuses - Sets the same option for all the cells in the matrix. Click the upper left
corner of the matrix to define.
• All Statuses for One User Group - You can set all the statuses for one user group by clicking the user group’s
name on the left side of the matrix.
• All User Groups for One Order Status - You can set all the user groups for one order status by clicking the
status on the top of the matrix.
• Individual Cell Intersection - You can set a cell intersection between a status and a user group. For instance,
the Sales Rep group can only Lookup customers from CRM when in the Order Placed status.
• Default (For New User Groups) - Set which customer actions are available to the users added to new user
groups that haven’t been set in this matrix yet.
• Default (For New Order Status) - Set which customer actions are available in new statuses that haven’t
been set in this matrix yet.
The default cells make administration easier so that, when you create a new user group or status, you don't
need to go through and define all the customer actions again.
Selecting an option for a cell that includes all statuses or all user groups can take some time to set,
depending on the number of statuses and user groups created in the system. Large number of groups or
statuses indicates that there are numerous cells to set, so there can be a slight delay in setting them all.
When finished defining the customer actions for the current customer role, click Save at the bottom of the
page.
Note
Customers are available only in Quote 1.0. In Quote 2.0, organizational and transactional relationships are
recorded via involved parties [page 332].
Rules that allow local customer sharing are defined in the Local Customer Visibility administrative section.
This section can be accessed by clicking the link under the Customers/Customer Roles administrator menu. It
contains a list of all existing visibility rules, which can be edited or deleted.
The Local Customer Visibility administration screen shows the parameters from which a rule can be built: User
Type and User. The order in which each is displayed reflects its priority from left to right, with User Type having
priority over Users.
To create a new rule, click Add New. This action displays the screen for defining local customer visibility.
Local customer visibility rules have two areas of definition: the first area specifies which users the rule applies
to and the second specifies the condition under which the local customer becomes visible. It’s only possible to
create one rule per combination of User Type and User. For instance, user can only create one rule for the user
John Smith. However, users can create a rule for the user type Sales, even if John Smith has been added to that
user type. In this case, though, the visibility rule created for the Sales group would have priority over the rule
create for John Smith.
My company's customers - if you tick this checkbox, the users selected previously are able to see your
company’s customers.
When users perform a customer lookup either by typing customer info in a customer role field or through the
lookup action, the system runs the local customer visibility rules applied to the user who is currently logged in.
The condition field of these rules determines which local customers are available.
Conditions can be based on user info or customer info. If based on user info, then all the local customers of
the user that matches in the condition are available. If based on customer info, then only the customers that
match in the condition are available. For example, the rule can state to allow the user type Sales to see all of
the local customers within their user type. You could also create a rule to allow the user type Sales to see all
local customers that are in a certain state. If the condition based on the user or customer info is met, then the
customers are available to the current user.
Assuming the edit action is available to a user, any modifications they do to customers that are available to
them through local customer visibility aren't permanent. Changes only affect the customer’s info in the current
quote.
Global Customers are customers added in the Global Customers administrative section. They’re available only
to those users who have permissions to view them. Rules need to be written to allow users to view these
customers.
Note
Customers are available only in Quote 1.0. In Quote 2.0, organizational and transactional relationships are
recorded via involved parties [page 332].
Rules that allow users to see that global customers are defined in the Global Customer Visibility administrative
section. This section can be accessed by clicking the link under the Customers/Customer Roles administrator
menu. The page contains a list of all existing visibility rules, and they can be edited or deleted.
The Global Customer Visibility administration screen shows the parameters from which a rule can be built:
Group, User, and Company. The order in which each is displayed reflects its priority from left to right, with
Groups having priority over Users, and Users priority over Companies.
To create a new rule, click Add New. Clicking this button displays the definition screen for global customer
visibility.
Global customer visibility rules have the following areas of definition: the first area specifies which users the
rule applies to and the second specifies the condition under which the global customers become visible. It’s
only possible to create one rule per combination of User Group, User, and Company. For instance, users can
only create one rule for the user John Smith. They can, however, create a rule for the Sales user group, even
if John Smith has been added to that group. In this case, though, the visibility rule created for the Sales group
would have priority over the rule created for John Smith.
In addition, here you can define a formula used for SQL pre-filtering. The value from the field SQL Where is
used as a pre-filter applied on a DB level. The pre-filter is applied first, after which settings defined in the
previous steps are applied. As a result, the settings from the previous steps can only narrow down the list of
global customers which is returned after the pre-filtering. This step is optional, but it can result in improved
performance
When users perform a lookup for a customer either by typing customer info in a Customer Role field or through
the lookup action, the system runs the global customer visibility rules applied to the user who is currently
logged in. The condition field of these rules determines which global customers are available.
Unlike Local Customer Visibility rules, Global Customer Visibility rules can be based only on customer info.
This is because the customers are global and don’t belong to any particular user, which is the case with local
customers. Only the customers that match in the condition are available to the selected users. For example,
users can specify that the Sales user group can view any global customers in the same territory that they’re
assigned to. This is possible because global customers and users can be assigned to territories. If the condition
based on the customer info is met, then customers are available to the current user.
Only quote tags can be used in the condition field for visibility rules. In the Formula Builder, users can access
tags and create complex conditional statements. Any quote information can be pulled and be used in the
calculation, including user information, customer information, custom fields, discounts, quote amounts, and
many others. Entering 1 in the Condition field allows the selected users to see all user’s local customers.
Global customers are customers managed by administrators. By default, they aren't visible to any users, but
this behavior can be altered with visibility rules.
Note
Customers are available only in Quote 1.0. In Quote 2.0, organizational and transactional relationships are
recorded via involved parties [page 332].
Visibility rules can be created to make global customers available to users. For more information on global
customer visibility, see the chapter on Global Customer Visibility [page 549]. Global customers are managed
through the link under Customers/Customer Role administrator menu. The global customers administration
screen gives you the option to edit or delete existing global customers.
Adding a new global customer is possible by clicking the Add New button. Standard fields are available when
defining the customer. Fields such as Address, City, ZIP, and Country/Region are required because these fields
are most often used in visibility rules. If the Company entered has CRM account associated with it, then the
CRM Account Id and/or CRM Contact Id can be entered.
You can also fill out the Bill to Role custom fields and End User Role custom fields that appear in the Customer
Info tab in the quote. To define them and decide which fields are displayed on the Global Customers section in
the Setup and on the Customer Info tab in the quote go to the Customer Custom Fields [page 551] help page.
Global customers cannot be edited in the Customer Info tab via the Bill To Role and End User Role, only via the
Ship To Role.
To find the CRM ID for either field, click CRM Lookup. The resulting pop-up window displays the results of the
CRM Lookup. The popup window displays the results of the CRM Lookup. When CRM item is chosen from the
window, the Id field is automatically populated with the CRM Id. Leave the search field blank to display all the
CRM items, accounts or contacts.
Note
The administrative user must be defined in the CRM Administrator Account in order for the CRM Lookup to
work correctly.
Ensure the Active field is checked to allow the customer to be available to those users with visibility rights. This
field can be helpful if a user wishes to deactivate a customer without deleting the data altogether.
All SAP CPQ Customer address fields (Bill To, Ship To, End User) contain standard fields, which hold customer
information. First Name, Last Name, Address, and Company are some of these standard customer fields.
Note
Customers are available only in Quote 1.0. In Quote 2.0, organizational and transactional relationships are
recorded via involved parties [page 332].
If necessary, you can add one or more custom fields to Customer Roles. You can do that in Setup
Customers/Customer Roles Customer Custom Fields . This page shows custom fields defined for all
customer roles.
On the Customer Custom Fields list page, you can edit and delete existing fields, and add new ones by clicking
Add New.
To add a new custom field, you need to enter Name, Label, and select a customer Role Type to which this field
is added. It's also possible to define the field's rank, but it's not required. Also, you can specify if old and new
values of a customer custom field shouldn't be logged in the Audit Trail by enabling the Suppress Information
Logging toggle switch. Note that the field Name is used for uniquely identifying customer's custom fields -
therefore, users can't add two custom fields with the same name and role type. By selecting multiple Role
Types on this form and clicking Save, you can add multiple custom fields with exactly the same data - one
custom field is added for each customer role.
Customer custom fields are always of the free input type - they can't be changed to dropdown, checkbox, or
something else.
Note that you can't change the Role Type on already created fields. Otherwise, the form is no different from the
Add New custom field form.
As mentioned before, custom fields have a Name field, which is required, and is used along with Role Type
to uniquely identify customer's custom fields. When users copy customer data from one role to another,
custom fields are copied from one role to another along with standard fields. Custom field names are used for
identifying which field is to be copied from the source customer role to which field on destination customer
role. Fields that are contained in source customer role and are missing from destination customer role aren't
copied.
As it’s already known, only Bill To customers are used as customer repository, which is being used when
searching for customers. While for standard customer fields this has little impact, it affects custom customer
fields. When searching for a customer to add them to the Ship To customer role, finding the customer and
adding it to Ship To role, the destination role only contains custom field contents that are defined in Ship To
In V8 SAP CPQ version, users can't enter custom fields on global customers.
Customers can be managed from User Page as usual. However, customer field permissions apply as if the user
is editing a Bill To customer role in the Default quote status. This applies for standard customer fields, their
permissions and for custom customer fields.
Standard Customer Field and Custom Customer Field permissions are being defined on Customer Field
Permissions [page 546] page.
There’s a list of standard field names in the SAP CPQ that appear by default. It is important that you refer to
this list when naming custom fields because no custom field should get a name from this list. In other words,
there must be no duplicates. The best way to name the Customer Custom Fields is to add “custom” in front of
the custom field’s name.
The Customer Role Default administrative section allows you to define whether or not customer role fields are
filled with user’s information or a user’s company information.
Note
Customers are available only in Quote 1.0. In Quote 2.0, organizational and transactional relationships are
recorded via involved parties [page 332].
Prepopulating customer role fields with data can be helpful in many instances. For example, channel
representatives often create users themselves in the Bill To customer role and the customer’s name in the
Ship To or End User customer role. Defining customer role default rules ensures that their information is
prepopulated in a customer role each time they create a new quote. These rules are defined based on the
user type and the customer role. This allows controlling which users can and can't have customer roles
prepopulated.
To access the Customer Role Defaults administrative section, click the link under the Customers/Customer
Roles administrator menu. The page contains a list of existing customer role default rules that can be copied,
edited, or deleted.
Click Add New to create a new customer role default rule. This displays the rule definition screen, which
contains the following fields:
• User Type Name - Defines the user type this rule applies to. Each time a user in this user type creates a
quote, the selected customer role becomes prepopulated with data.
• Customer Role - Select the customer role that becomes prepopulated with data for the selected user type.
• Default (Pre-populate) with User Info - Determines that the user’s data prepopulates the selected customer
role fields.
• Default (Pre-populate) with User’s Company Info - Determines that the user’s company info prepopulates
the selected customer role fields.
Note
User's Company Info requires that the company associated with the user has the Create Customer Record
option selected. This creates a global customer and allows the information to be used for customer roles.
See Companies [page 133] for more details.
There are several ways in which customers can be exported and imported into the system in several ways,
which are detailed in this topic.
Context
Note
Customers are available only in Quote 1.0. In Quote 2.0, organizational and transactional relationships are
recorded via involved parties [page 332].
To export/import global customers in the Customers Export/Import page, follow one of these workflows:
• Download a sample template, fill out customer details, and import the file.
• Export all customers in SAP CPQ.
• Export all customers, change details, and add new customers, then import the file.
To download the import template, click Sample Template in the Customer Import page. The Excel file contains
customer standard fields, which you can fill out with new customers' details.
The same fields are mandatory when creating global customers in Customers/Customer Roles Global
Customers and when importing customers through Excel: Address (1), City, Country/Region, and Zip.
The best practice for importing new customers in the system is to do it through the sample template. To
update existing customer details, you need to export them from the system, change the data and then import
them. An empty row in the template breaks the import and only the data processed before the empty row is
imported.
Note
It is recommended that you import no more than 10000 customers using a single Excel file. In addition, it is
recommended that you export no more than 60000 rows.
The following procedure describes how to export all customers in the system, change their details, add new
customer, and import the updates in SAP CPQ.
Procedure
The spinning wheel next to the tab title indicates that the system is building the list of attributes.
When the process is completed, the button name changes to All Customers.
2. Click the button to download the file.
The System Id column needs to remain empty for new customers. The first cell in the Index column needs
to always have the value 1 and the number needs to increment by one in the subsequent cells.
4. Select an identifier in Step 3.
The system treats the identifier when comparing customers in the system with customers in the Excel
template. For example, if a customer code in the template matches a code in the system, the respective
customer details are updated. Otherwise, a new customer is added:
• Customer Code
• CRM Account ID
• CRM Contact ID
• CRM Account ID and CRM Contact ID
• SAP CPQ Customer ID
• None
5. In Step 5, click Choose File to browse for your file.
The file name can contain only letters, digits, dashes, and underscores. In addition, every column name in
the file must be unique.
7. After the system processes data, the number of valid and invalid records in the file and the following
buttons are displayed:
• Import Without Preview - starts the import and a message displays once the import is successfully
completed.
• Import With Preview - a grid with all the customers in the file displays. You can see the status of each
record and select/unselect it for import. Click Save to import the valid customers.
• Import With Preview of Invalid Records Only - invalid records, if any, display in this grid. The Status
column shows the cause of the error. Selecting invalid records for import is disabled.
8. Click Save to import the valid customers.
You can follow these steps when importing customers through the Manage Customers page since the
customer import/export journeys on the user side and the administrator side of SAP CPQ are the same.
However, on the user side of SAP CPQ, you can export/import only local customers (the Owner column
displays the names of users who created the customers).
Postal code lookup gives you the option to search for the address details of locations across the UK.
Note
Customers are available only in Quote 1.0. In Quote 2.0, organizational and transactional relationships are
recorded via involved parties [page 332].
In the Shopping Cart and Quotes tab in Setup General Application Parameters , you need to populate
these parameters in order to use the feature:
In Choose Postcode look-up provider, you should select Postcode Anywhere. Alternatively, leave None if you
don't want to use this feature. You need to have Postcode Anywhere license and to enter account code and
license key into the appropriate application parameters. This information is obtained from Postcode Anywhere,
the application that provides postal code look-up.
This section contains useful information for managing user interface in SAP CPQ.
Responsive templates are building blocks of all pages in SAP CPQ’s Responsive Design. Templates define the
look and feel of the application – colors, icons, the order in which buttons are displayed and so on.
Each page in the application consists of at least one template. For example, the Catalog page consists
of the CatalogPage template, while the ApprovalHistory page consists of ApprovalHistoryPage and Editors/
DelegatedApprovers templates. Some templates are used on multiple pages in SAP CPQ. These templates are
stored in the Shared page.
On user side, you can see which templates are used on pages by performing a right click and selecting Inspect
Element from the context menu. In the following screenshot, CatalogPage template can be seen in the Catalog
page.
Responsive templates can be left as is, although some administrators choose to customize their environments
[page 559] by changing responsive templates they contain. Core templates are always compatible with new
SAP CPQ features, so you don’t need to modify them each time a release occurs. Preserving the original state
of core templates minimizes the risk of breaking changes occurring, as well. If you customize templates, you
also need to manage them each time a release occurs, and their pages are changed. It’s highly recommended
that you customize responsive templates only when necessary, and apply minimal changes, which can easily
be tracked and modified.
In the Responsive Templates page, you can see the list of all customized templates which exist in your
environment, as well as the Freeze Templates functionality. You can also create new customized templates.
All customized templates are essentially copies of the existing templates which contain some adjustments, so
they aren’t changed during the development of new SAP CPQ releases like the core templates they are derived
from. If some of the templates that are changed during the development correspond to the templates you’ve
customized, you may need to apply the necessary changes to prevent breaking changes from occurring in your
environment.
• Fix the issues independently by editing the customized templates and making them compatible with other
templates in the same pages before the next release is deployed.
• Seek assistance from SAP CPQ Support Team.
Templates can be customized in the Responsive Templates page ( Setup UI Design Responsive
Templates ) by copying the provided original template, editing it and making it Default in the environment.
Context
We recommend that you avoid template customizations in your environments. SAP CPQ UI design is regularly
updated, so each time you customize a template, the risk of breaking changes increases. If you do customize
templates, try to add small changes to them.
Procedure
A page with listed customized templates and the Freeze Templates feature displays.
2. Click Add New.
The Template tab is opened. Here, you can select an original template and customize it.
3. From the Page dropdown, select the page which you wish to change.
4. From the Template dropdown, select the template you wish to customize.
The list of invalid characters includes, but is not limited to: ASCII/Unicode characters 1 through 31,
quotation marks (“), less than (<), greater than (>), pipe (|), backspace (\b), null (\0) and tab (\t).
Note
Even though slash (/) is an invalid character, the templates that contain it in their names, and were
created before the 1911 release, remain unchanged. You can properly manage and use them without
removing the character from their name.
Note
9. Enable the Is Default toggle if you wish to apply the custom template in SAP CPQ instead of the original
one.
Next Steps
If you wish to reuse a customized template on several different pages, simply add the
@Html.PartialCustomTemplate(“Customized_Template_Name”) function to another template in which
you want it to be displayed.
You can limit the visibility of a customized responsive template to a specific user type.
Procedure
The page in which you can edit the selected user type displays.
3. Click Add new custom template in the UI Design section.
Results
Users who belong to the updated user type can now see the selected customized template in their
environment. Other user types will see the template which is marked as Default. You can add more than one
template here.
In the History tab of a custom template, you can see a chronological list of all versions of that template.
Template versions are states of development a template has gone through since being introduced into SAP
CPQ. The list contains core templates which are added when a new release occurs (System templates) and
customized templates that have been created by administrators in your environment. One of the template
versions is marked as active, which means that it is currently applied to your environment’s UI.
When a new template version is added to SAP CPQ, it will be displayed above all other versions of that
template.
If a customized template version is set as default, and a new core template version is added to SAP CPQ, this
new version will be displayed at the top of the History list. However, it will not be applied unless you deselect the
Is Default checkbox next to the currently applied custom template version in the Template tab.
The History tab is also useful for comparing two versions of templates. You may want to do this if you wish to
see in what ways the new System template differs from the customized template that was previously applied in
the environment. You can also compare version of the custom template you’ve customized with the version of
the template that has been customized by another administrator in your environment.
To compare the templates, tick the checkboxes in the Version column, and click Compare. You can compare two
template versions.
The differences between the compared templates are highlighted as presented in the screenshot.
This feature gives you an option to roll back the uncustomized (original) templates to the state they were in the
previous SAP CPQ release.
The SAP CPQ development team only manages the original templates that customized templates are derived
from. So, when a new release occurs, bear in mind that:
• If the core template which you have customized has been modified in this release, you should apply
the added changes to your customization, as well. If you don’t, some of the newly added SAP CPQ
functionalities may be unavailable to you.
• If the core template located in the same page as your customized template has been modified, check if
these templates are compatible. If they aren’t, breaking changes may ensue, and you need to fix them
independently or with the help of SAP CPQ Support team.
Note
SAP CPQ What’s New contains the list of all modified templates, for each release, as well as fixes for the
known breaking changes.
If the breaking changes occur in a page when the release A is deployed, and you didn’t manage to apply
the necessary fixes to the customized templates before the release B is deployed, you can use the Freeze
Templates feature to roll back all uncustomized templates on the broken pages to the state they were in during
the release A. In this way, you will have more time to deal with incompatibilities between templates.
Rollback from SAP CPQ to version A can be applied only until the version C is released. Once that occurs, all
pages will be deployed to the version C, new breaking changes may occur, and the uncustomized templates can
only be rolled back to the version B.
Page rollback is only a temporary solution. If you roll back uncustomized templates, the pages will work as
they did in the previous release, but you may not see new functionalities or fixes that were applied to the
environment with the new release. For this reason, once you freeze templates, you need to apply necessary
changes to templates as soon as possible, or try to avoid using this feature altogether by fixing templates on
broken pages before the release is deployed.
To access the feature, go to Setup UI Design Responsive Templates . Here, you can find all page names
listed next to checkboxes used for rolling the pages back to the previous version. To freeze the uncustomized
templates on a broken page, select the checkbox next to it.
Related Information
A brand in SAP CPQ defines the look of the user interface (colors, images, and visual styles). Users can see
the same products and pricing, while having different user interface depending on the brand they belong to.
For example, different user interfaces can be displayed to anonymous website visitors, to internal users, and to
partners.
Example
If Company A is reselling Company B products, when a salesperson from Company A logs into company B's
SAP CPQ, they are going to have the same branding as company A. However, when the user from company
B logs into the same SAP CPQ, they are going to have the same branding as company B.
Branding Administration
Administrators can set up branding in UI Design Branding , on both quote engines. In this page, you can
search through existing brands, you can delete, or edit them, and you can create new brands.
Accordingly, you are able to choose the brand when administering different features in SAP CPQ (for example,
users, permission groups and document generation templates).
Create a Brand
1. Go to UI Design Branding.
2. Click Add New.
3. Populate the fields:
Default Brand Default brand is applied for all newly created users.
Start page URL to the page that will first open when users with
the specific brand log in (for example, /quotation/Load
Quote.aspx).
Images section Relevant only for the classic design. Visible only if the Hide
Obsolete Features parameter is set to FALSE.
Top Right Image(Logo) Logo image to be displayed in the top right corner of
the screen. Recommended image size is 180px x 60px.
Images must be in a .gif format. Additionally, the images
need to be same height. Extensions are case-sensitive.
Make sure the extension .gif is in lower case. Otherwise, an
error can be displayed stating that the extension is wrong.
Top Left Image(Logo) Logo image to be displayed in the top left corner of the
screen. Recommended image size is 180px x 60px. Im
ages must be in a .gif format. Additionally, the images
need to be same height. Extensions are case-sensitive.
Make sure the extension .gif is in lower case. Otherwise, an
error can be displayed stating that the extension is wrong.
CSS file Should contain the .css file for the classic design pages.
Responsive CSS file Should contain the .css file for the responsive design pa
ges.
If you wish to change the default look of SAP CPQ, you can do it through the available CSS files, or create new
files. You can first download the CSS file and responsive CSS file from the default branding and then update
them accordingly and reupload them as part of the new branding. If you are creating new files, make sure that
their extension is .css.
.cpq_logo {
background: url("/mt/DOMAIN_NAME/additionalfiles/FILE_NAME") no-
repeat left;
}Default brand is applied for all newly created
users. Additionally, if you
don’t select an image or
a style for a non-default
brand, those used in the
default brand will be used.
3. Upload the .css file in the Responsive CSS file field in branding.
Users pertaining to that brand will see the new logo after they log in.
To access these parameters, go to Setup UI Design Catalog Layout . Application Parameters are
separated into following sections: Tabular View UI, Category Tree UI, List View UI, and Other.
• Show Products In – Determines how many columns the products are displayed in on the Products page.
• Show Categories In – Determines how many columns the categories are displayed in on the Categories
page.
• Display Products Above Subcategories – If set to True the products within the selected category are
displayed above the subcategories.
• Load Sub Products In Category – If set to True products from subcategories are displayed too.
• Include Part Number – If set to True part numbers are displayed in the tabular view mode.
Category Tree UI
List View UI
• Include Product Image – If checked, the product image is displayed in the list view mode.
• Include Product Description – If checked, product description is displayed in the list view mode.
Other
Visual Style (Catalog) - determines the default Responder styles that every user sees. User can override these
selections by choosing a new style in the User Groups administrative section.
Here you can find all relevant information about customizations in Responsive Design including different code
examples.
Bear in mind that although these customizations bring lot of power they also raise implementation complexity.
In order to keep things simple avoid customizations when possible or use custom CSS in branding for custom
looks.
Required knowledge
In order to do responsive customization you should have at least basic knowledge of HTML, CSS,
JavaScript and Knockout. For knockout learning we recommend the official knockout tutorial (http://
learn.knockoutjs.com/).
Tools
We recommend you to install Google Chrome extension for the Knockoutjs context debugger from
the following link: https://chrome.google.com/webstore/detail/knockoutjs-context-debugg/
oddcpmchholgcjgjdnfjmildmlielhof?hl=en.
Getting Started
First of all, you have to know the structure of your observable array. For examples we will use quote custom
fields. Install Google Chrome extension Knockoutjs context debugger. On appropriate page (in this example
Cart Page) open Developer Tools in Chrome (right click and then click on Inspect element or Ctrl + Shift +
I or F12 ).
In Developer Tools go to first tab Elements and on right side click on Knockout context. Below you will see all
available data. Among other things there are custom fields.
Function filterByProperty returns a filtered observable array with members that have value of property
matched with passed appropriate values.
First argument is the name of property and other arguments are appropriate values and there is no limit of
number of passed values.
This function will return all members of array that have value of property “propertyName” equal to value1,
or value2, …, or valueN.
We want to create new section for custom fields where want to show all custom fields that are editable. Custom
filed has property with name “editable” that can be true or false. We don’t want to show all custom fields, but
only those that are editable (that has value of property “editable” equal to true).
With this:
We want to create new section for custom fields where we want to show only custom fields that are type of
“Date” or “Select” or “LongText”. Custom field has property type that has numeric value (0 for Label, 1 for Text,
2 for Select, 3 for Date, 4 for LongText). We want to show only custom fields that have value of property “type”
2 or 3 or 4.
With this:
Function sortByProperty returns an observable array that contains all members of the original array sorted
by property which name is passed.
Also, it leaves the original array unchanged. The only argument is the name of property which is criteria for
sorting array.
Syntax:
array.sortByProperty ('propertyName')
This function will return all members of array sorted by property which name is passed to the function.
Example:
We want to create custom section for custom fields where we want to sort them by their label.
With this:
Function count returns the number of array elements that matches predicate function condition.
Syntax:
array.count(predicateFunction)
Similar to the previous function, countWithProperty returns the number of array elements that have value
of property matched with passed appropriate values. First argument is the name of property and other
arguments are appropriate values and there is no limit of number of passed values.
Syntax:
We want to display section custom fields only if there is more than 3 required fields.
With this:
We should check value of property isRequired for each item of array. So, as argument of function we
passed item and then we access to value of its property with item.isRequired, in order to check if
that value is true. We are also able to use logical operators (AND, OR, NOT, and so on) to make complex
conditions.
We want to show section for custom fields only if there is exactly one non required field with type of “Date”
(value of properties “type” and “isRequired” should be 3 and false, respectively).
With this:
We should check value of properties “isRequired” and “type” for each item of array. So, as argument
of function we passed item and then we access to value of properties “isRequired” and “type” with
item.isRequired and item.isRequired. We use logical operator && for linking conditions.
Note
Everything above about predicate functions is valid for all predicate functions in other customization
functions, such as any, all, indexOf, lastIndexOf, first, last, and so on.
We want to display section custom fields only if there is more than 3 required fields.
With this:
We should check value of property isRequired. So, first argument is the name of property and second
parameter is appropriate value of property “isRequired” and that is true.
We want to show section for custom fields only if there are more than two custom fields with type of “Date” or
“Select” or “LongText”. (appropriate values of property “type” are 2, 3 and 4).
With this:
We should check value of property type. So, first argument is the name of property and other parameters are
appropriate values of property “type” and that are 2, 3 and 4.
9.7.2.4 all/allWithProperty
Function all returns the boolean value whether all elements of the passed observable array matches predicate
function condition.
Syntax:
array.all(predicateFunction)
Similar to the previous function, allWithProperty returns the boolean value whether all elements of the
passed observable array have value of property matched with passed appropriate values. First argument is the
name of property and other arguments are appropriate values and there is no limit of number of passed values.
This function will return true if all members of array have value of property “propertyName” equal to value1,
or value2, …, or valueN.
Syntax:
Example1:
We want to display section for custom fields only if all custom fields have id greater than zero and don’t trigger
save.
With this:
Example2:
We want to display section for custom fields only if there are only custom fields with id 5, 17, 35 and 212.
With this:
We should check value of property id. So, first argument is the name of property and other parameters are
appropriate values of property “id” and that are 5, 17, 35 and 212.
9.7.2.5 any/anyWithProperty
Function any returns the boolean value whether at least one element of the passed observable array matches
predicate function condition.
Syntax:
array.any(predicateFunction)
Similar to the previous function, anyWithProperty returns the boolean value whether at least one element of
the passed observable array has value of property matched with passed appropriate values. First argument is
the name of property and other arguments are appropriate values and there is no limit of number of passed
values.
This function will return true if any member of array has value of property “propertyName” equal to value1, or
value2, …, or valueN.
Example:
We want to display section for custom fields only if there is at least one required custom field.
With this:
9.7.2.6 indexOf
Function indexOf returns index of the first element of passed array that matches predicate function condition.
If predicate function is not passed, native 'indexOf' function will be called. Native 'indexOf' is function
from knockout. It receives member of array as parameter and returns index of that member in array starting
from 0. Our modified function receives predicate function and returns index of array member that matches
predicate function condition.
Syntax:
array.indexOf(predicateFunction)
Example:
We want to display section for custom fields only if none of the first five custom fields is read-only.
We should check index of first appearing of read-only custom field. It should be greater than 4 (because
indexes start from 0).
With this:
9.7.2.7 lastIndexOf/lastIndexOfWithProperty
Function lastIndexOf returns index of the last element of passed array that matches predicate function
condition.
Syntax:
array.lastIndexOf(predicateFunction)
Similar to the previous function, lastIndexOfWithProperty returns index of the last element of passed
array that has value of property matched with passed appropriate values. First argument is the name of
property and other arguments are appropriate values and there is no limit of number of passed values.
Syntax:
This function will return index of the last element of passed array that has value of property “propertyName”
equal to value1, or value2, …, or valueN.
Example1:
We want to display section for custom fields only if none of last three custom fields has different name and
label. (all of last three custom fields have same name and label) We should check if index of last appearing of
custom field, with different label and name, is less than array length minus three (because indexes start from
0).
Example2:
We want to display section for custom fields only if none of the last three custom fields is required.
We should check if index of last appearing of custom field, with value of isRequired equal to true, is less than
array length minus three (because indexes start from 0).
With this:
The arguments are predicate function, which is mandatory, and default value, which is optional parameter. If
there is no array member that matches predicate function condition, default value will be returned. If default
value is not defined null will be returned.
Syntax:
array.first(predicateFunction, [defaultValue])
Similar to the previous function, firstWithProperty returns the first element of passed array that has
value of property matched with passed appropriate values. First argument is the name of property and other
arguments are appropriate values and there is no limit of number of passed values.
Syntax:
This function will return first element of passed array that has value of property “propertyName” equal to
value1, or value2, …, or valueN.
Example1:
We want to show label of the first required custom field (without default value).
Example2:
We want to show label of the first required custom field, if there is no required fields show No required fields.
(with default value)
9.7.2.9 last/lastWithProperty
Function returns the last element of passed array that matches predicate function condition.
The arguments are predicate function, which is mandatory, and default value, which is optional parameter. If
there is no array member that matches predicate function condition, default value will be returned. if default
value is not defined null will be returned.
Syntax:
Similar to the previous function, lastWithProperty returns the last element of passed array that has value
of property matched with passed appropriate values. First argument is the name of property and other
arguments are appropriate values and there is no limit of number of passed values.
Syntax:
This function will return last element of passed array that has value of property “propertyName” equal to
value1, or value2, …, or valueN.
Example1:
We want to show label of the last required custom field (without default value).
We want to show label of the last required custom field, if there is no required fields show No required fields.
(with default value)
Example3:
Functions sortByProperty and filterByProperty return new observable array and they can be combined
with other functions.
Example1:
We can sort the array by value of label and then get the name of the first required member of sorted array.
We can filter the array by value of editable and then check if all editable fields are required.
Example3:
We can filter the array by value of editable and then check if any editable field is required.
In this topic you can see different types of common customizations in Responsive design as well as usefull
HTML snippets:
Procedure
.cald_logo {
background: url(https://devstable.webcomcpq.com/mt/DEFAULT/additionalfiles/
logo1.jpg) no-repeat center center;
background-size: contain;
}
Below is the code snippet that you can add to your templates to load and use external JavaScript modules.
<script type="text/javascript">
require.config({
paths: {
"Msal": "https://alcdn.msauth.net/lib/1.1.3/js/msal.min"
}
});
require(['Msal'], function(Msal){
console.log(Msal)
});
</script>
This section contains customizations which can be applied to the Configurator page.
Change the Way Attributes are Displayed in One Tab [page 586]
Here, you can learn how attribute image checkboxes are customized.
Procedure
With this:
.image-checkbox {
width: 100%;
}
.image-checkbox input.custom[type="checkbox"]:checked + span.img-thumbnail {
border: 2px solid #00a8e3;
box-shadow: 0 0 8px #dce1e5;
}
This page contains a piece of code which should be added to your custom CSS file to make the Responder
display in a modal window.
.hide-responder {
display: none;
}
.info-label.total {
display: table-cell;
}
.full-width {
width: 100%;
}
Procedure
In this example we customize tab with id = 17 and attributes with stdAttrCode = 930 and
stdAttrCode = 931.
This section contains customizations which can be applied to the Cart page.
Regular custom actions on cart can have embedded JavaScript code that will execute on click.
Context
We want to add some JavaScript code for our custom action on a quote. We need to know our action's ID. For
this example, let's say that ID is 2524.
Procedure
1. Create IronPython script that returns some message (for example This is a test message.) and name it test.
2. Create a new ActionsTemplate on the Cart page.
<script type="text/javascript">
window.ShowResult = function ()
{
var result = $.get("https://sandbox.webcomcpq.com/customapi?
username=admin&password=password123&scriptname=test");
alert(result);
};
</script>
<script type="text/html" id="actionsTemplate">
<div data-bind="foreach: $data">
<!-- ko if : $root.displayImagesForCartActions -->
<div class="action-row">
<!-- ko if: id !== 2524 -->
<a href="#">
<span data-bind="text: name, click: execute"></span> <img
data-bind="attr: { src: imageUrl }, visible: imageUrl" />
</a>
<!-- /ko -->
<!-- ko if: id === 2524 -->
<button data-bind="text: name" onclick="window.ShowResult()"></
button> <img data-bind="attr: { src: imageUrl }, visible: imageUrl" />
<!-- /ko -->
</div>
<!-- /ko -->
<!-- ko ifnot : $root.displayImagesForCartActions -->
<div class="button-actions"><button type="button" class="btn btn-
default" data-bind="text: name, click: execute"></button></div>
<!-- /ko -->
</div>
</script>
4. Go to Cart page.
We will customize cell template in order to allow negative numbers for discount, extended amount, and so on.
Procedure
Display Custom Field in Product Type Section in Item Total Row [page 596]
This procedure shows you how to make a custom field diisplay in the Item Total row of the Product Type
section.
This page contains the procedure for creating custom field custom templates.
Procedure
4. In this example we want to show custom field with id = 57. Name those custom templates wherever you
want to use them on Cart page, just by adding this part of HTML:
This procedure shows you how to make custom fields display in a separate section.
Procedure
1. Create new template inside the section where you want your new section to appear. For example, Sections/
CustomFields on the Cart page.
<td data-title="@Model.Cells[i].CellLabel">
<!-- ko if : $data.itemDescription.productTypeName() === 'Accessories' -->
@if (Model.Cells[i].ColumnName != "someNameColumn")
{
<!-- ko template : { name : values[@i].template, data:
values[@i] } -->
<!-- /ko -->
}
<!-- /ko -->
<!-- ko if : $data.itemDescription.productTypeName() !== 'Accessories' -->
<!-- ko template : { name : values[@i].template, data: values[@i] } -->
<!-- /ko -->
<!-- /ko -->
</td>
With this:
<div id="custom-fields-section">
@*Custom fields*@
<div data-bind="visible: customFields().length > 0">
<div class="col-md-12">
<h3
class="alternate">@Translation.Get("xsltQuoteCartCustomFields")</h3>
</div>
<div class="clearfix">
<div data-bind="foreach: customFields" class="custom-fields">
<!-- ko if: $data.id !== 53 && $data.id !== 57 -->
<!-- ko template: template -->
<!--/ko -->
Results
In this example we create new section with name My section for custom template. We put custom fields with
IDs 53 and 57 in new section and remove those custom fields from regular section.
This procedure shows you how to make the custom field value display in the Shopping Info form.
Procedure
With this:
Results
In this example we write value of custom field with ID equal to 50 into field with name someFieldOnForm.
This procedure shows you how to make a custom field display in the Product Type section.
Procedure
With this:
Results
In this example we write value of custom field with ID equal to 55 into column in section Product Types with
name DiscountPercent, but only for product type Hardware.
This procedure shows you how to make a custom field diisplay in the Item Total row of the Product Type section.
Procedure
With this:
Results
In this example we write value of custom field with ID equal to 55 into column in section Product Types with
name DiscountPercent, but only in Item Total row.
This procedure shows you how to customize a quote item custom field to appear as a checkbox.
Procedure
• If you want default value (when you enter the quote for first time) of checkbox to be checked set
Calculation formula to be true.
• If you want default value (when you enter the quote for first time) of checkbox to be unchecked set
Calculation formula to be false or leave it empty.
2. In Pricing/Calculations Cart Fields Administration for appropriate status and user type set this
custom field to be editable.
3. In QuotesQuotes Quote Layout Permissions set visibility permission for this custom field.
4. In UI DesignUI Design Quote Layout set this custom field to be visible in Cart.
For Page select Cart, for template set Sections/ItemsTable, set Name and check Default.
<td data-title="@Model.Cells[i].CellLabel">
<!-- ko template : { name : values[@i].template, data: values[@i] } -->
<!-- /ko -->
</td>
With this:
if (Model.Cells[i].ColumnName == "someNameCheckboxCF")
{
<!-- ko template : { name : 'checkBoxTemplate', data: values[@i] } -->
<!-- /ko -->
}
else
{
<td data-title="@Model.Cells[i].CellLabel">
<!-- ko template : { name : values[@i].template, data: values[@i] } -->
<!-- /ko -->
</td>
}
value(newValue.toString());
}
});" />
</div>
</script>
This procedure shows you how to customize a quote item custom field to appear as a dropdown.
Procedure
1. Create custom field (for example someNameDropDownCF), and set its type to Text.
2. In Pricing/Calculations Cart Fields Administration for appropriate status and user type set this
custom field to be editable.
3. In Quotes Quote Layout Permissions set visibility permission for this custom field.
5. In UI Design Responsive Templates create new responsive template. For Page select Cart, for
template set Sections/ItemsTable, set Name and check Default.
<td data-title="@Model.Cells[i].CellLabel">
<!-- ko template : { name : values[@i].template, data: values[@i] } -->
<!-- /ko -->
</td>
With this:
if (Model.Cells[i].ColumnName == "someNameDropDownCF")
{
<!-- ko template : { name : 'dropDownTemplate', data: values[@i] } -->
<!-- /ko -->
}
else
{
<td data-title="@Model.Cells[i].CellLabel">
<!-- ko template : { name : values[@i].template, data: values[@i] } -->
<!-- /ko -->
</td>
}
Results
In this example there are three statuses - Status 1, Status 2 and Status 3 in observable array that will be
displayed as options in dropdown, but you can create tour own custom observable array.
This procedure shows you how to add an image to the item custom column.
Procedure
1. Go to Setup General File Management and upload an image in folder Additional Files.
2. Create custom field (for example CFWithPicture), set its type to Text and for calculation formula set picture
path.
This example is for devstable environment, default domain and picture with name image1.jp is
uploaded in folder additionalfiles
3. In Quotes Quote Layout Permissions set visibility permission for this custom field.
5. In UI Design Responsive Templates create a new responsive template. For Page select Cart, for
Template set Sections/ItemsTable, set Name and check Default.
<td data-title="@Model.Cells[i].CellLabel">
<!-- ko template : { name : values[@i].template, data: values[@i] } -->
<!-- /ko -->
</td>
With this:
@if(Model.Cells[i].ColumnName ==
"CFWithPicture")
{
<img data-bind="attr : { src : values[@i].value}"></img>
} else
{
<!-- ko template : { name : values[@i].template, data: values[@i] } -->
<!-- /ko -->
}
Results
In this example we change the way of rendering quote item custom field if field name is CFWithPicture. For
that custom field we want to render image with path defined in its calculation formula.
This procedure shows you how to make an item column value display in the first columnn.
Context
We are assuming that like in previous example [page 601] there is the same Item Custom field named
CFWithPicture that contains URL. We will add this custom field in first column.
Procedure
1. In place where we want to display this picture (form quote item custom field) add this part of code in the
Sections/ItemsTable template on the Cart page:
2. We use knockout projections function filter to get column value where column name is CFWithPicture.
We could expand our example with hidding this column form items table. We need to remove it from
header. Change this part of code:
<thead>
<tr style="height: 20px;">
<th rowspan="2" data-bind="visible: canManageItems" class="manage-
items">
<input type="checkbox" class="custom" data-bind="checked:
selectAll"/>
<span class="lbl"></span>
</th>
<th rowspan="2">@Translation.Get("docItem")</th>
@*Complex columns have 2 additional columns in next row sot their
rowSpan is 1 and colSpan is 2*@
@foreach (CartItemColumnVm column in Model.Columns)
{
if (column.IsComplex)
{
<th colspan="2" rowspan="1">@column.HeaderLabel</th>
}
else
{
<th colspan="1" rowspan="2">@column.HeaderLabel</th>
}
}
</tr>
<tr>
@foreach (CartItemColumnVm column in Model.Columns)
{
if (column.IsComplex)
{
<th>@Translation.Get("xsltNRC")</th>
<th>@Translation.Get("xsltMRC")</th>
}
}
</tr>
With this:
<thead>
<tr style="height: 20px;">
<th rowspan="2" data-bind="visible: canManageItems" class="manage-
items">
<input type="checkbox" class="custom" data-bind="checked:
selectAll"/>
<span class="lbl"></span>
</th>
<th rowspan="2">@Translation.Get("docItem")</th>
@*Complex columns have 2 additional columns in next row sot their
rowSpan is 1 and colSpan is 2*@
@foreach (CartItemColumnVm column in Model.Columns)
{
if (column.Name != "CFWithPicture")
{
if (column.IsComplex)
{
<th colspan="2" rowspan="1">@column.HeaderLabel</th>
}
else
{
<th colspan="1" rowspan="2">@column.HeaderLabel</th>
}
}
}
</tr>
<tr>
@foreach (CartItemColumnVm column in Model.Columns)
{
if (column.IsComplex && column.Name != "CFWithPicture")
{
<th>@Translation.Get("xsltNRC")</th>
<th>@Translation.Get("xsltMRC")</th>
}
}
</tr>
</thead>
<td data-title="@Model.Cells[i].CellLabel">
<!-- ko template : { name : values[@i].template, data: values[@i] } -->
<!-- /ko -->
</td>
With this:
if(Model.Cells[i].ColumnName !=
"CFWithPicture")
{
<td data-title="@Model.Cells[i].CellLabel">
<!-- ko template : { name : values[@i].template, data: values[@i] } -->
<!-- /ko -->
</td>
}
This procedure shows you how to hide values from some columns in the quote.
Procedure
<td data-title="@Model.Cells[i].CellLabel">
<!-- ko template : { name : values[@i].template, data: values[@i] } -->
<!-- /ko -->
</td>
With this:
<td data-title="@Model.Cells[i].CellLabel">
<!-- ko if : $data.itemDescription.productTypeName() === 'Accessories' -->
@if (Model.Cells[i].ColumnName != "someNameColumn")
Results
In this example we want to hide values from column with name someNameColumn, but only for products which
type is Accessories.
This section contains customizations which can be applied to the Catalog page.
This procedure shows you how to remove images of categories from the Catalog.
Procedure
<style>
.categories-tabular .image-holder {
display: none;
}
</style>
You can also add this to your CSS file for categories.
Procedure
<style>
.product-box .image-holder {
display: none;
}
</style>
You can also add this to your CSS file for products.
In this section you can see different types of more advanced customizations in Responsive Design that add
custom behavior to pages:
Window contain global cpq variable. Sole purpose of this variable is to help deliver Responsive Design
customizations that contain custom behavior (custom JavaScript).
cpq.models:
Models property will expose all knockout models present on current page. This will make easier to reach
model instance and inspect it. To try it out type cpq.models. in your browser console and see what will
auto-complete offer you.
Server property is there to help you communicate with server from your JavaScript. It contains only one
member, function executeScript which invokes your global IPython script. Please see Consume Python Global
Scripts as REST Webservices.
JavaScript:
JavaScript:
Events object contain pub and sub functions which allow you to subscribe to SAP CPQ public javascript events.
It also allow you to publish and subscribe to your custom events. This can be useful if you are building multiple
widgets for the same page that need to communicate.
Code Syntax
JavaScript
Code Syntax
JavaScript
Code Syntax
JavaScript
Each knockout model in SAP CPQ will raise events when models is crated and updated. When model is created
"modelCreated" is raised. When model receives data from server "modelName:updated" is raised. This event
is also raised when initial data is received. In this events data sent will alway have property "model" which
contains reference to model that raised the event.
Code Syntax
JavaScript
cpq.ready:
ready is function that accepts only one parameter which is callback function which is called when document is
ready. Unlike jQuery ready event this one will wait for some script initialization to finish so you can use ko global
variable.
Code Syntax
JavaScript
cpq.ready(function(){
var model = {
name: ko.observable('MyModle'),
items: ko.observableArray()
};
ko.applyBindings(model, document.getElementById("exampleWidget"));
});
For full example using ready function please see WorkflowContext ClientData Rendering [page 611].
Data you put in WorkflowContext.ClientData can be accessed on client on Cart and CartList knockout
model using WorkflowClientData observable on model.
This observable stores last WorkflowContext.ClientData received from server and can be used for
rendering. See example below.
Once custom action that will build ClientData is created, you need to add the following IronPython script to the
action:
Python:
After you are done don't forget to setup new custom actoin in workflow and workflow permissions.
Now if you go to Cart you will see new action Get ClientData.
When you click Get ClientData IPython script sends data to client which is then rendered using out custom
template.
<script type="text/javascript">
cpq.ready(function()
{
var model = {
isVisible: ko.observable(true),
data: ko.observableArray(),
clearAll: function ()
{
model.data([]);
},
remove: function(item)
{
model.data.push(data.model.workflowClientData()[i]);
}
}
});
ko.applyBindings(model,
document.getElementById("exampleWidget"));
});
</script>
<div id="exampleWidget" class="center-block" data-bind="visible: isVisible"
style="display: none; width: 500px">
<div>
<strong>This is custom widget</strong>
<a href=#" data-bind="click: clearAll, visible: data().length >
0" style="float: right">Clear all</a>
<!-- ko foreach : data -->
<div class="alert" data-bind="css: { 'alert-info' : type ===
'info', 'alert-danger' : type === 'error', 'alert-warning': type ===
'warning' }">
<span data-bind="text: message"></span>
<a href="#" data-bind="click: $root.remove" style="float:
right">remove</a>
</div>
<!-- /ko -->
<div data-bind="visible: data().length === 0">currently
empty...</div>
</div>
</div>
2. Go to Cart page. You should see empty widget just above the quote:
In previous example we've implemented widget that is positioned above cart page. This is because cart page
already have applied knockout bindings and we can't apply two or more bindings on same model. Luckily,
knockout have workaround for that, which give us possibility to implement our widget anywhere inside cart
page.
<script type="text/javascript">
cpq.ready(function()
{
var model = {
isVisible: ko.observable(true),
data: ko.observableArray(),
clearAll: function ()
{
model.data([]);
},
remove: function(item)
{
model.data.remove(item);
}
};
cpq.events.sub('cart:updated', function(data) {
// if we received client data, add it to our model
if (data.model.workflowClientData())
{
for(var i = 0; i <
data.model.workflowClientData().length; i++)
{
model.data.push(data.model.workflowClientData()[i]);
Note that only difference between this and previous example is in block of code just above applyBindings
part. Then, we surounded our widget div with stopBinding function that we've added in script block to tell
knockout that on this part of HTML is applied inner binding.
The example of global script (name of script, Ex. GetData) for getting key attributes:
def GetColumns(mainItems):
columns = ["Product Name"]
if len(list(Quote.MainItems)) > 0 :
MyPage.html:
<!DOCTYPE html>
<html>
<head>
<script src="libs/jquery.js"></script>
<script src="libs/knockout.js"></script>
<script src="app.js"></script>
<script src="libs/bootstrap.min.js"></script>
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="libs/bootstrap.min.css">
</head>
<body>
<div>
<table class="table table-bordered table-hover ">
<thead>
<tr data-bind='foreach: columns'>
<th>
<span data-bind="text: $data"></span>
</th>
</tr>
</thead>
<tbody data-bind="foreach: rows">
<tr>
<td data-bind="text: $data.productName "></td>
<!-- ko foreach: $data.keyAttributes -->
<td data-bind="text: $data.ParsedValue || 'Null'"></td>
<!-- /ko -->
</tr>
</tbody>
</table>
</div>
</body>
</html>
app.js:
$(function() {
$.get(location.origin + "/customapi/executescript?scriptname=GetData",
function(data) {
var ViewModel = function(data) {
var self = this;
self.columns = ko.observableArray(data.columns);
self.rows = ko.observableArray(data.values);
};
ko.applyBindings(new ViewModel(data)); // This makes Knockout get to
work
We need to define a tab with IFrame as a Type, and in IFrame URL you should provide URL like : https://
webcomcpq.com/mt/{your_tenant}/additionalfiles/MyFolder/MyPage.html
Where MyFolder is a folder where we will upload our files (html, js, css), and MyPage.html our custom page
for displaying data.
Also we need to include knockout.js and jquery.js and reference them in MyPage.html. We can include
bootstrap to make UI looks more native.
All files needs to be uploaded to MyFolder, previously defined. For better organization we can create sub-
folder lib and place all common libraries (such as 'knockout.js', 'jquery.js', 'bootstrap.css..') there.
This procedure shows you how to make the list of hidden attributes display in the Responder.
Procedure
1. Create new IronPython script for listing all product attribute values and name it GetHiddenAttributes.
Those attributes are hidden.
IronPython:
list = []
atrributes = Product.Attributes
for attr in atrributes:
if not attr.ShowInResponder:
for value in attr.Values:
list.append(value.Display)
ApiResponse = ApiResponseFactory.JsonResponse(list);
<script type="text/javascript">
showResult = function (callback)
{
return cpq.server.executeScript("GetHiddenAttributes", {}, callback);
};
cpq.ready(function(){
var model = {
dataArray: ko.observableArray()
};
cpq.events.sub('API:configurator:updated', function(data) {
init = function(serverData) {
for(var i = 0; i < serverData.length; i++)
{
model.dataArray.push(serverData[i]);
}
};
showResult(init);
});
ko.applyBindings(model, document.getElementById("exampleList"));
});
</script>
<div id="exampleList" class="row" data-bind="visible: dataArray">
<strong>Below is some client data</strong>
<ul>
<!-- ko foreach : dataArray -->
<li data-bind="text: $data"></li>
<!-- /ko -->
</ul>
</div>
4. Configure your product and you should see list of hidden attribute values rendered just above the
Responder every time Configurator updates.
The following events are the most important, currently available SAP CPQ events, to which users can freely
subcribe through user interface templates and fetch server data. Each event returns different data, based on
the model that is created.
API:cartList:updated Event executes when cart list (Load Existing Quotes) page is
initialized/created or updated
Note
Before each implementation, you should first see what the returned model looks like, and only afterwards
try to fetch the needed data.
<script>
cpq.ready(function() {
cpq.events.sub("API:catalog:updated", function(catalogResponse){
console.log(catalogResponse.model);
});
});
</script>
5. After this, go to the Catalog page, inspect the page (press F12 ), and go to the Console tab. Here, you
should see the whole Catalog model and the available information that you can use for your own purposes
whenever the Catalog page is updated.
<script>
cpq.ready(function() {
cpq.events.sub("API:QuoteActions.afterActionExecution",
function(actionResponse){
if (actionResponse.OrderStatusId) {
const statusId = actionResponse.OrderStatusId;
if (actionResponse.OrderStatuses) {
const currentStatus =
actionResponse.OrderStatuses.find(status => status.Id == statusId);
console.log(currentStatus.Name);
}
}
});
});
</script>
8. Create a new quote and go to any custom tab (that is not Quotation). When we create a quote, the
expectation is that it is created in the Open status.
9. Open console (press F12 and move to the Console tab) and execute the newly created action.
10. In the console, you should be able to see the new status name, which you can place anywhere in the user
interface template.
This procedure shows how you can download XML file that has been generated by global script.
The example of global script (name of script, For example, GenerateXML) for generating XML file:
import clr
clr.AddReference('System.Xml')
from System.Xml import XmlDocument
from System.Text import Encoding
from System import DateTime, Random
Note that we have set ErrorMsg to None, you should use some logic to see if error has happened and assign
message to ErrorMsg
You should create custom template and add button that will trigger script and use cpq global variable to
download XML file.
The @ sign in templates denotes use of Razor syntax. Razor is a markup syntax for adding server-based code
to web pages. It is a server side markup syntax much like ASP and PHP and supports C# and Visual Basic
programming languages.
XML:
<h1>Hello Razor</h1>
<p>The time is @DateTime.Now</p>
The page contains ordinary HTML markup, with one addition: the @ marked Razor code. The Razor code does
all the work of determining the current time on the server and display it. You can specify formatting options, or
just display the default.
Razor view helper functions are used in responsive template and all templates that we want to see title of
CSHTML file when we are debugging ( F12 in browsers).
Available functions:
Translation is a helper function that renders message text on page based on key from appliaction dictionary.
The syntax is: @Translation.Get(key). This function will render message text from dictionary based on
provided key.
Context
We want to add multilanguage support to our template. To do that we need replace our static text with calls to
Translation.Get.
@Translation.Get("MyKeyFromDictionary")
3. When template renders you should see value from appliaction dictionary for supplied key.
Function PartialWithNameAsComment renders the specified partial view as an HTML-encoded string and
adds name of file as a comment in html.
Context
Syntax:
@Html.PartialWithNameAsComment(partialViewName)
@Html.PartialWithNameAsComment(partialViewName, model)
@Html.PartialWithNameAsComment(partialViewName, viewData)
@Html.PartialWithNameAsComment(partialViewName, model, viewData)
These functions will render partial view and add name of that source file as a HTML comment.
We want to add custom cshtml template on our main page, but we would also like to see message that from
certain part in our main page begins custom template part. That message will be visible as HTML comment
when debugging our page in browser.
XML:
@Html.PartialWithNameAsComment("CustomTemplateCF")
Procedure
3. After shared template is created, we can use it within some other template. For example, if we have
template for Catalog page and we want to use some shared template within it, we simply call it with
@html.PartialCustomTemplate("Template_Name") where we want to add that part.
After naming shared template we will see it as part of Catalog page template when we exit setup. As it is shown
below, the point where is shared template placed matches the point where we call it within the code (on the top
of the page).
9.7.5.4 Url.MTContent
Syntax:
@Url.MTContent(path)
Example
Render image beach.jpg that you previously added to Additional Files folder.
C#:
Custom CSS or JS files can be uploaded via the File Manager into additional files folder and be used and
referenced in custom templates.
Context
We want to upload JavaScript file on file system and reference that JS file in our custom action template on
Cart page.
Procedure
1. Create and upload your JavaScript file via File Manager into additional files folder.
In our example, JS file is a simple function that shows message in alert box.
XML:
Observe that src attribute in script html tag represents path to the uploaded script in additional files folder.
Also, ShowResult() is our JS function from uploaded file.
3. Go to Cart page.
Here is an example of how to use new version of template and upgrade the existing one. When custom
template is used and new version of template appeared with new release, user won't see these modifications
unless he compares them and then upgrades custom template with differences. For this purpose we use
Template versions tab on Responsive UI Template page. Here, we have all versions of some template. Versions
with User System are release's versions and versions with some other user are custom.
After two versions are selected and Compare button is clicked we can see the differences between these two
versions, so than we can use these rows to upgrade our version of template.
This section contains descriptions of obsolete features. Obsolete features are tied to the Classic Design.
In SAP CPQ Setup under section UI design there is a link Top Menu. The purpose of this functionality is creating
an alternate look of menu on the user side.
This view is representing a icons besides labels that is a common and standard view of Menu. On administrator
side, there is a new table which plenty of possibilities that can be manage through adding/editing icons.
When a radio button Icons is chosen a table below is editable and can be administered. When adding new icon
there are possibilities like position, images, URLs, HTMLs, tags and conditions. Depending on what is managed,
the result on the user side can be a textual link, image link, some contextual SAP CPQ tags and pop ups
windows.
When a radio button Labels is chosen a table below is not editable and cannot be administered.
The Custom Category UI administrative section allows customizing the appearance of categories by assigning
them appropriate XSLT files.
Custom Category UI administration can be accessed by selecting the Custom Category UI link under the UI
Design dropdown. From here you can add, delete, or edit category designs.
Adding new design is available by clicking the Add New button. Category and XSLT file are the only required
fields. You can also restrict the design to a specific User Type by selecting the user type from the dropdown.
Product Configuration Templates provide you much flexibility in customizing the layout of the configuration
screen.
There are templates available to modifying the look of the Configurator, Responder, tabs, steps, and the
page. Product Configuration Templates administration can be accessed by selecting the Product Configuration
Templates link under the UI Design dropdown. From here user can add, delete, edit, or copy Templates.
To add a new template, click Add New. Template Name is the only required field. This is because any XSLT files
that aren’t defined here are defaulted to what is set in the Application Parameters administrative section. Any
files set here override the default.
The template needs to be named something that is relative to the product or category. The template
description can be provided if further clarification is needed. If the template checkbox is checked,Guided
Selling Template then that template only appears when editing Guided Selling.
Also, Guided Selling product responder is different than the normal products responder, and default
GuidedSellingSearch.xsl responder needs to be selected for Guided Selling templates.
There are five sections of the configuration page that user can set templates for (default files are in
parentheses):
• Tabs - defines the look of the tab area on the page (DefaultTabs.xsl)
• Configurator - defines the look of the configuration section of the page (DefaultConfigurator.xsl)
• Steps - defines the area to the left of the configuration section (DefaultSteps.xsl)
• Responder - defines the responder area where the configuration summary is given (DefaultResponder.xsl)
• Page - defines the layout of the screen. Here you’re able to control where each section is positioned on the
page. (DefaultPage.xsl)
User can upload a new file with the Upload button or download existing files by selecting the file from the
dropdown and clicking the Download button. Additionally, you can delete files by selecting a file from the
dropdown and clicking the Delete button.
Once all information is filled in and completed, clicking the Save button saves the template and add it to the list
of Templates.
Product Details Templates allows designing the Product Details page in a flexible, yet easy way by dragging and
dropping various elements to the Design panel. Users can see the templates designed in the Catalog when
they click on products View Details link. Templates can contain information about products, product attributes,
Facebook widgets and so on.
Note
This feature is obsolete in Responsive Design, and can only be accessed if Classic Design is used.
Product Details Templates administration can be accessed by selecting the Product Details Templates link
under the UI Design section of the Setup. From there you can add, delete, edit, or copy templates.
Product weight is added as a new product property. You can set label, rank, and styles as for all other product
properties. The label of this property depends on the value of the application parameter, Unit of Measurement
under Application Parameters General Parameters . The value of the product property is one of following:
Product Weight in GRAMS, Product Weight in KGS, Product Weight in LBS.
On the first tab Details, you can define properties specific to elements (for example - element div has only one
detail, rank, which defines the order within the parent element). On the second tab Styles, you can define the
style for that element.
In the Catalog, only attributes that exist in a product are displayed for the user, while attributes that don't
belong to that product are ignored. All other elements are shown to the client. Static elements are listed in the
following table.
Name Description
Tab container Use it when you want to separate data in more tabs.
Tab Use it to display data into a tab panel. Use it together with
tab container.
Caution
After you've finished designing the template, you need to associate at least one product or a category with
this template in order to display it in the Catalog. See Products to Product Details Templates Mappings
[page 635] for more information.
Templates Mappings administration can be accessed in Setup UI Design Product Details Templates
Mapping . From here user can add, delete, or edit a mapping.
Clicking Add New opens a page where you can connect a single product or products within a category to a
template.
Once you set up the mapping, you can see the details by clicking View Details in the Catalog. It’s possible to
specify whether the details appear in a modal div, or in a new page, by changing the application parameter
Allow view details for simple products in catalogue, which has three available values: No, In modal popup, On
new page (See Application Parameters [page 637]).
When you click on View Details, the system tries to find the template for that product. If there’s no template for
that product, the system tries to find a template for the category to which the product belongs. If there’s no
template for that category, the system continues searching recursively for a template in the parent category.
Finally, if there's no template that matches the criteria, the system chooses a default template (which doesn't
define category and product (Any)) or if there’s no default template mapping, the standard view is used.
The Application Parameters section provides settings that affect how some operations in the system function.
These settings allow companies to configure system operations to their needs.
To access these parameters, go to Setup General Application Parameters . Application Parameters are
separated into tabs.
Changes made to application parameters are logged in the User Actions tab of the Audit Trail. The following
information is logged in the Action column: Application parameter changed.
If the tenant in question is a Quote 2.0 tenant, this information is stated in the top of the page in General
Parameters.
DB Version Defines the current database version. Quote 1.0 and Quote 2.0
Default Country/Region Defines the country used in the system. Quote 1.0 and Quote 2.0
Initially show only active products in Includes only active products when set Quote 1.0 and Quote 2.0
administration's product list to TRUE.
When users enter several words in Regulates how SAP CPQ filters prod Quote 1.0 and Quote 2.0
search box, SAP CPQ will find products ucts.
based on each entered word (instead of
searching based on entire phrase)
Do not email login details to users Defines whether a new User created by Quote 1.0 and Quote 2.0
created by admin the SAP CPQ admin receives an email
notification with login details.
Default login remember preference Defines which User login details are re Quote 1.0 and Quote 2.0
membered.
In Reverse Search, Sort Attribute Values Enables the sorting of attribute values Quote 1.0 and Quote 2.0
By in reverse search by rank (Attribute
Value Sort Rank), Id (Product Attrib
ute Value Id), or by the catalog code
length/catalog code content (As In V5).
From Email Address Defines the email address used to con Quote 1.0 and Quote 2.0
tact administration, notify the SAP CPQ
admin about new user registration and
email order confirmation.
Sender Email Name Defines the name that appears in email Quote 1.0 and Quote 2.0
headers as the sender.
Sender Email Address Defines the email address that appears Quote 1.0 and Quote 2.0
in email headers as the sender's email.
Reply-to / Return-Path Email Name Defines the name that appears in email Quote 1.0 and Quote 2.0
headers as the Reply-to name.
Reply-to / Return-Path Email Address Defines the name that appears in email Quote 1.0 and Quote 2.0
headers as the Reply-to email.
Show Reverse Search Controls whether the Description/Part Quote 1.0 and Quote 2.0
Number search functionality is dis
played. When set to TRUE, the function
ality is displayed.
Secure Site for License Purchasing Defines the URL of a web page that is Quote 1.0 and Quote 2.0
secure for license purchasing.
Unique Product Codes Determines whether product codes are Quote 1.0 and Quote 2.0
unique. When this parameter is set
to TRUE, the product part number is
treated as serial number, which means
that you can't have multiple items on
one or more quotes with the same
part number (the product part number
should be unique). If this parameter
is enabled, the part numbers for your
products shouldn't be static, but must
instead be resolved from formulas.
Unit of Measurement Indicates the unit used to measure Quote 1.0 and Quote 2.0
weight in the system. The choices are
GRAMS, LBS and KGS.
Try Formatting Report File Compares report Excel file columns and Quote 1.0 and Quote 2.0
formats their content accordingly (dec
imals, date/time), depending on their
numerical pattern. It does not format
string content.
Try Formatting CSV Product Export Files Determines whether SAP CPQ arranges Quote 1.0 and Quote 2.0
the Product Export File content into col
umns.
Export All Custom Table Data as Strings Determines whether SAP CPQ exports Quote 1.0 and Quote 2.0
by Default all custom table data and formats the
table content. When set to TRUE, all
data is treated as a string. For exam
ple, enabling this parameter resolves
the problem of leading zeroes being re
moved from spreadsheet files.
Available actions for Inactive Revisions Determines whether actions are availa Quote 1.0 and Quote 2.0
ble either for active or inactive revision.
When Based on status of ACTIVE revi
sion, actions are available only for ac
tive revisions. When Based on status of
EACH revision, actions are available for
inactive revisions as well.
Admin to receive PDA quote link Determines whether administrators re Quote 1.0 and Quote 2.0
ceive an email notification containing a
list of all approvers for the Quote and
their PDA approval links.
Enable ResponsAbility Integration Enables Users to integrate with Work Quote 1.0 and Quote 2.0
flow.
Users who are able to change Effective Determines which Users are able to Quote 1.0 and Quote 2.0
date when selecting products are change the start and end dates when
selecting products.
Use recurring price and cost Determines whether recurring price Quote 1.0 and Quote 2.0
and cost fields are displayed. When
this application parameter is enabled,
recurring prices are shown for all prod
ucts in the Catalog, in product details
and in product compare. This change
is not dependent on integrations with
other systems.
Use recurring periods If set to TRUE, when custom pricing Quote 1.0 and Quote 2.0
is the selected pricing mechanism for
a product, it is possible to select a
Recurring Price Period in the Pricing tab
in product administration.
Allow processing of document If set to FALSE, document generation Quote 1.0 and Quote 2.0
generation tag formulas with Cost field tags with formulas referencing the Cost
field from the quote are not processed
in the output of parsable attachments
enclosed within email notifications.
Users can only select project for the Determines whether Users can only Quote 1.0 and Quote 2.0
quote, not create new project select existing projects or create new
ones. When set to TRUE, Users can only
select existing projects, but not define
new projects. When set to FALSE, Users
can create new projects.
Users are able to create product Determines whether Users can create Quote 1.0 and Quote 2.0
favorites product favorites. If the parameter is
set to TRUE, Users are able to create
product favorites. Supported in both
Quote engines.
Show lead/prompting arrows (catalog, Indicates whether breadcrumbs that Quote 1.0 and Quote 2.0
configurator, shopping cart, document track the User’s trail pop up in the Cat
generation) alog, Configurator, Cart and document
generation. Users can click each item
on the breadcrumbs trail to jump back
and forth.
Show effective dates for price book When set to TRUE, the columns Valid Quote 1.0 and Quote 2.0
entries From and Valid Until are displayed in the
pricebook table entries. This parameter
is by default set to FALSE which means
that administrators can’t enter multi
ple pricebook entries with the same
part number and price code. If set to
TRUE, multiple pricebook entries with
the same part number and the same
price code can be entered, in which
case different effective dates for the en
tries should be defined.
Calculate price only based on part When set to FALSE, the prices are cal Quote 1.0 and Quote 2.0
number and ignore price code culated based on both the part number
and the price code of a pricebook entry.
However, if set to TRUE, the system dis
regards the price code and calculates
prices only based on the part number of
the entry.
Audit Trail for Pricebooks If set to Audit Disabled, changes per Quote 1.0 and Quote 2.0
formed on pricebooks will not be log
ged in Audit Trail Pricebooks .
On tenants with exceedingly large price
books, performance may be slow when
updating pricebooks due to the size
of the pricebook or the update. Disa
bling this parameter can improve the
performance in this scenario. The pa
rameter is set to Audit Enabled by de
fault.
URL for PULL web service when Enables admins to enter a URL that en Quote 1.0 and Quote 2.0
retrieving assets ables Users to retrieve assets or XML
files required for configuring products.
Show progress information to users Defines whether Users receive a report Quote 1.0 and Quote 2.0
when adding items to quote on their progress when they add items
to Quote.
Show progress information to users Defines whether Users receive a report Quote 1.0 and Quote 2.0
when sending data to CRM on their progress when they send data
to CRM.
Show progress information to users Defines whether Users receive a report Quote 1.0 and Quote 2.0
when arriving from CRM on their progress when they arrive from
CRM.
Display List Of Recent Items To Users Defines whether Users can view a list of Quote 1.0 and Quote 2.0
their recent items. The list appears on
the left-hand side.
Display products in Recent Items Defines whether recently used products Quote 1.0 and Quote 2.0
are included in the List of Recent Items.
Display categories in Recent Items Defines whether recently used catego Quote 1.0 and Quote 2.0
ries are included in the List of Recent
Items.
Display generated documents in Recent Defines whether recently generated Quote 1.0 and Quote 2.0
Items documents are included in the List of
Recent Items.
Display quotes in Recent Items Defines whether recently created/used Quote 1.0 and Quote 2.0
quotes are included in the List of Re
cent Items.
Ignore Standard CRM Mappings Defines whether SAP CPQ ignores Quote 1.0 and Quote 2.0
standard CRM Mappings. When set
to TRUE, SAP CPQ ignores standard
CRM Mappings and creates mappings
through IronPython scripts instead.
When set to FALSE, standard CRM
mappings override any script in the sys
tem.
Display table for simple product rules Defines whether SAP CPQ displays a Quote 1.0 and Quote 2.0
table for setting attribute dependency
rules in simple product administration.
Show Allow Option for Simple product Defines whether Users have the option Quote 1.0 and Quote 2.0
rules to allow a previously disallowed attrib
ute dependency rule.
Copy Opportunity Id On New Revision Defines whether SAP CPQ copies the Quote 1.0 and Quote 2.0
Opportunity Id on each new revision
of the Quote. When set to FALSE, SAP
CPQ creates a new Quote without the
Opportunity Id.
Copy sales order ID when creating new When SAP CPQ is integrated with SAP Quote 1.0 only
revision ERP and this parameter is set to TRUE,
when a new revision of the quote is cre
ated, the sales order ID of the quote is
copied to the revision. If set to FALSE,
the sales order ID is not copied to new
quote revisions.
Always reset filters on LoadQuote Defines whether existing quote search Quote 1.0 and Quote 2.0
filters are reset on each new session.
When set to FALSE, SAP CPQ does not
save quote search filters for the next
session.
Allowed Content File Extensions Administrators need to enter all file ex Quote 1.0 and Quote 2.0
tensions that should be supported for
upload in the File Management and in
the Documents tab. Upload of other file
extensions cannot be performed.
Enable security check for excel files When enabled, it activates the secur Quote 1.0 and Quote 2.0
ity check for Excel files uploaded in
the Documents tab on quotes. The
Excel file is checked if its extensions
are .xlsx, .xls, .xltx, and .xlt.
Use responsive GUI Enables Users to work on a responsive Quote 1.0 only
GUI platform.
Responsive GUI per user Enables individual Users to switch to a Quote 1.0 only
responsive GUI platform. When set to
FALSE, Users use the GUI set by the
Use responsive GUI parameter.
Unique Company Code Defines whether Users can only add Quote 1.0 and Quote 2.0
companies with a unique company
code. When set to FALSE, added com
panies do not need to have a unique
company code.
Disable timezone conversion for date Prevents date-only fields from display Quote 1.0 and Quote 2.0
field ing different values to users from differ-
ent timezones.
Check For 5-digit Zip Code Number For Determines whether Users need to en Quote 1.0 and Quote 2.0
Customers (USA format) ter a 5-digit zip code number in the Bill
To Details table on the Customer Info
page in order to save the page. When
set to NO, SAP CPQ allows Users to en
ter another digit format and save the
page.
Use End User Role Determines whether the end user role is Quote 1.0 and Quote 2.0
used or not.
Fill BILL TO and SHIP TO data with Determines whether the Bill To and Quote 1.0 and Quote 2.0
default values Ship To fields are filled in with default
values.
Password Validity Period The number administrators provide Quote 1.0 and Quote 2.0
here determines for how many days a
password is valid for users after they
change or create them. The default
value of the parameter is 0, and if this
value isn’t changed, the password valid
ity period is unlimited.
Max Number of Days Before Password Specifies the number of days before Quote 1.0 and Quote 2.0
Expiration Warning is Shown Users receive a warning that their pass
word needs to be changed. Password
expiration is set for each User in the
User/Groups drop-down menu. See the
chapter on Users for more information.
User Can Change Global Customers’ Determines whether Users can mod Quote 1.0 only
Data ify global customer data. When set to
NO, only administrators can change the
data.
When determining permission groups Defines whether SAP CPQ uses the Quote 1.0 and Quote 2.0
based on market, use Quote selected Quote-selected market. If the Quote-se
market if available lected market is not available, SAP CPQ
uses the default market the User chose
on the User Page. When set to FALSE,
SSAP CPQ pulls the User’s default mar
ket.
Send email to user when password is If set to TRUE, which is the de Quote 1.0 and Quote 2.0
changed fault value, users whose password is
changed will get an email informing
them about the password change. This
behavior applies whether the password
is changed in the application or via the
API.
Set boundary for two-digit year Enter the parameter value in the form Quote 1.0 and Quote 2.0
resolving of a two-digit number, so that the sys
tem assumes the first two digits of a
year entered in the two-digit format to
be 19 (if the two-digit year is larger than
the parameter value) or 20 (if the two-
digit year is smaller than the parameter
value). If no values are entered for this
parameter, the boundary for resolving
two-digit years is 99 by default. For ex
ample, if the value set for this parame
ter is 20, and a two-digit year in the
system is 29, the year is resolved as
1929. However, if the two-digit year en
tered in the system is 10 with the same
setting for this parameter, it is resolved
as 2010.
Hide Obsolete Features This parameter hides the following fea Quote 1.0 and Quote 2.0
tures:
Number of autocomplete results for • Defines how many suggestions are Quote 1.0 and Quote 2.0
attribute
displayed to users when they en
ter a value for autocomplete attrib
utes.
• The default number is 10. You can
enter a number within the range
10-100.
Check permissions for pre/post actions • If set to Yes, the system checks us Quote 1.0 and Quote 2.0
er's permissions for pre and post
actions and executes them accord
ingly.
• If set to No, all pre and post actions
are executed without checking the
user's permissions.
Hide "From" Email Address and "Name" If this parameter is set to TRUE, the Quote 1.0 and Quote 2.0
from the Generated Document Email From and Name fields will not be visible
Form in SAP CPQ in the email form in the
last step of document generation. How
ever, the email received displays the
from email address and the name (the
email is retrieved from the From Email
Address application parameter and the
name belongs to the user sending the
proposal).
Preselect the first attribute value on a If the parameter is set to TRUE, and a Quote 1.0 and Quote 2.0
product product is modified via the SimplePro
ductAdministration SOAP API, the first
value of each product attribute is prese
lected in the Configurator.
Use attribute value code instead of value If the paramter is set to TRUE, during Quote 1.0 and Quote 2.0
in quote serialization XML quote serialization, the content node in
the XML file is populated with the at
tribute value code, instead of the attrib
ute value.
Search exact product part number for Setting it to TRUE speeds up the search Quote 1.0 and Quote 2.0
promotions of promotion products on the quote
in cases when their name is not de
fined in Setup Pricing/Calculations
Promotions/Special Pricing , but
only their part number. The default
value is FALSE. Before changing the
value to TRUE, revise the existing pro
motions and make sure that all prod
ucts have unique part numbers. This
parameter is available only in Quote 1.0.
Prompt user to upgrade product aliases If set to TRUE, and the option Prompt Quote 1.0 and Quote 2.0
to new versions on opening the quote Users For Update to New Product
Versions is enabled in the Workflow for
a specific action, when the user exe
cutes that action and new product ver
sions are available for the items in that
quote, they will be prompted to upgrade
both regular items and items created
from product aliases to new versions.
Alternatively, if set to TRUE and the
option Automatically Update Items to
New Product Version is enabled in the
Workflow, both regular items and items
created from product aliases will be au
tomatically upgraded to new versions.
However, if set to FALSE, in both of
these scenarios, only the the items that
aren't created for product aliases will
be affected by the options set in the
Workflow.
Users
Check For 5-digit Zip Code Number For Determines whether Users need to en Quote 1.0 and Quote 2.0
Customers (USA format) ter a 5-digit zip code number in the Bill
To Details table on the Customer Info
page in order to save the page. When
set to NO, SAP CPQ allows Users to en
ter another digit format and save the
page.
Validity Period for Password Creation The number administrators provide Quote 1.0 and Quote 2.0
Token here determines for how many hours
the URL for password creation sent to
a newly created user’s email address is
valid.
Use End User Role Determines whether the end user role is Quote 1.0 only
used or not.
Allow Admins to Set Temporary Allow administrators to create a tempo Quote 1.0 and Quote 2.0
Password rary password for users which must be
shared outside SAP CPQ. For details
see Create Temporary Password [page
131].
Fill BILL TO and SHIP TO data with Determines whether the Bill To and Quote 1.0 only
default values Ship To fields are filled in with default
values.
If the User Changes the Password It Will Specifies the number of days left until Quote 1.0 and Quote 2.0
be Valid Another the password expiration date.
Max Number of Days Before Password Specifies the number of days before Quote 1.0 and Quote 2.0
Expiration Warning is Shown Users receive a warning that their pass
word needs to be changed. Password
expiration is set for each User in the
User/Groups drop-down menu. See the
chapter on Users for more information.
User Can Change Global Customers’ Determines whether Users can mod Quote 1.0 only
Data ify global customer data. When set to
NO, only administrators can change the
data.
When determining permission groups Defines whether SAP CPQ uses the Quote 1.0 and Quote 2.0
based on market, use Quote selected Quote-selected market. If the Quote-se
market if available lected market is not available, SAP CPQ
uses the default market the User chose
on the User Page. When set to FALSE,
SAP CPQ pulls the User’s default mar
ket.
Send email to user when password is If set to TRUE, which is the de Quote 1.0 and Quote 2.0
changed fault value, users whose password is
changed will get an email informing
them about the password change. This
behavior applies whether the password
is changed in the application or via the
API.
Use Global User Id as Federation Lets administrators determine how Quote 1.0 and Quote 2.0
Identifier
users are mapped when they log in via
federation:
Product Catalog
Allow Comparing In Catalog Enables Users to compare products in Quote 1.0 and Quote 2.0
the Catalog.
Allow Paging In Catalog Defines whether products are divided Quote 1.0 and Quote 2.0
into page sections with a minimum of 5
products per page and a maximum of
100 per page. When set to FALSE, all
products within a category are grouped
on one page.
Allow view details for simple products in Enables administrators to specify the Quote 1.0 and Quote 2.0
catalogue way product details are shown in the
Catalog.
Attribute comparation display option Enables administrators to permit Users Quote 1.0 and Quote 2.0
to compare various attributes and At
tribute Values in products.
Catalog Loading Simple Products Optimizes the loading time of simple Quote 1.0 and Quote 2.0
products. When set to FAST, the loading
time is the shortest. If a formula is used
in product price or product description,
it is not parsed. Provided that no base
price is defined, Users see the formula
expression and 0 (zero), respectively.
The following example illustrates this
point.
Hide product price in catalogue (classic If set to Yes, product price isn’t dis Quote 1.0 and Quote 2.0
design) played in the Catalog in the classic de
sign.
Example
<*Eval(100*<* TABLE
( SELECT Discount
FROM contracts WHERE
contract_name = 'Contract
12073' ) *>)*>
<*PRICE(Payment)*>
<*SELECTVALUES(Payment:2)*
>
Catalog Loading Configurable Products Optimizes the loading time of configu- Quote 1.0 and Quote 2.0
rable products. When set to any value
other than FAST, a product price and
the Add to quote checkbox are shown
in the Catalog. This way it is possi
ble to add several configurable prod
ucts at once in the Quote. When set
to FAST, the configuration state is un
known and assumed to be incomplete,
so no prices are shown. In addition,
when Guided Selling Product Search re
sults are shown, if Guided Selling Prod
uct configuration applied to a catalogue
product makes it complete, price and
Add to quote will appear. Price pars
ing and calculations for the Guided Sell
ing Product results are controlled by
the Catalog Loading Attribute Based
Search.
Use Default Image Determines whether a default image is Quote 1.0 and Quote 2.0
shown for products. The default image
is assigned to products that do not have
an image.
Default Product Image Name Specifies the name of the file used as Quote 1.0 and Quote 2.0
the default product image. This image
file must exist in SAP CPQ’s images
folder.
Display Products Above Subcategories Takes Users directly to the Products Quote 1.0 and Quote 2.0
page and skips subcategories.
Show Quantity in Catalogue Enables Users to set quantity in the Quote 1.0 and Quote 2.0
Catalog. When set to TRUE, products
have an input field for quantity. When
Users select the Add to Quote check
box, the quantity is 1 by default. By en
tering quantity in the Catalog, the Add
to Quote box is automatically selected.
Show customize button for simple Removes blank space in simple prod Quote 1.0 and Quote 2.0
products ucts. If there are no configurable prod
ucts, the Customize button is hidden.
Hide categories within the catalog when Defines whether the Catalog is visible Quote 1.0 and Quote 2.0
tree navigation is available on the User side. When set to FALSE,
the Catalog is visible.
When users press 'Add Item' in quote, Defines whether Users are transferred Quote 1.0 and Quote 2.0
it will take them to the top catalog to the root catalog category when they
category click Add Item in the Quote. When set to
FALSE, Users are redirected to the last
category that was visited in the Catalog.
Always reset filters in catalog Defines whether SAP CPQ sets fil- Quote 1.0 and Quote 2.0
ters (description search, part number
search) defined during the previous
session. When set to FALSE, SAP CPQ
sets description search by default.
Remain in Catalog after adding product Determines whether Users remain in Quote 1.0 and Quote 2.0
to the quote Catalog after adding a product to
Quote. When set to FALSE, Users are
directed to the Quote.
Show product image within the Quote Defines whether the image of the prod Quote 1.0 and Quote 2.0
summary in Catalog uct added to Quote pops up in Sum
mary.
Show icon within the Quote summary Defines whether SAP CPQ displays a Quote 1.0 and Quote 2.0
in Catalog to clarify whether product is small orange-colored cart icon in the
already in the Quote Summary window when a product is
already in the Quote. Note that this pa
rameter is valid only when the Remain
in Catalog after adding product to the
quote parameter is set to TRUE.
Disable category rank sort for categories allows administrators to disable the Quote 1.0 and Quote 2.0
having more than rank sort in categories, depending on
the number of products they contain.
When set to 1000, categories contain
ing more than 1000 products do not
display the rank sort.
Default Sorting in Catalog You can choose criteria other than Quote 1.0 and Quote 2.0
Name for default sorting in the Catalog
such as Part Number, Price, Product
Type Name and Rank by changing the
value of this parameter.
Configurator
Attribute Values per Page Defines the number of attribute values Quote 1.0 and Quote 2.0
that are displayed in Product Attributes.
If the number of available attributes ex
ceeds this number, SAP CPQ creates
a new page under the Attribute Values
screen.
Configurator Columns Enables administrators to enter the Quote 1.0 and Quote 2.0
number of columns the Configurator
needs to contain.
Do Not Recycle Sequence Determines whether a sequence starts Quote 1.0 and Quote 2.0
over once the last number is generated.
When set to TRUE, an error displays
when the product code is generated.
Image Attributes Show Labels Defines whether SAP CPQ displays an Quote 1.0 and Quote 2.0
image attribute label in the Configura-
tor.
Max Column Count for Image Attributes Enables administrators to enter the Quote 1.0 and Quote 2.0
maximum number of columns that are
taken up by image attributes. The value
is 3 by default. If administrators leave
the field blank or enter 0 and 1, the de
fault value of 3 columns is applied.
Missing Attribute Image Refers to the attributes set up to be dis Quote 1.0 and Quote 2.0
played as images. The missing attribute
image is displayed if the image for that
attribute is unavailable. This image file
must exist in SAP CPQ’s images folder.
Responder (right) Area Width Enables administrators to determine Quote 1.0 and Quote 2.0
the area width of the responder.
Request Transfer to Item in Configurator Determines whether items are transfer Quote 1.0 and Quote 2.0
red in the Configurator.
Show quantity in responder Determines whether the quantity of Quote 1.0 and Quote 2.0
each product is shown in the responder.
Show product configuration template Defines whether SAP CPQ displays the Quote 1.0 and Quote 2.0
product configuration template in the
Configurator.
Show Attribute Prices within Determines whether attribute prices Quote 1.0 and Quote 2.0
Configurator are displayed to Users during configu-
ration. Prices are displayed in brackets
next to each attribute value. When set
to Simple, each attribute value has a
price displayed next to it. When set to
Relative, prices of the sibling attribute
values are shown relative to the price of
the selected value.
Configurator Lock Period Contains the number of minutes dur Quote 2.0 only
ing which the item actions Delete, Edit,
Copy, Refresh and Upgrade to New
Product Version are locked for user B
while the user A is already working on
the quote. This parameter is relevant
only for the parallel work on quotes in
the Quote 2.0 engine.
Visual Style (Responder) Determines the default responder Quote 1.0 and Quote 2.0
styles that Users see. Administrators
can override these selections by choos
ing a new style in the User Groups ad
ministrative section.
Show dissallowed attributes in Defines whether SAP CPQ displays dis Quote 1.0 and Quote 2.0
configurator allowed attributes in the Configurator.
Allow attribute value to be listed as line Enables Users to list attribute values as Quote 1.0 and Quote 2.0
item even if its extended price is zero line items, even if their extended price is
(default behavior) zero.
ResponsAbility encript key Enables administrators to enter the Re Quote 1.0 and Quote 2.0
sponsAbility encrypt key that appears
in the Configurator.
ResponsAbility tenant enables administrators to enter the Re Quote 1.0 and Quote 2.0
sponsAbility tenant that appears in the
Configurator.
ResponsAbility URL enables administrators to enter the Re Quote 1.0 and Quote 2.0
sponsAbility URL that appears in the
Configurator.
ResponsAbility Username enables administrators to enter the Re Quote 1.0 and Quote 2.0
sponsAbility username that appears in
the Configurator.
ResponsAbility Password enables administrators to enter the Re Quote 1.0 and Quote 2.0
sponsAbility password that appears in
the Configurator.
Show processing icon in configuration, Defines whether a processing icon ap Quote 1.0 and Quote 2.0
quote and catalog pears in configuration, Quote and Cata
log to indicate that SAP CPQ is execut
ing the selected action.
Execute rules in child products (found in Defines whether SAP CPQ executes Quote 1.0 and Quote 2.0
attribute container) when adding parent rules in child products when Users add
product to the quote parent products to the Quote
Show Next and Previous buttons in Defines whether SAP CPQSAP CPQ Quote 1.0 and Quote 2.0
product configuration displays Next and Previous buttons in
product configuration.
Show Next button in Product when only Defines whether SAP CPQ displays a Quote 1.0 and Quote 2.0
one tab is displayed Next button in product configuration
when only one tab is displayed.
Execute triggers when uploading Defines whether SAP CPQ executes a Quote 1.0 and Quote 2.0
attribute file attachment with the same trigger event when uploading a new at
name tribute file attachment with the same
name as the previous attachment.
Display child item total price in parent This parameter is by default set Quote 1.0 and Quote 2.0
item price breakdown to TRUE. When a parent-child config-
uration is opened and the user clicks
on a parent item in the Configuration
Tree, the price displayed for the child
item in the Configuration Summary will
be the total price of the child item in
cluding the price of its child items,
instead of only the total price of the
child item. Additionally, if the param
eter is enabled, a new CTX tag <*
TotalPriceWithChildItems
*> becomes available, used for retriev
ing the total price of the product to
gether with the total price of each of
that product’s child items. This parame
ter affects both one-time and recurring
prices in the Catalog.
Allow attribute propagation when If set to Yes, attribute values are propa Quote 1.0 and Quote 2.0
attribute is disallowed gated from parent to child even if the
attribute is disallowed.
Minimum level of logged API entries in The levels of Log entries are: Info, Quote 1.0 and Quote 2.0
the Log Warning, Error and Fatal. API entries
with a lower level than the one selected
here will not be logged. For example,
if Warning is selected here, Info level
will not be logged, and Error and Fatal
levels will be logged. Fatal level is al
ways logged. After the date defined in
the Minimum level selection for log API
entries valid until parameter, this selec
tion is disregarded and all API entries
are logged as Warning.
Minimum level selection for log API On the date which is specified here, the Quote 1.0 and Quote 2.0
entries valid until value selected for the minimum level of
logging expires (that is, defaults to the
level Warning).
Display Product in Configuration Tree You can choose whether product Quote 1.0 and Quote 2.0
using: names or product part numbers are
displayed in the Configuration Tree.
When updating quote item, reapply Defines whether SAP CPQ reapplies the Quote 2.0 only
default discount default discount each time a Quote is
updated. When set to FALSE, Users can
change the multiplier in the Quote and
save the change. Note that you need to
set the appropriate Visual Style for the
multiplier to appear in the Quote.
When updating quote item, reapply Defines whether SAP CPQ reapplies the Quote 1.0 only
default discount/multiplier default discount/multiplier each time a
Quote is updated. When set to FALSE,
Users can change the multiplier in the
Quote and save the change. Note that
you need to set the appropriate Visual
Style for the multiplier to appear in the
Quote.
Allow Edit List Price on the Cart Determines the conditions under which Quote 1.0 only
the List Price is editable in the Quote.
When Users make adjustments in the
Cart Fields Administration, they can set
this parameter to one of the four availa
ble values.
Allow Edit Cost on the Cart Enables Users to edit the Cost field in Quote 1.0 only
the Quote, provided the field is made
editable in the Cart administration.
When item’s cost is edited in the quote, Defines whether SAP CPQ disregards Quote 1.0 only
upon changing item’s configuration, Users’ edits of the Cost field value in the
cost will be recalculated Quote and calculates a new value based
on the configuration changes. When set
to FALSE, SAP CPQ does not retain
Users’ manual edits of the field value
following the configuration changes and
keeps the value defined in the Setup.
Always Refresh List Price on Reconfigure Defines whether SAP CPQ disregards Quote 1.0 only
Users’ edits of the List Price field value
in the Quote and calculates a new value
based on configuration changes (con
figuration changes trigger list price for
mula recalculations). When set to NO,
SAP CPQ does not retain Users’ man
ual edits of the field value following the
configuration changes and keeps the
value defined in the Setup.
Allow Reordering Items in a Cart Allows Users to reorder items in the Quote 1.0 and Quote 2.0
Cart. When ALLOW PRODUCT SORT
ING is set, Users can reorder main and
line items. When ONLY ALLOW MAIN
ITEM SORTING is set, Users can only
reorder the main items.
Auto reconfigure cart Defines whether the Cart is reconfig- Quote 1.0 and Quote 2.0
ured. When set to YES, the Cart is re
configured when the Ship To info is
changed.
Calculate Auto-Reconfigure only items Defines whether SAP CPQ automat Quote 1.0 and Quote 2.0
with modified ItemQuantity attribute ically reconfigures only those items
whose item quantity Attribute Value is
changed.
Owner of a Copied Quote will be Enables administrators to define the Quote 1.0 and Quote 2.0
owner of the copied Quote – the Owner
of the Original Quote or the User that
Made a Copy.
Default Visual Style (Shopping Cart/ Determines the default styles Users Quote 1.0 and Quote 2.0
Quote) see.
Generate PDF Determines whether a PDF is generated Quote 1.0 and Quote 2.0
during Quote generation. When set to
FALSE, a DOC file is generated.
LineItemInfo Propagate Qty From Main Propagates quantity only to the first- Quote 1.0 and Quote 2.0
Item level children.
Propagate Quantity to Nested Products Propagates quantity from the main item Quote 1.0 and Quote 2.0
to all its descendants.
LineItemInfo User Can Enter Quantity Enables Users to enter the number of Quote 1.0 and Quote 2.0
individual line items in the Quote.
MULTILEVEL System Determines whether an inheritance Quote 1.0 and Quote 2.0
structure is used in SAP CPQ. When
set to FALSE, user administration, man
aging parent, approve parent, ordering
parent, etc. are disabled. These options
are also removed from the User Defini-
tion page.
My Quotes Tab Name Contains the tab name that replaces Quote 1.0 and Quote 2.0
the My Quotes name set by default.
Other Quotes Tab Name Contains the desired tab name that re Quote 1.0 and Quote 2.0
places the Other Quotes name set by
default.
Shipping is Required Ensures that every Quote includes ship Quote 1.0 and Quote 2.0
ping.
After setting optional, variant Defines whether SAP CPQ recalculates Quote 1.0 only
and alternative items CPQ should the Quote Custom Field formulas when
recalculate quote custom fields Users classify items as optional, variant
and alternative.
Quantity Sign Enables administrators to select if the Quote 1.0 and Quote 2.0
value entered in the Quantity field is
ONLY NON-NEGATIVE, ONLY POSITIVE
or POSITIVE AND NEGATIVE.
Visual Style Determines the default styles Users see Quote 1.0 and Quote 2.0
for specific sections. Administrators
can override these selections by choos
ing a new style in the User Groups sec
tion.
Waiting For Approval Tab Name Enables administrators to enter an Quote 1.0 and Quote 2.0
other name for the Waiting for Approval
tab.
Action ‘Send Quote Xml’ sends quote Specifies the template for the XML Quote 1.0 and Quote 2.0
xml under the name document name that is sent to the FTP
server.
When action 'Send Quote Xml' is Contains the HTTP address to which an Quote 1.0 and Quote 2.0
executed, send xml to Http Address XML document is sent.
When action 'Send Quote Xml' is Contains the FTP address to which an Quote 1.0 and Quote 2.0
executed, send xml to FTP Address XML document is sent.
Ftp Path Contains the path SAP CPQ uses to ex Quote 1.0 and Quote 2.0
ecute transfers to the FTP server.
Ftp Username Contains the username used to gain ac Quote 1.0 and Quote 2.0
cess to the File Transfer Protocol.
Ftp Password Contains the password used to gain ac Quote 1.0 and Quote 2.0
cess to the File Transfer Protocol.
Action ‘Send BOM Xml’ sends quote xml Specifies a template for the XML docu Quote 1.0 only
under the name ment name that is sent to the FTP
server.
When action 'Send BOM Xml' is Contains the HTTP address to which an Quote 1.0 only
executed, send xml to Http Address XML document is sent.
When action 'Send BOM Xml' is Contains the FTP address to which an Quote 1.0 only
executed, send xml to Ftp Address XML document is sent.
When Creating Quotes through API, Defines whether Users creating Quotes Quote 1.0 and Quote 2.0
shipping method is required through API have to include a shipping
method.
When Creating Quotes through API, Defines whether Users creating Quotes Quote 1.0 and Quote 2.0
customer roles are required through API have to include customer
roles.
When Creating Quotes through API, do Defines whether Users creating Quotes Quote 1.0 and Quote 2.0
NOT require customer's StateAbbrev via API have to include customers’ state
abbreviation. When set to NO, Users
have to enter the state abbreviation in
put node.
When Creating Quotes through API, do Defines whether Users creating Quotes Quote 1.0 and Quote 2.0
NOT require customer's First Name via API have to include customers’ first
name. When set to NO, Users have to
enter the first name input node.
When Creating Quotes through API, do Defines whether Users creating Quotes Quote 1.0 and Quote 2.0
NOT require customer's Last Name via API have to include customers’ last
name. When set to NO, Users have to
enter the last name input node.
When Creating Quotes through API, do Defines whether Users creating Quotes Quote 1.0 and Quote 2.0
NOT require customer's Email via API have to include customers’
email. When set to NO, Users have to
enter the email input node.
Recalculate cart in selected currency Controls the rounding of items in the Quote 1.0 and Quote 2.0
Quote and their sum. When set to ei
ther None or Fix Items, the prices are
rounded to the nearest whole number.
Apply Taxes on Shipping Defines whether taxes are applied to Quote 1.0 only
shipping.
Roll-Up Cart Items Enables an additional numbering Quote 1.0 and Quote 2.0
scheme for items which support roll-up.
Include child items set as 'Optional' in Determines whether SAP CPQ includes Quote 1.0 and Quote 2.0
Rolled-Up price and cost calculations optional child items in rolled-up price
and cost calculations.
Display Item Type column Defines whether the Quote includes the Quote 1.0 and Quote 2.0
Item Type column. Line items are op
tional, variant or alternative.
Place order email Subject Displays the email subject of the order. Quote 1.0 and Quote 2.0
Place order “From” email address Displays the default email address from Quote 1.0 and Quote 2.0
which the order is sent.
Override Default Place Order Email Defines whether SAP CPQ overrides the Quote 1.0 and Quote 2.0
default order email address.
Go to customer info tab when arrives Directs Users to the Customer Info tab Quote 1.0 and Quote 2.0
from Sales Force even if customers are when they arrive from Salesforce. In
already mapped addition, the parameter enables Users
to check if mappings are properly con
ducted and to change data if required.
Copy Opportunity Info on Copy Quote Defines whether SAP CPQ also copies Quote 1.0 and Quote 2.0
the Opportunity info when copying the
Quote.
Time out limit for inactive users in When a user opens a quote in parallel Quote 1.0 and Quote 2.0
simultaneous work with another user, after the time period
defined in this parameter passes, the
system no longer considers that the
user is working on the quote and the
user’s name won’t be displayed in the
parallel work alert on the quote. This
parameter is applicable only when there
are multiple users working on the same
quote in parallel.
Alert users about simultaneous work on Defines if users opening a quote are Quote 1.0 and Quote 2.0
the same quote notified that there are other users al
ready working on the same quote. Since
SAP CPQ doesn't support parallel work
of multiple users on the same quote,
this parameter enables notifying users
there are other users working on the
quote before they make any changes.
The system checks if there are already
users working on the quote only when
the session of the second user starts.
Therefore, it is possible that the noti
fication displays on the quote even af
ter the first user has stopped working
on the quote. In that case, the second
users needs to reload the quote and the
notification will no longer display. Addi
tionally, in this parameter you can de
fine the format of the notification (link
in the quote or a pop-up message after
opening a quote).
Display Quote Tabs as Read-Only Defines whether Users can only read Quote 1.0 and Quote 2.0
Quote tabs. When set to NO, Users can
make changes to Quote tabs.
Generate Notification Attachments as Enables Users to attach only PDF docu Quote 1.0 and Quote 2.0
PDF ments to generated notifications. When
set to NO, Users can attach other docu
ment formats.
Optimize queries for customers and Speeds up the loading of the customer Quote 1.0 and Quote 2.0
other users quotes list page (the Shipping Info tab) and/or
Other Quotes tab (Load Quote). When
set to YES, only the first two pages are
loaded.
Note
If this parameter is set to
Other Quotes, or Other Quotes
and Customer List Page, the
Discount rules for parent items in the Enables administrators to select which Quote 1.0 and Quote 2.0
quote will be applied on fields are affected by the formulas for
calculating discounts in parent items in
the parent-child configurations.
Allow only one promotion per quote Enables Users to place only one promo Quote 1.0 and Quote 2.0
tion per Quote. When set to NO, Users
can place more than one promotion per
Quote.
Enable product search by part number Defines whether Users can search Quote 1.0 and Quote 2.0
in ‘Add Products’ section of the quote products by part number in the Add
Products section of the Quote.
Enable product search by product name Defines whether Users can search Quote 1.0 and Quote 2.0
in ‘Add Products’ section of the quote products by name in the Add Products
section of the Quote.
Enable product search by product Defines whether Users can search Quote 1.0 and Quote 2.0
name and description in ‘Add Products’ products by name and description in
section of the quote the Add Products section of the Quote.
Show Part Number as part of product Defines whether SAP CPQ displays a Quote 1.0 and Quote 2.0
search results in ‘Add Products’ section product’s part number as a part of the
of the quote product search results in the Add Prod
ucts section of the Quote.
Show Product Name as part of product Defines whether SAP CPQ displays a Quote 1.0 and Quote 2.0
search results in ‘Add Products’ section product’s name as a part of the product
of the quote search results in the Add Products sec
tion of the Quote.
Show Product Description as part of Defines whether SAP CPQ displays a Quote 1.0 and Quote 2.0
product search results in ‘Add Products’ product’s description as a part of the
section of the quote product search results in the Add Prod
ucts section of the Quote.
Product Search On The Quote Can Find Defines whether SAP CPQ finds con Quote 1.0 and Quote 2.0
Configurable Products figurable products when searching for
products in the Quote Products Search.
Product Search On The Quote Can Find Defines whether SAP CPQ finds prod Quote 1.0 only
Product Favorites uct Favorites when Users search for
products in the Quote Products Search.
Define prefix for generated document Enables administrators to define the Quote 1.0 and Quote 2.0
name name prefix of the document generated
by SAP CPQ.
Define suffix for generated document Enables administrators to define the Quote 1.0 and Quote 2.0
name name suffix that appears by default on
generated documents.
Name of the Document Template to Enables administrators to enter the Quote 1.0 and Quote 2.0
be automatically generated (custom name of the Document Template that
action) is automatically generated.
Share document customizations Enables administrators to share all cus Quote 1.0 and Quote 2.0
tomizations during Quote document
generation among all Users for each
Quote. When set to FALSE, all custom
izations are stored only for the User
making these customizations. If mul
tiple Users work on one Quote, cus
tomizations are saved only for each
individual User. Users working on one
Quote cannot see each other’s custom
izations. When set to TRUE, customiza
tions are shared between all Users.
Display floating widget for Customize Defines whether SAP CPQ displays a Quote 1.0 and Quote 2.0
template page floating widget for the Customize tem
plate page.
Display actions for Customize template Defines whether SAP CPQ shows ac Quote 1.0 and Quote 2.0
page on the bottom of the page tions for the Customize template page
at the bottom of the page.
Upload Project Summary Template (xls Enables administrators to upload a Quote 1.0 and Quote 2.0
file) project summary template.
Quotes For Project Approval and Change Enables administrators to choose which Quote 1.0 and Quote 2.0
Of Status Action Quotes are identified for Project Appro
val and Change of Status Action.
Include Change Status Action With Defines whether the Change Status ac Quote 1.0 and Quote 2.0
Submit Project For Approval tion is included when a project is sub
mitted for approval. When set to Com
bined (Default), the Change Status Ac
tion is included with the Submit Project
for Approval.
Reset Quote Expiration Date on New Defines whether SAP CPQ resets the Quote 1.0 and Quote 2.0
Revision existing value of the Quote expiration
date on each new revision.
Save quote custom fields values when Defines whether values entered in Quote 1.0 and Quote 2.0
changing tabs quote custom fields are saved when the
user changes tabs.
Reconfigure products during document Enables SAP CPQ to collect the latest Quote 1.0 and Quote 2.0
generation product and configuration data so that
the data can be used during document
generation.
Users can see previously generated Defines whether Users can see docu Quote 1.0 and Quote 2.0
documents ments that were previously generated
in the Quote.
Allow users to download documents Defines whether Users can download Quote 1.0 and Quote 2.0
that have been generated for templates documents generated for templates
that have been deleted that have been deleted.
Allow users to download documents Defines whether Users can download Quote 1.0 and Quote 2.0
that have been generated prior to CPQ documents generated prior to the Janu
2012 January release ary 2012 release.
When List price is zero, discount will be Defines whether SAP CPQ sets the dis Quote 1.0 only
set to zero count to zero when the list price is set
to zero.
When quote is copied, new quote Defines whether new Quote items re Quote 1.0 and Quote 2.0
items will keep same identifiers(guid) as tain identifiers (guid) of the original
original quote Quote when the Quote is copied.
Display quote number and customer Defines whether SAP CPQ displays the Quote 1.0 and Quote 2.0
name in the quote header Quote number and customer name in
the Quote header
SAP Export XML template Enables admins to select a template Quote 1.0 and Quote 2.0
used during the export of a SAP CPQ
Quote to SAP.
Show copy item, delete item and refresh Defines whether SAP CPQ displays Quote 1.0 and Quote 2.0
item actions for child products in the these actions for child products in the
quote for Parent/Child System Products Quote for Parent/Child System Prod
ucts.
Populate customer role with company Defines whether SAP CPQ fills out the Quote 1.0 and Quote 2.0
info based on company/customer code customer role field with company info
based on the company/customer code
info.
Automatically save quote on custom Defines whether the quote is automati Quote 1.0 and Quote 2.0
field change cally saved every time a custom field is
changed.
Automatically save Cart Comment on If enabled, changes made in the Cart Quote 1.0 and Quote 2.0
clicking outside that field Comment quote field are automatically
saved after the user clicks outside that
field.
Hide Transparent Background for IE8 Defines whether SAP CPQ hides the Quote 1.0 and Quote 2.0
transparent background for the IE8
browser.
Send automatic notification when quote Defines whether SAP CPQ sends an Quote 1.0 and Quote 2.0
is reassigned automatic notification each time the
Quote is reassigned.
Enable quote custom field calculation Defines whether SAP CPQ conducts a Quote 1.0 and Quote 2.0
ranking Quote custom field calculation. This is
done in the order of a hierarchical se
quence of the custom fields determined
by the User.
Fire event “Quote custom field change” Determines whether the Quote custom Quote 1.0
only on changes performed by user field change action is triggered only
when Users make changes in the Quote.
When set to FALSE, the Quote custom
field change is triggered by a script.
Postcode lookup type Enables Users to use a postcode lookup Quote 1.0 and Quote 2.0
software to search for a postcode.
International postcode anywhere WS Specifies the URL Users can use to Quote 1.0 and Quote 2.0
URL search for the required postcode.
Postcode anywhere account code Specifies the account code which ena Quote 1.0 and Quote 2.0
bles Users to use the international post
code anywhere.
Postcode anywhere license key Specifies the license key which enables Quote 1.0 and Quote 2.0
Users to use the international postcode
anywhere.
Display Quotes In Last Days Shows all Quotes created within a Quote 1.0 and Quote 2.0
specified number of preceding days set
by the administrator.
Show both user quotes and other Determines whether SAP CPQ displays Quote 1.0 and Quote 2.0
quotes on the 'Other Quotes' Tab user Quotes and other Quotes in the
Other Quotes tab.
Inherit Only Product Type Determines whether child items inherit Quote 1.0 and Quote 2.0
their product type from their parent and
whether line items inherit their product
type from the main item.
Use Additional Logging For Email Enables administrators to track the sta Quote 1.0 and Quote 2.0
Notification tus of email notifications in the log.
Heading style used in generated Allows administrators to control the Quote 1.0 and Quote 2.0
documents heading styles used in the document.
Selecting Use destination styles ap
plies the heading style of the first sec
tion to all sections. Selecting Keep
source formatting allows each sec
tion to maintain its individual heading
style. If Sections will inherit formatting
(header,footer etc.) from first section
in the template is active in Setup
Document Generation Templates Edit
(a multisection template) Sections ,
and Keep source formatting is the se
lected value for this parameter, sec
tions of the document inherit header
and footer formatting from the first sec
tion of the template, but keep their own
individual heading styles. This parame
ter is available only for the new docu
ment generation engine.
Type of break used in generated Allows administrators to override the Quote 1.0 and Quote 2.0
documents default breaks between the sections
of the document and to apply the se
lected type of break instead. Admin
istrators can choose between the fol
lowing breaks: Paragraph break, Page
break, Column break, Section break
continuous, Section break new column,
Section break new page, Section break
even page, Section break odd page,
Line break. This parameter is available
only for the new document generation
engine.
Allow saving custom fields if Save Quote If this parameter is set to FALSE (which Quote 1.0 and Quote 2.0
is disabled is the default value) and the Save Quote
action is disabled in the workflow, the
Save and Continue actions are no lon
ger available in quote tabs (such as
Additional Information and Customer
Info). If the parameter is set to TRUE,
the Save and Continue actions remain
available in quote tabs and custom field
changes can be saved when Save Quote
is disabled in the workflow.
Don't copy ship-to custom fields on If users copy a quote when this parame Quote 1.0 and Quote 2.0
quote copy ter is set to Yes, ship-to custom fields
aren’t copied to the new quote.
Execute pre/post actions on quote copy If users copy a quote when this parame Quote 1.0 and Quote 2.0
ter is set to Yes, pre and post actions at
tached to the Copy action are executed.
Set margin health image and color If set to No, the margin health image Quote 1.0 and Quote 2.0
based on Rolled Up Gross Margin and color are based on Manufactures
Gross Margin.
Optimize product type calculations on If set to Yes, product type calculations Quote 1.0 and Quote 2.0
adding items to quote are optimized for a better performance.
Enable Quote Expiration only after If set to Yes, the Quote Expiration action Quote 1.0 and Quote 2.0
expiration date ends is enabled only after the expiration date
ends. If set to No, the action is available
when there is less than a day before the
expiration date ends.
Allow adding configurable products to If set to Yes, users can add configura- Quote 1.0 and Quote 2.0
quote from quick search ble products to quote directly from the
quick search.
Make quote actions available on all tabs If set to TRUE, quote actions are visible Quote 1.0 and Quote 2.0
on all quote tabs. If set to FALSE, the
actions are visible only in the Quotation
tab.
On Edit Item execute preactions By default set to TRUE. Setting it to Quote 1.0 and Quote 2.0
attached to Add Item FALSE prevents actions attached as pre
actions to Add Item to execute when
the Edit Item action is triggered.
Any added child product will inherit item When set to TRUE, the item type of any Quote 1.0 only
type from the parent product on the child product added to a parent/child
quote item on the quote is the same as the
item type of the parent product. If set to
FALSE, the item type of the child prod
uct is Base by default. In either case,
the child product item type is editable
on the quote. This parameter is valid
only for products created in SAP CPQ in
Quote 1.0 and doesn't affect the behav
ior of products imported or synchron
ized from back-end systems.
Allowed origins for the CORS filter When one or more domains are entered Quote 1.0 and Quote 2.0
in this field, only the API calls originat
ing from those domains are allowed. In
all existing tenants, the preset value of
this field will be *, indicating that all API
calls are allowed. In all new tenants, the
preset value of this field will be the URL
address of that tenant, indicating that
only API calls originating from that ten
ant are allowed.
URLs that may Embed CPQ defines URLs that may embed SAP Quote 1.0 and Quote 2.0
CPQ using <frame>, <iframe>, <ob
ject>, <embed> and <applet>. If the
parameter is empty or * is entered,
embedding is allowed for all URLs. To
prohibit embedding on all URLs, there
should be ‘none’ in the parameter. Also,
embedding is disabled if there is an in
correct URL in the parameter. Admin
istrators should set trusted domains
through the application parameter to
prevent framing from other domains.
The value of the parameter must be the
exact URL on which SAP CPQ is opened
in another application.
Permitted sources for JavaScript contains URLs to secure sources from Quote 1.0 and Quote 2.0
which JavaScript files can be used in
SAP CPQ. Introduced as part of the
Content Security Policy [page 823].
Permitted sources for stylesheets or contains URLs to secure sources from Quote 1.0 and Quote 2.0
CSS which stylesheets and CSS files can be
used in SAP CPQ. Introduced as part
of the Content Security Policy [page
823].
Permitted sources for images contains URLs to secure sources from Quote 1.0 and Quote 2.0
which images can be used in SAP CPQ.
Introduced as part of the Content Se
curity Policy [page 823].
Permitted sources for font resources contains URLs to secure sources from Quote 1.0 and Quote 2.0
which sont resources can be used in
SAP CPQ. Introduced as part of the
Content Security Policy [page 823].
Permitted sources that can be used as contains URLs to secure sources that Quote 1.0 and Quote 2.0
an HTML < form > action can be used in SAP CPQ as an HTML
<form> action. Introduced as part
of the Content Security Policy [page
823].
The Deploy / Send Changes functionality enables you to send changes made in one SAP CPQ environment
(such as sandbox or test) to another (such as production).
For example, imagine that you made several changes to a product in your sandbox environment (for instance,
you added formula rules, attribute triggers and global scripts). After running tests and concluding that the
changes will not break your existing customizations in the production, you can use the Deploy / Send Changes
feature to send and deploy the product to the production environment.
To access this feature, go to Setup General Deploy Send Changes . The page that displays contains
the following tabs:
Note
Products and attributes synchronized from the back end can’t be sent or deployed using this feature.
However, they can be referenced in the deployment package using their system ID. For example, if a
synchronized product is referenced in the container of a product bundle, this container will keep the
reference to that synchronized product after deployment, but that referenced product should already exist
in the target tenant. It is expected that these synchronized products exist in the target tenant and that they
are in the correct state (that is, that they have the same attributes as the synchronized products in the
source tenant).
SAP CPQ objects that can be combined into a package are referred to as package components or change
types. Additionally, you can make changes to the deployment package as many times as needed, which makes
the deployment process more flexible. You can create a deployment package in SAP CPQ or upload an existing
deployment package. Details are provided in the following sections. Deploying an object that already exists in
the target environment overwrites the existing object.
Note
When products, attributes, attribute values, categories, product types, tabs, configuration templates,
details templates, user types, shipping methods, global scripts, custom actions, custom calculations,
product-level scripts, or Responsive Design templates are deployed/sent to other environments, their
system ID remains the same. If an entity with several versions is deployed to another environment, all
versions will have the same system ID, and the entity can be filtered according to the creation dates of its
versions.
The following is a list of package components that can be added to the deployment package and deployed.
Click the appropriate link to learn how to add a particular component.
Once you add a package component, save your changes. The newly created package is displayed in the grid on
the Deployment Packages tab. You can perform the following actions on the package:
• clone
• edit
• download
• send
• delete
The grid displays the following columns: Package Name, Package Description, Source Environment, Destination
Environment, Comment, Status Date and Status. You can sort the columns in an ascending or descending order
by clicking the arrows next to the column name. Additionally, values in columns can be searched by entering a
query in the dedicated box and clicking on Search or by pressing Enter.
Note
The system uses System ID to match entities in the source and the target environment. If there is an entity
with the same System ID but a different name in both environments, the system will display an error and
the deployment will be unsuccessful. The message in the user interface states the name of the entity that
caused the issue. To fix the issue, you should change the System ID or the name of the scripts. To update
the existing entity, adjust the name and System ID so they match. If you want to create a new entity in
the target environment, make sure that the name and the System ID of the entities are different in the two
environments.
Apart from creating a deployment package from start to finish, you can also upload an existing package from
your computer. Uploaded packages can be managed the same way as any packages made in SAP CPQ.
Note
Decompressing a .zip file creates a folder of the same name. If you decompress a .zip file and subsequently
decide to compress it again in order to upload it back to SAP CPQ, you should open the folder, compress
the contents into a .zip file and upload the file. Compressing the folder (as opposed to opening the folder
and compressing the contents) prevents the .zip file from properly uploading.
Deploy a Package
Note
To add approval rules to the deployment package and deploy them, follow the steps below.
1. Create a deployment package as explained in Deployment Packages [page 670]: select Approval Rule in
Package Component and click Add.
A new page displays.
2. In Name, define a name for the package component.
3. (Optional) In Description, enter a description for the package component.
4. In Approval Rules that will be sent, select the approval rules you want to add to the package.
1. All Approval Rules: all available approval rules are added to the package and sent to the destination
environment.
2. Selected Approval Rules: only the approval rules you select are added to the package and sent to the
destination environment.
To move approval rules from All Approval Rules to Selected Approval Rules, use the right arrow.
Alternatively, to remove approval rules from Selected Approval Rules, use the left arrow.
5. Click Add to Package.
The package component displays in the Deployment Package Component section on the Deployment
Packages tab.
6. Click Save.
The package containing approval rules as a package component displays in the grid on the Deployment
Packages tab.
7. Deploy the package as explained in Deployment Packages [page 670].
When deploying approval rules, the following data is sent to the destination environment:
• approval rules
• custom approvers selection logic
• selected approvers
• delegation of approvals
• user types
• companies
New users will not be created in the destination environment for the selected approvers.
Related Information
To add cart level aggregates to the deployment package and deploy them, follow the steps below.
1. Create a deployment package as explained in Deployment Packages [page 670]: select Cart Level
Aggregates in Package Component and click Add.
A new page displays.
2. In Name, define a name for the package component.
3. (Optional) In Description, enter a description for the package component.
4. In Cart Level Aggregates that will be sent, select the cart level aggregates you want to add to the package.
1. All Cart Level Aggregates: all available cart level aggregates are added to the package and sent to the
destination environment.
2. Selected Cart Level Aggregates: only the cart level aggregates you select are added to the package and
sent to the destination environment.
To move aggregates from All Cart Level Aggregates to Selected Cart Level Aggregates, use the right
arrow. Alternatively, to remove approval rules fromSelected Cart Level Aggregates, use the left arrow.
5. Click Add to Package.
The package component displays in the Deployment Package Component section on the Deployment
Packages tab.
6. Click Save.
The package containing cart level aggregates as a package component displays in the grid on the
Deployment Packages tab.
7. Deploy the package as explained in Deployment Packages [page 670].
When deploying cart level aggregates, the following data is sent to the destination environment:
• name
• expression
To add categories to the deployment package and deploy them, follow the steps below.
1. Create a deployment package as explained in Deployment Packages [page 670]: select Categories in
Package Component and click Add.
A new page displays.
2. In Name, define a name for the package component.
3. (Optional) In Description, enter a description for the package component.
4. In Categories, select the categories you want to add to the package.
1. All Categories: all categories are added to the package and sent to the destination environment.
2. Selected Categories: only the categories you select are added to the package and sent to the
destination environment.
Select the checkboxes next to the categories you want to add to the package.
5. Click Add to Package.
The package component displays in the Deployment Package Component section on the Deployment
Packages tab.
6. Click Save.
The package containing categories as a package component displays in the grid on the Deployment
Packages tab.
7. Deploy the package as explained in Deployment Packages [page 670].
When deploying categories, the following data is sent to the destination environment:
• categories
• images
• permissions
• parent categories
Note
Subcategories need to be manually copied to the destination environment. In addition, if manually created
permission groups consist of users that exist in the destination environment, new users will not be created
in the destination environment.
To add CRM integration to the deployment package and deploy them, follow the steps below.
1. Create a deployment package as explained in Deployment Packages [page 670]: select CRM Integration in
Package Component and click Add.
A new page displays.
2. In Name, define a name for the package component.
3. (Optional) In Description, enter a description for the package component.
4. In Selected CRM Integration data, select the integration data you want to add to the package.
5. Click Add to Package.
The package component displays in the Deployment Package Component section on the Deployment
Packages tab.
6. Click Save.
The package containing CRM integration as a package component displays in the grid on the Deployment
Packages tab.
7. Deploy the package as explained in Deployment Packages [page 670].
When deploying CRM integration, the following data is sent to the destination environment:
• CRM objects
• custom field mappings (custom fields flagged as personally identifiable information and information with
suppressed logging retain these flags after the deployment)
• customer role mappings (customer standard fields are always flagged as personally identifiable
information)
• opportunity status
• CRM item mappings
• CRM quote
Note
Pricebook market mappings, user mappings, CRM administrator account, CRM quote parameters and
general parameters need to be manually copied to the destination environment. In addition, all custom
fields mappings and customer roles mappings in the destination environment will be replaced by the new
mappings from the source environment.
To add currencies to the deployment package and deploy them, follow the steps below.
1. Create a deployment package as explained in Deployment Packages [page 670]: select Currencies in
Package Component and click Add.
A new page displays.
2. In Name, define a name for the package component.
3. (Optional) In Description, enter a description for the package component.
4. Click Add to Package.
The package component displays in the Deployment Package Component section on the Deployment
Packages tab.
5. Click Save.
The package containing currencies as a package component displays in the grid on the Deployment
Packages tab.
6. Deploy the package as explained in Deployment Packages [page 670].
When deploying currencies, no data other than currencies is sent to the destination environment.
Related Information
To add custom actions to the deployment package and deploy them, follow the steps below.
1. Create a deployment package as explained in Deployment Packages [page 670]: select Categories in
Package Component and click Add.
A new page displays.
2. In Name, define a name for the package component.
3. (Optional) In Description, enter a description for the package component.
4. In Action selection, select the custom actions you want to add to the package.
1. All Custom Actions: all available custom actions are added to the package and sent to the destination
environment.
2. Selected Custom Actions: only the categories you select are added to the package and sent to the
destination environment.
To move available custom actions to Selected Custom Actions, use the right arrow.
Alternatively, to remove custom actions from Selected Custom Actions, use the left arrow.
When deploying custom actions, the following data is sent to the destination environment:
• name
• system ID
• placement
• primary flag
• image
• conditions tied to a custom action
• script
Note
When custom actions are deployed to other environments, the system ID remains the same. If an entity
with several versions is deployed to another environment, all versions will have the same system ID, and the
entity can be filtered according to the creation dates of its versions.
Related Information
To add custom calculations to the deployment package and deploy them, follow the steps below.
1. Create a deployment package as explained in Deployment Packages [page 670]: select Categories in
Package Component and click Add.
A new page displays.
2. In Name, define a name for the package component.
3. (Optional) In Description, enter a description for the package component.
4. In Selected Custom Calculations, select the custom calculations you want to add to the package.
1. All Custom Calculations: all available custom calculations are added to the package and sent to the
destination environment.
When deploying custom calculations, no data other than custom calculations is sent to the destination
environment.
Related Information
To add custom calculations to the deployment package and deploy them, follow the steps below.
1. Create a deployment package as explained in Deployment Packages [page 670]: select Categories in
Package Component and click Add.
A new page displays.
2. In Name, define a name for the package component.
3. (Optional) In Description, enter a description for the package component.
4. In Select Custom Fields that will be sent, select the custom fields you want to add to the package.
1. All Custom Fields: all available custom fields are added to the package and sent to the destination
environment.
2. Selected Custom Fields: only the custom fields you select are added to the package and sent to the
destination environment.
To move available custom fields to Selected Custom Fields, use the right arrow.
Alternatively, to remove custom fields from Selected Custom Actions, use the left arrow.
5. Click Add to Package.
The package component displays in the Deployment Package Component section on the Deployment
Packages tab.
6. Click Save.
When deploying custom fields, the following data is sent to the destination environment:
• custom fields (custom fields flagged as personally identifiable information and/or custom fields with
suppressed logging of values retain these flags after the deployment process).
• user types
• attributes (attributes flagged as personally identifiable information and/or attributes with suppressed
logging of values retain these flags after the deployment process)
• tabs
Note
Related Information
To add custom tables to the deployment package and deploy them, follow the steps below.
1. Create a deployment package as explained in Deployment Packages [page 670]: select Categories in
Package Component and click Add.
A new page displays.
2. In Name, define a name for the package component.
3. (Optional) In Description, enter a description for the package component.
4. In Table selection, select the custom tables you want to add to the package.
1. All Custom tables: all available custom tables are added to the package and sent to the destination
environment.
2. Selected Custom tables: only the custom tables you select are added to the package and sent to the
destination environment.
To move available custom fields to Selected Custom tables, use the right arrow.
Alternatively, to remove custom fields from Selected Custom tables, use the left arrow.
5. Click Add to Package.
The package component displays in the Deployment Package Component section on the Deployment
Packages tab.
Note
Custom tables flagged as personally identifiable information and/or information with suppressed logging
retain these flags after the deployment process.
When deploying custom tables, no data other than custom tables is sent to the destination environment.
Note
The maximum size limit of custom tables that are sent to the destination environment is 20MB.
Note
If you are deploying a custom table to an environment that already contains a table with the same name,
the outcome depends on whether you select Yes (all Quote tables will be updated) or No in the deployment
questionnaire. If you select Yes, and a table with the same name already exists, the existing table is deleted
and the new table with the same name is inserted. However, if you select No, existing tables aren't updated
and new tables aren't created.
Access Rights
• Create deployment packages containing custom tables if the visibility of those tables is enabled for you
with the Access Rights feature.
• Send packages containing those custom tables to target environments.
• Deploy packages containing custom tables only if you have editing access rights for them.
• Create or update the existing custom tables from the package if you have editing access rights for custom
tables. To do this, the visibility of custom tables needs to be granted to you with the Access Rights feature.
If the package contains custom tables you can’t see, it can’t be deployed.
Related Information
To add global scripts to the deployment package and deploy them, follow the steps below.
1. Create a deployment package as explained in Deployment Packages [page 670]: select Approval Rule in
Package Component and click Add.
A new page displays.
2. On the Scripts tab, define a name for the package component in the Name field.
You can view the events that are attached to global scripts on the Events tab.
3. (Optional) In Description, enter a description for the package component.
4. In Script Selection, select the scripts you want to add to the package.
1. All Scripts: all available scripts are added to the package and sent to the destination environment.
2. Selected Scripts: only the scripts you select are added to the package and sent to the destination
environment.
To move scripts to Selected Scripts, use the right arrow. Alternatively, to remove approval rules from
Selected Scripts, use the left arrow.
5. For each script in Selected Scripts, select which version of the script is sent to the destination environment.
1. Click on the script.
Available versions of the script display in the Scripts Sending Checklist, and the active version is
preselected.
2. Select the checkboxes next to the versions you want to send.
Hover over the script version to view its content.
The most recent script version you select in the source environment will be active in the destination
environment.
6. Click Add to Package.
The package component displays in the Deployment Package Component section on the Deployment
Packages tab.
7. Click Save.
The package containing approval rules as a package component displays in the grid on the Deployment
Packages tab.
8. Deploy the package as explained in Deployment Packages [page 670].
On the destination environment, in Setup Develop Global Scripts , locate the script you deployed and
On the History tab, you can see when the script was created and on what environment, as well as whether there
are various versions of the script. You can also view description changes for each version in the Description
column.
When deploying approval rules, the following data is sent to the destination environment: page: select
• scripts
• events
• script history
To add guided selling products to the deployment package and deploy them, follow the steps below.
1. Create a deployment package as explained in Deployment Packages [page 670]: select Approval Rule in
Package Component and click Add.
A new page displays.
2. In Name, define a name for the package.
The name of the package component is automatically added as a prefix to each guided selling product
name in the package, making it easier to discern which products belong to which package component.
You can view the events that are attached to global scripts on the Events tab.
3. (Optional) In Description, enter a description for the package.
4. In Guided Selling Product, click Add Product.
A pop-up appears, displaying all guided selling products in the system.
1. Select the checkboxes next to the guided selling products you want to add
2. Click Add Selected.
The selected guided selling products are displayed in Guided Selling Product.
5. Click Checklist next to each selected guided selling product to view the Product Sending Checklist for the
product in question.
6. (Optional) In Product Sending Checklist, deselect the items you want to exclude from the package.
Rules, messages, images and styles, scripts and shipping methods can be safely excluded from the
package.
7. Click Add to Package.
The package component displays in the Deployment Package Component section on the Deployment
Packages tab.
8. Click Save.
The package containing guided selling products as a package component displays in the grid on the
Deployment Packages tab.
9. Deploy the package as explained in Deployment Packages [page 670].
When deploying guided selling products, the following data is sent to the destination environment:
• product name
• product description
• product part number
• permissions and effectivity dates
• additional formulas
Note
Container attributes are sent to the destination environment for all newly created containers. However,
if you make changes to the existing container attributes, you will have to manually update them in the
destination environment.
Related Information
To add item actions workflow to the deployment package and deploy them, follow the steps below.
1. Create a deployment package as explained in Deployment Packages [page 670]: select Approval Rule in
Package Component and click Add.
A new page displays.
2. In Name, define a name for the package component.
3. (Optional) In Description, enter a description for the package component.
4. In Select item actions workflow per tab, select the e item actions you want to add to the package.
1. My Quotes: item actions defined for the My Quotes tab are added to the package and sent to the
destination environment.
2. Waiting for approval: item actions defined for the Waiting for approval tab are added to the package and
sent to the destination environment.
3. Other Quotes: item actions defined for the Other Quotes tab are added to the package and sent to the
destination environment.
When deploying item actions workflow, the following data is sent to the destination environment:
• item actions
• item actions workflow
Note
New users will not be created in the destination environment for the selected approvers.
Related Information
To add markets to the deployment package and deploy them, follow the steps below.
1. Create a deployment package as explained in Deployment Packages [page 670]: select Markets in Package
Component and click Add.
A new page displays.
2. In Name, define a name for the package component.
3. (Optional) In Description, enter a description for the package component.
4. Click Add to Package.
The package component displays in the Deployment Package Component section on the Deployment
Packages tab.
5. Click Save.
The package containing markets as a package component displays in the grid on the Deployment Packages
tab.
6. Deploy the package as explained in Deployment Packages [page 670].
When deploying markets, the following data is sent to the destination environment:
• markets
• market visibility
• user types
• companies
• currencies
Note
If market visibility is defined for users that exist in the destination environment, new users will not be
created.
Related Information
To add notifications to the deployment package and deploy them, follow the steps below.
1. Create a deployment package as explained in Deployment Packages [page 670]: select Approval Rule in
Package Component and click Add.
A new page displays.
2. In Name, define a name for the package component.
3. (Optional) In Description, enter a description for the package component.
4. In Notifications that will be sent, select the notifications you want to add to the package.
1. All Notifications: all available notifications are added to the package and sent to the destination
environment.
2. Selected Notifications: only the notifications you select are added to the package and sent to the
destination environment.
To move approval rules from Notifications to Selected Notifications, use the right arrow. Alternatively,
to remove approval rules from Selected Notification, use the left arrow.
5. Click Add to Package.
The package component displays in the Deployment Package Component section on the Deployment
Packages tab.
6. Click Save.
The package containing notifications as a package component displays in the grid on the Deployment
Packages tab.
7. Deploy the package as explained in Deployment Packages [page 670].
When deploying notifications, the following data is sent to the destination environment:
• notifications
• parsable attachments
• non-parsable attachments
• email lists
• user types
Note
Related Information
To add permissions to the deployment package and deploy them, follow the steps below.
1. Create a deployment package as explained in Deployment Packages [page 670]: select Permissions in
Package Component and click Add.
A new page displays.
2. In Name, define a name for the package component.
3. (Optional) In Description, enter a description for the package component.
4. In Permission groups that will be sent, select the groups you want to add to the package.
1. All Permission Groups: all groups displayed in System Permission Groups are added to the package and
sent to the destination environment.
2. Permission Groups
Selected Permission Groups: only the permission groups you select are added to the package and sent
to the destination environment.
To move permission groups from System Permission Groups to Selected Permission Groups, use the
right arrow. Alternatively, to remove permission groups from Selected Permission Groups, use the left
arrow.
5. Click Add to Package.
The package component displays in the Deployment Package Component section on the Deployment
Packages tab.
6. Click Save.
The package displays in the grid on the Deployment Packages tab.
7. Deploy the package as explained in Deployment Packages [page 670].
When deploying permission groups, the following data is sent to the destination environment:
Note
If manually created permission groups contain users specified in the destination environment, new users
will not be created in the destination environment. Additionally, permission groups that are set for some
company may not exist in the destination environment. In this case, permission groups that do not exist in
the destination environment will not be created.
Related Information
To add products to the deployment package and deploy them, follow the steps below.
1. Create a deployment package as explained in Deployment Packages [page 670]: select Product in Package
Component and click Add.
A new page displays.
2. In Name, define a name for the package.
The name of the package component is automatically added as a prefix to each product name in the
package, making it easier to discern which products belong to which package component.
3. (Optional) In Description, enter a description for the package.
4. In Select Product, click Add Product.
A pop-up appears, displaying all products in the system.
1. Select the checkboxes next to the guided selling products you want to add
2. Click Add Selected.
3. The selected products are displayed in Select Product.
5. From the Select version dropdown list, select a product version for each product
6. Click Checklist next to each selected product to view the Product Sending Checklist for the product in
question.
7. (Optional) In Product Sending Checklist, deselect the items you want to exclude from the package.
Rules, messages, images and styles, scripts and shipping methods can be safely excluded from the
package.
• product name
• product description
• product part number
• permissions and effectivity dates
• additional formulas
• configuration layout (tabs, order of attributes)
• responder layout
• product details layout
• rules (you can choose not to send them)
• messages (you can choose not to send them)
• images and styles (you can choose not to send them)
• scripts (you can choose not to send them)
• attributes (attributes flagged as personally identifiable information and/or information with suppressed
logging retain these flags after the deployment process)
• attributes values
• categories
• product types
• user types
• shipping methods (you can choose not to send them)
• replacement products
Note
Container attributes are sent to the destination environment for all newly created containers. However,
if you make changes to the existing container attributes, you will have to manually update them in the
destination environment.
To add quote item custom fields to the deployment package and deploy them, follow the steps below.
1. Create a deployment package as explained in Deployment Packages [page 670]: select Quote Item Custom
Fields in Package Component and click Add.
A new page displays.
2. In Name, define a name for the package component.
3. (Optional) In Description, enter a description for the package component.
4. In Selected quote item custom fields, select the quote item custom fields you want to add to the package.
1. All quote item custom fields: all available quote item custom fields are added to the package and sent
to the destination environment.
2. Selected quote item custom fields: only the quote item custom fields you select are added to the
package and sent to the destination environment.
To move available quote item custom fields to Selected quote item custom fields, use the right arrow.
Alternatively, to remove quote item custom fields from Selected quote item custom fields, use the left
arrow.
5. In Quote layout permissions selection, select the quote layout permissions you want to add to the package
1. All quote layout permissions: all available quote layout permissions are added to the package and sent
to the destination environment.
2. Selected quote layout permissions: only the quote layout permissions you select are added to the
package and sent to the destination environment.
To move available quote layout permissions to Selected quote layout permissions, use the right arrow.
Alternatively, to remove quote layout permissions from Selected quote layout permissions, use the left
arrow.
3. Don’t deploy quote layout permissions: quote item custom fields are deployed without quote layout
permissions.
6. (Optional) In the Optional section, if you are deploying quote item custom fields sourced from quote or
custom tables and you want to also deploy those source tables, select the checkbox Quote Tables or
Custom Tables.
The selected type of tables is now deployed together with the quote item custom fields which reference
them.
7. Click Add to Package.
The package component displays in the Deployment Package Component section on the Deployment
Packages tab.
8. Click Save.
The package containing quote item custom fields as a package component displays in the grid on the
Deployment Packages tab.
Quote item custom fields display in the user’s selected language. If a field hasn’t been translated to the
selected dictionary, the name in English displays with the QuoteLayout.Columns. prefix.
Note
Quote item custom fields flagged as personally identifiable information and/or sensitive information retain
these flags after the deployment process.
When deploying approval rules, the following data is sent to the destination environment: page: select
Note
Additionally, if a deployed quote item custom field contains CTX tags, it is necessary to check the fields
included in the package, in case the formula contains fields that are not included by default.
Related Information
To add quote tables to the deployment package and deploy them, follow the steps below.
1. Create a deployment package as explained in Deployment Packages [page 670]: select Quote Tables in
Package Component and click Add.
Note
Quote tables flagged as personally identifiable information and/or information with suppressed logging
retain these flags after the deployment process.
When deploying quote tables, the following data is sent to the destination environment:
• quote tables
• attributes
• permissions - all permission groups are always sent to the destination environment. Additionally, by
selecting/deselecting the Permissions checkbox in the Sending Checklist, you control whether the
permissions related to the quote table that is being deployed will be included in the package.
Note
When you deploy a quote table that is in a quote tab that only exists on the source environment, that
quote tab is automatically created on the target environment and can be found under General Tabs
in Setup. However, since custom quote tabs are not sent to the target environment, you must manually
activate it by adding it as a new tab in Custom Quote Tabs .
To add responsive templates to the deployment package and deploy them, follow the steps below.
1. Create a deployment package as explained in Deployment Packages [page 670]: select Responsive
Templates in Package Component and click Add.
A new page displays.
2. In Name, define a name for the package component.
3. (Optional) In Description, enter a description for the package component.
4. In Template Selection, select the responsive templates you want to add to the package.
1. All Responsive Templates: all available responsive templates are added to the package and sent to the
destination environment.
2. Selected Responsive Templates: only the responsive templates you select are added to the package
and sent to the destination environment.
To move available responsive templates to Selected Templates, use the right arrow.
Alternatively, to remove responsive templates from Selected Templates, use the left arrow.
5. Click on a template in Selected Templates.
Checkboxes display in the Responsive Templates Checklist, allowing you to select the version of the
template you wish to deploy. The active version will be selected by default.
6. Click Add to Package.
The package component displays in the Deployment Package Component section on the Deployment
Packages tab.
7. Click Save.
The package containing responsive templates as a package component displays in the grid on the
Deployment Packages tab.
8. Deploy the package as explained in Deployment Packages [page 670].
When deploying responsive templates, the following data is sent to the destination environment:
• responsive templates
• responsive templates history
To add territories to the deployment package and deploy them, follow the steps below.
When deploying territories, no data other than territories is sent to the destination environment.
Related Information
To add user types to the deployment package and deploy them, follow the steps below.
1. Create a deployment package as explained in Deployment Packages [page 670]: select Approval Rule in
Package Component and click Add.
A new page displays.
2. In Name, define a name for the package component.
3. (Optional) In Description, enter a description for the package component.
4. In User Types that will be sent, select the user types you want to add to the package.
1. All User Types: all available user types are added to the package and sent to the destination
environment.
2. Selected User Types: only the user types you select are added to the package and sent to the
destination environment.
To move approval rules from All user types to Selected user types, use the right arrow. Alternatively, to
remove approval rules from Selected user types, use the left arrow.
5. Click Add to Package.
The package component displays in the Deployment Package Component section on the Deployment
Packages tab.
6. Click Save.
When deploying user types, the following data is sent to the destination environment:
• start category
• XSL and XSLT files
Note
New users will not be created in the destination environment for the selected approvers.
Related Information
To add workflow to the deployment package and deploy them, follow the steps below.
1. Create a deployment package as explained in Deployment Packages [page 670]: select Workflow in
Package Component and click Add.
A new page displays.
2. In Name, define a name for the package component.
3. (Optional) In Description, enter a description for the package component.
4. In Select workflow per tab, select the workflow you want to add to the package.
1. My Quotes: workflow actions defined for the My Quotes tab are added to the package and sent to the
destination environment.
2. Waiting for approval: workflow actions defined for the Waiting for approval tab are added to the package
and sent to the destination environment.
3. Other Quotes: workflow actions defined for the Other Quotes tab are added to the package and sent to
the destination environment.
5. Click Add to Package.
The package component displays in the Deployment Package Component section on the Deployment
Packages tab.
6. Click Save.
The package containing workflow as a package component displays in the grid on the Deployment
Packages tab.
7. Deploy the package as explained in Deployment Packages [page 670].
When deploying a workflow, administrators can exclude the following objects from the Workflow Sending
Checklist:
• custom actions
• notifications
• email lists
If custom actions are excluded from the checklist, notifications and email lists that are attached to the
excluded custom actions are not deployed. However, notifications and email lists attached to the standard
actions in the workflow are deployed in a regular way (unless notifications and email lists are excluded from
deployment).
Additionally, if custom actions are excluded from the checklist, the system decides whether to send the custom
actions attached as pre/post actions to the target environment depending on whether the actions already
exists in the source/target environments:
• if the same custom action is attached as a pre/post action in both the source and destination environment,
the action is sent to the destination environment (the existing action in the destination environment is
updated).
• if the same custom action exists on both environments, but it’s attached as a pre/post action only in the
source environment and not in the target environment, after deploying the workflow, the custom action will
be attached as a pre/post action in the target environment.
• if a custom action exists only in the source environment and it’s attached as a pre/post action, after the
deployment, the post action in the target environment will not have the custom action attached.
• Update all workflows - current settings are overwritten by the settings from the source environment.
• Only create new workflows - settings from the source environment are added to the current settings.
When deploying workflow, the following data is sent to the destination environment:
• statuses
• actions
• IronPython custom actions
• workflow permissions
• pre-actionspost-actions
• workflow conditions
• workflow flags
• notifications
• email lists
• required fields by workflow action
The two most common issues you can encounter during deployment are as follows:
To fix the issues, you need to change the system ID of the conflicted shipping method or user type in the source
environment.
On the Deployment Setup tab, you connect your current environment, also known as source environment, to
the environments to which you want to deploy changes.
Users can send changes made in the current environment to a target environment. To connect your current
environment to a target environment, follow the steps below.
Note
Deployment templates enable you to create templates that contain as many products as you need. Templates
can be applied to any package and reused in future deployments. As a result, the deployment process is more
streamlined.
As an example, this procedure shows you the steps to create a deployment template named January
Deployment that contains the following products: Project Management, Software Evaluation and Software
Implementation.
You can inspect the content of the template by clicking next to the template name. Additionally, you
can download or delete the template.
Applying the newly created template to a package will populate the package with the products listed in the
template.
If you edit the products which are a part of a previously created template and wish to send these product
changes to the destination environment, you can reapply the existing template to which these products belong,
instead of manually creating a completely new deployment package. Reapplying the template causes the
template to automatically obtain the latest product updates from SAP CPQ and populate the package with
those product updates.
The procedure for reapplying a deployment template is the same as the procedure for applying a deployment
template for the first time as described above. Since reapplying the template causes it to automatically obtain
product updates from SAP CPQ, you do not need to edit the template in any way.
The previous example shows how to create a deployment template named January Deployment that contain
the following products: Project Management, Software Evaluation and Software Implementation. For the current
example, imagine that in February you decide to attach a global script to the Project Management product.
Instead of manually creating a completely new package to send the product change to the destination
environment, you can reapply the template you created for January deployment. Doing that will cause the
template to automatically obtain the global script you added to the Project Management product and populate
the package.
To view the package deployed in January as well as the one deployed in February, go to the Deployment
Packages tab. In addition, a package can also be downloaded. To download a package, click next to the
package name.
Note
When you download both packages, you can upload them to Git and compare their XML files to see what
changed.
To define countries/regions, states and territories in SAP CPQ, access the Countries/Regions, States and
Territories sections in Setup, respectively. The created entities will be available in the system when managing
some other features (for example, when defining users).
For countries/regions, it is required to define a three-letter abbreviation and a two-letter abbreviation, both of
which are mandatory. For states, you need to define only one abbreviation, with either two or three letters. Use
the abbreviations defined by the ISO standard .
If no other country is selected in the dedicated fields in the user interface, the system pulls the default
country defined in the application parameter Default Country/Region ( Application Parameters General
Parameters ). However, if making updates via scripting, and no country is defined in the script, the system
disregards the parameter and sets the United States as the country by default.
States
State abbreviations are not unique in the system, but they need to be unique within a country/region. You
can create multiple states with the same state abbreviation as long as the states pertain to different countries/
regions.
States are treated separately throughout SAP CPQ. When managing users, customers and companies in Setup,
the system displays only the states that pertain to the selected country/region.
Territories
When defining territories, you need to enter their name and system ID. The System id is generated
automatically from the territory name, but you can override it by clicking . Territories are treated separately
from countries/regions and states in the system. When managing users, for example, you can select any of the
territories, even if their actual geographical position is not within the selected country/region and state.
10.4 Tabs
Tabs are components that help organize information on some of the SAP CPQ pages. You can customize tabs
to display the information best suited to your business needs.
General tabs are invisible until you use them in product configuration or in quote tab creation. To create a
general tab:
After you create a tab, you can use it for product configuration [page 74] and custom quote tab creation
(Create Quote Tab [page 397]).
10.5 Dictionaries
A dictionary in SAP CPQ contains a set of keys and their values that are applicable on tenant level. Keys are
only used in the code to reference key values that are visible in the application and refer mainly to UI content
(button labels, tooltips, etc.).
• System - there is a system dictionary in SAP CPQ for each supported language. System dictionaries cannot
be changed and no keys can be added. You can only compare and export system dictionaries. Names
of system dictionaries appear in both English and the language of the dictionary (for example: Español /
Spanish). These dictionaries are uploaded by default on all new tenants. If your business model does
not require creating custom key/value pairs, you do not need to manage dictionaries at all. The system
dictionaries are managed and updated by the SAP CPQ team and administrators have no authorization to
change them.
Custom - dictionaries that administrators create. Custom dictionaries are best to be used for overriding key
values in default dictionaries. Administrators are advised not to change the existing keys or add new ones
as this will require additional configuration in SAP CPQ so that the system could recognize them. Custom
dictionaries are created in the following scenarios:
• If you need to translate custom messages on products. Custom product messages are defined in
product definition in the Rules and Messages tab and can be translated via custom dictionaries.
You need to enter the key for the message in the Message Text field inside {{}} brackets in product
definition. In the custom dictionary, the key is entered without the {{}} brackets. In case you are using
the dictionary to translate custom messages, the ISO code is the same as for the system dictionary.
• If you need to create region-specific dictionary for a language (for example English – Australia). In
this case, a new ISO code should be used (for example, the ISO code for the English language system
dictionary is EN, but for English – Australia, it will be EN-AU).
More details on dictionaries and how-to procedures are described in the following sections:
You can compare two dictionaries to see the difference in values for the keys contained in both dictionaries.
After opening a dictionary, select in the top of the page the dictionary with which you wish to compare it. The
list automatically displays common keys with different values. The Comparison Dictionary Value (CDV) column
shows the key values in the target dictionary.
Related Information
You can either export the current dictionary or both the current dictionary and the dictionary that is being
compared, if any. You can also filter and export the dictionary entries that have been updated after a specified
date.
You can access import and export functions by clicking the icon next to dictionaries in Setup General
Dictionaries .
The Filter records modified since field is located above the list of dictionary entries. You can specify a date by
either typing it in the field or by clicking the calendar icon and picking a date in the calendar pop-up. If you are
entering the date manually, bear in mind that it needs to be in the user format. Clicking Export visible items and
Export all items exports the items currently visible on the page and all items in the dictionary, respectively.
The system exports dictionary values in the XML format and the same format should be used when importing
values.
• Add New and Update Existing Values - keys in the source dictionary will be updated with the values of
matching keys in the import file and new keys will be added.
• Add non-existing keys - only the keys that exist in the import file and do not exist in the source dictionary
will be imported.
• Add newer values - for matching keys, if the value in the import file is more recent, it will replace the value in
the source dictionary. Also, new keys are added through this option.
To access all dictionaries on a tenant and manage custom dictionaries, go to General Dictionaries . The
page lists all dictionaries and lets you delete and edit dictionary details and pertaining keys.
• Visibility Condition - enter 1 to make a dictionary visible to all users. Otherwise, you can click to
restrict the visibility to certain users.
• Condition for Defaulting to this Dictionary - the system retrieves values from this dictionary if no default
dictionary is selected for a user on User Page and in user configuration. To set a dictionary to default,
Related Information
Which Dictionaries will SAP CPQ Retrieve for my Users? [page 705]
When users log into SAP CPQ, the system first checks which dictionary is set as default in Setup Users a
user Additional Settings tab. The values from that dictionary will be used for naming buttons, tooltips, etc.
Users can always override the administrator's selection in User Page User details Default Dictionary
by selecting a different dictionary. In that case, the system disregards the selection you made in Setup and
reaches for the default dictionary. When multiple dictionaries have a defaulting condition evaluating to TRUE,
the system will use rank to sort them out (the dictionary with the lowest rank is retrieved first). Aditionally, if
the default rule is not defined for a dictionary, SAP CPQ considers that the defaulting condition is fullfiled.
You can always limit which dictionaries display to users by applying the right visibility conditions.
Related Information
10.5.6 Translations
There are certain entities in SAP CPQ that you can create on your own, such as individual products and custom
fields. These entities can be translated so that administrators and users from other countries can understand
what they are and how they can be used.
• Products, Attributes, Categories, Guided Selling and Product Types in Product Catalog.
• Shipping and Promotions/Special Pricing in Pricing/Calculations.
• Document Generation Templates, Custom Fields, Search Fields and Column Headings in Quotes.
• User Custom Fields in Users
• Statuses, Actions, Item Actions and Approval Rules in Workflow/Approval
• Customer Custom Fields in Customers/Customer Roles
• Custom Actions in Develop
• Countries/Regions and Tabs in General
You can translate an item by clicking the Translate this item action next to it., then select a language, or
languages, you wish to translate it to.
Note
Multilanguage translations can't be added to SAP CPQ via API. You need to add them manually.
The Manage Generated Documents section gives administrators an insight into all the documents that their
underlying users have generated in SAP CPQ. The list of documents shows when the document was generated,
which user generated it, the name of the file and its size. Additionally, the Sent To Customer and the Viewed
By Customer columns show whether a document is sent to the customer and if the customer has viewed it,
respectively.
Note
Non-administrative users with privileges for viewing and deleting generated documents, have the Manage
Generated Documents page available in user pages.
The only action that you can perform on generated documents is deletion:
• To delete an individual document, click the delete icon next to the file.
• To delete multiple documents at once, select the corresponding checkboxes in the Delete column and click
Delete Selected. Alternatively, click Select All to select all documents in the current page.
Clicking Delete All deletes all the generated documents in the application. You can switch to a different
page right away because the deletion process is handled in the background. This way administrators can
uninterruptedly manage other sections in Setup while the generated documents are being deleted. This
action does not delete the additional files.
To delete both the generated documents and the additional files, click Clean Up. This action is available
only to administrative users.
Related Information
File Management stores images and files that can be retrieved throughout Setup (when creating products,
categories, and so on).
To manage files (upload, download, copy, preview, and so on), access the Home tab. In the View tab, choose
how files display and whether the navigation pane with a list of folders shows up on the left.
Note
The format of images that can be uploaded in File Management is set through the Allowed Image Extensions
application parameter.
To determine your domain (tenant) name when constructing URLs for files uploaded to SAP CPQ, you can
use the <*DOMAIN*> tag. For example, to place the ChairProd image into a display-only text attribute
in the configurator, you need to use the following HTML code: <img src=”../mt/<*Domain*>/images/
productimages/Product1.png”/>. By using the <*DOMAIN*> tag, you don’t have to go back to every
field that contains a formula referring to images from the file system and manually replace the hard-coded
domain of the old environment with the name of the new environment. The system retrieves the domain name
automatically.
Before you initiate the upload, click the destination folder to which you wish to upload the file in the left-hand
navigation pane.
Procedure
1. Click Upload.
You can repeat this step to select multiple files. All files are listed in the Upload Files window.
4. Click Upload.
The progress bar visually shows the time remaining for upload.
If your company has departments in different countries/regions, in different time zones, or simply your users
are scattered around the world, SAP CPQ can be set up SAP CPQ to display information in their own time zone.
SAP CPQ administrators can set time zone globally - at the tenant level or at the user level. Once set globally,
the time zone is applied for each user. If some user needs different time zone it can be set by SAP CPQ
administrator, or by the user if they are allowed.
To set default time zone at the tenant level, go to Setup General Application Parameters , then under
“General Parameters” tab find the parameter “Default Time Zone” and make the desired selection. This will
apply the defined default time zone to all users.
As an SAP CPQ administrator you are allowed to set time zone for each user separately. You can decide
whether the user can change time zone on its own or not.
In user import/export template there is a sheet labeled ”timezones”. This sheet contains information about
all SAP CPQ system timezones that you can enter in the sample template column Timezone under the users
sheet.
Users that are allowed to change their time zone can change it by selecting the desired time zone from the
drop-down list on the User Page.
When a user creates a quote, all date information will be presented in their selected time zone. When user goes
to the load quote page, they will see the list of quotes - their own and from the others. For each quote, ”Date
Created” field will be presented to the user is in their selected time zone.
Example
User1 has created the quote in PST time zone on 06JUL2016 at 23:57:16.
User2 is in CET time zone. User2 will see that User1’s quote was created on 07JUL2016 at 08:57:16.
The same rule applies for Date Modified field. Otherwise, you can disable timezone conversion for fields
which contain date-only information (to ensure that the same date is displayed to all users regardless of their
timezones) via General Application Parameters General Parameters Disable timezone conversion for
date field . Timezone conversion is always disabled for those fields in Quote 2.0.
Time zones are supported by the CTX tag. CTX Tag can be instructed to return the time zone value of a Quote
custom field that is of type Date.
Iron Python Scripting now exposes the timezone property in the IUser interface. It can be used in scripts to
ensure that the result of the script execution will be presented to the user in the selected time zone.
The next line of Iron Python code will return the users time zone and set the content of the custom field named
Quote message:
A global script in SAP CPQ is a custom piece of code written in IronPython and attached to a certain event.
When such an event occurs in SAP CPQ, the global script attached to it is executed in the system.
For each global script, you have access to script definition [page 712], overview of events [page 716] and the
script history.
A script contains a series of commands that can be executed without being compiled. SAP CPQ provides a
user-friendly interface for administrators to create and manage scripts.
Using IronPython in SAP CPQ is limited as the system does not support standard IronPython modules. You
cannot add external .NET and complex IronPython modules to SAP CPQ scripts. However, in basic user
scenarios, you can paste the content of a simple module (without dependencies on other modules) into the
SAP CPQ script module and the system will process it properly.
Note
The flag ITrace.IsOn, which is available in scripting, indicates whether tracing is turned on or off. With the
help of this flag, users can organize the logic that is related to tracing and thus optimize script execution
time.
The screenshot below shows the interface when the script syntax is correct:
Note
The EventLog and ConsoleLog description in scripts can contain no more than 10000 characters.
The table below shows which elements of quotes are automatically saved after some events are triggered. The
data in the table is useful when creating scripts so you know when to include the Save action.
Events Custom Fields Line Items Product Types Totals Quote Tables
After changing
value of custom
fields
Quote creation
On user Login
On customer
change
Document Sent To
Customer
On Quote Tab
Changed
When Excel is
uploaded into a
Quote Table
When certain parts of a quote are changed, calculations need to be performed and changes saved. As this does
not require all events from the pipeline to be triggered, some of them can be skipped. This is determined by
the Quote.Save() parameter. This parameter is by default set to True, which causes the entire pipeline to be
executed whenever changes on quote are saved. If the Quote.Save() parameter is set to False, the following
events will not be triggered:
• Quote creation
• Before custom field calculation
The following .NET namespaces and classes are forbidden in IronPython scripts:
• System.IO
• System.Data
• System.Configuration
• Webcom.Configurator.Util.ConnectionStringProvider
• System.Environment
• System.GC
• System.Type
• System.Web.WebPages.Razor
• System.Reflection
• System.Web
• System.Diagnostics
If there are scripts that contain System import * and Webcom.Configurator.Util import * and any of the words
from the forbidden classes, the system disables saving scripts (for example, saving is disabled if there is
System import * and Data in the same script).
Global script events are events that happen on quotes and they trigger the scripts attahce dto them to be
executed in the system.
Before adding products Before adding products Just before a product No Yes
to quote to quote
is added to quote
items.
After adding products After adding products Each time an item Yes Yes
to quote to quote
is added. If several
items are added at
once (from catalog or
through adding items
in bulk), the scripts are
executed after the last
item (not after each
item is added).
SAP CPQ.
When catalog layout is On product xml Before the xml seriali Yes No
rendered serialization start
zation starts.
Assets is triggered.
On customer change On Customer Bill To When the Bill To, Ship Yes No
changed
To and End User cus
On Customer Ship To tomers are changed.
changed
Note
A more detailed documentation for scripting is available on the dedicated Scripting page.
SAP CPQ offers flexible way to meet custom demands for various functionalities that are not part of the
standard software version. This is achieved by implementing custom actions – parts of code that contain
processing logic for appropriate functionalities.
Custom actions can be used in the quote workflow as any other standard quote action, they can be set up as
pre or post action. Also email notifications can be attached to them.
Typically , these actions are used for integration with other external systems – like ERP system. For example,
one custom action could contain code that would send relevant quote information to the product manufacturer
and/or distributor software, after the order is placed on that quote in SAP CPQ.
Administration for custom actions can be found under SAP CPQ Setup Develop Custom actions . When
user clicks on sub-menu Custom actions, table with all custom actions developed by the admin is displayed.
Admin is able to translate action names by clicking on the ‘Translate’ icon, edit action by clicking on the ‘Edit’
No standard SAP CPQ actions is displayed on this page. Custom actions defined by the admin are not
displayed in SAP CPQ Setup Workflow/Approvals Actions .
Admin is able to use these actions in SAP CPQ Setup Workflow/Approvals Workflow and to define
permissions for the action in SAP CPQ Setup Workflow/Approvals Workflow Permissions .
Note
When defining Workflow transition for some custom action, in order to change quote status that action as
last row should include WorkflowContext.ChangeQuoteStatus = True.
When admin adds new/edits custom action, page is displayed where admin is able to:
Action is always set up so that it can be set as pre or post action. Placement is set to the quote (Cart)
automatically, and admin is able to change that.
Note
If a custom action causes and error, the system stops the workflow execution.
Administration for custom quote calculations can be found under SAP CPQ Setup Develop Custom
Quote Calculations .
Note
When user clicks on sub-menu Custom Quote Calculations, table with all custom quote calculations is
displayed. Admin is able to edit calculation by clicking on the ‘Edit’ action button, delete calculation by clicking
on the ‘Delete’ action button or create new calculation by clicking on the ‘Add New’ button.
Script Workbench is available for administrators to help them debug and develop their scripts. It can be
accessed through Scripts developing and editing page within SAP CPQ Setup, or from user view under the top
menu.
Iron Python Scripts have always been a powerful tool for SAP CPQ customization, so they’re well adopted
by SAP CPQ administrators and used frequently to complete a various kinds of tasks. Writing Iron Python
(IP) script can be exhaustive due to its syntax and indentation rules. Therefore, SAP CPQ introduces Script
Workbench along with some additional features that make writing scripts easier.
Note that if an administrator is in the middle of editing or developing a script, once the link Workbench is
clicked, the script is loaded into the workbench. There’s no fear that the script will be lost.
“Test” mode should be used when writing tests for your model and when executing them. Note that in this
mode, many API objects aren’t available since you’re able to only test your model, not the particular quote.
Therefore, if you open workbench in order to help you during writing the script, make sure that you select
“Standard” mode. This way you will be able to use all objects that are exposed through Scripting API. If you are
in “Test” mode, some objects (for example Quote) are not available and you will get an error when executing
the script.
While debugging, useful information is displayed under script edit area. All local variables are automatically
traced. Any syntax error you might have in your script is going to be displayed as well. This helps you a lot to
find the root cause of script problems, and shortens time to develop the script.
Note
Script execution in the Script Workbench is limited to 3 minutes (180000 ms). Scripts whose execution
exceeds this limit are automatically cancelled.
API Snippets
Beside the previously mentioned API explorer, you are introduced with API snippets. In the screenshot below
we wrote IP command to retrieve a custom field’s content with the help of “API snippets”. “API snippets” is
a practical way to quickly create chunks of API code by selecting through a series of drop down boxes and
inserting it to the editor. Note that “API snippets” is available in both, “Test” and “Standard” mode.
“Alias snippets” provides you with the most used functions on different SAP CPQ entities (products, attributes,
customer, etc.). Similar to “API snippets”, you are able to select the appropriate function from the list and then
narrow your selection by selecting through the rest of drop down boxes. As soon as you construct the desired
method, you can insert it into the script editor using either “Insert at cursor” or “Add as new line” button.
“Python snippets” provides you with the list of simple Iron Python language specific constructions that are
frequently used while writing a script. For example, if you want to write an “if else if” statement, you can pick it
from the list and insert into the editor.
From time to time, it might be very convenient to have a test that you can execute and therefore test your
model. Now you can write a test in the workbench and execute it. Once the execution is complete, you are
informed on the execution result. If test fails you are informed on the reason through the information displayed
in the workbench. When you write tests, you must be in “Test” mode.
A new Scripting object has been introduced that comprises a list of useful methods for writing tests. The
objects name is IAssert. A detailed documentation on this object can be found at this location in SAP CPQ
scripting help: IAssert Interface.
Note
Whenever a quote is edited via the Script Workbench, all changes are logged in Audit Trail User
Actions .
This section contains the list of all CTX tags, as well as ways in which various types of tags can be used in SAP
CPQ.
Conditional statements are an integral part of SAP CPQ modeling and configuration. These statements can be
used in any part of SAP CPQ.
This includes product modeling areas (rules, hidden calculations, labels, pricing expression, attribute
descriptions), workflow areas (approval rules, discounting rules, visibility rules, actions conditions) and any
other area of SAP CPQ that has an input area.
A basic statement must have a beginning [IF] tag that ends with an [ENDIF] tag. The condition area must
contain an expression that will resolve to true or false. If true then any expression in the first set of curly
brackets will be used or performed, depending on what is included. If the condition statement is false then any
expression in the second set of curly brackets will be used or performed. Since the second set of curly brackets
is optional, though, if they are not used when a statement is false then no action will be performed.
Note
Standard mathematical and programming operators such as >, <, =, = cannot be used in conditional
statements. SAP CPQ uses its own operators [page 730] to perform these actions.
12.1.1 Operators
[IN] Returns whether a value equals a value [IN](value, value 1,value 2,value 3,…)
in a list of values.
Tags are used to obtain values from different SAP CPQ entities. The expressions are used for generating text or
calculating values based on the configuration data.
Tags can be used in many areas of SAP CPQ. Three major areas are a product model, quote, and document
generation templates. They’re used for obtaining values from the following SAP CPQ entities - Products,
Attributes, Customers, and so on. Tags can also provide other useful information that could be used in
expressions.
Expressions are used for dynamically generating text or calculating values based on the configuration data.
Expressions can use string data, numeric data, math functions, if/then statements, and SAP CPQ tags.
CTX tags are used for retrieving certain values from various parts of SAP CPQ.
<*CTX(parameter)*>
The parameter is a specification of what value should be returned. It is a dot separated list of objects, sub
objects and property names. Each object may have sub objects and properties. Properties are terminals – this
means that CTX tag param may end with it.
Note
CTX tags can't be processed successfully if parentheses are used in the names of elements referenced in
CTX formulas (such as attributes, attribute values, or products).
• Quote
• Total
• CurrentItem
• KeyAttribute
• ProductType
• Customer
• Revision
• Owner
Each of these objects has corresponding properties. Quote sub objects have cart cells as sub objects, for
example Quote.Total.CartComment. Cart cell objects that are decimals, like prices, have fixed four sub tags:
For example, display is on three decimals, cart is in Euro currency, default is US Dollar:
<*CTX(Quote.Total.TotalAmount.DefaultDisplay)*> 2,345.678
<*CTX(Quote.Total.TotalAmount.DefaultDecimal)*> 2345.68
<*CTX(Quote.Total.TotalAmount.MarketDecimal)*> 1503.64
• Quote.ProductType()
• Quote.CustomField()
• Quote.Customer()
Have a parameter in the brackets. With this parameter you may specify which instance of the object should be
returned.
Example
Quote.CustomField(Terms) will return the value of the “Terms” quote custom field (sc param).
• BillTo
• ShipTo
• EndUser
To get data from involved parties [page 344], you can build CTX tags using CurrentInvolvedParty
and PartnerFunctionKey. However, the tags with CurrentInvolvedParty are used only for document
generation [page 176] while PartnerFunctionKey are used for formulas only.
Example
Quote.DocumentFormat will return the file format (PDF, DOCX) of generated document.
Date/Time fields have optional Format child tag. It expects format string in argument that affects the way value
is shown.
Date.Format(yyyy.MM.dd) 2009.01.19
Quote.DateCreated.Format(MM-dd-yy) 01-19-09
The CTX Date tag works only with the US date format, which is why .InUSDateFormat must be specified.
Example
The MyContainer tag should be used in an attribute container to access its own members, or in the product
that will be used as a container row to access parent container.
Your other option is to use it to define basic product info in the product by accessing the container in which the
product is located.
The parent container can be accessed from the child product, but only the basic info. By basic info we mean the
following: description, part number, etc. The product attribute or container of a child product cannot evaluate
the MyContainer tag in order to pull values from the parent container info.
Example
Note
Use the MyContainer tag only when you have a product in the container, otherwise you might end up with
unexpected behavior.
SFDC and SOD objects exists only if the SAP CPQ tenant is set to use them. They are exclusive – a tenant can
integrate with only one of them at once. If integration is not set usage of these tags will make syntax error in the
formula – using these tags is invalid if integration is not set.
Free form attribute in configuration to have a value of some SOD Opportunity field. Make a rule with following
action <*ASSIGNFF(SomeAttribute:<*CTX(SOD.Opportunity.Description)*>)*>
Sample 2
Action depends on an SOD Account field In the workflow condition for the action put following formula
<*CTX(SOD.Account.Description)*>
This topic contains format specifiers accepted by the Date Time Format string.
In order for Salesforce to receive data in SF Date Time type fields, the valid format must be as follows:
yyyy-MM-ddTHH:mm:ss.ff
A CTX tag returns the value of an object property only if that object is already loaded. If the object doesn’t exist
or is not loaded the returned value will be empty string.
The Quote object is loaded in the edit action. It exists on the quote, quote property, customers, and all other
cart tab pages. The Quote object is also present in the Configurator, with the exception that it doesn’t exist if
the user clicked new quote and is configuring the first item. The Quote object exists in the Catalog, but only if
add item was executed.
The Quote.CurrentItem object refers to the cart item being iterated in the loops. If used outside of the loop it
will use the first cart item. It can be used in discount rules and CRM mappings. It can be used only if the Quote
object is loaded.
The SFDC object exists if the Salesforce integration is enabled and the user came through the Salesforce
backdoor from an opportunity.
The SOD object exists if the SOD integration is enabled and current quote is attached to an opportunity.
The Visitor object is created after the user logs in. It is present the whole all time while user session is valid.
New CTX tags have been developed to help support companies with multiple languages.
If the value is not found in current dictionary, value from default dictionary will be returned.
When a user enters SAP CPQ from SalesForce opportunity, by using CTX(SFDC.Account.FieldName), the
value of the opportunity account FieldName will be obtained. Every FieldName the user has privileges to read
can be obtained by using this tag.
Note
The current integration with Salesforce will be deprecated in the 2211 release of SAP CPQ. Customers will
be able to continue using it until June 2023. To learn more about the steps you need to take as a user of this
integration, please refer to the SAP CPQ 2211 Breaking Changes and Announcements.
The purpose of these tags is that users will be able to download generated documents (proposals, SOWs, and
so on) from the external system without having to log into SAP CPQ.
In order for Salesforce to receive data in SF Date Time type fields, the valid format must be as follows:
yyyy-MM-ddTHH:mm:ss.ff
SOD tag refers to the CRM objects current quote is attached to.
Once the CRM object is loaded to associate with quote and/or execute mappings it is stored in the session level
cache. After Update Opportunity finishes this cache is cleared.
The following CTX tags are available in SAP CPQ when it's integrated with SAP Billing and Revenue Innovation
Management:
• <*CTX(Quote.CurrentItem.ChangeProcessGroupCode)*>
• <*CTX(Quote.CurrentItem.SubscriptionContractNumber)*>
• <*CTX(Quote.CurrentItem.SubscriptionContractItemNumber)*>
• <*CTX(Quote.CurrentItem.CancellationReasonId)*>
• <*CTX(Quote.CurrentItem.CancellationReason)*>
• <*CTX(Quote.CurrentItem.CancellationRequestDate)*>
• <*CTX( Quote.CurrentItem.ContractExtension.ValueCode )*>
• <*CTX( Quote.CurrentItem.ContractExtension.Unit )*>
• <*CTX( Quote.CurrentItem.ContractExtension.Unit.Translated )*>
• <*CTX( Quote.CurrentItem.ContractExtension.Value )*>
• <*CTX( Quote.CurrentItem.ContractExtension.Value.Translated )*>
• <*CTX( Quote. CurrentItem.ContractChangeActivationDate )*>
• <*CTX(Quote.CurrentItem.ContractAutoRenewalIndicator)*>
• <*CTX( Quote.CurrentItem.ContractExtension.ValueCode )*>
• <*CTX( Quote.CurrentItem.ContractExtension.Unit )*>
• <*CTX( Quote.CurrentItem.ContractExtension.Unit.Translated )*>
• <*CTX( Quote.CurrentItem.ContractExtension.Value )*>
• <*CTX( Quote.CurrentItem.ContractExtension.Value.Translated )*>
<*CatCode(attribute Gives the value catalog code String/Number Depends on <* CatCode(CD or
name)*> of the current attribute what the catalog code DVD Drive #1) *>:
selection contains returns the catalog code
value of the attribute CD or
DVD Drive #1.
<*ProductCode*> Gives the part number of the String/Number Depends on <* ProductCode *>:
current configuration what the part number returns the current part
contains number from whichever
product the tag is used in.
<*ProductLink*> Gives the link or URL from String <* ProductLink *> -
the product link field returns the text from the
Product Link field.
<*ProductImage*> Gives the product image file String <* ProductImage *> -
name used for a product returns the file name used
for the product image for the
product the tag is used in.
<*BasePrice*> Gives the base price of the Number <* BasePrice *> -
product. This is the amount returns the base price of the
entered in the product price product the tag is used in.
field.
<*CXSUB(intelligent Used with serial numbers A Sequence Value See chapter on Sequences
sequence and substituting a number [page 107] for more
to replace long string of information.
substitution
attribute values for a product
name)*>
number.
12.5 QuoteTags
These tags are generally used in visibility and approval rules. They can only be used outside of product
configuration and they will not work in product rules, descriptions, and so on.
The first three tables provide information about a quote owner (CO), current user (CU), bill to information (BT),
or customer information (CO_ST). Tag syntax for these tables is similar. The quote owner and current user
information use the same column names. The bill to information is pulled from the Bill To and End User role in
the Billing/Shipping tab of a quote. Customer information is pulled from the Ship To role.
<*ISRESPAPPROV*> True/False
action if is necessary to
execute Approval Process
before then the condition for
Generate Quote action will be
[NOT]<*APPROVALREQU
IRED*> .
<* CO_INFO(column name) *> <* BT_INFO(column name) *> <* CO_STINFO(column name)
Column Name Column Name *> Column Name
MULTIPLIER TERRITORY_ID
FAX CUSTOMER_CODE
COUNTRY
TITLE
TERRITORY_ID
<*allowatt(standard Parameters: attribute names. More Allows all values from all specified
attribute name)*> than one attribute can be entered. attributes.
Each separated from the other a
comma.
<*AllowAttributes(standard Parameters: attribute names. More Allows all values from all specified
attribute name)*> than one attribute can be entered. attributes.
Each separated from the other a
comma.
<*allowatv(standard Parameters: attributes with their Allows all values from the entered list
attribute name:standard values, separated by colon. More
than one attribute/value pair can be
attribute value)*>
entered. Every pair is separated from
other pairs by a comma.
<*AllowValues(standard Parameters: attributes with their Allows all values from the entered list
attribute name:standard values, separated by colon. More
than one attribute/value pair can be
attribute value)*>
entered. Every pair is separated from
other pairs by a comma.
<*assignff(attribute Parameters: the name of the free-form Every free input value is assigned to
name:value)*> attribute, and the value to be assigned appropriate free form attribute. If free
to the attribute, separated by colon. input value contains function, the
More than one free form attribute/free function is executed before
input value pairs can be entered. Every assignment. For example:
pair is separated from other pairs by a <*assignff(attribute_name:
comma. <*catcode(other_attribute
)*>)*> gives as the result the
CatCode string from the
other_attribute, assigned to free form
field in the attribute_name
attribute.
<*assignff(attrib_name:Web
com)*> assigns the string Webcom to
the “attrib_name” attribute. Non-free-
form attributes can’t accept the
assigned values.
<*AssignValue(attribute Parameters: the name of the free form Every free input value is assigned to
name:value)*> attribute, and the value to be assigned appropriate free form attribute. If free
to the attribute, separated by a colon. input value contains a function, the
More than one free form attribute/free function is executed before the
input value pairs can be entered. Every assignment. For
pair is separated from other pairs by a example:<*AssignValue(attrib
comma. ute_name:<*catcode(other_a
ttribute)*>)*> gives as the result
the CatCode string from the
other_attribute, assigned to
FreeForm field in the
attribute_name attribute.
<*AssignValue(attrib_name:
Webcom)*> assigns the string
Webcom to the attrib_name
attribute. Non-free-form attributes
can’t accept the assigned values.
Note
If you wish to assign date to an attribute of type Date via this tag, you should use
<*ASSIGNVALUE(TestDate:<*CTX( Date.AddMonths(1).InUSDateFormat )*>)*> since the date
needs to be converted from the user format to the US format when the AssignValue tag is used. If the
user's date format is set to anything other than the US format, and the <CTX( Date.AddMonths(1) )>
is used, the date value will be assigned incorrectly.
<*assignpc(attribute Parameters: attributes with their prices The same as previous, except that
name:value)*> to be assigned, separated by a colon. it assigns “standard attribute value”
More than one attribute/price pair can to the Price field of the “standard
be entered. Every pair is separated attribute name”.
from other pairs by a comma.
<*AssignPrice(attribute Parameters: attributes with their prices The same as previous, except that
name:value)*> to be assigned, separated by a colon. it assigns “standard attribute value”
More than one attribute/price pair can to the Price field of the “standard
be entered. Every pair is separated attribute name”.
from other pairs by a comma.
<*disallowatv(standard Parameters: attributes with their Disallows every specified value in every
attribute name:standard values, separated by a colon. More attribute in the list.
than one attribute/value pair can be
attribute value)*>
entered. Every pair is separated from
other pairs by a comma.
<*DisallowValues(standard Parameters: attributes with their Disallows every specified value in every
attribute name:standard values, separated by colon. More attribute in the list.
than one attribute/value pair can be
attribute value)*>
entered. Every pair is separated from
other pairs by a comma.
<*disallowatt(standard Parameters: attribute names. More If condition is TRUE, all listed attributes
attribute name)*> than one Attribute can be entered. are disallowed. If condition, during
Each separated from other by a some of the following steps become
comma. FALSE, the attributes are NOT re-
allowed. Here, it's recommended
to create complementary rules: for
every rule made as condition -
> disallowatt(attribute_list) create
another as [not]condition - >
allowatt(attribute_list). Additionally,
make sure that every complementary
Rule has its rank higher than the rank
of the primary rule.
<*DisallowAllValuesExcept( Parameters: attributes with their Sets all attribute values to not allowed,
Attribute_Name : Value1, values, separated by colon. More except for the listed values. This may
than one attribute/value pair can be be used when there is a large number
Attribute_Name :
entered. Every pair is separated from of attribute values, but only a couple of
Value2, ..)*>
other pairs by a comma. them needs to be allowed.
<*resetatt(standard Parameters: attribute names. More Resets every value of every listed
attribute name)*> than one Attribute can be entered. attribute.
Each is separated from other by a
comma.
<*resetatv(standard Parameters: attributes with their Resets every listed attribute value.
attribute name:standard values, separated by colon. More
than one attribute/value pair can be
attribute value)*>
entered. Every pair is separated from
other pairs by a comma.
<* SELATV (attribute1: Selects attribute values. By default Attribute values included in tag will be
value1 I value2 I value3, the system resets the attribute selected.
when a selection is made
attribute2: value 1)*>
with SELATV. With the use
of <*DONOTRESETATT*> and
<*DORESETATT*> (see description
below) more than one attribute value
will be selected without the other
values being unselected.
<* SelectValues Selects attribute values. By default Attribute values included in tag will be
(attribute1: value1 I the system resets the attribute selected.
when a selection is made with
value2 I value3,
SelectValue. With the use
attribute2: value 1)*>
of <*DONOTRESETATT*> and
<*DORESETATT*> (see description
below) more than one attribute value
will be selected without the other
values being unselected.
<* SelectValue Selects attribute values. By default Attribute values included in tag will be
(attribute1: the system resets the attribute selected.
when a selection is made with
value1,attribute1:value2 ,
SelectValue. With the use
attribute1:value3)*>
of <*DONOTRESETATT*> and
<*DORESETATT*> (see description
below) more than one attribute value
will be selected without the other
values being unselected.
<*ResetValue(standard Parameters: attributes with their Resets every listed attribute value.
attribute name:standard values, separated by colon. More
than one attribute/value pair can be
attribute value)*>
entered. Every pair is separated from
other pairs by a comma.
<*DONOTRESETATT*> Tells the system not to reset Switches the system to not reset
the attribute values when another attributes when SELATV tag is used.
selection is made. By default the
system resets the attribute when a
selection is made with SELATV. Use in
conjunction with <*DORESETATT*>
(see description below)
<*DORESETATT*> Tells system to reset attribute values Switches the system to reset attributes
when another selection is made. when the SELATV tag is used.
Generally this is used after the
<*DONOTRESETATT*> tag in the
same expression. For example:
<*DONOTRESETATT*><*SELATV(
attr1:value1)*><*DORESETAT
T*>
<* ResetAttribute(standard Parameters: attribute names. More Resets every value of every listed
attribute name) *> than one attribute can be entered. attribute.
Each is separated from other by a
comma.
<*DONOTREVERSERULES*> Tells the system not to reverse a rule Switches the system to not reverse
when the rule becomes not true. By rules when the condition is no longer
default the system will reverse a rule true.
when the condition is no longer true.
Use <*DONOTREVERSERULES*> to
turn this function off.
<*REVERSERULES*> Tells the system to reverse the rule Switches the system to reverse rules
when the rule becomes not true. when the condition is no longer true.
Generally this is used after the
<*DONOTREVERSERULES*> tag in
the same expression. For
example:<*DONOTREVERSERULES*
><*DISALLOWATT(attr1)*><*
REVERSERULES*>
<*anysel(standard Parameters: attributes with their If any value from the entered list is
attribute name:standard values, separated by a colon. More selected the result is TRUE, otherwise
than one attribute/value pair can be it’s FALSE.
attribute value)*>
entered. Every pair is separated from
other pairs by a comma.
<*IfAnyValue(standard Parameters: attributes with their If any value from the entered list is
attribute name:standard values, separated by a colon. More selected the result is TRUE, otherwise
than one attribute/value pair can be it’s FALSE.
attribute value)*>
entered. Every pair is separated from
other pairs by a comma. This tag
should be used for product rules only.
<*anyselatt(standard Parameters: attribute names. More If any value from the specified
attribute name)*> than one attribute can be selected. attributes is selected the result is
Separate them by commas. TRUE, otherwise it’s FALSE.
<*IfAnyAttribute(standard Parameters: attribute names. More If any value from the specified
attribute name)*> than one attribute can be selected. attributes is selected the result is
Separate them by commas. TRUE, otherwise it’s FALSE.
<*allsel(standard Parameters: attributes with their If all of the specified values are
attribute name:standard values, separated by a colon. More selected the result is TRUE, otherwise
than one attribute/value pair can be it’s FALSE.
attribute value)*>
entered. Every pair is separated from
other pairs by a comma.
<*IfAllValues(standard Parameters: attributes with their If all of the specified values are
attribute name:standard values, separated by a colon. More selected the result is TRUE, otherwise
than one attribute/value pair can be it’s FALSE.
attribute value)*>
entered. Every pair is separated from
other pairs by a comma.
<*allselatt(standard Parameters: attribute names. More If every specified attribute has its
attribute name)*> than one Attribute can be entered. selection the result is TRUE, otherwise
Each separated from the other a it’s FALSE.
comma.
<*IfAllAttributes(standard Parameters: attribute names. More If every specified attribute has its
attribute name)*> than one attribute can be entered. selection the result is TRUE, otherwise
Each separated from the other a it’s FALSE.
comma.
The purpose of this feature is to develop new product tag that will return product price excluding line items.
• Unit Price of the main item without line items. The tag is <*MainItemUnitPrice*> and it returns the
same value as <*TotalPriceWoLI *>.
• Extended Price of the main item without line items. Tag is <*MainItemPrice*> and it returns
{<*TotalPriceWoLI *> * <* ItemQuantity *>}.
Description Tag
In Debugger opened for product configuration, tag can be found under Variables.
XWS tag may have one or more parameters. First parameter is function name. Other parameters are optional
and represent parameters passed to the specified function. Other than that, it supports several standard
functions it’s a gateway from Configurator to external resources like web services from another systems.
• Candy - <*XWS(Candy)*> Always returns the same constant. Parameters - none. Returns - 100.
• GetProductPrice - <*XWS(GetProductPrice, ProductName)*> applies current product configuration
to the specified product and returns its price. Parameters - ProductName – a name of the product that’s
price is queried. Returns - Price of the specified product after current configuration has been applied to it.
• GetProductCatCode - <*XWS(GetProductCatCode, ProductName)*> applies current product
configuration to the specified product and returns its catalogue code. Parameters - ProductName – a
name of the product that’s catalog code is queried. Returns - Catalog code of the specified product after
current configuration has been applied to it.
• GetProductDescription <*XWS(GetProductDescription, ProductName)*> applies current product
configuration to the specified product and returns its description. Parameters - ProductName – a name
of the product that’s description is queried. Returns - Description of the specified product after current
configuration has been applied to it.
• Iterate - <*XWS(Iterate, Data, Formula)*> applies formula expression from the hint of the Formula
attribute to each part of the comma-separated values (CSV) in the value of the Data attribute and returns
sum of all evaluations. Parameters - Data – name of the attribute that in its value contains the data that
needs to be iterated - Formula – name of the attribute that in its hint contains the formula that needs to be
evaluated on each CSV value from Data attribute. Formula may contain all standard tags and new special
tag {{CurrentValue}} that will be replaced by the current iteration value. Returns - Sum of all evaluated
formulas
Example
Global Information (GI) variables contain values that can be read by any product or quote.
This comprehensive way of holding information allows values to be passed among quotes and products
through the simple use of a tag. GI variables can be defined as a quote property, within a product model, or
as a separate cart level aggregate. No matter where the GI was defined, it is available across all categories and
products.
• Explicitly, GI variables are created by using the tag setGI in product rules, triggers, and so on.
To create a GI variable within an expression, use the tag <*setGI(key,value)*>. This tag can be used
anywhere that an expression can be built: rules, triggers, calculated fields, and so on. To create the GI,
enter a key by which the value is retrieved, then enter the value that the GI holds. The value can be text or
numeric, from a static value to a dynamic value using another expression. For example, to create a GI in an
expression, enter this formula: <*setGI(k100,100)*> (key = k100, value = 100).
• Implicitly, GI variables are created via cart aggregates and quote custom fields.
To create GI variables this way, go to Setup Quotes Cart Level Aggregates . By clicking Add New, the
window for creating a new GI variable displays. Specify the following:
• GI Name – The key name by which the value of GI is retrieved.
• Expression – Enter value for GI. It can be any text, numerical value, or expression.
A GI variable is also created implicitly when a quote custom field is created in Setup Quotes Custom
Fields (see the chapter on Custom Quote Fields [page 360]).
Related Information
Once a GI has been created, it is accessible from any category, product, or generated document.
Retrieving a value can be done by simply using the tag <*GI(key)*>. This tag can be used anywhere where
the value of the GI is needed. In addition, GI variables are accessible by Microsoft Word generated documents
(see Create Document Generation Template [page 179]). This is done by using the tag «ST_GI(key)». Using
this tag in a word quote document will display the value of the specified GI variable.
The only way to get customer info for the configuration is using the <*AUX*> tag, customer info table and
<*GI(customerID)*> as a condition. When a user does not select a customer, but when the customer gets
populated from CRM, it is possible to get customer ID using GI tag <*GI(CUSTOMERID)*>.
Related Information
12.9.3 GI Tags
Tag Description
<*GI(keyV)*> Gets Global Info from global cashe under key, evaluates to
null if there is no info under key.
<*getAttNumVal(attribute name)*> Read attributes numeric value directly from the database
(from the cart items table).
Related Information
Tags and expressions are a powerful part of SAP CPQ. To help reduce errors and simplify the process, the
Formula Builder is available to create expressions.
To access the Formula Builder, click the button next to the field where the expression is applied.
This button is available anytime an expression can be used. Clicking a Formula Builder button brings up the
Formula Builder window. Formula Builder changes according to the settings the expression is created for.
For example, if an expression is being added for a rule or trigger [page 69], then an additional Triggers/Rules
box will be displayed with the Formula Builder. In addition, if you are building an expression that is related to a
quote, such as quote visibility rules, then the window will look like the figure on the left. The basic principles for
using the Formula Builder are the same despite what setting the expression is being created for.
The Formula Builder window is divided into two sections. The main box at the bottom is where the expression
is formed. Expressions can be typed in manually, if necessary, and in certain instances, phrases can be entered
into the box to be displayed to the user. The Check Syntax button checks the expression to ensure that the tags
have been joined correctly and that all punctuation is correct. Any errors are displayed at the bottom of the
window. It's a good idea to check an expression before inserting it to ensure it functions correctly and that it
doesn’t produce an error for the user. When finished, the Update button inserts the created expression into the
field.
An Select Operator box is available in every Formula Builder window to create conditional statements
and Boolean logic. Click the operator in the box and then click Insert Operator into the expression. In
most cases, the operator is added in its full syntax, with all parenthesis, and you only need to fill in
the parameters. This formula is an example of an expression using an operator: [AND](<*ANYSEL(Hard
Drive:HD200)*>,<*ANYSEL(Memory:2GB)*>). It states that the Hard Drive attribute with the value
HD200 AND the Memory attribute with the value 2GB need to be selected in order for this expression to be true.
To create an expression in the Formula Builder, select an action/condition/variable, then (if needed) select
attributes. Attribute values can also be selected for the expression if necessary. Click the Insert button to
The attributes displayed in the box are only the ones selected for that product or category, depending on what
you are creating the expression for (applies to all Formula Builder windows. If a certain object, attribute or an
attribute value isn’t available, make sure it’s checked, selected, or even created for the settings the expression
is being created for.
The actions are also different for each Formula Builder window. For information on what an action does, check
Attribute Data TagsAttribute Data Tags [page 741]. This topic also contains information on the proper way to
join tags and create expressions. While the Formula Builder aids in the process of creating expressions, tags
need to be joined and built correctly in order for the expression to function accurately.
Note that building some variables is complicated if you use syntax checker alone. Such is the case with <*
CTX(…) *> and <* TABLE(…) *> objects. When you need to insert these variables, select them from the list.
A new button appears (for example Construct TABLE tag), and clicking it brings up a new popup window where
you can build your complex tag.
Once you have finished building your complex tag, you can insert it into syntax builder window and continue
building the rest of your formula. For more information on complex tags and their builders, refer to Table and
List Tags [page 766] and CTX Syntax BuilderCTX Syntax Builder [page 765].
Each Formula Builder also has a Visualize button that can ease formula creation.
Since SAP CPQ formulas are essentially expressions and not the algorithm (the program), a tree control can be
used to display them. Tag names are colored blue and operators are colored green.
Tags are displayed as nodes that can have children nodes if the tag has arguments. If another tag is in the
argument of a tag, same definition is recurrently applied.
As exception, tags that take comma/colon and comma/colon/bar arguments are shown differently.
[OR](a,b,c)
Special operator IF is shown as a main node with tree child nodes representing condition, true and false
branches.
CTX syntax builder is a page on which you can generate your CTX expressions. It’s accessed from the Formula
Builder when CTX is selected from the list of available variables.
It only allows you to select tags and objects that make a valid formula. CTX objects are selected from dropdown
lists, until you select all required elements. As you select objects, the CTX formula is dynamically rebuilt to
display your CTX formula.
As you select CTX objects from the dropdown lists, there’s a possibility that you encounter objects, which
require an argument to be entered. You can easily spot these types of objects as another dropdown list (or free
input text field) displays to the right of the one you've selected.
Some objects don't have predefined argument values available. For these objects, a free input textbox is shown
instead of a dropdown list. You need to enter the argument in that textbox. You can switch the argument type
between textbox and dropdown list at any given time, by clicking the button next to the dropdown list/textbox.
If there are no predefined arguments, when you switch to a dropdown list from a textbox, it can contain no
When you've finished building your formula, click Insert to have it transferred to the syntax checker (that
invoked CTX syntax builder). Make sure that you've made selections in every offered dropdown list. If you
leave any dropdown in –select– state, your formula is incomplete. If you try to insert such a formula, an error
message displays, and CTX syntax builder window can't be closed, leaving you the opportunity to fix your
selection. This way, there’s small possibility that you manage to build a CTX formula that isn’t valid.
The <* TABLE (…) *> and <* LIST (…) *> tags are used to fetch data from data tables uploaded by
customers. Users can use SQL aggregate functions: MIN, MAX, AVG, SUM, COUNT, as well as match upper and
match lower. You can also retrieve records greater than some entered value.
Note
The only difference between the table tag and the list tag is that the table tag retrieves data from a table cell
while the list tag retrieves data from an entire column. For example, if you are retrieving names of customer
whose country/region of origin is Spain, the list tag will retrieve all matching names, and the table tag will
retrieve just the first name whose country/region of origin is Spain.
Additionally, both tags retrieve all types of data (dates, numbers, strings, and so on).
The descriptions and explanations on this and the following pages apply to both the list tag and the table tag.
The TABLE and the LIST tags support the following functions:
• EXACT
A default function. It returns anything that is selected, without any data filtering. It's similar to the AUX tag
behavior - the difference is that AUX must use the = operator for conditions. The typical TABLE tag based
on the EXACT function looks like this:
<* TABLE (SELECT price FROM priceBook WHERE productId = 5 ) *>
The EXACT function reveals a classic SQL Select statement. If the statement returns more than one record
from the database, only the first one returned is the result of the <* TABLE(…) *> tag. If you need the last
one, you can change sorting direction. Since there’s no guarantee on order SQL server return records, if
you don't use sorting, it's best to prepare data and use queries in such way that they return unique records.
• MIN
A function that returns minimal value from all the results that are meeting the given criteria. The typical
TABLE tag based on MIN function looks like this:
<* TABLE (SELECT MIN (price) FROM priceBook WHERE productId = 5 ) *>
The MIN function returns one record, the minimal one among all the records that satisfy given conditions.
• MAX
A function that returns maximal value from all the results that are meeting the given criteria. The typical
TABLE tag based on MAX function looks like this:
<* TABLE (SELECT MAX (price) FROM priceBook WHERE productId = 5 ) *>
The returned results can be sorted Ascending, Descending, or not sorted at all. Only the column that contains
results can be sorted. When match upper or match lower condition operator is used, sorting is first
performed by the column that is used in condition, and then by resulting column.
Table and list tag builders are invoked from the Formula Builder.
On the list of tags, there’s a TABLE tag listed. When it’s selected, a Construct TABLE tag button appears. This
button is visible only when the TABLE tag is selected in the list of tags.
Note
Everything described here is applicable for the LIST tag as well, but we’ll use the TABLE tag as an example.
Clicking Construct TABLE tag opens the Table Tag Builder window.
In Table Tag Builder, you first need to select a table from which you’re fetching the data. It's the dropdown
labeled From Table. Next to the dropdown is the Preview Table Data button, which enables you to preview the
first 25 rows of your uploaded table. It's meant to allow administrators to construct TABLE tags by showing
them data sample of the selected table.
After selecting the table, you need to select a function that returns data. The dropdown list you need is labeled
Return. The default is EXACT function. Afterwards, you need to choose a column from which you wish to fetch
the data from the From Column dropdown list.
The data can be sorted by that column, but it's optional. If you like, you can choose the sorting type to be
ascending, descending, or to leave it as None, which is a default option. If you want sorting to be precise, you
need to define the data type in that column (numbers, text, or dates). The data type needs to be set correctly,
or else you can get incorrect sorting. For example, f you sort numbers as if they were text, the output is: 1,
10, 2, 3, 4, 5,…
When you define the column you wish to use, you need to set the conditions on that column, in order to fetch
only the rows that you need. You can add as many conditions as you wish. New conditions are added by clicking
on Add New Condition link under the previous condition. Another set of fields that you need to populate is
added and, in this way, another condition is defined. A typical condition is built by selecting a column name
from the source table, choosing an operator used for data comparison, and, finally, defining a reference value.
For example, if you wish to get all records where part number is abcd, the reference value can be a constant –
abcd, or it can be a dynamic formula, like <* CATCODE(attribute) *>.
You have a Syntax Builder button there, so you can easily construct formulas for your conditions. Every
condition has a Column Type. It’s necessary because the SQL that fetches your data is different depending on
whether the comparison is done with numeric values, text values, or date values. If an error message displays
when you test the formula, recheck your column types. There’s a possibility that you’re fetching a column
whose values can’t be converted to the data type you wish. For example, you can't convert abc to the numeric
type, but you can enter numbers that correspond to that string.
After defining the data and the conditions, you can click Build Formula link, and you can preview the resulting
TABLE tag constructed. The area that displays your generated TABLE tag is editable, so you can alter the SQL
yourself. However, if you alter SQL manually, and then click Build Formula again, your complete formula is lost
and replaced by newly generated TABLE tag formula, based on what you selected from dropdown lists. Thus,
make sure that you alter SQL manually only once you've defined it enough with the Table Tag Builder. You can
use the Test Formula link when you finish editing the TABLE tag. When you click on it, your SQL is executed and
you’re presented with the data it returned. If you had an error in your SQL, it doesn't return any data. Instead,
an error message displays, giving you a clue what you did wrong.
While testingTABLE tags, if you used any formulas in your conditions, you must replace them temporarily with
values you expect formulas to evaluate to. For example, if you had a condition that contains “product_color
= ';#;<* CATCODE(selected_color_attribute) *>;#;'”, you must alter your condition to state:
-“product_color = 'blue'“. This alteration is necessary, since the CATCODE formula (and all other
formulas) is context-dependent, and can't be parsed in the Table Tag Builder. In the sample above, it simply
doesn’t know about the “selected_color_attribute” attribute, so it can't return its catalog code. Once
you're satisfied with the results, you can click on Use This Formula button, and your TABLE tag is checked for
errors. If it's OK, it's transferred to the Syntax Checker that invoked the Table Tag Builder.
Related Information
The <* TABLE(…) *> tag and the LIST tag support adding multiple conditions to your data query. The typical
condition is defined by the name of the column being tested, and by the matching criteria.
Note
Everything described here is applicable for the LIST tag as well, but we’ll use the TABLE tag as an example.
The typical example is: “give me price of the product that has a catalog code ABC”. Price is defined in one
column, and every price has its catalog code in the catalog_code column. So, our criteria instructs that
catalog_code is ABC. Use the following query in SQL:
Now, we can use multiple conditions. For example, if quantity affects the price, we need to treat the quantity
column in the same table. The SQL now looks like this:
In this way, we can add as many conditions as we like. They’re all concatenated with AND operator, meaning
that all the conditions must be met in order to fetch the data.
Related Information
Operators are words or characters typically used in SQL statements as conjunctions for several conditions.
Note
Everything described here is applicable for the LIST tag as well, but we’ll use the TABLE tag as an example.
⇐ Number; Date
• begins with
This operator is typically used to search string columns. It’s used to search if there’s data in a column that
begins with string provided as a parameter. This only works on text column types. It’s translated to the SQL
LIKE clause, with % at the end - searching for strings that begin with preset parameter and can end with
anything.
Example
• ends with
This operator is typically used to search string columns. It’s used to search if there’s data in a column that
ends with string provided as a parameter. This only works on text column types. It’s translated to the SQL
LIKE clause, with % at the beginning – searching for strings that end with preset parameter and can begin
with anything.
Example
• matches
This operator is typically used to search string columns. It’s used to search if there’s data in a column that
contains string provided as a parameter. This only work on text column types. It’s translated to the SQL
LIKE clause, with % at the beginning and with % on the end – searching for strings that begin with anything
and end with anything, but must contain provided string.
Example
• match lower
Example
There's a table that contains prices for products. It typically has 3 columns: product_catalog_code,
order_quantity, and price. For a given product, price varies depending on quantity. However, in
the prices table, there are prices defined for quantities 1, 5, 10, 50. So, since there isn't “7” as a
value for quantity in prices table, you need to set up a condition that uses the nearest lower value for
the quantity column. In this case, select column order_quantity and the match lower operator.
Enter a formula that reads quantity attribute. (that is the source of “7” in the previous example). If
you click the Rebuild button, you get SQL that looks like: SELECT TOP 1 price FROM table WHERE
quantity<7 ORDER BY quantity DESC. This way you have set up the condition to form a price
based on quantity. You still need additional condition that identifies the product by part number (that
condition uses the typical = operator). When this condition is added, you have a complete query:
The query finally fetches the price for a given catalog code and quantity “5”. (first one less than the
input value - 7).
• match upper
This only works on numeric and date column types. This operator is similar to match lower. The only
difference is that it gets the first record that has greater value than the given reference. If you use the
example for match lower as reference, match upper selects the row with quantity value of 10 (the first
one greater than 7).
Example
SELECT TOP 1 price FROM table WHERE quantity>7 ORDER BY quantity ASC
• Inclusive and noninclusive options define if you use < operator or < = operator. The choice between these
options depends on whether you wish the formula to include a boundary from a condition, or not.
Related Information
SETLISTSEPARATOR tag is used for setting the desired separator between the values retrieved via the list tag.
<*SETLISTSEPARATORTAG(…)*> tag should always be used in pair: the first tag sets the desired separator,
and the second tag resets to the default separator “|”.
Example
The list tag <* LIST ( SELECT Name FROM Customer_Address WHERE Country = 'Spain' ORDER
BY Name ASC ) *> retrieves the list of names from the custom table Customer_Address when the country/
region equals Spain, and sorts the names in ascending order.
To change the default separator in the list in this example, add the SETLISTSEPARATOR tag:
<*SETLISTSEPARATOR(;)*> <* LIST ( SELECT Name FROM Customer_Address WHERE Country
= 'Spain' ORDER BY Name ASC ) *> <*SETLISTSEPARATOR(“|”)*>.
Related Information
In this section, you can learn more about the logging of actions performed by administrators and users. You
can also learn about change sets, which are used for tracking changes performed by administrators.
Any logged information can be found in the following tabs in Setup Audit Trail Audit Trail :
The audit trail permanently retains records. However, if you want logged information to be automatically and
permanently deleted, you can specify data deletion intervals in Setup Security Data Deletion Audit Trail
Deletion . See Audit Trail Deletion [page 803] for more information.
You can search the audit trail records by performing a global search, an advanced search or by using the
quick filter. Additionally, you can select which audit trail columns are visible by clicking , selecting or
unselecting individual columns and clicking Save.
Note
The timeout for searching audit trail data is 5 minutes. If you filter audit trail records, but there is an
extensive number of records logged, the search automatically ends after 5 minutes if it wasn't completed in
Global Search
To perform a global search across all tabs, follow the steps.
Advanced Search
The advanced search filters only the currently open audit trail tab. It is conducted directly in column headers
and allows you to search every column in the grid.
1. Click .
The grid with columns appears. Each column in the grid contains a dedicated search box.
2. Enter your search criteria in any of the search boxes.
A search box is available for every column in the grid (a Search by Period toggle and From and To fields are
available for the Date column). You can search multiple fields at the same time.
The search results are displayed in the corresponding columns.
The currently open audit trail grid is now filtered according to your search criteria.
Click X in the search box to remove the search criteria you entered.
Alternatively, you can use the quick filter to instantly search the currently open audit trail tab. The quick filter
works the same way as the advanced search, except that it only filters by the parameters listed in the search
bar. The parameters are specific for every audit trail tab.
• If value A is entered in the global search, and value B is entered in the advanced search, the records in the
currently open tab are filtered by the value B. However, all the other audit trail tabs are filtered by value A.
• If the quick filter is applied on any audit trail tab, it overrides all other search filters, both global and
advanced.
Related Information
The system tracks changes performed by administrators in various sections of the Setup and displays them in
the Admin Actions tab.
Additionally, actions performed by users with special administrator permissions in the User Menu are also
logged in the Admin Actions tab (this doesn’t include the User Page, which is available to all users and covered
by User Actions in terms of logging). See Logged Data [page 780] for more information about what is logged in
the audit trail.
• Change Set ID – the ID of the change set [page 781] that was active when the change was performed. All
changes are grouped under the currently active change set.
• Change ID – the ID of the specific change inside the change set.
• Entity – the type of SAP CPQ object that is being changed (for example, Application Parameter).
• Entity ID – the unique identifier of the specific SAP CPQ object that is being changed (for example, the
name of a specific application parameter).
• Action – any change carried out by the administrator or the user (such as Add, Change, or Delete). Post
actions attached to an action are also logged here.
• Field – the field whose value has been changed.
• Previous Value – the value that was in place before the change.
• New Value – the value that is in place after the change.
• User – the name and the username of the administrator or user who performed the change.
• Date – the date and the time when the change was performed.
• Performer IP Address - IP address of a user who is accessing the application
Related Information
Here, administrators can track changes performed by SAP CPQ users on the user side of the application, in
high detail and real time. Changes are logged in both quote engines.
See Logged Data [page 780] for more information about what is logged in the audit trail.
Related Information
This functionality allows administrators to track changes performed on products and guided selling.
Specifically, the changes logged here are product and guided selling definition changes performed in the Setup.
See Logged Data [page 780] for more information about what is logged in the audit trail.
• Change Set ID – the ID of the change set [page 781] that was active when the change was performed. All
changes are grouped under the currently active change set.
• Change ID – the ID of the specific change inside the change set.
• Product – a product that is being changed, usually goods or services (for example, a laptop or a software
license).
• Product System ID – the system ID of the product.
• Attribute – the specific attribute on the product that is being changed (for example, a CPU as an attribute
of a laptop product).
• Attribute System ID – the system ID of the attribute.
• Attribute Value – the value of the attribute (for example, any of the CPU models offered to users as values
for the attribute CPU).
• Rule/Message/Script –the rule or message triggered upon product configuration.
Related Information
This functionality allows administrators to track all changes performed on attributes. Specifically, the changes
logged here are attribute definition changes performed in the Setup.
See Logged Data [page 780] for more information about what is logged in the audit trail.
• Change Set ID – the ID of the change set [page 781] that was active when the change was performed. All
changes are grouped under the currently active change set.
• Change ID – the ID of the specific change inside the change set.
• Entity – the type of SAP CPQ object that is being changed (such as Attribute or Attribute Container
Content).
• Entity ID – the identity of the specific SAP CPQ object that is being changed (such as the specific system ID
of an attribute).
• Action – any change carried out by the administrator (such as Add, Change, or Delete).
• Field – the field whose value has been changed.
• Previous Value – the value that was in place before the change.
• New Value – the value that is in place after the change.
• User – the name and the username of the administrator who performed the change.
• Date – the date and the time when the change was performed.
• Performer IP Address - IP address of a user who is accessing the application
Related Information
This functionality allows administrators to track all changes performed on pricebooks in the Setup.
See Logged Data [page 780] for more information about what is logged in the audit trail.
• Change Set ID – the ID of the change set [page 781] that was active when the change was performed. All
changes are grouped under the currently active change set.
• Change ID – the ID of the specific change inside the change set.
• Pricebook – the name of the pricebook that was changed.
• Part Number – the part number of a pricebook entry.
• Action – any change carried out by the administrator (such as Add, Change, or Delete).
• Field – the field whose value has been changed.
• Previous Value – the value that was in place before the change.
• New Value – the value that is in place after the change.
• User – the name and the username of the administrator who performed the change.
• Date – the date and the time when the change was performed.
• Performer IP Address - IP address of a user who is accessing the application
Note
Logging can be disabled for changes on pricebooks by setting the application parameter Audit Trail for
Pricebooks to Audit Disabled. This can improve system performance when working with pricebooks.
Related Information
This functionality allows administrators to track all changes performed on custom tables in the Setup.
See Logged Data [page 780] for more information about what is logged in the audit trail.
In custom table definition, you can define the level at which changes are logged in Audit Trail Level. You can
learn more in Custom Table Logging [page 105].
• Change Set ID – the ID of the change set [page 781] that was active when the change was performed. All
changes are grouped under the currently active change set.
• Change ID – the ID of the specific change inside the change set.
Related Information
This topic explains where different types of data are logged, and which sections are not covered by the audit
trail.
The Attributes, Pricebooks, and Custom Tables tabs log details about every action performed on products,
attributes, pricebooks and custom tables, respectively.
The Products tab logs all actions performed in regards to Products and Guided Selling.
The Admin Actions tab logs all actions performed in the Setup with the following exceptions:
• Actions performed on products, attributes, pricebooks, and custom tables are logged in their respective
logs.
• Actions performed in the following section of the Setup aren’t logged:
• General Report Module
The User Actions tab logs all actions performed by users on the user side of the application, with the following
exceptions:
Change Set is a feature that increases traceability of changes (in Setup or via scripting) and ensures that
appropriate recording of changes occurs in the relevant change management procedures.
A change set encompasses a group of changes that are performed in a single set. Each change in SAP CPQ is
logged in the Audit Trail [page 774] as a part of a change set.
Note
Change sets can only be created in development and testing SAP CPQ environments. If you want a change
set to be displayed in Setup in sandbox and production environments, you need to deploy it from the lower
environment once the changes have been tested and applied there.
Change sets can be active and inactive. Of all the active change sets, only one can be in use at a time. You can
select the change set you wish to use in the Change Set dropdown in Setup. Once you select a change set, all
changes that you apply to SAP CPQ from that moment on are logged in Audit Trail under that change set. The
inactive change sets don’t appear in the dropdown, but you can find them in Setup Audit Trail Change
Set (where all change sets created by administrators are listed) and activate them again. Changes can’t be
logged under an inactive change set.
Note
Using change sets to improve tracking of changes is optional. If there are no change sets in your
environment other than DEFAULT (CPQ-1), the Change Set dropdown isn’t displayed in Setup.
The default change set is selected every time you log into SAP CPQ regardless of whether a different change
set was previously selected or not. If you make some changes under a custom change set, exit the Setup and
then enter it again without logging out, the custom change set you have previously used is the selected one.
If a change is performed via API, and you wish to assign it to a change set, enter the change set ID in the
header for each API call. You can only use IDs of active change sets. The key entered in the header should be
ChangeSetId, and its value should be the value of that change set ID (for example, CPQ-10). This is the list of
affected APIs:
• AUXTableAdministrator
• CompanyAdministration
Related Information
You can access the Change Set dropdown in the Setup. The names and IDs of active change sets in your
environment are displayed here.
Note
Currently, change sets can’t be deleted, but they can be deactivated with the Active toggle switch.
It is possible to deploy active change sets from development and testing to sandbox and production
environments.
In this initial phase of improved SAP CPQ transport mechanism, there are two ways to deploy change sets to
target environments. You can either do it manually or via a deployment package.
Manual Deployment
Once you click the Deploy button in Setup Audit Trail Change Set , a popup window displays. You are
prompted to select a target environment and a change set or change sets that should be deployed to it.
When a change set is deployed from one of development or testing environments, it will appear in the target
environment’s list of active change sets. No changes previously performed in the source environment will be
applied to that environment automatically or logged in the target environment’s Audit Trail.
Example
An administrator selects the CPQ Test change set in the source environment, performs some changes
manually and sends that change set's definition to the target environment by clicking the Deploy button in
the Change Set page. Then an administrator selects that change set on the target environment and applies the
same changes manually there.
Deployment Package
To deploy a change set via a deployment package, navigate to the Deployment Packages tab in Setup
General Deploy/Send Changes Deployment Setup in the source environment and click Create Package.
There, you can select the change set and deploy the package to the target environment.
If the change set with that ID already exists in the target environment, it is preselected in Setup and all changes
that were deployed in the package are applied in the target environment and logged as a part of that change
set. If the change set does not exist in the target environment, it is created, preselected and all changes
associated with it are applied in the target environment and logged in that environment's Audit Trail.
Note
If an administrator performs one change in the source environment as a part of the Change Set A and
another change as a part of the Change Set B, there are no restrictions which prevent both changes to
be sent as a part of the Change Set B if they are deployed in the same package when Change Set B was
selected in Setup.
Related Information
When delegating authority for a setup feature to SAP CPQ users, you allow them to manage features that are
available only to administrators. This way users become local administrators for specific setup functionalities.
In companies where a local administrator manages a part of setup, the process is optimized, and the
turnaround is faster. Also, limiting data access to local administrators enhances its security.
Example
In a XYZ company with offices around the globe, there are a number of administrators distributed per
countries/regions. An office in Sweden has monthly special offers for specific customer groups, so they require
different price books regularly. The administrator can’t handle all the requests for importing new price books in
time, so he delegates authority for managing price books to a user located in the Swedish office. The process
is now more optimized as the local administrator can upload new price books into the application almost in real
time.
In the Delegation of Authority section in Setup, users can be delegated authority to manage:
• Custom Tables
• Simple Products
• Users
• Bulk Quote Reassignment
• Documents
Users can access the pages for managing specific setup features in the menu available when clicking their
username in the top bar.
Migrate Pricebook Permissions from Delegation of Authority to Access Rights [page 789]
If needed, each user can also be able to share templates with the members of their own company. To delegate
authority for managing documents, go to Setup Delegation of Authority Ability to Manage Documents .
Note
The logic between permission groups is OR, so the system delegates authority for managing documents to
all users that belong to at least one of the selected permission groups.
If you wish to enable users pertaining to the selected permission groups to upload content files that are used
in templates uploaded by application administrators, select the Users from selected permission groups will be
able to upload content files used in templates uploaded by application administrator checkbox.
Users who are delegated authority for managing document templates have the Manage Document Templates
page available in the user pages. When creating a new template, define it in the Template Definition tab
according to the instructions for creating templates described in Document Generation Template. Users can
select Share with users from my company and brand to expand access to the template to other users in their
company.
In the Additional Fields tab, you define which content files are going to be added to the template.
Note
The system includes the additional files into the generated template only if these two tags are properly
added in the template: INCLUDE_DOCUMENTS and INCLUDE_DOCUMENTS_END.
• Include file(s) for each quote item - select it to add files for each quote item.
• Included File(s) - enter the name of the file (with file extension) that is going to be added to the generated
document, or define the formula that dynamically pulls the file name from elsewhere in the application.
The files need to be placed in Manage Content Documents.
• File Description - define a description that is shown to users, or a formula that generates a description
dynamically.
• File Selection - select Checkboxes to allow multiple selections of files that will be included in the generated
file. Alternatively, select Radio Buttons to restrict the selection to only one file.
• Separate files with page break - selected by default so that the system would make a page break after every
added file.
You can either select Everyone and enable all permission groups to reassign quotes in bulk, or select specific
groups by moving them to the right column. In the Bulk Quote Reassign Rights subsection, you can also restrict
Note
The logic between permission groups is OR, so the system delegates authority for reassigning quotes to all
users that belong to at least one permission group.
On the user side, users in the selected permission group can select a user whose quotes will be reassigned and
the user to whom the quotes will be reassigned.
On the Bulk Quote Reassign page available in user pages, SAP CPQ users select a user whose quotes they wish
to reassign, a user to whom the quotes will be reassigned and quotes that will be reassigned.
The Custom Tables subsection displays all custom tables in the system for which you can delegate authority.
You can find a specific table faster using the search box above each column.
Click the Edit button next to a table to edit the permission groups who can manage it. Use the left and right
arrows to move available permission groups to selected and vice versa.
Note
The logic between permission groups is OR, so the system delegates authority for a custom table to all
users that belong to at least one permission group.
On the user side, delegated users can manage custom tables on the Manage Tables page. Users are allowed to
edit tables for which they’re granted authority, to add, edit, and delete rows in tables. Additionally, tables can
be exported as Excel and ZIP files for a cleaner overview.
You can delegate authority for simple products in the Simple Products subsection.
The page shows all conditions created for delegating authority for simple products management.
To add a new condition, you need to click Add New. The page that opens up is divided into three sections
enabling you to select the following:
On the Manage Simple Products [page 787] page reached via User Menu, delegated users can add and import
simple products to the categories for which they’re granted rights. Also, users can edit products and export
them.
This functionality enables users who aren’t SAP CPQ administrators to manage other users and companies.
Delegation of authority for user management is managed through two tabs: Management of users and
Management of companies.
Management of Users
The tab contains all conditions under which the authority for user management is delegated to users.
Note
If User who creates company can manage its users is selected, users who have created companies can
automatically manage all new users that join those companies.
Click Add New to define a new condition. A new page displays, containing the following fields:
Field Description
Permission Group Type the name of the permission group to which you’re
delegating authority, or click the Search icon to find a
permission group.
Can Edit Users Select All Company Users and allow the selected permission
group to edit all users belonging to the same companies
as the selected group. Alternatively, if you select Only if
Managing Parent of Users, you’re allowing each user to
manage those users to whom they’re set up as managing
parents.
Can Manage Users of These User Types Move user types to the right column to enable the selected
permission groups to manage them.
Can Manage Users From These Companies Select Users' own company to enable each user to manage
other users pertaining to the same company. Alternatively,
select specific companies.
Can Allow Other Users Permissions to Administer Users Enable the permission group to delegate authority for
managing users.
Can Allow Other Users Permissions to Administer Enable the permission group to delegate authority for
Companies managing companies to other users.
Management of Companies
The tab displays all conditions under which the authority for managing companies is delegated to users.
Click Add New to define a new condition and fill out these fields:
Field Description
Permission Group Type the name of the permission group to which you’re
delegating authority, or click the search icon to find a
permission group.
Can Create New Companies Enable the permission group to create new companies.
Can Edit These Companies Select User's own company and allow each user in the
permission group to edit their own company. Alternatively,
select specific companies. In addition, you can choose
the Where user belongs to the Permission Group which is
an administrator option. It allows users from the selected
permission group to edit companies for which they’re
granted administrator rights through other permission
groups (an administrator permission group is assigned to
a company in Companies Permissions ).
On the user side of SAP CPQ, the Manage Users page displays all users that the logged user has the rights to
manage. Adding and editing of users is also enabled.
The Delegation of Authority for pricebooks is obsoleted and instead, administrators should use the Access
Rights feature [page 817] to manage who has access to pricebooks and bulk pricebook import/export.
Note
The section for delegating authority over pricebooks is no longer available in the Setup and the Pricebooks
page that gives users access to delegated pricebooks/markets is no longer available in the user menu on
the user side. Up until the 2302 release of SAP CPQ, it will be possible to contact the SAP CPQ Support
team if there are issues regarding the migration of pricebook permissions to Access Rights.
Clients with an extensive number of pricebooks and complex permissions in Delegation of Authority can
leverage the automated migration process and save the recourses and the time otherwise spent on manual
migration.
Migration is delivered per request, and it's not automatically triggered on any tenant. Clients who need to
migrate the permission groups should raise a ticket with the SAP CPQ Support Team who will forward the
request to the Development team.
Migration Process
The first step in the migration process is to identify the standard and custom permission groups and custom
conditions for each pricebook in Delegation of Authority Pricebooks . Secondly, a new permission group
is created in Users Permission Groups following this naming pattern: [MarketName] - [PricebookName]
- CPG (CPG stands for Custom Permission Group). The new custom permission group contains the standard
permission groups and the custom condition from the source permission group. By default, the logical
operator in the newly created permission group is OR [page 140].
Custom permission groups from the source remain unchanged in the environment except that they are not
included in the newly created custom group but treated as a separate custom group. If there is a formula
defined within the custom permission group, it remains unaltered, but the condition applied on multiple
permission groups in the source is not applied on the custom permission group during the migration.
During the migration process, the system assigns access rights to the right pricebook and to the Bulk
Pricebook Import/Export section for each newly created custom permission group, and the existing related
custom permission groups.
SAP CPQ adheres to the SAP software security policies and guidelines, which makes it a trusted tool in which
you can safely maintain products, pricing rules, customers, and quotes.
Each new feature is developed according to SAP security guidelines. Additionally, there’s a set of application
parameters and features that allow administrators to further enhance the security of the system per their
business requirements and models.
Security application parameters [page 637] are managed in General Application Parameters Security
tab. There, you can define trusted third-party sources of CSS and JavaScript files, images, and fonts [page
823]. Also, there are parameters for establishing the secure domains from which API calls are allowed and the
URLs that may embed SAP CPQ.
Security Features
Features available specifically to enhance the security of data and access to the system are described in the
sections listed below.
The feature enables you to set a data deletion policy and/or manage your account’s storage space by defining
a period of time after which the system automatically and permanently deletes data.
Since data can be permanently deleted, we recommend that only data protection officers, in cooperation with
administrators, use this feature to define a data retention policy.
Note
SAP CPQ doesn’t have a retention framework for keeping and managing the access to customer data after
the business purpose for keeping the customer data in the system has expired. SAP CPQ has a deletion
framework which should be used to delete customers from SAP CPQ once business purpose has expired.
The reason why no retention policy has been developed is that SAP CPQ is mainly used in integrations with
CRM software and back office systems (ERP) who act as the single source of customer data. The data is
only replicated into SAP CPQ and should be deleted after there is no longer any business purpose to keep it
in the system.
• Quotes
• Users
• Customers
• Business Partners
• User actions
• Administrator actions
This feature is accessed in Setup Security Data Deletion . The above-mentioned data is organized into
the following tabs: General Deletion [page 796] and Audit Trail Deletion [page 803]
Apart from deleting data on the previously mentioned tabs, you can also prevent data from being deleted [page
793].
The feature is available in both Responsive and Classic Design. However, when deleting or blocking data using
Classic Design, UI text such as messages and blocked status of users, quotes and customers isn’t visible.
Note
If your attempt to delete data with the Data Deletion feature is unsuccessful, contact the SAP CPQ Support
Team and request deletion of the necessary SAP CPQ entities.
Besides deleting data, the Data Deletion functionality also enables you to prevent data, which is important to
you, from being deleted.
Note
• The customer details can’t be edited. You can only view the details.
In case a customer was first attached to a quote and got blocked afterwards, if a user performs certain actions
on the quote that process the customer information (for example, generate documents or place order), a
message displays, notifying the user that the customer is blocked and that another customer should be added
to the quote.
The blocked user’s status is considered for SAP CPQ licenses. The user can be either active or inactive, and this
status is displayed in the Active column on the Users page. If the blocked user is active, the user counts as a
license user. On the other hand, if the blocked user is inactive, the user doesn’t count as a license user.
• The user’s status (active or inactive) remains the same as it was before the user was blocked.
• The user will get deleted if the deletion criteria is met based on the inactivity period or last login time.
It's possible to define time periods after which user, quote, customer, and business partner data is deleted.
To delete customers:
The system calculates the deletion period once the customer is no longer attached to any quote.
Each deleted customer is recorded in Setup Audit Trail Admin Actions . Additionally, customer ID of the
deleted customer is displayed in the Action column in the following format: GDPR - delete customer - customer
ID.
Namely, you can delete all quotes that meet the deletion criteria, regardless of their status and the quote
owner’s company. Additionally, you can delete only quotes in particular status which is useful when you want
to set different deletion periods for specific statuses. Finally, you can delete quotes according to the status and
company by combining the quote status and the quote owner’s company with the deletion period.
To delete quotes without taking into account their status or the quote owner’s company:
The system calculates the deletion period from the date the quote was last modified. For example, if you set
the default deletion period to one year, all quotes with a modified date older than one year will be deleted
immediately.
Note
This is a single-choice selection field. To define multiple statuses, click Add Status below the Deletion
Period time selector for each status you want to define.
5. Click Save.
A confirmation message displays.
The system calculates the deletion period from the last modified date.
6. In the Delete column, click to delete an entire row and cancel quote deletion.
7. In the Period column in the grid, set the number of months or years after which the quotes will get deleted.
8. In the Status column, define the status of the quotes you want to delete.
9. In the Company column, define the quote owner’s company.
Note
The fields in the Status and Company column are autocomplete fields which automatically suggest
values as you type. Each field allows you to select only one value. To define multiple statuses or
companies, you should add new rows for each quote.
Additionally, all deletion criteria can be filtered by status and company in the quick filter above the grid.
Values in the grid can be sorted in ascending or descending order by quote status and company.
The system calculates the deletion period from the date the quote was last modified.
You can set all three deletion options to work in parallel. In that case, quote deletion rules are executed in the
following order of priority with those of higher importance overruling the succeeding ones:
Therefore, the rules which are set for the default deletion period and the deletion based on the quote status will
be overruled by the ones defined by Delete Quotes by Status and Company option.
Example
You want to keep quotes in Won status for a longer time than quotes in all other statuses. Moreover, you want to
remove quotes in Lost status from the system and you want to delete all quotes in the status Rejected.
As a result, quotes in Won status will be kept in the system for 3 years, that is, they will be deleted 3 years after
their last modified date. Quotes in Lost status will be deleted 5 months after their last modified date. Quotes
in the status Rejected will be deleted 2 years after the last modification. On the other hand, quotes in all other
statuses will be deleted 1 year after their last modified date.
Each deleted quote is recorded in Setup Audit Trail Admin Actions . Additionally, quote number of the
deleted quote is displayed in the Action column in the following format: GDPR - delete quote - user ID - cart ID.
Related Information
When deleting users, you can either delete inactive users or users who don’t log into the system during the
specified deletion period.
The system calculates the deletion period from the date the administrator marked the user as inactive, starting
from the 2018.4 release date. If the user was inactive before the 2018.4 release, that period isn’t taken into
account when calculating the deletion period.
Example
Example: You want to delete inactive users from the system, so you enable the Delete Inactive Users toggle
switch and set the deletion period to 3 months. In this case, the system will take into account only those users
who became inactive after the 2018.4 release date (November 17, 2018). This means that if a user becomes
inactive on November 20, 2018, the system will delete the user on February 20, 2019. On the other hand, if
the user became inactive on October 10, 2018, the system won’t take the deletion period set for this user into
consideration. As a result, the user won’t get deleted.
To delete users who don’t log into the system during the specified period:
The system calculates the deletion period from the last login date, starting from the 2018.4 release date. If the
user didn’t log into the system before the 2018.4 release, that period isn’t taken into account when calculating
the deletion period.
Example
You want to delete non-logged in users from the system, so you enable the Delete Non-logged in Users toggle
switch and set the deletion period to 3 months. In this case, the system will take into account only those users
who logged in after the 2018.4 release date (November 17, 2018). This means that if a user’s last login was on
November 20, 2018, the system will delete the user on February 20, 2019. On the other hand, if the user’s last
login was on October 10, 2018, the system won’t take the deletion period set for this user into consideration. As
a result, the user won’t get deleted.
Since users are linked to other SAP CPQ entities, deleting a user isn’t possible in the following cases:
Users that can’t be deleted due to the above-mentioned reasons will be marked for deletion, and the system
will keep trying to delete users on a daily basis. Users will get deleted once the condition that prevented them
from being deleted the first time is no longer valid.
On the other hand, during the scheduled daily job when the system is trying to delete a user who couldn’t be
deleted due to the above-mentioned reasons, if the user no longer meets the deletion criteria (the user logged
in or became active), the system will stop trying to delete the user.
Each deleted user is recorded in Setup Audit Trail Admin Actions . Additionally, the user ID of the
deleted user is displayed in the Action column in the following format: GDPR - delete user - user ID.
You can set up a period after which the business partners will be deleted.
SAP CPQ runs a job every day to check which business partners are ready for deletion. The job then marks
those business partners and deletes them from the system. To determine which business partners are ready
for deletion, SAP CPQ first checks whether the business partner is used on a quote or not. If it's on a quote, the
business partner won't be marked for deletion nor deleted. Only the business partners not used on quotes are
treated for deletion. SAP CPQ calculates the deletion period starting from the day the business partner is no
longer attached to any quote.
Each deleted business partner is recorded in Setup Audit Trail Admin Actions .
It's possible to define time periods after which audit trail data is deleted.
On the Audit Trail Deletion tab, you define a time period for:
• Automatic deletion of administrator actions, user actions, and changes on products, attributes, pricebooks
and custom tables from their respective audit trail logs.
• Automatic deletion of personal data log records.
Set Up Automatic Deletion of Data from the Audit Trail [page 803]
You can set up automatic deletion of data from a specific Audit Trail log of your choice.
You can set up automatic deletion of data from a specific Audit Trail log of your choice.
Procedure
All log entries older than the specified period are deleted daily.
Context
All Personal Data Log entries are by default automatically deleted after six months, or less, if they’re no longer
required by the company that holds that information. The default retention period of personally identifiable
information can be changed if needed.
Procedure
2. In Audit Trail Deletion Personal Data Log , enable the Delete Data Protection Log toggle switch.
New fields display for defining the period after which the data will be deleted.
3. Select Month or Years and enter the number in the first field.
4. Click Save.
Personally identifiable information (PII) is any information that could potentially be used to identify an
individual.
• Full name
• Home address
• Email address
• Social security number
• Passport number
• Driver's license number
• Credit card number
• Date of birth
• Telephone number
• Login details
The following objects aren’t flagged as PII by default, but you have the option to flag them as such if necessary:
You can flag data as PII by selecting the Contains Personally Identifiable Information checkbox for the above-
mentioned objects.
If the following objects are flagged as PII, they retain that flag after being sent and deployed via the Deploy /
Send Changes [page 669] feature:
• Attributes (deployed as elements of other deployment package components: products, guided selling,
custom fields, or CRM integrations)
• Quote tables
• Custom tables
• Customer standard and custom fields
• Quote custom fields
• Quote item custom fields
Note
Read access logging of sensitive personally identifiable information is not supported in SAP CPQ. Although
SAP CPQ has functionalities that contain PII data, the system is not purposely designed for storing PII data.
Some types of personally identifiable information needs to be more rigorously protected than others (for
example, social security number and driver’s license number), since the unauthorized acquisition of this
information could be harmful to the concerned individual. Administrators can prevent logging of old and new
values of such objects in the Audit Trail by enabling the Suppress Information Logging toggle switch next to an
object in question. All other Audit Trail columns will be populated
Administrators can Suppress Information Logging only for objects that are already marked as Personally
Identifiable Information.
If logging of the following objects is suppressed, they will retain that flag after being sent and deployed via
Deploy / Send Changes:
• Attributes (deployed as elements of other deployment package components: products, guided selling,
custom fields or CRM integrations)
• Quote Tables
• Custom tables
• Quote custom fields
• Quote item custom fields
Changes made to all data categorized as PII (personally identifiable information) in SAP CPQ are logged in a
dedicated Personal Data Log. This enables data protection officers to filter and monitor these changes more
easily.
To access the Personal Data Log, go to Setup Security Personal Data Log .
Note
PII data can also be imported via API and the Import/Export feature. In that case, the user who performs
the import is logged as the performer and there is no indication in the log that the import was done via API
or Import/Export.
Personally identifiable information about SAP CPQ users and customers can be exported. If users/customers/
business partners prove that their identity is genuine, they can request extraction of personally identifiable
information.
Prerequisites
Context
In SAP CPQ, User and Customer objects are by default flagged as PII. However, PII can also be located in
other objects, in which case they need to be flagged manually. To do this, select the Personally Identifiable
Information checkbox on each object individually. Unflagged data can’t be exported.
Note
Any data that was in the system before this functionality was created can’t be exported until it’s manually
flagged as PII.
Procedure
If there are multiple users with identical names, the data in the cards will help you distinguish between
them.
5. Click Filter Data.
To filter all objects, click Search Data right away, without manually filtering the objects.
Pills with object labels are displayed and all requested objects with user/customer PII are listed. If there’s
no PII in the requested objects, only their names and empty columns are displayed.
9. Select checkboxes for all data you wish to export.
10. Click either Export as .xlsx or Export as PDF.
Next Steps
Extracting customer PII is done in a similar way. The only difference is that customers don’t have usernames,
so when you select the Search Customers button, you need to enter a customer’s full name or an email address
in the search field.
Each performed search for users’ or customers’ PII is tracked in Audit Trail Admin Actions .
After you click Search Data, pills with object labels you selected in the Search Filter are displayed, followed by
the requested objects with user/customer/business partner PII. Pills are used for data filtering.
By clicking X next to a pill with an object label, the corresponding object is hidden. The objects themselves
consist of PII sorted in columns listed in the following text. You can choose which columns you wish to export
by selecting/unselecting the adjacent checkboxes.
Note
If Business Partners are used in your environment, you can search business partners and involved parties
that contain a business partner, or at least one of the necessary search parameters (name, email, phone,
mobile phone, street name...).
• Quotes
• Quote Number
• Quote Owner
• Customer
• Status
• Date Created
• Date Modified
• Quote Custom Fields
• Custom Field Content
• Custom Field Name
• Quote Number
• Quote Owner
• Tab Name
• Quote Item Custom Fields
• Custom Field Content
• Custom Field Name
• Custom Field Label
• Quote Number
• Product Name
• Date Modified
• Quote Tables
• Column Value
• Table Label
• Table Name
• Column Name
• Quote Number
• Tab Name
• Date Modified
• User Custom Fields
• Custom Field Content
• Custom Field Name
• Custom Field Label
• On User
Note
As of the 1905 release, the Modified By column for Custom Tables displays the name of the user who last
modified the custom table row in which user/customer data is found. However, in the previous releases
the Modified By column displayed the name of the user who last modified the entire custom table for the
custom tables created before 1905, as the system did not record changes on row-level.
This topic lists items logged in the Audit Trail regarding viewing and exporting personally identifiable
information.
These features can be used for establishing efficient and secure API communication between two different
servers.
You can upload WSDL [page 817] files for interpreting secured SOAP messages sent from third-party web
services to SAP CPQ. These SOAP messages are secured with X.509 certificates which are created with the
Certificate Management [page 812] feature. The same web service URL should be defined during the creation
of a certificate for secure communication with the server on which the service is installed, and WSDL which
describes the service.
You can also create User Certificates [page 815] which can be used for authentication of integration users via
API.
On the Certificate Management page, you can create and manage certificates for securing SOAP and REST
communication or map certificates to users, so that they can later be used for authentication of individual
users with API.
Certificates provide a more secure means of communication between two systems, than password protection
does, due to their complex encryption and the fact that only the intended recipient can decrypt the messages.
In the future releases, this feature will be used for managing all digital security certificates in SAP CPQ, except
the ones used for email protection, which is done in the DKIM Keys page.
System Certificates can be used either for encrypting and securing SOAP API requests, or for authenticating
client systems in SAP CPQ.
To create a new certificate, go to Setup Security Certificate Management and click New Certificate.
When SOAP messages are encrypted with certificates, only those who have the appropriate public key can
verify the received SOAP message requests and access the information contained within the messages. In
short, if the received SOAP message is verified, messages can be exchanged between two endpoints securely.
Note
SOAP communication can be secured in two directions – from SAP CPQ towards the client system, and
from the client system towards SAP CPQ.
• Let SAP CPQ generate a certificate – Enter the certificate name, select the encryption type and key size.
This is the best option if you do not already have a certificate that can be used.
• Upload a certificate from a file – upload a PFX file containing a certificate by clicking Upload a PFX file. Enter
the password for the file in the Password (required) field.
The certificate that is added to SAP CPQ must be installed on the client machine (the service that is called,
or the service that calls SAP CPQ) , and the response must be signed with that same certificate, as well.
Usually there is already an installed certificate on the server side, which you can upload to the Certificate
Management page in SAP CPQ.
Regardless of the selected certificate creation method, the Purpose (required) dropdown and the Service URL
(required) field are required and common in all three cases (except when the selected certificate purpose is
Client Certificate Authentication).
• Outbound SOAP Header Signing - secure SOAP communication from SAP CPQ towards a client system.
• Inbound SOAP Header Signing - secure SOAP communication from a client system towards SAP CPQ.
Note
In addition to making the certificate with inbound SOAP header signing purpose active in SAP CPQ, you
need to make sure the signature is provided in the certificate body [page 813]. If this condition isn't
met, the Rejected by policy. error messsage will be displayed.
• Client Certificate Authentication - used if SAP CPQ needs to be authenticated in external systems with a
certificate instead of a username and password. For now, it can only be used in relation to the mTLS client
and Subscription to Events.
In the Service URL (required) field you need to provide the URL which contains the specific endpoint of the
webservices’ API SAP CPQ is connecting to.
If you wish to create a secure signed request to an outbound SOAP service via scripting, and if the WSDL for
that outbound service is not public, you need to define the WSDL for that service in the WSDL Management
page first, and then add the service URL to that definition. After that, in the Certificate Management page, you
define Outbound SOAP Header Signing certificate with the same service URL. That way, when the outbound
service is called from scripting, SAP CPQ loads the WSDL file and makes a proxy class that communicates with
the service.
Once you have created a certificate and made it Active via the toggle switch, it will be used to secure API
communication exchanged between SAP CPQ and the client service. Only one Outbound SOAP Header Signing
certificate can be made active per a service URL.
Note
When an administrator uploads/generates a certificate in SAP CPQ and makes it active, the certificate will
be used on SAP CPQ side to verify all inbound SOAP messages from that client. Likewise, if the client is
verifying a SAP CPQ response of an inbound SOAP message, they need to use the matching certificate.
<DigestValue>2xn5LiijL0Edak8pO778BbbvvT6xtH0vX69OZHXNPb0=</DigestValue>
</Reference>
Context
Each user can be associated with a single public certificate, which is used for their authentication with API.
That way, you can avoid storing personal information (IDs, passwords, secrets) of integration users.
Note
Each certificate needs to be unique. If a user is authenticated with certificates in multiple tenants, they
need to have a different certificate for each of those tenants.
Procedure
The popup window in which you can add a new user certificate displays.
4. Start typing a user’s name in the User (required) field and select the user to whom you’re attaching the
certificate.
5. Click Upload new file to add a certificate.
6. Save the certificate.
The certificate can now be used for authentication of the mapped user.
Next Steps
Once a user certificate is created, you can use it to authenticate individual users in specified domains via SOAP
and REST APIs.
To authenticate with SOAP, the client application needs to provide an mTLS client certificate in the request,
along with the request body and the domain name in the HTTP header. The forwarded certificate needs to be
Active in order to work.
• /wsapi/cpqapi.asmx
• /wsapi/wsresp.asmx
• /wsapi/wssrv.asmx
This feature gives administrators the ability to upload and store WSDL files in SAP CPQ.
WSDL files are used for describing a SOAP-based web service and creating a link between two distinct servers.
In order to be used properly, WSDL files added to SAP CPQ need to be connected to a URL of the endpoint on
which the web service is installed.
To initialize the web service, you need to use the following method from scripting:
ws = WebServiceHelper.LoadImportedWsdlService(“Wsdl”,”UrlToService”)
ws.pathToWSDLServiceMethod()
Once you do this, the SAP CPQ scripting environment will create a proxy class which can perform
communication targeting the service URL.
Context
If you’re adding WSDLs of web services with which you’ve previously established secure SOAP communication
in Certificate Management, the service URL you provide when adding a WSDL file needs to be the same as the
service URL you provide during the creation of a certificate.
Procedure
Results
Once a WSDL file is added to SAP CPQ, it will provide the means of communication between SAP CPQ and the
server with which SOAP communication is performed.
By managing access rights, you can control which individual administrators or permission groups can access
specific Setup sections and entities, or grant them read-only access to those sections and entities.
Typically, different administrators manage different tasks in SAP CPQ, which means that not every
administrator requires complete access to every Setup section. You can manage the access rights of
administrators [page 819] to provide them with access to only those sections and entities that are relevant
to their work. In addition, you can provide administrators with either complete access or read-only access to
Caution
To gain access to this feature, you need to explicitly request it from the SAP CPQ Support Team. Once the
feature is enabled, only the administrator who requested it will have the option to assign access rights for
Setup sections and entities to other administrators.
The administrator who can assign access rights can also provide other administrators with the option to
manage access rights [page 820].
Access rights can be assigned to individual administrators or to permission groups to which administrators
belong. If the administrator belongs to multiple permission groups, once access rights are enabled, they
automatically have access to all sections and entities that their permission groups [page 138] can access.
For example, Adam the administrator belongs to the permission groups Sales and Sales Manager. If the right to
access the Fields, Calculations, Layout section of the Setup is assigned to either of Adam's permission groups,
Adam is automatically able to access the Fields, Calculations, Layout section. However, if the permission group
Sales Manager has full access to Fields, Calculations, Layout, but the permission group Sales has read-only
access to that section, Adam will have read-only access to that section.
Note
By default, if the administrator belongs to groups with a conflicting level of access rights (one of them has
read-only rights, but the other one has full editing rights), read-only access rights override editing access
rights. However, you can change this behavior by enabling the toggle switch Editing rights will prevail when
two or more permission groups administrators belong to have both read-only and edit access rights to a
particular Setup option. If that option is enabled, in the previously described scenario, Adam will have full
editing access rights for the Fields, Calculations, Layout section, instead of read-only access.
Before the Enable Access Rights toggle switch is enabled, all administrators are able to access every section
of the Setup. After the option is enabled, administrators don't have access to any Setup sections unless the
required access rights are assigned to them. Make sure that you activate the toggle switch only after you are
done with assigning access rights to administrators and permission groups. If the Enable Access Rights toggle
switch is disabled after having been enabled for some time, all administrators will regain full access rights to all
sections and entities.
Assign Access Rights for Setup Sections and Entities [page 819]
You can assign access rights to other administrators and permission groups on a Setup section and
section entity level.
You can assign access rights to other administrators and permission groups on a Setup section and section
entity level.
Prerequisites
You must be one of the access rights administrators [page 820] for your system.
Procedure
The Setup Sections menu expands, displaying the access rights as they pertain to the selected
administrator or permission group.
3. In Setup Sections, select the sections and subsections for which you wish to manage access rights.
Once you select a section, all of the subsections under it are automatically selected.
If you select the Show only selected checkbox, only the sections you selected are displayed.
Note
If you select some of the following sections, the Setup Section Entities menu expands:
• Product Catalog Custom Tables
• Pricing/Calculations Pricebooks
This allows you to manage access rights for specific section entities, and not only the entire sections.
Note
4. (Optional) Enable the Read-only toggle switch next to the following sections to ensure that the
administrators are only provided with read-only access to these sections:
As an access rights administrator, you can provide other administrators with access to the Access Rights
functionality. The administrators you select will be able to assign access rights to other administrators and
permission groups.
Procedure
Access rights assigned to you have impact on your ability to deploy and send custom tables.
• Create deployment packages containing custom tables if the visibility of those tables is enabled for you
with the Access Rights feature.
• Send packages containing those custom tables to target environments.
• Deploy packages containing custom tables only if you have editing rights for them.
• Create or update the existing custom tables from the package if you have editing access rights for custom
tables. To do this, the visibility of custom tables needs to be granted to you with the Access Rights feature.
If the package contains custom tables you can’t see, it can’t be deployed.
In the View Permissions tab in Access Rights, you can check the access rights for a specific administrator.
This option may help you troubleshoot when users complain that they don't have access to a specific setup
section or wonder why their access is limited.
After you search for an administrator, you'll get one of the following results, based on the assigned access
rights:
• no data is displayed because the administrator has no access rights assigned, they don't have access to
any setup sections.
• a list is displayed with the setup sections to which the administrator has access and permissions based
on which the access is granted. For access given specifically and directly to that administrator in Access
Rights Settings, the Permissions column displays user: {{username}}. If access to a section is granted
through a permission group, the Permissions column shows the names of those permission groups.
Clicking on the permission group name opens an overview of the permission group structure. You can
see which permission groups pertain to this permission group and what is the logic between them. Marked
in orange is the part of the permission group that gives access to this specific administrator.
The DomainKey Identified Mail (DKIM) authentication standard adds an encrypted digital signature to
outbound email messages sent on company’s behalf.
As a result, email recipients who have implemented DKIM on their side can be certain that messages really
come from SAP CPQ and have not been modified along the way.
SAP CPQ uses its own email servers that are configured per environment, while DKIM keys are configured per a
tenant (each tenant in the environment needs to be configured separately).
Note
You can't export DKIM keys once they are imported to SAP CPQ.
To set up the functionality and generate a key, take the following steps:
Note
The private key is not visible, whereas the public key of the defined DKIM key can be copied from the Public
Key column or downloaded as a .cer file. Additionally, the DKIM key can be edited by clicking the Edit button.
The selector, domain and encryption algorithm can all be edited, whereas the private/public key pair cannot be
modified. You can leave the existing key pair as is or generate a new pair, as explained in step 7.
The following conditions determine whether or not an email message has a DKIM signature:
• If the sender’s email is defined in Setup Application Parameters General Parameters Sender Email
Address and the DKIM signature has been set up for the sender’s email domain, the email is signed with
the DKIM signature set for the sender’s email domain.
• If neither the sender nor the From (user) email domain match any available DKIM settings, the email is not
signed.
The newly created DKIM key is inactive by default, so you have to activate it by enabling the toggle switch in the
Active column. However, before activating the DKIM key, you need to add the public key to the DNS record.
When adding the public key to the DNS, the format of the name of the TXT record is
selector._domainkey.domain.com, whereas the value in the TXT record is in the following format: v=DKIM1;
k=rsa; p=MIIBIjANBgkqhki…;
To confirm that DKIM authentication is active, you can use both Gmail and Yahoo accounts.
1. Send a message from your domain (e.g. [email protected]) to your Gmail email address.
2. Open the message in your Gmail inbox
3. Click the downward arrow next to the recipient’s name (in this case, your name) to view details.
A pop-up displays.
If there is signed-by: your domain, DKIM authentication is active.
To add another layer of security in SAP CPQ and prevent unwanted breaches, you can define secure sources of
JavaScript files, CSS sheets, images, and so on.
By defining which sources are secure, you restrict content from unsecure URLs, providing one more level of
protection for files coming from outside SAP CPQ.
There’s a set of application parameters in Application Parameters Security [page 637] in which secure
sources need to be defined:
• Permitted sources for JavaScript: add URLs to secure sources from which JavaScript files can be used in
SAP CPQ.
• Permitted sources for stylesheets or CSS: add URLs to secure sources from which stylesheets and CSS files
can be used in SAP CPQ.
• Permitted sources for images: add URLs to secure sources from which images can be used in SAP CPQ.
• Permitted sources for font resources: add URLs to secure sources from which font resources can be used in
SAP CPQ.
• Permitted sources that can be used as an HTML < form > action: add URLs to secure sources that can be
used in SAP CPQ as an HTML <form> action.
The parameters are empty in all tenants created after the 2008 release. That means that only files from within
SAP CPQ are considered secure.
Note
Don't leave the parameters empty and don't add the * sign because that way you discard additional
security for the content in your tenant. Check your implementations, make a note of the sources from
which you use JavaScript and CSS files, images, and fonts and add those sources in the parameters.
If you add multiple sources in the parameters, use a space to separate them. This functionality is supported
on Google Chrome ®, Mozilla Firefox ®, Safari, and Microsoft Edge ® and it isn’t supported on Microsoft Internet
Explorer IE11 ®.
Example
In one of custom templates, we use images and CSS files from a source stated in the template, like in the
following screenshot.
If the parameters are populated with an * symbol (allowing all sources), the templates display properly and
there are no violations.
However, if the parameters are empty, meaning that only files from within SAP CPQ are allowed, there are
violations in the template and they aren't rendered.
Related Information
You can store credentials for accessing external systems via scripting in Setup Security Credential
Management .
This page contains all credentials that are currently stored in the environment. When you store a credential
entry, you can cite its name in the script sent to an external system, to perform user authentication, instead of
using more complex authentication methods.
A single credential entry consists of a name, identifier, and a password or a client secret.
• Name - The value used for distinguishing one credential entry from others.
• Type - The options Credential and Secret are available. By selecting Credential, you can define both
the identifier and the secret. By selecting Secret, you can create a symmetric/asymmetric key used
specifically to sign JWT tokens in IronPython scripting, which are generated by the JwtTokenProvider.
• Identifier - A unique identifier of a credential, usually consisting of a username and a domain name.
• Secret - A password or a client secret. Once the creation of an entry is complete, the secret becomes
encrypted and can no longer be seen by you or other administrators.
• Active - Status of a credential entry. You can temporarily make a credential entry inactive, preventing its
use for authentication in scripts.
Access to the Credential Management section can be restricted with the Access Rights [page 817] feature, if
needed.
This helper can be used along with a credential entry name to make basic authentication calls, or for requesting
access tokens from external systems (currently only OAuth2 and Client Credential grants are supported.
SAP CPQ as a standalone system doesn't support multi-factor authentication. However, if you want to provide
this level of security to your users, you need to integrate your environment with the identity provider that
supports it, for example, SAP Cloud Platform Identity Authentication Service.
• Learn how to integrate SAP CPQ and SAP Cloud Platform Identity Authentication Service
• Check how to set up multi-factor authentication in SAP Cloud Platform Identity Authentication Service
SAP CPQ is delivered with some default security configuration. The table below contains some security
settings that you might need to review and adjust to your particular use case and corporate policies.
Secure Op
Pri erations Topi More Infor In
ority Map c Default Recommendation mation dex
Criti Roles & Au Bus SAP delivers business role tem Authorizations for users should be de Access S4-
cal thorizations sines plates for different user per signed to follow the principle of least Rights Q2C-
User sonas. These templates must be privilege. [page 817] BU-0
s: adjusted to suit your business 01
Conduct regular authorization reviews.
Au needs and corporate policies.
tho
riza
tion
Rec Client se Fron N/A SAP recommends all users to maintain Supported S4-
Browsers
om curity tend secure configurations and use the lat Q2C-
[page 11]
men Se est version of internet browsers. CS-0
ded cu 01
rity:
Brow
ser
Ad Authentica Au Authentication must be set up Authentication should always employ Federated S4-
Single Sign-
vanc tion & Sin then by the customer. the strongest authentication method Q2C-
On (FSSO)
ed gle Sign-On tica supported by the communicating sys AUT
No communication users are
tion: tems. H-00
configured by default - form
Com 1
based.
mu
nica
tion
User
s
Ad Authentica Au Multi-factor authentication Recommendation is for admin users to Multi-factor S4-
Authentica
vanc tion & Sin then (MFA) is off by default. use MFA (Multi-factor authentication). Q2C-
tion [page
ed gle Sign-On tica Another factor is increasing chance to AUT
826]
tion: prevent attackers from stealing identity H-00
MFA and adding another layer of security. 2
To find out more about the table headings, check Explanation of Table Headings [page 828].
Defines the crit The Secure Op A topic is a Describes the Defines our rec A link to docu A stable unique
icality of the erations Map is short descrip usage of the se ommendation mentation that reference to
recommenda a reference tion or a general curity setting, for this configu- explains how identify the rec
tion. model to struc heading to find including any ration. you can achieve ommendation.
ture the broad similar topics context, or de the recommen
For an explana
area of security across services. fault setting be dation.
tion of the pri
for content, dis havior (if availa
ority levels, see
cussions, and ble).
the Explanation
as a basis for a
of Priority table
360° view on
below.
security.
Explanation of Priority
Priority Description
Although they are accessed on the user side of the application, the Log and the Developer Console can only be
accessed by administrators.
16.1 Log
The Log allows SAP CPQ administrators to monitor Iron Python scripts and track all the data manually logged
from them.
To access the Log, either go to Setup Developer Tools Log , or access it from Setup Log in the
user side
Note
Access to the Log can be delegated via the Access Rights [page 817] feature, so access rights
administrators need to distribute access to all other administrators who should have it.
• See all the errors that occur in the scripts, making it easier to fix them.
• See, if some formula that is part of approval rule fails during parse by the rule engine.
• Copy information from the description column of the log.
• Resize columns of the log table.
You can't view log entry details unless the entry Label is either Script or RuleEngine.
Note
The EventLog description in scripts can contain no more than 10000 characters.
This script will run each time a new quote is created. It uses a log interface to log which user has created the
quote. It simulates the division by zero operation that triggers an exception. The script will break each time it’s
executed and the error will be logged. The administrator is able to see this log on the Log page along with all the
contextual data related to the creation of the quote, such as Date, Session ID, and so on.
Note
You can track the status of email notifications in the log after enabling email notification logging
in General Application Parameters Shopping Cart and Quotes Use Additional Logging For Email
Notification . You can find more information on email notification logging on the Notifications [page 439]
page.
The Developer Console is a practical tool that allows tracing of scripts and business rules executed in the
production system. It allows you to analyze your actions in SAP CPQ easily, profile application problems and
locate potential bottlenecks.
The Developer Console is accessible from the side menu, under the Setup menu item. The tool opens in a new
tab so you can work in SAP CPQ and track actions and traces in parallel. The console captures up to 50,000
traces per request (a request is a click in the application). When you first access it, the Developer Console is
empty until you start working in the application.
Example
If you need to track and analyze all actions that have been performed on a quote in SAP CPQ, click Developer
Console and the tool opens in a separate tab. Select the Full Mode checkbox. In the first tab, open the quote
whose actions you wish to analyze. If you go back to the Developer Console, you can see that all the actions you
performed on the quote from the moment you first opened the console are listed. Also, all future actions that
you’ll perform on the quote will also be recorded in the console.
Depending on the data you wish to track in the Developer Console, you can select/unselect these checkboxes:
• Trace - enable/disable tracing of all actions in SAP CPQ. You can download the traced actions as XLSX
files and then upload them to the Developer Console on a different environment for the purpose of
troubleshooting.
• Full Mode - select to view traces related to all actions performed in SAP CPQ. Otherwise, if you don’t select
the option, only traces that are related to products, rules and scripting are displayed. If you wish to switch
Note
There’s a set of keyboard shortcuts you can use to easily navigate between actions and trace lines. Press
Shift + ? to open the list of shortcuts.
The Developer Console refreshes as you perform actions in SAP CPQ, and new data is added to the list of
actions and traces.
The tool lists only actions that you performed during the current session. A good practice is to clear the
Developer Console by clicking Clear, and then perform actions in the application. This way you’ll have a clearer
overview of the data related only to a particular action.
The list of tracked actions is displayed in the header of the Developer Console. To collapse/expand the section,
click Hide actions and Show actions, respectively. All listed actions have time stamps, duration in seconds and
available actions (View and Download). If an error occurs, the action's information is displayed within the table
Performance Details
The Performance details dialog box provides a more detailed overview of the performance of a particular
action. To view performance details of an action, click Performance Details under the list of traced actions after
selecting an action.
Example
For example, if you click on the GetInitData action, the Performance Details table displays details for logs
labeled Performance - Quote Parser.
Tags used for the quote in question are logged for Quote Parser. For logs labeled Quote Parser, the Performance
Details table displays the following information:
This section displays a detailed trace for every action recorded in the Developer Console. The data is displayed
chronologically, in the order that the actions had taken place.
The Developer Console traces all actions executed across the system either manually or via the API (stateless
and stateful APIs). Only the actions executed in an external services (such as the custom tables microservice
or the Notifier feature) are not traced.
• Message - detailed description of the trace. If you select Negative Filter and enter a search term, the system
displays only the lines that don’t contain that term in the description. This field also allows filtering support
for special search characters: question marks and asterisks. The question mark replaces one character
and the asterisk replaces any character and any number of characters. The Message is limited to 10000
characters.
• Logger - the class from which the method was initiated.
If you want to focus on one trace line, enter a search term in a column to find the trace and select the line.
If you remove the search term, the line remains selected and all other trace lines are displayed again. If you
want to rearrange actions to view the slowest actions first, click Slowest first in the duration (ms) column. This
rearranges the trace lines so that the slowest actions are displayed on top. You can click the action you’re
interested in and unselect the Slowest first checkbox, and the selected trace line remains selected, allowing you
to see the context in which the action was executed. Logs that show up when scripts attached to events are
triggered are labeled ScriptEvent. All other scripts have the Script label.
Note
Formula errors are logged in the Trace section with the log level Error and the label Formula Error.
Note
The flag ITrace.IsOn, which is available in scripting, indicates whether tracing is turned on or off. With
the help of this flag, users can organize the logic that is related to tracing and, that way, optimize script
execution time.
When you’re analyzing your trace lines, you can use the breadcrumbs to check how you arrived to the line and
view actions that occurred. In the trace list, click . Other traces are removed from the list, so that only the
pinned trace and its children traces are displayed, and the breadcrumbs display above the list. By pinning, you
can isolate a group of traces within one action and focus on analyzing them. Using this feature affects groups
on the left-hand side. Clicking the same icon removes the breadcrumbs and all data is displayed in Trace. If
you select a particular group, only the content of that group is displayed. Doing so is useful when you have
extensive data.
The Groups section lists the main traces (high-level traces - Trace H) so you can expand them and have a
hierarchical overview of the underlying traces.
You can filter groups by entering a keyword. The filter can also be negative (for example, you can choose to view
all the traced lines that don’t contain a particular word, such as clone, for example). The feature also enables
filtering support for characters, asterisks, and question marks. The question mark replaces one character and
the asterisk replaces any character and any number of characters.
Here are listed some frequent how-to scenarios about the Developer Console with detailed explanations.
• How and where can I see when an attribute gets its values?
In the Developer Console, find the action ChangeAttributeValue, click on the eye icon to view it, and in the
Logger field, search for ProductAttributeValue and select it. You can also search via the fields Label and
Message.
The display pattern for the ChangeAttributeValue is: Change attribute, Name: {Attribute name},
stdAttrCode: {Standard attribute code}, Value {Attribute value} is selected. For example, if you want to find
when an attribute gets a specific value, you can type in the Message search field: Change attribute, Name: *,
stdAttrCode: * Value specific_value is selected.
Also, you can search by the attribute name, and in that case, replace * with the name of the attribute.
To check all assignments to attribute specific_name, just type in the Message search field: Change
attribute, Name: specific_name.
The same applies for the standard attribute code.
• How can I see the names of all scripts that are executed within an action?
When you click view (the eye icon) for an action, you should enter Script Execution to filter the Message
column. You can also see here the total duration of all scripts for the selected action. By selecting the
Slowest first checkbox, you can see which script takes the longest time to execute.
Note
When a script crashes, you can check the log to see clear information about the problem.
• How can I see when the value of a property is changed via scripting?
Pin the message of the script and all traces related to this script are displayed. The traces contain
information about the change that has been done by the script.
Note
Only the administrator is able to provide developer console exports and console features in general.
This is a useful feature that allows you to see exactly which actions are executed, which user performed
the action, and provides you with information about the quote and the tab (in the example, it is for
ExecuteAction). You have access to all the IDs and you can find the object in the database and check all the
information regarding the action, the user, the tabs and the quote.
Related Information
Performance Troubleshooting
User Interface Troubleshooting
This section describes some typical scenarios when you can use the Developer Console to debug your SAP
CPQ.
a = 0;
Trace.Write("a is initialized.")
a = 100;
Trace.Write("a is changed.")
This script initializes the variable a, traces the variable, and later updates the value of the variable to 100
and traces it once again. When the script gets executed (for example, after the quote has been changed), the
Developer Console logs two trace messages and displays them.
Scripts have an interface for writing the trace and the log using Trace.Write and log.Write. Log data is
visible in the Log [page 829] and this interface can be used to log information that is useful for monitoring
while the trace interface should be used for debugging data. It’s important not to overuse the log feature
because your log form will end up full of data that may not be useful. Also, if you log too much, you’ll slow
down your scripts because logs are much slower to process than the trace. Ultimately, unlike the trace, the log
is persistent, which makes it useful for monitoring and analysis, but it’s preferable to use the trace interface
instead of the log whenever that is possible.
Note
When you set your script to be a post action for Generate Documents, make sure to use Log.Write to
log your data and any messages. Avoid using Trace.Write since it doesn’t get recorded in the Developer
Console. This only applies to the Generate Documents action.
Tracking attribute changes during rule execution loops can help you understand why the system is maybe
slower than usual. For example, if your product rules overlap, SAP CPQ takes longer to execute the rules. For
example, the product Network cable has two rules attached to it: if Category 6 is selected, the cable length
is set to 100 meters and if the length of the cable is over 100 meters, then the Category 6 must be selected.
If users first set the cable length to 110 meters, then both rules are executed. The first rule sets the cable
category to Category 6 and the second rule sets the cable length as a result of the Category 6 setting
(100 meters). In scenarios like this, rules are always going to be performed in two loops, because the two rules
correlate. The Developer Console records execution of rules, and displays a message that describes why the
system is running slower.
Hyperlinks
Some links are classified by an icon and/or a mouseover text. These links provide additional information.
About the icons:
• Links with the icon : You are entering a Web site that is not hosted by SAP. By using such links, you agree (unless expressly stated otherwise in your
agreements with SAP) to this:
• The content of the linked-to site is not SAP documentation. You may not infer any product claims against SAP based on this information.
• SAP does not agree or disagree with the content on the linked-to site, nor does SAP warrant the availability and correctness. SAP shall not be liable for any
damages caused by the use of such content unless damages have been caused by SAP's gross negligence or willful misconduct.
• Links with the icon : You are leaving the documentation for that particular SAP product or service and are entering an SAP-hosted Web site. By using
such links, you agree that (unless expressly stated otherwise in your agreements with SAP) you may not infer any product claims against SAP based on this
information.
Example Code
Any software coding and/or code snippets are examples. They are not for productive use. The example code is only intended to better explain and visualize the syntax
and phrasing rules. SAP does not warrant the correctness and completeness of the example code. SAP shall not be liable for errors or damages caused by the use of
example code unless damages have been caused by SAP's gross negligence or willful misconduct.
Bias-Free Language
SAP supports a culture of diversity and inclusion. Whenever possible, we use unbiased language in our documentation to refer to people of all cultures, ethnicities,
genders, and abilities.
SAP and other SAP products and services mentioned herein as well as
their respective logos are trademarks or registered trademarks of SAP
SE (or an SAP affiliate company) in Germany and other countries. All
other product and service names mentioned are the trademarks of their
respective companies.