Findy
Findy

TROUVEZ. VENDEZ.

Documentation complète

Intégrer, personnaliser et facturer Findy

Cette page rassemble les informations nécessaires pour installer le widget, connecter le catalogue, régler le style, comprendre les tarifs et expliquer la consommation des requêtes à un client ou à une équipe technique.

Produit

Vue d'ensemble

Recherche

Findy affiche une barre ou se branche sur un champ existant, puis ouvre une expérience de recherche produits connectée au catalogue marchand.

Style

Le design se règle dans le dashboard: templates, couleurs, typographie, logo, disposition, fenêtre et comportements panier.

Tarifs

Chaque plan inclut un volume mensuel de requêtes. Les plans payants peuvent continuer au-delà avec un tarif pay-as-you-go.

Usage

Les recherches, clics et ajouts panier sont suivis dans les analytics et alimentent le compteur mensuel de consommation.

Source de vérité

Les snippets de cette page expliquent comment brancher Findy. Les couleurs, templates, limites produits et options visuelles viennent ensuite de la configuration sauvegardée dans le dashboard Findy.

Snippet

Installation rapide

Poser le conteneur à l'endroit où la recherche doit apparaître, charger le script avant</body>, puis appeler Findy.init. Remplacer VOTRE_CLE_WIDGET_FINDY par la clé widget du client.

<div id="findy-search"></div>

<script src="https://findysearch.com/widget-v2/findy-widget.js"></script>
<script>
  Findy.init({
    apiKey: 'VOTRE_CLE_WIDGET_FINDY',
    containerId: 'findy-search',
    apiBaseUrl: 'https://findysearch.com'
  });
</script>
  • Récupérer l'URL publique Findy, généralement https://findysearch.com.
  • Créer ou récupérer la clé widget du client dans le dashboard.
  • Vérifier que le catalogue est connecté ou en cours de synchronisation.
  • Tester desktop, mobile, clic produit, ajout panier et remontée analytics.
  • Ne jamais exposer de clés WooCommerce, PrestaShop ou API serveur dans le code du site marchand.

Findy.init

Options JavaScript

OptionTypeRôle
apiKeystring, requisClé widget publique qui identifie l'organisation Findy.
containerIdstringID du conteneur où Findy rend sa barre de recherche.
triggerSelectorstringSélecteur CSS d'un champ ou bouton existant qui ouvre Findy.
mobileTriggerSelectorstringSélecteur spécifique mobile si le thème utilise un DOM différent.
triggerModesearchbar ou selectorForce le comportement d'ouverture souhaité.
apiBaseUrlstringURL de l'instance Findy à appeler.
logoUrl, logoTextstringBranding optionnel si la configuration serveur ne définit pas déjà le logo.
popularSearchesstring[]Suggestions de secours côté client.
adaptivebooleanLaisse Findy adapter le mode d'affichage selon le contexte.
closeOnClickOutside, closeOnEscapebooleanContrôle de fermeture de l'overlay.
onContextChangefunction(context)Callback appelé en mode adaptive quand le contexte viewport change.
onAddToCartasync function(params)Intégration panier custom côté site marchand.

Exemple avec événements publics

Les événements de lecture se branchent avec Findy.on aprèsFindy.init. Les callbacks d'analyticsonSearch et onProductClick ne font pas partie du contrat public actuel.

<script>
  Findy.on('open', function() {
    console.log('Findy opened');
  });

  Findy.on('searchStart', function(event) {
    console.log('Findy search:', event.query);
  });

  Findy.on('searchComplete', function(event) {
    console.log('Findy results:', event.total);
  });

  Findy.on('addToCartSuccess', function(event) {
    console.log('Findy add to cart:', event.productId);
  });
</script>

Design

Style et personnalisation

Le style du widget est configuré côté Findy et livré au widget via l'API de configuration. Le site marchand garde uniquement le snippet d'intégration; les équipes peuvent donc ajuster le design sans redéployer le thème.

