KOMPTA|Documentation Technique
V 2.1Mai 2026Confidentiel

Kompta · Documentation Technique & Fonctionnelle

Architecture, Fonctionnalités et Modèle Économique

Version 2.1·Mai 2026·Confidentiel, Investisseurs, DAF, Experts-Comptables, CTO

Kompta est un SaaS de gestion administrative et comptable conçu exclusivement pour les artisans et TPE françaises, plombiers, électriciens, maçons, peintres, menuisiers. Là où les acteurs généralistes comme Pennylane ciblent les PME avec expert-comptable dédié et Indy les freelances, Kompta adresse le créneau laissé vacant : l'artisan solo ou avec 2–5 employés, terrain, mobile, sans comptable interne.

CritèreKomptaIndyPennylaneCegid
CibleArtisans TPEFreelancesPME + comptaETI/Grands comptes
Mobile-firstNatifPartielNonNon
IA extraction facturesGeminiBasiquePartielCoûteux (module)
Notes de frais + IKOui, natifNonOuiOui
Signature devis en ligneOuiNonOuiOui
Factur-X natifOuiNonPartielOui
Prix entrée0 €/mois9 €/mois49 €/moisSur devis

Pricing & Plans

Architecture Freemium gérée nativement via lib/plans.ts et lib/plan-limits.ts, couplée à Stripe Billing (Checkout + Portal). Les quotas sont vérifiés côté serveur avant chaque création de document.

ForfaitPrixQuotasFonctionnalités
Gratuit0 €/mois2 devis + 2 factures/moisFournisseurs illimités · FEC · Notes de frais
Pro25 €/moisIllimitéMulti-utilisateurs · RBAC · Support prioritaire

Exemple, vérification de quota

lib/plan-limits.ts
export async function checkQuoteLimit(companyId: string): Promise<void> {
  const plan = await getPlan(companyId);   // "free" | "pro"
  if (plan === "pro") return;              // illimité

  const { count } = await supabase
    .from("quotes")
    .select("id", { count: "exact", head: true })
    .eq("company_id", companyId)
    .gte("created_at", startOfMonth());

  if (count !== null && count >= 2) {
    throw new PlanLimitError(
      "Limite de 2 devis/mois atteinte. Passez au plan Pro."
    );
  }
}
Le modèle freemium génère une adoption sans friction. La limite à 2 devis + 2 factures/mois convertit naturellement les artisans actifs vers le Pro. Un levier MRR additionnel est disponible via les commissions sur les flux Stripe Connect (application fees), non encore activé.

RBAC, Hiérarchie des Rôles

Le contrôle d'accès est géré par lib/permissions.ts avec 4 niveaux hiérarchiques. Le cloisonnement est total : sidebar, nav mobile, prompts IA et routes API sont tous filtrés par rôle.

RôlePermissionsPages accessibles
ArtisanAccès total + abonnement Stripe + suppression entrepriseToutes les pages
AdminCRUD toutes données. Invitations membres. Sans facturation Stripe.Toutes sauf abonnement
ComptableLecture seule + export FEC/CA3.Achats · Transactions · TVA · FEC · Profil
EmployéSoumet et consulte ses propres notes de frais.Accueil · Notes de frais · Profil

Guard dans une Server Action

app/dashboard/devis/actions.ts
"use server";
import { requireWrite } from "@/lib/permissions";

export async function createQuote(data: QuoteInput) {
  const supabase = await createClient();
  const { data: { user } } = await supabase.auth.getUser();
  const { data: profile } = await supabase
    .from("profiles").select("role, company_id")
    .eq("id", user!.id).single();

  // Lève une erreur si role = "comptable" ou "viewer"
  requireWrite(profile?.role);

  // Vérifie le quota plan avant insertion
  await checkQuoteLimit(profile!.company_id);

  return supabase.from("quotes")
    .insert({ ...data, company_id: profile!.company_id });
}

Ventes, Order-to-Cash

Workflow

1

Devis

2

Signature client

3

Acompte Stripe

4

Facture Factur-X

5

Paiement carte

