feat: passer Kankwa en gratuit sans limite visible — cacher le premium
Some checks are pending
quality / backend (push) Waiting to run
quality / frontend (push) Waiting to run
quality / real-e2e (push) Waiting to run

- Retirer toutes les mentions de prix (1,99 €/19,99 €), de Kankwa+ et
  de la limite à 3 outils dans les FAQ et comparatifs des landing pages (FR + EN)
- Masquer la section Abonnement dans Account.tsx pour les utilisateurs
  non-premium (reste visible pour les abonnés existants)
- Supprimer le lien "Passer à Kankwa+" dans CreateBringModal,
  CreateKountModal et TemplateStarterPanel quand la limite est atteinte

Infrastructure Stripe et logique premium conservées intactes pour
réintroduction future.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Gautier Stefanini 2026-08-16 10:02:52 +00:00
parent 626e510767
commit 4ec45b71ce
6 changed files with 18 additions and 29 deletions

View file

@ -75,7 +75,7 @@
},
{
"q": "Is it free?",
"a": "Yes for most birthdays. The free plan allows three active tools at once, and the page that brings them together is never counted. Kankwa+ removes the limit for €1.99 a month or €19.99 a year; there are no ads either way."
"a": "Yes. Creating and sharing the page is free, with no ads for you or your guests."
}
],
"final_title": "Start the party, not the logistics.",
@ -376,7 +376,7 @@
},
{
"q": "Is it free for a parents' association?",
"a": "Creating an item list and sharing it is free, with no ads for participants and no commission. The Premium subscription only becomes useful if you keep more than three tools active at the same time."
"a": "Yes. Creating an item list and sharing it is free, with no ads for participants and no commission."
}
],
"final_title": "The whole school party fits in one link.",
@ -481,7 +481,7 @@
"faq": [
{
"q": "Is the poll really free?",
"a": "Yes. Creating a date poll and sharing it costs nothing, and your participants are shown no ads. The free plan lets you keep three tools active at once; beyond that, Kankwa+ costs €1.99 a month."
"a": "Yes. Creating a date poll and sharing it costs nothing, and your participants are shown no ads."
},
{
"q": "What is the \"if need be\" answer for?",
@ -609,7 +609,7 @@
},
{
"q": "Do I have to pay to create a list?",
"a": "No. Creating and sharing a list is free, with no ads for guests. The free plan allows three active tools at once; Kankwa+ removes that limit for €1.99 a month."
"a": "No. Creating and sharing a list is free, with no ads for guests."
}
],
"final_title": "One list, and nobody asks what to bring again.",
@ -740,7 +740,7 @@
},
{
"criterion": "Hosting and business model",
"kankwa": "Hosted in Europe, with no ads and no data resale; optional subscription at €1.99 a month or €19.99 a year.",
"kankwa": "Hosted in Europe, free to use, with no ads and no data resale.",
"other": "Swiss company, ad-funded free tier and paid per-user subscriptions."
}
]
@ -833,7 +833,7 @@
},
{
"criterion": "Hosting and business model",
"kankwa": "Hosted in Europe, with no data resale; optional subscription at €1.99 a month or €19.99 a year.",
"kankwa": "Hosted in Europe, free to use, with no data resale.",
"other": "Splitwise offers a paid individual subscription; Tricount belongs to the banking group Bunq."
}
]

View file

