DEV Community

KazKN
KazKN

Posted on

Monitoring de Prix E-Commerce : Construisez Votre Propre Système

Vous perdez de l'argent chaque jour où vous ne surveillez pas les prix de vos concurrents. Dans le e-commerce, le prix est le facteur de conversion n°1 — pourtant la plupart des vendeurs fixent un prix une fois et l'oublient. Selon nos données issues du suivi de 130 000+ annonces e-commerce, les vendeurs qui ajustent leurs prix chaque semaine réalisent 18 à 27% de ventes en plus.

Ce guide vous montre comment construire un système complet de surveillance des prix — du scraping aux alertes en passant par le repricing automatisé.

Le Vrai Coût de l'Absence de Monitoring

D'après notre analyse de 130 000 annonces sur les marketplaces européennes pendant 90 jours :

  • 67% des vendeurs ne changent jamais leur prix initial
  • Les annonces avec 2+ ajustements de prix se sont vendues 3,2x plus vite
  • La fréquence optimale de repricing est de tous les 3-5 jours pour la mode
  • Les articles surpayés (>15% au-dessus de la moyenne) mettent 4,7x plus longtemps à se vendre

Ces chiffres proviennent du scraping de plateformes comme Vinted dans 8 pays via le Vinted Smart Scraper.

Étape 1 : Définir Vos Cibles de Surveillance

const configSurveillance = {
  produits: [
    {
      nom: 'Nike Air Max 90',
      motsCles: ['nike air max 90', 'nike airmax 90'],
      marques: ['Nike'],
      prixMin: 20,
      prixMax: 150,
      tailles: ['42', '43', '44'],
    },
    {
      nom: 'Levi\'s 501 Original',
      motsCles: ['levis 501', 'levi\'s 501'],
      marques: ['Levi\'s', 'Levis'],
      prixMin: 10,
      prixMax: 80,
    },
  ],
  marches: ['fr', 'de', 'es', 'it', 'nl'],
  frequence: 'quotidien',
  seuilAlerte: 0.15,
};
Enter fullscreen mode Exit fullscreen mode

Étape 2 : Construire le Pipeline de Scraping

import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });

async function collecterDonneesPrix(produit, marche) {
  const run = await client.actor('kazkn/vinted-smart-scraper').call({
    searchQuery: produit.motsCles[0],
    countryCode: marche,
    maxItems: 100,
    minPrice: produit.prixMin,
    maxPrice: produit.prixMax,
  });

  const { items } = await client.dataset(run.defaultDatasetId).listItems();

  return items.map(item => ({
    nomProduit: produit.nom,
    marche,
    titre: item.title,
    prix: parseFloat(item.price),
    marque: item.brand,
    etat: item.status,
    url: item.url,
    dateCollecte: new Date().toISOString(),
  }));
}

async function scanComplet(config) {
  const toutesLesDonnees = [];

  for (const produit of config.produits) {
    for (const marche of config.marches) {
      try {
        const donnees = await collecterDonneesPrix(produit, marche);
        toutesLesDonnees.push(...donnees);
        const moyenne = donnees.reduce((s, d) => s + d.prix, 0) / donnees.length;
        console.log(
          `✅ ${produit.nom} [${marche}]: ${donnees.length} annonces, moy. ${moyenne.toFixed(2)}€`
        );
      } catch (err) {
        console.error(`❌ ${produit.nom} [${marche}]: ${err.message}`);
      }
    }
  }

  return toutesLesDonnees;
}
Enter fullscreen mode Exit fullscreen mode

Étape 3 : Stocker l'Historique des Prix

Le monitoring sans historique est inutile. Utilisez SQLite pour la simplicité :

import Database from 'better-sqlite3';

const db = new Database('surveillance-prix.db');

db.exec(`
  CREATE TABLE IF NOT EXISTS prix (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    nom_produit TEXT NOT NULL,
    marche TEXT NOT NULL,
    titre TEXT,
    prix REAL NOT NULL,
    marque TEXT,
    etat TEXT,
    url TEXT,
    date_collecte DATETIME DEFAULT CURRENT_TIMESTAMP
  );

  CREATE INDEX IF NOT EXISTS idx_produit_marche 
  ON prix(nom_produit, marche, date_collecte);
`);

function insererDonnees(donnees) {
  const insert = db.prepare(`
    INSERT INTO prix (nom_produit, marche, titre, prix, marque, etat, url, date_collecte)
    VALUES (@nomProduit, @marche, @titre, @prix, @marque, @etat, @url, @dateCollecte)
  `);

  const insererPlusieurs = db.transaction((items) => {
    for (const item of items) insert.run(item);
  });

  insererPlusieurs(donnees);
  console.log(`${donnees.length} enregistrements insérés`);
}

