Skip to main content

#Salesforce CPQ & Billing41 personnes en discutent

We use Salesforce CPQ and we do not use MDQ. We use quote line groups on a quote to signify the year of the subscription. For example,

  1. Year 1 quote line group has dates of 1/1/2026 through 12/31/2026 and comes on as list price. 
  2. Year 2 quote line group has dates of 1/1/2027 through 12/31/2027 and we want to apply a 5% uplift using the year one price and apply 5% uplift to each line in the Year 2 quote line group.
  3. Year 3 quote line group has dates of 1/1/2028 through 12/41/2028 and we want to apply a 5% uplift using the year 2 price and apply that 5% to each line in the Year 3 quote line group.

Does anyone else done this before? If so, and you used the QCP could you share how you built it? We need help building this and adding to our current QCP.    Thank you.   

1 réponse
  1. Hier, à 20:28

    Hi Rachel - yes, this is very doable with the QCP, and since Year 1 comes in at list you actually have a clean shortcut. Two approaches, depending on exactly what you're upflifting from: 

     

    Common setup for both: order your Quote Line Groups by the group's Start Date so you always know which is Year 1, 2, 3, and match lines across groups by Product (add any configuration attributes to the match key if the same product is configured differently across years). 

     

    Option A - uplift off list (simplest, and it fits your description): because every year holds the same product at the same list price, a compounding 5% is just a per-group markup. The simplest lever is a negative Additional Discount (%), which acts as a markup in CPQ - set it by group in onBeforeCalculate: Year 2 = -5, Year 3 = -10.25. The formula per group is -(1.05^(year-1) - 1) x 100. That lands Year 2 at list x 1.05 and Year 3 at list x 1.1025 - true compounding - and you never have to read another line's calculated price. (Just confirm negative discounts are allowed in your CPQ package settings; if they aren't, set the target Unit Price directly instead.) 

     

    Option B - compound off the prior year's actual (discounted) price: if Year 1 might carry negotiated discounts and you want 5% on the real Year 1 price, do it in onAfterCalculate instead. Build a map of each product's Customer Price (or Net Price) from the prior group, then set this line's price to priorPrice x 1.05. One gotcha worth knowing: CPQ re-derives List Price from the price book during calculation, so don't try to override List - apply your value at the Customer/Net price stage, which is exactly why onAfterCalculate is the right hook here. 

     

    For a straight 'Year 1 at list, +5% each year' setup, Option A is far less code and less fragile, so I'd start there and only move to B if you need to compound off discounted prices. 

     

    (A CPQ Price Rule can handle a flat per-group uplift too, but the compounding across three groups is cleaner to express in the QCP - so your instinct is right.) 

     

    Happy to sketch the grouping/ordering loop if you go with Option A!

0/9000

Using Enterprise Edition with CPQ. On a CPQ quote a sales rep pushes a custom button to book the order, which creates a case that moves on to Contracts, then the Sales Order team for entry into the ERP. There is a one-to-one lookup relationship between CQP Quote and Case. On the case, once the Sales Order teams confirms the quote is good, I would like to put a button or a checkbox on the case that runs a flow that goes to the quote and checks the box Ordered, which creates an order. The flow should then get the newly created order and do the same actions that clicking the Activate button does. I suspect it runs the two CPQ Apex triggers, on named OrderTrigger and the other named OrderProductTrigger. The main question is, would this take care of all the things that the order's Activate button does if you select it manually? Any other advice on how to "press the Activate button" via automation rather than manual action?

1 réponse
  1. 12 août, 15:03

    Setting the Order Status to Activated should run the triggers and perform the same actions as using the button.  

     

    Note that Order creation runs some async processes that must complete before you Activate. Check the documentation for this. Some of the processes include creating price schedules (if needed) or contracting an amendment (if needed). You may need to build in a delay before triggering activation automatically. There may be some documentation or a knowledge article with more details. 

     

    -Frank 

0/9000

I created several custom fields on the Opportunity Contact Role object. I want these fields to be available in the "Add Contact Role" popup that appears when adding a Contact Role from an Opportunity.

I have already added the custom fields to the Opportunity Contact Role Multi-Line Layout, but they are still not displayed in the popup.

Is this popup customizable to show custom Opportunity Contact Role fields? If so, are there any additional configuration steps required? If not, what is the recommended Salesforce approach for capturing custom Opportunity Contact Role field values during contact role creation?

I've attached a screenshot for reference. 

How can I display custom Opportunity Contact Role fields in the

 

 

 

#Sales Cloud  #Salesforce  #Salesforce Developer  #Salesforce Admin  #TrailblazerCommunity  #Trailhead  #Trailhead Superbadges  #Trailhead Support  #Salesforce CPQ & Billing

4 réponses
  1. 11 août, 03:34

    Hi Suhani, currently, Salesforce does not support customizing the standard 'Add Contact Role' multi-line layout pop-up to display custom fields, even if you add them to the multi-line layout. This is a known platform limitation.Recommended Approach: As a workaround, you can create a custom Screen Flow using Flow Builder to capture the contact roles along with your custom fields, and expose it via a custom quick action button on the Opportunity page.