@ -75,7 +75,7 @@
},
{
"q": "Est-ce que cest gratuit ?",
"a": "Oui pour la majorité des anniversaires. Le plan gratuit autorise trois outils actifs en même temps, et la page qui les rassemble nest jamais décomptée. Kankwa+ lève la limite pour 1,99 € par mois ou 19,99 € par an ; il ny a aucune publicité, dans les deux cas."
"a": "Oui. Créer et partager la page ne coûte rien, sans publicité pour vous ni pour vos invités."
}
],
"final_title": "Lancez lanniversaire, pas la logistique.",
@ -376,7 +376,7 @@
},
{
"q": "Est-ce gratuit pour une association de parents d'élèves ?",
"a": "Créer une liste d'apports et la partager est gratuit, sans publicité pour les participants et sans commission. L'abonnement Premium ne devient utile que si vous gardez plus de trois outils actifs en même temps."
"a": "Oui. Créer une liste d'apports et la partager est gratuit, sans publicité pour les participants et sans commission."
}
],
"final_title": "La fête d'école tient dans un seul lien.",
@ -481,7 +481,7 @@
"faq": [
{
"q": "Le sondage est-il vraiment gratuit ?",
"a": "Oui. Créer un sondage de dates et le partager ne coûte rien, sans publicité affichée à vos participants. Le plan gratuit permet de garder trois outils actifs simultanément ; au-delà, Kankwa+ coûte 1,99 € par mois."
"a": "Oui. Créer un sondage de dates et le partager ne coûte rien, sans publicité affichée à vos participants."
},
{
"q": "À quoi sert la réponse « si nécessaire » ?",
@ -609,7 +609,7 @@
},
{
"q": "Faut-il payer pour créer une liste ?",
"a": "Non. La création et le partage dune liste sont gratuits, sans publicité pour les invités. Le plan gratuit autorise trois outils actifs en même temps ; Kankwa+ lève cette limite pour 1,99 € par mois."
"a": "Non. La création et le partage dune liste sont gratuits, sans publicité pour les invités."
}
],
"final_title": "Une liste, et plus personne ne demande quoi apporter.",
@ -740,7 +740,7 @@
},
{
"criterion": "Hébergement et modèle",
"kankwa": "Hébergé en Europe, sans publicité ni revente de données ; abonnement facultatif à 1,99 € par mois ou 19,99 € par an.",
"kankwa": "Hébergé en Europe, gratuit, sans publicité ni revente de données.",
"other": "Éditeur suisse, offre gratuite financée par la publicité et abonnements payants par utilisateur."
}
]
@ -833,7 +833,7 @@
},
{
"criterion": "Hébergement et modèle",
"kankwa": "Hébergé en Europe, sans revente de données ; abonnement facultatif à 1,99 € par mois ou 19,99 € par an.",
"kankwa": "Hébergé en Europe, gratuit, sans revente de données.",
"other": "Splitwise propose un abonnement individuel payant ; Tricount appartient au groupe bancaire Bunq."
}
]

View file

@ -1,6 +1,5 @@
import { useEffect, useState } from 'react'
import { useTranslation } from 'react-i18next'
import { Link } from 'react-router-dom'
import { createHubModules, type EventDetail } from '@services/hub/api/hub'
import { getUsage } from '@shared/api/auth'
import { Alert, ServiceIcon, ServiceThemeScope } from '@shared/components'
@ -111,8 +110,7 @@ export default function TemplateStarterPanel({ event, template, onCreated }: Pro
<p className="alert-warning mt-3">
{remaining === 0
? tc('premium.limit_reached')
: t('onboarding.template_batch_capacity', { count: remaining })}{' '}
<Link to="/compte" className="link">{tc('premium.upgrade')}</Link>
: t('onboarding.template_batch_capacity', { count: remaining })}
</p>
)}

View file

@ -1,5 +1,5 @@
import { useState } from 'react'
import { Link, useNavigate } from 'react-router-dom'
import { useNavigate } from 'react-router-dom'
import { useTranslation } from 'react-i18next'
import { createList } from '@services/kontrib/api/kontrib'
import { Alert, Modal } from '@shared/components'
@ -50,12 +50,7 @@ export default function CreateBringModal({ onClose, eventId }: { onClose: () =>
<form onSubmit={handleSubmit} className="flex flex-col gap-3">
<Alert type="error" message={error} />
{limitReached && (
<p className="alert-warning">
{limitReached}{' '}
<Link to="/compte" onClick={onClose} className="underline font-medium hover:text-warning-800">
{tc('premium.upgrade')}
</Link>
</p>
<p className="alert-warning">{limitReached}</p>
)}
<input className="input" placeholder={t('create_modal.name_placeholder')} value={title} onChange={e => setTitle(e.target.value)} required autoFocus />
<textarea className="input" rows={2} placeholder={t('create_modal.desc_placeholder')} value={description} onChange={e => setDescription(e.target.value)} />

View file

@ -1,5 +1,5 @@
import { useState } from 'react'
import { Link, useNavigate } from 'react-router-dom'
import { useNavigate } from 'react-router-dom'
import { useTranslation } from 'react-i18next'
import { createGroup } from '@services/kount/api/kount'
import { Alert, CurrencyInput, Modal } from '@shared/components'
@ -50,12 +50,7 @@ export default function CreateKountModal({ onClose, eventId }: { onClose: () =>
<form onSubmit={handleSubmit} className="flex flex-col gap-3">
<Alert type="error" message={error} />
{limitReached && (
<p className="alert-warning">
{limitReached}{' '}
<Link to="/compte" onClick={onClose} className="underline underline-offset-2 font-medium">
{tc('premium.upgrade')}
</Link>
</p>
<p className="alert-warning">{limitReached}</p>
)}
<input
className="input"

View file

@ -229,6 +229,7 @@ function AbonnementSection() {
const [loading, setLoading] = useState<'portal' | null>(null)
const [error, setError] = useState('')
if (!user) return null
if (!user.is_premium) return null
const periodDate = user.premium_until
? formatDate(user.premium_until, 'long')