Flutterwave Integration Guide

PayPal's Braintree partnership with Flutterwave enables merchants to use their existing Braintree integration to process card-not-present transactions through the PayPal Orchestration platform. Flutterwave's network focuses on Africa and emerging markets. It provides direct card acquisition in regions where traditional global processors have limited reach.

This guide helps developers at merchant sites complete the integration in their environment.

FeaturesAnchorIcon

The following topics summarize the capabilities that this integration supports.

Core transaction lifecycleAnchorIcon

The following table describes support for the core transaction lifecycle operations with this integration.

Legend: ✅ Supported | ❌ Not supported | ⚠️ Conditional or varies by merchant configuration

CapabilitySupportNotes
Charge (dual-step)Flutterwave orchestrates authorization and capture as a dual-step call. Braintree performs them as separate steps.

For more information and charge outcomes, see Transaction status mapping. Also see the documentation for authorization (Braintree SDK or GraphQL) or capture (Braintree SDK or GraphQL).
Charge (single-step)
Standalone authorizationYou must capture authorization within 7 days (before it expires). For more information, see the authorization documentation for Braintree SDK or GraphQL.
Capture (full)This integration captures a previously authorized transaction synchronously. Note that you must capture an authorization within 7 days. For more information, see the documentation for capture for Braintree SDK or GraphQL.
Partial capture
Capture greater than authorized amount
Adjust authorization API (incremental auth)

Voids and refundsAnchorIcon

The following table describes support for voids and refusals with this integration.

Legend: ✅ Supported | ❌ Not supported | ⚠️ Conditional or varies by merchant configuration

CapabilitySupportNotes
Full void (auth reversal)A full void cancels an authorized transaction before settlement. For more information, see the documentation for voids for Braintree SDK or GraphQL.
Partial void
Void on settled transactionUse a refund instead.
Full refundRefunds cannot exceed the settled amount. For more information about refunds, see the applicable refund documentation for Braintree SDK or GraphQL.
Partial refundEach partial refund creates an independent refund transaction. You can perform multiple partial refunds.
Multiple refundsEach refund receives its own transaction ID.
Blind creditsA refund must reference the original transaction.

Payment instruments and methodsAnchorIcon

The following table describes support for payment instruments and methods with this integration.

Legend: ✅ Supported | ❌ Not supported | ⚠️ Conditional or varies by merchant configuration

CapabilitySupportNotes
Credit cardsThis integration supports these credit cards: Visa, Mastercard, Verve, American Express, Discover, and Afrigo. For regional, configuration-dependent card brand availability, contact Flutterwave.
Debit cardsWhere the acqiring network supports debit cards, this integration supports these cards: Visa Debit, Mastercard Debit, and Verve Debit.
Prepaid cards⚠️The support for prepaid cards depends on your configuration and region.
PLCCs
Gift cards
Apple Pay
Google Pay
Venmo or PayPal

Data, descriptors, and fraud signalsAnchorIcon

The following table describes support for data, descriptors, and fraud signals with this integration.

Legend: ✅ Supported | ❌ Not supported | ⚠️ Conditional or varies by merchant configuration

CapabilitySupportNotes
Network tokens
Card Verification Value (CVV) response handlingEnsure that CVV match and no-match codes are returned and that they map to standard Braintree CVV response codes.
Address Verification System (AVS) response handlingThis integration does not return AVS.
Dynamic descriptors
Level II or Level III data
3D Secure (3DS)

VerificationsAnchorIcon

The following table describes support for verifications with this integration.

Legend: ✅ Supported | ❌ Not supported | ⚠️ Conditional or varies by merchant configuration

CapabilitySupportNotes
$0 verificationBraintree sends $0 verification to Flutterwave as a VERIFY operation.
Non-zero verificationBraintree passes the non-zero verification amount to Flutterwave for the verification.
VoidCardVerificationVoidCardVerification always returns VOIDED immediately, without making a network call.

Before you beginAnchorIcon

