Evidence base for the shared-basket integration strategy: how far apart the two Adobe Commerce codebases really are, where the divergence is concentrated, and what that means for consolidation and cross-site basket options.
Fourteen sections, ordered inventory → comparison → decisions → recommendation. The section bar below stays with you as you scroll.
The two platforms are substantially more aligned than the February feasibility notes assumed. Since then, both sites have completed Hyvä frontend migrations and now share the same Magento version, hosting stack, checkout framework, payment provider and search/marketing vendors. The genuine divergence is concentrated in one place: the delivery & fulfilment domain (Daylesford's date-based fresh-food delivery machinery vs Bamford's flat-rate carriers) plus a long tail of brand-specific features. A working cross-site cart transfer module is already installed and enabled on both sites. This report follows the audit structure proposed and approved on DFD-749 (64-hour audit & discovery scope, approved 21 May 2026): inventory → functional mapping → cross-comparison → divergence & risk → decision register → recommended route.
Per the approved audit plan: what this audit covers, what it deliberately does not, and how the analysis was produced.
Automated static extraction first — scripted parsing of module registries and composer lock files, file-hash diffing of every app/code module and theme on both sides, and counts of DI plugins, preferences, virtual types, observers, cron jobs, console commands, web API routes and schema patches — followed by targeted manual code exploration of the delivery, checkout, payment and integration domains (carrier classes, DI wiring, key module internals). Automated first-pass findings were verified against config.php enablement before inclusion; functional grouping (§7) is evidence-based — audit-verified code reads, composer package descriptions and documented commercial product function — with the interim spot-check list closed out by direct code reads. The review stage was performed as an independent verification pass (10 Jul): every quantitative claim in this report was re-derived from the repositories by a separate recount (module registries re-parsed with PHP itself as ground truth), and fifteen factual code-level claims were adversarially re-verified; the corrections found are applied throughout and summarised in §14.
Everything below the application code is effectively the same platform. The three mismatches (Redis version, RabbitMQ, patch sets) are routine alignment work.
| Layer | Daylesford | Bamford | Verdict |
|---|---|---|---|
| Adobe Commerce | EE 2.4.7-p10 | EE 2.4.7-p10 | aligned |
| Hosting | Adobe Commerce Cloud | Adobe Commerce Cloud | aligned |
| PHP (cloud) | 8.3 | 8.3 | aligned |
| Database | MySQL (MariaDB) 10.11 | MySQL (MariaDB) 10.11 | aligned |
| Search | OpenSearch 2 | OpenSearch 2 | aligned |
| Cache | Redis 6.0 | Redis 7.2 | differs |
| Message queue | RabbitMQ 3.8 | — none | differs |
| CDN / WAF | Fastly (+ Develo fastly-extended) | Fastly (+ Develo_Fastly bot handling) | aligned |
| Frontend | Hyvä (Develo/Daylesford, live Oct 2025) | Hyvä (Develo/Bamford, live Aug 2025) | aligned |
| Checkout | Hyvä Checkout 1.3.5 + Loqate | Hyvä Checkout 1.3.4 + Loqate | aligned |
| Payments (core) | Adyen 9.15.0 · Mollie 2.47 (transitive, enabled) | Adyen 9.18.0 · Mollie 2.46 (transitive, enabled) | aligned |
| CI/CD | Bitbucket Pipelines | Bitbucket Pipelines | aligned |
| Security tooling | Sansec Shield + Watch, polyshell protection | Sansec Shield + Watch, polyshell protection | aligned |
| Local patches | 18 patches + 15 m2-hotfixes + composer.patches.json | 12 patches + 7 m2-hotfixes | differs |
| Site | Theme | Parent | Files | LOC | Status |
|---|---|---|---|---|---|
| Daylesford | Daylesford/default | Magento/blank | 528 | 52,157 | Legacy pre-Hyvä theme (blank-based) — purge candidate |
| Daylesford | Develo/Daylesford | Hyva/default | 454 | 45,537 | Live Hyvä theme |
| Bamford | Develo/Bamford | Hyva/default | 330 | 34,088 | Live Hyvä theme |
| Bamford | Tryzens/Bamford | Magento/luma | 244 | 37,264 | Legacy Luma theme — purge candidate |
| Bamford | Tryzens/BamfordClub | Tryzens/Bamford | 25 | 1,149 | Club-store child of legacy theme |
Every module registered on each site, core and third-party. 646 modules are common; Daylesford carries 187 extra registrations (dominated by Magestore POS, Magefan blog, Yotpo, GDPR and events tooling) against Bamford's 74 (subscriptions, club, Magezon page builder, shop-by-brand, pickup).
| Module | Daylesford | Bamford |
|---|---|---|
| Amasty_RegenerateUrlRewrites | disabled | enabled |
| Amasty_SeoToolkitLiteHyva | disabled | enabled |
| Develo_AdyenExpressCheckout | disabled | enabled |
| Develo_AdyenHyvaFix | enabled | disabled |
| Magento_AdminAdobeImsTwoFactorAuth | disabled | enabled |
struck-through = registered but disabled
Of 946 packages across both lock files, 796 are identical versions. The 53 skews are mostly patch-level housekeeping; the ones worth planning around are the majors below.
| Package | Daylesford | Bamford | Note |
|---|---|---|---|
| adyen/adyen-magento2-expresscheckout | 2.4.7 | 2.4.6 | |
| adyen/module-payment | 9.15.0 | 9.18.0 | Minor drift |
| adyen/php-api-library | v20.4.0 | v27.0.0 | Major API library gap — align before any shared payment work |
| amasty/base | 1.21.2 | 1.20.0 | |
| amasty/geoip | 1.7.3 | 1.7.1 | |
| amasty/label | 2.5.2 | 2.3.5 | |
| amasty/module-cross-linking | 1.4.3 | 1.4.2 | |
| amasty/module-hyva | 1.2.0 | 1.1.0 | |
| amasty/module-product-labels-hyva | 2.1.1 | 2.0.0 | |
| amasty/module-seo-toolkit | 2.6.0 | 2.5.3 | |
| amasty/module-special-promo | 2.16.1 | 2.13.0 | |
| amasty/module-store-locator | 3.6.1 | 3.5.0 | |
| amasty/module-store-locator-indexer | 1.2.2 | 1.2.1 | |
| amasty/module-xml-google-sitemap | 2.2.2 | 2.2.1 | |
| amasty/promo | 2.17.4 | 2.17.3 | |
| aws/aws-sdk-php | 3.381.0 | 3.381.1 | |
| develo/module-widgets | 2.5.3 | 2.5.5 | |
| elgentos/regenerate-catalog-urls | 0.3.5 | 0.3.7 | |
| fastly/magento2 | 1.2.234 | 1.2.233 | |
| hyva-themes/magento2-default-theme | 1.3.17 | 1.3.15 | Minor drift |
| hyva-themes/magento2-ee-magento-customer-custom-attributes | 0.2.4 | 0.3.1 | |
| hyva-themes/magento2-ee-magento-gift-card | 0.3.0 | 0.5.0 | |
| hyva-themes/magento2-ee-magento-gift-wrapping | 0.1.1 | 0.2.1 | |
| hyva-themes/magento2-ee-magento-google-tag-manager | 0.1.0 | 0.2.2 | |
| hyva-themes/magento2-ee-magento-multiple-wishlist | 0.2.0 | 0.3.0 | |
| hyva-themes/magento2-ee-magento-reward | 0.1.0 | 0.2.1 | |
| hyva-themes/magento2-ee-magento-rma | 0.3.3 | 0.4.0 | |
| hyva-themes/magento2-hyva-checkout | 1.3.5 | 1.3.4 | |
| hyva-themes/magento2-hyva-enterprise-commerce | 0.5.1 | 0.6.1 | EE-compat drift |
| hyva-themes/magento2-theme-module | 1.3.17 | 1.3.15 | |
| illuminate/collections | v12.32.1 | v12.21.0 | |
| illuminate/conditionable | v12.32.1 | v12.21.0 | |
| illuminate/config | v12.32.1 | v12.21.0 | |
| illuminate/contracts | v12.32.1 | v12.21.0 | |
| illuminate/macroable | v12.32.1 | v12.21.0 | |
| klaviyo/magento2-extension | 4.4.1 | 4.3.1 | Minor drift |
| klevu/module-categorynavigation | 2.11.0 | 2.12.1 | |
| klevu/module-msi | 1.4.0 | 1.5.0 | |
| magento/ece-tools | 2002.2.7 | 2002.2.6 | |
| magento/magento-cloud-components | 1.1.3 | 1.1.2 | |
| magento/magento-cloud-docker | 1.4.4 | 1.4.3 | |
| magento/magento-cloud-patches | 1.1.11 | 1.1.9 | |
| magento/module-company | 102.0.2-p2 | 102.0.2-p1 | |
| magento/module-order-history-search | 100.5.2-p2 | 100.5.2-p1 | |
| magento/module-requisition-list | 100.5.2-p2 | 100.5.2-p1 | |
| magento/quality-patches | 1.1.71 | 1.1.68 | |
| mollie/magento2 | 2.47.0 | 2.46.0 | Minor drift |
| nesbot/carbon | 3.10.3 | 3.10.2 | |
| opensearch-project/opensearch-php | 2.4.6 | 2.6.0 | |
| symfony/dependency-injection | v6.4.38 | v7.4.10 | Symfony 6.4 vs 7.4 major |
| symfony/serializer | v6.4.37 | v7.4.10 | Symfony 6.4 vs 7.4 major |
| symfony/translation | v6.4.26 | v7.3.2 | Symfony 6.4 vs 7.3 major |
| symfony/yaml | v5.4.45 | v7.4.11 | Symfony 5.4 vs 7.4 major |
This is where consolidation effort actually lives. 226 distinct modules exist across the two sites; only 27 carry the same name on both. Headline LOC figures need context: most of Daylesford's bulk is the vendored Magestore POS suite, not bespoke build.
Magestore (WebPOS, gift vouchers, reward points, click & collect, stock control) accounts for 642,335 LOC across 82 registered modules on Daylesford — none of it exists on Bamford. 15 of those modules are already disabled and a parked copy of the POS suite sits in broken_modules/. Excluding Magestore, Daylesford's custom footprint is ~248k LOC vs Bamford's ~338k — the gap is far smaller than raw totals suggest. Deciding Magestore's future (retire, isolate, or licence for a combined instance) should be an early audit workstream because it removes the single biggest block of one-sided code.
Counts across each site's app/code (composer-delivered extensions excluded; Daylesford's totals include the Magestore estate). These are the mechanisms that share one application stack after consolidation — the reason a merge is a structured alignment exercise, not a file copy: Magento loads a single DI configuration, plugin chain, event bus, cron schedule and database schema for all websites on an instance.
| Mechanism | Daylesford | Bamford | Why it matters for consolidation |
|---|---|---|---|
| DI plugins (<plugin>) | 321 | 67 | Interception density — every plugin is merge-review surface |
| DI preferences (class rewrites) | 543 | 52 | Rewrites are the highest-risk collision class on a single DI stack |
| DI virtual types | 175 | 21 | |
| Event observers | 207 | 54 | Across 85 vs 30 events.xml files |
| Cron jobs | 23 | 8 | Background processing to co-exist on one schedule |
| Console commands | 35 | 21 | Operational tooling |
| REST web API routes | 148 | 4 | Daylesford's POS/fulfilment APIs dominate |
| GraphQL schema files | 8 | 1 | |
| db_schema.xml files | 32 | 15 | Declarative schema to merge into one database |
| Setup/data patches | 141 | 37 | One-off installers — replay order matters on merge |
| Vendor | Daylesford LOC | Bamford LOC | Split |
|---|---|---|---|
| Magestore | 642,335 | — | |
| Xtento | 112,835 | 85,218 | |
| Magezon | — | 163,441 | |
| Develo | 35,859 | 33,991 | |
| Redbox | 39,530 | — | |
| Daylesford | 33,543 | — | |
| Tryzens | 4,195 | 26,957 | |
| Auctane | 6,569 | 6,569 | |
| MagicToolbox | 12,597 | — | |
| Magmodules | — | 6,308 | |
| Mageside | 2,502 | 3,624 | |
| Bamford | — | 4,663 | |
| ZigzagGlobal | — | 3,582 | |
| WebShopApps | — | 2,430 | |
| Andev | — | 733 |
File-level comparison of same-named modules. Drift bar: green = identical files, amber = same file changed, site colours = files present on one side only. The Xtento rows are version skew of a commercial suite (an update reconciles them); the Develo rows are genuine fork drift to reconcile by hand.
| Module | Identical | Changed | Only D | Only B | LOC D | LOC B | Drift |
|---|---|---|---|---|---|---|---|
| Develo_Setup | 0 | 2 | 18 | 3 | 955 | 156 | |
| Xtento_OrderExport | 20 | 265 | 1 | 0 | 25,545 | 25,154 | |
| Xtento_TrackingImport | 19 | 182 | 0 | 0 | 18,874 | 18,838 | |
| Xtento_StockImport | 19 | 161 | 0 | 0 | 17,749 | 17,713 | |
| Xtento_XtCore | 5 | 39 | 0 | 0 | 2,642 | 2,641 | |
| Develo_KlevuCustomDataSync | 1 | 4 | 1 | 0 | 601 | 482 | |
| Xtento_ProductExport | 47 | 216 | 1 | 0 | 21,370 | 20,872 | |
| Develo_Csp | 1 | 2 | 0 | 2 | 83 | 172 | |
| Develo_Styleguide | 11 | 19 | 1 | 1 | 4,232 | 3,730 | |
| Develo_AdyenExpressCheckout | 8 | 6 | 0 | 9 | 490 | 1,660 | |
| Develo_Checkout | 29 | 17 | 12 | 4 | 4,279 | 3,939 | |
| Develo_AdyenHyvaFix | 4 | 2 | 1 | 1 | 354 | 492 | |
| Develo_IconMapping | 3 | 2 | 1 | 0 | 347 | 344 | |
| Develo_Theme | 26 | 14 | 7 | 3 | 3,026 | 2,789 | |
| Develo_Canonical | 9 | 5 | 3 | 0 | 836 | 613 | |
| Develo_Customer | 10 | 7 | 0 | 0 | 1,329 | 1,314 | |
| Develo_WebsiteSwitcher | 15 | 3 | 1 | 0 | 2,138 | 1,858 | |
| Develo_CheckoutSuccessDataLayer | 6 | 1 | 0 | 0 | 192 | 179 | |
| Develo_Sales | 14 | 2 | 0 | 0 | 681 | 687 | |
| Develo_GoogleTagManager2Fix | 17 | 1 | 1 | 0 | 627 | 495 | |
| Develo_KlevuSyncQueue | 35 | 3 | 0 | 0 | 2,252 | 2,307 | |
| Develo_KlevuSSR | 18 | 1 | 0 | 0 | 862 | 862 | |
| Tryzens_PlpContentSlots | 48 | 0 | 0 | 2 | 4,195 | 4,224 | |
| Auctane_Api | 129 | 0 | 0 | 0 | 6,569 | 6,569 | |
| Develo_AdyenIconFix | 14 | 0 | 0 | 0 | 138 | 138 | |
| Develo_CategoryPath | 19 | 0 | 0 | 0 | 1,142 | 1,142 | |
| Develo_GradientSelector | 8 | 0 | 0 | 0 | 651 | 651 |
| Module | Files | LOC |
|---|---|---|
| Magestore_Webpos | 1,299 | 120,869 |
| Magestore_Giftvoucher | 637 | 68,862 |
| Magestore_PurchaseOrderSuccess | 525 | 53,845 |
| Magestore_Rewardpoints | 343 | 34,596 |
| Magestore_FulfilSuccess | 380 | 34,310 |
| Magestore_Customercredit | 276 | 29,282 |
| Xtento_OrderImport | 233 | 23,638 |
| Magestore_SalesReport | 214 | 21,637 |
| Magestore_ClickAndCollectFrontend | 114 | 19,744 |
| Magestore_BranchRequest | 207 | 18,196 |
| Magestore_BarcodeSuccess | 214 | 17,380 |
| Magestore_DropshipSuccess | 216 | 17,178 |
| Redbox_Shopfinder | 134 | 17,092 |
| Magestore_SupplierSuccess | 155 | 16,020 |
| Magestore_OrderSuccess | 236 | 15,641 |
| Magestore_ReportSuccess | 186 | 15,279 |
| Magestore_Stocktaking | 177 | 14,770 |
| Magestore_TransferStock | 172 | 14,074 |
| Module | Files | LOC |
|---|---|---|
| Magezon_Builder | 444 | 108,038 |
| Magezon_Core | 188 | 27,550 |
| Magezon_UiBuilder | 87 | 18,067 |
| Magezon_NinjaMenus | 92 | 9,786 |
| Magmodules_AlternateHreflang | 94 | 6,308 |
| Tryzens_Tradestate | 70 | 5,561 |
| Tryzens_ClubMemberships | 67 | 4,924 |
| Tryzens_ProductIcons | 64 | 4,105 |
| Develo_FreeSamples | 49 | 3,897 |
| Mageside_PromotionMessage | 55 | 3,624 |
| ZigzagGlobal_Zigzag | 54 | 3,582 |
| Bamford_TrustpilotIntegration | 27 | 2,656 |
| WebShopApps_MatrixRate | 24 | 2,430 |
| Tryzens_ClubStorefront | 41 | 2,342 |
| Develo_Klaviyo | 20 | 1,193 |
| Tryzens_KlevuStorefrontRecommendations | 11 | 1,129 |
| Develo_RestrictedHyvaCheckout | 13 | 1,027 |
| Develo_Fastly | 15 | 1,026 |
Every enabled non-core module on each site — 376 distinct modules — classified into business capability areas on evidence, not name-matching. All 376 classifications are high-confidence: purposes verified by direct code reading of the bespoke modules, composer package descriptions (376 of 376), and documented commercial product function for vendor packages. The interim 45-module spot-check list was closed out on 10 Jul by reading each flagged app/code module and verifying each commercial package individually. Per-site deliverables: functional-map-daylesford.csv · functional-map-bamford.csv. Expand any area for per-module purposes.
| Capability area | Daylesford | Bamford | Assessment |
|---|---|---|---|
| POS & in-store retail | 67 | — | divergentDaylesford only — largely disabled/parked; retire-or-isolate decision required |
| Frontend, theme & UX | 50 | 50 | alignedBoth Hyvä; per-brand themes as expected |
| Content & CMS | 20 | 16 | differsBoth — different tooling (Magefan blog on D vs Magezon builder on B) |
| Search & recommendations | 18 | 20 | alignedBoth — same vendor (Klevu) with custom Develo sync layer; minor drift |
| Security & platform ops | 21 | 13 | alignedBoth — aligned tooling (Sansec, CSP, Fastly, patching) |
| Checkout & basket | 13 | 16 | differsBoth — same framework (Hyvä Checkout), different customisation sets; CartTransfer common to both |
| SEO & URLs | 15 | 16 | differsBoth — similar toolkits, drifted versions |
| Payments, gift cards & credit | 16 | 13 | differsBoth — same PSPs (Adyen/Mollie); gift cards & Stripe Daylesford-only; subscription billing Bamford-only |
| Pricing & promotions | 14 | 9 | differsBoth — Amasty family at different editions (Pro on D, Lite on B) |
| ERP, exports & feeds | 13 | 9 | differsBoth — same Xtento toolkit, different versions, endpoints and feed stacks |
| Subscriptions, loyalty & club | 4 | 11 | divergentCapability on both, different platforms — Aheadworks SARP + Club (B) vs custom Redbox (D) |
| Catalogue & product data | 8 | 5 | differsBoth — brand-specific additions each side |
| Customer accounts & compliance | 11 | 3 | differsBoth — D adds GDPR suite + age restriction; B adds purchase restrictions + waitlist |
| CRM, email & marketing | 7 | 6 | differsBoth Klaviyo at core; divergent extras (Yotpo, Mention-Me on D; Klaviyo extensions on B) |
| Analytics & tracking | 6 | 7 | alignedBoth — Yireo GTM2 aligned; VWO module on B |
| Shipping & delivery | 4 | 4 | divergentBoth — implemented differently; the deepest divergence (see §8) |
| Stores, pickup & locator | 6 | 3 | differsBoth — Amasty locator; pickup differs (Magestore on D vs Amasty on B) |
| Order management & ops | 4 | 3 | differsBoth — different operational scripts and order tooling |
| Territory, websites & routing | 2 | 4 | differsBoth — B has GeoIP routing + website switching; directly relevant to the multi-website future |
| Events & ticketing | 3 | — | D onlyDaylesford only (Aheadworks Event Tickets + custom) |
Zoe's notes called this the reason two instances exist, and the code confirms it. The two sites model fulfilment in fundamentally different ways; almost everything else is shared vendors at drifted versions.
A combined basket must answer questions neither site answers alone: what happens when a basket holds a fresh item needing a delivery date and cold-chain slot next to a flat-rate skincare item (or a subscription item)? That is a multi-shipment / split-consignment checkout design problem — the single hardest piece of custom work in any option, independent of whether the sites consolidate.
The in-flight Daylesford delivery-matrix rebuild (standard 3–5 day shipping for ambient + improved fresh delivery) is the convergence lever: done with consolidation in mind, it can be built as configuration/shared modules that both brands use, collapsing this red area to amber.
Vendor stacks are largely the same brands on both sites — the divergence is in the long tail of brand-specific services. Items in bold carry commercial/contractual weight in a consolidation.
| Category | Both sites | Daylesford only | Bamford only |
|---|---|---|---|
| Payments | Adyen (+ Hyvä checkout, Apple/Google Pay express) · Mollie (enabled both, transitive dep — live usage needs env check) | Stripe (lib) · Adyen giftcard module · Givex gift cards (Redbox) | SARP2-Adyen recurring billing · Tryzens Adyen extensions |
| Subscriptions & loyalty | — | Redbox Subscribe-at-Checkout (custom) | Aheadworks SARP2 + SARP3 · Tryzens Club/Memberships · BamfordClub store |
| ERP / exports / 3PL | Xtento suite: OrderExport, ProductExport, StockImport, TrackingImport (both sides, drifted versions) | Xtento_OrderImport · ShipStation (Auctane) · Streetwise POS sync · store-pickup order import | Bamford_CancelOrdersCustom · ZigzagGlobal returns |
| Email / CRM | Klaviyo (+ Hyvä reclaim) | Yotpo (reviews/SMS — enabled) · Mention-Me referrals · dotdigital (installed, disabled) · Develo_Emails | Develo_Klaviyo + Tryzens Klaviyo extensions · Freento email log |
| Search & merch | Klevu full suite + Develo sync/SSR modules (drifted copies) · OpenSearch 2 | Daylesford_KlevuAdditions · KlevuBlog | Tryzens Klevu storefront recommendations · Amasty sorting & shop-by-brand |
| Feeds / analytics | Yireo GTM2 (+ Hyvä checkout events) · checkout data-layer modules | Channable feed · Daylesford_GoogleTagManager | Amasty Feed · FeedOptimise export · Rakuten affiliates · VWO scripts module |
| Address / tax / fraud | Loqate via Hyvä Checkout (both) · no Avalara/Vertex/Signifyd anywhere | Develo_FraudList (custom blocklist) | — |
| Stores / pickup | Amasty Store Locator (+ Hyvä) | Redbox_Shopfinder · Magestore Click & Collect | Amasty Store Pickup with Locator (+ MSI) |
| Content / CMS | Snowdog menus · Hyvä UI toolkits | Magefan blog suite · event tickets (Aheadworks) · MagicZoom galleries | Magezon page builder (108k LOC) · NinjaMenus · Bamford VirtualShopping/Waitlist |
| POS / in-store | — | Magestore WebPOS suite (67 enabled modules; POS terminals, vouchers, stock) | — |
Enablement verified against each site's app/etc/config.php, not just composer presence.
Both sites already run a Develo-built cross-site cart handoff (Daylesford via develo/magento2-module-basket-transfer v1.2.0; Bamford in app/code; enabled on both). It was built for moving a basket between two separate Magento websites — exactly the interim-option territory Rebecca & Ian discussed.
Also relevant: Bamford's Develo_WebsiteSwitcher already preserves context when customers move between websites within one instance — a pattern that maps directly onto the post-consolidation multi-website world.
Repo-evidence ratings of what single-instance consolidation would take, per domain, on the agreed complexity scale (Low = same or near-identical · Medium = similar but needs adjustment · High = materially different custom logic · Very High = deep checkout/shipping/order/integration divergence).
| Domain | RAG | Effort | Evidence & consolidation implication |
|---|---|---|---|
| Core platform & hosting | GREEN | LOW | Identical version, cloud, DB, search. Align Redis 6→7.2, decide RabbitMQ, merge patch sets. |
| Frontend & theme | GREEN | LOW–MED | Both Hyvä + Hyvä Checkout. Per-brand themes are the normal multi-website pattern; purge two legacy themes; close small version skews. |
| Composer & shared modules | AMBER | MEDIUM | 53 version skews (Symfony & Adyen lib majors); reconcile 27 drifted shared modules — Xtento via upgrade, Develo forks by hand. |
| Payments & legal entities | AMBER | MEDIUM | Same PSPs (Adyen/Mollie) but per-entity merchant accounts, Stripe/Givex on D, SARP billing on B. Needs per-website payment design + finance sign-off. |
| Delivery & fulfilment | RED | VERY HIGH | Opposite models (date-based multishipment vs flat rate) with schema-level differences. The delivery-matrix rebuild is the convergence lever — build it multi-brand-aware. |
| Subscriptions, club & loyalty | RED | HIGH | SARP + Club (B) vs custom subscribe-at-checkout (D). Unify paradigm or scope per-website coexistence; touches recurring billing. |
| Magestore POS estate | AMBER | MEDIUM | 642k LOC, Daylesford-only, partly disabled. Retire/isolate/licence decision shrinks the merge surface dramatically — do this first. |
| ERP / exports / feeds | AMBER | MEDIUM | Same Xtento toolkit both sides but different endpoints (ShipStation/Streetwise vs Zigzag/FeedOptimise). Rewire per-website on one instance. |
| Catalogue, data & config (DB) | TBC | UNKNOWN | Websites/store views, tax, promotions, customer & order data live in the databases, not the repos. Needs the full audit + Adobe health checks. |
Decision points, not solutions: what later solution design must resolve, with the audit's probable direction and where client input is required. Risks carry likelihood, impact and the mitigating next action.
| Decision point | Situation | Probable direction | Confidence | Client input? |
|---|---|---|---|---|
| Delivery & fulfilment model | Both, materially different | Replace with new shared implementation — the planned delivery-matrix rebuild, designed multi-brand from day one | Medium | Yes — service levels per brand |
| Magestore POS estate (82 modules, D) | Daylesford only; 15 disabled, copies parked in broken_modules/ | Probably retire or isolate; licence position on a merged instance unverified | Low–Med | Yes — in-store operations dependency |
| Subscriptions platform | SARP2/3 + Adyen billing (B) vs custom Redbox subscribe-at-checkout (D) | Merge onto SARP (broader, maintained, Adyen-integrated); migrate/retire Redbox variant | Medium | Yes — does Daylesford need subscription parity? |
| Club & memberships | Bamford only (Tryzens Club + BamfordClub store) | Keep Bamford implementation, scoped per website | High | No |
| Gift cards | Givex + Adyen giftcard (D) vs none (B) | Keep Daylesford implementation; decide brand availability | Medium | Yes — cross-brand gift card policy |
| Free samples engine | Bamford only (Develo_FreeSamples) | Keep Bamford implementation; optionally extend to Daylesford | High | Optional |
| Shared Develo modules (Checkout, Theme, Styleguide…) | Both, drifted forks (17/29 files changed in Develo_Checkout) | Merge features from both into single composer-distributed packages | High | No |
| Xtento export/import suite | Both, different versions + profiles | Align to one version; keep per-site export profiles | High | No |
| Content tooling | Magefan blog suite (D) vs Magezon page builder (B) | Client decision — unify or keep per-brand; licence check for Magezon on merged instance | Low–Med | Yes |
| Reviews & referral stack | Yotpo enabled + Trustpilot custom (D) vs Trustpilot custom (B); Mention-Me (D) | Merge Trustpilot implementations; client decision on Yotpo/Mention-Me scope | Medium | Yes |
| Product feeds | Channable (D) vs Amasty Feed + FeedOptimise (B) | Choose one feed stack post-merge | Medium | Yes — marketing dependency |
| dotdigital (installed, disabled on D) | Dead weight | Retire/remove | High | No |
| Website/Store topology for shared basket | Native carts are Website-scoped | Same-Website-different-Stores maximises basket sharing but shares Website-scoped settings; needs config-parity validation (see risks) | Low — needs design | Yes — with Develo architecture lead |
| Risk | Likelihood | Impact | Mitigation / next action |
|---|---|---|---|
| Global (non-website-scoped) customisations clash on one DI stack | High | High | 543 vs 52 class preferences must co-exist; full DI collision review is a core consolidation-phase task |
| Website-scoped settings conflict under a same-Website cart model | Medium | High | Validate which settings are brand-specific today and whether they move to Store/Store View scope |
| Mixed-basket fulfilment design (fresh + date-based + flat-rate + subscription in one checkout) | High | High | The single hardest design problem in any route — prototype early in the next phase |
| Delivery-matrix rebuild proceeds without multi-brand design | Medium | High | Fold consolidation-awareness into that project's brief now — it is the convergence lever |
| DB-resident config & catalogue overlap unknown (repo-only audit) | High | Medium | Adobe health checks + environment/config access next; estimates carry this uncertainty |
| Subscription billing continuity through migration (SARP + Adyen tokens) | Medium | High | Recurring revenue at risk; plan token/mandate migration explicitly |
| Composer conflicts: Symfony 6.4 vs 7.4, Adyen PHP lib v20 vs v27 | Certain | Medium | Align dependency majors on both sites before any merge attempt |
| Legal entity & financial reporting split on one instance | Medium | High | Per-website entity mapping + finance sign-off; reporting via mapping logic (per feasibility notes) |
| Magestore/Magezon/Aheadworks/Amasty licensing on a merged instance | Medium | Medium | Vendor licence review before costing consolidation |
| Cross-territory basket expectation creep | Medium | Medium | Scope guard: shared basket within territory only — cross-territory explicitly not recommended |
| SEO/domain risk during consolidation | Medium | Medium | Phased migration with URL preservation; both sites already run mature SEO toolkits |
| Release cadence coupling post-merge | Low | Medium | Single pipeline governance; both teams already share one agency and deployment tooling |
The three routes as tabled to the client on DFD-749 (25 Feb), now read against the audit evidence.
Shared accounts, clearer cross-navigation, better cross-selling journeys — customers still check out separately per brand. Lowest risk and cost, but does not deliver the original ask. Audit evidence: both sites already run content-slot tooling and the CartTransfer handoff, so this route starts further ahead than assumed and could ship improvements quickly as a companion to Route 3.
Basket state management, split payments, order routing, reporting reconciliation, refunds and stock sync across two systems. Technically possible but complex, expensive, and a distributed-commerce layer Develo would own indefinitely. Audit evidence: Develo_CartTransfer (live on both sites) is a partial foundation — but its gaps (one-way, replace-not-merge, separate checkouts) are exactly the expensive part, and that spend is largely throwaway post-consolidation.
Phase one: consolidation only — one instance, aligned codebases, rationalised modules and integrations, baskets still scoped per website. Phase two: shared basket (within territory) once ERP, warehouse, reporting and stock considerations are aligned. Keeps everything inside Magento's intended multi-website architecture and avoids coupling consolidation and shared-basket complexity into one high-risk release. The audit evidence strengthens this route versus the February assessment: same version, cloud, frontend generation, checkout framework and core vendors — the divergence is concentrated, nameable and largely decision-driven (see §12). Natural landing: the March '27 Magento renewal.
Magento carts are scoped to a Website. Sharing a basket is most straightforward with both brands under one Website as separate Stores — but that shares Website-scoped settings (certain payment, tax, pricing and customer configuration), so a config-parity exercise must validate which of today's brand-specific settings can move to Store/Store View scope. The alternative — separate Websites with shared customers — keeps config isolation but makes the basket a heavier custom build. This is the central design decision of the shared-basket phase; the audit flags it, the next phase resolves it.
Cross-territory basket persistence adds significant complexity and is not recommended — shared basket is scoped within territory.
The 64-hour audit & discovery scope was approved on 21 May 2026. Mapping of each quoted task to this report. All quoted tasks are now delivered; the report is ready for playback.
| Quoted task | Hours | Where covered | Status |
|---|---|---|---|
| Define audit scope, assumptions and deliverable structure | 4 | §2 — scope, assumptions, exclusions and method; report follows the agreed deliverable structure | Delivered |
| Full technical inventory — Bamford codebase | 8 | §3–§6 + §9 — registry, composer, custom code, DI/observers/cron/API/patch counts, integrations | Delivered |
| Full technical inventory — Daylesford codebase | 8 | §3–§6 + §9 — as above, including Magestore estate and broken_modules analysis | Delivered |
| Map Bamford modules to functional capability areas | 6 | §7 + functional-map-bamford.csv — evidence-based, spot-check completed, all classifications high-confidence | Delivered |
| Map Daylesford modules to functional capability areas | 6 | §7 + functional-map-daylesford.csv — as above, incl. the Magestore estate | Delivered |
| Cross-compare platforms across functional areas | 10 | §4–§9 — overlap/divergence per area, drift measurement of the 27 shared modules, integration map | Delivered |
| Identify key divergence areas and consolidation challenges | 6 | §8 (delivery/checkout deep-dive) + §11 (effort matrix on the agreed Low→Very High scale) | Delivered |
| Produce consolidation decision and risk register | 4 | §12 — 13 decision points with probable directions; 12 risks with likelihood/impact/mitigation | Delivered |
| Compile final audit report and internal engineering review | 12 | This document, reviewed via an independent verification pass: full recount of every quantitative claim (PHP-parsed registries as ground truth) + adversarial re-verification of 15 code-level factual claims. Corrections applied: Bamford registry 720/715 (a dotted module name, Amasty_Mage2.4.7Fix, missed by the original parser), FreeSamples plugin count 10 (not 11), Mollie marked transitive-but-enabled | Delivered |
| Total | 64 |