How to use pricing tables within Salesforce

Learn how to connect Salesforce CPQ data to GetAccept pricing tables.

Updated over a week ago

Introduction

Please note!

If you are on version 2.54.0 (how to check your integration version) or later, refer to our updated help article here.

We have made a major update to our pricing table feature to simplify the configuration process, support pricing groups, and to support additional customizations.


The pricing table is a new element that you can insert into your template editor (as of Feb 2022). Combined with our Salesforce integration, it is possible to create predefined mapping profiles that can easily pick up Product or CPQ data that exists in your Salesforce org and populate the pricing table element in your template.

The end result is a clean, mobile-friendly way to present quotes to your customers. In this guide, we walk through the steps to set this up so that your users can easily start sending quotes.


Setup

(Pre-requisites: Ensure that you have our GetAccept integration Version 2.32.0 or higher and that you have the pricing table feature enabled on your entity)

This setup will guide you through creating a template with a pricing table, creating a mapping profile in the Salesforce integration to identify which data in your org will populate the table, and then finally performing a test send to ensure the final result is as you would wish.

  1. Creating a template with a pricing table in GetAccept
    First, we shall set up a template with a pricing table element that can be selected and populated within the Salesforce integration.

    1. Create a new template in GetAccept or select an existing template where you wish to add a pricing table.

    2. Create a new editor block.

    3. Click the + button within the editor and select the Pricing table from the Insert Element dropdown menu.

    4. Give the table a title and description.

    5. Select the pricing table so that it is highlighted and click on the cogwheel icon to edit the settings.

    6. Give the pricing table a name, set the desired currency and formatting and set automatic calculation to disabled (as your Salesforce CPQ will do the calculating). Click Save Settings.

    7. Click the eye icon on the same editing toolbar to select which columns and fields should be visible to the recipient of the sending.

    8. You can finally click on column names if you wish to adjust the labeling.

    9. Your template setup is now complete. Now it's time to turn to Salesforce.

  2. Creating a mapping profile in our Salesforce integration
    Pricing table mapping profiles are used to indicate to GetAccepts integration where to look for product and pricing data to populate a pricing table. These profiles offer the flexibility to have multiple setups for different scenarios, depending on what object in Salesforce you’re sending from. We’ll begin by setting up one profile for the most basic scenario: sending from an Opportunity using OpportunityLineItem data.

    1. In Salesforce, first ensure you are operating as a user which has the permission set: GetAccept Integration Admin.

    2. Navigate to the GetAccept Admin app and click on the Setup tab.

    3. Click on the Pricing Tables tab within this Setup page.

    4. If this is your first time here, then there you will not see any profiles already created. It's now time to create one. At this point, you can select either to create a new empty profile, or a profile based on the “Standard scenario” - called Template: Standard. This profile automatically works with the scenario of making a sending from an Opportunity, picking up product data from the OpportunityLineItem object. Select this option for now and click create.

    5. The profile edit view will appear and will provide details on how it is currently mapping the Opportunity and OpportunityLineItems data to a pricing table element. For now, you can scroll to the bottom and click save.

    6. You should now see this one profile appear in the list view. Click on the Activate button to activate the profile so it is ready for use.

  3. Making a sending in Salesforce using a template with a pricing table

    1. Now you can navigate to an opportunity you would like to make a test sending from.

    2. Add products as line items to the opportunity, giving them a price, quantity, and line item description.

    3. Select a recipient (preferably yourself for testing purposes) and click next

    4. Select the template from the list where you know you have included a pricing table. If everything is set up correctly, you will see “Pricing tables” appear as a new tab on the current page within the integration. Click on this tab and you should do something like this:

    5. At this point, if you would like to edit the products in some way, you can Edit products from the related lists on the opportunity page, make the edits, and click Save. Then within the pricing tables tab in the integration, you can click the refresh icon on the top right of the pricing table to update the product list accordingly.

    6. You can now navigate through the rest of the GetAccept flow and finally click send.

    7. You will shortly receive your test sending by email, including the newly populated Pricing table.


Advanced Configuration: Custom Mapping

Now that you have completed the basics you may be in a position where the mapping profiles mentioned above don’t satisfy your needs “out of the box”. There are templates that cover the basic scenarios as follows:

  • Standard: Sending from an Opportunity using OpportunityLineItem data.

  • Quote: Sending from an Opportunity using QuoteLineItem data.

  • CPQ+: Sending from an Opportunity using SBQQ__QuoteLine__c data.

Of course, the reality may be that you deviate from these standard scenarios in a variety of ways, such as:

  • You’re not sending from the Opportunity object

  • You have custom fields created within your own org that you’d like to pick up

  • You have custom fields created as part of another package installed in Salesforce you’d like to pick up

