SaaSAbonnements récurrents · HTG · Dunning · Changement de plan

MonCashConnect pour SaaS en Haïti

Vous vendez un logiciel ou un service en abonnement à des clients haïtiens qui paient en HTG. MonCash n'offre pas de débit silencieux mensuel comme Stripe, mais MonCashConnect rend le cycle de facturation viable : renouvellement par lien signé, webhook fiable, statuts d'abonnement cohérents, plusieurs environnements isolés.

Le problème

Les SaaS qui veulent vendre en HTG doivent composer avec un wallet qui n'a pas été conçu pour la facturation récurrente :

  • ·MonCash ne permet pas, à ce jour, un débit silencieux périodique. Chaque renouvellement demande une confirmation explicite de l'utilisateur dans son app.
  • ·Sans dashboard de statut clair, vous ne savez pas qui a payé, qui a sauté un cycle, qui est en past_due. Vous finissez à exporter des screenshots SMS pour faire votre compta.
  • ·Tester un changement de plan ou un upgrade pro-rata sans casser la facturation réelle nécessite un environnement séparé — ce que le portail MonCash officiel n'expose pas.
  • ·La logique de dunning (relances avant suspension) demande un évènement fiable. Un lien web simple n'est pas suffisant.

Comment MonCashConnect aide

MonCashConnect ne magie pas un débit silencieux MonCash — personne ne le peut. En revanche, voici ce qu'on couvre pour rendre le cycle d'abonnement vivable :

Création de paiement par cycle : à chaque échéance, vous créez un paiement avec reference_id = subscription_id:cycle_n et envoyez le lien à l'utilisateur (email, SMS, in-app).

Webhook payment.completed signé HMAC-SHA256 : votre service reçoit l'évènement avec votre reference_id et flippe l'abonnement en active jusqu'au prochain cycle.

Pas de paiement reçu en X jours → vous bascules en past_due et coupez l'accès. C'est votre logique de dunning, MCC vous fournit juste l'évènement source.

Plusieurs projets pour isoler prod, staging et dev — chaque projet a son ledger, ses clés et ses webhooks séparés.

Dashboard temps réel avec filtres par statut, par reference_id, export CSV pour réconcilier avec votre base d'abonnés.

Cycle d'un abonnement mensuel à 1 200 HTG

  1. J-3 : envoi du lien de renouvellement. Votre cron lit les abonnements dont next_billing_at approche. Pour chacun, vous créez un paiement reference_id: "sub_8821:cycle_14", vous envoyez l'URL au client par email ou notification in-app.
  2. J-0 : le client paie depuis son MonCash. Il ouvre le lien, confirme dans son app, le wallet débite 1 200 HTG.
  3. Webhook reçu : payment.completed avec la signature et votre reference_id. Vous mettez subscription.status = "active", next_billing_at = now + 30j, vous envoyez un reçu.
  4. J+5 sans paiement : votre cron passe l'abonnement en past_due et limite l'accès aux fonctionnalités premium. Vous relancez par email.
  5. J+10 toujours rien : l'abonnement passe en canceled. Si l'utilisateur revient, il recommence un cycle from scratch — vous re-créez un paiement neuf.

Côté webhook handler, le snippet critique :

// POST /webhooks/moncash
app.post("/webhooks/moncash", express.raw({ type: "application/json" }), async (req, res) => {
  let event;
  try {
    event = mcc.webhooks.constructEvent(
      req.body,                              // bytes bruts, AVANT JSON.parse
      req.headers["x-mcc-signature"],
      req.headers["x-mcc-timestamp"],
      process.env.MCC_WEBHOOK_SECRET,
    );
  } catch {
    return res.status(400).send("invalid signature");
  }

  if (event.event === "payment.completed") {
    const [subId, cycle] = event.reference_id.split(":");
    await renewSubscription(subId, cycle);     // idempotent
  }
  res.send("OK");
});
Rendez renewSubscription idempotent — un même évènement peut être livré plusieurs fois. Comparez le cycle reçu au dernier cycle enregistré pour ignorer les doublons.

Quel plan vous convient

Un SaaS bénéficie surtout d'environnements isolés (prod, staging, dev local) et d'un plafond suffisant pour cashout, plus que d'un nombre élevé de transactions gratuites.

SaaS à abonnements en HTG

Quelques dizaines à quelques centaines d'abonnés mensuels, un seul produit, besoin de staging séparé.

Pro — 2 500 HTG / mois

Pro autorise 3 projets — typiquement prod, staging, dev local — et un retrait de 15 000 HTG/jour, ce qui couvre un cashout hebdomadaire confortable. Passez à Business (5 000 HTG/mois, 5 projets, retraits illimités) si vous opérez plusieurs produits SaaS distincts ou si vous voulez vider votre solde quotidiennement sans plafond.

Détails complets sur la page Tarifs.

FAQ — SaaS

MonCash supporte-t-il vraiment les paiements récurrents automatiques ?+
MonCash n'expose pas un "abonnement" au sens Stripe (débit silencieux mensuel). Mais MonCashConnect rend le pattern réaliste : à chaque échéance, vous générez un paiement avec le reference_id du cycle et notifiez l'utilisateur. Tant qu'il confirme dans son app MonCash, le webhook payment.completed renouvelle l'accès. Si vous voulez un vrai débit silencieux, MonCash n'offre pas cette mécanique aujourd'hui — vous devez relancer l'utilisateur.
Comment je gère un client qui ne paie pas son renouvellement ?+
Vous gardez côté SaaS le statut de l'abonnement (active, past_due, canceled). Si le webhook payment.completed n'arrive pas dans X jours après l'envoi du lien de renouvellement, vous bascules l'abonnement en past_due et limitez l'accès — c'est votre logique de dunning. MonCashConnect vous donne juste l'évènement webhook fiable et signé pour déclencher cette logique.
Puis-je facturer pro-rata sur un changement de plan ?+
Oui mais c'est votre code qui calcule le montant. Vous créez un paiement one-shot pour la différence pro-rata, vous attendez payment.completed, puis vous mettez à jour le plan dans votre base. MonCashConnect facture une transaction comme une autre — pas de notion native de pro-rata côté gateway.
Comment je différencie mes environnements (staging vs prod) ?+
Créez deux projets différents dans votre dashboard MCC. Chacun a son couple de clés (sk_test_proj_… et sk_proj_…) et son ledger isolé. Le plan Pro autorise 3 projets, Business 5 — assez pour prod, staging, dev local.
Le webhook est-il fiable ? Que se passe-t-il s'il rate ?+
Les webhooks sont signés HMAC-SHA256 et retentés en cas d'échec. Vous devez répondre en moins de 30s. Pour rester safe, déchargez le travail lourd (envoi d'email, provisioning) dans une queue et renvoyez juste 200 OK rapidement. Tout évènement est aussi consultable dans le dashboard si vous voulez audit ou rejouer manuellement.
Y a-t-il un coût caché en plus de mon abonnement MCC ?+
Non. MonCashConnect ne prend pas de commission par transaction. Les seuls frais sont les pass-through réseau : 2,9 % sur la collecte côté Bazik, 5 % si vous retirez vers votre MonCash perso. Vous voyez ces frais transparents sur chaque ligne du dashboard.
MonCashConnect est une plateforme indépendante, sans affiliation à Digicel ou MonCash. Le KYC marchand est obligatoire avant d'encaisser des paiements live — prévoyez-le dans votre plan de lancement.