Back to Blog
SAP CPQCallidusTutorialS/4HANA

SAP CPQ Tutorial: Getting Started with Callidus CPQ

December 5, 202416 min read

SAP CPQ Tutorial: Getting Started with Callidus CPQ

SAP CPQ (formerly Callidus CloudCPQ) is a powerful enterprise CPQ solution for complex product configuration and global deployments. Built for manufacturing, high-tech, and distribution companies, SAP CPQ excels at multi-level configurations and seamless S/4HANA integration. This tutorial covers the fundamentals.

What is SAP CPQ?

SAP CPQ is part of the SAP Customer Experience portfolio, providing:

  • Complex product modeling — Multi-level BOMs and variant configuration
  • S/4HANA integration — Native connection to SAP ERP
  • Global capabilities — Multi-currency, multi-language, multi-company
  • Guided selling — Intelligent product recommendations
  • Document generation — Professional proposals and contracts

SAP CPQ Architecture

Understanding the architecture helps with implementation:

SAP CPQ Cloud├── Configuration Engine│   ├── Product Models│   ├── Rules & Constraints│   └── Pricing Logic├── User Interface│   ├── Quote Builder│   ├── Admin Console│   └── Reporting└── Integration Layer    ├── SAP S/4HANA    ├── SAP CRM/C4C    └── Third-party systems

Core Concepts

Product Hierarchy

SAP CPQ organizes products in a hierarchy:

Product Categories└── Product Families    └── Products        └── Configurable Products            └── Options & Variants

Product Types

TypeUse CaseExample
StandardSimple productsUSB Cable
ConfigurableProducts with optionsLaptop with specs
BundleProduct packagesSoftware Suite
ServiceService offeringsInstallation

Pricing Types

SAP CPQ supports multiple pricing approaches:

  • List Price — Standard catalog pricing
  • Cost Plus — Markup on cost
  • Tier Pricing — Volume-based discounts
  • Formula — Calculated pricing
  • External — Prices from SAP ERP

Product Configuration

Creating a Configurable Product

Step-by-step setup:

1. Define the Product Structure

Product: Industrial Motor├── Attribute: Power Rating (kW)│   └── Options: 1.5, 3.0, 5.5, 7.5, 11.0├── Attribute: Voltage│   └── Options: 220V, 380V, 440V├── Attribute: Mounting│   └── Options: Foot, Flange, Face└── Attribute: Enclosure    └── Options: IP55, IP65, IP66

2. Add Constraints

python
# High power motors require 380V or higherIF Power_Rating >= 7.5 THEN    Voltage IN (380V, 440V)    # Outdoor enclosure required for outdoor mountingIF Mounting_Location = "Outdoor" THEN    Enclosure = IP66

3. Set Pricing Rules

python
# Base price by power ratingBase_Price = LOOKUP(Power_Rating, Price_Table)# Voltage surchargeIF Voltage = 440V THEN    Surcharge = Base_Price * 0.15    # Premium enclosure upchargeIF Enclosure = IP66 THEN    Surcharge = Surcharge + 250

Scripting in SAP CPQ

SAP CPQ uses Python-based scripting:

Price Calculation Script

python
def calculate_price(product, quote):    base_price = product.get_attribute('base_price')    quantity = product.get_attribute('quantity')        # Volume discount    if quantity >= 100:        discount = 0.15    elif quantity >= 50:        discount = 0.10    elif quantity >= 10:        discount = 0.05    else:        discount = 0        unit_price = base_price * (1 - discount)    total_price = unit_price * quantity        return {        'unit_price': unit_price,        'total_price': total_price,        'discount_percent': discount * 100    }

Validation Script

python
def validate_configuration(product):    errors = []        power = product.get_attribute('power_rating')    voltage = product.get_attribute('voltage')        # High power validation    if power >= 7.5 and voltage == '220V':        errors.append({            'field': 'voltage',            'message': 'Motors 7.5kW and above require 380V or 440V'        })        return errors

Quote Management

Creating a Quote

python
# Quote creation workflowquote = Quote.create({    'customer': customer_id,    'opportunity': opportunity_id,    'currency': 'USD',    'valid_until': date.today() + timedelta(days=30)})# Add line itemsquote.add_line({    'product': motor_config,    'quantity': 10,    'pricing_method': 'standard'})# Apply quote-level discountquote.apply_discount({    'type': 'percentage',    'value': 5,    'reason': 'New customer promotion'})

Approval Workflow

Configure approval rules:

yaml
Approval Rule: High Value QuoteCondition: quote.net_value > 100000Approvers:  - Sales Manager  - Finance (if discount > 20%)  - Legal (if custom terms)Escalation: 48 hours