RéglageValeursImpact
TemplateMINIMAL, ELEGANT, BOLD, ECOMMERCEBase visuelle du widget.
CouleursprimaryColor, buttonColor, buttonTextColor, badgeColorCouleurs principales, boutons et badges.
TypographiefontFamily, titleFontSize, refFontSizePolice, taille des titres produits et références.
RayonborderRadius de 0 à 32Arrondi des champs, cartes et boutons.
LogologoUrlLogo client dans l'overlay de résultats.
DispositionlayoutMode: grid ou sliderAffichage produits en grille ou carrousel.
FenêtrewindowMode: fullscreen, compact, megamenuComportement de l'overlay sur desktop.
Volume affiché10, 20, 50, 100 ou scroll infiniNombre de produits demandés par page.
GrillegridColumns: auto ou 2 à 8Contrôle du nombre de colonnes desktop.
CommerceshowCartPopup, closeOnAddToCart, showQuantitySelectorComportements liés au panier.

Templates disponibles

Minimal pour un rendu sobre, Elegant pour une boutique premium, Bold pour un accent plus marqué, E-commerce pour un rendu marchand plus direct.

Comportement mobile

Sur mobile, Findy force une expérience plein écran, grille, scroll infini et filtre prix afin de préserver une recherche lisible et stable.

Conseil de recette design

Après un changement de style, tester au moins une recherche avec produits en promotion, produits sans stock, variantes, images longues et titres produits très longs.

Plans

Tarifs publics et requêtes incluses

PlanAbonnementRequêtes incluses / moisHors forfaitUsage conseillé
Free0 €1 0000 €Pour découvrir Findy gratuitement
Starter29 €/mois10 0000,0050 €/requêteIdéal pour les petites boutiques qui démarrent
Pro99 €/mois150 0000,0040 €/requêtePour les boutiques en croissance
Business199 €/mois400 0000,0030 €/requêtePour les grandes boutiques à fort trafic

Offres commerciales

Une offre commerciale acceptée peut définir un volume inclus et un tarif pay-as-you-go spécifiques. Dans ce cas, l'offre prévaut sur les valeurs standards du plan public.

Usage

Consommation des requêtes

Le compteur Findy est conçu pour refléter les interactions qui ont une valeur produit: recherche, clic et ajout panier. Les appels techniques nécessaires au chargement du widget ne sont pas tous facturés, mais certains vérifient le quota pour éviter de servir une expérience inactive.

ActionConsomme ?Détail
Recherche produitOui1 requête par appel à /api/widget/search, y compris pagination, filtres et scroll infini.
Clic produitOui1 requête quand l'événement CLICK est traité et que le quota est disponible.
Ajout panierOui1 requête quand l'événement ADD_TO_CART est traité. Selon le bouton et le template, un CLICK produit peut aussi être enregistré avant l'ajout panier.
Configuration widgetNonCharge le design et les réglages serveur. Ne décrémente pas le quota.
Trending, recherches populaires, catégories, collectionsNon directVérifie le quota pour éviter de servir le widget sans crédit, mais ne décrémente pas directement.
OPTIONS CORSNonPréflight navigateur ignoré par la facturation et par le quota fonctionnel.

Ordre de consommation

Findy consomme d'abord les requêtes bonus, puis les requêtes incluses du plan. Quand les deux compteurs sont vides, un plan payant actif bascule en hors forfait.

Hors forfait

Pour un plan payant actif, chaque requête hors forfait envoie un événement au Stripe Billing Meter afin d'être ajoutée à la facture.

Blocage

Si aucun quota n'est disponible et qu'aucun hors forfait ne peut être appliqué, le widget renvoie un état bloqué avec le message "Plus de requêtes disponibles".

Cas du bouton panier

Dans les templates où le bouton panier est rendu dans une carte produit cliquable, le clic peut produire deux événements facturables: CLICK puisADD_TO_CART. Une sélection de variante validée dans la fenêtre de variante ne déclenche que l'ajout panier.

Prix

Calcul de la facture

Le prix mensuel est la somme de l'abonnement et de la consommation hors forfait. Les requêtes incluses et bonus déjà disponibles ne génèrent pas de coût supplémentaire.

