Inhaltsverzeichnis
Quote Dokument erstellen
- App Launcher
- Salesforce CPQ
- Quotes
- All – List View
- entsprechende Quote auswählen
- Generate Document
- Preview
- X – schließen
- Save & Email
- Send
- Quote erneut öffnen
- Related
- Quote Documents – Related List – das Dokument ist hier vorhanden
Eigene Vorlage erstellen
- Ohne Änderungen erhält man eine einfach Vorlage
- Quote Template
- New
- Name angeben
- Default – legt es als Standard fest
- Top Margin
- Company Name angeben
- Company Slogan angeben
- Company Phone angeben
- Shading Color angeben – z.B.:
CCEEFF - Save
Die neue Vorlage wird nun verwendet und in einer entsprechend Quote getestet werden.
Wasserzeichen hinzufügen
Dokument-ID des Wasserzeichens finden
- Switch to Salesforce Classic
- + – Symbol – Tabs
- Documents
- Go!
- Dokument auswählen
- ID in der URL markieren und kopieren
- Switch to Lightning Experience
Wasserzeichen in Quote Template angeben
- Quote Templates
- entsprechendes Template auswählen
- Edit
- Watermark-ID angeben – ID einfügen
- Save
Wasserzeichen anzeigen
- wird nicht standardmäßig angezeigt
- Watermark Shown aktivieren – an der Quote

Eigenes Wasserzeichen verwenden
- PNG-Datei unter Documents hochladen
- Externally Available Image aktivieren
Bausteine für Vorlagen
- Vorlageninhalte sind die Bausteine/Puzzelteile
- es werden also viele Vorlageninhalte erstellt
- Aus dieser Bibliothek werden Vorlagen erstellt
Inhalte per HTML-Editor
- Template Content
- News
- Content Type auswählen – z.B.:
HTML - Continue
- Name angeben
- entsprechend HTML einfügen
- Felder können wie folgt eingefügt werden
{!template.SBQQ__CompanyName__c} {!salesRep.Name} {!salesRep.Email} {!template.SBQQ__CompanyPhone__c}
Mögliche Datenquellen
- !quote = Quotes
- !primaryContact = Contact, der mit Quote referenziert ist
- !salesRep = User, der mit Quote referenziert ist
- !template = Quote-Template
- !document = Quote-Dokument
- Daten aus anderen Quellen können nur per Formelfelder auf diese Objekte übertragen werden und so in das Template integriert (nur !quote, !template und !document)
Stil hinzufügen – HTML inline-CSS
Beispiel:
<table border="1" cellpadding="1" cellspacing="1" style="width:500px;">
<tbody>
<tr>
<td style="width: 35%; padding: 3px; background-color: #{!template.SBQQ__ShadingColor__c};">Prepared For</td>
<td style="width: 35%; padding: 3px; background-color: #{!template.SBQQ__ShadingColor__c};">Prepared By</td>
</tr>
<tr>
<td style="padding: 3px; border: solid black;">
{!quote.SBQQ__BillingName__c}<br />
{!primaryContact.Name}<br />
{!primaryContact.Email}<br />
{!primaryContact.Phone}
</td>
<td style="padding: 3px; border: solid black;">
{!template.SBQQ__CompanyName__c}<br />
{!salesRep.Name}<br />
{!salesRep.Email}<br />
{!template.SBQQ__CompanyPhone__c}
</td>
</tr>
</tbody>
</table>
Vorlageninhalte zur Vorlage hinzufügen
- Quote Templates
- entsprechendes Template auswählen
- Related
- Section – Related List – New
- Section Name angeben
- Content auswählen
- Display Order angeben – Definiert die Reihenfolge aller Contents im Template – z.B.
10 - Save
Konfiguration kann nun an entsprechender Quote getestet werden.
Mehrere Vorlagen in einer
- wann ein Abschnitt erscheint wird durch Conditional Print Field gesteuert

