Galeries sport : multi-destinataires, vente par section, panier invité et protection anti-fuite
Une feature pensée par et pour les photographes de sport, mais utile à tout reportage à plusieurs destinataires. Un match, plusieurs liens individualisés (club, joueuses, agences, presse), chacun avec sa propre cession de droits. Vente de photos par section avec prix unitaires, panier d'achat directement depuis le lien invité avec paiement Stripe + livraison par email 30j. Protection renforcée des photos en vente : filigrane gravé dans le fichier et surcouche diagonale anti-screenshot.
Points clés
- Nouveau type de galerie « Sport / multi-destinataires » avec 5 sections suggérées (Match, Portraits joueuses, Coulisses, Sponsors, Presse) et apparence Space Grotesk + thème dark adaptée
- Multi-destinataires : un lien individualisé par destinataire (joueuse / club / agence / presse / sponsor), avec mot de passe optionnel, expiration optionnelle, sections autorisées et droit de téléchargement configurables par destinataire
- Cessions de droits par destinataire : 3 templates pré-rédigés conformes art. L.131-3 CPI (personnel 1 an, commercial 2 ans, presse 1 an), PDF généré automatiquement et envoyé en pièce jointe de l'email d'invitation
- Vente par section : chaque section peut être marquée payante avec son propre prix unitaire par photo (override du prix global galerie). Toggle « Activer la vente » clair côté admin, le clic sur l'icône section payante active automatiquement la vente galerie pour la cohérence
- Panier invité depuis le lien public : sélection multi-photos sur les vignettes ou directement dans le lightbox, barre flottante avec total recalculé, paiement Stripe Checkout avec collecte email native, sans création de compte
- Page de succès post-paiement avec ZIP groupé + téléchargements individuels, lien valide 30 jours. Email de confirmation Resend envoyé immédiatement après webhook avec le même lien de récupération
- Protection anti-fuite des photos en vente : filigrane logo ou texte gravé dans le fichier par Sharp dès l'upload + surcouche CSS « Aperçu protégé » diagonale tracée en SVG, clic-droit / drag / sélection bloqués, dans la grille comme dans le lightbox
- Suivi centralisé : tracking des vues / téléchargements / achats depuis l'espace authentifié, le lien invité et les liens recipient dans un tableau unique. Dashboard galeries enrichi d'une stat dédiée « Ventes lien invité » et badges « Lien invité » sur les events
- UX photographe : bouton « + Ajouter » sur chaque en-tête de section pour uploader directement dedans, titre de galerie renommable d'un clic, filtre par section visible côté client invité, prix par photo éditable via modal in-app
- Cron quotidien de relance des destinataires : si J+3 après envoi sans accès, email automatique configurable par destinataire
- Cron RGPD : anonymisation après 12 mois des user_agent et metadata des events de partage galerie
Les photographes de sport partagent souvent un même problème : un match génère des centaines de photos qu'il faut distribuer à plusieurs destinataires distincts — le club, les joueuses individuellement, les agences, la presse, parfois les sponsors. Chacun a ses droits, ses photos autorisées, ses délais. Jusqu'ici, ça voulait dire monter 5 galeries séparées, recopier les photos en doublon, signer 5 cessions à la main, courir derrière les paiements.
Cette release règle ça en profondeur — et déborde sur tous les reportages multi-destinataires (mariages avec familles, événements corporate avec invités externes, presse événementielle).
Un nouveau type de galerie
À la création, un troisième choix s'ajoute à « Livraison classique » et « Pré-sélection » : « Sport / multi-destinataires ».
Le preset applique automatiquement :
- 5 sections suggérées : Match, Portraits joueuses, Coulisses, Sponsors, Presse
- Apparence : layout grille (uniforme pour le sport), typographie Space Grotesk moderne, thème dark, cover en bannière
- Pas de lien public anonyme par défaut — on préfère les liens individualisés par destinataire
Tu peux bien sûr tout customiser ensuite, mais le wizard te fait gagner 5 minutes au démarrage et te met sur les bons rails.
Multi-destinataires : un lien, un destinataire, une cession
C'est le cœur de la release. Depuis la page galerie, un nouveau panneau « Destinataires » permet d'ajouter autant de personnes que nécessaire :
- Identité : nom + email (email optionnel — les photographes n'ont pas toujours le mail de toutes les joueuses)
- Rôle : joueuse, club, agence, presse, sponsor, collaborateur, autre
- Sections autorisées : sélectionne quelles sections cette personne voit (ex. la joueuse Emma voit Match + Portraits joueuses uniquement, le club voit tout, la presse voit Match + Presse)
- Mot de passe optionnel : code à 4-6 caractères demandé à l'ouverture
- Expiration optionnelle : date limite d'accès
- Téléchargement : autorisé ou non pour ce destinataire
- Relance auto : email J+3 si pas encore consulté
Chaque destinataire reçoit un lien unique de type `helpho.io/g/
Cessions de droits intégrées (CPI art. L.131-3)
Pour chaque destinataire, tu choisis un template de cession parmi 3 :
- Personnel : usage privé, web/social, monde, 1 an, sans exclusivité — pour les joueuses
- Commercial : reproduction + représentation, web/social/print/pub/interne, France, 2 ans — pour les clubs et agences
- Presse : éditorial uniquement (presse + web), monde, 1 an, crédit photographique obligatoire — pour la presse et les agences photo
Ou « Personnaliser » pour ajuster étendue, destination, territoire, durée, exclusivité et notes manuellement.
Le PDF de cession est généré automatiquement et envoyé en pièce jointe de l'email d'invitation avec le lien d'accès. Conformité légale au cordeau, zéro effort pour le photographe.
Vente de photos par section, à l'unité
Avant, la vente de photos passait par un prix unique galerie. Trop rigide quand tu vends les photos du match à 30 € mais les portraits posés à 20 €.
Maintenant chaque section peut avoir son propre prix unitaire par photo. Toggle « Section payante » sur la section → badge prix éditable d'un clic via modal in-app → le prix s'applique uniquement à cette section. Le prix global galerie reste utilisable comme fallback.
Côté admin, un toggle clair « Activer la vente de photos à l'unité » dans les paramètres galerie sert de porte d'entrée. Et un cas confort : si tu cliques directement sur l'icône « section payante » sur une section, la vente est automatiquement activée au niveau galerie — pas besoin de jongler entre deux écrans.
Panier invité avec checkout Stripe
C'est nouveau et c'était attendu : les invités peuvent désormais acheter des photos directement depuis le lien public, sans avoir à se connecter à un espace client.
Le flux complet :
1. L'invité ajoute des photos au panier depuis la grille ou directement dans le lightbox (bouton « + 30 € » au survol)
2. Une barre flottante en bas affiche le total recalculé en temps réel
3. Clic sur « Acheter » → redirection vers Stripe Checkout avec collecte email native
4. Paiement validé → page de succès avec ZIP de toutes les photos achetées + liens individuels
5. Email de confirmation Resend envoyé immédiatement après webhook avec le même lien de récupération, valide 30 jours
6. La commission Helpho de 5 % est appliquée automatiquement via Stripe Connect (`application_fee_amount`) — tu touches 95 % du montant
Côté DB, les achats invité sont stockés dans `photo_purchases` avec `client_id = null` et un `guest_download_token` unique qui sert d'autorisation pour le téléchargement post-paiement. Le tout est intégré dans les stats dashboard.
Protection des photos en vente
Une demande forte des photographes de sport : éviter que les invités fassent des captures d'écran pour récupérer les photos sans payer.
Soyons honnêtes — bloquer 100 % des captures d'écran sur le web est impossible (l'OS peut toujours capturer ce qui est affiché). Mais on peut rendre ces captures inexploitables :
1. Filigrane gravé dans le fichier : dès l'upload, Sharp génère une variante `watermarked_url` avec un logo ou un texte (nom de l'entreprise du photographe) en motif diagonal tuilé à 30 % d'opacité. C'est cette variante qui est servie aux invités. La photo originale ne quitte jamais le storage côté invité.
2. Surcouche CSS « Aperçu protégé » : par-dessus le fichier filigrané, une surcouche SVG répétée en diagonale ajoute le texte « Aperçu protégé » en blanc avec stroke noir, sur toute la surface de la photo et dans le lightbox. Le pattern est dense (tuile 220×110px) et toujours complet (pas de coupure aux jonctions).
3. Clic-droit, drag et sélection bloqués sur les photos en vente, dans la grille comme dans le lightbox.
4. Bouton de téléchargement caché sur les photos en vente côté invité, et le bandeau d'accueil indique clairement que ces photos sont accessibles via achat.
Une fois la photo achetée, le téléchargement sert la version originale non-filigranée via le `guest_download_token`.
Dashboard et tracking unifié
Toutes les actions des invités sont désormais tracées dans `gallery_events`, peu importe la source :
- Vues depuis l'espace authentifié → `metadata.source` absent (legacy = client)
- Vues depuis un lien invité public → `metadata.source = "guest_link"`
- Vues depuis un lien recipient → `metadata.source = "recipient_link"`
Le dashboard galeries compte tout d'un coup, et l'activité récente affiche désormais l'email de l'invité + un badge « Lien invité » coral pour distinguer les achats depuis un lien public des achats clients. Nouvelle carte de stats « Ventes lien invité » isolant le CA de cette source.
Petits plus UX au passage
- Renommer une galerie d'un clic : titre éditable directement depuis l'en-tête (clic dessus = input inline)
- Bouton « + Ajouter » sur chaque section : upload de photos directement dans la section, sans passer par le dropdown global
- Filtre par section côté client invité : barre de boutons « Toutes / Section A / Section B » identique au portail authentifié
- Format natif respecté dans les grilles : portraits 2:3 affichés en portrait, paysages 3:2 en paysage, fini les ratios déformés par flex-grow
- Layout masonry corrigé côté client : les ratios natifs des photos sont respectés pour une vraie composition Pinterest / Google Photos
- Modal in-app pour le prix par section : remplace l'ancien `window.prompt` natif par un modal cohérent avec le design Helpho
Crons RGPD
- Relance destinataires (quotidien, 9h30 UTC) : si un destinataire n'a pas accédé au lien dans les 3 jours suivant l'envoi de l'invitation, un email de relance est automatiquement envoyé (option activable par destinataire)
- Anonymisation des events de partage (quotidien) : après 12 mois, les `user_agent` et `metadata` des `gallery_share_events` sont anonymisés pour respecter le délai légal RGPD
Disponibilité
Toutes ces fonctionnalités sont incluses dans le plan Pro à 8,99 €/mois. La commission Helpho sur les ventes de photos reste à 5 % (Stripe Connect destination charges), tu touches 95 % du montant payé par le client / invité.
Pour qui c'est utile
- Photographes de sport (l'usage pour lequel on a designé la feature) : 1 match = N destinataires = N liens = N cessions, tout en gardant les photos centralisées sur une seule galerie
- Photographes mariage : 1 mariage = mariés + témoins + familles éloignées, chacun voit ses sections, chacun a son tirage à acheter
- Photographes corporate : 1 événement = organisateur + presse + sponsors + collaborateurs, gestion fine des droits par destinataire
- Photographes de portrait pro : vente directe via lien partageable, sans passer par la création d'un compte client
Merci aux photographes beta qui ont testé cette refonte. Les prochains chantiers sont déjà sur la table : passage du bucket Storage en privé avec signed URLs pour blinder davantage la protection des photos en vente, et stats par destinataire dans le dashboard.
L'équipe Helpho
18 mai 2026
Envie de tester ?
Essayez toutes ces fonctionnalités gratuitement pendant 14 jours.
Essai gratuit 14 jours