requêtes_disponibles = requêtes_plan_restantes + requêtes_bonus
requêtes_hors_forfait = overageRequestsThisPeriod
coût_hors_forfait = requêtes_hors_forfait x tarif_pay_as_you_go
total_mensuel = abonnement_mensuel + coût_hors_forfait
PlanScénarioCalcul
Free1 200 interactions facturablesLes 1 000 premières passent, puis le widget est bloqué. Pas de hors-forfait.
Starter12 500 interactions facturables29 € + 2 500 x 0,0050 € = 41,50 €.
Pro180 000 interactions facturables99 € + 30 000 x 0,0040 € = 219 €.
Business450 000 interactions facturables199 € + 50 000 x 0,0030 € = 349 €.
  • Le compteur mensuel d'usage s'appuie sur le compteur interne et les événements du mois en cours.
  • Les requêtes bonus sont séparées du quota du plan et consommées en priorité.
  • Les dépassements sont comptés dans overageRequestsThisPeriod.
  • La date de reset affichée vient de la période d'abonnement Stripe.
  • En cas de paiement suspendu sur un plan payant, l'accès peut être bloqué même si des compteurs existent.

CMS

Installation WooCommerce

Accès catalogue

Dans WordPress, aller dansWooCommerce > Réglages > Avancé > REST API, créer une clé dédiée Findy, choisir un compte avec les droits minimum nécessaires, puis copier leConsumer Key et le Consumer Secret. Dans Findy, renseigner l'URL de la boutique, tester la connexion, puis synchroniser.

Recherche existante du thème

Si le client veut conserver le champ de recherche du thème WooCommerce, utiliser un sélecteur CSS adapté au DOM desktop et mobile.

<script src="https://findysearch.com/widget-v2/findy-widget.js"></script>
<script>
  Findy.init({
    apiKey: 'VOTRE_CLE_WIDGET_FINDY',
    apiBaseUrl: 'https://findysearch.com',
    triggerSelector: '.woocommerce-product-search, input[type="search"]',
    mobileTriggerSelector: '.mobile-search input[type="search"]'
  });
</script>

Panier WooCommerce

  • Tester l'ajout panier sur un produit simple.
  • Tester un produit variable avec tailles ou couleurs.
  • Vérifier la mise à jour du mini-panier ou du compteur panier.
  • Tester les boutiques en sous-répertoire, multisite ou contexte multilingue.
  • Utiliser onAddToCart si le thème est fortement personnalisé ou headless.

CMS

Installation PrestaShop

Accès catalogue

Dans PrestaShop, aller dans Paramètres avancés > Webservice, activer le Webservice et créer une clé Findy avec des permissions de lecture.

BlocPermissionsNote
Catalogueproducts, categories, images, stock_availablesBase minimale pour indexer les produits.
Fonctionnalitésspecific_prices, product_features, product_feature_values, tagsPrix spécifiques, filtres et enrichissement.
Option ventesorder_detailsUniquement si le client accepte explicitement cet accès.
  • Ne pas accorder de droits d'écriture.
  • Ne pas activer orders, customers ou d'autres ressources sensibles si elles ne sont pas nécessaires.
  • Renseigner le taux de TVA uniquement si les prix PrestaShop remontent hors taxes. Exemple:20.

Recherche existante du thème

<script src="https://findysearch.com/widget-v2/findy-widget.js"></script>
<script>
  Findy.init({
    apiKey: 'VOTRE_CLE_WIDGET_FINDY',
    apiBaseUrl: 'https://findysearch.com',
    triggerSelector: '#search_widget form, #search_widget input[type="text"]',
    mobileTriggerSelector: '.header-mobile #search_widget input'
  });
</script>

Panier PrestaShop

Findy reconnaît les URL d'ajout panier PrestaShop générées lors de la synchronisation. Attention aux déclinaisons: l'ajout direct peut nécessiter un id_product_attribute. Si l'ajout direct d'une déclinaison est attendu, prévoir une redirection fiche produit ou une intégration custom avec onAddToCart.