Integrating Flutterwave with Braintree requires configuration in both:

  • In Braintree: To process card transactions through Flutterwave, you need a Braintree merchant account that you configure for the Flutterwave connector. For help with setting up this account and securely storing your credentials, contact your Braintree account manager (AM) or technical account manager (TAM).
  • In Flutterwave: To obtain access to Flutterwave's card-direct API, contact Flutterwave. When your account is provisioned, Flutterwave provides a merchant username and password for the sandbox and production environments. To securely share these credentials with Braintree, work with your Braintree AM or TAM.
For more information that could affect your integration, see Known limitations and Supported currencies.

TransactionsAnchorIcon

The following topics describe the requirements for this integration.

For general information about Braintree transactions, see:

Transaction creationAnchorIcon

When you create a transaction, include the required fields and any optional fields that are appropriate for your use case.

The following table lists the fields that transactions require.

FieldLocationHow to provideNotes
amountTransactionIn transactionTransaction amount in the currency's standard decimal format
currencyIsoCodeTransactionIn transactionISO 4217 currency code (for example, USD, GBP, CAD, NGN, GHS, ZAR)

For the full list of supported currencies, see Supported currencies.
paymentMethod.numberPayment methodDuring tokenizationRaw card number, mapped to Flutterwave test cards in the sandbox evironment
paymentMethod.expirationMonthPayment methodDuring tokenizationTwo-digit expiration month (MM)
paymentMethod.expirationYearPayment methodDuring tokenizationFour-digit expiration year (YYYY)

Note: Braintree sends only the last 2 digits to Flutterwave.
paymentMethod.cvvPayment methodDuring tokenization(Optional) Card security code

Note: Braintree sends an empty string if this data is not present (for example, for recurring transactions).

For more information, see CVV handling.

Fields that Braintree passes to FlutterwaveAnchorIcon

The following tables list the fields Braintree passes to Flutterwave for each operation.

Authorize, charge, and verify cardAnchorIcon

The following table lists the fields that Braintree passes to Flutterwave for authorization, charge, and verification purposes.

Braintree fieldFlutterwave fieldRequiredNotes
amountorder.amount / transaction.amountPassed as-is
currencyIsoCodeorder.currency / transaction.currencyPassed as-is
orderIdorder.reference, transaction.reference
The Braintree order ID, if provided
paymentMethod.numbersourceOfFunds.provided.card.numberTest card remapping that is applied in the sandbox and development environments
paymentMethod.expirationMonthsourceOfFunds.provided.card.expiry.monthPassed as-is
paymentMethod.expirationYearsourceOfFunds.provided.card.expiry.yearBraintree sends only the last 2 digits. For example, for 2027, Braintree sends 27.
paymentMethod.cvvsourceOfFunds.provided.card.securityCode
Braintree sends an empty string if this data is not present.

For more information, see CVV handling.

CaptureAnchorIcon

The following table lists the fields that Braintree passes to Flutterwave for capturing transactions.

Braintree fieldFlutterwave fieldRequiredNotes
amounttransaction.amountMust not exceed the originally authorized amount
currencyIsoCodetransaction.currencyMust match the currency of the original authorization
orderIdorder.reference, transaction.reference
The Braintree order ID
originResponse.idURL path orderIdThe Flutterwave order ID from the Authorize response

RefundAnchorIcon

The following table lists the fields that Braintree passes to Flutterwave for refunds.

Braintree fieldFlutterwave fieldRequiredNotes
amounttransaction.amountMust not exceed the settled amount
currencyIsoCodetransaction.currencyMust match the currency for the original transaction
orderIdorder.reference, transaction.reference
The Braintree order ID
originalTransaction.originResponse.idURL path orderIdThe Flutterwave order ID from the original transaction

VoidAnchorIcon

The following table lists the fields that Braintree passes to Flutterwave for voided transactions.

Braintree fieldFlutterwave fieldRequiredNotes
originResponse.idURL path orderIdThe Flutterwave order ID from the Authorize response
orderIdtransaction.referenceThe Braintree order ID

Customer creationAnchorIcon

