Implémente le chantier #6 de docs/tech/landing-optimisations.md. Le funnel signup propose maintenant un essai 14 j Pro avec carte demandée mais non prélevée — prélèvement automatique à J+14 avec rappel à J+11 (webhook customer.subscription.trial_will_end de Stripe). Couverture tests : 60 tests unitaires sur la couche billing - billing.spec.ts (25) — quota Free, bypass trial, inTrial state - stripe_billing.spec.ts (24) — handlers webhook, idempotence, dispatcher - trial_recap_job.spec.ts (11) — stats aggregation, formatRubisToHoursFr + 3 nouveaux tests vitest côté SPA (useTrialDaysRemaining, useIsAtFreeLimit bypass trial). Backend : - Migration 1779000000000_add_trial_ends_at_to_organizations - PLAN_CAPS bypass quand status=trialing AND trial_ends_at futur - getOrgSubscriptionState expose inTrial + trialEndsAt - Refactor handlers webhook en service stripe_billing.ts (pures, testables) — extraction depuis le controller. dispatchWebhookEvent routeur typé également extrait pour les tests. - createTrialCheckoutSession avec subscription_data.trial_period_days=14, garde-fou TrialAlreadyConsumedError contre re-trial. - handleTrialWillEnd → enqueue job recap (BullMQ jobId déterministe basé sur subscriptionId, idempotent contre re-delivery Stripe). - Endpoint POST /api/v1/billing/start-trial. - Email template trial_recap (React Email, branding Rubis figé) avec stats: factures importées, relances envoyées, € récupérés, rubis + heures libérées. Infra de test : - tests/helpers/stripe_mock.ts : __setStripeForTests injection + factories fakeSubscription / fakeCheckoutSession / fakeInvoice. - __setTrialRecapEnqueueForTests : permet de spy l'enqueue sans Redis. Frontend : - /onboarding/billing.tsx (opt-in, pas encore forcé dans le flow) : bouton primaire essai 14j + fallback "Free 2 factures". - PlanLimitBanner : nouveau état "Essai Pro · X jours restants" qui prime sur les autres bandeaux. Discret rubis-glow, non blocant. - useStartTrial hook + useTrialDaysRemaining (arrondi sup). - SubscriptionState typé avec inTrial + trialEndsAt. Landing : - Sous-texte CTA réactivé : « CB demandée, non prélevée avant J+14 » (Hero + FinalCTA), maintenant promesse véridique. Notes ouvertes (à décider ultérieurement) : - Tunnel /onboarding/billing FORCÉ entre signup et /onboarding/compte : guard reste à activer (risque cassage du signup actuel sinon). Pour l'instant l'écran est accessible mais opt-in. - Cron de redondance trial-recap : pas encore implémenté (le jobId déterministe BullMQ couvre déjà la double-livraison Stripe). À ajouter si on observe des trial sans recap en prod. - Tests E2E avec Stripe test mode à faire avant le go-live (cartes 3DS 4000 0027 6000 3184, declined 4000 0000 0000 0341). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
8.8 KiB
Rubis Sur l'Ongle
SaaS de relance de factures impayées pour TPE-PME françaises. Drag-and-drop, OCR, plans de relance automatiques.
Contexte top-level — court, dense, scannable. Détails dans /docs/.
État actuel (mai 2026)
Produit shippé, landing live sur rubis.pro, 0 client payant. Focus 30 jours : acquisition (réseau direct + experts-comptables + SEO), pas de nouvelle feature avant 1er client demandeur. Audit landing en cours, cf. /docs/tech/landing-optimisations.md.
Promesse
Vos factures se relancent toutes seules pendant que vous travaillez. On vend du temps libéré (5h/semaine récupérées), pas de la trésorerie.
Cible : TPE-PME 5-50 salariés, 10-200 factures/mois, sans crédit manager dédié. Le décideur teste lui-même (pas de cycle de vente long).
Principes produit
- 3 clics max pour lancer une relance sur une facture neuve.
- Mobile et desktop — la photo de facture depuis le téléphone est un usage clé.
- La relance est l'âme du produit. L'édition native de factures (V1.1, ADR-025) est une extension douce, pas un pivot. On reste sous-positionnés vs Pennylane/Sellsy, jamais frontaux.
- Respect du client final — le ton monte avec le retard, jamais avant.
- Le rubis est une vraie devise — tangible, défendable, métrique-héros (pas le DSO).
Pas de (produit)
Pas de CRM, pas de comptabilité, pas de gestion RH, pas de marketplace marketing, pas de scoring crédit, pas de chasse multi-pays. Si une feature ressemble à ça, c'est OUT.
Identité de marque
| Logo | Direction A — gem facetté géométrique. Le ◆ est un symbole produit. |
| Primaire | #9F1239 rubis profond légèrement violacé (anti-Coca-Cola) |
| Secondaires | #771328 deep · #C9415C light · #FBE4EA glow |
| Neutres | Crème #FAF7F2 · encre chaude #1A1410. Jamais de blanc/noir purs. |
| Typo display | Bricolage Grotesque 500-800 (@fontsource-variable/bricolage-grotesque) |
| Typo body | Inter 400-700 (@fontsource-variable/inter) |
| Icônes | Lucide regular |
| Pas de | or, bleu, vert, violet, emojis joaillerie 💎💰, mot « recouvrement » en com publique |
Détails : /docs/marque.md · visuel : /docs/brand-identity.html.
Voix
Direct, concret, chaleureux, précis, empathique. Comme un bon associé, pas comme une DAF.
- ✓ "Vos factures relancées toutes seules."
- ✗ "Optimisez votre processus de recouvrement amiable."
Glossaire
- Rubis : unité de gamification. 1 rubis = 10 minutes libérées = 1 relance évitée à la main.
- Plan de relance : cadence d'emails automatisés (J+3, J+10, J+20...). 4 plans par défaut : Standard B2B, Rapide, Patient, Ferme.
- Confirmation (ex « check-in ») : email envoyé à l'utilisateur pour confirmer paiement avant la relance suivante. Remplace l'intégration banking en V1.
- Mise en demeure : étape ferme, toujours sous validation manuelle via modale. Jamais auto.
- Facture native : facture créée dans Rubis via
/factures/nouvelle(vs OCR/saisie). PDF généré côté serveur via@react-pdf/renderer. Snapshots client + émetteur immuables figés à l'émission. Drapeauinvoices.is_native = true. Numérotation strict séquentielle par org via verrou row-level (conforme art. 242 nonies A du CGI). - Factur-X : PDF/A-3 + XML CII embarqué, format obligatoire B2B FR au 1er sept 2027. Roadmap V1.5.
- DSO : Days Sales Outstanding. Métrique secondaire dans l'app, jamais dans la com publique.
- LME : loi 2008, plafonne les délais de paiement à 60j (ou 45j fin de mois). Sanctions DGCCRF jusqu'à 2 M€.
Périmètre V1
IN — Auth email/password + Google/Microsoft SSO · Onboarding 3 étapes · Upload OCR (PDF/PNG/JPG) + saisie manuelle · Édition native factures (V1.1, cf. ADR-025) · Bibliothèque de plans + éditeur · Confirmation par email · Dashboard rubis + KPIs · Liste filtrable · Timeline relances · Stripe billing + période de grâce · Mode démo · Web responsive · Blog rubis.pro/blog (SSR Astro, contenu DB, IA hebdo + review humaine) · Changelog rubis.pro/changelog (SSG, content collections, toast SPA via apps/web/src/version.ts).
OUT V2+ — SMS (plan le plus cher) · Multi-utilisateurs (plans payants) · Intégration banking (archi V1 doit l'anticiper) · Multi-langues/devises (FR/EUR only en V1) · Intégrations ERP/compta (Sage, Pennylane, Quickbooks).
Pricing
| Plan | Prix | Limite |
|---|---|---|
| Free | 0 € | 2 factures actives, 1 utilisateur (cf. ADR-023, mai 2026) |
| Pro | 19 €/mois | Factures illimitées, OCR illimité, 1 utilisateur |
| Business | 49 €/mois | + multi-users + branding email + SMS (V2) |
Argument : "moins cher qu'une heure de votre temps mensuel". Funnel signup : essai 14 j Pro avec CB à l'inscription (Stripe trial_period_days), prélèvement auto à J+14 avec rappel à J+12. Fallback Free pour les sans-CB. Cf. /docs/tech/stripe-trial-with-card.md.
Stack technique
| Couche | Choix | Source |
|---|---|---|
| API | AdonisJS v7 (Lucid, auth Bearer, jobs BullMQ, mail) | ADR-014 |
SaaS app.rubis.pro |
React 19 + Vite + TanStack Router/Query | ADR-014 |
Landing+blog rubis.pro |
Astro 6 SSR | — |
| Design system | @rubis/ui — Tailwind v4 + composants TSX |
— |
| DB | PostgreSQL (LXC Proxmox existant) | ADR-014, ADR-016 |
| Storage | MinIO (LXC Proxmox existant) | ADR-018 |
| Hosting | Proxmox + K3s + Traefik | ADR-014 |
| PDF natif | @react-pdf/renderer côté API, templates apps/api/app/pdf-templates/ |
ADR-025 |
| OCR / Email | à benchmarker | ADR-020 / ADR-021 |
Repo : monorepo Turborepo (apps/api, apps/web, apps/landing, packages/shared Zod, packages/ui). API REST Bearer-auth (ADR-017). Détails : /docs/tech/architecture.md.
Convention cross-cutting — UUID partout. PK et FK applicatives en UUID v4 (gen_random_uuid()). Jamais d'increments/serial, même pour les tables internes. Protège de l'énumération, simplifie la fédération multi-tenant, évite les fuites par incrément.
Comment bosser avec moi (Arthur)
- Acquisition avant produit. Quand je propose une feature, vérifier qu'un user réel l'a demandée. Si c'est une hypothèse, me ramener au plan acquisition.
- Lire l'ADR avant de toucher un sous-système (
/docs/decisions.md). Si décision absente, écrire un nouvel ADR. - Pas de personal brand sur les réseaux. LinkedIn propre + GitHub OK, pas de mise en scène. Pour le copy public, ton direct sans posture.
- Réutiliser l'infra existante (PG, MinIO, K3s, Traefik) plutôt que provisionner du neuf.
- Réponses en français, prose dense, peu de bullets sauf si liste vraiment nécessaire. Pushback bienvenu, pas de flatterie.
Documents associés
| Fichier | Rôle |
|---|---|
/docs/produit.md |
Spec produit (features, IN/OUT V1, flow native) |
/docs/flow.md |
Cycle de vie facture, statuts, transitions, edge cases |
/docs/marque.md |
Référence marque écrite |
/docs/decisions.md |
Log ADR (rationale par décision) |
/docs/tech/architecture.md |
Architecture technique (composants, topologie) |
/docs/tech/frontend.md |
Guide implémentation frontend |
/docs/tech/backend.md |
Guide backend (jobs, mail, conventions Adonis) |
/docs/tech/landing-optimisations.md |
Audit landing + plan d'exécution (mai 2026) |
/docs/marketing/playbook.md |
Playbook acquisition : ICP, Dream 100, outreach |
/docs/munitions-marketing.md |
Stats marché, concurrents, copy, positionnement |
/docs/tech/stripe-trial-with-card.md |
Funnel signup essai 14j + CB à l'inscription |
/.claude/deploy-memory.md |
Procédure de déploiement |
/.claude/skills/push/SKILL.md |
Skill /push — bump version + changelog + commit |
Déploiement
Domaines : rubis.pro (landing+blog) · app.rubis.pro (SaaS). Compat 301 depuis rubis.arthurbarre.fr / app.rubis.arthurbarre.fr. Images : git.arthurbarre.fr/ordinarthur/rubis-{landing,api,web}:latest. Détails : .claude/deploy-memory.md.
Email infrastructure
| Flux | Provider | Adresse | DNS |
|---|---|---|---|
| Sortant (relances, auth) | Resend | relances@rubis.pro |
send.rubis.pro MX+SPF, resend._domainkey DKIM, _dmarc |
| Entrant (humain) | OVH MX Plan | contact@rubis.pro, dev@rubis.pro |
MX @ → mx*.mail.ovh.net. |
Détails : /docs/tech/backend.md §12.5.
Questions ouvertes
- Pricing Free à réarbitrer (cf. landing-optimisations.md §2)
- Provider OCR à benchmarker (Mindee / Document AI / Textract / Tesseract) — ADR-020
- Conversion 1 rubis = 10 min à confirmer en user testing après premiers clients
- Analytics RGPD (Plausible self-hosted vs Umami) — futur ADR
Dernière mise à jour : 2026-05-17 · Maintenu par Arthur + Claude.