function obtenirTendance(nomProduit, marche, jours = 30) {
  return db.prepare(`
    SELECT 
      DATE(date_collecte) as date,
      AVG(prix) as prix_moyen,
      MIN(prix) as prix_min,
      MAX(prix) as prix_max,
      COUNT(*) as annonces
    FROM prix
    WHERE nom_produit = ? AND marche = ?
      AND date_collecte >= datetime('now', '-' || ? || ' days')
    GROUP BY DATE(date_collecte)
    ORDER BY date
  `).all(nomProduit, marche, jours);
}
Enter fullscreen mode Exit fullscreen mode

Étape 4 : Système d'Alertes

Soyez notifié quand les prix baissent ou montent significativement :

function verifierAlertes(config, donneesActuelles) {
  const alertes = [];

  for (const produit of config.produits) {
    for (const marche of config.marches) {
      const actuelles = donneesActuelles.filter(
        d => d.nomProduit === produit.nom && d.marche === marche
      );

      if (actuelles.length === 0) continue;

      const moyenneActuelle = actuelles.reduce((s, d) => s + d.prix, 0) / actuelles.length;
      const historique = obtenirTendance(produit.nom, marche, 7);

      if (historique.length === 0) continue;

      const derniereMoyenne = historique[historique.length - 1]?.prix_moyen;
      const variation = (moyenneActuelle - derniereMoyenne) / derniereMoyenne;

      if (Math.abs(variation) >= config.seuilAlerte) {
        alertes.push({
          produit: produit.nom,
          marche,
          ancienneMoyenne: derniereMoyenne.toFixed(2),
          nouvelleMoyenne: moyenneActuelle.toFixed(2),
          variationPourcent: (variation * 100).toFixed(1),
          direction: variation > 0 ? '📈 HAUSSE' : '📉 BAISSE',
          meilleureAffaire: actuelles.sort((a, b) => a.prix - b.prix)[0],
        });
      }
    }
  }

  return alertes;
}
Enter fullscreen mode Exit fullscreen mode

Étape 5 : Analyse IA Avec le MCP

Allez plus loin en connectant votre monitoring au Vinted MCP Server. Cela permet aux assistants IA d'interroger vos données de prix en langage naturel.

Installez depuis npm :

npm install vinted-mcp-server
Enter fullscreen mode Exit fullscreen mode

Ou clonez depuis GitHub pour personnaliser.

Vous pouvez ensuite demander à votre IA :

  • « Quel est le prix moyen des Nike Air Max 90 en Allemagne cette semaine ? »
  • « Montre-moi les produits où la France est >30% plus chère que l'Espagne »
  • « Quels produits ont des prix en baisse sur tous les marchés ? »

Benchmarks de Performance

D'après nos tests avec le Vinted Smart Scraper :

Échelle Produits × Marchés Annonces/Jour Coût Apify/Mois
Débutant 5 × 3 ~1 500 ~5$
Croissance 20 × 5 ~10 000 ~25$
Pro 50 × 8 ~40 000 ~49$
Entreprise 200 × 12 ~240 000 Sur devis

FAQ

Combien coûte un système de monitoring de prix ?

D'après nos benchmarks, un petit setup (5 produits, 3 marchés) coûte environ 5$/mois sur Apify. Le Vinted Smart Scraper facture par unité de calcul, et la plupart des petites exécutions restent dans les limites gratuites.

Peut-on surveiller d'autres plateformes que Vinted ?

Absolument. L'architecture de ce guide est agnostique. Pour les app stores, le Scraper App Store offre une fonctionnalité similaire pour suivre les prix des apps dans 40+ pays.

Comment éviter d'être bloqué pendant le scraping ?

Utilisez des proxies résidentiels rotatifs et respectez les limites. Les acteurs Apify comme le Vinted Smart Scraper gèrent la rotation des proxies automatiquement.

Quelle base de données pour l'historique des prix ?

Pour du monitoring à petite échelle (<100K enregistrements/mois), SQLite est parfait — zéro configuration. Pour plus grand, PostgreSQL avec l'extension TimescaleDB.

En combien de temps voit-on un ROI du monitoring de prix ?

Selon nos données, le délai moyen avant la première décision de repricing rentable est de 8 jours. Les vendeurs rapportent 18-27% d'augmentation des ventes dans le premier mois.


Construisez Votre Moniteur de Prix

Le monitoring de prix vous donne un avantage concurrentiel sur n'importe quelle marketplace. Commencez par un scan quotidien simple et laissez les données guider vos prix.

Essayez le Vinted Smart Scraper sur Apify →

Pour une analyse IA, le Vinted MCP Server permet d'interroger les données conversationnellement — GitHub | npm.

Top comments (0)