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.
| Phase | Load in this order | Why |
|---|---|---|
| 1. Catalog | Price Book, then Product, then Product Feature, then Product Option, then Configuration Attribute, then Price Book Entry | Everything else references products; options need parent and child products to exist first |
| 2. Rules | Product Rule, then Error Condition, then Lookup Query, then Product Action, then Configuration Rule | Rule children and lookups only make sense once the parent rule and its lookup targets exist |
| 3. Pricing | Price 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. Templates | Quote Template, then Template Section, then Template Content, then Line Column | Document parts are children of the template |
| 5. Transactional (optional) | Quotes, Orders, Contracts, Subscriptions, Assets | Only 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?
Is Salesforce CPQ being discontinued?
Why can't you migrate CPQ data with change sets?
What order do you migrate CPQ objects in?
Can CPQ data migration be automated?
How do you test a CPQ migration before go-live?
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.
Thank you for subscribing




