{"title":"Upgrade guide — v19 to v20 — E-commerce","slug":"upgrade-guide-v19-to-v20-ecommerce","url":"https://support.storeconnect.com/articles/upgrade-guide-v19-to-v20-ecommerce","url_markdown":"https://support.storeconnect.com/articles/upgrade-guide-v19-to-v20-ecommerce.md","subtitle":null,"summary":"Upgrade steps for all stores moving from v19 to v20, covering new cart objects, deprecated fields, Liquid template renames, and behavior changes.","type":"Release_Notes","video_url":"","keywords":null,"last_modified":"2026-08-21T07:12:35+0000","body_markdown":"This section applies to all stores. Make sure you review every subsection.\n\n\n## Salesforce package changes\n\n### Review: New cart objects\n\nv20 adds three new objects to support saved shopping carts. Object permissions are already included in the standard StoreConnect permission sets — no manual permission assignment is needed for the out-of-the-box sets.\n\n| Object | Purpose | Standard permission sets |\n|---|---|---|\n| `Cart__c` | Stores the shopping cart header, including addresses, customer metadata, source, and status | Administrator, Sync, Order Manager, Content Manager |\n| `Cart_Item__c` | Individual line items within a saved cart | Administrator, Sync, Order Manager, Content Manager |\n| `Cart_Campaign__c` | UTM campaign tracking data associated with a cart | Administrator, Sync, Order Manager, Content Manager |\n\nSee [Cart Object Reference](cart-object-reference) and [Cart Item Object Reference](cart-item-object-reference) for full field details. If you have created custom permission sets in your org, review whether those sets should include access to the new cart objects.\n\n1. If you use only the standard StoreConnect permission sets, no action is needed.\n2. If you have custom permission sets, navigate to **Setup \u003e Permission Sets**, open each custom set, and assess whether access to `Cart__c`, `Cart_Item__c`, and `Cart_Campaign__c` is appropriate for that set's audience.\n\n\n### Review: Deprecated objects and fields\n\nThe following objects and fields have been deprecated in v20. Their labels are now prefixed with `[DEPRECATED]`. Consider removing any references from automations, flows, validation rules, reports, and page layouts.\n\n| Deprecated item | Type | Action |\n|---|---|---|\n| `Product_Purchasable_Media__c` | Object | Remove references from flows, reports, and page layouts |\n| `Product_Purchasable_Media__c.Media_Id__c` | Field | Remove from page layouts and any automation referencing this field |\n| `Product_Purchasable_Media__c.Product_Id__c` | Field | Remove from page layouts and any automation referencing this field |\n| `Trait_Category__c.Display_As_Filter_Top_Level__c` | Field | Remove from page layouts and any automation referencing this field |\n\n1. In Salesforce **Setup**, search **Flows**, **Process Builder** processes, and **Validation Rules** for references to the deprecated objects and fields above.\n2. Search your **Reports and Dashboards** for any that include these fields or objects.\n3. Remove or update any references found.\n\n\n### Review: New fields on existing objects\n\n| Object | New field | Purpose |\n|---|---|---|\n| `Zone__c` | `Strict__c` | Enables strict address matching for an individual zone |\n| `Payment__c` | `Fingerprint__c` | Payment fingerprint, auto-assigned for manual payments |\n| `Payment_Provider__c` | `Channel__c` | Payment provider channel identifier |\n\nReview whether any of these fields should be added to your object page layouts. See [Configure zones for tax and shipping areas](zones) for documentation on zone configuration.\n\n## Liquid template changes\n\nThe `line_item` / `LineItem` concept has been renamed to `cart_item` / `CartItem` throughout StoreConnect Liquid. This affects template snippet keys, translation keys, Liquid drop properties, and cart controller parameters. All deprecated references still function in v20 but generate warnings in the Web Console and will be removed in a future version.\n\n### Action required: Update deprecated keys\n\nDeprecation warnings are logged to the Web Console in real time as pages are rendered.\n\n1. Open the **StoreConnect Web Console** for your store.\n2. Browse through your store — visit the cart page, checkout, and any custom pages that render cart or order data.\n3. In the Web Console log, use the **Warnings** filter to display only entries that triggered deprecation warnings.\n4. Click each flagged entry to see the warning detail. Each warning identifies the deprecated key and its replacement.\n5. Update the affected templates and re-browse those pages to confirm the warnings are resolved.\n\n### Action required: Update deprecated template keys\n\nIf your theme includes custom versions of these snippets or controllers, rename them using the replacement keys in the table below. See [CartItems Controller - Liquid Controller Reference](cart-items-controller-reference) for the current controller documentation.\n\n| Deprecated key | Replacement key |\n|---|---|\n| `snippets/shared/line_items/booking_details` | `snippets/shared/cart_items/booking_details` |\n| `snippets/shared/line_items/item` | `snippets/shared/cart_items/item` |\n| `snippets/shared/line_items/pricing` | `snippets/shared/cart_items/pricing` |\n| `controllers/line_items/destroy` | `controllers/cart_items/destroy` |\n\n\n### Action required: Update deprecated translation keys\n\nIf your store uses custom translations, update any entries using the replacement keys in the table below.\n\n| Deprecated key | Replacement key |\n|---|---|\n| `line_items.links.edit_bundle` | `cart_items.links.edit_bundle` |\n| `line_items.links.remove_item` | `cart_items.links.remove_item` |\n| `line_items.quantity` | `cart_items.quantity` |\n\n\n### Action required: Update deprecated Liquid drop properties\n\nSearch your templates for the deprecated property names below and update them using the replacement properties in the table below. See [Cart - Liquid Object Reference](cart-liquid-object-reference) and [DeliveryOptions - Liquid Object Reference](delivery-options-liquid-object-reference) for current drop documentation.\n\n| Drop | Deprecated property | Replacement property |\n|---|---|---|\n| `cart` | `bookable_line_items_valid_until` | `bookable_cart_items_valid_until` |\n| `delivery_options` | `line_item` | `cart_item` |\n\n\n### Action required: Update deprecated cart controller parameters\n\nIf your templates submit forms to `cart.update` or `cart.remove` Liquid controller actions using a `line_item` parameter, update them using the replacement parameters in the table below.\n\n| Action | Deprecated parameter | Replacement parameter |\n|---|---|---|\n| `cart.update` | `line_item` | `cart_item` |\n| `cart.remove` | `line_item` | `cart_item` |\n\n\n### Review: New Liquid drop properties\n\nThe following new properties are available in your Liquid templates.\n\n| Drop | Property | Type | Description |\n|---|---|---|---|\n| `subscription` | `renewal_order` | Order | The Order associated with the next subscription renewal |\n| `subscription` | `renewal_order_date` | Timestamp | Date when the renewal Order will be generated |\n| `order` | `checkout_step` | String | Current checkout step. The value `\"pending_renewal\"` identifies subscription renewal orders |\n| `cart` | `bookable_cart_items_valid_until` | Timestamp | Booking timer expiration for bookable items in the cart |\n\n\n## Behavior changes\n\n### Review: Returns no longer increase available-to-sell\n\nProcessing a return no longer increases the **Available to Sell** quantity on a product. Returned stock must now be manually adjusted back into inventory before it is made available for sale again.\n\n1. Review your current returns process. If you previously relied on StoreConnect automatically restoring stock on return, you will now need to manually adjust inventory or build your own automation to do so.\n2. Update any internal SOPs or documentation for your operations team to reflect this change.\n\n\n### Review: Strict zone matching\n\nIndividual zones can now be configured as strict using `Zone__c.Strict__c`. When enabled, a customer's address must exactly match the zone's criteria to qualify. Review your zones if any of your shipping or tax rules rely on zone matching behavior. See [Configure zones for tax and shipping areas](zones) for full zone configuration reference.\n\n1. In the StoreConnect Config app, navigate to **Zones** and review your existing zone records.\n2. Assess whether any zones should have strict matching enabled based on your shipping or tax requirements.\n3. If you enable `Strict__c` on any zones, test checkout flows with borderline addresses to confirm the behavior is correct.\n\n\n### Action required: Abandoned orders no longer created, review abandoned carts\n\nIn v19, when a customer started checkout but did not complete payment, StoreConnect created an order record to represent the incomplete checkout. These were commonly referred to as 'abandoned orders'.\n\nIn v20, this changed. A `Cart__c` record tracks the customer's intent from the moment they arrive at the store. An order is only created after the customer completes payment. There are no abandoned orders.\n\nIncomplete checkouts that have been idle beyond the configured abandonment window are processed by the automated abandoned cart job, which sets the `Abandoned__c` checkbox on the `Cart__c` record. The abandonment window defaults to 10 hours and is configurable per store via the `cart_abandoned_hours` Store Variable. Only carts with a **Source** of `web` are eligible — POS, API, and manual carts are never automatically abandoned.\n\n1. Identify any reports, list views, or dashboards that tracked abandoned orders. Recreate them using `Cart__c` records filtered by `Abandoned__c = true`.\n2. Identify any Flows, Process Builder processes, or automation triggered by abandoned orders — for example, recovery email campaigns or internal notifications. Update these to trigger on `Cart__c` records where `Abandoned__c` becomes true.\n3. Review the `cart_abandoned_hours` Store Variable on each store to confirm the abandonment window matches your business requirements.\n4. Confirm any external integrations that consumed abandoned order data are updated to consume `Cart__c` records instead.\n\nSee [Process empty and abandoned carts](abandoned-carts) and [Saved carts](saved-carts) for full documentation on how carts work in v20."}