Creating a customer is optional for the Flutterwave integration. To create a customer, you can use either the Braintree SDKs or the GraphQL API. For more information, see the customer creation guide (SDK) or the customer creation guide (GraphQL).

Vaulted payment methodsAnchorIcon

Vaulting a tokenized payment method creates an entity that can be authorized or charged multiple times. A tokenized payment method also can be vaulted during authorization. For more information, see the vault guide (SDK) or the vault guide (GraphQL).

CVV handlingAnchorIcon

For merchant-initiated transactions, such recurring transactions, or when using vaulted cards, Braintree does not send the CVV to Flutterwave. Instead, Braintree sends an empty string (""). While Flutterwave accepts transactions without CVV, some card issuers might decline these transactions.

Supported transaction operationsAnchorIcon

The following table lists the transaction operations that the Flutterwave integration supports.

OperationSupported
Sale (Authorize or Charge)
Void
Refund
Submit for Settlement (Capture)
Find or Search
Clone
Adjust Authorization
Hold in Escrow
Release from Escrow
Submit for Partial Settlement
Cancel Release

Transaction status mappingAnchorIcon

The following table maps Flutterwave results to Braintree transaction statuses. For general information about Braintree result objects, see result objects.

OperationFlutterwave resultBraintree transaction statusAdditional information
AuthorizeSUCCESSAUTHORIZEDAuthorization places a hold on funds
AuthorizeFAILURE (acquirer code 68 or BB)FAILEDTreated as a system-level failure, not a soft decline
AuthorizeFAILURE (other codes)PROCESSOR_DECLINEDHard decline from the acquirer
AuthorizeERRORFAILEDGateway-level error from Flutterwave (for example, validation failure or server error)
CaptureSUCCESSSETTLEDSynchronous capture is confirmed.
CaptureFAILURESETTLEMENT_DECLINEDA hard decline that occurs during capture
CaptureERROR (voided auth)VOIDEDAuthorization was voided before capture, indicated by an error message that contains  "been voided"
CaptureERROR (retryable)SETTLINGRetryable gateway error (SERVER_BUSY, SERVER_FAILED, or unrecognized error cause)
CaptureERROR (non-retryable)SETTLEMENT_DECLINEDPermanent failure
RefundSUCCESSSETTLEDRefund confirmed synchronously
RefundFAILURESETTLEMENT_DECLINEDRefund declined by the acquirer
RefundERROR (retryable)SETTLINGRetryable gateway error (SERVER_BUSY, SERVER_FAILED, or unrecognized error cause)
RefundERROR (non-retryable)SETTLEMENT_DECLINEDPermanent refund failure
VoidSUCCESSVOIDEDAuthorization successfully cancelled
VoidFAILUREFAILEDVoid declined
VoidERRORFAILEDGateway-level error from Flutterwave
VerifyCardSUCCESSVERIFIEDCard is valid
VerifyCardFAILUREPROCESSOR_DECLINEDCard declined during verification
VerifyCardERRORFAILEDGateway-level error from Flutterwave
VoidCardVerificationAnyVOIDED

SETTLING status and reconciliationAnchorIcon

In rare cases, Flutterwave may return a retryable error (SERVER_BUSY, SERVER_FAILED, or an unrecognized error cause) after an otherwise-valid capture or refund request. When this occurs, the transaction is placed in SETTLING and Braintree automatically polls Flutterwave for the actual outcome.

Reconciliation behavior varies by operation:

  • Capture reconciliation: If Flutterwave has not yet processed the capture (transaction still in AUTHORIZATION), returns AUTHORIZED for another reconciliation cycle. If the authorization was voided before capture, returns VOIDED.
  • Refund reconciliation: Queries use the compound orderId|transactionId from the refund's origin response.

Possible outcomes after reconciliation:

  • Flutterwave confirms success → status changes to SETTLED.
  • Flutterwave returns a 4xx error → status changes to SETTLEMENT_DECLINED.
  • Flutterwave returns a 5xx error → status remains SETTLING for another reconciliation cycle.

