From 6de16d3385420c44f57ee5f9a75ab7837dfa7117 Mon Sep 17 00:00:00 2001 From: Devin Michael Date: Mon, 7 Sep 2026 14:50:39 +0700 Subject: [PATCH 1/7] Point campaigns SDK redirects at real sections, not the site root MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit All 43 rules moving /docs/campaigns/* to cart-sdk.nextcommerce.com pointed at https://cart-sdk.nextcommerce.com/latest/. Search Console flagged 38 URLs as "Blocked by robots.txt" on 2026-09-07: Google follows the redirect, finds cart-sdk's Disallow-all robots.txt, and attributes the block to the source URL. Unblocking cart-sdk (its DOCS_BASE_URL is being set separately) fixes the robots half but not this half — 35 distinct pages collapsing onto one destination is a soft-404 pattern, so the URLs would move from "Blocked" to "not indexed" rather than recover. Each rule now targets the section that absorbed the old page. The SDK site consolidated ~160 narrative pages into six reference pages plus the page-type guides, so the mapping is many-to-one; every destination page and every anchor was verified against the built site. Two deliberate gaps: - FOMO gets no rule, and the /docs/campaigns/utilities/* catch-all is dropped so it cannot swallow those paths. The feature is gone from the SDK (no matches in src/), so a 404 is the honest answer. - /docs/campaigns/campaign-cart/cart-system is unlisted; the generic campaign-cart/:path rule already rewrites it into /docs/campaigns/, which these rules then resolve. netlify.toml and public/_redirects are generated from one table and verified identical. public/_redirects is what Cloudflare actually serves. Co-Authored-By: Claude Opus 5 --- netlify.toml | 317 +++++++++++++++++++++++++++++++++++++--------- public/_redirects | 124 +++++++++++------- 2 files changed, 341 insertions(+), 100 deletions(-) diff --git a/netlify.toml b/netlify.toml index 2ec9ff5..48792ac 100644 --- a/netlify.toml +++ b/netlify.toml @@ -147,215 +147,418 @@ status = 301 # Campaigns SDK reference moved to cart-sdk.nextcommerce.com +# +# Each rule points at the section that absorbed the old page, not at the site +# root. The SDK site consolidated ~160 narrative pages into six reference pages +# plus the page-type guides, so the mapping is many-to-one — but a redirect to +# the root reads as a soft 404 to Google and drops the URL from the index, which +# is what Search Console reported between 2026-08-22 and 2026-09-07. +# +# Order is load-bearing: Netlify takes the first match, so every deep path has to +# stay above its parent wildcard. Anchors were verified against the built site. +# +# Two deliberate gaps: +# - No `/docs/campaigns/utilities/*` catch-all, and no FOMO rule. FOMO is gone +# from the SDK (no matches in src/), so those URLs must 404 rather than land +# on a page that does not document them. The catch-all would have swallowed +# them, which is why only the three surviving utilities are listed. +# - `/docs/campaigns/campaign-cart/cart-system` is not listed: the generic +# `campaign-cart/:path` rule above already rewrites it to +# `/docs/campaigns/cart-system`, which these rules then resolve. [[redirects]] - from = "/docs/campaigns/utilities/fomo" - to = "https://cart-sdk.nextcommerce.com/latest/" + from = "/docs/campaigns/utilities/exit-intent" + to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#on-page-popups" status = 301 [[redirects]] - from = "/docs/campaigns/utilities/fomo/*" - to = "https://cart-sdk.nextcommerce.com/latest/" + from = "/docs/campaigns/utilities/exit-intent/*" + to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#on-page-popups" status = 301 [[redirects]] from = "/docs/campaigns/utilities/debugger" - to = "https://cart-sdk.nextcommerce.com/latest/" + to = "https://cart-sdk.nextcommerce.com/latest/reference/debugger/" status = 301 [[redirects]] from = "/docs/campaigns/utilities/debugger/*" - to = "https://cart-sdk.nextcommerce.com/latest/" + to = "https://cart-sdk.nextcommerce.com/latest/reference/debugger/" status = 301 [[redirects]] - from = "/docs/campaigns/utilities/exit-intent" - to = "https://cart-sdk.nextcommerce.com/latest/" - status = 301 - -[[redirects]] - from = "/docs/campaigns/utilities/exit-intent/*" - to = "https://cart-sdk.nextcommerce.com/latest/" + from = "/docs/campaigns/utilities/loading-states" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#hiding-placeholders-until-prices-load" status = 301 [[redirects]] - from = "/docs/campaigns/utilities/loading-states" - to = "https://cart-sdk.nextcommerce.com/latest/" + from = "/docs/campaigns/utilities/loading-states/*" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#hiding-placeholders-until-prices-load" status = 301 [[redirects]] - from = "/docs/campaigns/utilities/loading-states/*" - to = "https://cart-sdk.nextcommerce.com/latest/" + from = "/docs/campaigns/utilities" + to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#utilities" status = 301 [[redirects]] from = "/docs/campaigns/javascript-api/url-parameters" - to = "https://cart-sdk.nextcommerce.com/latest/" + to = "https://cart-sdk.nextcommerce.com/latest/reference/url-parameters/" status = 301 [[redirects]] from = "/docs/campaigns/javascript-api/url-parameters/*" - to = "https://cart-sdk.nextcommerce.com/latest/" + to = "https://cart-sdk.nextcommerce.com/latest/reference/url-parameters/" status = 301 [[redirects]] from = "/docs/campaigns/javascript-api/attribution" - to = "https://cart-sdk.nextcommerce.com/latest/" + to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#attribution-and-metadata" status = 301 [[redirects]] from = "/docs/campaigns/javascript-api/attribution/*" - to = "https://cart-sdk.nextcommerce.com/latest/" + to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#attribution-and-metadata" + status = 301 + +[[redirects]] + from = "/docs/campaigns/javascript-api/attribution-metadata" + to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#attribution-and-metadata" status = 301 [[redirects]] from = "/docs/campaigns/javascript-api/events" - to = "https://cart-sdk.nextcommerce.com/latest/" + to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#events" status = 301 [[redirects]] from = "/docs/campaigns/javascript-api/events/*" - to = "https://cart-sdk.nextcommerce.com/latest/" + to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#events" + status = 301 + +[[redirects]] + from = "/docs/campaigns/javascript-api" + to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/" + status = 301 + +[[redirects]] + from = "/docs/campaigns/javascript-api/*" + to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/" status = 301 [[redirects]] from = "/docs/campaigns/data-attributes/url-parameters" - to = "https://cart-sdk.nextcommerce.com/latest/" + to = "https://cart-sdk.nextcommerce.com/latest/reference/url-parameters/" status = 301 [[redirects]] from = "/docs/campaigns/data-attributes/url-parameters/*" - to = "https://cart-sdk.nextcommerce.com/latest/" + to = "https://cart-sdk.nextcommerce.com/latest/reference/url-parameters/" + status = 301 + +[[redirects]] + from = "/docs/campaigns/data-attributes/display" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#displaying-live-values" + status = 301 + +[[redirects]] + from = "/docs/campaigns/data-attributes/display/*" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#displaying-live-values" + status = 301 + +[[redirects]] + from = "/docs/campaigns/data-attributes/state" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container" + status = 301 + +[[redirects]] + from = "/docs/campaigns/data-attributes/state/*" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container" + status = 301 + +[[redirects]] + from = "/docs/campaigns/data-attributes/selection" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#selection-mode" + status = 301 + +[[redirects]] + from = "/docs/campaigns/data-attributes/selection/*" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#selection-mode" + status = 301 + +[[redirects]] + from = "/docs/campaigns/data-attributes/configuration" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#formatting" + status = 301 + +[[redirects]] + from = "/docs/campaigns/data-attributes/configuration/*" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#formatting" + status = 301 + +[[redirects]] + from = "/docs/campaigns/data-attributes/order-data" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#the-order-object" + status = 301 + +[[redirects]] + from = "/docs/campaigns/data-attributes/order-data/*" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#the-order-object" + status = 301 + +[[redirects]] + from = "/docs/campaigns/data-attributes/campaign" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#display-paths" + status = 301 + +[[redirects]] + from = "/docs/campaigns/data-attributes/campaign/*" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#display-paths" + status = 301 + +[[redirects]] + from = "/docs/campaigns/data-attributes/checkout-review" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#checkout-form" + status = 301 + +[[redirects]] + from = "/docs/campaigns/data-attributes/checkout-review/*" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#checkout-form" status = 301 [[redirects]] from = "/docs/campaigns/data-attributes/css-classes" - to = "https://cart-sdk.nextcommerce.com/latest/" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#ui-helpers" status = 301 [[redirects]] from = "/docs/campaigns/data-attributes/css-classes/*" - to = "https://cart-sdk.nextcommerce.com/latest/" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#ui-helpers" status = 301 [[redirects]] from = "/docs/campaigns/data-attributes" - to = "https://cart-sdk.nextcommerce.com/latest/" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/" status = 301 [[redirects]] from = "/docs/campaigns/data-attributes/*" - to = "https://cart-sdk.nextcommerce.com/latest/" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/" status = 301 [[redirects]] - from = "/docs/campaigns/javascript-api" - to = "https://cart-sdk.nextcommerce.com/latest/" + from = "/docs/campaigns/analytics/custom-events" + to = "https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#manual-events" status = 301 [[redirects]] - from = "/docs/campaigns/javascript-api/*" - to = "https://cart-sdk.nextcommerce.com/latest/" + from = "/docs/campaigns/analytics/tracking-api" + to = "https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#manual-tracking" + status = 301 + +[[redirects]] + from = "/docs/campaigns/analytics/configuration" + to = "https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#required-settings" + status = 301 + +[[redirects]] + from = "/docs/campaigns/analytics/debugging" + to = "https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#enabling-analytics" + status = 301 + +[[redirects]] + from = "/docs/campaigns/analytics/examples" + to = "https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#providers" + status = 301 + +[[redirects]] + from = "/docs/campaigns/analytics/examples/*" + to = "https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#providers" status = 301 [[redirects]] from = "/docs/campaigns/analytics" - to = "https://cart-sdk.nextcommerce.com/latest/" + to = "https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/" status = 301 [[redirects]] from = "/docs/campaigns/analytics/*" - to = "https://cart-sdk.nextcommerce.com/latest/" + to = "https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/" status = 301 [[redirects]] from = "/docs/campaigns/configuration" - to = "https://cart-sdk.nextcommerce.com/latest/" + to = "https://cart-sdk.nextcommerce.com/latest/reference/window-globals/#windownextconfig" status = 301 [[redirects]] from = "/docs/campaigns/configuration/*" - to = "https://cart-sdk.nextcommerce.com/latest/" + to = "https://cart-sdk.nextcommerce.com/latest/reference/window-globals/#windownextconfig" + status = 301 + +[[redirects]] + from = "/docs/campaigns/bundle-selector/vouchers" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#voucher-codes" + status = 301 + +[[redirects]] + from = "/docs/campaigns/bundle-selector/mechanics" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#selection-mode" + status = 301 + +[[redirects]] + from = "/docs/campaigns/bundle-selector/select-mode" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#selection-mode" + status = 301 + +[[redirects]] + from = "/docs/campaigns/bundle-selector/variants" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#multi-variant-selectors" + status = 301 + +[[redirects]] + from = "/docs/campaigns/bundle-selector/prices" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#display-values" status = 301 [[redirects]] from = "/docs/campaigns/bundle-selector" - to = "https://cart-sdk.nextcommerce.com/latest/" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#bundle-selector" status = 301 [[redirects]] from = "/docs/campaigns/bundle-selector/*" - to = "https://cart-sdk.nextcommerce.com/latest/" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#bundle-selector" + status = 301 + +[[redirects]] + from = "/docs/campaigns/package-toggle/quantity-sync" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#quantity-sync" + status = 301 + +[[redirects]] + from = "/docs/campaigns/package-toggle/state-containers" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container" status = 301 [[redirects]] from = "/docs/campaigns/package-toggle" - to = "https://cart-sdk.nextcommerce.com/latest/" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#order-bumps" status = 301 [[redirects]] from = "/docs/campaigns/package-toggle/*" - to = "https://cart-sdk.nextcommerce.com/latest/" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#order-bumps" status = 301 [[redirects]] from = "/docs/campaigns/cart-summary" - to = "https://cart-sdk.nextcommerce.com/latest/" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary" status = 301 [[redirects]] from = "/docs/campaigns/cart-summary/*" - to = "https://cart-sdk.nextcommerce.com/latest/" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary" + status = 301 + +[[redirects]] + from = "/docs/campaigns/cart-system/reference/events" + to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#events" + status = 301 + +[[redirects]] + from = "/docs/campaigns/cart-system/bundle-selector" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#bundle-selector" + status = 301 + +[[redirects]] + from = "/docs/campaigns/cart-system/cart-summary" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary" + status = 301 + +[[redirects]] + from = "/docs/campaigns/cart-system/state" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container" + status = 301 + +[[redirects]] + from = "/docs/campaigns/cart-system/quantity" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#quantity-stepper" + status = 301 + +[[redirects]] + from = "/docs/campaigns/cart-system/buttons" + to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#cart-operations" status = 301 [[redirects]] from = "/docs/campaigns/cart-system" - to = "https://cart-sdk.nextcommerce.com/latest/" + to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#cart-operations" status = 301 [[redirects]] from = "/docs/campaigns/cart-system/*" - to = "https://cart-sdk.nextcommerce.com/latest/" + to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#cart-operations" + status = 301 + +[[redirects]] + from = "/docs/campaigns/checkout/payment" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#payment-methods" + status = 301 + +[[redirects]] + from = "/docs/campaigns/checkout/reference/attributes" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#checkout-form" + status = 301 + +[[redirects]] + from = "/docs/campaigns/checkout/reference/*" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#checkout-form" + status = 301 + +[[redirects]] + from = "/docs/campaigns/checkout/form" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#checkout-form" status = 301 [[redirects]] from = "/docs/campaigns/checkout" - to = "https://cart-sdk.nextcommerce.com/latest/" + to = "https://cart-sdk.nextcommerce.com/latest/pages/checkout-page/" status = 301 [[redirects]] from = "/docs/campaigns/checkout/*" - to = "https://cart-sdk.nextcommerce.com/latest/" + to = "https://cart-sdk.nextcommerce.com/latest/pages/checkout-page/" status = 301 [[redirects]] - from = "/docs/campaigns/upsells" - to = "https://cart-sdk.nextcommerce.com/latest/" + from = "/docs/campaigns/upsells/accept-button" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#accepting-and-declining" status = 301 [[redirects]] - from = "/docs/campaigns/upsells/*" - to = "https://cart-sdk.nextcommerce.com/latest/" + from = "/docs/campaigns/upsells/quantity" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#post-purchase-upsells" status = 301 [[redirects]] - from = "/docs/campaigns/utilities" - to = "https://cart-sdk.nextcommerce.com/latest/" + from = "/docs/campaigns/upsells" + to = "https://cart-sdk.nextcommerce.com/latest/pages/upsell-page/" status = 301 [[redirects]] - from = "/docs/campaigns/utilities/*" - to = "https://cart-sdk.nextcommerce.com/latest/" + from = "/docs/campaigns/upsells/*" + to = "https://cart-sdk.nextcommerce.com/latest/pages/upsell-page/" status = 301 [[redirects]] from = "/docs/campaigns/guides" - to = "https://cart-sdk.nextcommerce.com/latest/" + to = "https://cart-sdk.nextcommerce.com/latest/start-here/getting-started/" status = 301 [[redirects]] from = "/docs/campaigns/guides/*" - to = "https://cart-sdk.nextcommerce.com/latest/" + to = "https://cart-sdk.nextcommerce.com/latest/start-here/getting-started/" status = 301 # Old Redoc-style reference URL still linked from the platform changelog. diff --git a/public/_redirects b/public/_redirects index 697a3c7..89d2a93 100644 --- a/public/_redirects +++ b/public/_redirects @@ -33,49 +33,87 @@ # Bankcard guide slug renamed from iframe-payment-form /docs/admin-api/guides/payment-methods/iframe-payment-form /docs/admin-api/guides/payment-methods/bankcard 301 -# Campaigns SDK reference moved to cart-sdk.nextcommerce.com -/docs/campaigns/utilities/fomo https://cart-sdk.nextcommerce.com/latest/ 301 -/docs/campaigns/utilities/fomo/* https://cart-sdk.nextcommerce.com/latest/ 301 -/docs/campaigns/utilities/debugger https://cart-sdk.nextcommerce.com/latest/ 301 -/docs/campaigns/utilities/debugger/* https://cart-sdk.nextcommerce.com/latest/ 301 -/docs/campaigns/utilities/exit-intent https://cart-sdk.nextcommerce.com/latest/ 301 -/docs/campaigns/utilities/exit-intent/* https://cart-sdk.nextcommerce.com/latest/ 301 -/docs/campaigns/utilities/loading-states https://cart-sdk.nextcommerce.com/latest/ 301 -/docs/campaigns/utilities/loading-states/* https://cart-sdk.nextcommerce.com/latest/ 301 -/docs/campaigns/javascript-api/url-parameters https://cart-sdk.nextcommerce.com/latest/ 301 -/docs/campaigns/javascript-api/url-parameters/* https://cart-sdk.nextcommerce.com/latest/ 301 -/docs/campaigns/javascript-api/attribution https://cart-sdk.nextcommerce.com/latest/ 301 -/docs/campaigns/javascript-api/attribution/* https://cart-sdk.nextcommerce.com/latest/ 301 -/docs/campaigns/javascript-api/events https://cart-sdk.nextcommerce.com/latest/ 301 -/docs/campaigns/javascript-api/events/* https://cart-sdk.nextcommerce.com/latest/ 301 -/docs/campaigns/data-attributes/url-parameters https://cart-sdk.nextcommerce.com/latest/ 301 -/docs/campaigns/data-attributes/url-parameters/* https://cart-sdk.nextcommerce.com/latest/ 301 -/docs/campaigns/data-attributes/css-classes https://cart-sdk.nextcommerce.com/latest/ 301 -/docs/campaigns/data-attributes/css-classes/* https://cart-sdk.nextcommerce.com/latest/ 301 -/docs/campaigns/data-attributes https://cart-sdk.nextcommerce.com/latest/ 301 -/docs/campaigns/data-attributes/* https://cart-sdk.nextcommerce.com/latest/ 301 -/docs/campaigns/javascript-api https://cart-sdk.nextcommerce.com/latest/ 301 -/docs/campaigns/javascript-api/* https://cart-sdk.nextcommerce.com/latest/ 301 -/docs/campaigns/analytics https://cart-sdk.nextcommerce.com/latest/ 301 -/docs/campaigns/analytics/* https://cart-sdk.nextcommerce.com/latest/ 301 -/docs/campaigns/configuration https://cart-sdk.nextcommerce.com/latest/ 301 -/docs/campaigns/configuration/* https://cart-sdk.nextcommerce.com/latest/ 301 -/docs/campaigns/bundle-selector https://cart-sdk.nextcommerce.com/latest/ 301 -/docs/campaigns/bundle-selector/* https://cart-sdk.nextcommerce.com/latest/ 301 -/docs/campaigns/package-toggle https://cart-sdk.nextcommerce.com/latest/ 301 -/docs/campaigns/package-toggle/* https://cart-sdk.nextcommerce.com/latest/ 301 -/docs/campaigns/cart-summary https://cart-sdk.nextcommerce.com/latest/ 301 -/docs/campaigns/cart-summary/* https://cart-sdk.nextcommerce.com/latest/ 301 -/docs/campaigns/cart-system https://cart-sdk.nextcommerce.com/latest/ 301 -/docs/campaigns/cart-system/* https://cart-sdk.nextcommerce.com/latest/ 301 -/docs/campaigns/checkout https://cart-sdk.nextcommerce.com/latest/ 301 -/docs/campaigns/checkout/* https://cart-sdk.nextcommerce.com/latest/ 301 -/docs/campaigns/upsells https://cart-sdk.nextcommerce.com/latest/ 301 -/docs/campaigns/upsells/* https://cart-sdk.nextcommerce.com/latest/ 301 -/docs/campaigns/utilities https://cart-sdk.nextcommerce.com/latest/ 301 -/docs/campaigns/utilities/* https://cart-sdk.nextcommerce.com/latest/ 301 -/docs/campaigns/guides https://cart-sdk.nextcommerce.com/latest/ 301 -/docs/campaigns/guides/* https://cart-sdk.nextcommerce.com/latest/ 301 +# Campaigns SDK reference moved to cart-sdk.nextcommerce.com — reasoning in +# netlify.toml. Keep the two in sync; this file is what Cloudflare serves. +/docs/campaigns/utilities/exit-intent https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#on-page-popups 301 +/docs/campaigns/utilities/exit-intent/* https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#on-page-popups 301 +/docs/campaigns/utilities/debugger https://cart-sdk.nextcommerce.com/latest/reference/debugger/ 301 +/docs/campaigns/utilities/debugger/* https://cart-sdk.nextcommerce.com/latest/reference/debugger/ 301 +/docs/campaigns/utilities/loading-states https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#hiding-placeholders-until-prices-load 301 +/docs/campaigns/utilities/loading-states/* https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#hiding-placeholders-until-prices-load 301 +/docs/campaigns/utilities https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#utilities 301 +/docs/campaigns/javascript-api/url-parameters https://cart-sdk.nextcommerce.com/latest/reference/url-parameters/ 301 +/docs/campaigns/javascript-api/url-parameters/* https://cart-sdk.nextcommerce.com/latest/reference/url-parameters/ 301 +/docs/campaigns/javascript-api/attribution https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#attribution-and-metadata 301 +/docs/campaigns/javascript-api/attribution/* https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#attribution-and-metadata 301 +/docs/campaigns/javascript-api/attribution-metadata https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#attribution-and-metadata 301 +/docs/campaigns/javascript-api/events https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#events 301 +/docs/campaigns/javascript-api/events/* https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#events 301 +/docs/campaigns/javascript-api https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/ 301 +/docs/campaigns/javascript-api/* https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/ 301 +/docs/campaigns/data-attributes/url-parameters https://cart-sdk.nextcommerce.com/latest/reference/url-parameters/ 301 +/docs/campaigns/data-attributes/url-parameters/* https://cart-sdk.nextcommerce.com/latest/reference/url-parameters/ 301 +/docs/campaigns/data-attributes/display https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#displaying-live-values 301 +/docs/campaigns/data-attributes/display/* https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#displaying-live-values 301 +/docs/campaigns/data-attributes/state https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container 301 +/docs/campaigns/data-attributes/state/* https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container 301 +/docs/campaigns/data-attributes/selection https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#selection-mode 301 +/docs/campaigns/data-attributes/selection/* https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#selection-mode 301 +/docs/campaigns/data-attributes/configuration https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#formatting 301 +/docs/campaigns/data-attributes/configuration/* https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#formatting 301 +/docs/campaigns/data-attributes/order-data https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#the-order-object 301 +/docs/campaigns/data-attributes/order-data/* https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#the-order-object 301 +/docs/campaigns/data-attributes/campaign https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#display-paths 301 +/docs/campaigns/data-attributes/campaign/* https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#display-paths 301 +/docs/campaigns/data-attributes/checkout-review https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#checkout-form 301 +/docs/campaigns/data-attributes/checkout-review/* https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#checkout-form 301 +/docs/campaigns/data-attributes/css-classes https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#ui-helpers 301 +/docs/campaigns/data-attributes/css-classes/* https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#ui-helpers 301 +/docs/campaigns/data-attributes https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/ 301 +/docs/campaigns/data-attributes/* https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/ 301 +/docs/campaigns/analytics/custom-events https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#manual-events 301 +/docs/campaigns/analytics/tracking-api https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#manual-tracking 301 +/docs/campaigns/analytics/configuration https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#required-settings 301 +/docs/campaigns/analytics/debugging https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#enabling-analytics 301 +/docs/campaigns/analytics/examples https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#providers 301 +/docs/campaigns/analytics/examples/* https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#providers 301 +/docs/campaigns/analytics https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/ 301 +/docs/campaigns/analytics/* https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/ 301 +/docs/campaigns/configuration https://cart-sdk.nextcommerce.com/latest/reference/window-globals/#windownextconfig 301 +/docs/campaigns/configuration/* https://cart-sdk.nextcommerce.com/latest/reference/window-globals/#windownextconfig 301 +/docs/campaigns/bundle-selector/vouchers https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#voucher-codes 301 +/docs/campaigns/bundle-selector/mechanics https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#selection-mode 301 +/docs/campaigns/bundle-selector/select-mode https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#selection-mode 301 +/docs/campaigns/bundle-selector/variants https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#multi-variant-selectors 301 +/docs/campaigns/bundle-selector/prices https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#display-values 301 +/docs/campaigns/bundle-selector https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#bundle-selector 301 +/docs/campaigns/bundle-selector/* https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#bundle-selector 301 +/docs/campaigns/package-toggle/quantity-sync https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#quantity-sync 301 +/docs/campaigns/package-toggle/state-containers https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container 301 +/docs/campaigns/package-toggle https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#order-bumps 301 +/docs/campaigns/package-toggle/* https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#order-bumps 301 +/docs/campaigns/cart-summary https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary 301 +/docs/campaigns/cart-summary/* https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary 301 +/docs/campaigns/cart-system/reference/events https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#events 301 +/docs/campaigns/cart-system/bundle-selector https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#bundle-selector 301 +/docs/campaigns/cart-system/cart-summary https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary 301 +/docs/campaigns/cart-system/state https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container 301 +/docs/campaigns/cart-system/quantity https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#quantity-stepper 301 +/docs/campaigns/cart-system/buttons https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#cart-operations 301 +/docs/campaigns/cart-system https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#cart-operations 301 +/docs/campaigns/cart-system/* https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#cart-operations 301 +/docs/campaigns/checkout/payment https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#payment-methods 301 +/docs/campaigns/checkout/reference/attributes https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#checkout-form 301 +/docs/campaigns/checkout/reference/* https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#checkout-form 301 +/docs/campaigns/checkout/form https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#checkout-form 301 +/docs/campaigns/checkout https://cart-sdk.nextcommerce.com/latest/pages/checkout-page/ 301 +/docs/campaigns/checkout/* https://cart-sdk.nextcommerce.com/latest/pages/checkout-page/ 301 +/docs/campaigns/upsells/accept-button https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#accepting-and-declining 301 +/docs/campaigns/upsells/quantity https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#post-purchase-upsells 301 +/docs/campaigns/upsells https://cart-sdk.nextcommerce.com/latest/pages/upsell-page/ 301 +/docs/campaigns/upsells/* https://cart-sdk.nextcommerce.com/latest/pages/upsell-page/ 301 +/docs/campaigns/guides https://cart-sdk.nextcommerce.com/latest/start-here/getting-started/ 301 +/docs/campaigns/guides/* https://cart-sdk.nextcommerce.com/latest/start-here/getting-started/ 301 # Old Redoc-style reference URL still linked from the platform changelog (with and without # trailing slash). Exact-path rules on purpose: /docs/admin-api/reference// are real pages. /docs/admin-api/reference /docs/admin-api 301 From 02d721c54c4022b491b81f12d92703fe3e0e67c0 Mon Sep 17 00:00:00 2001 From: Devin Michael Date: Mon, 7 Sep 2026 15:03:21 +0700 Subject: [PATCH 2/7] Enumerate exact paths; Cloudflare ignored first-match order MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Verified the previous commit against the Cloudflare preview deploy and found the rules were not resolving as written. /docs/campaigns/checkout/payment went to the generic checkout page rather than the payment section, /docs/campaigns/data-attributes/state lost its anchor, and bundle-selector/vouchers landed on #bundle-selector instead of #voucher-codes. In every case the parent wildcard beat a more specific rule listed above it, so Cloudflare is not applying first-match-wins the way Netlify documents it. Rather than reverse-engineer the precedence and burn deploy cycles on it, this removes the ambiguity: every rule is now an exact path, one per page that actually existed, with no wildcards in the block. No two rules can match the same URL, so precedence stops mattering on either host. The path list is generated from the pages deleted in this repo's own history, plus three URLs Search Console has indexed that predate it — the rudderstack and google-tag-manager analytics examples, and campaign-cart/cart-system. Enumeration from git alone would have missed those, which is worth remembering if more turn up. Verified against the built SDK site: 10 destination pages all 200, 32 anchors all present as real element ids, both files identical across 138 rules, no duplicate `from`, no still-live page (api/, page-kit, templates, admin-api) caught by a rule. Replaying the Search Console export gives 33 of 35 mapped, the other two being the FOMO paths that are meant to 404. Co-Authored-By: Claude Opus 5 --- netlify.toml | 610 ++++++++++++++++++++++++++++++++++------------ public/_redirects | 193 ++++++++++----- 2 files changed, 582 insertions(+), 221 deletions(-) diff --git a/netlify.toml b/netlify.toml index 48792ac..28aac0f 100644 --- a/netlify.toml +++ b/netlify.toml @@ -148,162 +148,347 @@ # Campaigns SDK reference moved to cart-sdk.nextcommerce.com # -# Each rule points at the section that absorbed the old page, not at the site -# root. The SDK site consolidated ~160 narrative pages into six reference pages -# plus the page-type guides, so the mapping is many-to-one — but a redirect to -# the root reads as a soft 404 to Google and drops the URL from the index, which -# is what Search Console reported between 2026-08-22 and 2026-09-07. +# Every rule is an EXACT path and there are no wildcards in this block. That is +# deliberate. An earlier version listed specific paths above parent wildcards and +# relied on first-match-wins; on Cloudflare the parent wildcard won anyway, so +# /docs/campaigns/checkout/payment landed on the generic checkout page instead of +# the payment section. Enumerating every path means no two rules can match the +# same URL and precedence stops mattering on either host. # -# Order is load-bearing: Netlify takes the first match, so every deep path has to -# stay above its parent wildcard. Anchors were verified against the built site. +# The list comes from the pages deleted in this repo's history, plus three URLs +# Search Console has indexed that predate that history (two analytics examples +# and campaign-cart/cart-system). Anything under /docs/campaigns/ not listed here +# either still exists (api/, page-kit, templates, admin-api) or never did. # -# Two deliberate gaps: -# - No `/docs/campaigns/utilities/*` catch-all, and no FOMO rule. FOMO is gone -# from the SDK (no matches in src/), so those URLs must 404 rather than land -# on a page that does not document them. The catch-all would have swallowed -# them, which is why only the three surviving utilities are listed. -# - `/docs/campaigns/campaign-cart/cart-system` is not listed: the generic -# `campaign-cart/:path` rule above already rewrites it to -# `/docs/campaigns/cart-system`, which these rules then resolve. +# Destinations are sections, not the site root. The SDK site consolidated ~140 +# narrative pages into six reference pages plus the page-type guides, so the +# mapping is many-to-one — but a redirect to the root reads as a soft 404 to +# Google and drops the URL from the index, which is what Search Console reported +# between 2026-08-22 and 2026-09-07. Every destination page and anchor is +# verified against the built SDK site. +# +# FOMO is absent on purpose: the feature is gone from the SDK (no matches in +# src/), so its five old paths 404 rather than land somewhere that does not +# document them. [[redirects]] - from = "/docs/campaigns/utilities/exit-intent" - to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#on-page-popups" + from = "/docs/campaigns/analytics" + to = "https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/" status = 301 [[redirects]] - from = "/docs/campaigns/utilities/exit-intent/*" - to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#on-page-popups" + from = "/docs/campaigns/analytics/best-practices" + to = "https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/" status = 301 [[redirects]] - from = "/docs/campaigns/utilities/debugger" - to = "https://cart-sdk.nextcommerce.com/latest/reference/debugger/" + from = "/docs/campaigns/analytics/configuration" + to = "https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#required-settings" status = 301 [[redirects]] - from = "/docs/campaigns/utilities/debugger/*" - to = "https://cart-sdk.nextcommerce.com/latest/reference/debugger/" + from = "/docs/campaigns/analytics/custom-events" + to = "https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#manual-events" status = 301 [[redirects]] - from = "/docs/campaigns/utilities/loading-states" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#hiding-placeholders-until-prices-load" + from = "/docs/campaigns/analytics/debugging" + to = "https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#enabling-analytics" status = 301 [[redirects]] - from = "/docs/campaigns/utilities/loading-states/*" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#hiding-placeholders-until-prices-load" + from = "/docs/campaigns/analytics/examples" + to = "https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#providers" status = 301 [[redirects]] - from = "/docs/campaigns/utilities" - to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#utilities" + from = "/docs/campaigns/analytics/examples/custom-analytics-triggers" + to = "https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#providers" status = 301 [[redirects]] - from = "/docs/campaigns/javascript-api/url-parameters" - to = "https://cart-sdk.nextcommerce.com/latest/reference/url-parameters/" + from = "/docs/campaigns/analytics/examples/direct-ga4" + to = "https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#providers" status = 301 [[redirects]] - from = "/docs/campaigns/javascript-api/url-parameters/*" - to = "https://cart-sdk.nextcommerce.com/latest/reference/url-parameters/" + from = "/docs/campaigns/analytics/examples/facebook-pixel" + to = "https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#providers" status = 301 [[redirects]] - from = "/docs/campaigns/javascript-api/attribution" - to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#attribution-and-metadata" + from = "/docs/campaigns/analytics/examples/google-tag-manager" + to = "https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#providers" status = 301 [[redirects]] - from = "/docs/campaigns/javascript-api/attribution/*" - to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#attribution-and-metadata" + from = "/docs/campaigns/analytics/examples/rudderstack" + to = "https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#providers" status = 301 [[redirects]] - from = "/docs/campaigns/javascript-api/attribution-metadata" - to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#attribution-and-metadata" + from = "/docs/campaigns/analytics/tracking-api" + to = "https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#manual-tracking" status = 301 [[redirects]] - from = "/docs/campaigns/javascript-api/events" + from = "/docs/campaigns/bundle-selector" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#bundle-selector" + status = 301 + +[[redirects]] + from = "/docs/campaigns/bundle-selector/get-started" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#bundle-selector" + status = 301 + +[[redirects]] + from = "/docs/campaigns/bundle-selector/mechanics" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#selection-mode" + status = 301 + +[[redirects]] + from = "/docs/campaigns/bundle-selector/prices" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#display-values" + status = 301 + +[[redirects]] + from = "/docs/campaigns/bundle-selector/reference/attributes" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#bundle-selector" + status = 301 + +[[redirects]] + from = "/docs/campaigns/bundle-selector/reference/css" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#ui-helpers" + status = 301 + +[[redirects]] + from = "/docs/campaigns/bundle-selector/reference/events" to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#events" status = 301 [[redirects]] - from = "/docs/campaigns/javascript-api/events/*" + from = "/docs/campaigns/bundle-selector/select-mode" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#selection-mode" + status = 301 + +[[redirects]] + from = "/docs/campaigns/bundle-selector/shipping" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#the-shipping-object" + status = 301 + +[[redirects]] + from = "/docs/campaigns/bundle-selector/slots" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#bundle-selector" + status = 301 + +[[redirects]] + from = "/docs/campaigns/bundle-selector/variants" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#multi-variant-selectors" + status = 301 + +[[redirects]] + from = "/docs/campaigns/bundle-selector/vouchers" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#voucher-codes" + status = 301 + +[[redirects]] + from = "/docs/campaigns/campaign-cart" + to = "https://cart-sdk.nextcommerce.com/latest/start-here/how-it-works/" + status = 301 + +[[redirects]] + from = "/docs/campaigns/campaign-cart/cart-system" + to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#cart-operations" + status = 301 + +[[redirects]] + from = "/docs/campaigns/cart-summary" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary" + status = 301 + +[[redirects]] + from = "/docs/campaigns/cart-summary/cart-display" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary" + status = 301 + +[[redirects]] + from = "/docs/campaigns/cart-summary/custom-template" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary" + status = 301 + +[[redirects]] + from = "/docs/campaigns/cart-summary/get-started" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary" + status = 301 + +[[redirects]] + from = "/docs/campaigns/cart-summary/reference/attributes" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary" + status = 301 + +[[redirects]] + from = "/docs/campaigns/cart-summary/reference/css" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#ui-helpers" + status = 301 + +[[redirects]] + from = "/docs/campaigns/cart-summary/reference/events" to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#events" status = 301 [[redirects]] - from = "/docs/campaigns/javascript-api" - to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/" + from = "/docs/campaigns/cart-summary/reference/object-attributes" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary" status = 301 [[redirects]] - from = "/docs/campaigns/javascript-api/*" - to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/" + from = "/docs/campaigns/cart-summary/summary-lists" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary" status = 301 [[redirects]] - from = "/docs/campaigns/data-attributes/url-parameters" - to = "https://cart-sdk.nextcommerce.com/latest/reference/url-parameters/" + from = "/docs/campaigns/cart-system" + to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#cart-operations" status = 301 [[redirects]] - from = "/docs/campaigns/data-attributes/url-parameters/*" - to = "https://cart-sdk.nextcommerce.com/latest/reference/url-parameters/" + from = "/docs/campaigns/cart-system/bundle-selector" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#bundle-selector" status = 301 [[redirects]] - from = "/docs/campaigns/data-attributes/display" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#displaying-live-values" + from = "/docs/campaigns/cart-system/buttons" + to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#cart-operations" status = 301 [[redirects]] - from = "/docs/campaigns/data-attributes/display/*" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#displaying-live-values" + from = "/docs/campaigns/cart-system/cart-summary" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary" status = 301 [[redirects]] - from = "/docs/campaigns/data-attributes/state" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container" + from = "/docs/campaigns/cart-system/get-started" + to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#cart-operations" status = 301 [[redirects]] - from = "/docs/campaigns/data-attributes/state/*" + from = "/docs/campaigns/cart-system/quantity" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#quantity-stepper" + status = 301 + +[[redirects]] + from = "/docs/campaigns/cart-system/reference/attributes" + to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#cart-operations" + status = 301 + +[[redirects]] + from = "/docs/campaigns/cart-system/reference/css" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#ui-helpers" + status = 301 + +[[redirects]] + from = "/docs/campaigns/cart-system/reference/events" + to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#events" + status = 301 + +[[redirects]] + from = "/docs/campaigns/cart-system/state" to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container" status = 301 [[redirects]] - from = "/docs/campaigns/data-attributes/selection" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#selection-mode" + from = "/docs/campaigns/checkout" + to = "https://cart-sdk.nextcommerce.com/latest/pages/checkout-page/" status = 301 [[redirects]] - from = "/docs/campaigns/data-attributes/selection/*" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#selection-mode" + from = "/docs/campaigns/checkout/address-autocomplete" + to = "https://cart-sdk.nextcommerce.com/latest/pages/checkout-page/" status = 301 [[redirects]] - from = "/docs/campaigns/data-attributes/configuration" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#formatting" + from = "/docs/campaigns/checkout/express-checkout" + to = "https://cart-sdk.nextcommerce.com/latest/pages/checkout-page/" status = 301 [[redirects]] - from = "/docs/campaigns/data-attributes/configuration/*" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#formatting" + from = "/docs/campaigns/checkout/form" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#checkout-form" status = 301 [[redirects]] - from = "/docs/campaigns/data-attributes/order-data" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#the-order-object" + from = "/docs/campaigns/checkout/get-started" + to = "https://cart-sdk.nextcommerce.com/latest/pages/checkout-page/" status = 301 [[redirects]] - from = "/docs/campaigns/data-attributes/order-data/*" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#the-order-object" + from = "/docs/campaigns/checkout/order-flow" + to = "https://cart-sdk.nextcommerce.com/latest/pages/checkout-page/" + status = 301 + +[[redirects]] + from = "/docs/campaigns/checkout/payment" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#payment-methods" + status = 301 + +[[redirects]] + from = "/docs/campaigns/checkout/prospect-cart" + to = "https://cart-sdk.nextcommerce.com/latest/pages/checkout-page/" + status = 301 + +[[redirects]] + from = "/docs/campaigns/checkout/reference/attributes" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#checkout-form" + status = 301 + +[[redirects]] + from = "/docs/campaigns/checkout/reference/css" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#ui-helpers" + status = 301 + +[[redirects]] + from = "/docs/campaigns/checkout/reference/events" + to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#events" + status = 301 + +[[redirects]] + from = "/docs/campaigns/checkout/review" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#checkout-form" + status = 301 + +[[redirects]] + from = "/docs/campaigns/configuration" + to = "https://cart-sdk.nextcommerce.com/latest/reference/window-globals/#windownextconfig" + status = 301 + +[[redirects]] + from = "/docs/campaigns/data-attributes" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/" + status = 301 + +[[redirects]] + from = "/docs/campaigns/data-attributes/actions" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/" + status = 301 + +[[redirects]] + from = "/docs/campaigns/data-attributes/actions/cart-actions" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/" + status = 301 + +[[redirects]] + from = "/docs/campaigns/data-attributes/actions/get-started" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/" + status = 301 + +[[redirects]] + from = "/docs/campaigns/data-attributes/actions/quantity-actions" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/" + status = 301 + +[[redirects]] + from = "/docs/campaigns/data-attributes/actions/reference/attributes" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/" status = 301 [[redirects]] @@ -312,7 +497,7 @@ status = 301 [[redirects]] - from = "/docs/campaigns/data-attributes/campaign/*" + from = "/docs/campaigns/data-attributes/campaign/reference/attributes" to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#display-paths" status = 301 @@ -322,213 +507,233 @@ status = 301 [[redirects]] - from = "/docs/campaigns/data-attributes/checkout-review/*" + from = "/docs/campaigns/data-attributes/checkout-review/get-started" to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#checkout-form" status = 301 [[redirects]] - from = "/docs/campaigns/data-attributes/css-classes" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#ui-helpers" + from = "/docs/campaigns/data-attributes/checkout-review/reference/attributes" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#checkout-form" status = 301 [[redirects]] - from = "/docs/campaigns/data-attributes/css-classes/*" + from = "/docs/campaigns/data-attributes/configuration" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#formatting" + status = 301 + +[[redirects]] + from = "/docs/campaigns/data-attributes/configuration/formatting" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#formatting" + status = 301 + +[[redirects]] + from = "/docs/campaigns/data-attributes/configuration/math" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#formatting" + status = 301 + +[[redirects]] + from = "/docs/campaigns/data-attributes/configuration/reference/attributes" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#formatting" + status = 301 + +[[redirects]] + from = "/docs/campaigns/data-attributes/css-classes" to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#ui-helpers" status = 301 [[redirects]] - from = "/docs/campaigns/data-attributes" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/" + from = "/docs/campaigns/data-attributes/css-classes/reference/css" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#ui-helpers" status = 301 [[redirects]] - from = "/docs/campaigns/data-attributes/*" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/" + from = "/docs/campaigns/data-attributes/display" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#displaying-live-values" status = 301 [[redirects]] - from = "/docs/campaigns/analytics/custom-events" - to = "https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#manual-events" + from = "/docs/campaigns/data-attributes/display/cart-items-template" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#displaying-live-values" status = 301 [[redirects]] - from = "/docs/campaigns/analytics/tracking-api" - to = "https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#manual-tracking" + from = "/docs/campaigns/data-attributes/display/get-started" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#displaying-live-values" status = 301 [[redirects]] - from = "/docs/campaigns/analytics/configuration" - to = "https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#required-settings" + from = "/docs/campaigns/data-attributes/display/package-display" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#displaying-live-values" status = 301 [[redirects]] - from = "/docs/campaigns/analytics/debugging" - to = "https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#enabling-analytics" + from = "/docs/campaigns/data-attributes/display/paths" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#displaying-live-values" status = 301 [[redirects]] - from = "/docs/campaigns/analytics/examples" - to = "https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#providers" + from = "/docs/campaigns/data-attributes/display/reference/attributes" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#displaying-live-values" status = 301 [[redirects]] - from = "/docs/campaigns/analytics/examples/*" - to = "https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#providers" + from = "/docs/campaigns/data-attributes/order-data" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#the-order-object" status = 301 [[redirects]] - from = "/docs/campaigns/analytics" - to = "https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/" + from = "/docs/campaigns/data-attributes/order-data/get-started" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#the-order-object" status = 301 [[redirects]] - from = "/docs/campaigns/analytics/*" - to = "https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/" + from = "/docs/campaigns/data-attributes/order-data/order-items-template" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#the-order-object" status = 301 [[redirects]] - from = "/docs/campaigns/configuration" - to = "https://cart-sdk.nextcommerce.com/latest/reference/window-globals/#windownextconfig" + from = "/docs/campaigns/data-attributes/order-data/properties" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#the-order-object" status = 301 [[redirects]] - from = "/docs/campaigns/configuration/*" - to = "https://cart-sdk.nextcommerce.com/latest/reference/window-globals/#windownextconfig" + from = "/docs/campaigns/data-attributes/order-data/reference/attributes" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#the-order-object" status = 301 [[redirects]] - from = "/docs/campaigns/bundle-selector/vouchers" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#voucher-codes" + from = "/docs/campaigns/data-attributes/prospect-cart" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/" status = 301 [[redirects]] - from = "/docs/campaigns/bundle-selector/mechanics" + from = "/docs/campaigns/data-attributes/selection" to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#selection-mode" status = 301 [[redirects]] - from = "/docs/campaigns/bundle-selector/select-mode" + from = "/docs/campaigns/data-attributes/selection/reference/attributes" to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#selection-mode" status = 301 [[redirects]] - from = "/docs/campaigns/bundle-selector/variants" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#multi-variant-selectors" + from = "/docs/campaigns/data-attributes/state" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container" status = 301 [[redirects]] - from = "/docs/campaigns/bundle-selector/prices" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#display-values" + from = "/docs/campaigns/data-attributes/state/get-started" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container" status = 301 [[redirects]] - from = "/docs/campaigns/bundle-selector" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#bundle-selector" + from = "/docs/campaigns/data-attributes/state/operators" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container" status = 301 [[redirects]] - from = "/docs/campaigns/bundle-selector/*" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#bundle-selector" + from = "/docs/campaigns/data-attributes/state/properties" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container" status = 301 [[redirects]] - from = "/docs/campaigns/package-toggle/quantity-sync" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#quantity-sync" + from = "/docs/campaigns/data-attributes/state/reference/attributes" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container" status = 301 [[redirects]] - from = "/docs/campaigns/package-toggle/state-containers" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container" + from = "/docs/campaigns/data-attributes/url-parameters" + to = "https://cart-sdk.nextcommerce.com/latest/reference/url-parameters/" status = 301 [[redirects]] - from = "/docs/campaigns/package-toggle" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#order-bumps" + from = "/docs/campaigns/data-attributes/url-parameters/get-started" + to = "https://cart-sdk.nextcommerce.com/latest/reference/url-parameters/" status = 301 [[redirects]] - from = "/docs/campaigns/package-toggle/*" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#order-bumps" + from = "/docs/campaigns/data-attributes/url-parameters/javascript-api" + to = "https://cart-sdk.nextcommerce.com/latest/reference/url-parameters/" status = 301 [[redirects]] - from = "/docs/campaigns/cart-summary" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary" + from = "/docs/campaigns/data-attributes/url-parameters/reference/attributes" + to = "https://cart-sdk.nextcommerce.com/latest/reference/url-parameters/" status = 301 [[redirects]] - from = "/docs/campaigns/cart-summary/*" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary" + from = "/docs/campaigns/guides" + to = "https://cart-sdk.nextcommerce.com/latest/start-here/getting-started/" status = 301 [[redirects]] - from = "/docs/campaigns/cart-system/reference/events" - to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#events" + from = "/docs/campaigns/javascript-api" + to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/" status = 301 [[redirects]] - from = "/docs/campaigns/cart-system/bundle-selector" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#bundle-selector" + from = "/docs/campaigns/javascript-api/attribution-metadata" + to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#attribution-and-metadata" status = 301 [[redirects]] - from = "/docs/campaigns/cart-system/cart-summary" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary" + from = "/docs/campaigns/javascript-api/events" + to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#events" status = 301 [[redirects]] - from = "/docs/campaigns/cart-system/state" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container" + from = "/docs/campaigns/package-toggle" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#order-bumps" status = 301 [[redirects]] - from = "/docs/campaigns/cart-system/quantity" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#quantity-stepper" + from = "/docs/campaigns/package-toggle/auto-render" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#order-bumps" status = 301 [[redirects]] - from = "/docs/campaigns/cart-system/buttons" - to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#cart-operations" + from = "/docs/campaigns/package-toggle/card-templates" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#order-bumps" status = 301 [[redirects]] - from = "/docs/campaigns/cart-system" - to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#cart-operations" + from = "/docs/campaigns/package-toggle/get-started" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#order-bumps" status = 301 [[redirects]] - from = "/docs/campaigns/cart-system/*" - to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#cart-operations" + from = "/docs/campaigns/package-toggle/prices" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#display-values" status = 301 [[redirects]] - from = "/docs/campaigns/checkout/payment" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#payment-methods" + from = "/docs/campaigns/package-toggle/quantity-sync" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#quantity-sync" status = 301 [[redirects]] - from = "/docs/campaigns/checkout/reference/attributes" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#checkout-form" + from = "/docs/campaigns/package-toggle/reference/attributes" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#order-bumps" status = 301 [[redirects]] - from = "/docs/campaigns/checkout/reference/*" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#checkout-form" + from = "/docs/campaigns/package-toggle/reference/css" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#ui-helpers" status = 301 [[redirects]] - from = "/docs/campaigns/checkout/form" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#checkout-form" + from = "/docs/campaigns/package-toggle/reference/events" + to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#events" status = 301 [[redirects]] - from = "/docs/campaigns/checkout" - to = "https://cart-sdk.nextcommerce.com/latest/pages/checkout-page/" + from = "/docs/campaigns/package-toggle/state-containers" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container" status = 301 [[redirects]] - from = "/docs/campaigns/checkout/*" - to = "https://cart-sdk.nextcommerce.com/latest/pages/checkout-page/" + from = "/docs/campaigns/upsells" + to = "https://cart-sdk.nextcommerce.com/latest/pages/upsell-page/" status = 301 [[redirects]] @@ -536,29 +741,124 @@ to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#accepting-and-declining" status = 301 +[[redirects]] + from = "/docs/campaigns/upsells/flow" + to = "https://cart-sdk.nextcommerce.com/latest/pages/upsell-page/" + status = 301 + +[[redirects]] + from = "/docs/campaigns/upsells/get-started" + to = "https://cart-sdk.nextcommerce.com/latest/pages/upsell-page/" + status = 301 + +[[redirects]] + from = "/docs/campaigns/upsells/offer-container" + to = "https://cart-sdk.nextcommerce.com/latest/pages/upsell-page/" + status = 301 + [[redirects]] from = "/docs/campaigns/upsells/quantity" to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#post-purchase-upsells" status = 301 [[redirects]] - from = "/docs/campaigns/upsells" + from = "/docs/campaigns/upsells/reference/attributes" to = "https://cart-sdk.nextcommerce.com/latest/pages/upsell-page/" status = 301 [[redirects]] - from = "/docs/campaigns/upsells/*" + from = "/docs/campaigns/upsells/reference/css" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#ui-helpers" + status = 301 + +[[redirects]] + from = "/docs/campaigns/upsells/reference/events" + to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#events" + status = 301 + +[[redirects]] + from = "/docs/campaigns/upsells/selectors" to = "https://cart-sdk.nextcommerce.com/latest/pages/upsell-page/" status = 301 [[redirects]] - from = "/docs/campaigns/guides" - to = "https://cart-sdk.nextcommerce.com/latest/start-here/getting-started/" + from = "/docs/campaigns/utilities" + to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#utilities" status = 301 [[redirects]] - from = "/docs/campaigns/guides/*" - to = "https://cart-sdk.nextcommerce.com/latest/start-here/getting-started/" + from = "/docs/campaigns/utilities/debugger" + to = "https://cart-sdk.nextcommerce.com/latest/reference/debugger/" + status = 301 + +[[redirects]] + from = "/docs/campaigns/utilities/debugger/console-api" + to = "https://cart-sdk.nextcommerce.com/latest/reference/debugger/" + status = 301 + +[[redirects]] + from = "/docs/campaigns/utilities/debugger/get-started" + to = "https://cart-sdk.nextcommerce.com/latest/reference/debugger/" + status = 301 + +[[redirects]] + from = "/docs/campaigns/utilities/debugger/reference/methods" + to = "https://cart-sdk.nextcommerce.com/latest/reference/debugger/" + status = 301 + +[[redirects]] + from = "/docs/campaigns/utilities/exit-intent" + to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#on-page-popups" + status = 301 + +[[redirects]] + from = "/docs/campaigns/utilities/exit-intent/get-started" + to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#on-page-popups" + status = 301 + +[[redirects]] + from = "/docs/campaigns/utilities/exit-intent/image-mode" + to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#on-page-popups" + status = 301 + +[[redirects]] + from = "/docs/campaigns/utilities/exit-intent/reference/api" + to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#on-page-popups" + status = 301 + +[[redirects]] + from = "/docs/campaigns/utilities/exit-intent/reference/attributes" + to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#on-page-popups" + status = 301 + +[[redirects]] + from = "/docs/campaigns/utilities/exit-intent/reference/events" + to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#on-page-popups" + status = 301 + +[[redirects]] + from = "/docs/campaigns/utilities/exit-intent/template-mode" + to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#on-page-popups" + status = 301 + +[[redirects]] + from = "/docs/campaigns/utilities/loading-states" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#hiding-placeholders-until-prices-load" + status = 301 + +[[redirects]] + from = "/docs/campaigns/utilities/loading-states/get-started" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#hiding-placeholders-until-prices-load" + status = 301 + +[[redirects]] + from = "/docs/campaigns/utilities/loading-states/reference/attributes" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#hiding-placeholders-until-prices-load" + status = 301 + +[[redirects]] + from = "/docs/campaigns/utilities/loading-states/reference/css" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#hiding-placeholders-until-prices-load" status = 301 # Old Redoc-style reference URL still linked from the platform changelog. diff --git a/public/_redirects b/public/_redirects index 89d2a93..7b36541 100644 --- a/public/_redirects +++ b/public/_redirects @@ -34,86 +34,147 @@ /docs/admin-api/guides/payment-methods/iframe-payment-form /docs/admin-api/guides/payment-methods/bankcard 301 # Campaigns SDK reference moved to cart-sdk.nextcommerce.com — reasoning in -# netlify.toml. Keep the two in sync; this file is what Cloudflare serves. -/docs/campaigns/utilities/exit-intent https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#on-page-popups 301 -/docs/campaigns/utilities/exit-intent/* https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#on-page-popups 301 -/docs/campaigns/utilities/debugger https://cart-sdk.nextcommerce.com/latest/reference/debugger/ 301 -/docs/campaigns/utilities/debugger/* https://cart-sdk.nextcommerce.com/latest/reference/debugger/ 301 -/docs/campaigns/utilities/loading-states https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#hiding-placeholders-until-prices-load 301 -/docs/campaigns/utilities/loading-states/* https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#hiding-placeholders-until-prices-load 301 -/docs/campaigns/utilities https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#utilities 301 -/docs/campaigns/javascript-api/url-parameters https://cart-sdk.nextcommerce.com/latest/reference/url-parameters/ 301 -/docs/campaigns/javascript-api/url-parameters/* https://cart-sdk.nextcommerce.com/latest/reference/url-parameters/ 301 -/docs/campaigns/javascript-api/attribution https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#attribution-and-metadata 301 -/docs/campaigns/javascript-api/attribution/* https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#attribution-and-metadata 301 -/docs/campaigns/javascript-api/attribution-metadata https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#attribution-and-metadata 301 -/docs/campaigns/javascript-api/events https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#events 301 -/docs/campaigns/javascript-api/events/* https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#events 301 -/docs/campaigns/javascript-api https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/ 301 -/docs/campaigns/javascript-api/* https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/ 301 -/docs/campaigns/data-attributes/url-parameters https://cart-sdk.nextcommerce.com/latest/reference/url-parameters/ 301 -/docs/campaigns/data-attributes/url-parameters/* https://cart-sdk.nextcommerce.com/latest/reference/url-parameters/ 301 -/docs/campaigns/data-attributes/display https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#displaying-live-values 301 -/docs/campaigns/data-attributes/display/* https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#displaying-live-values 301 -/docs/campaigns/data-attributes/state https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container 301 -/docs/campaigns/data-attributes/state/* https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container 301 -/docs/campaigns/data-attributes/selection https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#selection-mode 301 -/docs/campaigns/data-attributes/selection/* https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#selection-mode 301 -/docs/campaigns/data-attributes/configuration https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#formatting 301 -/docs/campaigns/data-attributes/configuration/* https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#formatting 301 -/docs/campaigns/data-attributes/order-data https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#the-order-object 301 -/docs/campaigns/data-attributes/order-data/* https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#the-order-object 301 -/docs/campaigns/data-attributes/campaign https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#display-paths 301 -/docs/campaigns/data-attributes/campaign/* https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#display-paths 301 -/docs/campaigns/data-attributes/checkout-review https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#checkout-form 301 -/docs/campaigns/data-attributes/checkout-review/* https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#checkout-form 301 -/docs/campaigns/data-attributes/css-classes https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#ui-helpers 301 -/docs/campaigns/data-attributes/css-classes/* https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#ui-helpers 301 -/docs/campaigns/data-attributes https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/ 301 -/docs/campaigns/data-attributes/* https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/ 301 -/docs/campaigns/analytics/custom-events https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#manual-events 301 -/docs/campaigns/analytics/tracking-api https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#manual-tracking 301 +# netlify.toml. Exact paths only, no wildcards: Cloudflare let a parent +# wildcard beat a more specific rule listed above it. Keep the two in sync; +# this file is what Cloudflare actually serves. +/docs/campaigns/analytics https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/ 301 +/docs/campaigns/analytics/best-practices https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/ 301 /docs/campaigns/analytics/configuration https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#required-settings 301 +/docs/campaigns/analytics/custom-events https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#manual-events 301 /docs/campaigns/analytics/debugging https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#enabling-analytics 301 /docs/campaigns/analytics/examples https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#providers 301 -/docs/campaigns/analytics/examples/* https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#providers 301 -/docs/campaigns/analytics https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/ 301 -/docs/campaigns/analytics/* https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/ 301 -/docs/campaigns/configuration https://cart-sdk.nextcommerce.com/latest/reference/window-globals/#windownextconfig 301 -/docs/campaigns/configuration/* https://cart-sdk.nextcommerce.com/latest/reference/window-globals/#windownextconfig 301 -/docs/campaigns/bundle-selector/vouchers https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#voucher-codes 301 +/docs/campaigns/analytics/examples/custom-analytics-triggers https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#providers 301 +/docs/campaigns/analytics/examples/direct-ga4 https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#providers 301 +/docs/campaigns/analytics/examples/facebook-pixel https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#providers 301 +/docs/campaigns/analytics/examples/google-tag-manager https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#providers 301 +/docs/campaigns/analytics/examples/rudderstack https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#providers 301 +/docs/campaigns/analytics/tracking-api https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#manual-tracking 301 +/docs/campaigns/bundle-selector https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#bundle-selector 301 +/docs/campaigns/bundle-selector/get-started https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#bundle-selector 301 /docs/campaigns/bundle-selector/mechanics https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#selection-mode 301 +/docs/campaigns/bundle-selector/prices https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#display-values 301 +/docs/campaigns/bundle-selector/reference/attributes https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#bundle-selector 301 +/docs/campaigns/bundle-selector/reference/css https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#ui-helpers 301 +/docs/campaigns/bundle-selector/reference/events https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#events 301 /docs/campaigns/bundle-selector/select-mode https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#selection-mode 301 +/docs/campaigns/bundle-selector/shipping https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#the-shipping-object 301 +/docs/campaigns/bundle-selector/slots https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#bundle-selector 301 /docs/campaigns/bundle-selector/variants https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#multi-variant-selectors 301 -/docs/campaigns/bundle-selector/prices https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#display-values 301 -/docs/campaigns/bundle-selector https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#bundle-selector 301 -/docs/campaigns/bundle-selector/* https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#bundle-selector 301 -/docs/campaigns/package-toggle/quantity-sync https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#quantity-sync 301 -/docs/campaigns/package-toggle/state-containers https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container 301 -/docs/campaigns/package-toggle https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#order-bumps 301 -/docs/campaigns/package-toggle/* https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#order-bumps 301 +/docs/campaigns/bundle-selector/vouchers https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#voucher-codes 301 +/docs/campaigns/campaign-cart https://cart-sdk.nextcommerce.com/latest/start-here/how-it-works/ 301 +/docs/campaigns/campaign-cart/cart-system https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#cart-operations 301 /docs/campaigns/cart-summary https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary 301 -/docs/campaigns/cart-summary/* https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary 301 -/docs/campaigns/cart-system/reference/events https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#events 301 +/docs/campaigns/cart-summary/cart-display https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary 301 +/docs/campaigns/cart-summary/custom-template https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary 301 +/docs/campaigns/cart-summary/get-started https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary 301 +/docs/campaigns/cart-summary/reference/attributes https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary 301 +/docs/campaigns/cart-summary/reference/css https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#ui-helpers 301 +/docs/campaigns/cart-summary/reference/events https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#events 301 +/docs/campaigns/cart-summary/reference/object-attributes https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary 301 +/docs/campaigns/cart-summary/summary-lists https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary 301 +/docs/campaigns/cart-system https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#cart-operations 301 /docs/campaigns/cart-system/bundle-selector https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#bundle-selector 301 +/docs/campaigns/cart-system/buttons https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#cart-operations 301 /docs/campaigns/cart-system/cart-summary https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary 301 -/docs/campaigns/cart-system/state https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container 301 +/docs/campaigns/cart-system/get-started https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#cart-operations 301 /docs/campaigns/cart-system/quantity https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#quantity-stepper 301 -/docs/campaigns/cart-system/buttons https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#cart-operations 301 -/docs/campaigns/cart-system https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#cart-operations 301 -/docs/campaigns/cart-system/* https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#cart-operations 301 +/docs/campaigns/cart-system/reference/attributes https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#cart-operations 301 +/docs/campaigns/cart-system/reference/css https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#ui-helpers 301 +/docs/campaigns/cart-system/reference/events https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#events 301 +/docs/campaigns/cart-system/state https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container 301 +/docs/campaigns/checkout https://cart-sdk.nextcommerce.com/latest/pages/checkout-page/ 301 +/docs/campaigns/checkout/address-autocomplete https://cart-sdk.nextcommerce.com/latest/pages/checkout-page/ 301 +/docs/campaigns/checkout/express-checkout https://cart-sdk.nextcommerce.com/latest/pages/checkout-page/ 301 +/docs/campaigns/checkout/form https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#checkout-form 301 +/docs/campaigns/checkout/get-started https://cart-sdk.nextcommerce.com/latest/pages/checkout-page/ 301 +/docs/campaigns/checkout/order-flow https://cart-sdk.nextcommerce.com/latest/pages/checkout-page/ 301 /docs/campaigns/checkout/payment https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#payment-methods 301 +/docs/campaigns/checkout/prospect-cart https://cart-sdk.nextcommerce.com/latest/pages/checkout-page/ 301 /docs/campaigns/checkout/reference/attributes https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#checkout-form 301 -/docs/campaigns/checkout/reference/* https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#checkout-form 301 -/docs/campaigns/checkout/form https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#checkout-form 301 -/docs/campaigns/checkout https://cart-sdk.nextcommerce.com/latest/pages/checkout-page/ 301 -/docs/campaigns/checkout/* https://cart-sdk.nextcommerce.com/latest/pages/checkout-page/ 301 +/docs/campaigns/checkout/reference/css https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#ui-helpers 301 +/docs/campaigns/checkout/reference/events https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#events 301 +/docs/campaigns/checkout/review https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#checkout-form 301 +/docs/campaigns/configuration https://cart-sdk.nextcommerce.com/latest/reference/window-globals/#windownextconfig 301 +/docs/campaigns/data-attributes https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/ 301 +/docs/campaigns/data-attributes/actions https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/ 301 +/docs/campaigns/data-attributes/actions/cart-actions https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/ 301 +/docs/campaigns/data-attributes/actions/get-started https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/ 301 +/docs/campaigns/data-attributes/actions/quantity-actions https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/ 301 +/docs/campaigns/data-attributes/actions/reference/attributes https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/ 301 +/docs/campaigns/data-attributes/campaign https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#display-paths 301 +/docs/campaigns/data-attributes/campaign/reference/attributes https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#display-paths 301 +/docs/campaigns/data-attributes/checkout-review https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#checkout-form 301 +/docs/campaigns/data-attributes/checkout-review/get-started https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#checkout-form 301 +/docs/campaigns/data-attributes/checkout-review/reference/attributes https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#checkout-form 301 +/docs/campaigns/data-attributes/configuration https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#formatting 301 +/docs/campaigns/data-attributes/configuration/formatting https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#formatting 301 +/docs/campaigns/data-attributes/configuration/math https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#formatting 301 +/docs/campaigns/data-attributes/configuration/reference/attributes https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#formatting 301 +/docs/campaigns/data-attributes/css-classes https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#ui-helpers 301 +/docs/campaigns/data-attributes/css-classes/reference/css https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#ui-helpers 301 +/docs/campaigns/data-attributes/display https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#displaying-live-values 301 +/docs/campaigns/data-attributes/display/cart-items-template https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#displaying-live-values 301 +/docs/campaigns/data-attributes/display/get-started https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#displaying-live-values 301 +/docs/campaigns/data-attributes/display/package-display https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#displaying-live-values 301 +/docs/campaigns/data-attributes/display/paths https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#displaying-live-values 301 +/docs/campaigns/data-attributes/display/reference/attributes https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#displaying-live-values 301 +/docs/campaigns/data-attributes/order-data https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#the-order-object 301 +/docs/campaigns/data-attributes/order-data/get-started https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#the-order-object 301 +/docs/campaigns/data-attributes/order-data/order-items-template https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#the-order-object 301 +/docs/campaigns/data-attributes/order-data/properties https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#the-order-object 301 +/docs/campaigns/data-attributes/order-data/reference/attributes https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#the-order-object 301 +/docs/campaigns/data-attributes/prospect-cart https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/ 301 +/docs/campaigns/data-attributes/selection https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#selection-mode 301 +/docs/campaigns/data-attributes/selection/reference/attributes https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#selection-mode 301 +/docs/campaigns/data-attributes/state https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container 301 +/docs/campaigns/data-attributes/state/get-started https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container 301 +/docs/campaigns/data-attributes/state/operators https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container 301 +/docs/campaigns/data-attributes/state/properties https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container 301 +/docs/campaigns/data-attributes/state/reference/attributes https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container 301 +/docs/campaigns/data-attributes/url-parameters https://cart-sdk.nextcommerce.com/latest/reference/url-parameters/ 301 +/docs/campaigns/data-attributes/url-parameters/get-started https://cart-sdk.nextcommerce.com/latest/reference/url-parameters/ 301 +/docs/campaigns/data-attributes/url-parameters/javascript-api https://cart-sdk.nextcommerce.com/latest/reference/url-parameters/ 301 +/docs/campaigns/data-attributes/url-parameters/reference/attributes https://cart-sdk.nextcommerce.com/latest/reference/url-parameters/ 301 +/docs/campaigns/guides https://cart-sdk.nextcommerce.com/latest/start-here/getting-started/ 301 +/docs/campaigns/javascript-api https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/ 301 +/docs/campaigns/javascript-api/attribution-metadata https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#attribution-and-metadata 301 +/docs/campaigns/javascript-api/events https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#events 301 +/docs/campaigns/package-toggle https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#order-bumps 301 +/docs/campaigns/package-toggle/auto-render https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#order-bumps 301 +/docs/campaigns/package-toggle/card-templates https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#order-bumps 301 +/docs/campaigns/package-toggle/get-started https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#order-bumps 301 +/docs/campaigns/package-toggle/prices https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#display-values 301 +/docs/campaigns/package-toggle/quantity-sync https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#quantity-sync 301 +/docs/campaigns/package-toggle/reference/attributes https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#order-bumps 301 +/docs/campaigns/package-toggle/reference/css https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#ui-helpers 301 +/docs/campaigns/package-toggle/reference/events https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#events 301 +/docs/campaigns/package-toggle/state-containers https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container 301 +/docs/campaigns/upsells https://cart-sdk.nextcommerce.com/latest/pages/upsell-page/ 301 /docs/campaigns/upsells/accept-button https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#accepting-and-declining 301 +/docs/campaigns/upsells/flow https://cart-sdk.nextcommerce.com/latest/pages/upsell-page/ 301 +/docs/campaigns/upsells/get-started https://cart-sdk.nextcommerce.com/latest/pages/upsell-page/ 301 +/docs/campaigns/upsells/offer-container https://cart-sdk.nextcommerce.com/latest/pages/upsell-page/ 301 /docs/campaigns/upsells/quantity https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#post-purchase-upsells 301 -/docs/campaigns/upsells https://cart-sdk.nextcommerce.com/latest/pages/upsell-page/ 301 -/docs/campaigns/upsells/* https://cart-sdk.nextcommerce.com/latest/pages/upsell-page/ 301 -/docs/campaigns/guides https://cart-sdk.nextcommerce.com/latest/start-here/getting-started/ 301 -/docs/campaigns/guides/* https://cart-sdk.nextcommerce.com/latest/start-here/getting-started/ 301 +/docs/campaigns/upsells/reference/attributes https://cart-sdk.nextcommerce.com/latest/pages/upsell-page/ 301 +/docs/campaigns/upsells/reference/css https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#ui-helpers 301 +/docs/campaigns/upsells/reference/events https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#events 301 +/docs/campaigns/upsells/selectors https://cart-sdk.nextcommerce.com/latest/pages/upsell-page/ 301 +/docs/campaigns/utilities https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#utilities 301 +/docs/campaigns/utilities/debugger https://cart-sdk.nextcommerce.com/latest/reference/debugger/ 301 +/docs/campaigns/utilities/debugger/console-api https://cart-sdk.nextcommerce.com/latest/reference/debugger/ 301 +/docs/campaigns/utilities/debugger/get-started https://cart-sdk.nextcommerce.com/latest/reference/debugger/ 301 +/docs/campaigns/utilities/debugger/reference/methods https://cart-sdk.nextcommerce.com/latest/reference/debugger/ 301 +/docs/campaigns/utilities/exit-intent https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#on-page-popups 301 +/docs/campaigns/utilities/exit-intent/get-started https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#on-page-popups 301 +/docs/campaigns/utilities/exit-intent/image-mode https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#on-page-popups 301 +/docs/campaigns/utilities/exit-intent/reference/api https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#on-page-popups 301 +/docs/campaigns/utilities/exit-intent/reference/attributes https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#on-page-popups 301 +/docs/campaigns/utilities/exit-intent/reference/events https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#on-page-popups 301 +/docs/campaigns/utilities/exit-intent/template-mode https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#on-page-popups 301 +/docs/campaigns/utilities/loading-states https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#hiding-placeholders-until-prices-load 301 +/docs/campaigns/utilities/loading-states/get-started https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#hiding-placeholders-until-prices-load 301 +/docs/campaigns/utilities/loading-states/reference/attributes https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#hiding-placeholders-until-prices-load 301 +/docs/campaigns/utilities/loading-states/reference/css https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#hiding-placeholders-until-prices-load 301 # Old Redoc-style reference URL still linked from the platform changelog (with and without # trailing slash). Exact-path rules on purpose: /docs/admin-api/reference// are real pages. /docs/admin-api/reference /docs/admin-api 301 From 123cabac7822ae268653c13d7feb0e87a8286c65 Mon Sep 17 00:00:00 2001 From: Devin Michael Date: Mon, 7 Sep 2026 15:13:32 +0700 Subject: [PATCH 3/7] Retrigger Cloudflare Workers build The build for 02d721c failed with no log text exposed on the check run. The change is config-only, `npm run build` succeeds locally, `out/_redirects` is byte-identical to `public/_redirects`, every line is well-formed, and the file is far inside Cloudflare's documented 2,000 static / 100 dynamic limits at 167 and 4. Retriggering to separate a transient deploy failure from a real one. Co-Authored-By: Claude Opus 5 From d6d2a48a2bfd43be71fc74620fa86d857f83c124 Mon Sep 17 00:00:00 2001 From: Devin Michael Date: Mon, 7 Sep 2026 15:50:51 +0700 Subject: [PATCH 4/7] Fit redirects under Cloudflare's 100 dynamic-rule cap MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The deploy for 02d721c was rejected by the Cloudflare API: Invalid _redirects configuration: Line 121: Maximum number of dynamic _redirects rules limit of 100 exceeded Cloudflare counts every cross-host redirect as dynamic, not just those with a splat or placeholder. The earlier "167 static / 4 dynamic" reading used the wrong definition. Measured properly: 6de16d3 79 external + 4 splat = 83 deployed 02d721c 138 external + 4 splat = 142 rejected Enumerating one rule per historical page bought precision at the cost of a hard platform limit. This replaces it with one destination per section: 29 rules, 33 dynamic in total, comfortably inside the cap. The section shape also removes the precedence problem that motivated the enumeration. Each section's exact rule and its splat point at the same target, so it no longer matters which one Cloudflare matches first — the ordering question that produced the wrong destinations on the earlier preview simply cannot arise. The cost is anchor granularity: /checkout/payment now lands on the checkout page rather than #payment-methods. What matters for indexing is that every URL reaches the page that absorbed its content instead of the site root, which Google reads as a soft 404. Section anchors are kept where a whole section maps to one. FOMO still has no rule and there is deliberately no /utilities/* catch-all to swallow it, so its five paths 404. The three surviving utilities are listed individually. Verified: both files in sync across all 29 rules, no duplicate `from`, no rule catching a still-live page, no section with conflicting destinations, all 134 historical paths covered, and 32 of 35 flagged Search Console URLs mapped — the rest being the two FOMO paths and campaign-cart/cart-system, which the existing campaign-cart/:path rule already handles. `npm run check` passes. Co-Authored-By: Claude Opus 5 --- netlify.toml | 648 ++++------------------------------------------ public/_redirects | 174 ++++--------- 2 files changed, 97 insertions(+), 725 deletions(-) diff --git a/netlify.toml b/netlify.toml index 28aac0f..a228053 100644 --- a/netlify.toml +++ b/netlify.toml @@ -148,87 +148,70 @@ # Campaigns SDK reference moved to cart-sdk.nextcommerce.com # -# Every rule is an EXACT path and there are no wildcards in this block. That is -# deliberate. An earlier version listed specific paths above parent wildcards and -# relied on first-match-wins; on Cloudflare the parent wildcard won anyway, so -# /docs/campaigns/checkout/payment landed on the generic checkout page instead of -# the payment section. Enumerating every path means no two rules can match the -# same URL and precedence stops mattering on either host. +# Cloudflare counts every cross-host redirect as a *dynamic* rule and caps those at +# 100 per _redirects file. An earlier version of this block enumerated all 138 old +# paths and was rejected at deploy time with +# "Maximum number of dynamic _redirects rules limit of 100 exceeded". These 29 +# rules plus the 4 placeholder rules above stay well inside that cap. Do not +# expand this block back to one rule per page. # -# The list comes from the pages deleted in this repo's history, plus three URLs -# Search Console has indexed that predate that history (two analytics examples -# and campaign-cart/cart-system). Anything under /docs/campaigns/ not listed here -# either still exists (api/, page-kit, templates, admin-api) or never did. +# One destination per section, deliberately. Within a section the exact rule and +# its splat share the same target, so it does not matter which one Cloudflare +# matches first — an earlier attempt relied on specific-before-wildcard ordering +# and the parent wildcard won anyway on the preview deploy. Same-destination pairs +# make that question moot. # -# Destinations are sections, not the site root. The SDK site consolidated ~140 -# narrative pages into six reference pages plus the page-type guides, so the -# mapping is many-to-one — but a redirect to the root reads as a soft 404 to -# Google and drops the URL from the index, which is what Search Console reported -# between 2026-08-22 and 2026-09-07. Every destination page and anchor is -# verified against the built SDK site. +# The cost is anchor granularity: /checkout/payment lands on the checkout page +# rather than #payment-methods. That is an acceptable trade. What matters for +# indexing is that each URL reaches the page that actually absorbed its content +# instead of the site root, which Google reads as a soft 404 and drops. # -# FOMO is absent on purpose: the feature is gone from the SDK (no matches in -# src/), so its five old paths 404 rather than land somewhere that does not -# document them. - -[[redirects]] - from = "/docs/campaigns/analytics" - to = "https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/" - status = 301 - -[[redirects]] - from = "/docs/campaigns/analytics/best-practices" - to = "https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/" - status = 301 - -[[redirects]] - from = "/docs/campaigns/analytics/configuration" - to = "https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#required-settings" - status = 301 - -[[redirects]] - from = "/docs/campaigns/analytics/custom-events" - to = "https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#manual-events" - status = 301 +# FOMO has no rule, and there is deliberately no /utilities/* catch-all that would +# swallow it: the feature is gone from the SDK (no matches in src/), so its five +# old paths must 404. The three surviving utilities are listed individually. +# +# Anything else under /docs/campaigns/ either still exists (api/, page-kit, +# templates, admin-api) or never did. campaign-cart is handled by the +# campaign-cart/:path rule above. [[redirects]] - from = "/docs/campaigns/analytics/debugging" - to = "https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#enabling-analytics" + from = "/docs/campaigns/utilities/debugger" + to = "https://cart-sdk.nextcommerce.com/latest/reference/debugger/" status = 301 [[redirects]] - from = "/docs/campaigns/analytics/examples" - to = "https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#providers" + from = "/docs/campaigns/utilities/debugger/*" + to = "https://cart-sdk.nextcommerce.com/latest/reference/debugger/" status = 301 [[redirects]] - from = "/docs/campaigns/analytics/examples/custom-analytics-triggers" - to = "https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#providers" + from = "/docs/campaigns/utilities/exit-intent" + to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#on-page-popups" status = 301 [[redirects]] - from = "/docs/campaigns/analytics/examples/direct-ga4" - to = "https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#providers" + from = "/docs/campaigns/utilities/exit-intent/*" + to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#on-page-popups" status = 301 [[redirects]] - from = "/docs/campaigns/analytics/examples/facebook-pixel" - to = "https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#providers" + from = "/docs/campaigns/utilities/loading-states" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#hiding-placeholders-until-prices-load" status = 301 [[redirects]] - from = "/docs/campaigns/analytics/examples/google-tag-manager" - to = "https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#providers" + from = "/docs/campaigns/utilities/loading-states/*" + to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#hiding-placeholders-until-prices-load" status = 301 [[redirects]] - from = "/docs/campaigns/analytics/examples/rudderstack" - to = "https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#providers" + from = "/docs/campaigns/analytics" + to = "https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/" status = 301 [[redirects]] - from = "/docs/campaigns/analytics/tracking-api" - to = "https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#manual-tracking" + from = "/docs/campaigns/analytics/*" + to = "https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/" status = 301 [[redirects]] @@ -237,112 +220,17 @@ status = 301 [[redirects]] - from = "/docs/campaigns/bundle-selector/get-started" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#bundle-selector" - status = 301 - -[[redirects]] - from = "/docs/campaigns/bundle-selector/mechanics" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#selection-mode" - status = 301 - -[[redirects]] - from = "/docs/campaigns/bundle-selector/prices" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#display-values" - status = 301 - -[[redirects]] - from = "/docs/campaigns/bundle-selector/reference/attributes" + from = "/docs/campaigns/bundle-selector/*" to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#bundle-selector" status = 301 -[[redirects]] - from = "/docs/campaigns/bundle-selector/reference/css" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#ui-helpers" - status = 301 - -[[redirects]] - from = "/docs/campaigns/bundle-selector/reference/events" - to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#events" - status = 301 - -[[redirects]] - from = "/docs/campaigns/bundle-selector/select-mode" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#selection-mode" - status = 301 - -[[redirects]] - from = "/docs/campaigns/bundle-selector/shipping" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#the-shipping-object" - status = 301 - -[[redirects]] - from = "/docs/campaigns/bundle-selector/slots" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#bundle-selector" - status = 301 - -[[redirects]] - from = "/docs/campaigns/bundle-selector/variants" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#multi-variant-selectors" - status = 301 - -[[redirects]] - from = "/docs/campaigns/bundle-selector/vouchers" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#voucher-codes" - status = 301 - -[[redirects]] - from = "/docs/campaigns/campaign-cart" - to = "https://cart-sdk.nextcommerce.com/latest/start-here/how-it-works/" - status = 301 - -[[redirects]] - from = "/docs/campaigns/campaign-cart/cart-system" - to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#cart-operations" - status = 301 - [[redirects]] from = "/docs/campaigns/cart-summary" to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary" status = 301 [[redirects]] - from = "/docs/campaigns/cart-summary/cart-display" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary" - status = 301 - -[[redirects]] - from = "/docs/campaigns/cart-summary/custom-template" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary" - status = 301 - -[[redirects]] - from = "/docs/campaigns/cart-summary/get-started" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary" - status = 301 - -[[redirects]] - from = "/docs/campaigns/cart-summary/reference/attributes" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary" - status = 301 - -[[redirects]] - from = "/docs/campaigns/cart-summary/reference/css" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#ui-helpers" - status = 301 - -[[redirects]] - from = "/docs/campaigns/cart-summary/reference/events" - to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#events" - status = 301 - -[[redirects]] - from = "/docs/campaigns/cart-summary/reference/object-attributes" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary" - status = 301 - -[[redirects]] - from = "/docs/campaigns/cart-summary/summary-lists" + from = "/docs/campaigns/cart-summary/*" to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary" status = 301 @@ -352,317 +240,47 @@ status = 301 [[redirects]] - from = "/docs/campaigns/cart-system/bundle-selector" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#bundle-selector" - status = 301 - -[[redirects]] - from = "/docs/campaigns/cart-system/buttons" - to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#cart-operations" - status = 301 - -[[redirects]] - from = "/docs/campaigns/cart-system/cart-summary" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary" - status = 301 - -[[redirects]] - from = "/docs/campaigns/cart-system/get-started" - to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#cart-operations" - status = 301 - -[[redirects]] - from = "/docs/campaigns/cart-system/quantity" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#quantity-stepper" - status = 301 - -[[redirects]] - from = "/docs/campaigns/cart-system/reference/attributes" + from = "/docs/campaigns/cart-system/*" to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#cart-operations" status = 301 -[[redirects]] - from = "/docs/campaigns/cart-system/reference/css" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#ui-helpers" - status = 301 - -[[redirects]] - from = "/docs/campaigns/cart-system/reference/events" - to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#events" - status = 301 - -[[redirects]] - from = "/docs/campaigns/cart-system/state" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container" - status = 301 - [[redirects]] from = "/docs/campaigns/checkout" to = "https://cart-sdk.nextcommerce.com/latest/pages/checkout-page/" status = 301 [[redirects]] - from = "/docs/campaigns/checkout/address-autocomplete" - to = "https://cart-sdk.nextcommerce.com/latest/pages/checkout-page/" - status = 301 - -[[redirects]] - from = "/docs/campaigns/checkout/express-checkout" + from = "/docs/campaigns/checkout/*" to = "https://cart-sdk.nextcommerce.com/latest/pages/checkout-page/" status = 301 -[[redirects]] - from = "/docs/campaigns/checkout/form" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#checkout-form" - status = 301 - -[[redirects]] - from = "/docs/campaigns/checkout/get-started" - to = "https://cart-sdk.nextcommerce.com/latest/pages/checkout-page/" - status = 301 - -[[redirects]] - from = "/docs/campaigns/checkout/order-flow" - to = "https://cart-sdk.nextcommerce.com/latest/pages/checkout-page/" - status = 301 - -[[redirects]] - from = "/docs/campaigns/checkout/payment" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#payment-methods" - status = 301 - -[[redirects]] - from = "/docs/campaigns/checkout/prospect-cart" - to = "https://cart-sdk.nextcommerce.com/latest/pages/checkout-page/" - status = 301 - -[[redirects]] - from = "/docs/campaigns/checkout/reference/attributes" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#checkout-form" - status = 301 - -[[redirects]] - from = "/docs/campaigns/checkout/reference/css" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#ui-helpers" - status = 301 - -[[redirects]] - from = "/docs/campaigns/checkout/reference/events" - to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#events" - status = 301 - -[[redirects]] - from = "/docs/campaigns/checkout/review" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#checkout-form" - status = 301 - [[redirects]] from = "/docs/campaigns/configuration" to = "https://cart-sdk.nextcommerce.com/latest/reference/window-globals/#windownextconfig" status = 301 [[redirects]] - from = "/docs/campaigns/data-attributes" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/" - status = 301 - -[[redirects]] - from = "/docs/campaigns/data-attributes/actions" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/" - status = 301 - -[[redirects]] - from = "/docs/campaigns/data-attributes/actions/cart-actions" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/" - status = 301 - -[[redirects]] - from = "/docs/campaigns/data-attributes/actions/get-started" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/" - status = 301 - -[[redirects]] - from = "/docs/campaigns/data-attributes/actions/quantity-actions" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/" + from = "/docs/campaigns/configuration/*" + to = "https://cart-sdk.nextcommerce.com/latest/reference/window-globals/#windownextconfig" status = 301 [[redirects]] - from = "/docs/campaigns/data-attributes/actions/reference/attributes" + from = "/docs/campaigns/data-attributes" to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/" status = 301 [[redirects]] - from = "/docs/campaigns/data-attributes/campaign" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#display-paths" - status = 301 - -[[redirects]] - from = "/docs/campaigns/data-attributes/campaign/reference/attributes" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#display-paths" - status = 301 - -[[redirects]] - from = "/docs/campaigns/data-attributes/checkout-review" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#checkout-form" - status = 301 - -[[redirects]] - from = "/docs/campaigns/data-attributes/checkout-review/get-started" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#checkout-form" - status = 301 - -[[redirects]] - from = "/docs/campaigns/data-attributes/checkout-review/reference/attributes" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#checkout-form" - status = 301 - -[[redirects]] - from = "/docs/campaigns/data-attributes/configuration" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#formatting" - status = 301 - -[[redirects]] - from = "/docs/campaigns/data-attributes/configuration/formatting" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#formatting" - status = 301 - -[[redirects]] - from = "/docs/campaigns/data-attributes/configuration/math" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#formatting" - status = 301 - -[[redirects]] - from = "/docs/campaigns/data-attributes/configuration/reference/attributes" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#formatting" - status = 301 - -[[redirects]] - from = "/docs/campaigns/data-attributes/css-classes" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#ui-helpers" - status = 301 - -[[redirects]] - from = "/docs/campaigns/data-attributes/css-classes/reference/css" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#ui-helpers" - status = 301 - -[[redirects]] - from = "/docs/campaigns/data-attributes/display" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#displaying-live-values" - status = 301 - -[[redirects]] - from = "/docs/campaigns/data-attributes/display/cart-items-template" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#displaying-live-values" - status = 301 - -[[redirects]] - from = "/docs/campaigns/data-attributes/display/get-started" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#displaying-live-values" - status = 301 - -[[redirects]] - from = "/docs/campaigns/data-attributes/display/package-display" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#displaying-live-values" - status = 301 - -[[redirects]] - from = "/docs/campaigns/data-attributes/display/paths" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#displaying-live-values" - status = 301 - -[[redirects]] - from = "/docs/campaigns/data-attributes/display/reference/attributes" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#displaying-live-values" - status = 301 - -[[redirects]] - from = "/docs/campaigns/data-attributes/order-data" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#the-order-object" - status = 301 - -[[redirects]] - from = "/docs/campaigns/data-attributes/order-data/get-started" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#the-order-object" - status = 301 - -[[redirects]] - from = "/docs/campaigns/data-attributes/order-data/order-items-template" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#the-order-object" - status = 301 - -[[redirects]] - from = "/docs/campaigns/data-attributes/order-data/properties" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#the-order-object" - status = 301 - -[[redirects]] - from = "/docs/campaigns/data-attributes/order-data/reference/attributes" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#the-order-object" - status = 301 - -[[redirects]] - from = "/docs/campaigns/data-attributes/prospect-cart" + from = "/docs/campaigns/data-attributes/*" to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/" status = 301 [[redirects]] - from = "/docs/campaigns/data-attributes/selection" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#selection-mode" - status = 301 - -[[redirects]] - from = "/docs/campaigns/data-attributes/selection/reference/attributes" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#selection-mode" - status = 301 - -[[redirects]] - from = "/docs/campaigns/data-attributes/state" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container" - status = 301 - -[[redirects]] - from = "/docs/campaigns/data-attributes/state/get-started" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container" - status = 301 - -[[redirects]] - from = "/docs/campaigns/data-attributes/state/operators" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container" - status = 301 - -[[redirects]] - from = "/docs/campaigns/data-attributes/state/properties" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container" - status = 301 - -[[redirects]] - from = "/docs/campaigns/data-attributes/state/reference/attributes" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container" - status = 301 - -[[redirects]] - from = "/docs/campaigns/data-attributes/url-parameters" - to = "https://cart-sdk.nextcommerce.com/latest/reference/url-parameters/" - status = 301 - -[[redirects]] - from = "/docs/campaigns/data-attributes/url-parameters/get-started" - to = "https://cart-sdk.nextcommerce.com/latest/reference/url-parameters/" - status = 301 - -[[redirects]] - from = "/docs/campaigns/data-attributes/url-parameters/javascript-api" - to = "https://cart-sdk.nextcommerce.com/latest/reference/url-parameters/" - status = 301 - -[[redirects]] - from = "/docs/campaigns/data-attributes/url-parameters/reference/attributes" - to = "https://cart-sdk.nextcommerce.com/latest/reference/url-parameters/" + from = "/docs/campaigns/guides" + to = "https://cart-sdk.nextcommerce.com/latest/start-here/getting-started/" status = 301 [[redirects]] - from = "/docs/campaigns/guides" + from = "/docs/campaigns/guides/*" to = "https://cart-sdk.nextcommerce.com/latest/start-here/getting-started/" status = 301 @@ -672,13 +290,8 @@ status = 301 [[redirects]] - from = "/docs/campaigns/javascript-api/attribution-metadata" - to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#attribution-and-metadata" - status = 301 - -[[redirects]] - from = "/docs/campaigns/javascript-api/events" - to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#events" + from = "/docs/campaigns/javascript-api/*" + to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/" status = 301 [[redirects]] @@ -687,97 +300,17 @@ status = 301 [[redirects]] - from = "/docs/campaigns/package-toggle/auto-render" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#order-bumps" - status = 301 - -[[redirects]] - from = "/docs/campaigns/package-toggle/card-templates" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#order-bumps" - status = 301 - -[[redirects]] - from = "/docs/campaigns/package-toggle/get-started" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#order-bumps" - status = 301 - -[[redirects]] - from = "/docs/campaigns/package-toggle/prices" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#display-values" - status = 301 - -[[redirects]] - from = "/docs/campaigns/package-toggle/quantity-sync" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#quantity-sync" - status = 301 - -[[redirects]] - from = "/docs/campaigns/package-toggle/reference/attributes" + from = "/docs/campaigns/package-toggle/*" to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#order-bumps" status = 301 -[[redirects]] - from = "/docs/campaigns/package-toggle/reference/css" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#ui-helpers" - status = 301 - -[[redirects]] - from = "/docs/campaigns/package-toggle/reference/events" - to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#events" - status = 301 - -[[redirects]] - from = "/docs/campaigns/package-toggle/state-containers" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container" - status = 301 - [[redirects]] from = "/docs/campaigns/upsells" to = "https://cart-sdk.nextcommerce.com/latest/pages/upsell-page/" status = 301 [[redirects]] - from = "/docs/campaigns/upsells/accept-button" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#accepting-and-declining" - status = 301 - -[[redirects]] - from = "/docs/campaigns/upsells/flow" - to = "https://cart-sdk.nextcommerce.com/latest/pages/upsell-page/" - status = 301 - -[[redirects]] - from = "/docs/campaigns/upsells/get-started" - to = "https://cart-sdk.nextcommerce.com/latest/pages/upsell-page/" - status = 301 - -[[redirects]] - from = "/docs/campaigns/upsells/offer-container" - to = "https://cart-sdk.nextcommerce.com/latest/pages/upsell-page/" - status = 301 - -[[redirects]] - from = "/docs/campaigns/upsells/quantity" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#post-purchase-upsells" - status = 301 - -[[redirects]] - from = "/docs/campaigns/upsells/reference/attributes" - to = "https://cart-sdk.nextcommerce.com/latest/pages/upsell-page/" - status = 301 - -[[redirects]] - from = "/docs/campaigns/upsells/reference/css" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#ui-helpers" - status = 301 - -[[redirects]] - from = "/docs/campaigns/upsells/reference/events" - to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#events" - status = 301 - -[[redirects]] - from = "/docs/campaigns/upsells/selectors" + from = "/docs/campaigns/upsells/*" to = "https://cart-sdk.nextcommerce.com/latest/pages/upsell-page/" status = 301 @@ -786,81 +319,6 @@ to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#utilities" status = 301 -[[redirects]] - from = "/docs/campaigns/utilities/debugger" - to = "https://cart-sdk.nextcommerce.com/latest/reference/debugger/" - status = 301 - -[[redirects]] - from = "/docs/campaigns/utilities/debugger/console-api" - to = "https://cart-sdk.nextcommerce.com/latest/reference/debugger/" - status = 301 - -[[redirects]] - from = "/docs/campaigns/utilities/debugger/get-started" - to = "https://cart-sdk.nextcommerce.com/latest/reference/debugger/" - status = 301 - -[[redirects]] - from = "/docs/campaigns/utilities/debugger/reference/methods" - to = "https://cart-sdk.nextcommerce.com/latest/reference/debugger/" - status = 301 - -[[redirects]] - from = "/docs/campaigns/utilities/exit-intent" - to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#on-page-popups" - status = 301 - -[[redirects]] - from = "/docs/campaigns/utilities/exit-intent/get-started" - to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#on-page-popups" - status = 301 - -[[redirects]] - from = "/docs/campaigns/utilities/exit-intent/image-mode" - to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#on-page-popups" - status = 301 - -[[redirects]] - from = "/docs/campaigns/utilities/exit-intent/reference/api" - to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#on-page-popups" - status = 301 - -[[redirects]] - from = "/docs/campaigns/utilities/exit-intent/reference/attributes" - to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#on-page-popups" - status = 301 - -[[redirects]] - from = "/docs/campaigns/utilities/exit-intent/reference/events" - to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#on-page-popups" - status = 301 - -[[redirects]] - from = "/docs/campaigns/utilities/exit-intent/template-mode" - to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#on-page-popups" - status = 301 - -[[redirects]] - from = "/docs/campaigns/utilities/loading-states" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#hiding-placeholders-until-prices-load" - status = 301 - -[[redirects]] - from = "/docs/campaigns/utilities/loading-states/get-started" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#hiding-placeholders-until-prices-load" - status = 301 - -[[redirects]] - from = "/docs/campaigns/utilities/loading-states/reference/attributes" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#hiding-placeholders-until-prices-load" - status = 301 - -[[redirects]] - from = "/docs/campaigns/utilities/loading-states/reference/css" - to = "https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#hiding-placeholders-until-prices-load" - status = 301 - # Old Redoc-style reference URL still linked from the platform changelog. # Exact path only (Netlify also matches the trailing-slash form); the deep # /docs/admin-api/reference// pages are real and must not be caught. diff --git a/public/_redirects b/public/_redirects index 7b36541..6469971 100644 --- a/public/_redirects +++ b/public/_redirects @@ -33,148 +33,62 @@ # Bankcard guide slug renamed from iframe-payment-form /docs/admin-api/guides/payment-methods/iframe-payment-form /docs/admin-api/guides/payment-methods/bankcard 301 -# Campaigns SDK reference moved to cart-sdk.nextcommerce.com — reasoning in -# netlify.toml. Exact paths only, no wildcards: Cloudflare let a parent -# wildcard beat a more specific rule listed above it. Keep the two in sync; -# this file is what Cloudflare actually serves. +# Campaigns SDK reference moved to cart-sdk.nextcommerce.com +# +# Cloudflare counts every cross-host redirect as a *dynamic* rule and caps those at +# 100 per _redirects file. An earlier version of this block enumerated all 138 old +# paths and was rejected at deploy time with +# "Maximum number of dynamic _redirects rules limit of 100 exceeded". These 29 +# rules plus the 4 placeholder rules above stay well inside that cap. Do not +# expand this block back to one rule per page. +# +# One destination per section, deliberately. Within a section the exact rule and +# its splat share the same target, so it does not matter which one Cloudflare +# matches first — an earlier attempt relied on specific-before-wildcard ordering +# and the parent wildcard won anyway on the preview deploy. Same-destination pairs +# make that question moot. +# +# The cost is anchor granularity: /checkout/payment lands on the checkout page +# rather than #payment-methods. That is an acceptable trade. What matters for +# indexing is that each URL reaches the page that actually absorbed its content +# instead of the site root, which Google reads as a soft 404 and drops. +# +# FOMO has no rule, and there is deliberately no /utilities/* catch-all that would +# swallow it: the feature is gone from the SDK (no matches in src/), so its five +# old paths must 404. The three surviving utilities are listed individually. +# +# Anything else under /docs/campaigns/ either still exists (api/, page-kit, +# templates, admin-api) or never did. campaign-cart is handled by the +# campaign-cart/:path rule above. +/docs/campaigns/utilities/debugger https://cart-sdk.nextcommerce.com/latest/reference/debugger/ 301 +/docs/campaigns/utilities/debugger/* https://cart-sdk.nextcommerce.com/latest/reference/debugger/ 301 +/docs/campaigns/utilities/exit-intent https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#on-page-popups 301 +/docs/campaigns/utilities/exit-intent/* https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#on-page-popups 301 +/docs/campaigns/utilities/loading-states https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#hiding-placeholders-until-prices-load 301 +/docs/campaigns/utilities/loading-states/* https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#hiding-placeholders-until-prices-load 301 /docs/campaigns/analytics https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/ 301 -/docs/campaigns/analytics/best-practices https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/ 301 -/docs/campaigns/analytics/configuration https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#required-settings 301 -/docs/campaigns/analytics/custom-events https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#manual-events 301 -/docs/campaigns/analytics/debugging https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#enabling-analytics 301 -/docs/campaigns/analytics/examples https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#providers 301 -/docs/campaigns/analytics/examples/custom-analytics-triggers https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#providers 301 -/docs/campaigns/analytics/examples/direct-ga4 https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#providers 301 -/docs/campaigns/analytics/examples/facebook-pixel https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#providers 301 -/docs/campaigns/analytics/examples/google-tag-manager https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#providers 301 -/docs/campaigns/analytics/examples/rudderstack https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#providers 301 -/docs/campaigns/analytics/tracking-api https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/#manual-tracking 301 +/docs/campaigns/analytics/* https://cart-sdk.nextcommerce.com/latest/reference/analytics-events/ 301 /docs/campaigns/bundle-selector https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#bundle-selector 301 -/docs/campaigns/bundle-selector/get-started https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#bundle-selector 301 -/docs/campaigns/bundle-selector/mechanics https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#selection-mode 301 -/docs/campaigns/bundle-selector/prices https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#display-values 301 -/docs/campaigns/bundle-selector/reference/attributes https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#bundle-selector 301 -/docs/campaigns/bundle-selector/reference/css https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#ui-helpers 301 -/docs/campaigns/bundle-selector/reference/events https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#events 301 -/docs/campaigns/bundle-selector/select-mode https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#selection-mode 301 -/docs/campaigns/bundle-selector/shipping https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#the-shipping-object 301 -/docs/campaigns/bundle-selector/slots https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#bundle-selector 301 -/docs/campaigns/bundle-selector/variants https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#multi-variant-selectors 301 -/docs/campaigns/bundle-selector/vouchers https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#voucher-codes 301 -/docs/campaigns/campaign-cart https://cart-sdk.nextcommerce.com/latest/start-here/how-it-works/ 301 -/docs/campaigns/campaign-cart/cart-system https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#cart-operations 301 +/docs/campaigns/bundle-selector/* https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#bundle-selector 301 /docs/campaigns/cart-summary https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary 301 -/docs/campaigns/cart-summary/cart-display https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary 301 -/docs/campaigns/cart-summary/custom-template https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary 301 -/docs/campaigns/cart-summary/get-started https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary 301 -/docs/campaigns/cart-summary/reference/attributes https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary 301 -/docs/campaigns/cart-summary/reference/css https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#ui-helpers 301 -/docs/campaigns/cart-summary/reference/events https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#events 301 -/docs/campaigns/cart-summary/reference/object-attributes https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary 301 -/docs/campaigns/cart-summary/summary-lists https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary 301 +/docs/campaigns/cart-summary/* https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary 301 /docs/campaigns/cart-system https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#cart-operations 301 -/docs/campaigns/cart-system/bundle-selector https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#bundle-selector 301 -/docs/campaigns/cart-system/buttons https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#cart-operations 301 -/docs/campaigns/cart-system/cart-summary https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#cart-summary 301 -/docs/campaigns/cart-system/get-started https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#cart-operations 301 -/docs/campaigns/cart-system/quantity https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#quantity-stepper 301 -/docs/campaigns/cart-system/reference/attributes https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#cart-operations 301 -/docs/campaigns/cart-system/reference/css https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#ui-helpers 301 -/docs/campaigns/cart-system/reference/events https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#events 301 -/docs/campaigns/cart-system/state https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container 301 +/docs/campaigns/cart-system/* https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#cart-operations 301 /docs/campaigns/checkout https://cart-sdk.nextcommerce.com/latest/pages/checkout-page/ 301 -/docs/campaigns/checkout/address-autocomplete https://cart-sdk.nextcommerce.com/latest/pages/checkout-page/ 301 -/docs/campaigns/checkout/express-checkout https://cart-sdk.nextcommerce.com/latest/pages/checkout-page/ 301 -/docs/campaigns/checkout/form https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#checkout-form 301 -/docs/campaigns/checkout/get-started https://cart-sdk.nextcommerce.com/latest/pages/checkout-page/ 301 -/docs/campaigns/checkout/order-flow https://cart-sdk.nextcommerce.com/latest/pages/checkout-page/ 301 -/docs/campaigns/checkout/payment https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#payment-methods 301 -/docs/campaigns/checkout/prospect-cart https://cart-sdk.nextcommerce.com/latest/pages/checkout-page/ 301 -/docs/campaigns/checkout/reference/attributes https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#checkout-form 301 -/docs/campaigns/checkout/reference/css https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#ui-helpers 301 -/docs/campaigns/checkout/reference/events https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#events 301 -/docs/campaigns/checkout/review https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#checkout-form 301 +/docs/campaigns/checkout/* https://cart-sdk.nextcommerce.com/latest/pages/checkout-page/ 301 /docs/campaigns/configuration https://cart-sdk.nextcommerce.com/latest/reference/window-globals/#windownextconfig 301 +/docs/campaigns/configuration/* https://cart-sdk.nextcommerce.com/latest/reference/window-globals/#windownextconfig 301 /docs/campaigns/data-attributes https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/ 301 -/docs/campaigns/data-attributes/actions https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/ 301 -/docs/campaigns/data-attributes/actions/cart-actions https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/ 301 -/docs/campaigns/data-attributes/actions/get-started https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/ 301 -/docs/campaigns/data-attributes/actions/quantity-actions https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/ 301 -/docs/campaigns/data-attributes/actions/reference/attributes https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/ 301 -/docs/campaigns/data-attributes/campaign https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#display-paths 301 -/docs/campaigns/data-attributes/campaign/reference/attributes https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#display-paths 301 -/docs/campaigns/data-attributes/checkout-review https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#checkout-form 301 -/docs/campaigns/data-attributes/checkout-review/get-started https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#checkout-form 301 -/docs/campaigns/data-attributes/checkout-review/reference/attributes https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#checkout-form 301 -/docs/campaigns/data-attributes/configuration https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#formatting 301 -/docs/campaigns/data-attributes/configuration/formatting https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#formatting 301 -/docs/campaigns/data-attributes/configuration/math https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#formatting 301 -/docs/campaigns/data-attributes/configuration/reference/attributes https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#formatting 301 -/docs/campaigns/data-attributes/css-classes https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#ui-helpers 301 -/docs/campaigns/data-attributes/css-classes/reference/css https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#ui-helpers 301 -/docs/campaigns/data-attributes/display https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#displaying-live-values 301 -/docs/campaigns/data-attributes/display/cart-items-template https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#displaying-live-values 301 -/docs/campaigns/data-attributes/display/get-started https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#displaying-live-values 301 -/docs/campaigns/data-attributes/display/package-display https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#displaying-live-values 301 -/docs/campaigns/data-attributes/display/paths https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#displaying-live-values 301 -/docs/campaigns/data-attributes/display/reference/attributes https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#displaying-live-values 301 -/docs/campaigns/data-attributes/order-data https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#the-order-object 301 -/docs/campaigns/data-attributes/order-data/get-started https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#the-order-object 301 -/docs/campaigns/data-attributes/order-data/order-items-template https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#the-order-object 301 -/docs/campaigns/data-attributes/order-data/properties https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#the-order-object 301 -/docs/campaigns/data-attributes/order-data/reference/attributes https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#the-order-object 301 -/docs/campaigns/data-attributes/prospect-cart https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/ 301 -/docs/campaigns/data-attributes/selection https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#selection-mode 301 -/docs/campaigns/data-attributes/selection/reference/attributes https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#selection-mode 301 -/docs/campaigns/data-attributes/state https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container 301 -/docs/campaigns/data-attributes/state/get-started https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container 301 -/docs/campaigns/data-attributes/state/operators https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container 301 -/docs/campaigns/data-attributes/state/properties https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container 301 -/docs/campaigns/data-attributes/state/reference/attributes https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container 301 -/docs/campaigns/data-attributes/url-parameters https://cart-sdk.nextcommerce.com/latest/reference/url-parameters/ 301 -/docs/campaigns/data-attributes/url-parameters/get-started https://cart-sdk.nextcommerce.com/latest/reference/url-parameters/ 301 -/docs/campaigns/data-attributes/url-parameters/javascript-api https://cart-sdk.nextcommerce.com/latest/reference/url-parameters/ 301 -/docs/campaigns/data-attributes/url-parameters/reference/attributes https://cart-sdk.nextcommerce.com/latest/reference/url-parameters/ 301 +/docs/campaigns/data-attributes/* https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/ 301 /docs/campaigns/guides https://cart-sdk.nextcommerce.com/latest/start-here/getting-started/ 301 +/docs/campaigns/guides/* https://cart-sdk.nextcommerce.com/latest/start-here/getting-started/ 301 /docs/campaigns/javascript-api https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/ 301 -/docs/campaigns/javascript-api/attribution-metadata https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#attribution-and-metadata 301 -/docs/campaigns/javascript-api/events https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#events 301 +/docs/campaigns/javascript-api/* https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/ 301 /docs/campaigns/package-toggle https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#order-bumps 301 -/docs/campaigns/package-toggle/auto-render https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#order-bumps 301 -/docs/campaigns/package-toggle/card-templates https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#order-bumps 301 -/docs/campaigns/package-toggle/get-started https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#order-bumps 301 -/docs/campaigns/package-toggle/prices https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#display-values 301 -/docs/campaigns/package-toggle/quantity-sync https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#quantity-sync 301 -/docs/campaigns/package-toggle/reference/attributes https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#order-bumps 301 -/docs/campaigns/package-toggle/reference/css https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#ui-helpers 301 -/docs/campaigns/package-toggle/reference/events https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#events 301 -/docs/campaigns/package-toggle/state-containers https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#state-container 301 +/docs/campaigns/package-toggle/* https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#order-bumps 301 /docs/campaigns/upsells https://cart-sdk.nextcommerce.com/latest/pages/upsell-page/ 301 -/docs/campaigns/upsells/accept-button https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#accepting-and-declining 301 -/docs/campaigns/upsells/flow https://cart-sdk.nextcommerce.com/latest/pages/upsell-page/ 301 -/docs/campaigns/upsells/get-started https://cart-sdk.nextcommerce.com/latest/pages/upsell-page/ 301 -/docs/campaigns/upsells/offer-container https://cart-sdk.nextcommerce.com/latest/pages/upsell-page/ 301 -/docs/campaigns/upsells/quantity https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#post-purchase-upsells 301 -/docs/campaigns/upsells/reference/attributes https://cart-sdk.nextcommerce.com/latest/pages/upsell-page/ 301 -/docs/campaigns/upsells/reference/css https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#ui-helpers 301 -/docs/campaigns/upsells/reference/events https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#events 301 -/docs/campaigns/upsells/selectors https://cart-sdk.nextcommerce.com/latest/pages/upsell-page/ 301 +/docs/campaigns/upsells/* https://cart-sdk.nextcommerce.com/latest/pages/upsell-page/ 301 /docs/campaigns/utilities https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#utilities 301 -/docs/campaigns/utilities/debugger https://cart-sdk.nextcommerce.com/latest/reference/debugger/ 301 -/docs/campaigns/utilities/debugger/console-api https://cart-sdk.nextcommerce.com/latest/reference/debugger/ 301 -/docs/campaigns/utilities/debugger/get-started https://cart-sdk.nextcommerce.com/latest/reference/debugger/ 301 -/docs/campaigns/utilities/debugger/reference/methods https://cart-sdk.nextcommerce.com/latest/reference/debugger/ 301 -/docs/campaigns/utilities/exit-intent https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#on-page-popups 301 -/docs/campaigns/utilities/exit-intent/get-started https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#on-page-popups 301 -/docs/campaigns/utilities/exit-intent/image-mode https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#on-page-popups 301 -/docs/campaigns/utilities/exit-intent/reference/api https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#on-page-popups 301 -/docs/campaigns/utilities/exit-intent/reference/attributes https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#on-page-popups 301 -/docs/campaigns/utilities/exit-intent/reference/events https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#on-page-popups 301 -/docs/campaigns/utilities/exit-intent/template-mode https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#on-page-popups 301 -/docs/campaigns/utilities/loading-states https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#hiding-placeholders-until-prices-load 301 -/docs/campaigns/utilities/loading-states/get-started https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#hiding-placeholders-until-prices-load 301 -/docs/campaigns/utilities/loading-states/reference/attributes https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#hiding-placeholders-until-prices-load 301 -/docs/campaigns/utilities/loading-states/reference/css https://cart-sdk.nextcommerce.com/latest/reference/data-attributes/#hiding-placeholders-until-prices-load 301 # Old Redoc-style reference URL still linked from the platform changelog (with and without # trailing slash). Exact-path rules on purpose: /docs/admin-api/reference// are real pages. /docs/admin-api/reference /docs/admin-api 301 From ebe87169562ad0efe00b15075fab7def83235e83 Mon Sep 17 00:00:00 2001 From: Devin Michael Date: Mon, 7 Sep 2026 16:05:46 +0700 Subject: [PATCH 5/7] Redirect the bare campaign-cart index MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A full sweep of all 140 historical paths against the preview deploy found /docs/campaigns/campaign-cart returning 404. The rule was left out on the assumption that the existing campaign-cart/:path rule covered it, but :path only matches sub-paths — campaign-cart/cart-system resolves correctly while the section index itself falls through to a 404. It was a real published page (campaign-cart/index.mdx), so it needs its own rule. Takes the block to 30 rules, 34 dynamic against Cloudflare's cap of 100. Co-Authored-By: Claude Opus 5 --- netlify.toml | 8 ++++++++ public/_redirects | 3 +++ 2 files changed, 11 insertions(+) diff --git a/netlify.toml b/netlify.toml index a228053..6670866 100644 --- a/netlify.toml +++ b/netlify.toml @@ -319,6 +319,14 @@ to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#utilities" status = 301 +# The bare campaign-cart index needs its own rule: the campaign-cart/:path rule +# above only matches sub-paths, so without this the index 404s. + +[[redirects]] + from = "/docs/campaigns/campaign-cart" + to = "https://cart-sdk.nextcommerce.com/latest/start-here/how-it-works/" + status = 301 + # Old Redoc-style reference URL still linked from the platform changelog. # Exact path only (Netlify also matches the trailing-slash form); the deep # /docs/admin-api/reference// pages are real and must not be caught. diff --git a/public/_redirects b/public/_redirects index 6469971..1245c5b 100644 --- a/public/_redirects +++ b/public/_redirects @@ -89,6 +89,9 @@ /docs/campaigns/upsells https://cart-sdk.nextcommerce.com/latest/pages/upsell-page/ 301 /docs/campaigns/upsells/* https://cart-sdk.nextcommerce.com/latest/pages/upsell-page/ 301 /docs/campaigns/utilities https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#utilities 301 +# The bare campaign-cart index needs its own rule: the campaign-cart/:path rule +# above only matches sub-paths, so without this the index 404s. +/docs/campaigns/campaign-cart https://cart-sdk.nextcommerce.com/latest/start-here/how-it-works/ 301 # Old Redoc-style reference URL still linked from the platform changelog (with and without # trailing slash). Exact-path rules on purpose: /docs/admin-api/reference// are real pages. /docs/admin-api/reference /docs/admin-api 301 From 98da688b5264b32c439e541e0751521b47caa7ca Mon Sep 17 00:00:00 2001 From: Devin Michael Date: Mon, 7 Sep 2026 16:13:53 +0700 Subject: [PATCH 6/7] Clarify campaign-cart comment: sub-paths vs bare index The previous commit added an exact rule for the bare campaign-cart index but left the block comment above claiming campaign-cart is handled entirely by the campaign-cart/:path rule. Sub-paths are; the index has its own rule. Co-Authored-By: Claude Opus 5 --- netlify.toml | 4 ++-- public/_redirects | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/netlify.toml b/netlify.toml index 6670866..9b0559c 100644 --- a/netlify.toml +++ b/netlify.toml @@ -171,8 +171,8 @@ # old paths must 404. The three surviving utilities are listed individually. # # Anything else under /docs/campaigns/ either still exists (api/, page-kit, -# templates, admin-api) or never did. campaign-cart is handled by the -# campaign-cart/:path rule above. +# templates, admin-api) or never did. campaign-cart sub-paths are handled by the +# campaign-cart/:path rule above; the bare index has its own rule below. [[redirects]] from = "/docs/campaigns/utilities/debugger" diff --git a/public/_redirects b/public/_redirects index 1245c5b..a059aef 100644 --- a/public/_redirects +++ b/public/_redirects @@ -58,8 +58,8 @@ # old paths must 404. The three surviving utilities are listed individually. # # Anything else under /docs/campaigns/ either still exists (api/, page-kit, -# templates, admin-api) or never did. campaign-cart is handled by the -# campaign-cart/:path rule above. +# templates, admin-api) or never did. campaign-cart sub-paths are handled by the +# campaign-cart/:path rule above; the bare index has its own rule below. /docs/campaigns/utilities/debugger https://cart-sdk.nextcommerce.com/latest/reference/debugger/ 301 /docs/campaigns/utilities/debugger/* https://cart-sdk.nextcommerce.com/latest/reference/debugger/ 301 /docs/campaigns/utilities/exit-intent https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#on-page-popups 301 From 38be9f9f13db5fcc679e4e7018be35efc0b0d662 Mon Sep 17 00:00:00 2001 From: Devin Michael Date: Mon, 7 Sep 2026 16:17:20 +0700 Subject: [PATCH 7/7] Name the campaign-cart rule in full to disambiguate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two rules above end in campaign-cart/:path — /docs/campaign-cart/:path and /docs/campaigns/campaign-cart/:path. Both comments referring to "the campaign-cart/:path rule above" now name the full pattern, in each file. Comments only; no rule changed. Co-Authored-By: Claude Opus 5 --- netlify.toml | 5 +++-- public/_redirects | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/netlify.toml b/netlify.toml index 9b0559c..6d26a11 100644 --- a/netlify.toml +++ b/netlify.toml @@ -172,7 +172,8 @@ # # Anything else under /docs/campaigns/ either still exists (api/, page-kit, # templates, admin-api) or never did. campaign-cart sub-paths are handled by the -# campaign-cart/:path rule above; the bare index has its own rule below. +# /docs/campaigns/campaign-cart/:path rule above; the bare index has its own rule +# below. [[redirects]] from = "/docs/campaigns/utilities/debugger" @@ -319,7 +320,7 @@ to = "https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#utilities" status = 301 -# The bare campaign-cart index needs its own rule: the campaign-cart/:path rule +# The bare campaign-cart index needs its own rule: /docs/campaigns/campaign-cart/:path # above only matches sub-paths, so without this the index 404s. [[redirects]] diff --git a/public/_redirects b/public/_redirects index a059aef..f28a122 100644 --- a/public/_redirects +++ b/public/_redirects @@ -59,7 +59,8 @@ # # Anything else under /docs/campaigns/ either still exists (api/, page-kit, # templates, admin-api) or never did. campaign-cart sub-paths are handled by the -# campaign-cart/:path rule above; the bare index has its own rule below. +# /docs/campaigns/campaign-cart/:path rule above; the bare index has its own rule +# below. /docs/campaigns/utilities/debugger https://cart-sdk.nextcommerce.com/latest/reference/debugger/ 301 /docs/campaigns/utilities/debugger/* https://cart-sdk.nextcommerce.com/latest/reference/debugger/ 301 /docs/campaigns/utilities/exit-intent https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#on-page-popups 301 @@ -89,7 +90,7 @@ /docs/campaigns/upsells https://cart-sdk.nextcommerce.com/latest/pages/upsell-page/ 301 /docs/campaigns/upsells/* https://cart-sdk.nextcommerce.com/latest/pages/upsell-page/ 301 /docs/campaigns/utilities https://cart-sdk.nextcommerce.com/latest/reference/javascript-api/#utilities 301 -# The bare campaign-cart index needs its own rule: the campaign-cart/:path rule +# The bare campaign-cart index needs its own rule: /docs/campaigns/campaign-cart/:path # above only matches sub-paths, so without this the index 404s. /docs/campaigns/campaign-cart https://cart-sdk.nextcommerce.com/latest/start-here/how-it-works/ 301 # Old Redoc-style reference URL still linked from the platform changelog (with and without