0/9000

Hello,  I was hoping to get clarity on how contracted pricing works on renewals and amendments. For example, you have an account with the following:

  1. Account
    1. Renewal Pricing Method - Uplift
  2. Contracted Pricing Records
    1. Effective Start Date 7/1/2026
    2. Expiration Date 5/31/2027
  3. Contract Renewal Uplift Rate - 5%
  4. Subscriptions
    1. Renewal Price - complete
    2. Special Price - complete

When renewing the contract the contract pricing is not being picked up. Why is Contracted Pricing not picked up? Is it because Renewal Pricing Method is Uplift and Renewal Price is completed? How can I ensure that the contracted price gets picked up?    The amendment is a general question to ensure I know if the new renewed contract gets amended how will contracted pricing work.    Thank you.  Rachel   

1 réponse
  1. 6 août, 22:55

    @Josh Priem

     

    Hi Josh, 

    Hello,  I was hoping to get clarity on how I can get I cleaning flip an account from Uplift to List so the renewal picks up new contracted pricing works. For example, you have an account currently with the following:

    1. Account
      1. Renewal Pricing Method - Uplift
    2. Contracted Pricing Records
      1. Effective Start Date 7/1/2026
      2. Expiration Date 5/31/2027
    3. Current contract renewing has a 5% uplift but we do not want that to apply.
    4. Subscriptions
      1. Renewal Price - complete
      2. Special Price - complete

    When renewing the contract the contract pricing is not being picked up. Why is Contracted Pricing not picked up? I believe it is a couple things:

    1. Renewal Pricing Method is Uplift - this may need to switch to List 
    2. How can I ensure that the contracted price gets picked up?  Do I need to remove the values from Special Price and Renewal Price?

    Just looking for the cleanest way to process this renewal so that it applies the new contracted pricing. 

     

    Thank you.

0/9000

I'm investigating an issue where historical Opportunity Line Items (OLIs)

appear to be deleted when creating a new Quote or performing an Amendment. 

My objective is:

  • Retain historical OLIs for audit/reporting purposes.
  • Prevent business users from manually deleting historical OLIs.
  • Continue allowing CPQ Quote Sync, Amendments, and Renewals to function correctly.

Questions:

  1. Is SBQQ.AbstractDAO.deleteByIds() expected CPQ behavior during Quote Sync, Amendments, or Renewals?
  2. What is the best way to confirm exactly which records are being deleted by CPQ (OpportunityLineItem vs QuoteLine vs Subscription)?
  3. Has anyone successfully implemented logic to protect historical Opportunity Products without breaking CPQ synchronization?
  4. Is there a recommended CPQ pattern for retaining historical OLIs while still allowing Quote Sync to update current Opportunity Products?
  5. Are there any Salesforce CPQ documented behaviors showing when OLIs are deleted/recreated during sync? 

     

    Any guidance, documentation references, or real-world implementation patterns would be greatly appreciated.

#Salesforce CPQ & Billing

2 réponses
  1. 6 août, 11:59

    hi @Deepika Khanna

     

    Thanks for your input. Based on the debug logs, the database deletion is first executed by the Salesforce CPQ managed package through: 

    Class.SBQQ.AbstractDAO.deleteByIds: line 237, column 1: 

    com.salesforce.api.Database.delete(List<SObject>, Boolean) 

    This is immediately followed by: 

    Class.SBQQ.QuoteOpportunitySynchronizer.clearOpportunityLineItemsByLineItemId:Delete: List<OpportunityLineItem> 

    These log entries confirm that Salesforce CPQ's Quote-to-Opportunity synchronization process is deleting Opportunity Line Items (OLIs) that no longer have a corresponding Quote Line. The deletion is performed by standard managed package logic and not by custom Apex code. 

    During synchronization, QuoteOpportunitySynchronizer determines obsolete Opportunity Products and invokes the managed package deletion framework (SBQQ.AbstractDAO.deleteByIds) to remove them from the database. Therefore, the observed OLI deletion is expected CPQ synchronization behavior when reconciling Opportunity Products with the current Quote configuration. 

    As you mentioned, To preserve historical product information, preferred approach is to implement an OLI archival solution using a custom history object rather than attempting to prevent CPQ from deleting obsolete OLIs.

0/9000
I am trying to learn Salesforce CPQ and as part of that the very begining step is to create brand new Developer org and install Salesforce CPQ managed package.

 

- Have created new Dev org.

 

- have installed Salesforce CPQ package too (got confirmation mail and able to see it from Setup -> Installed Packages page)

 

- the issue occurs when I am trying to verify the step from same org where this action took place. It says,

 

"Step not yet complete in <My org name>

 

We can't find the Home Security Console product in the Trailhead Playground you selected. Try again using a new CPQ-enabled Developer Org."

 

Anyone saw this error before? or known solution to resolve it?

 

Thanks in advance.
3 réponses
0/9000

We have an integration where new products created in Acumatica are automatically synced to Salesforce. The Brand field is a picklist in Salesforce. When a new Brand value is received from Acumatica, Salesforce creates the value, but it is added to the Inactive Values section instead of the active picklist values.