- Setup
- Object Manager
- Quote
- Fields & Relationships
- New
- Checkbox auswählen
- Next
- Label angeben
- Next
- Next
- Save
Picklist um das an der Quote neu erstellte Feld erweitern:
- Object Manager
- Template Section
- Fields & Relationships
- Conditional Print Field auswählen
- New – Wert hinzufügen
- API-Name des oben neu erstellten Feldes angeben
- Save
Nun nur noch den Template Content erstellen. Diesen dem Quote Template im Bereich Section hinzufügen und im Feld „Conditional Print Field“ das entspechende Feld auswählen.
Einfacher Header
- Template Content
- New
- HTML auswählen
- Continue
- Content Name angeben
- Source
<table border="1" cellpadding="1" cellspacing="1">
<tbody>
<tr>
<td>
<p style="font-size: 16px">Quote {!quote.Name} v{!document.SBQQ__Version__c}</p>
<p style="font-size: 12px; color:#D3D3D3;">Expires {!quote.SBQQ__ExpirationDate__c}</p>
</td>
<td>
<p style="text-align: right;"><img height="40" src="https://developer.salesforce.com/files/awcomputinglogo.png" /></p>
</td>
</tr>
</tbody>
</table>
- Save
- Quote Templates
- entsprechendes Template auswählen
- Edit
- Header Content – entsprechenden Template Content auswählen
- Exclude Header & Footer auswählen – z.B:
First Page - Header Height – z.B.:
60– damit er nicht mit anderem überlappt - Save
Umgekehrte Bedingung
- aktuell wird Kopfzeile auf der ersten Seite übersprungen – Deckblatt
- manche Quotes haben kein Deckblatt
- daher würden diese direkt mit Kontaktdaten beginnen – sieht nicht gut aus
- daher soll Kopfzeile auf der ersten Seite angezeigt werden
- Lösung:
- Template Content für die Kopfzeile erstellen
- diesen abhängig von einem Formelfeld (Checkbox) machen
- Gibt das Gegenteil von „Deckblatt einschließen“ zurück
Formelfeld anlegen:
- Setup
- Object Manager
- Quote
- Fields & Relationships
- New
- Formula
- Next
- Label angeben
- Checkbox
- Next
- entsprechende Formel angeben – z.B.:
IF(Include_Cover_Page__c, false, true) - Next
- Next
- Save
Dieses Feld wieder per API-Name der Picklist Conditional Print Field am Objekt Template Section hinzufügen! Dann nur noch das Template anpassen.
- Quote Template
- entspechendes Template auswählen
- Related
- Sections – Related List – New
- Section Name angeben
- Cortent – entsprechenden Template Content angeben
- Display Order – z.B.:
1 - Bottom Margin – z.B.:
0.25 - Conditional Print Field – das entsprechende Feld auswählen
- Save
Angebotspositionen anzeigen
- Template Content
- New
- Line Items
- Continue
- Content Name angeben
- Save
- Quote Template
- entsprechendes Template auswählen
- Sections – Related List – New
- Content auswählen – entsprechenden Template Content angeben
- Display Order angeben- z.B.: 30
- Save
Die Spalten-Darstellungen können im Quote-Template in der Related List Line Columns angepasst werden.
- Spaltenüberschrift
- Anzeigereihenfolge – links nach rechts
- Breite (%) – alle Spalten zusammen also max. 100
- Feldname
Spalten bedingt anzeigen
- Spalten nur anzeigen, wenn sie angewendet werden
- Wird mit Feld „Conditional Print Field“ gesteuert

- Quote Template
- entsprechendes Template aufwählen
- Related
- Line Columns – Related List – New
- Display Order – z.B.:
70 - Field Name – z.B.:
SBQQ__PartnerDiscount__c - Width – z.B.:
10 - Alignment auswählen – z.B.:
Right - Conditional Print Field angeben – z.B.:
SBQQ__AveragePartnerDiscount__c - Save
Vorgang mit entsprechenden Feldern wiederholen!
Werden Spalten ausgeblendet, wird fehlende Breite zur breitesten Spalte hinzugefügt. Diese kann mit „Discard Width When Hidden“ unterbunden werden.