In many cases, these requirements can still be met. So, let's go through the Profile mapping editor in more detail so you can understand the possibilities.

General Information

Name & Description

  • When creating a new profile, it's best to give an understandable name and description for that profile. This becomes more important if you have multiple profiles.

Sending Object

  • The object where the GetAccept integration is placed to make sendings. Of course, you may have the GetAccept integration placed on more than more object layouts, and if so you can create a separate mapping profile for each scenario.

Pricing Data Object Mapping

Summary Object

  • The object from which summary pricing data is picked up. Often this is the same as the Sending object specified above, but can also be a child object (such as the relationship between quotes and opportunities).

Summary Object Foreign Key

  • Summary object foreign key. It should just be Id if it is the same as the sending object

Line Item Object

  • The object where line items can be found. It should be a direct child of the summary object. An example would be the OpportunityLineItem object if the Summary object is the Opportunity.

Line Item Object Foreign Key

  • Line item foreign key. Should indicate how to line item is related to the summary object

Subtotal Tax

  • The sum of all tax from the line items. This should be an absolute figure and not a percentage.

Subtotal Discount

  • The sum of all discounts from the line items. This should be an absolute figure and not a percentage.

Subtotal

  • The sum of all Net Price from the line items

Total Tax

  • Total tax, which can be either a flat fee or a percentage

Total Discount

  • Additional discretionary discount, which can be either a flat fee or a percentage

Total

  • This is a sum of the Subtotal + Total Tax + Total Discount

Summary Object Field Mapping

External ID

  • This is the line item ID that will be stored with the GetAccept document. This will most often just be ID.

Name

  • The line item name, usually the product name

SKU

  • The SKU code for the product

Description

  • The line item description, usually the product description

Units

  • Units refer to the quantity of a given line item.

Price

  • The price per unit for the line item.

Discount

  • The discount amount for the line item. This can be a flat fee or a percentage.

Tax

  • The tax amount for the line item. This can be a flat fee or a percentage.

Total Price

  • The total price is a sum of Price * Units + Tax

Net Price

  • Net price is a sum of Total Price - Discount

The field mapping above can be summarized in the image below:


Some things worth noting:

  • When entering Salesforce object fields into the input boxes in the editor, be sure to use the field API name.

  • The following fields must be of type Currency: Price, Total Price, NetPrice, Subtotal discount, Subtotal tax, Subtotal, Total

  • The following fields can be of type Currency or Percent: Tax, Discount, Total Discount, Total Tax

  • If you leave a mapping field empty, that field will not be displayed in the final sent document.

  • Currency is set in the template - not in Salesforce.


Multiple pricing tables

It may be the case that you wish to use multiple pricing tables in your template and filter your products into a specific table based on certain criteria. This is also possible. This section will guide you through such a setup.

  1. First, you need to set up a template in GetAccept with multiple pricing tables. In this example, I'm setting up two tables.

  2. Next, you need to give each pricing table a unique name so it can be identified in Salesforce. In this example I set the first table name as "Subscriptions" and the second table name as "Services".

  3. Now switch to your Salesforce org and go to the GetAccept Admin app. Click on the setup tab and then navigate to the Pricing Tables section. Create a new profile and set it up as you wish based on the general guide above. Once complete, the final section at the bottom has a button "Select pricing table and set filter". Click on this to edit.

  4. In this example, I will set up the filter so that it populates a table based on its name. You can equally decide to populate the tables based on their running order within the template. But in this case, as I am selecting the table based on the name, I enter "Subscriptions" as this is the name I previously set for the table in GetAccept. At this point, I can create a filter so that only a subset of the products are entered into this table. In this case, I use the object api name "product2.family" to equal "Subscription". (I have set up my products to either have a family name as Subscription or Service. I can then save this profile and activate it. You can then repeat this step for a second mapping profile, setting the filter value to "Service". Bear in mind that you will need to have your own custom fields previously set up so that the totals are calculated for each product family.

  5. Once both profiles are active. You can navigate to wherever you have placed GetAccept and make a test sending. Select the template that has two tables in it and you can then preview it on the final step. It should show two tables with the products filtered as required.


FAQ

  1. Can I create more than one pricing table in my GetAccept template?

    1. Yes, you can, however only the first table found in the template will be populated with product data from Salesforce.

  2. How is the ordering of Products determined when the Salesforce integration picks up my data?

    1. It is based on the SortOrder field (if this exists on the line item object)

  3. Can I set up a mapping profile so that it only selects specific categories or types of products that exist within my CPQ line items?

    1. Currently, this is not possible, but we’re investigating this possibility for future versions.

  4. Can I use one pricing table for more than one currency type?

    1. Currently, this is not possible. For now, the currency is set in the pricing table within the template and that will be picked up and used by Salesforce.

Did this answer your question?