API

Installation custom ou headless

Utiliser ce mode pour les sites Next.js, Nuxt, React, Vue, Svelte, les paniers internes ou les frontends découplés. Dans Findy, choisir Site custom / API, renseigner un endpoint catalogue HTTPS, puis valider avec l'équipe Findy comment les produits et le panier sont connectés.

  • Exposer un endpoint JSON stable, public côté serveur Findy mais protégé par token.
  • Retourner les champs requis: externalId, name, price, url et inStock.
  • Utiliser une pagination cursor via nextCursor et hasMore pour les catalogues volumineux.
  • Vérifier que productId et variationId correspondent aux identifiants attendus par l'API panier.
  • Définir la stratégie des variantes: ajout direct, sélecteur de variante ou redirection fiche produit.
  • Sur une SPA, initialiser Findy côté client après le montage du champ cible et éviter les doubles initialisations.

Contrat catalogue custom

L'endpoint configuré dans Findy doit répondre en application/json. Findy ajoute les paramètres limit et cursor à l'URL, sauf configuration spécifique. L'authentification utilise par défautAuthorization: Bearer VOTRE_TOKEN.

{
  "items": [
    {
      "externalId": "sku-123",
      "sku": "SKU-123",
      "name": "Chaussure de running",
      "description": "Modele leger pour entrainement quotidien",
      "price": 89.9,
      "originalPrice": 109.9,
      "currency": "EUR",
      "imageUrl": "https://boutique.example/products/sku-123.jpg",
      "categories": ["Running", "Chaussures"],
      "brand": "Acme",
      "tags": ["nouveaute", "route"],
      "inStock": true,
      "stockQuantity": 42,
      "url": "https://boutique.example/products/sku-123",
      "addToCartUrl": "https://boutique.example/cart/add?sku=sku-123",
      "variantAttributes": [
        { "name": "Taille", "slug": "taille", "values": ["40", "41"] }
      ],
      "variants": [
        {
          "id": "sku-123-40",
          "sku": "SKU-123-40",
          "name": "Taille 40",
          "price": 89.9,
          "inStock": true,
          "attributes": { "Taille": "40" }
        }
      ]
    }
  ],
  "hasMore": true,
  "nextCursor": "page-2",
  "total": 240
}

Mode sélecteur CSS

<script src="https://findysearch.com/widget-v2/findy-widget.js"></script>
<script>
  Findy.init({
    apiKey: 'VOTRE_CLE_WIDGET_FINDY',
    apiBaseUrl: 'https://findysearch.com',
    triggerSelector: '#site-search, .js-open-search'
  });
</script>

Panier custom

Le contrat catalogue synchronise les produits; onAddToCart branche l'action panier côté site marchand. Adapter data.success au format réel de l'API panier. Ne pas considérer un HTTP 200 comme une réussite si l'API peut retourner une erreur métier dans le JSON.

<script src="https://findysearch.com/widget-v2/findy-widget.js"></script>
<script>
  Findy.init({
    apiKey: 'VOTRE_CLE_WIDGET_FINDY',
    apiBaseUrl: 'https://findysearch.com',
    triggerSelector: '#site-search',
    onAddToCart: async function({
      productId,
      variationId,
      quantity,
      selectedAttributes,
      product,
      variant,
      price,
      currency,
      query,
      collectionSlug
    }) {
      var csrfToken = window.CSRF_TOKEN;
      if (!csrfToken) {
        throw new Error('Missing CSRF token');
      }

      var response = await fetch('/api/cart/add', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
          'X-CSRF-Token': csrfToken
        },
        credentials: 'include',
        body: JSON.stringify({
          productId: productId,
          variationId: variationId || null,
          quantity: quantity || 1,
          selectedAttributes: selectedAttributes || {},
          sku: variant?.sku || product?.sku || null,
          price: price || null,
          currency: currency || 'EUR',
          findyContext: {
            query: query || null,
            collectionSlug: collectionSlug || null
          }
        })
      });

      if (!response.ok) {
        return { success: false };
      }

      var data = await response.json().catch(function() {
        return {};
      });

      return { success: data.success === true };
    }
  });