Aussehen beeinflussen
- Separate Line – Separate Zeile – Checkbox
- Hide On Product Options – Produktoptionen ausblenden – Checkbox
- Table Style – Tabellenstil (Auswahlliste)
- Hide Column Header – Spaltenübersicht ausblenden – Checkbox
- Show Discount Schedule – Rabattplan anzeigen – Checkbox
- Line Sort Field – Zeilenorientierungsfeld (Auswahlliste)
Mehrere Einzelposten-Tabellen
- Mehr als nur eine Tabelle
- eine reduzierte Tabelle
- eine weitere mit mehr Details
- Spalten können mit Section zugewiesen werden
- Lässt man Section leer erscheint Spalte in jedem Abschnitt
Quote Line Items Gruppieren
Textformelfeld zur Trennung
- Setup
- Object Manager
- Quote Line
- Fields & Relationships
- New
- Formula
- Next
- Name angeben – z.B.:
Purchase Type - Text
- Next
- entsprechende Formel angeben – z.B.:
IF(ISPICKVAL(SBQQ__SubscriptionPricing__c, ""),"One-time Purchases","Subscriptions") - Next
- Next
- Save
Feld zur Picklist – Quote Template
- Object Manager
- Quote Template
- Fields & Realtionships
- Group Fields auswählen
- Werte-Bereich – New
- Name angeben – API-Name des neu erstellten Gruppierungs-Feldes – z.B.:
Purchase_Type__c - Save
Template für Gruppierung anpassen
- Quote Templates
- entsprechendes Template auswählen
- Edit
- Group Shading Color angeben – z.B.:
F3F3F3 - Group Font Size angeben – z.B.
14 - Group Field auswählen – API-Name des zu Gruppierungs-Feldes – z.B.:
Purchase_Type__c - Save
Gruppen in Gruppen – Untergruppen
- Untergruppe mit weiterem Feld – z.B.:
Product Family
- Quote Templates
- entsprechendes Template auswählen
- Edit
- Sub Group Field auswählen – z.B.:
Product Family - Save
CPQ solle noch mindestens eine Zeilenspalte summieren.
- Related – Tab
- Line Columns – Related List –
View All - entsprechende Spalte –
Edit - Summary Level auswählen –
Sub Group - Summary Function auswählen –
SUM - Save
Das mit weiteren Spalten entsprechend wiederholen:
- entsprechende Spalte – Edit
- Summary Level auswählen –
Sub Group - Sub Group Summary Label angeben – z.B.:
{0} Subtotal - Save
Summen anpassen
- Felder. die Summen beeinflussen können
| Feldname (Objekt) | Auswirkungen bei Summen |
| Print Quote Totals (Template Section) | Checkbox - bei Gruppierung - Gesamtsumme nach Gruppentabellen angezeigt |
| Subtotal Fields (Quote Templates) |
Fügt Auswahl zwischen folgendem hinzu:
|
| Show Customer Discount & Customer Discount Field (Quote Templates) |
Picklist & Checkbox ausgewählt:
|
| Show Partner Discount (Quote Templates) | Wenn aktiviert - Betrag Partnerrabatt hinzugefügt. |
| Total Field (Quote Templates) |
Zeigt Auswahl zwischen folgendem an:
Zeigt Listenpreis, wenn leer.
|
| Hide Group Subtotals (Quote Templates) |
Wenn aktiviert und keine Gruppierung = Zwischensumme ausgeblendet
Wenn aktiviert und Gruppierung = Zwischensumme und Summe ausgeblendet. |
| Hide Totals (Quote Templates) | Wenn aktiviert und keine Gruppierung = Gesamt ausgeblendet |
| Summary Display (Template Section) |
Zeigt immer unabhängig von "Gruppenzwischensumme ausblenden" oder "Summe ausblenden":
|
Quote Lines ausblenden
New wpDataTable
| Feldname (Objekt) | Auswirkungen auf Sichtbarkeit |
| Hide Component Products (Quote Template) | Entfernt all Produkte, die Option für Packet sind. |
| Show Bundled Products (Quote Template) | Optionen als "Bundled" gekennzeichnet werden angezeigt. |
| Show all Package Products (Quote Template) | Übergeordnete "virtuelle Bundle" mit Nullwerten werden angezeigt. |
| Quote Line Visibillity (Product Option) | Zeile der Option werden mit "Never" oder "Only Editor" entfernt. |
| Show Renewed Products (Quote Template) | Eltern- und Geschwister-Produkte ohne Subscription zu einer verlängerten Subscription werden in einem Verlängerungsangebot angezeigt. Ergebnis durch "Show Bundled Products" und "Show All Package Products" beeinflusst. |
Quote Lines mit Filtern ausblenden
- Beispiel – Zeilen als Optional gekennzeichnet ausblenden
- Quote Template
- entsprechendes Template auswählen
- Related – Tab
- Sections – Related List – Edit an entsprechender Section
- Filter Field auswählen – z.B.:
Optional - Filter Operator auswählen – z.B.:
equals - Filter Value angeben – z.B.:
false - Save
Custom Code
- sehr flexible Lösung mit Apex und Visualforce
1. Apex Klasse erstellen
- Setup
- Apex Classes
- New
Beispiel:
public class CustomTemplateController{
public string quoteId {get; set;}
public string templateId {get; set;}
public List<SBQQ__QuoteLine__c> lines {get; set;}
public List<SBQQ__QuoteLineConsumptionSchedule__c> linesWithConsumptionSchedules {get; set;}
public List<SBQQ__QuoteLineConsumptionRate__c> consumptionRates {get; set;}
public List<Id> lineIDsWithCS {get; set;}
public SBQQ__QuoteTemplate__c template {get;set;}
public boolean showConsumptionSchedule {get;set;}
public CustomTemplateController(){
quoteId = ApexPages.currentPage().getParameters().get('qid');
templateId = ApexPages.currentPage().getParameters().get('tid');
lineIDsWithCS = new List<Id>{};
consumptionRates = new List<SBQQ__QuoteLineConsumptionRate__c>{};
showConsumptionSchedule = false;
this.populateTemplate();
this.populateLineData();
this.populateCSData();
}
public void populateTemplate(){
template = [SELECT Id, SBQQ__FontFamily__c, SBQQ__FontSize__c, SBQQ__ShadingColor__c FROM SBQQ__QuoteTemplate__c WHERE Id = :templateId];
}
public void populateLineData(){
lines = [SELECT Id, SBQQ__HasConsumptionSchedule__c FROM SBQQ__QuoteLine__c WHERE SBQQ__Quote__c = :quoteId ORDER BY SBQQ__Number__c ASC];
for(SBQQ__QuoteLine__c line : lines){
if(line.SBQQ__HasConsumptionSchedule__c){
lineIDsWithCS.add(line.Id);
showConsumptionSchedule = TRUE;
}
}
}
public void populateCSData(){
linesWithConsumptionSchedules = [SELECT Id, SBQQ__QuoteLine__r.SBQQ__ProductName__c, Name, SBQQ__UnitOfMeasure__c, (SELECT Id, SBQQ__LowerBound__c, SBQQ__UpperBound__c, SBQQ__Price__c, SBQQ__QuoteLineConsumptionSchedule__r.SBQQ__QuoteLine__c FROM SBQQ__QuoteLineConsumptionRates__r ORDER BY SBQQ__ProcessingOrder__c) FROM SBQQ__QuoteLineConsumptionSchedule__c WHERE SBQQ__QuoteLine__r.Id IN :lineIDsWithCS];
for(SBQQ__QuoteLineConsumptionSchedule__c schedule : linesWithConsumptionSchedules){
for(SBQQ__QuoteLineConsumptionRate__c rate : schedule.SBQQ__QuoteLineConsumptionRates__r){
consumptionRates.add(rate);
}
}
}
}
- Save
2. Visualorce Page erstellen
- Setup
- Visualforce Page
- New
- Label angeben
Beispiel:
<apex:page contentType="text/xml" showHeader="false" sidebar="false" controller="CustomTemplateController" rendered="{!showConsumptionSchedule}">
<block font-size="{!template.SBQQ__FontSize__c}" font-family="{!template.SBQQ__FontFamily__c}" >
<table width="75%">
<table-column column-width="60%"/>
<table-column column-width="40%"/>
<table-header>
<table-row font-weight="bold" background-color="#{!template.SBQQ__ShadingColor__c}">
<table-cell padding="3px" border-style="solid" border-width="1px" text-align="left">
<block>
Consumption Schedules
</block>
</table-cell>
<table-cell padding="3px" border-style="solid" border-width="1px" text-align="center">
<block>
Rates
</block>
</table-cell>
</table-row>
</table-header>
<table-body>
<apex:repeat id="schedulerepeat" value="{!linesWithConsumptionSchedules}" var="schedule">
<table-row keep-together.within-page="always">
<table-cell padding="3px" border-style="solid" border-width="1px" text-align="left">
<block>
{!schedule.SBQQ__QuoteLine__r.SBQQ__ProductName__c} - {!schedule.Name} ({!schedule.SBQQ__UnitOfMeasure__c})
</block>
</table-cell>
<table-cell border-style="solid" border-width="0px" text-align="left">
<table border-collapse="collapse" >
<table-column column-width="50%"/>
<table-column column-width="50%"/>
<table-body>
<apex:repeat id="raterepeat" value="{!consumptionRates}" var="rate">
<apex:outputText rendered="{!rate.SBQQ__QuoteLineConsumptionSchedule__r.Id = schedule.Id}">
<table-row keep-together.within-page="always">
<table-cell padding="3px" border-style="solid" border-width="1px" text-align="center">
<apex:outputText rendered="{!NOT(ISNULL(rate.SBQQ__UpperBound__c))}">
<block>
{!rate.SBQQ__LowerBound__c} - {!rate.SBQQ__UpperBound__c - 1}
</block>
</apex:outputText>
<apex:outputText rendered="{!ISNULL(rate.SBQQ__UpperBound__c)}">
<block>
{!rate.SBQQ__LowerBound__c}+
</block>
</apex:outputText>
</table-cell>
<table-cell padding="3px" border-style="solid" border-width="1px" text-align="right">
<apex:outputText >
<block>
<apex:outputText value="{0,number,currency}">
<apex:param value="{!rate.SBQQ__Price__c}"/>
</apex:outputText>
</block>
</apex:outputText>
</table-cell>
</table-row>
</apex:outputText>
</apex:repeat>
</table-body>
</table>
</table-cell>
</table-row>
</apex:repeat>
</table-body>
</table>
<block> </block>
</block>
</apex:page>
- Save
3. Visualforce Page mit custom content referenzieren
- Salesforce CPQ
- per Navigation – Template Content
- New
- Custom
- Continue
- Content Name angeben – z.B.:
AW Consumption Schedules - Custom Source – z.B.:
/apex/c__ConsumptionSchedulesVFP - Save
- per Navigation – Quote Templates
- Template auswählen
- Related – Tab
- Sections – Related List – New
- Section Name angeben
- Content – entsprechendes Template Content auswählen
- Top Margin angeben – z.B.:
0.25 - Display Order angeben – z.B.:
40 - Save
Vorgefertigte Inhalte nutzenn
- für grundlegende Informationen in Quote Templates
- per Navigation – Template Content
- New
- Template Bottom auswählen
- Continue
- Content Name angeben – z.B.
AW Signatures - Save
- per Navigation – Quote Templates
- Template auswählen
- Related – Tab
- Sections – Related List – New
- Section Name angeben
- Content – entsprechendes Template Content auswählen
- Top Margin angeben – z.B.:
0.5 - Display Order angeben – z.B.:
50 - Save
Template-Bedingungen
- Angebote enthalten auch wichtige Bedingungen des ausgehandelten Geschäfts
- z.B. Rückgaberichtlinien – werden als Angebotsrichtlinien festgelegt
- Quote Term Record stellt einen Teil der allgemeinen Geschäftsbedingungen dar
- sollen ins Angebot
- CPQ stellt Quote Terms in einem Block zusammen
- können beliebig ins Template eingefügt werden
- für jeden Begriff ein Feld für die Druckreihenfolge
- jede Quote Term kann unter bestimmten Bedingungen angezeigt werden
- per Navigation – Quote Templates
- New
- Quote Terms
- Continue
- Content Name angeben
- Font Size angeben
- Save
Quote Term Template ist nur ein Platzhalter. Muss noch in eine Template Section eingefügt werden.
- per Navigation – Quote Templates
- Quote Template auswählen
- Related – Tab
- Sections – Related List – New
- Section Name angeben
- Content – oben angelegtes oder entsprechendes Quote Template auswählen
- Top Margin angeben – z.B.:
0.25 - Display Order angeben – z.B.:
45 - Save
Entsprechendes Quote Term erstellen.
- per Navigation – Quote Terms
- New
- Print Order angeben – z.B.:
20 - Active aktivieren
- Body – den anzuzeigenden Text angeben
- Save
Für dynamische Informationen können entsprechende Feld-Platzhalter (z.B.: {!quote.SBQQ__ExpirationDate__c}) zu den Quote-Daten eingebettet werden.
Begriffe organisieren
- bei großen Sammlungen von Quote Terms, kann Textblock unhandlich werden
- Lösung: Parent-Child-Relations zwischen Quote Terms
- per Navigation – Quote Terms
- All – List View
- entsprechendes Child-QT auswählen
- Parent Term – entsprechendes Parent-QT auswählen
- Save
- für weitere QTs entsprechend wiederholen
Für eine bessere Verdeutlichung der sollte zusätzlich die Nummerierung verwendet werden.
- per Navigation – Quote Templates
- entsprechendes Template auswählen
- Edit
- Number Terms aktivieren
- Save
Quote Terms aufteilen
- an verschiedenen Stellen im Template anzeigen
- 2 Template Content Records erstellen
- diese in 2 verschiedenen Quote Template Sections platzieren
- Einschränkungen
- Parent und Childs können getrennt werden
- Nummerierung als wären sie keine Childs
- ist ein Quote Term keinem Template Content zugewiesen, wird es immer angezeigt
Quote Term Bedingungen
- Quote Terms nur für bestimmte Verkäufe anzeigen
- Eine Bedingung erstellen unter der bestimmte Quote Terms ausgeblendet werden
- per Navigation – Quote Terms
- entsprechendes QT auswählen
- Related – Tab
- Term Conditions – Related List – New
- Tested Field auswählen – API-Name des zu prüfenden Feldes angeben – z.B.:
AccountSLA__c - Operator auswählen – z.B.:
equals - Value angeben – z.B.:
bronze, silver, gold - Save
Wird ein Parent-Element ausgeblendet, dann werden die entsprechenden Child-Elemente zusätzlich ausgeblendet.
- Alternativ kann auch eine Zusammenfassungvariable getestet werden
- auch mehrere Bedingungen möglich
- jede Bedingung muss standardmäßig wahr sein – Feld Conditions Met standardmäßig
All - Conditions Met =
Any, dann muss nur eine Bedingung wahr sein - Komplexe bedingte Logik auch möglich – Bedingung1=wahr ODER Bedingung2 und Bedingung3 = wahr
- Index-Field eindeutigen Wert geben – z.B.:
100,200und300 - diese Werte in Advanced Condition entsprechend verwenden – z.B.:
100 OR (200 AND 300) - Conditions Met =
Custom
- Index-Field eindeutigen Wert geben – z.B.:
- jede Bedingung muss standardmäßig wahr sein – Feld Conditions Met standardmäßig
User können Bedingungen anpassen
- bei sorgfältiger Formulierung der Regeln nicht notwendig
- am Quote Record gibt es eine Schaltfläche Modify Quote Terms
- Liste der zugewiesenen Quote Terms erscheint
- mit Klick erscheint ein einfacher Editor
- durch speichern wird aber nicht das Original geändert – CPQ erstellt hierzu einen entsprechenden Clone und weist ihn der aktuellen Quote zu

Die Kommentare sind geschlossen.