Site web pour grossiste & distributeur

RÉF · GRO-B2B-22 · v2026.05

Cinquante mille références,
une seule allée.

Site B2B pour grossistes et distributeurs. Catalogue énorme, multi-marques, multi-fournisseurs. Vos acheteurs cherchent une référence précise — pas une vitrine. Ils veulent commander cinquante lignes en cinq minutes, depuis leur poste, sans appeler le commercial.

Grossiste industriel, fournitures bureau, équipement, alimentaire, quincaillerie, BTP — on construit le site qui tient cinquante mille à deux cent mille SKU sans broncher. Django, PostgreSQL avec index GIN, ElasticSearch, panier import CSV, sync ERP.

50 000+ SKU Cross-réf multi-marques Panier CSV Sync ERP
DOC · GRO-B2B-22 · Plan logistique FORMAT · A1 ÉCHELLE · 1:1 RÉV · 03

Quatre angles morts · scan dépôt

Votre site est en rupture avant l'allée 12.

On a regardé deux cents sites de grossistes et de distributeurs ces trois dernières années. Quatre patterns reviennent — toujours les mêmes, indépendamment du secteur. La marketplace Amazon Business affiche votre concurrent à côté de vous, capte les requêtes longue traîne, et vous laisse expliquer à l'acheteur pourquoi votre site rame sur le filtre "matière inox".

Pattern · 01 CRITIQUE

Prestashop qui crashe à cinquante mille SKU.

Prestashop, Magento, Shopify Plus — tous excellents jusqu'à dix mille références bien tagguées. Au-delà, les filtres à facettes recalculent en synchrone à chaque requête, le serveur tousse, le TTFB part à six secondes, et l'acheteur est déjà chez un autre. Votre catalogue mérite mieux qu'une boutique e-commerce dimensionnée pour vendre des t-shirts.

Pattern · 02 CRITIQUE

Cross-référence multi-marques absente.

Votre acheteur arrive avec une référence Bosch en rupture. Votre site lui répond "Produit non disponible" — fin de l'histoire. Aucun moteur d'équivalences vers la référence Makita compatible, vers l'ancienne référence qui existait sous un autre code, vers l'alternative stock disponible. La commande part chez le concurrent qui, lui, propose un substitut en deux clics.

Pattern · 03 MAJEUR

Tarifs négociés non personnalisés au login.

Le tarif catalogue s'affiche partout, à tous. Vos clients fidèles qui ont négocié leur grille depuis dix ans découvrent leur prix réel… en téléphonant. Aucune lecture automatique de la grille ERP côté espace client. Aucune remise palier quantité visible. L'acheteur ne sait pas s'il commande au bon prix — il appelle, vous le rappelez, vous y passez du temps.

Pattern · 04 MAJEUR

Panier ligne par ligne, une heure par commande.

L'acheteur a sa liste de réassort hebdomadaire dans Excel — cinquante références, des quantités précises, parfois deux cents lignes. Votre site ne permet que l'ajout au panier ligne par ligne, depuis la fiche produit, recherche après recherche. Une heure de travail. Pendant ce temps, Amazon Business absorbe la commande en deux minutes via import CSV.

« Quatre patterns. Une seule cause — on a confondu boutique en ligne et outil métier pour acheteur professionnel. »

Univers signature · Catalogue B2B

Cinquante mille références filtrables en deux secondes.

Voici à quoi ressemble votre catalogue une fois indexé sur PostgreSQL + ElasticSearch. Facettes pré-calculées en arrière-plan, équivalences en sidebar, tarifs B2B personnalisés au login, panier import CSV en deux clics. Données démo, structure réelle.

CATALOGUE · Quincaillerie pro

53 248 réfs · 12 marques · Stock multi-entrepôt

ElasticSearch · OK

Matière

  • Inox A28 240
  • Acier zingué12 408
  • Laiton3 102

Marque

  • Bosch4 102
  • Makita3 840
  • Stanley2 274

Dispo

  • Stock J+141 280
  • Stock J+28 410
  • Sur commande3 558

Prix B2B

  • Grille 01cat.
  • Grille négo−18%
  • Palier vol.−5%
SKU Désignation Marque Stock Délai Prix net
SKU-12834-A Vis inox A2 6×40 — tête fraisée torx Bosch 2 480 J+1 0,084 €
SKU-12834-B Vis inox A2 6×50 — tête fraisée torx Bosch 1 840 J+1 0,092 €
SKU-12834-C Vis inox A2 6×60 — tête fraisée torx Bosch 412 J+1 0,108 €
SKU-18920-X Perceuse 18V brushless · 2 batt. 4Ah Makita 142 J+1 249,00 €
SKU-18920-Y Perceuse 18V brushless · 2 batt. 5Ah Makita 0 → équiv.
SKU-22014-K Disque diamant 230 mm — béton armé Stanley 88 J+2 38,40 €
SKU-34028-M Pince multiprise 250 mm — manche bi-mat. Knipex 204 J+1 48,20 €
7 / 53 248 résultats · facettes pré-calculées · 64 ms Tarifs grille négo affichés · client connecté
DJANGO · 6.0 POSTGRES · 16 · INDEX GIN ELASTICSEARCH · 8.x FACETTES · CELERY ASYNC TTFB · 64 ms