Do not ship goods or provide services until the transaction status has transitioned to SETTLED. Do not build a duplicate capture or refund retry loop when you see SETTLING.

Charge operationsAnchorIcon

Charge for Flutterwave is dual-step. Braintree first performs an authorization and then immediately captures it. The resulting transaction status follows the same outcomes as Capture. For more information, see Transaction status mapping.

RetriesAnchorIcon

Do not implement a retry loop when you observe success: true with a status of SETTLING. Braintree handles reconciliation automatically. Always check transaction status before fulfilling an order.

If your request times out or you are unsure whether a transaction was created, query the transaction using Find or Search with your internal transaction reference before attempting a second create.

Retry behavior on FAILED authorization can be configured at the Merchant Account ID (MAID) level. To enable automatic retries, contact your Braintree AM or TAM.

Response codesAnchorIcon

Flutterwave uses ISO 8583-style two-digit acquirer codes for declines. Braintree maps these to standardized Braintree response codes. When a Flutterwave acquirer code is not present in the mapping, Braintree surfaces the raw acquirer code and message in the additionalProcessorResponse field.

To query for the Flutterwave raw response message, use:

  • SDK:additional_processor_response. For more information, see the core documentation.
  • GraphQL:PaymentStatusEvent.processorResponse.additionalInformation. For more information, see the core documentation.

CVV response code mappingAnchorIcon

The following table maps Flutterwave CVV codes to their Braintree equivalents.

Flutterwave CVV codeFlutterwave messageBraintree CVV codeBraintree message
MMATCHMCVV matches
NNO_MATCHNCVV is not verified
PNOT_PROCESSEDUCVV is not verified
SNOT_PRESENTICVV not provided
UNOT_SUPPORTEDSIssuer does not participate
XNOT_PROCESSEDUCVV skipped

Failure response code mappingAnchorIcon

The following table maps Flutterwave acquirer failure codes to their Braintree equivalents. If a Flutterwave acquirer code is not in this list, Braintree passes through the raw code and message in the additionalProcessorResponse field without a mapped genericResponseCode.

Flutterwave codeFlutterwave messageBraintree codeBraintree message
03Invalid Merchant2026Invalid Merchant ID
04Pick Up Card2047Call Issuer. Pick Up Card
05Do Not Honour2000Do Not Honor
06Error2005Invalid Credit Card Number
07Pick Up Card, Special2047Call Issuer. Pick Up Card
08Honour With Identification1001Approved, check customer ID
09Request In Progress2105Processor Declined
10Approved For Partial Amount1004Approved for Partial Amount
11Approved, VIP1000APPROVED
12Invalid Transaction2019Invalid Transaction
13Invalid Amount2048Invalid Amount
14Invalid Card Number2005Invalid Credit Card Number
15No Issuer2009No Such Issuer
16Approved, Update Track 31000APPROVED
19Re-enter Last Transaction3000Processor Network Unavailable – Try Again
21No Action Taken2034No Action Taken
22Suspected Malfunction2034No Action Taken
23Unacceptable Transaction Fee2034No Action Taken
25Unable to Locate Record On File2009No Such Issuer
30Format Error2005Invalid Credit Card Number
31Bank Not Supported By Switch2025Bank Not Supported By Switch
33Expired Card, Capture2004Expired Card
34Suspected Fraud, Retain Card2014Processor Declined – Fraud Suspected
35Card Acceptor, Contact Acquirer, Retain Card2047Call Issuer. Pick Up Card
36Restricted Card, Retain Card2047Call Issuer. Pick Up Card
37Contact Acquirer Security Department, Retain Card2047Call Issuer. Pick Up Card
38PIN Tries Exceeded, Capture2103PIN try exceeded
39No Credit Account2050Invalid Credit Plan
40Function Not Supported2019Invalid Transaction
41Lost Card2012Processor Declined – Possible Lost Card
42No Universal Account2019Invalid Transaction
43Stolen Card2013Processor Declined – Possible Stolen Card
44No Investment Account2019Invalid Transaction
51Insufficient Funds2001Insufficient Funds
52No Cheque Account2007No Account
53No Savings Account2007No Account
54Expired Card2004Expired Card
55Incorrect PIN2102Incorrect PIN
56No Card Record2007No Account
57Function Not Permitted to Cardholder2019Invalid Transaction
58Function Not Permitted to Terminal2019Invalid Transaction
59Suspected Fraud2014Processor Declined – Fraud Suspected
60Acceptor Contact Acquirer2019Invalid Transaction
61Exceeds Withdrawal Limit2002Limit Exceeded
62Restricted Card2057Issuer or Cardholder has put a restriction on the card
63Security Violation2021Security Violation
64Original Amount Incorrect2048Invalid Amount
66Acceptor Contact Acquirer, Security2021Security Violation
67Capture Card2014Processor Declined – Fraud Suspected
75PIN Tries Exceeded2103PIN try exceeded
82CVV Validation Error2010Card Issuer Declined CVV
90Cutoff In Progress2104Offline Issuer Declined
91Card Issuer Unavailable2104Offline Issuer Declined
92Unable To Route Transaction2105Processor Declined
93Cannot Complete, Violation Of The Law2020Violation
94Duplicate Transaction2016Duplicate Transaction
96System Error2034No Action Taken
RF1Invalid Refund2019Invalid Transaction
RF2Transaction ID must be unique2019Invalid Transaction