FonctionnalitéDescription
Devis interactifsCatalogue produits/services, TVA par ligne, acompte Stripe. Signature via URL publique tokenisée (/sign/[token]).
Conversion automatiqueDevis accepté → facture générée en brouillon, prête à finaliser en fin de chantier.
Factures Factur-XXML EN 16931 embarqué dans le PDF. Numérotation FAC-2026-NNNNN incassable (verrou PostgreSQL).
AvoirsNumérotation AV-2026-NNNNN. Une facture envoyée ne peut jamais être supprimée, seul l'avoir annule légalement (art. 289 CGI).
Facturation récurrenteModèles hebdo/mensuel/annuel. Job CRON crée automatiquement la facture à l'échéance.
Transmission B2BrouterKompta est Opérateur de Dématérialisation (OD) : les factures sont transmises via la PDP partenaire B2Brouter (routage B2B et dépôt Chorus Pro pour le B2G).
Kompta = OD, pas PDP. Kompta crée et met en forme les factures (Opérateur de Dématérialisation). La transmission officielle dans le réseau de facturation électronique est assurée par notre Plateforme de Dématérialisation Partenaire B2Brouter, qui couvre à la fois le routage B2B et le dépôt Chorus Pro (secteur public, B2G).
Numérotation légale : Les séquences sont gérées avec verrou PostgreSQL côté serveur. Aucun trou possible dans la numérotation, conformément à l'art. 242 nonies A de l'annexe II du CGI.

Achats & Notes de Frais

Pipeline d'extraction IA

Lorsqu'un justificatif est uploadé (PDF, JPEG, PNG, WebP, HEIC, max 20 Mo), le pipeline décide automatiquement entre deux chemins :

  1. Si le fichier contient un XML CrossIndustryInvoice → parsing direct via lib/facturx-parse.ts (fiabilité 100%, sans IA)
  2. Sinon → envoi à Gemini multimodal (lib/gemini-extract.ts) avec schéma de réponse structuré

Exemple, réponse JSON de l'extraction

POST /api/extract-invoice → réponse
{
  "invoice_number": "FAC-2026-00421",
  "date":           "2026-05-14",
  "supplier_name":  "Brico Pro SAS",
  "supplier_siret": "82345678900012",
  "total_ht":       "248.50",
  "total_tva":      "49.70",
  "total_ttc":      "298.20",
  "vat_breakdown": [
    { "rate": "20", "base_ht": "248.50", "tva": "49.70" }
  ],
  "category":       "Matériaux",
  "confidence":     0.97
}

Notes de frais employés

FonctionnalitéDescription
Scan + IA mobileL'employé scanne son ticket depuis son téléphone. L'IA pré-remplit tous les champs. Compression canvas avant upload (max 1600px, JPEG 82%).
Indemnités kilométriquesBarème DGFiP 2026 par puissance fiscale (CV). Calcul automatique de l'indemnité. Non soumis à TVA. Archivé par trajet.
Justificatifs cloudStockés dans Supabase Storage (bucket expense-receipts). URL signée 60 min générée à la demande. Conservés même après suppression de la note.
Workflow approbationStatuts : En attente → Approuvé / Refusé. Boutons ✓/✗ pour l'artisan. Filtrage par employé.
Clôture mensuelleL'employé clôture ses notes d'un mois. Action idempotente (impossible de clôturer deux fois). Notification email propriétaire. Bannière dismissable en base.

Gestion d'Équipe & Multi-Entreprise

Invitations via token UUID envoyé par email (Resend). Expiration après 7 jours. Un comptable peut être membre de plusieurs entreprises simultanément, la source de vérité est la table company_memberships.

ActionQui peut ?Effet
Inviter un membreArtisan + AdminEmail avec lien tokenisé valable 7 jours
Changer le rôleArtisan uniquementÉcrit dans company_memberships ET profiles.role
Retirer un membreArtisan + AdminSupprime company_memberships, redirige profiles.company_id
Accepter une invitationInvité (nouveau ou existant)Upsert company_memberships, login/signup automatique
supabase, table company_memberships
CREATE TABLE company_memberships (
  id         UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  user_id    UUID NOT NULL REFERENCES profiles(id)  ON DELETE CASCADE,
  company_id UUID NOT NULL REFERENCES companies(id) ON DELETE CASCADE,
  role       TEXT NOT NULL DEFAULT 'viewer',
  created_at TIMESTAMPTZ DEFAULT now(),
  UNIQUE(user_id, company_id)
);

Espace comptable multi-clients

Un membre comptable accède à la page /dashboard/cabinet : vue d'ensemble de toutes les entreprises qu'il suit (CA du mois, impayés, dépenses), avec bascule rapide via switchCompany() et accès direct à l'export FEC de chaque client.

Export comptable automatique mensuel

Le cron /api/cron/monthly-accountant-export (5 du mois, 07:00) génère un CSV des écritures du mois écoulé (factures clients, factures fournisseurs, transactions) et l'envoie par email à chaque membre comptable. Activable/désactivable par l'artisan via companies.accountant_auto_export (page Équipe).

Intelligence Artificielle Embarquée

Cas d'usageFichierDescription
Extraction factureslib/gemini-extract.tsOCR augmenté, numéro, dates, fournisseur, SIRET, HT/TVA/TTC, ventilation par taux, catégorie métier.
Rapprochement bancairelib/gemini-bank-extract.tsAnalyse les libellés obscurs de relevés bancaires et suggère les factures correspondantes.
Copilote conversationnellib/assistant-prompt.ts3 prompts distincts selon le rôle. Rate-limited à 40 messages/heure/utilisateur.
Rédaction de devis/api/devis/ai-draftL'artisan décrit son chantier en langage naturel. Gemini propose les postes, quantités et prix.

