Best Practices

As a developer or business integrating Flutterwave to receive payments, it's important to follow best practices to maintain reliability, security, and compliance. Here are some key guidelines:
Payments
Receiving Customer Payments
-
Always verify the payment before giving value. Confirm the
amount
,currency
,transaction reference
and customer details. -
Implement webhooks to handle transaction updates reliably.
-
When checking transaction status, make sure you're not hitting rate limits.
Making Payments
- For USSD and transfer payments, use webhooks to confirm payment completion.
Error Handling
-
Handle edge cases carefully by giving value or rendering service only on definite API responses.
-
Catch all errors and show user-friendly, general messages when necessary.
Validating webhooks
- Set a signature from your dashboard under Settings > Webhooks to verify all incoming webhooks.
Security
API Management
Verify that your app meets the following requirements for managing your API keys:
- Never hardcode API credentials in your codebase.
- Only initiate token-protected API calls from your backend, not from the client (browser or mobile app).
- Store credentials in environment variables or use a secrets manager.
Authentication
- Enforce strong password policies (e.g., minimum 8 characters, including uppercase, lowercase, numbers, and symbols).
- Use input validation during login.
- Prevent brute-force attacks using rate limits, account lockouts, and two-factor authentication.
- Store database credentials securely, preferably using a secrets manager.
Cookie Management
- Set all app session cookies with
Secure
andHttpOnly
attributes. - On logout, terminate the session on the server and clear client-side session tokens to prevent caching.
- Store session tokens in cookies and transport them only via HTTP cookie headers.
Session Management
- Set session timeouts on the server.
- Limit session duration to a maximum of 10 hours, after which re-authentication is required.
- Implement idle timeouts.
- Prevent concurrent sessions.
- Use a cryptographically secure random number generator for session tokens.
Session Termination
- Provide a clearly accessible logout option to terminate user sessions.
- Invalidate sessions on the server during logout.
- Destroy all session tokens on logout to make them unusable.
Handling Sensitive Information
- Use secure channels (
TLS 1.2
orTLS 1.3
) for key exchange. - Limit storage and transmission of sensitive data. Use abstract identifiers where possible.
- Encrypt sensitive data at rest.
Error Handling and Accountability
- Log all privileged changes and administrative/user activities.
- Log all access to sensitive data.
- On unhandled exceptions, show a generic message to users. Never expose internal details like database errors or server traces.
- Store logs securely and follow global log retention standards.
Input and Output Forms
- Validate all inputs on the server side, even if already validated on the client.
- Encode all outputs.
- Proper validation and encoding protect your application against stored and reflected cross-site scripting (XSS) in headers, cookies, form fields, query strings, and hidden fields.
- Use character whitelists for user inputs.
- Validate uploaded files thoroughly.
- Use parameterized SQL queries to prevent SQL injection.
Application Server
- Disable caching for SSL pages and any page with sensitive data. Use
Cache-Control: no-cache
orno-store
instead ofprivate
. - Keep OS, web server, and app server security patches up to date.
- Only support TLS 1.2 or higher.
- Enforce HTTPS across all pages and endpoints.
- Disable
TRACE
and other unnecessary HTTP methods on your web server.
Vulnerability and Security Assessment
Your application should be protected against common security risks, including:
- Cross-Site Request Forgery (CSRF)
- Reflected and Stored Cross-Site Scripting (XSS)
- SQL Injection
- XML Injection
Updated about 10 hours ago