</script>
  • L'API panier doit revalider côté serveur l'existence du produit et de la variante.
  • Les quantités, attributs, permissions utilisateur, stock et prix doivent être validés côté serveur.
  • La fonction doit transmettre le token CSRF, nonce ou jeton anti-fraude attendu.
  • Le site reste responsable de la mise à jour du mini-panier ou drawer panier après succès.
  • Ne jamais mettre de secrets serveur dans ce JavaScript.

Déclencher Findy manuellement

<button type="button" id="findy-open-button">Rechercher</button>

<script>
  document.getElementById('findy-open-button')?.addEventListener('click', function() {
    Findy.open();
  });
</script>

Sécurité

Sécurité, CSP et limites opérationnelles

Clé widget

La clé widget est publique et sert à identifier l'organisation. Elle ne remplace jamais une clé serveur WooCommerce, PrestaShop, CMS ou panier.

CORS et préflight

Les APIs widget acceptent les appels cross-origin nécessaires au chargement marchand. Les préflights OPTIONS sont séparés des appels fonctionnels et ne consomment pas de quota.
  • Autoriser le script Findy dans script-src, par exemple https://findysearch.com.
  • Autoriser les appels API Findy dans connect-src.
  • Charger Findy.init avec un nonce CSP, un hash CSP ou un fichier JavaScript du site déjà autorisé.
  • Prévoir style-src pour les styles injectés et fonts.googleapis.com si la police Google configurée est utilisée.
  • Prévoir font-src pour fonts.gstatic.com et img-src pour les images produits ou CDN.
  • Si une URL versionnée et un attribut integrity sont fournis, les utiliser avec crossorigin="anonymous".

Recette

Validation après installation

  • Le script findy-widget.js se charge sans erreur dans l'onglet Network.
  • La console navigateur ne contient pas d'erreur Findy is not defined.
  • La barre Findy ou le déclencheur CSS ouvre l'overlay.
  • Une recherche affiche des produits synchronisés.
  • Les filtres, les tris et la pagination ou le scroll infini fonctionnent.
  • Les images produits se chargent.
  • Le clic produit ouvre la bonne page produit.
  • L'ajout panier fonctionne quand il est activé.
  • Les variantes produits se comportent comme prévu.
  • Le mini-panier ou le compteur panier se met à jour si le thème le gère.
  • Les recherches, clics et ajouts panier remontent dans les analytics Findy après quelques minutes.
  • La consommation de requêtes correspond au scénario testé.
  • La recherche fonctionne sur mobile.
  • Les contraintes CSP sont respectées sans ajouter 'unsafe-inline' dans script-src.

Support

Dépannage rapide

SymptômeCause probableCorrection
Findy is not definedScript chargé après Findy.init ou bloquéCharger findy-widget.js avant Findy.init et vérifier la CSP.
Rien ne s'affichecontainerId absent, mauvais sélecteur ou élément monté trop tardVérifier le DOM, attendre le montage client sur SPA, tester document.querySelector(...).
Le clic ne fait rienMauvais triggerSelector ou élément remplacé par le thèmeUtiliser un sélecteur plus stable ou déclencher Findy.open manuellement.
Résultats videsCatalogue non synchronisé, filtres trop stricts ou produits masquésTester la connexion CMS, relancer une synchronisation et vérifier les règles de visibilité.
Erreur 401 widgetClé widget invalide ou révoquéeRécupérer une nouvelle clé widget Findy.
Message Plus de requêtes disponiblesQuota épuisé ou abonnement suspenduVérifier le plan, les requêtes restantes, le hors-forfait et l'état de paiement.
Facture plus élevée que prévuClics, ajouts panier ou recherches paginées générant du hors-forfaitComparer usage mensuel, overageRequestsThisPeriod et tarif pay-as-you-go du plan.
Ajout panier instableThème ou panier personnaliséUtiliser onAddToCart et valider stock, variante, prix, CSRF côté serveur.

Références utiles