Exemple, cloisonnement du prompt par rôle

lib/assistant-prompt.ts
const ASSISTANT_SYSTEM_PROMPT_VIEWER = `
Tu es l'assistant de l'application Kompta, pour un EMPLOYÉ.
Tu peux UNIQUEMENT répondre aux questions sur :
- La création et soumission de notes de frais
- La clôture mensuelle des notes de frais
- La consultation du profil

Tu ne mentionnes JAMAIS et ne réponds JAMAIS aux questions sur :
les devis, factures clients, TVA, FEC, transactions, clients,
chiffre d'affaires, paiements, abonnements.
`;

export function getSystemPrompt(role: string | null): string {
  if (role === "comptable") return ASSISTANT_SYSTEM_PROMPT_COMPTABLE;
  if (role === "viewer")    return ASSISTANT_SYSTEM_PROMPT_VIEWER;
  return ASSISTANT_SYSTEM_PROMPT;   // artisan / admin
}
Le rôle est récupéré côté serveur dans la route API après authentification, jamais via le client. Un utilisateur ne peut pas élever ses droits en modifiant la requête.

Infrastructure de Paiement, Stripe Connect

Kompta opère comme une plateforme d'encaissement décentralisée. Les fonds ne transitent jamais par Kompta | ils arrivent directement sur le compte Stripe de l'artisan.

FonctionnalitéRoute / FichierDescription
Onboarding Embeddedapp/api/stripe/connectL'artisan connecte son Stripe depuis /dashboard/settings sans quitter l'application.
Paiement direct sur factureapp/api/stripe/payment-linkEmail de facture avec lien sécurisé. Client paye par carte. Fonds sur le Stripe de l'artisan.
Acompte sur devisapp/api/stripe/deposit-checkoutCheckout Stripe généré depuis le devis. Facture d'acompte créée automatiquement.
Webhooks & Idempotenceapp/api/stripe/webhookSignature STRIPE_WEBHOOK_SECRET vérifiée. Factures marquées 'Payée' sur payment_intent.succeeded.
Levier MRR : La plateforme peut activer une commission sur les flux via Stripe Connect (application fees) sans coût marginal supplémentaire.

E-Invoicing & Factur-X

Architecture conçue nativement pour la réforme e-invoicing 2026 (art. L163-1 LPFP 2022). Profil urn:factur-x.eu:1p0:basicwl conforme à la norme européenne EN 16931.

ComposantFichierRôle
Génération PDF hybridelib/facturx-pdf.tsCrée le PDF et y embarque le XML (XMP metadata + attachment)
Schéma XMLlib/facturx.tsStructure CrossIndustryInvoice / EN 16931 / BasicWL
Parsing achatlib/facturx-parse.tsExtrait depuis le XML embarqué, sans OCR, fiabilité 100%
Route publique XML/api/public/invoice/…Téléchargement du XML seul, consommé par la PDP B2Brouter

Exemple, structure XML générée

PDF hybride, XML embarqué (extrait)
<rsm:CrossIndustryInvoice>
  <rsm:ExchangedDocumentContext>
    <ram:GuidelineSpecifiedDocumentContextParameter>
      <ram:ID>urn:factur-x.eu:1p0:basicwl</ram:ID>
    </ram:GuidelineSpecifiedDocumentContextParameter>
  </rsm:ExchangedDocumentContext>
  <rsm:ExchangedDocument>
    <ram:ID>FAC-2026-00089</ram:ID>
    <ram:TypeCode>380</ram:TypeCode>
    <ram:IssueDateTime>
      <udt:DateTimeString format="102">20260514</udt:DateTimeString>
    </ram:IssueDateTime>
  </rsm:ExchangedDocument>
  <rsm:SupplyChainTradeTransaction>
    <ram:ApplicableHeaderTradeSettlement>
      <ram:SpecifiedTradeSettlementHeaderMonetarySummation>
        <ram:TaxBasisTotalAmount>1200.00</ram:TaxBasisTotalAmount>
        <ram:TaxTotalAmount currencyID="EUR">240.00</ram:TaxTotalAmount>
        <ram:GrandTotalAmount>1440.00</ram:GrandTotalAmount>
      </ram:SpecifiedTradeSettlementHeaderMonetarySummation>
    </ram:ApplicableHeaderTradeSettlement>
  </rsm:SupplyChainTradeTransaction>
</rsm:CrossIndustryInvoice>

Architecture Technique

