# Vendre en B2B sur WooCommerce avec des tarifs différenciés par zone géographique

> Un distributeur industriel doit appliquer des grilles tarifaires différentes selon la région du client B2B. Comment structurer les règles de prix par zone et par rôle.

- Auteur : Clément Hadrot
- Publié le : 2024-07-08
- Mis à jour le : 2024-07-08
- Catégorie : E-commerce
- URL : https://wpmoderne.dev.wordpress-developpement.fr/ecommerce/vendre-b2b-woocommerce-tarifs-zone-geographique/

## L’essentiel

- La zone géographique se déduit de l'adresse de facturation validée, pas de la géolocalisation IP
- Chaque grille tarifaire est un rôle utilisateur combiné à une règle de zone
- Le prix affiché avant connexion reste volontairement générique, pas la grille réelle

Comment appliquer automatiquement la bonne grille tarifaire à un client B2B selon sa région, sans que ce dernier ait à sélectionner manuellement sa zone à chaque commande ? C'est la question posée par un distributeur de pièces industrielles qui vendait à des grossistes régionaux avec des grilles de prix négociées différemment selon la zone de couverture commerciale de chacun.

Le catalogue comptait plusieurs milliers de références, chacune avec un prix de base, mais aussi cinq grilles tarifaires régionales distinctes reflétant des accords commerciaux négociés zone par zone, indépendamment du volume commandé par le client.

## La zone comme donnée de compte, pas de géolocalisation

Le premier choix structurant a été d'écarter toute détection automatique de zone par géolocalisation IP, jugée trop fragile pour un usage B2B où la facturation engage des montants significatifs. La zone tarifaire est assignée explicitement à chaque compte client B2B lors de sa validation par l'équipe commerciale, stockée en meta utilisateur (`_zone_tarifaire`), et rattachée à l'adresse de facturation déclarée et vérifiée, jamais déduite automatiquement d'une adresse IP.

## Rôle utilisateur et zone : deux dimensions combinées

> L'essentiel à retenir : La zone géographique se déduit de l'adresse de facturation validée, pas de la géolocalisation IP ; Chaque grille tarifaire est un rôle utilisateur combiné à une règle de zone ; Le prix affiché avant connexion reste volontairement générique, pas la grille réelle

La structure retenue combine deux dimensions indépendantes : un rôle utilisateur WordPress personnalisé (`client_grossiste`, `client_revendeur`) qui détermine le niveau de remise général, et une zone tarifaire qui ajuste ce niveau selon la région. Le calcul du prix final applique la règle correspondant à l'intersection des deux, via un filtre accroché à `woocommerce_product_get_price` :

```
add_filter( 'woocommerce_product_get_price', function( $price, $product ) {
    $user = wp_get_current_user();
    if ( ! in_array( 'client_grossiste', $user->roles, true ) ) {
        return $price;
    }
    $zone = get_user_meta( $user->ID, '_zone_tarifaire', true );
    $grille = get_post_meta( $product->get_id(), '_grille_' . $zone, true );
    return $grille !== '' ? $grille : $price;
}, 10, 2 );
```

Chaque produit porte donc jusqu'à cinq meta de prix spécifiques, une par zone, en plus de son prix de base. Cette approche a été préférée à une solution par pourcentage de remise uniforme, car les accords commerciaux négociés zone par zone ne suivaient pas un taux constant d'une référence à l'autre.

## Ce que voit un visiteur non connecté

Un visiteur non authentifié, ou un client B2B pas encore validé par l'équipe commerciale, voit un prix générique affiché sur la fiche produit, sans mention de remise, avec une invitation à créer un compte professionnel pour accéder aux tarifs négociés. Ce choix évite d'exposer publiquement la structure tarifaire complète de l'entreprise, y compris à des concurrents qui consulteraient simplement le site sans être clients.

## Le cache, un piège classique de ce type de projet

La mise en cache de page complète, activée par défaut pour les visiteurs anonymes, avait initialement été laissée active également pour les comptes B2B connectés, provoquant l'affichage occasionnel du prix d'une autre zone tarifaire à un client, selon l'ordre de génération du cache. La correction a consisté à exclure explicitement toute page produit du cache de page dès qu'une session B2B authentifiée était détectée, en s'appuyant sur un cookie de session dédié reconnu par la configuration du cache serveur.

- Prix générique affiché pour tout visiteur non authentifié.
- Grille tarifaire appliquée selon rôle et zone, une fois le compte B2B validé et connecté.
- Cache de page désactivé sur les pages produit pour toute session B2B authentifiée.
- Journal des modifications de zone tarifaire, pour tracer tout changement de grille appliqué à un compte.

> Conseil maison : ne stockez jamais une donnée aussi sensible qu'une zone tarifaire B2B sur un mécanisme déductible côté client (cookie non signé, paramètre d'URL). Rattachez-la toujours à un compte utilisateur validé côté serveur, quitte à demander une étape de validation manuelle à l'inscription.

## En résumé

Une tarification B2B différenciée par zone géographique se structure proprement en combinant un rôle utilisateur et une donnée de zone rattachée au compte, avec des meta de prix dédiées par zone plutôt qu'un système de pourcentage uniforme. La négociation commerciale des contrats à l'origine de ces grilles tarifaires, menée par les équipes commerciales, reste un processus entièrement distinct de cette implémentation technique.
