Support Ukraine 🇺🇦 Help Provide Humanitarian Aid to Ukraine.
For Developers

CPQ Custom Quote Lines

2 min read

Who is this for:  Salesforce CPQ developers and admins

What’s in it for me:  Learn to inspect the PDF generation process and see how to make unconventional changes

Background:  Custom quote lines must be coded from scratch in CPQ, but if you want to do something simple like hide the group total?  We had one customer who uses optional groups as an alternative for the current quote, allowing them to present a PDF with a 1 year option and a 3 year option to highlight savings.

Step 1:  Open the developer console so you can watch what happens when the PDF is generated

Step 2:  Preview a quote that has a custom document with the quote lines content.

Step 3:  Check out the logs in developer console to see all the pages that were loaded:

Line Item Content

The one I was looking for was “sbqq__lineitemscontent”.  For the unindoctrinated, the name is in the format “namespace__filename” (two underscores between them).  Since pages are not protected in a managed package, you are actually free to view the source and copy it for your own needs.  Just go to Setup > Pages and find the page “lineitemscontent” and you can see the markup.  Here it is for your convenience:

<apex:page language="{!vfLanguage}" controller="SBQQ.DocumentGeneratorController" contentType="application/xml" showHeader="false" sidebar="false">
    <apex:outputPanel layout="none" rendered="{!hasQuote}">
        <c:lineItemGroups quote2="{!quote2}" template="{!template}"
            staticGroups="{!staticGroups}" dynamicGroups="{!dynamicGroups}"
            currencyFormatPattern="{!currencyFormatPattern}"
            fontSize="{!fontSize}" fontFamily="{!fontFamily}" textColor="{!textColor}" tableStyle="{!tableStyle}"/>
        <c:quoteTotals quote2="{!quote2}" template="{!template}"
            staticGroups="{!staticGroups}" dynamicGroups="{!dynamicGroups}"
            currencyFormatPattern="{!currencyFormatPattern}"
            fontSize="{!fontSize}" fontFamily="{!fontFamily}" textColor="{!textColor}"/>
    </apex:outputPanel>
</apex:page>

Because the components used in this page are in global (lineItemGroups and quoteTotals) we can copy this page and refer to them in our own namespace.  The only catch: you need to switch the namespace from “c:” to “sbqq:” since you moved the page to your own namespace.

Here is what it looks like after the replace:

<apex:page language="{!vfLanguage}" controller="SBQQ.DocumentGeneratorController" contentType="application/xml" showHeader="false" sidebar="false">
    <apex:outputPanel layout="none" rendered="{!hasQuote}">
        <**sbqq**:lineItemGroups quote2="{!quote2}" template="{!template}"
            staticGroups="{!staticGroups}" dynamicGroups="{!dynamicGroups}"
            currencyFormatPattern="{!currencyFormatPattern}"
            fontSize="{!fontSize}" fontFamily="{!fontFamily}" textColor="{!textColor}" tableStyle="{!tableStyle}"/>
        <**sbqq**:quoteTotals quote2="{!quote2}" template="{!template}"
            staticGroups="{!staticGroups}" dynamicGroups="{!dynamicGroups}"
            currencyFormatPattern="{!currencyFormatPattern}"
            fontSize="{!fontSize}" fontFamily="{!fontFamily}" textColor="{!textColor}"/>
    </apex:outputPanel>
</apex:page>

In our version, we commented out the tag sbqq:quoteTotals since it was showing even if the switch for it in quote template was turned off (bug or not, project has to go live, right?).

Hope this helps you in your CPQ journey and let us know if you need any CPQ/StellBrick help.


About CloudAnswers

Salesforce apps, powerful components, custom development, and consulting. Our experienced team helps you to create and modify workflow processes in salesforce.

Related Articles

For Everyone

Why use Report Sender?

Salesforce reporting has limitations — especially when it comes to getting reports into the right hands. Report Sender enhances scheduling, adds dynamic filtering, and extends delivery to external users, making your reporting process faster and more flexible.

Ian Cosgrove

4 min read

For Everyone

Agentforce: Worth all of the Fanfare?

Salesforce’s vision for autonomous AI has been years in the making, but Agentforce 360 represents its boldest step yet. From defining agent behavior in the Builder to testing real-world booking scenarios, this article explores what Agentforce does well, where it still falls short, and whether its rapidly rising costs justify the value. Is Agentforce the future of Salesforce automation—or just an expensive work in progress?

Ian Cosgrove

7 min read

For Everyone

Agentforce Vibes: Can We Really Use AI to Write Code as Salesforce Admins?

Agentforce Vibes is changing what it means to be a Salesforce Admin. For years, our work revolved around no-code and low-code tools—but now AI is opening the door to a new reality: Admins who can generate and understand Apex without being traditional developers. In this post, I break down how Agentforce Vibes helps turn natural language into functional code, explains complex logic, assists with debugging, and even updates Flows and metadata.

Ian Cosgrove

5 min read

Discover more from CloudAnswers

Subscribe now to keep reading and get access to the full archive.

Continue reading