ArtifiQ · brouillon v1 · 18 août 2026 · pour relecture interne (Anthony)
Les montants sont à compléter par Anthony (les efforts en semaines-dev sont fournis) ; les mentions « à confirmer » sont des questions ouvertes à poser à Bullet avant la version finale. Le prototype cliquable (pages/02-dashboard-direction-v2.html pour l'admin, pages/boutique.html pour la boutique) est l'annexe A de cette proposition.
Bullet Distribution distribue plus de 600 produits de vapotage à plus de 250 détaillants, aujourd'hui sur Shopify. Le RFP ne demande pas « un nouveau site » : il demande le système central des opérations commerciales — comptes B2B, catalogues et prix par client, commandes, facturation liée à QuickBooks, analytique — dans une catégorie réglementée, sans dépendance à un fournisseur.
Deux faits récents pèsent sur le projet :
Notre proposition, en une phrase : une plateforme propriétaire (code, données, infrastructure au nom de Bullet), un seul modèle de données pour le B2B et le B2C, un admin conçu pour l'équipe de Bullet, et un plan en phases dont chaque étape livre quelque chose d'utilisable.
| Couche | Choix | Pourquoi |
|---|---|---|
| Boutique B2B/B2C + portail client (« Mon entreprise ») | Next.js (App Router), TypeScript, Tailwind | rendu serveur (SEO, performance), un seul front qui adapte prix et catalogue au client connecté |
| Admin (« centre de gestion ») | même app Next.js, espace /admin protégé |
même design system, tables denses, édition en ligne, aperçus |
| API & règles métier | NestJS + Drizzle ORM, modules par domaine (catalogue, prix, comptes, commandes, facturation, sync, analytique, contenu) | règles centralisées et testées une fois, réutilisées par la boutique, l'admin, les jobs et les intégrations |
| Base de données | PostgreSQL (DigitalOcean Managed, sauvegardes quotidiennes + récupération à un instant donné) | source de vérité unique ; JSONB pour les champs personnalisés migrés de Shopify |
| Jobs & files | Redis + BullMQ | synchronisation QuickBooks, imports/exports, recalculs analytiques, courriels, webhooks — avec reprise automatique |
| Analytique | agrégats journaliers (client × produit × représentant × province) rafraîchis en continu | 600 produits × 250 clients : Postgres suffit largement ; porte ouverte vers un entrepôt (ClickHouse/DuckDB) si un jour nécessaire |
| Recherche | Postgres plein texte (pg_trgm) → Meilisearch au besoin | recherche instantanée produits/SKU/clients |
| Fichiers & images | DigitalOcean Spaces + CDN, conversion WebP | médias migrés de Shopify |
| Authentification & rôles | sessions maison (NestJS), 2FA, rôles admin (direction, représentant, comptabilité, entrepôt, marketing) et rôles client (propriétaire, acheteur, comptabilité, lecture) | permissions natives, non contournables par un service tiers |
| Contenu (CMS) | Payload CMS (open source, TypeScript, s'installe dans Next.js, Postgres via Drizzle) pour pages, sections, menus, médias, actualités, courriels-gabarits, versions, FR/EN — avec nos champs de ciblage B2B/B2C/groupe/dates ajoutés aux sections | évite un CMS maison ; même stack ; à valider en semaine 1 (version, adaptateur Postgres) ; repli = CMS intégré sur mesure |
| Paiements | interface PaymentProvider (autoriser, capturer, rembourser, tokeniser, webhooks) ; adaptateurs : « sur compte », enregistrement manuel (comptant, chèque, dépôt, carte au terminal), lien de paiement, processeur carte haut risque optionnel |
exigence RFP §9 : remplacer un processeur sans reconstruire |
| Comptabilité | connecteur QuickBooks Online (OAuth2, webhooks, file idempotente, écran d'erreurs) | §8 |
| Infrastructure | DigitalOcean (App Platform ou droplets systemd), staging + production, branches dev → prod, déploiement automatique, Sentry, monitoring de disponibilité |
ce que nous exploitons déjà pour nos clients |
| Propriété | dépôt git de Bullet, compte cloud de Bullet, exports complets (CSV/JSON) depuis l'admin + accès SQL lecture seule, documentation et runbooks | §13 |
Principes : un seul Postgres, pas de microservices ; toute règle métier (prix, taxes, visibilité) vit dans un module testé ; tout ce qui est lourd ou externe passe par une file avec reprise ; tout est journalisé (qui, quand, quoi).
Next.js · TypeScript · Tailwind CSS · shadcn/ui · NestJS · Drizzle · PostgreSQL · Redis/BullMQ · Payload CMS · DigitalOcean (App Platform/droplets, Managed Postgres, Spaces, CDN) · Sentry · GitHub Actions. API interne typée (REST + client TypeScript généré) plutôt que GraphQL : un seul client, moins de complexité ; GraphQL n'est utilisé que là où un tiers l'impose (export Shopify).
| Domaine | Fonctionnalités | Prototype |
|---|---|---|
| Comptes B2B | entreprise, utilisateurs et rôles, adresses (province → taxes/accise), documents de conformité avec expiration, conditions de paiement (prépayé/Net 15–60), limite de crédit, minimums, modes de paiement autorisés (carte +3 %, dépôt bancaire, chèque, comptant), statut, journal | 06 compte entreprise · 09 groupes |
| Catalogues personnalisés | catalogue = règles (inclure/exclure marque, catégorie, collection, produit) + contraintes (nicotine, ruptures, saveurs par province) + exceptions par client (exclusif/masqué), assignation par groupe/client, simulateur « vu par », publication versionnée, ajustement de prix du catalogue | 07 |
| Prix & rabais | prix de base par variante, ajustement par catalogue, par groupe, prix spécifique par client (variante ou marque), paliers de volume, promotions (%, fixe, temporaires, cibles, empilable oui/non), table des prix multi-niveaux avec sélection en masse, import/export CSV, aperçu avant publication, historique et restauration, prix plancher (avertissement), origine du prix figée sur chaque ligne de commande | 05-v2, 05-produit-detail, 08, 18 |
| Produits | liste, création, variantes, attributs vapotage (ml, nicotine, saveur, format), coût/plancher/marge, stock par variante (disponible/réservé/seuil), conformité calculée par province, images, collections, import/export | 10, 05-produit-detail, 20, 21 |
| Commandes & fulfillment | liste et pipeline (reçue → approuvée → préparation → expédiée → livrée), approbation (crédit, minimums, restrictions), préparation avec bon, expéditions partielles, étiquettes/suivi transporteur, ramassage en magasin, facturation à l'expédition, retours (RMA → note de crédit), annulations, journal | 15, 13 |
| Livraison | zones/tarifs (province, code postal, poids/valeur), gratuité par groupe, transporteurs (Purolator, Postes Canada, livraison Bullet), règles, simulateur | 17 |
| Taxes, accise, réglementation | matrice par province (TPS/TVH/taxe prov., accise fédérale + coordonnée, vente autorisée, saveurs, nicotine max), restrictions produits, canaux (B2B/distributeur/B2C), versions datées, simulateur ; Bullet définit, la plateforme applique | 14 |
| Boutique client | accueil, catalogue filtré (prix du client), commande rapide (fréquents, quantités par nicotine, paliers, promos), panier avec origine des prix, expédition ou ramassage, paiement sur compte / dépôt / chèque-comptant / carte, « Mon entreprise » (commandes, factures, paiements, utilisateurs, adresses, documents), FR/EN | boutique.html |
| Analytique | client 360 (21 indicateurs du RFP + santé du compte, clients similaires, produits abandonnés, cross-sell, factures, paiements), tableau de bord direction (filtres période/client/rep/province/marque/catégorie/produit, représentants, en baisse/inactifs), représentants, exports | 01, 02, 19 |
| Contenu & marketing | pages, sections, menus, modèles, bannières & campagnes, actualités, courriels transactionnels FR/EN, avis légaux (age gate, mentions), médias, SEO & redirections | 16 |
| Intégrations | QuickBooks Online (sources de vérité, erreurs, journal, mapping taxes/comptes), transporteurs, courriel (Klaviyo/Mailchimp), exports/sauvegardes | 12, 17, 23 |
| Sécurité & données | rôles admin, 2FA, journal d'audit, exports par objet, sauvegardes, accès SQL lecture seule | 22, 23 |
shopify_* (bulk operations), rejouable.Sources de vérité et sens de synchronisation (activables objet par objet) :
| Objet | Source de vérité | Sens |
|---|---|---|
| Entreprises / clients | plateforme | → QBO Customer |
| Produits / SKU | plateforme | → QBO Item |
| Factures | plateforme (émises à l'expédition, partielles si expédition partielle) | → QBO Invoice |
| Codes de taxe | QuickBooks | ← mappés dans la plateforme |
| Paiements (carte, dépôt, chèque, comptant), crédits, soldes | QuickBooks (comptabilité) ; les paiements saisis par un employé dans la plateforme sont poussés vers QBO | ⇄ |
| Statut du compte (en retard, bloqué) | plateforme, calculé à partir des soldes QBO + règles | interne |
Mécanique : OAuth2, webhooks + rattrapage périodique, file idempotente (clé externe des deux côtés — rejouer ne crée jamais de doublon), écran d'erreurs avec ré-essai et résolution (doublons de clients, code de taxe inactif…), journal, mode « comparer plateforme ↔ QBO » avant la première synchronisation, import initial de l'historique financier avec rapprochement des soldes. Règles de conflit écrites (facture modifiée dans QBO = refusée et signalée ; paiement supprimé = solde recalculé et représentant averti ; panne QBO = file locale, aucune perte). À confirmer avec Bullet : une seule société QBO ; QBO Canada avec TPS/TVQ ; plafonds d'API.
Le B2B est le cœur, pas un plugin : entreprise (avec ses utilisateurs, rôles, adresses, documents, conditions, crédit) → groupe de clients (catalogue par défaut, ajustement de prix, conditions par défaut) → surcharges par entreprise (catalogue, exceptions produits, prix spécifiques, conditions). Représentants avec portefeuille, objectifs, règles d'assignation, prix client proposé avec approbation au-delà d'un seuil. Approbation interne côté client (acheteur → propriétaire) au-dessus d'un montant. Commande rapide (fréquents, dernière commande, paliers) et « Mon entreprise » complet. Le B2C partage le même modèle (une entreprise « particulier ») — voir §15 pour son périmètre.
PRIX-PLAN-DE-MATCH.md (validé avec Anthony le 17 août).Le phasage est construit pour que Bullet puisse basculer tôt si Shopify l'impose : la phase 1 est autonome, les suivantes s'ajoutent sans reconstruire.
| Phase | Contenu | Durée | Bullet peut… |
|---|---|---|---|
| 1 — Plateforme de base (MVP) | audit Shopify, fondations techniques, produits/variantes/inventaire, catalogues, moteur de prix, comptes & groupes, commandes + expédition/ramassage, boutique (catalogue, commande rapide, panier sur compte / dépôt / chèque / comptant / carte +3 %), Mon entreprise, admin, import Shopify (produits, clients, prix, commandes historiques) | ≈ 8 semaines (2 mois) | opérer sur la nouvelle plateforme (factures créées dans QuickBooks manuellement en attendant la phase 2) |
| 2 — QuickBooks & opérations | synchronisation QBO complète (clients, produits, factures, paiements, crédits, taxes, soldes), taxes/accise versionnées, transporteurs (étiquettes, suivi), RMA, courriels transactionnels, utilisateurs admin & audit | 4–5 semaines, démarrée en parallèle dès la semaine 4 de la phase 1 par le second développeur | fermer la double saisie |
| 3 — Analytique & représentants | client 360, tableau de bord direction, health score, représentants, exports | 2–3 semaines, en parallèle de la phase 2 | piloter |
| 4 — Contenu & marketing | Payload CMS : pages, sections, menus, bannières & campagnes, actualités (optionnel), avis légaux, SEO & redirections finales ; l'accueil est « en dur » jusque-là | 3–4 semaines, en fin de parcours | gérer le contenu sans nous |
| Bascule & hypercare | migration finale, gel Shopify, delta, DNS, support renforcé | bascule dès la fin de la phase 1 si nécessaire, sinon après la phase 2 · hypercare 4–6 semaines | — |
Avec deux développeurs à plein temps et les phases 2–4 menées en parallèle : MVP opérable à 2 mois, construction ≈ 12–15 semaines, projet « terminé » (bascule + hypercare) en 4 à 6 mois. Les détails fins et l'amélioration continue s'étalent ensuite sur ~1 an. La vitesse dépend en bonne partie de Bullet : voir « calendrier de décision » (§17). Le chemin critique n'est pas le code : ce sont les décisions, les données Shopify et l'accès QuickBooks.
Dépendances explicites : phase 2 tient en 4–5 semaines si la comptable de Bullet est disponible et si l'audit QuickBooks (doublons, taxes) est propre ; les demandes de processeur carte, si voulues, se lancent dès la signature.
Note d'effort livraison/fulfillment (§10 du RFP) : règles/tarifs par zone S, restrictions au panier S (données de §11), statuts et expéditions partielles M, étiquettes/suivi transporteur M (agrégateur = plus court), RMA → crédit QBO M, inventaire réservé/disponible/seuils M ; ≈ 4–5 semaines-dev réparties entre les phases 1 et 2.
Critères d'acceptation par phase (proposés — à affiner avec Bullet)
Phase 1 : un détaillant se connecte, voit son catalogue et ses prix (client, groupe, catalogue, paliers, promo) ; passe une commande rapide et la retrouve dans l'admin ; l'admin approuve, prépare, expédie (ou ramassage) et la commande passe « livrée » ; les 600+ produits et 250+ comptes migrés sont réconciliés (rapport signé) ; un lot de prix est publié avec aperçu et restauré ; un client entreprise gère ses utilisateurs et adresses ; le journal enregistre chaque action. Phase 2 : une facture émise apparaît dans QuickBooks en < 5 minutes avec les bons codes de taxe ; un paiement saisi dans QuickBooks met à jour le solde et le statut du compte ; une erreur de synchronisation est visible, explicable et rejouable ; les taxes/accise d'un panier correspondent à la matrice validée pour 5 provinces test ; une expédition génère étiquette et suivi ; un RMA produit une note de crédit dans QuickBooks. Phase 3 : les 21 indicateurs du client 360 sont calculés et vérifiés sur 3 clients contre les données source ; les 7 filtres du tableau de bord direction fonctionnent ; le health score est expliqué par ses composantes. Phase 4 : l'équipe crée une page, l'ajoute à un menu, la publie et la voit en boutique sans intervention d'ArtifiQ ; une bannière ciblée B2B n'apparaît pas à un visiteur ; un changement d'URL crée sa redirection.
Prix forfaitaire du projet : 90 000 $ (avant taxes) pour l'ensemble des phases 1 à 4, la migration, la formation, la documentation, la bascule et l'hypercare, tel que décrit dans cette proposition. Répartition indicative par phase (proportionnelle à l'effort) :
| Phase | Effort | Part |
|---|---|---|
| Phase 1 — plateforme de base (MVP) (incl. audit, migration à blanc) | ≈ 45 % | 40 000 $ |
| Phase 2 — QuickBooks & opérations | ≈ 25 % | 22 500 $ |
| Phase 3 — analytique & représentants | ≈ 12 % | 11 000 $ |
| Phase 4 — contenu & marketing | ≈ 10 % | 9 000 $ |
| Bascule, formation, hypercare | ≈ 8 % | 7 500 $ |
| Total | 90 000 $ |
Modalités de paiement, au choix de Bullet : (a) par phase — 20 % à la signature, puis le solde de chaque phase à son acceptation ; ou (b) mensualisé — 15 000 $/mois sur 6 mois, ou 18 000 $/mois sur 5 (ajusté si le calendrier s'étire du fait de Bullet, voir §17). La phase 0 « départ rapide de Shopify », si Bullet l'active, est un réordonnancement de la phase 1 : sans coût additionnel, sauf demandes hors périmètre.
Efforts sous-jacents (pour transparence) : ≈ 40–50 semaines-dev réparties comme suit — fondations 3–4 · produits/catalogues/comptes 4–5 · moteur de prix 3–4 · commandes/fulfillment/inventaire/livraison 4–5 · boutique/Mon entreprise 4–5 · QuickBooks 4–6 · taxes/accise 2 · contenu (Payload) 1–2 · analytique 3 · migration 3 + cutover · tests/formation/doc/hypercare 3–4. Le test d'intrusion est réalisé pendant le développement et inclus.
DigitalOcean (app + Postgres managé + Redis + Spaces/CDN + staging) ≈ 150–300 $/mois ; courriel transactionnel ≈ 20–50 $/mois ; Sentry/monitoring ≈ 30–60 $/mois ; sauvegardes hors site incluses ; Payload : gratuit (open source) ; Klaviyo/Mailchimp : selon nombre de contacts (à la charge de Bullet) ; frais de carte : ceux de l'acquéreur choisi (refacturés 3 % aujourd'hui) ; QuickBooks : abonnement existant. Aucune licence ArtifiQ récurrente sur le logiciel livré.
Ce qui est inclus sans frais : tout ce qui a été livré doit fonctionner comme convenu — la correction des bugs et des pannes causées par notre travail est incluse tant que le contrat de support est en vigueur, sans décompte d'heures. Ce qui passe par la banque d'heures : tout changement ou ajout qui ne faisait pas partie de l'entente initiale (nouvelle fonctionnalité, modification d'une règle, intégration supplémentaire).
Tarifs (à confirmer par Anthony) : banque d'heures prépayée (10 à 20 heures ou plus, au choix de Bullet) : 110–120 $/h ; intervention ponctuelle sans banque : 150 $/h ; travail sur mesure important : évalué et devisé.
Délais de réponse ArtifiQ : urgence (panne, plateforme inutilisable) 24–48 h ; amélioration continue 1–2 semaines ; sur mesure : évalué au cas par cas. Demandes et notifications par courriel (adresse dédiée), suivi dans un registre partagé.
Inclus dans le forfait : monitoring et alertes, sauvegardes vérifiées (test de restauration trimestriel), mises à jour de sécurité et de dépendances, correction de bugs, revue trimestrielle des priorités ; infrastructure refacturée au réel ; hors scope au tarif ci-dessus.
| Risque | Impact | Réponse |
|---|---|---|
| Échéance Shopify (périmètre canadien incertain) | Bullet pourrait devoir quitter plus vite | phase 0 en 4–6 semaines ; priorités réajustables ; plan de cutover anticipé |
| Processeur de carte en ligne pour le vapotage | délais 2–6 semaines, réserve roulante 5–10 %, taux 3,5–5 % | rails principaux = sur compte + dépôt/chèque/comptant/terminal (existants) ; carte en ligne = adaptateur optionnel ; démarrer les demandes dès la signature ; questions posées avec le profil « B2B vers détaillants licenciés, Canada » |
| Qualité des données Shopify (doublons, prix incohérents, coûts absents) | marges fausses, migration lente | audit précoce, réconciliation automatisée, migrations à blanc |
| QuickBooks en conditions réelles | erreurs de sync, doublons | connecteur idempotent, écran d'erreurs, mode comparer, tests sur sandbox et sur copie de prod |
| Règles réglementaires mouvantes (accise, saveurs, provinces) | recalculs, blocages | règles versionnées avec date d'effet, Bullet propriétaire des règles |
| B2C | vente en ligne de vapotage interdite au Québec ; hors Québec = age gate, restrictions par province, processeur carte | hors périmètre du lancement ; faisable sur la même plateforme (quelques semaines supplémentaires, chiffrées le moment venu) ; intention et horizon à confirmer par Bullet |
| Changement des règles de prix en cours de projet | dérive | plan de match validé (annexe), toute modification passe par un avenant de périmètre |
| Disponibilité de Bullet (décisions, données, comptable) | glissement du calendrier | calendrier de décision contractuel (§17), staging permanent pour valider tôt |
| Dépendance à un fournisseur | contraire au RFP | code, données, infra chez Bullet ; exports ; documentation ; Payload open source |
Multi-entrepôts et transferts ; application mobile pour les représentants (commande sur place, prise de photos, notes) ; EDI/portails pour les chaînes ; prévisions de réassort et suggestions par IA (déjà amorcées avec « à réapprovisionner » et cross-sell) ; B2C hors Québec avec processeur dédié ; place de marché fournisseurs (Bullet comme plateforme pour ses marques) ; API partenaire pour les grands comptes ; rapports d'accise automatisés.
Paiement du projet : par phase (à l'acceptation de chaque phase livrée) ou mensualisé sur la durée du projet, au choix de Bullet.
Propriété : Bullet reçoit une licence perpétuelle, non exclusive et transférable avec l'entreprise d'utiliser et de modifier la plateforme (code source livré dans son dépôt, données et infrastructure à son nom, aucune dépendance à ArtifiQ pour opérer) ; la licence ne permet pas de revendre la plateforme comme produit. ArtifiQ conserve la propriété intellectuelle de son code et peut le réutiliser pour d'autres clients — jamais les données ni la configuration de Bullet.
Gestion des changements : toute demande hors périmètre est chiffrée (banque d'heures ou devis) et acceptée par courriel avant réalisation.
Calendrier de décision : la vitesse du projet dépend de la disponibilité de Bullet. Engagement réciproque : ArtifiQ livre et documente chaque étape ; Bullet valide ou répond dans les 5 jours ouvrables à chaque étape livrée (décisions, données, accès QuickBooks, comptable) ; au-delà, le calendrier glisse d'autant, sans pénalité pour l'une ou l'autre partie.
Environnement de staging : permanent, avec données migrées, accessible à l'équipe de Bullet ; démonstration à chaque fin de sprint ; rien n'est déployé en production sans validation en staging.
Sécurité : authentification à deux facteurs pour l'admin, rôles et permissions, journal d'audit complet, chiffrement en transit et au repos, sauvegardes quotidiennes + récupération à un instant donné avec test de restauration trimestriel, mises à jour de sécurité, séparation staging/production, secrets hors du code ; conformité Loi 25 (Québec) pour les données personnelles ; test d'intrusion réalisé pendant le développement (inclus).
Hypothèses et exclusions : le B2C n'est pas dans le périmètre de lancement. C'est faisable sur la même plateforme (même modèle de données, boutique et checkout déjà prévus pour un visiteur), mais il ajoute quelques semaines de travail dédié — barrière d'âge, restrictions par province, processeur de carte en ligne, et vente en ligne interdite au Québec donc hors Québec seulement — que nous chiffrerons précisément au moment voulu, selon l'état de la plateforme ; nous demandons à Bullet son intention et son horizon ; aucun processeur de carte en ligne au lancement (à confirmer : processeur actuel, part des paiements par carte) ; la migration reprend le contenu Shopify existant ; les nouveaux textes, photos et traductions EN sont produits par l'équipe de Bullet dans le CMS ; les ententes et tarifs négociés avec les transporteurs sont ceux de Bullet (à documenter) ; « Actualités » est optionnel (pas de blog sur le site actuel) ; QuickBooks Online Canada, une seule société.
pages/02-dashboard-direction-v2.html ; boutique : pages/boutique.html).ANALYSE-RFP.md — analyse section par section et couverture.PRIX-PLAN-DE-MATCH.md — modèle de prix validé.PAIEMENTS-VAPE.md — contexte paiements et Shopify.DESIGN-BRIEF.md — système visuel.Questions ouvertes à Bullet avant la version finale : avis Shopify reçu et échéance ; processeur de carte actuel (fournisseur, taux, existe-t-il en dehors de Shopify ? — s'il a une API ou une page de paiement hébergée, nous le réutilisons) ; part des paiements par carte ; ententes de livraison (transporteurs, tarifs, volumes) ; une seule société QuickBooks, QBO Canada, accès sandbox ; coûts d'achat par produit disponibles ? (source : QuickBooks, listes fournisseurs) — nécessaires pour les marges ; outil d'inventaire/entrepôt actuel ; B2C : intention et horizon ; quelles apps/fonctions marketing utilisez-vous sur Shopify aujourd'hui (courriels, avis, pop-ups, codes promo…) — le RFP demande de les reconstruire ou remplacer.