Générateur gratuit de business plan
pour boutique ésotérique

Décrivez votre projet en quelques questions et obtenez immédiatement une première trame personnalisée : positionnement, budget, assortiment, stratégie et plan d’action.

8 questionspour décrire votre projet
2 minutespour obtenir une première trame
Gratuitsans création de compte
Votre projet 0 %
Type de boutique
Familles de produits envisagées

Choisissez au moins deux familles.

','')} \x3Cscript> window.addEventListener('load', () => { setTimeout(() => { window.focus(); window.print(); }, 250); }); window.addEventListener('afterprint', () => { window.close(); }); \x3C/script> `); printWindow.document.close(); }); form.addEventListener('submit', (event) => { event.preventDefault(); const categories = Array.from(form.querySelectorAll('input[name="categories"]:checked')).map((input) => input.value); if (!form.checkValidity()) { form.reportValidity(); message.textContent = 'Merci de compléter tous les champs.'; return; } if (categories.length < 2) { message.textContent = 'Sélectionnez au moins deux familles de produits.'; return; } message.textContent = ''; report.hidden = true; loading.hidden = false; const data = Object.fromEntries(new FormData(form).entries()); data.categories = categories; data.budget = Number(data.budget); data.basket = Number(data.basket); data.launch = Number(data.launch); setTimeout(() => { generateReport(data); loading.hidden = true; report.hidden = false; report.scrollIntoView({ behavior: 'smooth', block: 'start' }); }, 900); }); const generateReport = (data) => { const modelLabels = { 'physique': 'Boutique physique', 'en ligne': 'Boutique en ligne', 'omnicanale': 'Projet omnicanal' }; const model = modelLabels[data.model]; const stockPct = data.model === 'en ligne' ? 48 : data.model === 'physique' ? 42 : 44; const installPct = data.model === 'en ligne' ? 18 : data.model === 'physique' ? 30 : 26; const marketingPct = data.model === 'en ligne' ? 18 : 12; const cashPct = 100 - stockPct - installPct - marketingPct; const stockBudget = Math.round(data.budget * stockPct / 100); const avgCostPerReference = data.categories.includes('cristaux et minéraux') ? 42 : 34; const references = Math.max(45, Math.round(stockBudget / avgCostPerReference)); const stockRangeLow = Math.max(35, Math.round(references * .85)); const stockRangeHigh = Math.round(references * 1.15); const monthlyOrders = data.model === 'physique' ? Math.max(70, Math.round(data.budget / 130)) : data.model === 'en ligne' ? Math.max(55, Math.round(data.budget / 155)) : Math.max(85, Math.round(data.budget / 120)); const monthlyRevenue = monthlyOrders * data.basket; root.querySelector('[data-r-project]').textContent = data.projectName; root.querySelector('[data-r-model]').textContent = model; root.querySelector('[data-r-location]').textContent = data.location; root.querySelector('[data-r-budget]').textContent = money(data.budget); root.querySelector('[data-r-stock]').textContent = money(stockBudget); root.querySelector('[data-r-references]').textContent = `${stockRangeLow} à ${stockRangeHigh}`; root.querySelector('[data-r-revenue]').textContent = money(monthlyRevenue); const modelText = data.model === 'physique' ? `Le projet repose sur un point de vente physique situé dans la zone « ${data.location} ». Le local devra favoriser la découverte, le conseil et la vente complémentaire, tout en maîtrisant le poids du loyer et des travaux.` : data.model === 'en ligne' ? `Le projet repose sur une boutique en ligne destinée à couvrir une clientèle au-delà de la zone « ${data.location} ». La réussite dépendra principalement de la qualité du catalogue, du référencement naturel, des contenus et de la confiance accordée aux fiches produits.` : `Le projet combine une présence physique dans la zone « ${data.location} » et une boutique en ligne. Ce modèle permet d’associer le conseil, l’expérience produit et l’accès à une clientèle nationale, mais exige une gestion rigoureuse du stock et des canaux de vente.`; root.querySelector('[data-r-presentation]').textContent = `${data.projectName} est un projet de ${model.toLowerCase()} destiné principalement à une clientèle de ${data.audience}. ${modelText} Le budget déclaré de ${money(data.budget)} impose un lancement progressif, avec des références lisibles et une priorité donnée aux produits capables de générer des achats complémentaires.`; const positionText = data.audience === 'débutants et curieux' ? `Le positionnement doit être accessible, pédagogique et rassurant. Les produits faciles à comprendre, les formats découverte et les fiches explicatives devront occuper une place importante.` : data.audience === 'pratiquants réguliers' ? `Le positionnement doit mettre l’accent sur la profondeur de gamme, la disponibilité, la traçabilité et les références adaptées à des usages précis.` : data.audience === 'collectionneurs et passionnés' ? `Le positionnement doit valoriser la qualité, la rareté relative, les nouveautés et les pièces ou éditions capables de soutenir un panier moyen supérieur.` : data.audience === 'clientèle cadeau et bien-être' ? `Le positionnement doit privilégier une présentation soignée, des ensembles prêts à offrir et des prix clairement répartis entre entrée, cœur de gamme et premium.` : `Le positionnement devra rester suffisamment lisible pour accueillir les débutants tout en proposant des références spécialisées pour fidéliser une clientèle plus expérimentée.`; root.querySelector('[data-r-positioning]').textContent = `${positionText} Les familles prioritaires retenues sont ${sentenceList(data.categories)}. Elles devront être organisées par intention d’achat et complétées par quelques produits d’appel.`; const tagBox = root.querySelector('[data-r-categories]'); tagBox.innerHTML = ''; data.categories.forEach((category) => { const tag = document.createElement('span'); tag.textContent = category; tagBox.appendChild(tag); }); const budgetParts = { stock: stockPct, install: installPct, marketing: marketingPct, cash: cashPct }; Object.entries(budgetParts).forEach(([key, value]) => { root.querySelector(`[data-bar-${key}]`).style.width = `${value}%`; root.querySelector(`[data-pct-${key}]`).textContent = `${value} %`; }); root.querySelector('[data-r-audience]').textContent = `La cible principale est constituée de ${data.audience}. Le discours commercial, les photographies et les contenus devront répondre à leurs attentes sans formuler de promesses de résultat. Une segmentation par budget, intention et niveau de connaissance facilitera la navigation et la composition de paniers.`; const acquisition = data.model === 'physique' ? `Travailler la visibilité locale, la fiche d’établissement, les partenariats de proximité, les vitrines saisonnières et les événements ponctuels.` : data.model === 'en ligne' ? `Développer des pages catégories solides, des guides pratiques, une présence régulière sur les réseaux sociaux et des campagnes ciblées sur les requêtes commerciales.` : `Combiner référencement local, contenus SEO, réseaux sociaux, collecte d’adresses e-mail et opérations commerciales coordonnées entre le magasin et le site.`; root.querySelector('[data-r-acquisition]').textContent = acquisition; root.querySelector('[data-r-basket]').textContent = `Avec un panier moyen visé autour de ${money(data.basket)}, il faudra proposer des ventes associées simples : support avec encens, pochette avec tarot, résine avec charbon ou produits regroupés par intention.`; const strengths = [ `Positionnement spécialisé sur ${sentenceList(data.categories.slice(0, 3))}.`, data.model === 'en ligne' ? 'Accès à une clientèle géographiquement large.' : 'Possibilité de conseil et de démonstration des produits.', `Panier moyen visé de ${money(data.basket)}, compatible avec des ventes complémentaires.`, data.experience === 'déjà commerçant' || data.experience === 'expérimenté dans le commerce' ? 'Expérience commerciale déjà mobilisable.' : 'Projet pouvant être construit progressivement avec des outils simples.' ]; const risks = [ data.budget <= 7500 ? 'Budget limité nécessitant une sélection stricte et peu de stock dormant.' : 'Risque d’immobilisation si l’assortiment est lancé trop largement.', data.model === 'physique' ? 'Poids du loyer, des travaux et de la fréquentation locale.' : 'Dépendance au trafic, au référencement et à la qualité des contenus.', 'Conformité et étiquetage variables selon les familles de produits.', data.launch <= 3 ? 'Calendrier d’ouverture court, avec risque de précipiter les achats.' : 'Maintenir la dynamique du projet pendant la phase de préparation.' ]; const fillList = (selector, items) => { const list = root.querySelector(selector); list.innerHTML = ''; items.forEach((item) => { const li = document.createElement('li'); li.textContent = item; list.appendChild(li); }); }; fillList('[data-r-strengths]', strengths); fillList('[data-r-risks]', risks); const timeline = [ ['Valider le concept', 'Définir la clientèle, le nom, le positionnement, les familles prioritaires et les objectifs financiers.'], ['Chiffrer précisément', 'Recueillir les devis, estimer les frais fixes, calculer les prix de vente et préparer un prévisionnel avec un professionnel.'], ['Construire l’assortiment', `Sélectionner environ ${stockRangeLow} à ${stockRangeHigh} références et organiser les achats selon la rotation attendue.`], ['Préparer la vente', 'Créer les fiches produits, les photographies, le merchandising, les conditions de vente et les supports de communication.'], ['Lancer progressivement', 'Commencer avec les produits permanents, mesurer le panier moyen, la marge et les références sans vente.'], ['Optimiser et réassortir', 'Renforcer les meilleures ventes, réduire les références lentes et préparer les temps forts saisonniers.'] ]; const timelineEl = root.querySelector('[data-r-timeline]'); timelineEl.innerHTML = ''; timeline.forEach(([title, text]) => { const li = document.createElement('li'); li.innerHTML = `${title}

${text}

`; timelineEl.appendChild(li); }); }; updateProgress(); }); })();