Bénéfices · Quatre dimensions

Ce que ça change dans l'allée.

Quatre points où un site grossiste correctement bâti change concrètement la journée de vos acheteurs, de votre service commercial et de votre service ADV — pas dans dix-huit mois, dès la première semaine de mise en ligne.

B · 01

50 000+ SKU performants

Postgres + ElasticSearch · facettes async

Catalogue qui tient deux cents mille références sans tousser. Index GIN sur les attributs JSONB, facettes pré-calculées par Celery, ElasticSearch pour le ranking sémantique et la tolérance aux fautes. TTFB sous cent millisecondes même sur filtres complexes.

B · 02

Cross-référence intelligente

Bosch → Makita · ancien → nouveau · rupture → alternative

Modèle Equivalence avec quatre types — concurrent direct, ancienne référence, rupture définitive, alternative compatible. Score de confiance ajustable. La commande ne quitte plus le site pour cause de rupture, l'acheteur reste, le panier est préservé.

B · 03

Tarifs B2B au login

Grille négociée · paliers volume · conditions

Modèles CustomerPriceList et PriceListItem reliés à l'ERP. Le tarif catalogue s'affiche en mode anonyme, le tarif négocié bascule automatiquement après login. Paliers de remise sur quantité, conditions de paiement, encours visible. Plus jamais de "rappelez le commercial pour le prix".

B · 04

Panier CSV rapide

Import 200 lignes · preview · ajout en masse

L'acheteur dépose son CSV de réassort (SKU + quantité), le site lit, valide ligne à ligne, propose les équivalences sur les ruptures, affiche un preview, ajoute tout au panier en une action. Une commande de cinquante lignes traitée en deux minutes au lieu d'une heure.

Anatomie · Six modules grossiste

Six modules. Assemblés sur cadrage.

Tout site grossiste qu'on livre combine un sous-ensemble de ces six bundles. Chaque module est isolé, testé, documenté et conçu pour coexister avec les autres — pas de monolithe figé, l'app pousse module par module.

M · 01 STABLE

Catalogue massif & facettes

Modèle Product avec attributs JSONB indexés GIN, variantes, médias multiples, fiches PDF générées. Facettes calculées en arrière-plan (Celery), affichage filtres performants sur deux cent mille SKU.

  • Postgres index GIN sur JSONB
  • Facettes Celery + Redis
  • Variantes & déclinaisons
M · 02 STABLE

Équivalences multi-marques

Modèle Equivalence avec quatre types (concurrent, ancienne réf, rupture, alternative), score de confiance, suggestion automatique sur fiche produit, maintien du panier sur l'alternative validée.

  • 4 types d'équivalence
  • Score de confiance
  • Suggestion sur rupture
M · 03 STABLE

Tarifs négociés B2B

Modèles CustomerPriceList et PriceListItem, login obligatoire pour voir les prix négociés. Grilles par client, par groupe, paliers de remise sur volume, conditions de paiement personnalisées.

  • Grille par client
  • Paliers de remise
  • Encours & conditions
M · 04 STABLE

Panier CSV & réassort

Import CSV de la liste de réassort, validation ligne par ligne (existe / stock / MOQ / équivalence), preview, ajout en masse. Action "Recommander cette commande" sur l'historique pour rejouer une semaine type en un clic.

  • Import CSV format libre
  • Preview & correctifs
  • Réassort en un clic
M · 05 STABLE

Stock multi-entrepôts

Modèles StockLocation et Stock par site logistique. Dépôt central + dépôts régionaux. MOQ par référence, lead time différencié (J+1 central / J+2 régional), sourcing automatique sur la commande, alerte de réassort.

  • Dépôt central + régionaux
  • MOQ & lead time par réf.
  • Sourcing auto à la commande
M · 06 STABLE

Espace B2B sous-comptes

Compte société avec rôles distincts — acheteur (compose la commande), valideur (signe en ligne), comptable (consulte factures, encours). Workflow hiérarchique de validation, historique commandes, factures téléchargeables.

  • Rôles acheteur/valideur/compta
  • Validation hiérarchique
  • Historique & factures

Côté technique · Sous le capot

Six choix d'architecture qui tiennent le volume.

