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
Style
Tarifs
Usage
Source de vérité
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
| Option | Type | Rôle |
|---|---|---|
| apiKey | string, requis | Clé widget publique qui identifie l'organisation Findy. |
| containerId | string | ID du conteneur où Findy rend sa barre de recherche. |
| triggerSelector | string | Sélecteur CSS d'un champ ou bouton existant qui ouvre Findy. |
| mobileTriggerSelector | string | Sélecteur spécifique mobile si le thème utilise un DOM différent. |
| triggerMode | searchbar ou selector | Force le comportement d'ouverture souhaité. |
| apiBaseUrl | string | URL de l'instance Findy à appeler. |
| logoUrl, logoText | string | Branding optionnel si la configuration serveur ne définit pas déjà le logo. |
| popularSearches | string[] | Suggestions de secours côté client. |
| adaptive | boolean | Laisse Findy adapter le mode d'affichage selon le contexte. |
| closeOnClickOutside, closeOnEscape | boolean | Contrôle de fermeture de l'overlay. |
| onContextChange | function(context) | Callback appelé en mode adaptive quand le contexte viewport change. |
| onAddToCart | async 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églage | Valeurs | Impact |
|---|---|---|
| Template | MINIMAL, ELEGANT, BOLD, ECOMMERCE | Base visuelle du widget. |
| Couleurs | primaryColor, buttonColor, buttonTextColor, badgeColor | Couleurs principales, boutons et badges. |
| Typographie | fontFamily, titleFontSize, refFontSize | Police, taille des titres produits et références. |
| Rayon | borderRadius de 0 à 32 | Arrondi des champs, cartes et boutons. |
| Logo | logoUrl | Logo client dans l'overlay de résultats. |
| Disposition | layoutMode: grid ou slider | Affichage produits en grille ou carrousel. |
| Fenêtre | windowMode: fullscreen, compact, megamenu | Comportement de l'overlay sur desktop. |
| Volume affiché | 10, 20, 50, 100 ou scroll infini | Nombre de produits demandés par page. |
| Grille | gridColumns: auto ou 2 à 8 | Contrôle du nombre de colonnes desktop. |
| Commerce | showCartPopup, closeOnAddToCart, showQuantitySelector | Comportements liés au panier. |
Templates disponibles
Comportement mobile
Conseil de recette design
Plans
Tarifs publics et requêtes incluses
| Plan | Abonnement | Requêtes incluses / mois | Hors forfait | Usage conseillé |
|---|---|---|---|---|
| Free | 0 € | 1 000 | 0 € | Pour découvrir Findy gratuitement |
| Starter | 29 €/mois | 10 000 | 0,0050 €/requête | Idéal pour les petites boutiques qui démarrent |
| Pro | 99 €/mois | 150 000 | 0,0040 €/requête | Pour les boutiques en croissance |
| Business | 199 €/mois | 400 000 | 0,0030 €/requête | Pour les grandes boutiques à fort trafic |
Offres commerciales
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.
| Action | Consomme ? | Détail |
|---|---|---|
| Recherche produit | Oui | 1 requête par appel à /api/widget/search, y compris pagination, filtres et scroll infini. |
| Clic produit | Oui | 1 requête quand l'événement CLICK est traité et que le quota est disponible. |
| Ajout panier | Oui | 1 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 widget | Non | Charge le design et les réglages serveur. Ne décrémente pas le quota. |
| Trending, recherches populaires, catégories, collections | Non direct | Vérifie le quota pour éviter de servir le widget sans crédit, mais ne décrémente pas directement. |
| OPTIONS CORS | Non | Préflight navigateur ignoré par la facturation et par le quota fonctionnel. |
Ordre de consommation
Hors forfait
Blocage
Cas du bouton panier
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| Plan | Scénario | Calcul |
|---|---|---|
| Free | 1 200 interactions facturables | Les 1 000 premières passent, puis le widget est bloqué. Pas de hors-forfait. |
| Starter | 12 500 interactions facturables | 29 € + 2 500 x 0,0050 € = 41,50 €. |
| Pro | 180 000 interactions facturables | 99 € + 30 000 x 0,0040 € = 219 €. |
| Business | 450 000 interactions facturables | 199 € + 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.
| Bloc | Permissions | Note |
|---|---|---|
| Catalogue | products, categories, images, stock_availables | Base minimale pour indexer les produits. |
| Fonctionnalités | specific_prices, product_features, product_feature_values, tags | Prix spécifiques, filtres et enrichissement. |
| Option ventes | order_details | Uniquement si le client accepte explicitement cet accès. |
- Ne pas accorder de droits d'écriture.
- Ne pas activer
orders,customersou 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
CORS et préflight
- 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ôme | Cause probable | Correction |
|---|---|---|
| Findy is not defined | Script chargé après Findy.init ou bloqué | Charger findy-widget.js avant Findy.init et vérifier la CSP. |
| Rien ne s'affiche | containerId absent, mauvais sélecteur ou élément monté trop tard | Vérifier le DOM, attendre le montage client sur SPA, tester document.querySelector(...). |
| Le clic ne fait rien | Mauvais triggerSelector ou élément remplacé par le thème | Utiliser un sélecteur plus stable ou déclencher Findy.open manuellement. |
| Résultats vides | Catalogue non synchronisé, filtres trop stricts ou produits masqués | Tester la connexion CMS, relancer une synchronisation et vérifier les règles de visibilité. |
| Erreur 401 widget | Clé widget invalide ou révoquée | Récupérer une nouvelle clé widget Findy. |
| Message Plus de requêtes disponibles | Quota épuisé ou abonnement suspendu | Vérifier le plan, les requêtes restantes, le hors-forfait et l'état de paiement. |
| Facture plus élevée que prévu | Clics, ajouts panier ou recherches paginées générant du hors-forfait | Comparer usage mensuel, overageRequestsThisPeriod et tarif pay-as-you-go du plan. |
| Ajout panier instable | Thème ou panier personnalisé | Utiliser onAddToCart et valider stock, variante, prix, CSRF côté serveur. |