Resources /
Blog

Salesforce CPQ Data Migration: How to Move Config-as-Data Without Breaking It

Submit your details to get a book

10
Min Read
Resources /
Blog

Salesforce CPQ Data Migration: How to Move Config-as-Data Without Breaking It

Download

Submit your details to get a book

10
Min Read
Salesforce CPQ Data Migration: How to Move Config-as-Data Without Breaking It
Salesforce CPQ Data Migration: How to Move Config-as-Data Without Breaking It

Salesforce CPQ stores its configuration as data: thousands of connected records covering price rules, product rules, product options, bundles, discount schedules, and lookup queries.

To migrate it safely, you have to load those records in the right sequence, keep every relationship intact, mask sensitive information, check the outcome, and hold on to a rollback option in case a load fails.

Any Salesforce CPQ data migration depends on that mix of careful planning, dependency management, and validation. It’s how you preserve data integrity without disrupting the business processes that already run on it.

At a high level, a CPQ migration moves five groups of records. The catalog covers products, bundles, features, options, and configuration attributes. Pricing takes in price book entries, price rules with their conditions and actions, discount schedules, and price dimensions.

Then there are the rules themselves: product rules with their error conditions and actions, configuration rules, and lookup queries. Quote and document templates means the quote template plus its sections, content, and line columns.

Last come the transactional records (quotes, quote lines, orders, contracts, subscriptions, and assets), which make up the install base you may or may not carry forward.

Move those groups correctly and the destination org will quote exactly as the source did. Get it wrong and the load may fail. Worse, it may load configuration that looks fine and still prices the wrong deal.

This guide explains the object model, the load order, and a safe way to move it, for Revenue Cloud (formerly Agentforce Revenue Management) or a third-party CPQ. It’s the foundation of a broader Salesforce CPQ migration strategy, one that moves data without breaking what sales teams, revenue operations, finance teams, and other users depend on.

