What gets generated
Webhook handler with signature verification
# app/blueprints/flutterwave_webhook_bp.py
@flutterwave_webhook_bp.route("/webhooks/flutterwave", methods=["POST"])
def handle_webhook():
signature = request.headers.get("verif-hash", "")
expected = current_app.config["FLUTTERWAVE_WEBHOOK_SECRET"]
if signature != expected:
return jsonify({"error": "invalid signature"}), 400
event = request.get_json()
tx_ref = event.get("data", {}).get("tx_ref")
if WebhookEvent.query.filter_by(provider_event_id=tx_ref).first():
return jsonify({"status": "already_processed"}), 200
handler = WEBHOOK_HANDLERS.get(event["event"])
if handler:
handler(event)
return jsonify({"status": "ok"}), 200
Payment-method-specific flows
Card, bank transfer, mobile money (M-Pesa, MTN MoMo, Airtel Money), USSD, QR — each has a different flow shape. Generated routes detect the method from the customer's country and present the right UI. Mobile money flows include the "complete on your phone" UX with status polling.
Recurring billing
Flutterwave's payment-plan model is wired with subscription lifecycle event handling. Generated app/services/billing_lifecycle.py updates the workspace's plan on charge.completed, gates features on payment.failed, and downgrades after the configured grace window.
Multi-currency
NGN, GHS, KES, UGX, TZS, ZAR, USD, EUR, GBP all supported. Amounts stored in minor units. Region-specific rounding rules — Kenya rounds to the nearest 0.50 KES on UI, full precision in storage.
Failover
When a customer's primary payment method fails (mobile money provider down, card declined), the generated checkout flow surfaces alternative methods available in their country. Reduces drop-off vs the "try again later" pattern.
What ships in docs/
docs/decisions/ADR-0009-payment-provider-flutterwave.md— when Flutterwave is the right call (multi-region African presence + mobile money) vs Paystack (Nigeria-first) vs Stripe (global)docs/compliance/cbn-compliance-notes.md— Nigerian regulatory considerationsdocs/decisions/ADR-0014-webhook-signature-verification.md— Flutterwave's verif-hash approach explaineddocs/runbooks/mobile-money-failure.md— the operational playbook when an MNO is having an outage
Environment variables generated
FLUTTERWAVE_PUBLIC_KEY=FLWPUBK_TEST-...
FLUTTERWAVE_SECRET_KEY=FLWSECK_TEST-...
FLUTTERWAVE_WEBHOOK_SECRET=...
FLUTTERWAVE_PLAN_ID_BUILDER=...
FLUTTERWAVE_PLAN_ID_PRO=...
Flutterwave documentation references
- Webhooks
- Recurring billing / payment plans
- Mobile money payment methods
- Supported currencies and countries
Internal links
- Stripe integration for the global counterpart
- Paystack integration for Nigeria-first deployments
- E-commerce use case
- Marketplace use case
CTA
Try it — free plan, no credit card. archiet.com.
Generate a codebase with Flutterwave wired, look at the mobile money flow and the multi-currency handling, decide if that's the architecture you'd ship.