Has anyone experienced this issue or knows what causes this behavior? Is there a way to have new picklist values created as active

automatically? 

 

#Salesforce CPQ & Billing

1 réponse
  1. 4 août, 10:51

    Hi @Dasun Kulathilaka

    New picklist values are being created as inactive because the integration is adding them through the API without activating them in the picklist value set.  

     

    To resolve this, update the integration so it creates the values as active, or use a post-processing automation to activate new values after they are created. Also, verify that the values are assigned to the required record types, as inactive values won't be available to users even if they exist in the picklist.

0/9000

Hi Trailblazers,   

I've been hearing a lot about Agentforce Revenue Management and understand that Salesforce is positioning it as the future of Revenue Cloud. Since many organizations still use Salesforce CPQ, I'm trying to understand what this means for existing implementations and future projects.   

I have a few questions for those who have explored or implemented it:

  •  What exactly is Agentforce Revenue Management? 
  •  How is it different from Salesforce CPQ? 
  •  Is Salesforce recommending that existing CPQ customers migrate, or can CPQ continue to be used for the foreseeable future? 
  •  What new capabilities does Agentforce Revenue Management offer beyond traditional CPQ (such as AI agents, pricing, contracts, billing, renewals, or order management)? 
  •  Has anyone completed a migration from Salesforce CPQ? If so, what challenges or best practices would you recommend? 
  •  Is it suitable for both B2B and subscription-based businesses? 

From what I've read, Agentforce Revenue Management appears to combine product catalog management, pricing, configuration, quoting, contracts, orders, billing, renewals, and AI-powered automation into a single Salesforce-native platform. However, I'd love to hear real-world experiences from architects, consultants, admins, and developers who have worked with it.   

Looking forward to learning from the community. Thanks in advance!    

1 réponse
0/9000

Hello,  I have additional issues around contracts and dates and what the corrective action is. This org I am with has a lot of data integrity issues. Here are 2 more scenarios of which I don't know the best way to approach them:   

  1. In this scenario a contract was created with the dates below in the master agreement. But then evidently the contract "pushed" to 12/31/2023. Meaning the Master Agreement should have dates of 12/31/2023 to 12/30/2028. But the problem is that now that the last year of the subscriptions is renewing it creates a Master Agreement renewal that has the same term as the Master Agreement being renewed. 
    1. We have the concept of a Master Agreement (parent) with a related Subscription Agreement (child). 
      1. Master Contract  1. Overall cagreement  2. Start Date: 12/31/2021  3. End Date: 12/30/2026  Contract Term: 60 Months
    2. Annual Subscription Agreements
      1. Year 1 - 12/31/2021 to 12/30/2022 (term of 12 months)
      2. Year 2 - 12/31/2022 to 12/30/2023 (term of 12 months)
      3. Year 3 - 12/31/2023 to 12/30/2024 (term of 12 months)
      4. Year 4 - 12/31/2024 to 12/30/2025 (term of 12 months)
      5. Year 5 - 12/31/2025 to 12/30/2026 (term of 12 months)
      6. New the contract renewal is happening and it has a start date of 12/31/2026 and is for 5 years. When they actually want the contract renewal to occur on 12/31/2028. And the Subscription renewal to be 12/31/2026 for 12 months.
    3. Journal entries were made to correct the billing to start for subs that started in 12/2023. I can manually correct dates on the master agreement but then they don't align with the subscription agreements. I am stuck on how to move forward.
  2. We have a case where a renewal was processed in June of 2025 for a 36 month term (6/30/2025 through 6/29/2028) and then they signed a new 24 month contract in April 2026 wanting the dates to be 6/30/2026 to 6/30/2028. It looks like someone manually changed the start date on the subscriptions on the contract from 6/30/2025 to 6/30/2026. How do I correct this since they manually changed the dates. I was thinking that the renewal opportunity would be used to adjust the dates but for some reason I feel uncomfortable with that thought or process.

Yes, the data in the org is a mess and I am now trying to help them correct some of these issues as they come up.    Any help is seriously appreciated.  Thank you.

1 réponse
  1. Forum Ambassador Josh Priem (Freelance)
    28 juil., 18:04

    Hello!  

     

    For the first question is it how to make a contract that in the system ran from 2021-2026 to actually run form 2023-2028? 

     

    haha yes I would say this org has your work cut out for you. 

     

    Cheers!

0/9000
2 réponses
  1. 28 juil., 12:55

    Hi @Inbarasu G

     

    The Use Standard Price field on the PriceBookEntry object indicates whether the Price Book Entry is using the Product's Standard Price from the Standard Price Book.

    For example, if a product has a Standard Price of $100 and you create a Price Book Entry for a custom Price Book with the same price, Salesforce can use the standard price as the basis for that entry.

    In simple terms:

    • True → The Price Book Entry uses the Product's Standard Price. 
    • False → The Price Book Entry has its own price defined for that specific Price Book. 

    This field is also useful when working with custom Price Books, because Salesforce requires a Product to have an active Standard Price before you can add it to a custom Price Book.

    Hope this helps!

0/9000