// Page Code for /checkout-link import { cart } from 'wix-stores'; import wixLocation from 'wix-location'; /** * Accepts `products` query parameter in Meta format: * - Encoded: products=112233%3A1%2C445566%3A2 * - Unencoded: products=112233:1,445566:2 (still works) * * Each entry is ID:QTY. Colons/commas may be RFC 3986-escaped. * Example final URL for Meta: * https://mysticalcrow.com/checkout-link?products=112233%3A1%2C445566%3A2 */ function parseProductsParam(rawParam) { if (!rawParam || typeof rawParam !== 'string') return []; // Try to decode once; if it throws or changes nothing, we still continue safely let decoded = rawParam; try { // decodeURIComponent will convert %3A -> ":", %2C -> "," decoded = decodeURIComponent(rawParam); } catch (_e) { // If decoding fails, we’ll proceed with the original string } // Split by commas (now that we normalized to ":" and ",") // Trim spaces just in case. return decoded .split(',') .map(s => s.trim()) .filter(Boolean) .map(pair => { const [id, qty] = pair.split(':').map(x => (x || '').trim()); const quantity = Number(qty); return (id && !Number.isNaN(quantity) && quantity > 0) ? { productId: id, quantity } : null; }) .filter(Boolean); } async function addAllToCart(items) { // Wix Stores cart.addProducts accepts an array of product objects. // We’ll add one by one to ensure each promise resolves, but you can batch if desired. for (const item of items) { // If a product has variants/options, you’ll need to pass the relevant // selection data here (e.g., options: [{ optionName, selection }]). // For simple products, productId + quantity is sufficient. await cart.addProducts([{ productId: item.productId, quantity: item.quantity }]); } } $w.onReady(async function () { const { products } = wixLocation.query; if (!products) { // No parameter present; go to cart so the user isn't stuck. wixLocation.to('/cart'); return; } const items = parseProductsParam(products); if (!items.length) { // Parameter present but invalid/empty after parsing wixLocation.to('/cart'); return; } try { await addAllToCart(items); // Success: go straight to checkout wixLocation.to('/checkout'); } catch (_err) { // If anything fails (bad ID, etc.), fall back to cart wixLocation.to('/cart'); } });
top of page

Botanical Sage Bundles

 

Discover the art of sacred cleansing with our botanical sage bundles, each uniquely crafted to align with your spiritual journey. Lovingly handmade, these bundles are adorned with carefully selected dried florals, lending a natural beauty to their powerful purpose. Some feature crystals, chosen for their energetic properties, while others showcase handmade wooden deathmoths, adding a mystical and artistic touch to your ritual tools.

 

Sage has been revered for centuries for its purifying and protective properties, often used to cleanse spaces, objects, and energies. These botanical bundles are perfect for:

• Energy Cleansing: Remove negative energy from your home, workspace, or sacred space.

• Rituals & Ceremonies: Amplify intentions during spellwork, meditation, or moon rituals.

• Grounding & Healing: Promote a sense of peace, balance, and connection to nature.

 

Each bundle is an enchanting piece of art, as unique as your practice, created to inspire mindfulness and sacred energy in your life. Whether you’re clearing the air or setting intentions, our sage bundles will infuse your rituals with beauty and purpose.

Lavender Amethyst HEART Sage Bundle

$24.99Price
Quantity
    bottom of page