S/4HANA Integration

Real-Time Pricing

Fetch prices from SAP:

python
# Get pricing from S/4HANAdef get_erp_price(material_number, quantity, customer):    result = sap.call_bapi('BAPI_PRICES_CONDITIONS', {        'MATERIAL': material_number,        'QUANTITY': quantity,        'CUSTOMER': customer,        'SALES_ORG': '1000'    })        return result.get('NET_PRICE')

Order Creation

Push orders to S/4HANA:

python
def create_sap_order(quote):    order_data = {        'SALES_ORG': quote.sales_org,        'CUSTOMER': quote.customer_number,        'PO_NUMBER': quote.po_number,        'ORDER_ITEMS': []    }        for line in quote.lines:        order_data['ORDER_ITEMS'].append({            'MATERIAL': line.material_number,            'QUANTITY': line.quantity,            'UNIT_PRICE': line.unit_price        })        result = sap.call_bapi('BAPI_SALESORDER_CREATEFROMDAT2', order_data)    return result.get('ORDER_NUMBER')

Inventory Check

Real-time availability:

python
def check_availability(material, quantity, plant):    result = sap.call_bapi('BAPI_MATERIAL_AVAILABILITY', {        'MATERIAL': material,        'PLANT': plant,        'UNIT': 'EA',        'CHECK_RULE': 'B'  # ATP check    })        return {        'available': result.get('AV_QTY_PLT') >= quantity,        'quantity': result.get('AV_QTY_PLT'),        'date': result.get('DISPONIBILITY_DATE')    }

Multi-Regional Deployment

Multi-Currency Setup

yaml
Currency Configuration:  Base Currency: USD  Supported:    - EUR (conversion from S/4HANA)    - GBP (conversion from S/4HANA)    - JPY (conversion from S/4HANA)  Update Frequency: Daily  Source: SAP Exchange Rates

Multi-Language

python
# Language-specific contentproduct.set_translations({    'EN': {        'name': 'Industrial Motor',        'description': 'High-efficiency motor for industrial use'    },    'DE': {        'name': 'Industriemotor',        'description': 'Hocheffizienter Motor für industriellen Einsatz'    },    'ES': {        'name': 'Motor Industrial',        'description': 'Motor de alta eficiencia para uso industrial'    }})

Document Generation

Quote Document Template

html
<!-- SAP CPQ Document Template --><html><head>    <title>Quote #{{quote.number}}</title></head><body>    <header>        <img src="{{company.logo}}" />        <h1>{{quote.title}}</h1>    </header>        <section class="customer">        <h2>Prepared For</h2>        <p>{{customer.name}}</p>        <p>{{customer.address}}</p>    </section>        <section class="lines">        <table>            {{#each quote.lines}}            <tr>                <td>{{product.name}}</td>                <td>{{quantity}}</td>                <td>{{format_currency unit_price}}</td>                <td>{{format_currency total_price}}</td>            </tr>            {{/each}}        </table>    </section>        <section class="total">        <p>Subtotal: {{format_currency quote.subtotal}}</p>        <p>Tax: {{format_currency quote.tax}}</p>        <p><strong>Total: {{format_currency quote.total}}</strong></p>    </section></body></html>

Best Practices

1. Performance Optimization

  • Limit rule complexity
  • Use caching for pricing lookups
  • Batch S/4HANA calls
  • Lazy-load option values

2. Maintainable Product Models

DO:- Use inheritance for similar products- Centralize common rules- Document all constraintsDON'T:- Duplicate configuration logic- Hard-code prices in rules- Create overly complex conditions

3. Testing Strategy

  • Unit test individual rules
  • Integration test S/4HANA connections
  • UAT with real product combinations
  • Performance test with production data volumes

4. Change Management

  • Use staging environments
  • Version control configurations
  • Test before production deployment
  • Plan for rollback

Migrating from Legacy CPQ

If migrating from an older system:

  1. Audit current configuration — Document all rules and pricing
  2. Clean up products — Remove obsolete SKUs
  3. Simplify where possible — Reduce complexity
  4. Test extensively — Validate migrated configurations
  5. Train users — New interface, same outcomes

Next Steps

Now that you understand SAP CPQ basics:

  1. Set up a sandbox — Practice in a safe environment
  2. Build simple products first — Master the basics
  3. Connect to S/4HANA — Test integration scenarios
  4. Create document templates — Customize quote output

For expert help with your SAP CPQ implementation, contact our consultants.

Need Expert CPQ Help?

Our certified CPQ consultants can help you implement best practices and optimize your quote-to-cash process.

Get in Touch