Le moteur sous la carrosserie. Six décisions techniques qu'on prend en sortie de cadrage pour qu'un catalogue B2B encaisse cinquante à deux cent mille références — sans broncher, sans Redis qui explose, sans page de fiche produit qui tombe en timeout.

T · 01

Django 6 · ORM optimisé

select_related / prefetch_related systématiques, annotations en base, queries traçées via django-silk en dev. Pas de N+1 toléré sur fiche produit ou listing.

FBV · CBV mixés · type hints

T · 02

PostgreSQL · index GIN JSONB

Attributs produits stockés en JSONB indexé GIN, queries jsonb_path_ops sous 50 ms sur deux cent mille références. Pas besoin d'ElasticSearch tant que le volume reste raisonnable.

Postgres 16 · partition par catégorie

T · 03

ElasticSearch · ranking sémantique

Au-delà de trente mille SKU, on déploie un nœud ES pour le ranking sémantique, la tolérance aux fautes de frappe, la synonymie multi-marques. Synchronisation incrémentale via signal Django + tâche Celery.

ES 8.x · sync Celery async

T · 04

Celery + Redis · facettes async

Calcul des facettes (matière × marque × stock × prix) en tâche asynchrone, résultat en cache Redis avec invalidation à la mise à jour du catalogue. La requête utilisateur ne déclenche jamais un recompte synchrone.

Celery 5 · Redis 7 · cache 1h

T · 05

Connecteur ERP bidirectionnel

Sage 100/X3 (API REST), Cegid (ODBC), EBP (API ou CSV planifié), Divalto (SOAP), Odoo (XML-RPC). Sync stock toutes les 5 min, tarifs au login, commandes sortantes en temps réel via webhook.

Bac à sable · cadrage phase 02

T · 06

Schema Product + Offer B2B

Markup JSON-LD complet — Product, Offer, AggregateOffer, BreadcrumbList. Sitemap segmenté par catégorie pour éviter les fichiers trop gros, balises hreflang si multilingue, indexation longue traîne par référence.

JSON-LD · sitemap segmenté · hreflang

Verbatim · fondateur

Citation Dylan Saint-Jalmes

« Un grossiste qui fait crasher son site Prestashop sur cinquante mille références, c'est un acheteur qui appelle son commercial pour passer commande au téléphone. Votre site, c'est l'inverse — Postgres et ElasticSearch dimensionnés pour le volume, filtres à facettes performants, panier import CSV en deux minutes. »

Dylan Saint-Jalmes · fondateur de l'atelier

Méthode · Quatre phases

De la visio à la mise en ligne.

Six à dix semaines selon la propreté de l'export catalogue, le périmètre fonctionnel, la complexité du connecteur ERP. Quatre phases distinctes, validées une par une — pas de surprise en sortie.

Phase · 01

Sem. 0

Audit visio & exports

Visio de soixante minutes, démo de votre catalogue actuel, exports échantillons (CSV mille références typiques), recensement des intégrations (ERP, transporteurs, paiement B2B, EDI). Sortie : compte-rendu et estimation périmètre.

Phase · 02

Sem. 1–2

Cadrage technique

Modèle de données catalogue, mapping des attributs et des équivalences, périmètre du connecteur ERP, parcours acheteur, arbo SEO, design system. Document validé par vos équipes ADV et IT avant le build.

Phase · 03

Sem. 3–4

Maquette catalogue

Maquette HTML interactive sur cinq à huit écrans clés — home, listing filtré, fiche produit, panier CSV, espace client. Validation parcours avec un ou deux acheteurs cibles avant le développement.

Phase · 04

Sem. 5–10

Build & mise en ligne

Développement Django + Postgres + ElasticSearch, import catalogue, sync ERP en bac à sable puis prod, recette acheteurs et ADV, formation back-office, mise en ligne progressive (catégorie par catégorie ou switch global).

Intégration ERP (Sage 100, Cegid, EBP, Divalto) — périmètre cadré séparément après audit du connecteur disponible.

FAQ · Six questions techniques

Ce qu'on nous demande en visio.

Q · 01 · Volume

Cinquante mille SKU sur Postgres, ça tient vraiment ?

+

Oui. PostgreSQL avec index GIN sur les attributs JSONB et sur les facettes encaisse largement deux cent mille références avec des temps de réponse sous quatre-vingts millisecondes sur filtres complexes — à condition de pré-calculer les facettes en arrière-plan (Celery) plutôt que de tout recompter à chaque requête.

Le vrai goulet n'est jamais Postgres — c'est l'absence de queries optimisées côté Django (N+1, prefetch_related oubliés, requêtes en boucle dans les templates). On audit ça systématiquement via django-silk pendant le build, on cadre les seuils acceptables, on ne livre pas avec une page de fiche produit à plus de cent cinquante millisecondes.

Q · 02 · Recherche