CoucheTechnologieRôle
FrontendNext.js 14 App Router + TypeScriptSSR/SSG, Server Components, Server Actions
UITailwindCSS + shadcn/ui + RadixComposants accessibles, dark mode ready
Base de donnéesPostgreSQL via SupabaseMulti-tenant par company_id, RLS natif
AuthSupabase AuthJWT, sessions cookies, MFA, invitations
StorageSupabase StorageJustificatifs, logos, documents PDF
EmailResend + React EmailDevis, factures, invitations, rappels
PaiementStripe Connect + BillingCheckout, Portal, Webhooks, Connect Embedded
IAGoogle Gemini 2.5 FlashExtraction factures, rapprochement, copilote
HostingHostingerVariables d'env gérées côté Hostinger
Cronsvercel.jsonWeekly report lundi 08:00, rappels quotidien 09:00

Clients Supabase, 3 flavors

Ne jamais mélanger ces trois clients :

FichierContexteUsage
lib/supabase/client.tsBrowserComposants React client uniquement
lib/supabase/server.tsServerServer Components, Route Handlers, Server Actions (cookies)
lib/supabase/admin.tsServeur privilégiéService-role. Webhooks, cron, ops admin. JAMAIS côté client.

Sécurité & Conformité

Row Level Security (RLS)

Toutes les tables business filtrent sur company_id. Un utilisateur ne peut jamais lire ou écrire en dehors de son entreprise, même en cas de bug applicatif.

supabase, exemple politique RLS
-- Appliqué sur toutes les tables business (quotes, invoices, transactions…)
CREATE POLICY "isolate_by_company" ON client_invoices
  FOR ALL USING (
    company_id IN (
      SELECT company_id FROM profiles WHERE id = auth.uid()
    )
  );
MécanismeFichierDescription
Row Level SecuritySupabase (SQL)Isolation multi-tenant au niveau base de données.
MFA, OTP emaillib/mfa-edge.tsCode OTP à chaque connexion via Supabase Auth.
Audit Traillib/audit.tsChaque action critique horodatée dans un registre inaltérable.
Rate Limitinglib/ratelimit.tsRoutes API et IA limitées par IP/utilisateur.
Numérotation légaleserver actionsVerrou PostgreSQL, aucun trou possible (CGI art. 242 nonies A).
Suppression RGPD/api/account/deleteExport données personnelles + suppression cascade.
Le client Supabase admin.ts (service_role) n'est jamais importé côté navigateur. Les mutations sensibles passent exclusivement par des Server Actions ou Route Handlers authentifiés côté serveur.

Expérience Mobile & PWA

Kompta est conçu mobile-first, l'artisan terrain crée un devis, scanne une facture ou déclare un trajet depuis son téléphone en moins de 30 secondes.

FonctionnalitéDescription
Bottom navigation adaptéeArtisan : Accueil · Devis · Factures · Frais. Employé : Accueil · Mes frais. Comptable : Accueil · Achats · Transactions · FEC.
Scanner natif<input capture='environment'> ouvre directement la caméra arrière. Aucune app native requise.
Compression canvasImages compressées côté client avant upload : max 1600px, JPEG 82%. Réduction d'environ 80% sans perte perceptible.
Formulaires terrainMontant en grand format centré, catégories en chips tactiles, optimisé pour les gros doigts et l'usage terrain.
PWA installablemanifest.json + service worker (sw.js). Icônes 192px et 512px. Fonctionne hors-ligne pour la consultation.

Roadmap 2026–2027

PrioritéFonctionnalitéImpactStatut
P1Rentabilité par chantier (devis vs coûts réels)Différenciateur #1Planifié
LivréAttestation TVA réduite 5,5%/10% (Cerfa 13948)Supprime une friction terrain majeureDisponible
P2Sync bancaire automatique (Bridge/Powens)Fin import CSV manuelEn cours
P2Planning chantier visuel (vue semaine)Rétention + premiumPlanifié
P2Portail client self-serviceMoins d'emails entrantsPlanifié
P3Sous-traitants + attestations URSSAFSecteur BTP haute valeurIdée
P3App mobile native (Expo/React Native)PWA → App StoreIdée
P4Pages SEO par métier (/plombier…)Acquisition organiqueIdée

Pour les investisseurs

Kompta combine des standards techniques de niveau entreprise, RLS PostgreSQL, RBAC granulaire, Factur-X EN 16931, Stripe Connect, audit trail inaltérable, avec une expérience utilisateur conçue pour le terrain. L'IA embarquée (Gemini) supprime les frictions de saisie qui découragent les artisans d'adopter les outils comptables.

MRR Model

Abonnement + Commission flux

Marché cible France

~1,2M artisans TPE

Avantage concurrentiel

Mobile + IA + Chantier intégré

kompta.pro · Documentation Technique V2.1 · Mai 2026 · Confidentiel