What "CPQ data migration" actually means (and why it's not a lift-and-shift)

Salesforce CPQ keeps its configuration as records in custom objects within the Steelbrick SBQQ__ namespace, not as metadata. Each price rule and product option is a row, and a lookup query refers to another row in a custom lookup object. That distinction shapes everything that follows: CPQ data is a connected data model whose dependencies you have to understand before migrating.

Two consequences follow. Change sets and metadata deployments can’t move CPQ configuration, because there’s no metadata to move. The records have to be exported and loaded into the destination, with all the relationship-integrity issues that come with moving interdependent data between orgs.

Legacy data makes it harder when older records, redundant data, custom logic, or integrations no longer reflect current business processes. And if the destination is Revenue Cloud, nothing is being copied over. Revenue Cloud relies on a largely standard object model that differs from the SBQQ__ schema, so the work is re-implementation and data transformation, not a lift-and-shift.

The destination doesn’t change the underlying problem, though. Pick Revenue Cloud or a third-party CPQ, and interdependent configuration data still has to leave the source org intact.

Questions about whether, when, and where to move belong in the CPQ to Revenue Cloud migration hub, and the phase-by-phase plan is in the CPQ migration checklist.

This page picks up after that decision: moving the data safely. It covers how a complete migration maps data to the destination model to account for differences between systems, and how the transition touches connected CRM systems, order management, billing, contracts, subscription processes, and other integrations where those are in scope.

Is Salesforce CPQ going away?

Salesforce CPQ reached End of Sale in March 2025, which means Salesforce no longer sells it to new customers. The product itself keeps working. Existing customers retain full access and support, can renew, and may still add licenses.

No end-of-life date has been announced. That makes migration planning a strategic decision, not a response to an invented deadline. Scope the project around your own timeline, and be skeptical of any vendor that presents it as an emergency.

The migration hub helps with whether and when to move. It shows how a Salesforce CPQ migration starts with a business-led plan based on actual requirements, system complexity, customer needs, implementation priorities, and the capabilities the company expects to enable across the revenue lifecycle.

The CPQ data model: configuration stored as data

CPQ’s power comes from the fact that nearly everything an admin creates is a record you can query, export, and load. That same structure is what makes migration difficult. Each object connects to others through lookup relationships, and if a lookup points at a record that hasn’t been loaded yet, the relationship breaks.

Those dependencies matter most when you’re migrating products, pricing, rules, and other CPQ data in large volumes. Here’s how the configuration maps to its data:

CPQ object (API name) What it is Depends on / points at
ProductProduct2 The base catalog record for every sellable item and bundle Foundation; load early. May point at a Discount Schedule
Price Book EntryPricebookEntry A product's price within a price book Product and Price Book
Product FeatureSBQQ__ProductFeature__c A group of options inside a bundle Parent bundle Product
Product OptionSBQQ__ProductOption__c A child product available in a bundle Parent bundle Product, optional (child) Product, and Product Feature; may point at a Discount Schedule
Configuration AttributeSBQQ__ConfigurationAttribute__c A bundle-level field, often a picklist, that the user sets when configuring Parent bundle Product, and optionally a Product Feature
Discount Schedule plus tiersSBQQ__DiscountSchedule__c Volume or term-based discounting Referenced by Products and Product Options; tiers depend on their parent schedule. Load before referencing products, or in a second pass
Product RuleSBQQ__ProductRule__c Validation, selection, alert, and filter logic during configuration Rule header; points at a custom lookup object if lookup-based. Conditions, actions, and configuration rules point at it
Error ConditionSBQQ__ErrorCondition__c The "when" that fires a Product Rule Parent Product Rule (and a Summary Variable, if used)
Product ActionSBQQ__ProductAction__c The "then" a Product Rule performs Parent Product Rule and target Product
Lookup QuerySBQQ__LookupQuery__c Data-driven condition for product or price rules Parent Product Rule or Price Rule, plus the custom lookup object and its rows
Configuration RuleSBQQ__ConfigurationRule__c Ties a Product Rule to a specific bundle or product Product Rule and Product
Price RuleSBQQ__PriceRule__c Pricing automation Rule header; points at a custom lookup object if lookup-based. Conditions and actions point at it
Price ConditionSBQQ__PriceCondition__c The "when" for a Price Rule Parent Price Rule
Price ActionSBQQ__PriceAction__c The "then" for a Price Rule Parent Price Rule and target field
Quote TemplateSBQQ__QuoteTemplate__c The output document definition Template header; load before its sections and line columns
Template Content / Section / Line Column The parts of the quote document Template Content stands alone; Sections point at the Quote Template and Template Content; Line Columns point at the Quote Template
Transactional data below this line (decide whether to carry it)
Quote / Quote LineSBQQ__Quote__c / SBQQ__QuoteLine__c An actual quote and its lines Quotes point at Account, Opportunity, and Price Book; Quote Lines point at the Quote, Product, and related configuration records
Order Product / Contract / Subscription / Asset The install base needed for renewals and amendments Orders, Accounts, Products, and Contracts; Subscriptions also point at their originating Quote Lines

Everything above the divider is configuration: the catalog, pricing rules, product logic, and documents. Below it sits the transactional data, the record of what you’ve actually sold.

Migrating the install base is a genuine decision, not an automatic step. If renewals and amendments have to run in the new system, bring that data across. If the new system starts clean while the old one stays available for legacy contracts, you may not need to. Either way, make the choice deliberately, because transactional objects account for the largest volume in the entire migration.

Why order of operations is the whole problem

These records have deep lookup relationships, and some point back to themselves, so you can’t load them in whatever order you like. The sequence isn’t a preference. Referential integrity enforces it, and every failure mode below comes from ignoring that.

Load a Product Option before its parent and child Product2 records exist, and the insert either fails outright or leaves an orphaned record that points nowhere. Load a Price Rule before its Price Conditions and Price Actions, and the automation either sits idle or throws an error. The rule is there, but the logic that makes it act is missing.

Lookup Queries fail more quietly. When a Product Rule references a Lookup Query whose custom lookup object and rows haven’t been created yet, the rule silently does nothing in production. There’s no error. It simply never fires.

Self-referencing (circular) records, where a record has to exist both before and after a related record, can’t be resolved in one pass. You insert the records first, then run an update that sets the references once both sides exist.

Record IDs also differ between orgs. The 18-character ID a record has in the source won’t be the one it’s assigned in the target, so any lookup that relied on the original ID has to be redirected with ID remapping or external IDs. Otherwise the relationship can fail without any obvious sign.

This is where CPQ migration gets genuinely risky: a bad migration doesn’t always trigger an obvious error. A configuration can load successfully, look correct at first glance, and still put the wrong price on a live quote. That’s more dangerous than a failed load, which at least stops the process. A silent error can travel all the way into a customer-facing transaction before anyone notices.

So the validation step later in this guide is non-negotiable. Sequence the work deliberately, then prove the result before go-live.

The table below reduces the actual object dependency chain to five phases. Within each phase, load the objects in the order shown, and finish one phase before you move on to the next.

PhaseLoad in this orderWhy
1. CatalogPrice Book, then Product, then Product Feature, then Product Option, then Configuration Attribute, then Price Book EntryEverything else references products; options need parent and child products to exist first
2. RulesProduct Rule, then Error Condition, then Lookup Query, then Product Action, then Configuration RuleRule children and lookups only make sense once the parent rule and its lookup targets exist
3. PricingPrice Rule, then Price Condition, then Price Action (plus Discount Schedule, Price Dimension)Conditions and actions are children of the price rule; discounts attach to catalog
4. TemplatesQuote Template, then Template Section, then Template Content, then Line ColumnDocument parts are children of the template
5. Transactional (optional)Quotes, Orders, Contracts, Subscriptions, AssetsOnly if you are carrying the install base for renewals or amendments; heaviest volume, migrate last

Two rules govern the sequence. Circular or self-referencing records can’t be handled in a single load, so they need an insert pass followed by an update. And every cross-org load needs ID remapping, so relationships point to the new record IDs rather than the old ones.

How to migrate CPQ data safely, step by step

The method below is tool-neutral, and most of it can be done by hand. Each step is here for a reason: skip even one and migrations tend to fail, whatever the tooling.

Inventory and map the configuration

Before you move anything, record every CPQ object in use and what it depends on. Then decide what truly needs to move: the active configuration and the install base you actually need, not every dormant rule someone built three years ago. A migration is a sensible time to leave obsolete configuration behind.

If the destination is Revenue Cloud or another CPQ built on a different model, mapping the old model's fields and objects to the new one is separate work. This page stays focused on moving data safely, and the mapping details live in the CPQ to Revenue Cloud data mapping guide.

Migrate in dependency order

Follow the phased load order above: parents first, then children, and lookup targets before the queries that refer to them. For self-references, insert the row and then update it. Re-point IDs at every cross-org hop. This is the mechanical core of the migration, and it’s the part most likely to cause silent breakage if it’s rushed or done out of sequence.

Mask sensitive data before it leaves production

Quotes, accounts, and contacts hold personal data. Once that data moves into a sandbox, a staging org, or a partner-built environment, people and systems that never had access can see it.

In a regulated industry, masking is a control, not a matter of style. Sensitive fields have to be masked before the data leaves production, so what lands downstream is realistic in structure but safe in content. This is a requirement, not a nice-to-have.

Rehearse in a seeded sandbox

Before you touch production, load everything into a sandbox populated with representative CPQ data. The rehearsal is where you catch ordering bugs, missing lookup objects, and IDs that failed to remap, while those errors are still cheap to fix.

How much the rehearsal tells you depends on how closely the seed data matches the shape of production data. Salesforce sandbox seeding covers building a representative environment and testing the migration there, including the checks specific to CPQ migration.

Validate by comparing source and target

This is the step that catches silent failures. Take a snapshot of the source before loading, run the load, then capture the target and compare the two. Check that every relationship made it across and that the price outputs are identical.

A migration isn’t finished just because the load reports no errors. It’s finished when you can show that the destination produces the same deals, at the same numbers, as the source. Anything short of that lets silent orphans into production.

Keep a rollback path

Plan for the load that fails halfway, or the one that reaches production with broken configuration. You need a clean way to reverse it, not a frantic effort to delete thousands of interdependent records while sales is trying to get a quote out.

A proper rollback path can be the difference between a bad afternoon and a bad quarter. Decide exactly how the load would be undone before go-live, and prove it works in rehearsal.

Manual vs automated CPQ data migration

You can move CPQ data manually. Many teams start with Data Loader, Salesforce Inspector, spreadsheets, and VLOOKUP to match old IDs with new ones, and for a small, straightforward catalog that may be enough. The limits get much harder to ignore as the organization grows and its regulatory requirements tighten.

Task Manual (Data Loader, Inspector, spreadsheets) Automated (dependency-aware migration)
Load order You build and enforce it by hand Determined and enforced by the tool
Self-references Manual insert-then-update passes Handled automatically
ID remapping VLOOKUPs or external ID upserts, which are error-prone across many related objects Re-pointed automatically during the load
Repeatability Hard to run identically across sandbox and production The same run in every environment
PII masking Not included Built into many tools
Validation Manual and often skipped under time pressure Automated, such as snapshot comparison
Rollback Deleting records by hand, often under pressure A defined reversal path

To be honest about it, manual migration is slow, often introduces errors during ID remapping, is hard to reproduce exactly from sandbox to production, and has no built-in masking, validation, or rollback. A dependency-aware automated process handles the ordering, the insert-then-upsert logic, and the ID remapping. It also supplies the masking, snapshot comparison, and rollback the safe method above calls for.

How Flosum's Data Migrator makes the move safe

Flosum's Data Migrator transfers Salesforce data from one org to another while mapping dependencies and maintaining referential integrity. That goes straight at the problem this page has been describing: loading configuration as data in the right order and re-pointing relationships between orgs.

It maps directly onto the phased load-order table above. Instead of sequencing objects by hand and hoping the lookups hold, you let the tool load them by dependency and keep the relationships intact. Four capabilities line up with the four hard parts you just read about:

  • Dependency mapping and referential integrity. Data Migrator maps the dependencies and preserves the relationships across the load. That’s the answer to the phased load order.
  • Sandbox seeding from prebuilt CPQ and Revenue Cloud templates. Think of it as the “rehearse before production” step turned into a named capability: seed a sandbox with representative CPQ data and run the full load where mistakes are free. See sandbox seeding.
  • PII masking. Sensitive quote and account data is masked before it lands in a lower environment. It’s the control that lets regulated teams rehearse with realistic data without moving live personal data into a sandbox.
  • Validation and rollback. Data Migrator can validate the migration and compare snapshots to catch broken references before go-live, and Flosum DevOps provides the rollback path if a load goes wrong. The manual path has no safety net like that.

Two points need to be clear. First, Flosum is destination-neutral. Revenue Cloud or third-party CPQ, the source-side challenge is the same (move interdependent configuration data out of the org without damaging it), and Flosum handles that part safely without favoring either.

Just as important, Flosum isn’t a CPQ, and it doesn’t convert a CPQ configuration into the Revenue Cloud model. It moves configuration as data between orgs and into sandboxes and staging, preserves integrity, masks PII, validates the load, and rolls back a bad one. Mapping and rebuilding the configuration in Revenue Cloud's model, or in a third-party CPQ's model, is the implementation team’s job. Flosum secures the move. The redesign is still yours.

For regulated buyers, the safety case has to rest on what the system does (dependency and referential integrity, masking, validation, and rollback), not on marketing claims. It also has to run in an environment designed for financial services, healthcare, life sciences, and public sector teams working under frameworks such as HIPAA, SOC 2, DORA, GxP, and 21 CFR Part 11. 

FAQs

What is Salesforce CPQ data migration?
This process moves CPQ configuration and transactional records from a Salesforce org to a new destination, such as Revenue Cloud or a third-party CPQ. Since CPQ configuration is stored as data in custom objects, change sets and metadata deployments cannot move it. Instead, the interdependent records must be migrated in a specific order.
Is Salesforce CPQ being discontinued?
Salesforce CPQ reached End of Sale in March 2025, so it's no longer available to new customers. Existing customers still have full access, support, and renewals, and they can add licenses. Salesforce has not announced an end-of-life date. There is no hard deadline, then, just a strategic reason to plan a move.
Why can't you migrate CPQ data with change sets?
Change sets and metadata deployments move metadata rather than records. CPQ configuration (price rules, product rules, product options, bundles, discount schedules, and lookup queries) is stored as data in custom objects, so it must be exported and loaded as records in dependency order, with relationships redirected across orgs.
What order do you migrate CPQ objects in?
Start by loading the catalog: price books, products, features, options, configuration attributes, and price book entries. Next come the rules (product rules, error conditions, lookup queries, actions, and configuration rules), followed by pricing data: price rules, conditions, actions, and discount schedules. Load quote templates after that, with transactional records last. Parents must be loaded before their children, and lookup targets before the queries that reference them.
Can CPQ data migration be automated?
Yes. Dependency-aware migration tools establish the right load order, manage insert-then-update passes for self-references, remap record IDs between orgs, mask sensitive data, check the results, and roll back any load that fails. Manual methods with Data Loader or Salesforce Inspector can work, but they take longer and pose a greater risk to relationship integrity.
How do you test a CPQ migration before go-live?
Run the complete load in a sandbox populated with representative CPQ data. Mask any PII beforehand, then compare snapshots of the source and target to verify that all relationships remain intact and the pricing outputs match. Keep a rollback path available in case the production load fails or introduces broken configuration.

Book a Data Migrator demo to watch Flosum load a CPQ catalog in dependency order, mask sensitive fields, and validate the result before anything reaches production.

‍

Table Of Contents
Author
Stay Up-to-Date
Get flosum.com news in your inbox.

Thank you for subscribing

Ship Salesforce changes faster
Teams on Flosum report 40% higher development velocity and 75%
fewer merge conflicts.
Free to start  |  No credit card required