fix(subscriptions): free-niva 5 AI-skanningar (beslut Johan)

Free 10->5 i kod, test, paywall-copy (12 sprak) och docs. Full trappa: free 5 / trial 14d 25 skann / premium 100/200/400.
This commit is contained in:
Claude
2026-08-17 17:34:55 +00:00
parent 97c913a25c
commit 75591bb294
19 changed files with 24 additions and 24 deletions
+1 -1
View File
@@ -210,7 +210,7 @@
"paywall.choose": "Vælg", "paywall.choose": "Vælg",
"paywall.fairUse": "Fair use-kvote for AI-scanninger inkluderet.", "paywall.fairUse": "Fair use-kvote for AI-scanninger inkluderet.",
"paywall.family": "Family · op til 6 personer", "paywall.family": "Family · op til 6 personer",
"paywall.freeNote": "Gratis: 10 AI-scanninger/md., manuelt lager, gemte opskrifter og enkel registrering.", "paywall.freeNote": "Gratis: 5 AI-scanninger/md., manuelt lager, gemte opskrifter og enkel registrering.",
"paywall.household": "Household · op til 3 personer", "paywall.household": "Household · op til 3 personer",
"paywall.large": "Large Household · op til 12 personer", "paywall.large": "Large Household · op til 12 personer",
"paywall.perMonth": "{price}/md.", "paywall.perMonth": "{price}/md.",
+1 -1
View File
@@ -210,7 +210,7 @@
"paywall.choose": "Wählen", "paywall.choose": "Wählen",
"paywall.fairUse": "Fair-Use-Kontingent für KI-Scans inklusive.", "paywall.fairUse": "Fair-Use-Kontingent für KI-Scans inklusive.",
"paywall.family": "Family · bis zu 6 Personen", "paywall.family": "Family · bis zu 6 Personen",
"paywall.freeNote": "Gratis: 10 KI-Scans/Monat, manueller Vorrat, gespeicherte Rezepte und einfaches Tracking.", "paywall.freeNote": "Gratis: 5 KI-Scans/Monat, manueller Vorrat, gespeicherte Rezepte und einfaches Tracking.",
"paywall.household": "Household · bis zu 3 Personen", "paywall.household": "Household · bis zu 3 Personen",
"paywall.large": "Large Household · bis zu 12 Personen", "paywall.large": "Large Household · bis zu 12 Personen",
"paywall.perMonth": "{price}/Monat", "paywall.perMonth": "{price}/Monat",
+1 -1
View File
@@ -210,7 +210,7 @@
"paywall.choose": "Choose", "paywall.choose": "Choose",
"paywall.fairUse": "Fair-use quota for AI scans included.", "paywall.fairUse": "Fair-use quota for AI scans included.",
"paywall.family": "Family · up to 6 people", "paywall.family": "Family · up to 6 people",
"paywall.freeNote": "Free: 10 AI scans/month, manual inventory, saved recipes and simple logging.", "paywall.freeNote": "Free: 5 AI scans/month, manual inventory, saved recipes and simple logging.",
"paywall.household": "Household · up to 3 people", "paywall.household": "Household · up to 3 people",
"paywall.large": "Large Household · up to 12 people", "paywall.large": "Large Household · up to 12 people",
"paywall.perMonth": "{price}/month", "paywall.perMonth": "{price}/month",
+1 -1
View File
@@ -210,7 +210,7 @@
"paywall.choose": "Elegir", "paywall.choose": "Elegir",
"paywall.fairUse": "Cuota de uso razonable de escaneos de IA incluida.", "paywall.fairUse": "Cuota de uso razonable de escaneos de IA incluida.",
"paywall.family": "Family · hasta 6 personas", "paywall.family": "Family · hasta 6 personas",
"paywall.freeNote": "Gratis: 10 escaneos de IA/mes, inventario manual, recetas guardadas y registro sencillo.", "paywall.freeNote": "Gratis: 5 escaneos de IA/mes, inventario manual, recetas guardadas y registro sencillo.",
"paywall.household": "Household · hasta 3 personas", "paywall.household": "Household · hasta 3 personas",
"paywall.large": "Large Household · hasta 12 personas", "paywall.large": "Large Household · hasta 12 personas",
"paywall.perMonth": "{price}/mes", "paywall.perMonth": "{price}/mes",
+1 -1
View File
@@ -210,7 +210,7 @@
"paywall.choose": "Valitse", "paywall.choose": "Valitse",
"paywall.fairUse": "Kohtuukäytön AI-skannauskiintiö sisältyy.", "paywall.fairUse": "Kohtuukäytön AI-skannauskiintiö sisältyy.",
"paywall.family": "Family · enintään 6 henkilöä", "paywall.family": "Family · enintään 6 henkilöä",
"paywall.freeNote": "Ilmainen: 10 AI-skannausta/kk, manuaalinen varasto, tallennetut reseptit ja helppo kirjaus.", "paywall.freeNote": "Ilmainen: 5 AI-skannausta/kk, manuaalinen varasto, tallennetut reseptit ja helppo kirjaus.",
"paywall.household": "Household · enintään 3 henkilöä", "paywall.household": "Household · enintään 3 henkilöä",
"paywall.large": "Large Household · enintään 12 henkilöä", "paywall.large": "Large Household · enintään 12 henkilöä",
"paywall.perMonth": "{price}/kk", "paywall.perMonth": "{price}/kk",
+1 -1
View File
@@ -210,7 +210,7 @@
"paywall.choose": "Choisir", "paywall.choose": "Choisir",
"paywall.fairUse": "Quota d'usage raisonnable de scans IA inclus.", "paywall.fairUse": "Quota d'usage raisonnable de scans IA inclus.",
"paywall.family": "Family · jusqu'à 6 personnes", "paywall.family": "Family · jusqu'à 6 personnes",
"paywall.freeNote": "Gratuit : 10 scans IA/mois, stock manuel, recettes enregistrées et suivi simple.", "paywall.freeNote": "Gratuit : 5 scans IA/mois, stock manuel, recettes enregistrées et suivi simple.",
"paywall.household": "Household · jusqu'à 3 personnes", "paywall.household": "Household · jusqu'à 3 personnes",
"paywall.large": "Large Household · jusqu'à 12 personnes", "paywall.large": "Large Household · jusqu'à 12 personnes",
"paywall.perMonth": "{price}/mois", "paywall.perMonth": "{price}/mois",
+1 -1
View File
@@ -210,7 +210,7 @@
"paywall.choose": "Scegli", "paywall.choose": "Scegli",
"paywall.fairUse": "Quota fair use di scansioni IA inclusa.", "paywall.fairUse": "Quota fair use di scansioni IA inclusa.",
"paywall.family": "Family · fino a 6 persone", "paywall.family": "Family · fino a 6 persone",
"paywall.freeNote": "Gratis: 10 scansioni IA/mese, dispensa manuale, ricette salvate e registrazione semplice.", "paywall.freeNote": "Gratis: 5 scansioni IA/mese, dispensa manuale, ricette salvate e registrazione semplice.",
"paywall.household": "Household · fino a 3 persone", "paywall.household": "Household · fino a 3 persone",
"paywall.large": "Large Household · fino a 12 persone", "paywall.large": "Large Household · fino a 12 persone",
"paywall.perMonth": "{price}/mese", "paywall.perMonth": "{price}/mese",
+1 -1
View File
@@ -210,7 +210,7 @@
"paywall.choose": "Velg", "paywall.choose": "Velg",
"paywall.fairUse": "Fair use-kvote for AI-skanninger inkludert.", "paywall.fairUse": "Fair use-kvote for AI-skanninger inkludert.",
"paywall.family": "Family · opptil 6 personer", "paywall.family": "Family · opptil 6 personer",
"paywall.freeNote": "Gratis: 10 AI-skanninger/mnd., manuelt lager, lagrede oppskrifter og enkel loggføring.", "paywall.freeNote": "Gratis: 5 AI-skanninger/mnd., manuelt lager, lagrede oppskrifter og enkel loggføring.",
"paywall.household": "Household · opptil 3 personer", "paywall.household": "Household · opptil 3 personer",
"paywall.large": "Large Household · opptil 12 personer", "paywall.large": "Large Household · opptil 12 personer",
"paywall.perMonth": "{price}/mnd.", "paywall.perMonth": "{price}/mnd.",
+1 -1
View File
@@ -210,7 +210,7 @@
"paywall.choose": "Kies", "paywall.choose": "Kies",
"paywall.fairUse": "Fair-use quotum voor AI-scans inbegrepen.", "paywall.fairUse": "Fair-use quotum voor AI-scans inbegrepen.",
"paywall.family": "Family · tot 6 personen", "paywall.family": "Family · tot 6 personen",
"paywall.freeNote": "Gratis: 10 AI-scans/maand, handmatige voorraad, opgeslagen recepten en eenvoudig registreren.", "paywall.freeNote": "Gratis: 5 AI-scans/maand, handmatige voorraad, opgeslagen recepten en eenvoudig registreren.",
"paywall.household": "Household · tot 3 personen", "paywall.household": "Household · tot 3 personen",
"paywall.large": "Large Household · tot 12 personen", "paywall.large": "Large Household · tot 12 personen",
"paywall.perMonth": "{price}/maand", "paywall.perMonth": "{price}/maand",
+1 -1
View File
@@ -216,7 +216,7 @@
"paywall.choose": "Wybierz", "paywall.choose": "Wybierz",
"paywall.fairUse": "Limit fair use skanów AI w cenie.", "paywall.fairUse": "Limit fair use skanów AI w cenie.",
"paywall.family": "Family · do 6 osób", "paywall.family": "Family · do 6 osób",
"paywall.freeNote": "Za darmo: 10 skanów AI/mies., ręczna spiżarnia, zapisane przepisy i proste rejestrowanie.", "paywall.freeNote": "Za darmo: 5 skanów AI/mies., ręczna spiżarnia, zapisane przepisy i proste rejestrowanie.",
"paywall.household": "Household · do 3 osób", "paywall.household": "Household · do 3 osób",
"paywall.large": "Large Household · do 12 osób", "paywall.large": "Large Household · do 12 osób",
"paywall.perMonth": "{price}/mies.", "paywall.perMonth": "{price}/mies.",
+1 -1
View File
@@ -210,7 +210,7 @@
"paywall.choose": "Escolher", "paywall.choose": "Escolher",
"paywall.fairUse": "Quota de utilização justa de análises de IA incluída.", "paywall.fairUse": "Quota de utilização justa de análises de IA incluída.",
"paywall.family": "Family · até 6 pessoas", "paywall.family": "Family · até 6 pessoas",
"paywall.freeNote": "Grátis: 10 análises de IA/mês, despensa manual, receitas guardadas e registo simples.", "paywall.freeNote": "Grátis: 5 análises de IA/mês, despensa manual, receitas guardadas e registo simples.",
"paywall.household": "Household · até 3 pessoas", "paywall.household": "Household · até 3 pessoas",
"paywall.large": "Large Household · até 12 pessoas", "paywall.large": "Large Household · até 12 pessoas",
"paywall.perMonth": "{price}/mês", "paywall.perMonth": "{price}/mês",
+1 -1
View File
@@ -218,7 +218,7 @@
"paywall.choose": "Välj", "paywall.choose": "Välj",
"paywall.fairUse": "Fair use-kvot för AI-skanningar ingår.", "paywall.fairUse": "Fair use-kvot för AI-skanningar ingår.",
"paywall.family": "Family · upp till 6 personer", "paywall.family": "Family · upp till 6 personer",
"paywall.freeNote": "Gratis: 10 AI-skanningar/mån, manuellt lager, sparade recept och enkel loggning.", "paywall.freeNote": "Gratis: 5 AI-skanningar/mån, manuellt lager, sparade recept och enkel loggning.",
"paywall.household": "Household · upp till 3 personer", "paywall.household": "Household · upp till 3 personer",
"paywall.large": "Large Household · upp till 12 personer", "paywall.large": "Large Household · upp till 12 personer",
"paywall.perMonth": "{price}/mån", "paywall.perMonth": "{price}/mån",
+1 -1
View File
@@ -47,7 +47,7 @@ och tolkar men hittar aldrig på vilket gör produkten trovärdig nog för a
Prenumeration via App Store/Google Play: **Household 79 kr**, **Family 129 kr**, Prenumeration via App Store/Google Play: **Household 79 kr**, **Family 129 kr**,
**Large Household 169 kr** per månad, 14 dagars fri provperiod utan kort, användbar **Large Household 169 kr** per månad, 14 dagars fri provperiod utan kort, användbar
gratisnivå (10 AI-skanningar/mån) som behåller användare i tratten. gratisnivå (5 AI-skanningar/mån) som behåller användare i tratten.
Ett genomsnittligt svenskt barnhushåll slänger mat för tusenlappar per år och lägger Ett genomsnittligt svenskt barnhushåll slänger mat för tusenlappar per år och lägger
10 000+ kr/månad på mat en app som synligt sänker svinnet och svarar på vardagens 10 000+ kr/månad på mat en app som synligt sänker svinnet och svarar på vardagens
+1 -1
View File
@@ -49,7 +49,7 @@ systemet är medvetet flaggat AV vid lansering det är rätt beslut och ska
värden: tid (planering + "vad ska vi äta?" löst), pengar (svinnvärde i kronor visas i värden: tid (planering + "vad ska vi äta?" löst), pengar (svinnvärde i kronor visas i
appen "du har räddat mat för 214 kr i månaden") och hälsa (mål utan loggningsjobb). appen "du har räddat mat för 214 kr i månaden") och hälsa (mål utan loggningsjobb).
Kritisk sanning: gratisnivån måste vara bra nog att bygga vanan men inte så bra att Kritisk sanning: gratisnivån måste vara bra nog att bygga vanan men inte så bra att
uppgraderingen känns onödig 10 AI-skanningar/mån + manuellt lager + full receptbank är uppgraderingen känns onödig 5 AI-skanningar/mån + manuellt lager + full receptbank är
den balansen. Priset testas i beta med prisexperiment innan låsning. den balansen. Priset testas i beta med prisexperiment innan låsning.
## Retention ## Retention
+2 -2
View File
@@ -39,12 +39,12 @@ växelkurs 10,50 SEK/USD (A4).
| Profil | Antagande om användning | AI-kostnad/mån | | Profil | Antagande om användning | AI-kostnad/mån |
| --------------------------- | ----------------------------------------- | ----------------------------------------------- | | --------------------------- | ----------------------------------------- | ----------------------------------------------- |
| Gratis | 10 skanningar (kvottak) | $0,10 ≈ 1,1 kr | | Gratis | 5 skanningar (kvottak) | $0,10 ≈ 1,1 kr |
| Household (aktivt) | 60 skanningar + 4 planer + nattligt minne | $0,76 ≈ 8 kr | | Household (aktivt) | 60 skanningar + 4 planer + nattligt minne | $0,76 ≈ 8 kr |
| Family (aktivt) | 100 skanningar + 4 planer + minne | $1,17 ≈ 12 kr | | Family (aktivt) | 100 skanningar + 4 planer + minne | $1,17 ≈ 12 kr |
| Family (maxar fair use 600) | värsta fallet | $6,66 ≈ 70 kr — fortfarande under 129 kr-priset | | Family (maxar fair use 600) | värsta fallet | $6,66 ≈ 70 kr — fortfarande under 129 kr-priset |
Fair use-taken (100/200/400, gratis 10) gör att ingen enskild användare kan bli Fair use-taken (100/200/400, gratis 5) gör att ingen enskild användare kan bli
förlustaffär ens i värsta fallet. förlustaffär ens i värsta fallet.
## Total kostnad per skala ## Total kostnad per skala
+1 -1
View File
@@ -1,7 +1,7 @@
# Del 13 Subscriptions # Del 13 Subscriptions
Planer (spec §45): Household 79 kr (3 pers), Family 129 kr (6), Large Household 169 kr (12). Planer (spec §45): Household 79 kr (3 pers), Family 129 kr (6), Large Household 169 kr (12).
Fair use-kvoter för AI: 100/200/400 skanningar/mån. Gratis: 10. Trial: 14 dagar full Fair use-kvoter för AI: 100/200/400 skanningar/mån. Gratis: 5. Trial: 14 dagar full
tillgång (Family-nivå) utan kort, startar vid registrering (spec §46). tillgång (Family-nivå) utan kort, startar vid registrering (spec §46).
## Arkitekturprincip ## Arkitekturprincip
+2 -2
View File
@@ -26,7 +26,7 @@ utifrån det ni faktiskt har hemma, vad som bör användas snart och vad ni gill
• Kalorier och näring beräknas alltid deterministiskt AI:n gissar aldrig siffror • Kalorier och näring beräknas alltid deterministiskt AI:n gissar aldrig siffror
• Full insyn: "Vad {NAMN} vet om mig" går att rätta, pausa och radera • Full insyn: "Vad {NAMN} vet om mig" går att rätta, pausa och radera
Gratis: 10 AI-skanningar/månad, manuellt lager, sparade recept och enkel loggning. Gratis: 5 AI-skanningar/månad, manuellt lager, sparade recept och enkel loggning.
Premium (14 dagar gratis, inget kort): obegränsat lager, veckoplan, delning och Premium (14 dagar gratis, inget kort): obegränsat lager, veckoplan, delning och
fler AI-skanningar. fler AI-skanningar.
@@ -57,7 +57,7 @@ what you like.
• Calories and nutrition are always computed deterministically AI never invents numbers • Calories and nutrition are always computed deterministically AI never invents numbers
• Full transparency: "What {NAME} knows about me" can be corrected, paused and deleted • Full transparency: "What {NAME} knows about me" can be corrected, paused and deleted
Free: 10 AI scans/month, manual inventory, saved recipes and simple logging. Free: 5 AI scans/month, manual inventory, saved recipes and simple logging.
Premium (14-day free trial, no card): unlimited inventory, week planning, sharing Premium (14-day free trial, no card): unlimited inventory, week planning, sharing
and more AI scans. and more AI scans.
+1 -1
View File
@@ -34,7 +34,7 @@ export const PLAN_DEFINITIONS: Record<SubscriptionPlan, PlanDefinition> = {
priceMinorPerMonth: 0, priceMinorPerMonth: 0,
currency: "SEK", currency: "SEK",
maxHouseholdMembers: 1, maxHouseholdMembers: 1,
aiScansPerMonth: 10, aiScansPerMonth: 5,
weekPlanning: false, weekPlanning: false,
advancedNutrition: false, advancedNutrition: false,
communityPublish: false, communityPublish: false,
@@ -59,12 +59,12 @@ describe("entitlements (spec §4547)", () => {
expect(ent.status).toBe("trial"); expect(ent.status).toBe("trial");
expect(ent.weekPlanning).toBe(true); expect(ent.weekPlanning).toBe(true);
}); });
it("free tier: 10 skanningar och användbar grund (spec §46)", () => { it("free tier: 5 skanningar och användbar grund (spec §46)", () => {
const ent = computeEntitlements(null, null, { aiScansUsedThisMonth: 9 }, NOW); const ent = computeEntitlements(null, null, { aiScansUsedThisMonth: 4 }, NOW);
expect(ent.plan).toBe("free"); expect(ent.plan).toBe("free");
expect(ent.aiScansPerMonth).toBe(10); expect(ent.aiScansPerMonth).toBe(5);
expect(canUseAiScan(ent)).toBe(true); expect(canUseAiScan(ent)).toBe(true);
expect(canUseAiScan({ ...ent, aiScansUsedThisMonth: 10 })).toBe(false); expect(canUseAiScan({ ...ent, aiScansUsedThisMonth: 5 })).toBe(false);
}); });
it("mappar productId → plan (härlett ur brand-konfig, aldrig hårdkodat)", () => { it("mappar productId → plan (härlett ur brand-konfig, aldrig hårdkodat)", () => {
expect(resolvePlanFromProductId(PLAN_DEFINITIONS.family.appleProductId)).toBe("family"); expect(resolvePlanFromProductId(PLAN_DEFINITIONS.family.appleProductId)).toBe("family");