Skip to main content

Documentation Index

Fetch the complete documentation index at: https://86d.app/docs/llms.txt

Use this file to discover all available pages before exploring further.

86d is positioned as the open-source alternative to Shopify, so a common first project is moving an existing Shopify store onto 86d. This guide walks through the migration end to end. It assumes you already have an 86d store running locally; if not, see Quickstart.
Migration tooling is improving rapidly. This page captures the manual workflow today. Where automation exists, it is called out inline.

What maps where

Shopify concept86d equivalent
Store / shopAn 86d store running this codebase
ThemeA template under templates/<theme>/
Liquid sections / blocksMDX pages and module components
AppA module under modules/<name>/
Product, variant, collection@86d-app/products, @86d-app/collections
Customer, address@86d-app/customers, @86d-app/saved-addresses
Order, fulfillment, refund@86d-app/orders, @86d-app/fulfillment, @86d-app/payments
Discount, promotion@86d-app/discounts
Gift card@86d-app/giftcards
Pages, blog@86d-app/pages, @86d-app/blog
Shopify Markets@86d-app/multi-currency, @86d-app/tax
Shopify POS@86d-app/kiosk, @86d-app/toast
Shopify Shipping@86d-app/shipping, @86d-app/fulfillment
Shopify Payments@86d-app/payments plus a gateway module (stripe, paypal, square, braintree)
Shopify FunctionsCustom modules
WebhooksModule domain events plus your own subscribers

Step 1: pick your modules

Open your active template’s config.json and enable the modules that match your Shopify capabilities. A baseline cutover usually needs:
{
  "modules": [
    "@86d-app/products",
    "@86d-app/collections",
    "@86d-app/cart",
    "@86d-app/checkout",
    "@86d-app/orders",
    "@86d-app/customers",
    "@86d-app/saved-addresses",
    "@86d-app/payments",
    "@86d-app/stripe",
    "@86d-app/discounts",
    "@86d-app/giftcards",
    "@86d-app/shipping",
    "@86d-app/fulfillment",
    "@86d-app/tax",
    "@86d-app/seo",
    "@86d-app/sitemap",
    "@86d-app/redirects"
  ]
}
Run 86d generate after editing.

Step 2: export Shopify data

Use Shopify Admin’s built-in CSV export for products, customers, and orders:
  • Products: Admin → Products → Export → All products → CSV
  • Customers: Admin → Customers → Export → CSV
  • Orders: Admin → Orders → Export → CSV
  • Discounts and gift cards: requires the Shopify Admin GraphQL API
For media, pages, blog posts, and any custom metafields, use the Shopify Admin GraphQL API. Save responses as JSON; you will transform them next.

Step 3: transform and import

@86d-app/import-export accepts CSV and JSON for the entities it covers. Map Shopify fields to 86d fields with a small ETL script (TypeScript, Python, anything). Key mappings:
  • Shopify Variant Price (dollars) -> 86d price (cents). Multiply by 100.
  • Shopify Compare At Price -> 86d compareAtPrice (cents).
  • Shopify Tags (comma-separated string) -> 86d tags (array).
  • Shopify product Handle -> 86d slug.
  • Shopify Status (active/draft/archived) -> 86d status (same values).
Then call POST /admin/products/import, POST /admin/collections/create, and so on. Or use bun run scripts/import-shopify.ts if you have written one.
Run the import against a Neon branch or a local Postgres database first, never directly against your production 86d database.

Step 4: redirect old URLs

Shopify themes use /products/<handle>, /collections/<handle>, and /pages/<handle>. 86d uses the same shapes, so most product and collection URLs work without redirects. For anything that changed:
86d module enable redirects
Then add redirects in Admin → Catalog → Redirects or via POST /admin/redirects.

Step 5: rebuild your theme

Shopify Liquid does not translate to MDX directly. Pick the closest module component for each section of your old theme, place it in the corresponding MDX page, and lift any custom HTML or CSS:
Liquid section86d component
featured-collection.liquid<FeaturedCollections />
product-grid.liquid<ProductGrid /> or <FeaturedProducts />
cart-drawer.liquid<Cart /> plus <CartButton />
newsletter.liquid<NewsletterInline />
header.liquidYour Navbar component in the template
footer.liquidYour Footer component
If a theme block does not have a direct equivalent, write a custom MDX block; you have the full power of React + Tailwind.

Step 6: configure payments

Pick a gateway module (stripe, paypal, square, or braintree) and follow Payment gateways. Stripe is the closest analog to Shopify Payments and the most fully featured.

Step 7: configure shipping and tax

  • Shipping zones and rates: configure in Admin → Fulfillment → Shipping (or via @86d-app/shipping admin endpoints).
  • Tax: enable @86d-app/tax and add your jurisdictions and nexus rules.

Step 8: cut over

When you are ready to switch:
  1. Freeze writes on Shopify (set the store to password-protected mode).
  2. Run a final delta import (orders placed since your initial import).
  3. Update DNS to point at your 86d deployment.
  4. Verify gift card balances, store credit, and active subscriptions all carried over.
  5. Re-enable order placement.
Watch your Sentry dashboard and /admin/audit-log (if @86d-app/audit-log is enabled) for the first 24 hours.

What does not migrate (yet)

  • Shopify Functions: there is no automatic translator. Re-implement them as modules.
  • Shop Pay accelerator: the closest analog is Stripe Link plus saved payment methods on @86d-app/payments.
  • Shopify Markets currency rounding rules: enable @86d-app/multi-currency and configure rounding manually per currency.
  • Theme app extensions: re-implement as module store components, then drop them in your MDX templates.

Help

If you hit a migration question that is not covered here, open an issue at github.com/86d-app/86d/issues. We collect repeated questions back into this page.