Pourquoi ElasticSearch et pas la recherche Postgres native ?

+

Postgres full-text (tsvector + GIN) est suffisant jusqu'à trente mille SKU et des requêtes simples — "vis inox 6×40 torx" trouve la bonne référence, le ranking est correct, la performance OK.

Au-delà, ElasticSearch apporte le ranking sémantique (le terme "perceuse 18 volts" remonte les bonnes références même si la fiche dit "drill 18V"), la tolérance aux fautes de frappe (l'acheteur tape "knipex" avec un X mal placé, ça passe), la synonymie multi-marques (Bosch et Makita renvoient des résultats croisés sur les références équivalentes) et les facettes calculées à la volée avec des temps stables même sur volumes lourds.

On déploie un seul nœud ES à la mise en ligne, puis on scale si nécessaire. La sync Django → ES passe par django-elasticsearch-dsl avec tâche Celery sur les signaux post_save.

Q · 03 · ERP

Vous synchronisez Sage 100, Cegid, EBP, Divalto ?

+

Oui. Le mapping et le périmètre sont cadrés en phase 02 avec votre intégrateur ERP — chacun a ses spécificités.

Sage 100 et Sage X3 — API REST officielle. Sync stock, tarifs, clients, articles, commandes en temps réel ou quasi (poll 5–15 min selon volume). Webhooks sortants depuis le site pour les commandes.

Cegid — connecteur ODBC ou export programmé. La sync stock se fait toutes les heures, les tarifs à la demande, les commandes en push direct.

EBP — API REST récente (EBP en ligne) ou export CSV planifié pour les versions anciennes. Divalto — webservices SOAP, plus verbeux mais stable. On a aussi traité Odoo (XML-RPC), Cegid Quadra et Sage Business Cloud.

Q · 04 · Cross-réf

Cross-référence multi-marques : comment ça marche techniquement ?

+

Un modèle Equivalence relie deux références par un type (concurrent direct, ancienne référence, rupture définitive, alternative compatible) et un score de confiance (0 à 100, ajustable par votre équipe technique).

À l'affichage de la fiche, on remonte les équivalences pertinentes triées par score décroissant — un acheteur qui cherche une perceuse Bosch en rupture voit la Makita compatible en haut, puis la DeWalt, puis une référence ancienne du catalogue.

Le panier maintient l'historique de la référence demandée même si l'acheteur valide une équivalence — utile pour la traçabilité commerciale (qui demandait quoi à l'origine) et pour les statistiques de rupture.

Les équivalences peuvent être importées en masse via CSV, alimentées par votre équipe technique au fil de l'eau, ou suggérées automatiquement par un script de matching sur les attributs (mêmes dimensions, même puissance, même tension).

Q · 05 · Panier CSV

Import CSV panier multi-lignes : cinquante références en deux minutes ?

+

Oui. L'acheteur dépose son CSV (SKU + quantité), le site lit, valide chaque ligne — la référence existe ou non, le stock est suffisant, le MOQ est respecté, une équivalence est proposée si rupture. Affichage d'un preview ligne par ligne avec correctifs proposés, puis ajout au panier en une seule action.

Format CSV libre — point-virgule ou virgule, avec ou sans entête, dans n'importe quel ordre de colonnes. Mapping des colonnes au premier import (l'acheteur dit "la colonne 1 c'est la réf, la colonne 3 c'est la quantité"), puis mémorisé pour les imports suivants.

Pour les très gros paniers (deux cents lignes et plus), le traitement passe en arrière-plan via Celery avec une barre de progression. L'acheteur ne reste pas bloqué sur la page.

Q · 06 · Délai

Quel délai pour mettre cinquante mille références en ligne ?

+

Six à dix semaines selon la qualité de l'export catalogue source. Le développement n'est pas le goulet — Django, PostgreSQL et ElasticSearch absorbent largement le volume.

Le travail réel : normalisation des attributs (unités cohérentes, formats harmonisés, libellés clairs), nettoyage des doublons, mapping des équivalences, harmonisation des unités de vente (à la pièce, par cent, au kg…), récupération des médias (photos produit nommées correctement).

Si votre catalogue actuel est dans un fichier Excel propre exporté de l'ERP : six semaines. Si l'arbo doit être refondue et les attributs harmonisés à partir de fiches PDF : plutôt dix semaines, avec une phase de data cleaning en parallèle du build.

Prochaine étape · audit visio offert

Votre catalogue,
en deux clics pour l'acheteur.

Audit visio offert de soixante minutes — on regarde votre catalogue actuel, votre ERP, vos parcours acheteur. On vous remet un plan d'attaque concret avec ordre de grandeur du périmètre. Que vous nous confiez le chantier ou pas.

Sans engagement · 60 min · 100% distanciel · rappel sous 24h