TestingAnchorIcon

Braintree provides a set of test card numbers for sandbox testing. With the Flutterwave integration, certain Braintree test card numbers are automatically remapped to Flutterwave test card numbers to support end-to-end sandbox testing. In production, Braintree sends card numbers to Flutterwave directly (without modification).

Test card mappingsAnchorIcon

Card brandBraintree test numberFlutterwave test numberAutomatically mapped?
Visa (decline)40001111111111154012000033330026
Mastercard (decline)51051051051051005111111111111118
Mastercard (approve)55555555555544445111111111111118
Visa (approve)40128888888818814012000033330026

Expiration date-controlled outcomesAnchorIcon

The expiration date you provide determines the outcome from Flutterwave for mapped test cards. Use the combinations that are in the following tables when you test your integration in the sandbox environment.

Mastercard (5105105105105100 → 5111111111111118)AnchorIcon

Expiry monthExpiry yearFlutterwave response
012039APPROVED
052039DECLINED (Do Not Honor)
042027EXPIRED_CARD
082028TIMED_OUT
012037ACQUIRER_SYSTEM_ERROR
022037UNSPECIFIED_FAILURE
052037UNKNOWN

Visa (4000111111111115 → 4012000033330026)AnchorIcon

Expiry monthExpiry yearFlutterwave response
012039APPROVED
052039DECLINED (Do Not Honor)
042027EXPIRED_CARD
082028TIMED_OUT
012037ACQUIRER_SYSTEM_ERROR
022037UNSPECIFIED_FAILURE
052037UNKNOWN

Known limitationsAnchorIcon

Review the following known behaviors and limitations before processing transactions through Flutterwave.

  • Duplicate transaction reference handling: If Flutterwave returns INVALID_REQUEST with a message about "Merchant Transaction Reference must be set to a unique value," the error is treated as retryable (SETTLING). This can occur during the propagation delay between when a Flutterwave merchant account is provisioned and when it is fully active.
  • CVV not sent for recurring or vaulted transactions: When a vaulted card is used for a subsequent transaction (for example, a subscription renewal), the CVV is not available. The connector sends an empty string.
  • No 3DS, network token, or AVS support: This integration does not support 3DS data pass-through, network tokens (Braintree-managed or bring-your-own), or AVS response fields. If your use case requires any of these, contact your TAM to discuss alternative integration options.

Supported currenciesAnchorIcon

The Flutterwave connector supports the following currencies: GBP, CAD, XAF, CLP, COP, EGP, EUR, GHS, GNF, KES, MWK, MAD, NGN, RWF, SLL, STD, ZAR, TZS, UGX, USD, XOF, ZMW.

The following resources provide additional information about the Flutterwave integration and Braintree platform: