Which open-source alternatives to Salesforce Commerce Cloud fit your team
Three self-hosted options cover most Salesforce Commerce Cloud exits. Magento Open Source fits catalog-heavy, multi-site stores that carry deep existing customization. Saleor fits headless builds that need a GraphQL API and per-channel pricing and currencies. Sylius fits teams with Symfony and PHP engineering capacity that want to own the commerce logic in code. The right choice depends less on feature lists and more on the skills you can staff and the customizations you must carry forward. Teams usually start looking when a renewal, a licensing change, a data residency requirement or cartridge sprawl makes the current setup expensive to change. Magento Open Source source files are licensed under OSL 3.0, but Adobe positions Adobe Commerce, with cloud hosting and AI merchandising, as its paid full-featured edition, so confirm early which features your store depends on and whether they exist in the open-source build. Sylius is MIT-licensed, and professional support is available through Sylius Plus. Before you compare platforms, confirm your own renewal terms and contract end dates with your Salesforce account team, and inventory every cartridge, custom pipeline and integration in your current environment. That list, not a vendor comparison, determines how much code must be rebuilt. A practical first check is to score each candidate against your top ten customizations and your Salesforce CRM and order-management integrations. Ask each option's maintainers or implementation partners which of those items are native, which need a module or extension, and which must be written from scratch. Keep in mind that a self-hosted platform moves hosting, security patching, upgrades and on-call operations to your team or to a partner you hire, so the staffing question should be answered before the platform choice is final.
How the open-source alternatives to Salesforce Commerce Cloud compare
Three self-hosted platforms cover most enterprise B2C replacement paths for Salesforce Commerce Cloud. Each differs in language, licensing and how much of the storefront it ships, so the choice depends on your team's skills and on how much of the existing cartridge logic you plan to rebuild.
Magento Open Source
Magento Open Source is a PHP monolith with a large module ecosystem, licensed under OSL 3.0. It suits catalog-heavy B2C teams that want a full storefront out of the box and a deep pool of experienced developers. Check which extensions you need, whether each one is maintained for your version, and how much custom code your cartridges contained. The main trade-off is upgrade effort, since heavy customization makes each release slower to adopt. Adobe Commerce is the paid edition with cloud hosting and AI merchandising, so confirm which features your business depends on before you plan.
Saleor
Saleor is a Python-based headless commerce platform under BSD-3-Clause that exposes everything through a GraphQL API. Its channel model handles per-channel pricing, currencies and stock, which maps well to multi-site and multi-currency setups that Salesforce sites often run. It fits teams with strong API and frontend skills who will build their own storefront. The main trade-off is that you own the storefront, so budget for frontend engineering, search, and content tooling that a suite would normally provide.
Sylius
Sylius is an MIT-licensed ecommerce framework built on Symfony and API Platform, with a REST API. It suits PHP teams that want to model complex catalogs, promotions and tax rules in code they fully control. Professional support is available through Sylius Plus, which is a separate commercial offer you should price against your in-house staffing. The main trade-off is that customization is code-first, so every business rule that lived in a Salesforce cartridge becomes a version-controlled module your team must test and maintain.
Which open-source option covers each Salesforce Commerce Cloud capability
This table maps typical enterprise B2C capabilities to Magento Open Source, Saleor and Sylius, and notes where each option needs custom code or a third-party module. Treat every cell as a starting point: confirm each capability against the option's current documentation and against your own feature inventory exported from your Salesforce Commerce Cloud implementation. Most gaps sit in cartridge-specific logic, B2B workflows and CRM connectors.
| Capability | Magento Open Source | Saleor | Sylius |
|---|---|---|---|
| Catalog and product model | Strong fit for large catalogs with configurable and bundled products; confirm attribute and category volume against your data | Flexible product types and attributes through GraphQL; model complex variants and confirm import tooling for your feeds | Product variants and attributes available; complex catalog rules often need custom Symfony development |
| Site and locale management | Multi-store and multi-website structures with store-view scoping; confirm the setup against your site count | Multiple channels can represent sites or markets; plan content and storefront build per channel | Channels support multiple sites; localized content and storefront typically built by your team |
| Multi-currency pricing | Multi-currency support in core; confirm tax and exchange rate handling with your finance team | Per-channel pricing and currencies are supported according to the project's documentation | Multi-currency channels available; confirm pricing lists and tax rules for each market |
| Promotions and discounts | Cart and catalog price rules in core; complex stacking may need custom modules | Discounts and vouchers available; confirm rule complexity against your current promotion list | Promotions and cart rules in core; advanced promotion logic often needs custom development |
| Checkout | Built-in checkout; payment and shipping connectors depend on modules or extensions | Checkout exposed through the API for headless storefronts; payment apps required per provider | Checkout workflow customizable in code; payment gateways usually added as plugins |
| Order management | Order lifecycle and admin tools in core; ERP and warehouse flows usually need integration work | Orders and fulfillment available through the API; confirm warehouse and multi-location needs | Order workflow extensible through Symfony state machines; ERP integration is custom |
| Customer accounts | Customer accounts and groups in core; confirm B2B account hierarchy needs separately | Customer accounts and permissions in the API; B2B hierarchies may need custom models | Customer management available; account hierarchies and approval flows generally custom |
| Search | Built-in search with engine dependency; confirm faceting and search engine hosting requirements | Search via API with configurable options; faceted search and merchandising often need an external engine | Search depends on a bundled or external component; plan an engine for faceted search |
| CRM and marketing integration | Connectors for CRM and marketing tools exist as extensions; confirm a Salesforce CRM connector against your objects | Integrates through webhooks and API; a Salesforce CRM connector is typically custom work | Integrates through API and events; a Salesforce CRM connector is typically custom work |
| B2B features | B2B capabilities are part of Adobe Commerce, the paid edition; confirm what Open Source lacks | B2B needs are usually built on top of the core; confirm company accounts and quoting | B2B needs are usually built with custom components or Sylius Plus; confirm scope |
| Cartridge extension model | No direct equivalent; modules replace cartridges and require re-implementation of hooks and overrides | No direct equivalent; extensions are built as apps or services against the API | No direct equivalent; bundles replace cartridges and need Symfony skills to port logic |
How cartridge customizations move to open-source code
Cartridge code does not port one to one. Pipelines, controllers, ISML templates and business logic written for Salesforce Commerce Cloud each need to be re-designed as modules, extensions or API services on the target platform. A pipeline that chains several steps in a fixed order usually becomes a service method or a workflow hook, an ISML template becomes a theme component or a front-end component that reads data from an API, and a controller becomes a route or an endpoint. The reader should expect the rewrite to change where logic lives, not just the language it is written in. Magento Open Source, Saleor and Sylius each separate these concerns differently, so the target design should be chosen before any cartridge is translated.
Before estimating anything, sort every cartridge and custom job into four groups. Keep covers code that is generic and can run unchanged on a new platform, such as small formatting helpers. Rebuild covers business rules that matter to the store but must be re-implemented in the target's module model, such as promotion logic or tax handling that depends on your jurisdictions. Replace covers functions better served by a SaaS service or an existing open-source module, such as search, reviews or payment connectors, where the team should compare the vendor or module against its own requirements. Retire covers features no one uses, which is often where the most savings come from. Each group needs an owner and a written decision.
The starting point is the actual cartridge inventory, and the reader must confirm it from their own codebase, deployment records and Salesforce contract rather than from memory or documentation. Ask the development team to list every cartridge, every custom pipeline and every scheduled job, with the integrations each one calls and the business owner who depends on it. Check the contract for any Salesforce-managed components, licensed add-ons or service terms that affect what can be exported or reused. Without this inventory, any plan for the rebuild rests on assumptions. This document also becomes the basis for a fixed-scope quote from any implementation partner, so it is worth completing before vendor conversations begin.
What the multi-year cost of self-hosting includes
This table sets the Salesforce Commerce Cloud subscription against the cost lines of a self-hosted open-source store, marking each as one-time or recurring and naming what moves it. Use it to build a written comparison over the full contract horizon, not the first year alone, because the largest open-source costs are usually people, integrations and upgrades rather than the license.
| Cost component | Who is paid or who carries it | One-time or recurring | What drives it up or down |
|---|---|---|---|
| Salesforce Commerce Cloud subscription | Salesforce, under your order form | Recurring | Renewal terms, contracted order volume, number of sites and add-on modules. Ask for the renewal uplift in writing. |
| Open-source license | Nobody for the core: Magento Open Source (OSL 3.0), Saleor (BSD-3-Clause) and Sylius (MIT) are free to use | Recurring at zero for the core | Paid add-ons or enterprise editions, such as Adobe Commerce or Sylius Plus, change this line. Confirm which features you need are in the free edition. |
| Hosting and infrastructure | Your cloud account, data center or contracted hosting provider | Recurring | Catalog size, peak traffic, number of storefronts, search tier, staging and disaster recovery environments |
| Implementation partner fees | Partner under a fixed-scope written agreement | One-time | Number of storefronts, currency and tax rules, checkout customization depth. Ask for deliverables and acceptance criteria per phase. |
| Data migration | Partner or internal team | One-time | Catalog and customer record volume, cartridge-era data quality, SEO redirect mapping, order history scope |
| Integration rebuild, including Salesforce CRM | Partner or internal integration engineers | One-time, with ongoing maintenance | Count of connected systems (CRM, ERP, OMS, payments, tax, PIM), whether APIs are documented, and how much cartridge logic must be re-expressed |
| Testing and security assessment | Independent testers and your security team | One-time, then recurring on each major release | Payment flow scope, number of customer-facing APIs, penetration test frequency, and compliance evidence requirements |
| Ongoing support, upgrades and patching | Retained partner, internal engineers or both | Recurring | Release cadence of chosen platform, number of custom extensions, and how closely modules track upstream versions |
| Internal platform engineers | Your payroll or contractors | Recurring | Team size needed for on-call, release management, catalog operations and security response. Usually the largest ongoing line, so model it explicitly. |
What you give up when you leave Salesforce Commerce Cloud
Moving off a managed commerce platform trades vendor-run services for work your team owns. Each card below names one loss, the workaround most teams use, and what to verify before you commit to a migration plan.
Vendor-managed hosting and uptime
A managed platform carries the hosting, scaling and availability commitments in its contract. Self-hosting moves that responsibility to you: you own the uptime target, the failover design and the on-call rota. The usual workaround is self-managed hosting with monitoring, load testing before peak trading periods, and a documented recovery runbook. Ask each candidate partner what availability they will commit to in writing and who gets paged at 2 a.m.
Bundled updates and security patching
Platform updates and security fixes arrive on the vendor's schedule. With open source, you pick the versions, test them against your cartridge-equivalent customizations and deploy them yourself. The workaround is a fixed patch cadence with a staging environment that mirrors production, plus subscription alerts for security advisories on every framework and extension you run. Confirm how long a critical fix is expected to take to reach your environment.
Native Salesforce ecosystem connectors
Pre-built connectors to Salesforce CRM and marketing tools save integration work that you will now need to rebuild. Expect to replace them with an integration layer or middleware that maps customer, order and consent data between the new commerce platform and your CRM. Document every field mapping, decide which system is the source of truth for customer records, and test order sync under failure conditions, not only the happy path.
Vendor support scope
Commercial support covers defined products, severity levels and response targets. Open-source projects offer community channels and, for some, paid support tiers from the maintainers or certified partners. Before you leave, list which incidents you have escalated to the vendor in the past year and check whether a support contract with the open-source vendor or an implementation partner covers the same cases. Ask for the response commitments in writing.
Built-in features that become modules
Capabilities such as advanced search, promotions engines, multi-site management and B2B account features may ship with the commercial platform but arrive as modules, extensions or custom code on open-source platforms. Some are mature third-party packages, others need building. Inventory every feature your storefront depends on, mark each as native, module or custom, and check the licence and maintenance status of each module before you commit to the target platform.
In-house staffing load
Running your own commerce platform requires engineers who know the framework, operations staff for hosting and security, and a product owner who sets priorities. These are recurring costs that rise with the number of storefronts, currencies and integrations. Cost comes from salaries or contractor days, infrastructure, and extension licences. Ask any implementation partner to break its quote into build, run and support components so you can compare it with your current vendor invoice.
What moving off Salesforce Commerce Cloud involves
The sequence turns an undocumented storefront into a tested, self-hosted platform, with each stage producing evidence that the next one can rely on. Nothing goes live until the catalog, customers, integrations and URLs have been checked against the current site.
Inventory cartridges, sites and integrations
Start by listing every cartridge, site, locale, currency, payment method, tax rule, promotion engine, Salesforce CRM sync, ERP or OMS connection, and third-party script on the current storefront. Your team provides access to the business manager, code repositories and integration owners, and the engagement produces a written inventory with each item tagged as keep, rebuild or retire. The step is done when the business owners have signed off on that list, because anything missing from it will surface later as a production gap.
Export and map catalog, customers, orders and content
Extract products, variants, categories, pricing, customer records, order history and content pages from the source platform, then map each field to the target data model of Magento Open Source, Saleor or Sylius. Ask your Salesforce administrators which export tools and API permissions they can grant, and confirm with your legal and privacy teams which customer fields may be moved. The output is a mapping document plus a test load with reconciled record counts and a sample of spot-checked records.
Build and validate a pilot site
Stand up a pilot storefront in your own cloud account or data center with the mapped catalog, one site, one locale and one currency. The engagement covers configuration, the rebuilt checkout and payment flow, and the replacement for the most important cartridge logic, while your team reviews the business rules that the pilot must match. The pilot is complete when a test order can be placed, paid, tax-calculated, fulfilled and reported end to end without manual steps.
Run a parallel period with integration testing
Run the new platform alongside the existing store with real-time or scheduled sync to the CRM, ERP, tax, shipping and marketing systems. Your integration owners test each interface with production-like data, and the engagement documents failures, retries and reconciliation reports. The step closes when order, inventory and customer totals match across systems for a sustained test period agreed in the project plan.
Check SEO URLs and redirects before cutover
Crawl the current site and build a redirect map from every indexed URL, including faceted and localized paths, to its equivalent on the new platform. Your SEO and analytics teams confirm which URLs carry traffic, and the engagement tests the redirect rules, canonical tags, sitemaps and robots directives in staging. The check is complete when a crawl of the new site returns no unexpected 404 responses for mapped paths and analytics events fire as expected.
Execute a controlled cutover
Schedule the cutover window with the business, freeze catalog and pricing changes, run a final incremental data sync, switch DNS or the load balancer, and enable the redirect map. Your operations team holds rollback authority during the window, and the engagement monitors errors, payments, order flow and search traffic. The cutover is done when the first live orders reconcile in the CRM and ERP and the rollback plan has been formally closed.
Decommission the old subscription after retention checks
Before ending the Salesforce Commerce Cloud subscription, confirm with Salesforce in writing which data is available for export, how long it is retained after termination, and how deletion is certified. Your legal and finance teams keep the archived order, customer and tax records required by your policies, and the engagement documents the final data archive and handover. The step is complete when you hold a verified archive and written confirmation of the contract end date and data deletion terms.
Which open-source alternative to Salesforce Commerce Cloud fits each situation
When the main driver is data residency, the question is whether you can run the storefront, order data and customer records in your own cloud account or data center in the required region. Self-hosted options fit this need because the hosting location is your decision, but the platform choice then depends on how much of your stack you are prepared to operate. Magento Open Source and Sylius are full applications that run on your own infrastructure, while Saleor and Medusa are usually deployed as an API backend with a separate storefront.
- Hosting location: Confirm that every component, including search, caching, object storage, payment connectors and logs, can be placed in the required region.
- Backups and replicas: Check where backups and database replicas are stored, since a region-compliant primary can still replicate data elsewhere.
- Third-party services: Review which hosted tools, such as email, analytics or tax services, receive customer personal data.
- Access paths: Decide who in your organization and at your implementation partner can reach production data, and from which networks.
- Licensing terms: Read the license of each component, since Medusa's enterprise features require a commercial agreement with MedusaJS, Inc.
Before deciding, ask your legal and security teams to list each data category and the region rule that applies to it, then test the candidate platform against that list in a staging environment.
When a renewal or pricing change drives the move, the comparison has to cover the full cost of running a store, not only the absence of a license fee. Open-source platforms remove the platform license, but you then pay for hosting, engineering time, upgrades, security patching, and support contracts if you choose them. Magento Open Source is often considered by teams that already have PHP and Adobe Commerce experience, while WooCommerce suits smaller catalogs on WordPress, with the caveat that large B2C catalogs need more careful architecture.
- One-time costs: Migration of catalog, customers, orders, themes and integrations, plus the initial security review and load testing.
- Recurring costs: Cloud infrastructure, monitoring, backups, patching, third-party extensions and the internal or partner team that runs them.
- Cost drivers: Catalog size, traffic peaks, number of integrations and the frequency of platform upgrades all raise the running cost.
- Support model: Compare community support with paid support from the platform vendor or an implementation partner, such as Sylius Plus for Sylius.
- Quote request: Ask for a fixed-scope estimate that lists each component, the hours or roles involved, and the assumptions behind the hosting sizing.
Before deciding, build a three-year total cost model that compares your current renewal with staffing, hosting and support for each candidate platform.
When your Salesforce Commerce Cloud estate depends on many cartridges and custom pipelines, the migration is mainly a rewrite of business logic rather than a data move. Cartridge behavior such as promotions, pricing rules, checkout steps and content slots must be mapped to a target framework, and some of it may be better retired than rebuilt. Sylius, built on Symfony and API Platform, suits teams that want deep control of domain logic in code, while Saleor, with its GraphQL API, suits headless storefronts where the front end is rebuilt separately.
- Logic inventory: List every custom cartridge, hook and job, and classify each as keep, rewrite or retire.
- Framework skills: Sylius needs PHP and Symfony expertise, while Saleor needs Python and GraphQL skills plus a front-end team.
- Extension ecosystem: Magento Open Source has a large extension market, but each extension must be reviewed for maintenance status and compatibility.
- Pricing and promotions: Test complex price rules and promotions against your current results, since these are often the hardest behaviors to match.
- Upgrade path: Confirm how often the chosen framework releases breaking changes and how much custom code each upgrade touches.
Before deciding, ask for a cartridge-by-cartridge migration map and run your most complex pricing and checkout scenarios as acceptance tests.
When a regulated enterprise runs several storefronts, currencies and legal entities on one commerce foundation, the decision depends on how each platform models channels, catalogs and access control. Saleor supports per-channel pricing, currencies, stock and products, which maps well to multi-market setups. Sylius and Magento Open Source can also run multiple channels or stores, but the exact model, permission granularity and tax handling must be checked against your requirements. Medusa's role-based access control features sit in its Enterprise Edition, so account for that in the license review.
- Channel model: Confirm how the platform separates catalogs, prices, stock and tax per market and per legal entity.
- Access control: Map administrator roles to your segregation-of-duties policy and confirm which features need a commercial license.
- Audit logging: Check that changes to prices, permissions and orders are logged and that logs can be exported to your security tooling.
- Compliance evidence: Plan the controls, change records and access reviews that your auditors will request, since DeployOpen prepares evidence but auditors issue any assessment.
- Security testing: Schedule application and API testing for each storefront and integration before launch.
Before deciding, document your channel, access and audit requirements, then verify each one against a working multi-site proof of concept.
How much effort and cost does a migration away from Salesforce Commerce Cloud need
What drives the total cost of moving off Salesforce Commerce Cloud?
The total cost depends mostly on how much custom work sits inside your cartridges, how many sites, currencies and locales you run, and how many systems must be reconnected. Cost falls into a few components: the platform itself (open-source software carries no license fee, but Magento Open Source and Adobe Commerce differ in what you pay for), the build and migration project, hosting and infrastructure, and ongoing operations. Some costs are one-time, such as data migration, storefront rebuild and testing. Others recur, such as hosting, security patching, upgrades and developer time. Ask any provider for a quote that separates these lines, lists the cartridges and integrations in scope, and states which systems are excluded.
How long does a migration from Salesforce Commerce Cloud usually take?
Timeline is set by scope, not by the platform name alone. The main factors are the number of storefronts and markets, the volume of custom cartridge logic that must be rewritten, the number of integrations (CRM, order management, payment, tax, ERP, marketing tools), and how much data must be moved and validated. Your team's availability for decisions and testing matters as much as developer capacity. Ask for a written plan with phases, such as discovery, data mapping, build, integration testing, parallel run and cutover, and check which phases depend on your own teams delivering inputs on time.
Can an in-house team migrate from Salesforce Commerce Cloud without outside help?
Some teams can, particularly those with experienced engineers in the chosen framework and a clear, limited scope. The harder parts are usually not the storefront but the edges: rebuilding pricing and promotion logic, preserving URLs and redirects, reconnecting the CRM and fulfillment systems, and proving that payments, tax and order flows behave correctly under load. Be honest about bench capacity. A migration runs alongside normal releases, so ask whether the team can staff the build and keep the live store stable at the same time. A fixed-scope engagement can cover part of the work, such as integration, testing or hardening, while your team keeps ownership.
What staffing does an open-source commerce platform need after launch?
After launch, you carry the work that a managed platform used to absorb. This includes:
- Applying security patches and framework upgrades on a schedule
- Operating hosting, databases, search, caching and backups
- Maintaining integrations and payment or tax connectors when vendors change their APIs
- Monitoring performance, incidents and on-call response
- Running regular security testing and keeping compliance evidence current
Small teams often under-count the recurring load. Ask providers to describe the roles needed (for example, platform engineer, frontend developer, site reliability and security support), how many hours each role typically spends per month, and whether support and upgrades are offered as a retainer.
How do you protect SEO rankings and URL redirects during a migration?
Protect rankings by mapping every indexed URL from the old site to its new destination before launch, then testing those redirects in a staging environment. Export the existing URL structure, product and category paths, canonical tags, hreflang settings for multi-market sites, and sitemaps. Keep the old site running until the new store has been verified, and monitor crawl errors, traffic and indexed pages for several weeks after cutover. Confirm that your provider's plan includes a redirect map, a validation step and a rollback path, and ask who owns the search console and analytics configuration during the switch.
How is the CRM integration rebuilt when leaving Salesforce Commerce Cloud?
The integration is rebuilt as a set of explicit data flows rather than a single connector. Start by inventorying what Salesforce Commerce Cloud sends and receives today: customers, orders, carts, pricing, promotions, service data and marketing events, plus which Salesforce objects they touch. Then decide which system owns each record. Your CRM may remain the system of record for customers, with the commerce platform syncing orders and profiles through APIs or an integration layer. Plan for identity matching, consent flags, duplicate handling and error queues. Ask for an interface specification and an integration test plan before build work begins.
How do Magento licensing and Adobe Commerce compare with Saleor or Sylius?
Magento Open Source source files are licensed under OSL 3.0, and Adobe positions Adobe Commerce as its paid, full-featured edition with cloud hosting and AI merchandising. Saleor is BSD-3-Clause and Sylius is MIT licensed, so the code itself carries no license fee in either case. The cost difference lies in what you build and run. Magento has a large extension ecosystem and a familiar operating model, but you may need to decide whether you need features that only the paid edition includes. Saleor is GraphQL-first and Sylius is built on Symfony with a REST API, which suits teams building custom or headless storefronts. Ask each candidate to confirm the license terms for the exact components you plan to use, and to name any commercial support or enterprise features required for your scope.
How DeployOpen scopes, migrates and supports the replacement
DeployOpen plans, implements, customizes, integrates, hardens, backs up, upgrades, documents and supports self-hosted open-source platforms inside your own cloud accounts, data centers or air-gapped networks. For a move away from Salesforce Commerce Cloud, the work starts with a written scope that maps your cartridge customizations, CRM links and site footprint before any platform is chosen.
How we scope
- Engagements are fixed-scope, with scope, deliverables and timelines agreed in writing before work starts.
- The written scope lists each storefront, currency, locale and checkout flow that must move across.
- Scope also inventories Salesforce CRM and other system integrations that the new platform must re-establish.
- Ongoing support, upgrades and continuous testing are available as a retainer after handover.
How we build
- Cartridge logic is re-expressed as platform modules, APIs or services on the chosen open-source stack.
- Multi-site, multi-currency and per-channel pricing rules are configured and tested against your written requirements.
- Security testing of applications, APIs and infrastructure runs against the new storefront before launch.
- Hardening, backup and recovery steps are built into the self-hosted environment inside your own infrastructure.
How we hand over
- Architecture, configuration and integration documentation is delivered as part of the written scope.
- Data migration plans cover products, customers, orders and content, with validation steps agreed in advance.
- Runbooks cover upgrades, backups, monitoring and incident response for the team that will operate the platform.
- Compliance evidence is prepared for your assessors, though audit reports and certifications come from independent bodies.
How we support
- A retainer can cover platform upgrades, patching and ongoing security testing after go-live.
- Support terms, response expectations and included services are confirmed in writing before the retainer starts.
- Ask any provider to confirm which components are covered by support and which remain your team's responsibility.
- Quotes follow from the written scope, so ask for line items by component, one-time work and recurring costs separately.

