# Authentication
Source: https://docs.spotflow.one/api-reference/authentication
Secure authentication is crucial for protecting your account and ensuring authorized access. All API requests require authentication with your secret key, kindly include it in the `Authorization` header for secure access.
### API Key Management
Spotflow provides two types of API keys for different use cases: public keys and secret keys. You can manage these keys from your Spotflow dashboard.
* **Public Keys (pk\_test\_ for test mode, pk\_live\_ for live mode)**: Primarily used for client-facing integrations such as frontend applications, Spotflow Inline, and Mobile SDKs. These keys are designed to initiate payment collections but cannot modify account settings or access sensitive data. Public keys are safe to expose in client-side code.
* **Secret Keys (sk\_test\_ for test mode, sk\_live\_ for live mode)**: Used exclusively for server-to-server communications and backend integrations. These keys grant full access to your account and must be kept confidential. Never share your secret keys in public locations like code repositories (GitHub), client-side code, or other unsecured environments.
### Authentication Process
All server-side API requests to Spotflow must be authenticated using your secret key. Here's how to authenticate:
* **Include your secret key** in the Authorization header of every request using the Bearer token format.
* **HTTPS is mandatory**: All API requests must be made over HTTPS for secure communication. Requests made over plain HTTP will fail.
* **Authentication Failure**: Calls made without proper authentication will result in a 401 Unauthorized status code response from the API.
Secure your API requests by including an Authorization header in the following format:
`Authorization: Bearer SECRET_KEY`
```yaml theme={null}
{
"Authorization": "Bearer sk_test_6988f8d1539a48ab945764ec361fa3eb"
}
```
To test functionalities specific to your account, you'll need to replace this sample key with your own.
By following these guidelines, you can ensure secure and authorized access while integrating with Spotflow's APIs.
# Create Virtual Account
Source: https://docs.spotflow.one/api-reference/dynamic-accounts/create-dynamic-account
openapi.json POST /virtual-accounts/temporary
Virtual accounts don't act as independent money storage - they simply channel incoming payments straight to your account. These accounts cannot process outgoing payments or be linked to payment terminals. Since virtual accounts do not serve as containers for funds, there's no need for BVN verification during setup.
## Adding Test Funds
On test mode with your test keys, you can easily add fake funds to the jollof bank account number created for you using our [Funds Simulator App](https://d2i9iv7q8xti2t.cloudfront.net/). Note that this is for NGN and GHS only.
See the full guide on [Adding Fake Funds For Testing](/expert-desk/simulating-funds).
# Get Virtual Account by ID
Source: https://docs.spotflow.one/api-reference/dynamic-accounts/dynamic-account-id
openapi.json GET /virtual-accounts/{id}
Get details of your created virtual account by its ID.
# Get All Virtual Accounts
Source: https://docs.spotflow.one/api-reference/dynamic-accounts/list-dynamic-account
openapi.json GET /virtual-accounts
This retrieves and lists all the active virtual accounts you created.
# Error Codes
Source: https://docs.spotflow.one/api-reference/error-codes
Ran into an error? Don't worry—we've got you covered. This page lists all known error codes along with simple explanations and fixes to get you back on track.
### Spotflow API Response Codes
Spotflow leverages standardized HTTP response codes to consistently communicate the outcome of your API requests. Understanding these codes is essential for interpreting the success or failure of your interactions with the Spotflow platform.
Success (2xx)
* **200 OK**: The request was processed successfully. **Don't assume everything went as planned!** Always examine the response data object to determine the specific outcome (e.g., successful or failed charge). Even a 200 response might indicate an error within the data object.
* **201 Created**: A new resource was created successfully through your request. This typically occurs when creating new entities like users or payment collections within your Spotflow account.
Client Errors(4xx)
* **400 Bad Request**: The request failed due to invalid or missing required parameters. Double-check your request to ensure all required parameters are present and formatted correctly.
* **401 Unauthorized**: Authentication failed. This could be caused by an invalid or missing secret key in the authorization header. Make sure you're using the correct secret key associated with your Spotflow account and that it's included in the authorization header of your request.
* **403 Forbidden**: The API key you used doesn't have the required permissions to perform the specific action. Spotflow utilizes a permission-based system for API keys, where each key type grants access to a defined set of functionalities. Ensure you're using a key with the appropriate permissions for the action you're trying to execute.
* **404 Not Found**: The requested resource does not exist on the Spotflow platform. This might occur if you're trying to access a user ID that doesn't exist or referencing an incorrect endpoint URL.
* **429 Too Many Requests**: The API received an excessive number of requests from your application in a short period. This might indicate an issue with your integration logic or excessive retries. We recommend implementing exponential backoff for your requests to avoid overwhelming the API and encountering this error.
Server Error (5xx)
* **500, 502, 503, 504**: These codes indicate errors on Spotflow's servers. While uncommon, please report any instances of these errors you encounter to [support@spotflow.one](mailto:support@spotflow.one). We will work to resolve the issue on our end as soon as possible.
## Error Handling
Beyond the HTTP status codes, Spotflow's API responses may also include specific error types and messages to provide more details about the encountered issue. This section provides guidance on handling various error conditions that you might encounter while interacting with Spotflow's API. Understanding these errors and their potential solutions is crucial for building robust integrations, as it can help you pinpoint the exact cause of the problem and implement appropriate solutions.
### General Error Handling:
* **Uncertain Outcomes**: For certain error types (e.g., connection errors), the outcome of the API call might be unclear. In such cases, don't assume success or failure.
* **Webhooks**: Spotflow utilizes webhooks to notify you about events and actions. Relying on webhooks can provide valuable information about the eventual outcome of an API call, even if the initial request encounters an error due to network issues or other transient problems.
### Specific Error Types
Here's a breakdown of common Spotflow API error types and recommended solutions:
| Error Type | Description | Solutions |
| :--------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Invalid Request Errors, `(Spotflow:: InvalidRequestError)` | This error indicates a problem with the structure or content of your request. It could be due to invalid parameters, incorrect formatting, or attempting an action in an invalid state. The error response will typically include a specific error code and message to help you diagnose the issue. | Consult the Spotflow API documentation for detailed information on specific error codes and how to resolve them. |
| Connection Errors `(Spotflow::APIConnectionError)` | Network issues between your server and Spotflow can sometimes cause connection errors. In such cases, the outcome of the API call is indeterminate. You cannot rely on the response to indicate success or failure. |
**Listen for webhook notifications**: Spotflow utilizes webhooks to notify you about events and actions. If a connection error occurs during an operation, you might still receive a webhook notification informing you of the eventual outcome.
**Idempotency Key**: When creating or updating resources, use idempotency keys. This enables you to safely retry the request using the same key in case of connection failures, preventing unintended duplicate actions caused by retries
|
| API Errors `(Spotflow::APIError)` | These errors, while uncommon, indicate issues on Spotflow server. |
**Consider the outcome** of the request as inconclusive
**Utilize webhooks** to gain insights into the eventual outcome of the operation.
**Refer to our guide** on server errors within the Spotflow documentation for strategies on handling unexpected situations.
|
| Authentication Errors `(Spotflow::AuthenticationError)` | These errors occur when Spotflow cannot authenticate your request using the provided credentials. |
**Verify that you're using** the correct API key associated with your Spotflow account.
**Verify that your request** contains a valid, active API key within the authorization header.
|
| Permission Errors `(Spotflow::PermissionError)` | These errors indicate that the API key used lacks the necessary permissions for the attempted action. |
**Double-check if you're using a restricted API** key that doesn't have access to the requested service.
**If working within the Spotflow dashboard**, ensure your user role has the required permissions to perform the action.
|
| Rate Limit Errors `(Spotflow::RateLimitError)` | These errors occur when your application makes excessive API calls withtin a short period |
**Retry the API call** after a reasonable delay if a single request triggers this error.
**Contact Spotflow support in advance** if you anticipate a significant increase in API traffic and require a higher rate limit.
|
By understanding these error types and implementing the recommended solutions, you can build more resilient and informative integrations with Spotflow API.
# Introduction
Source: https://docs.spotflow.one/api-reference/introduction
Spotflow is your global Merchant of Record (MoR) that simplifies payment processing for businesses worldwide. We handle everything from global payment acceptance to compliance and settlement — empowering merchants to go global effortlessly. Learn how to easily integrate our APIs to streamline your in-app payments.
Spotflow API helps global merchant collect payments in local currency. Learn how to easily integrate our APIs to streamline your in-app payments.
Spotflow API is designed to be `RESTful`, utilizing familiar resource structures for most interactions. However, there might be a few exceptions from the strict REST principles for specific functionalities. These exceptions will be clearly documented within the API reference. This means you can expect:
* **Predictable Resource-Oriented URLs**: URLs are designed to be clear and intuitive, reflecting the resources you're interacting with (e.g., /payments, /plans).
* **Form-Encoded Request Bodies**: Data sent to the API uses a simple, well-understood format called form-encoded data.
* **JSON-Encoded Responses**: Our API returns data in JSON response format, providing structured and easy-to-parse data.
* **Standard HTTP Methods and Response Codes**: Our API utilizes standard HTTP verbs for different actions like GET for retrieving data, POST for creating new resources, PUT for updating existing ones and DEL for trashing existing ones. It also returns standard HTTP response codes to indicate success or failure (e.g., 200 for success, 400 for bad request).
* **Content-Type**: When sending request to the API, you should ensure your request includes a Content-Type header set to application/JSON. This informs the API about the format of the data you are sending.
### API Keys and Authentication:
To ensure secure communication with Spotflow APIs, you'll need to authenticate your requests using an API key. All endpoints access requires authentication with your API Keys. Your API key acts as a unique identifier for your application and allows us to differentiate between test and live mode usage. Specific instructions for including your API key within your requests will be provided in the documentation for each API endpoint. Your API Keys can be found on the API Keys and webhooks section of your dashboard.
# Authorize Payment
Source: https://docs.spotflow.one/api-reference/payments/authorize-collection
post /payments/authorize
This authorizes a payment by pre-approving the transaction before final validation. Authorization required could be PIN, OTP, 3DS, AVS, etc.
# Create Payment
Source: https://docs.spotflow.one/api-reference/payments/create-collection
post /payments
If you have PCI-DSS certification, use this endpoint to collect payments using different payment methods. Note that for card payments, you'll use the authorize endpoint to input either the OTP or PIN.
## Adding Test Funds
On test mode with your test keys, you can easily add fake funds to the jollof bank account number created for you using our [Funds Simulator App](https://d2i9iv7q8xti2t.cloudfront.net/). Note that this is for NGN and GHS only.
See the full guide on [Adding Fake Funds For Testing](/expert-desk/simulating-funds).
# Get Payment
Source: https://docs.spotflow.one/api-reference/payments/fetch-collection
get /payments/{payment-id}
Get details of a specific payment by its ID
# Initialize Payment
Source: https://docs.spotflow.one/api-reference/payments/initialize-collection
post /payments/initialize
This is Spotflow's Redirect Checkout. Initiate a payment request to generate a unique payment reference, payment code and checkout URL for your customers
## Adding Test Funds
On test mode with your test keys, you can easily add fake funds to the jollof bank account number created for you using our [Funds Simulator App](https://d2i9iv7q8xti2t.cloudfront.net/). Note that this is for NGN and GHS only.
See the full guide on [Adding Fake Funds For Testing](/expert-desk/simulating-funds).
## Mobile Money
When `channel` is set to `mobile_money` and a `planId` is included, Spotflow will automatically send a mandate approval request to the customer's phone. The subscription will only activate once the mandate is approved.
See the full guide on [Mobile Money Subscriptions](/features/mobile-money-subscriptions).
# List Payments
Source: https://docs.spotflow.one/api-reference/payments/list-collection
get /payments
Get details of all payments collection done via your keys.
# Verify Payment
Source: https://docs.spotflow.one/api-reference/payments/verify-collection
get /payments/verify
Confirm the status of a payment
# Activate Plan
Source: https://docs.spotflow.one/api-reference/subscription-plans/activate-plan
openapi.json POST /plans/{plan-id}/activate
Activate a subscription with the plan Id.
# Cancel Plan
Source: https://docs.spotflow.one/api-reference/subscription-plans/cancel-plan
openapi.json POST /plans/{plan-id}/cancel
Cancel a subscription with the plan Id.
# Create Bulk Plans
Source: https://docs.spotflow.one/api-reference/subscription-plans/create-bulk-plan
openapi.json POST /bulk-plans
Create multiple subscription plans under your integration.
### Required Fields in CSV File
| Field | Type | Description |
| ------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------- |
| `title` | string | Name/Title of plan |
| `frequency` | string | This simply means how often. Valid frequencies are: daily, weekly, monthly, quarterly, biannually (every 6 months), annually. |
| `amount` | interger | Amount should be in the subunit of our supported currency i.e your local currency or USD. |
| `currency` | string | Currency code (e.g., NGN, USD). |
| `internalReference` | string | A unique reference number generated by your company to identify each customer. |
| `pricingOptions` | string | Specify one or more amount or currency for your payment plan. |
# Create Single Plan
Source: https://docs.spotflow.one/api-reference/subscription-plans/create-single-plan
openapi.json POST /plans
Create a subscription plan under your integration.
## Mobile Money
When `channel` is set to `mobile_money` and a `planId` is included, Spotflow will automatically send a mandate approval request to the customer's phone. The subscription will only activate once the mandate is approved.
See the full guide on [Mobile Money Subscriptions](/features/mobile-money-subscriptions).
# Get All Plans
Source: https://docs.spotflow.one/api-reference/subscription-plans/fetch-plan
openapi.json GET /plans
This retrieves and lists all subscription plans available on your integration.
# Get Single Plan
Source: https://docs.spotflow.one/api-reference/subscription-plans/list-single-plan
openapi.json GET /plans/{plan-id}
Retrieve details of a single subscription plan available on your integration.
# Update Plan
Source: https://docs.spotflow.one/api-reference/subscription-plans/update-plan
openapi.json POST /plans/{plan-id}
Update the details of an existing subscription plan
# Get All Subscriptions
Source: https://docs.spotflow.one/api-reference/subscriptions/list-subscriptions
openapi.json GET /subscriptions
Retrieve details of all subscriptions.
# Activate Subscription
Source: https://docs.spotflow.one/api-reference/subscriptions/subscription-activate
openapi.json POST /subscriptions/{subscription-id}/activate
Activate a subscription with the plan Id.
# Subscriptions by plan
Source: https://docs.spotflow.one/api-reference/subscriptions/subscription-by-plan
openapi.json GET /plans/{plan-id}/subscriptions
Retrieve details of all subscriptions associated with a customer's plan ID.
# Cancel Subscription
Source: https://docs.spotflow.one/api-reference/subscriptions/subscription-cancel
openapi.json POST /subscriptions/{subscription-id}/cancel
Cancel a subscription with the plan Id.
# Get Subscriptions Details
Source: https://docs.spotflow.one/api-reference/subscriptions/subscription-details
openapi.json GET /subscriptions/{subscription-id}
This is the unique ID of the subscription or customer you want to fetch.
# Create a New Tax Setting
Source: https://docs.spotflow.one/api-reference/tax-collections-configuration/create-tax
openapi.json POST /tax-configurations
Create a new tax rule to an approved country. You can set this up as a fixed flat fee or a percentage-based charge.
# Get Tax Settings by Country/Region
Source: https://docs.spotflow.one/api-reference/tax-collections-configuration/get-tax-region
openapi.json GET /tax-configurations
Returns a list of all custom tax rules and rates configured for a specific country.
# Check Tax Activation Status
Source: https://docs.spotflow.one/api-reference/tax-collections-configuration/get-tax-status
openapi.json GET /merchant/tax-status
According to your request made, checks if your merchant account has been authorized by Spotflow to collect regional checkout taxes.
# Start or Stop Charging a Tax
Source: https://docs.spotflow.one/api-reference/tax-collections-configuration/toggle-tax-status
openapi.json PUT /tax-configurations/{id}/status
Changes the status of a tax rule. Set to `active` to start charging your customers during checkout, or `inactive` to pause it.
# Edit Tax Details
Source: https://docs.spotflow.one/api-reference/tax-collections-configuration/update-tax
openapi.json PUT /tax-configurations/{id}
Updates the display name, amount, or maximum cap limit for an existing tax rule.
# Get Bulk Disbursement By Its Categories
Source: https://docs.spotflow.one/api-reference/transfer-api/bulk-transfer-categories
openapi.json GET /transfers/bulk/categories
Get details of an uploaded bulk disbursement by the categories you created with.
# Get Bulk Disbursement By ID
Source: https://docs.spotflow.one/api-reference/transfer-api/bulk-transfer-id
openapi.json GET /transfers/bulk/{id}
Get details of an uploaded bulk disbursement by its id.
# Get All Bulk Disbursements
Source: https://docs.spotflow.one/api-reference/transfer-api/bulk-transfers
openapi.json GET /transfers/bulk
Get details of all bulk disbursements files you have uploaded.
# Get Bulk Disbursements By ID
Source: https://docs.spotflow.one/api-reference/transfer-api/bulk-transfers-by-id
openapi.json GET /transfers/bulk/{id}/transfers
Fetch all transfer details present in a bulk disbursements file by its specific id to know the status of each transaction.
# Create Bulk Disbursement
Source: https://docs.spotflow.one/api-reference/transfer-api/create-bulk-transfer
openapi.json POST /transfers/bulk
You can use this endpoint to perform bulk bank account transfer to multiple bank accounts.
# Create Single Bank Disbursement
Source: https://docs.spotflow.one/api-reference/transfer-api/create-single-transfer
openapi.json POST /transfers
Use this endpoint to perform payouts for currencies - NGN, GHS mobile money and bank accounts transfer using the bank code from our Get All Banks endpoint
# Get All Banks
Source: https://docs.spotflow.one/api-reference/transfer-api/list-banks
openapi.json GET /transfers/banks/{currency}
Get details of all banks, their names and bank codes. Currently, this is for NGN and GHS only. For NGN currency, It also returns a metadata field where the NIBSS & NIP/CBNCode is seen for banks that have it.
# Get Transfer By Reference
Source: https://docs.spotflow.one/api-reference/transfer-api/transfer-by-reference
openapi.json GET /transfers/reference/{reference}
Get details of a particular transfer by its reference id.
# Resolve Bank Account
Source: https://docs.spotflow.one/api-reference/transfer-api/transfer-resolve-account
openapi.json GET /transfers/resolve-account
Get/Validate A Specific Account Number and Bank Code with its details i.e the account name
# Validate Bulk Disbursements File
Source: https://docs.spotflow.one/api-reference/transfer-api/validate-bulk-transfer
openapi.json POST /transfers/bulk/validate
Use this endpoint to confirm your bulk disbursements CSV file has all the necessary details needed and won't fail when uploaded for the bulk transfer transaction.
## Request Body Parameters
Add a form-data with a key of “file” in the request body. In the value tab, upload a CSV file of your bulk transfer. Ensure all the required fields such as the amount, currency, bank\_code, branch\_code, account\_number, account\_name, and narration are present in your CSV file before uploading it.
# Get Spotflow Accounts Balance
Source: https://docs.spotflow.one/api-reference/wallets/account-balance
openapi.json GET /balances/accounts/{accountNumber}/balance
Get account balance details for a specific wallet before and after top-up in both NGN and GHS currency.
# Get Spotflow Accounts Balance By Account Number
Source: https://docs.spotflow.one/api-reference/wallets/account-balance-spotflow-wallet
openapi.json GET /balances/accounts/{accountNumber}/sub-balances
Retrieves account balance details for all direct wallets of the specified main account in both NGN and GHS.
# Create Spotflow Accounts
Source: https://docs.spotflow.one/api-reference/wallets/create-account
openapi.json POST /accounts
Wallets are created only through the API and serve a unique purpose to act as a pocket of money where funds can sit in. Importantly, wallets do not require BVNs upon creation.
## Adding Test Funds
On test mode with your test keys, you can easily add fake funds to the jollof bank account number created for you using our [Funds Simulator App](https://d2i9iv7q8xti2t.cloudfront.net/). Note that this is for NGN and GHS only.
See the full guide on [Adding Fake Funds For Testing](/expert-desk/simulating-funds).
# Get All Spotflow Accounts
Source: https://docs.spotflow.one/api-reference/wallets/list-spotflow-wallets
openapi.json GET /accounts
This retrieves and lists all the wallets you've created. This is both for your main account wallet and sub account wallets.
# Get Main Spotflow Account Balance
Source: https://docs.spotflow.one/api-reference/wallets/main-account-balance
openapi.json GET /balances
Retrieves paginated balances for main accounts with optional currency, mode, and date filters.
## Adding Test Funds
On test mode with your test keys, you can easily add fake funds to the jollof bank account number created for you using our [Funds Simulator App](https://d2i9iv7q8xti2t.cloudfront.net/). Note that this is for NGN and GHS only.
See the full guide on [Adding Fake Funds For Testing](/expert-desk/simulating-funds).
# Get Spotflow Account By ID
Source: https://docs.spotflow.one/api-reference/wallets/spotflow-wallet-id
openapi.json GET /accounts/{id}
Get details of your created wallet by its ID. You can get this in either NGN or GHS.
# Introduction
Source: https://docs.spotflow.one/changelog/introduction
Welcome to the Spotflow Changelog. Or, as we call it, "The Big List of Things We Just Made Better." We're constantly shipping updates to make your payment processing less of a headache. We're obsessed with building a platform that just works for global merchants. Consider this page our public commitment to that goal—a running list of every improvement we send your way. This is where you'll find the proof—no marketing fluff, just the features and fixes that'll make your life as a global merchant easier.
# Version Logs
| Version | Date | Description | Link |
| --------- | ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------- |
| `v1.52.5` | `29-10-25` | Security & Control. A major security upgrade (Public/Secret Keys), and new Checkout Expiry settings to give you more control over your sessions. | [Read More](/changelog/v1.52.5) |
| `v1.52.4` | `15-10-2025` | Growth & Onboarding. A massively streamlined onboarding flow, Subscription Free Trials, Bank Transfers in Ghana to help you get paid faster and grow. | [Read More](/changelog/v1.52.4) |
# v1.52.4 (15 Oct 2025)
Source: https://docs.spotflow.one/changelog/v1.52.4
This release was focused on getting you started faster and giving you the tools to grow.
## New Features
* The "Get Paid Faster" Onboarding: We've completely overhauled our onboarding and KYB (Know Your Business) dashboard. The new flow is streamlined, faster, and gets you from signup to "accepting payments" with way less friction.
* Subscription Free Trials & Discounts: You can now offer Free Trial and Discount Periods for your subscription plans. This is a powerful new tool to drive customer adoption and grow your recurring revenue.
* Bank Transfer now LIVE in Ghana on Checkout: We've officially added Bank Transfer as a new payment method for GHS transactions on checkout. This is a huge win for converting more customers in Ghana by offering the local payment methods they trust.
## Improvements & Updates
* Filter Balance Ledger by Currency: Managing multiple currencies? Your life just got easier. The dashboard balance ledger can now be filtered by currency, making reconciliation a breeze.
* General Enhancements: A host of minor API enhancements, stability improvements, and bug fixes across the platform.
# v1.52.5 (29 Oct 2025)
Source: https://docs.spotflow.one/changelog/v1.52.5
This release is all about security, control, and giving you more data to work with.
## New Features
* Public Key Security Model: This is a big one. We've rolled out a major security enhancement by separating key functions. Public Keys are now used for all server-to-server communications, while your Secret Key remains for client-side communications. This separation of duties is a massive leap forward for platform security.
## Improvements & Updates
* Checkout Expiry Control: You can now set an expiry time for checkout URLs. If a customer doesn't complete the purchase in time, a session\_expired ID is logged, giving you much better control over abandoned carts and time-sensitive offers.
* Webhook Fix on Accounts/Wallets: You can now be 100% certain that you get a webhook from Spotflow when a credit and debit is done on your wallets and accounts created for your customers.
* Payment Link UI tidy-up: We tidied up the Payment Link creation and management interface for both desktop and mobile. It's just cleaner, faster, and nicer to use.
* The Usual Housekeeping: A healthy round of performance optimizations, security tweaks, and minor bug fixes to keep the entire platform running smoothly.
# Community Contributions
Source: https://docs.spotflow.one/contributions/overview
Discover community-built SDKs and libraries for Spotflow.
This is a curated list of open-source projects created by the community. These projects are not affiliated with or endorsed by Spotflow unless explicitly stated.
* **What you'll find**: SDKs and libraries across languages
* **How to use**: Evaluate licensing, maintenance status, and security for your use case
* **How to contribute**: Submit your project via our template on the "Share Your Contributions" page
Use at your own risk. Review code, licenses, and security posture before production use.
Browse by type and language with links to code and docs.
Add your project with a short PR using our template.
# Projects Catalog
Source: https://docs.spotflow.one/contributions/projects
Community-maintained libraries and SDKs for Spotflow.
Browse community projects by category. Each card links directly to the repository.
Python SDK for interacting with Spotflow Payments API.
Handles the logic for initializing a transaction with minimal configuration (accepting amount, currency, email, etc.)
`Python` `Checkout` `PIP`
Want your project listed? See Share Your Contributions.
# Share Your Contributions
Source: https://docs.spotflow.one/contributions/submit
How to add your open-source project to Spotflow's contributions directory
* The project is open-source with a permissive license.
* It’s relevant to Spotflow (SDK, libraries, integration guides).
* Has a README with install, usage, and maintenance status.
Edit `contributions/projects.mdx` and add a new `` under the most relevant tab.
```mdx theme={null}
One-sentence description of your project.
By @github_username
`LANGUAGE` `FRAMEWORK` `CATEGORY`
```
If you prefer, open an issue using the "Contributions Submission" template with:
* Repo URL, description, category (SDK/Libraries/Plugin/Boilerplate)
* Primary language/framework
* Install/usage snippet link
* Maintenance status and last update
We review for correctness, relevance, clarity, and safety. Approved entries are merged and published after review.
We may remove entries that are incorrect, unmaintained, insecure, misleading, or violate our policies.
# Introduction
Source: https://docs.spotflow.one/developer-resources/android-sdk
The Spotflow Android SDK empowers developers to seamlessly integrate payment functionalities into their Android applications. It provides UI components and methods that allows you accept payment in your Android app.
## Project Requirements
To integrate the Spotflow Android SDK into your project, ensure the following prerequisites are met:
* Android Studio 4.1 or later
* Android SDK API level 21 or higher while the minimum supported SDK version is 15
* Android Gradle Plugin 7.2 and above
* Gradle 7.1.3 and above
* AndroidX
The Android SDK is currently a beta release. If you encounter any issues, kindly reach out to our support team at [support@spotflow.one](mailto:support@spotflow.one).
## Installation
1. Add the Spotflow SDK dependency to your app-level `build.gradle` file:
```yaml theme={null}
dependencies {
implementation 'com.spotflow:spotflow-android:latest_version'
}
```
2. Add the Internet permission to your AndroidManifest.xml file:
```kotlin theme={null}
```
3. Sync your project with Gradle files to download the SDK into your project. Upon installation, you gain access to the UI components and methods to accept seamless payment experiences in your Android app.
### Parameters Required by the Library
|
This key is used to encrypt the card for secure transactions.
|
|
customerEmail `String`
|
The email address of the customer.
|
|
customerName `String`
|
The name of the customer (optional).
|
|
customerPhoneNumber `String`
|
The phone number of the customer (optional).
|
|
customerId `String`
|
The unique identifier for the customer (optional).
|
|
paymentDescription `String`
|
Description of the payment (optional).
|
|
appLogo `String`
|
App logo widget (optional).
|
|
appName `String`
|
The name of the app (optional).
|
|
debugMode `bool`
|
Enable or disable debug mode.
|
Avoid exposing your API keys in your application. Requests that require your API key should originate from a secure server environment.
## Usage with Jetpack Compose
If you're using Jetpack Compose, call the `PaymentUI` composable function with the required parameters.
### Integration Example
```kotlin lines theme={null}
PaymentUI(
planID = "your_plan_id",
currency = "NGN",
amount = 100.0,
key = "your_key",
encryptionKey = "your_encryption_key",
customerEmail = "customer@example.com",
customerName = "John Doe",
customerPhoneNumber = "1234567890",
customerId = "customer_id",
paymentDescription = "Payment for services",
appLogo = R.drawable.your_logo,
appName = "Your App",
debugMode = true,
onSuccess = { transactionId, paymentData ->
// Handle successful payment
},
onFailure = { errorCode, errorMessage ->
// Handle payment failure
}
)
```
## Usage by Launching an Activity
For apps not using Jetpack Compose, launch the payment activity directly.
### Integration Example
```kotlin lines theme={null}
SpotFlowPaymentActivity.start(
context = this,
merchantId = "your_merchant_id",
planID = "your_plan_id",
currency = "NGN",
amount = 100.0,
key = "your_key",
encryptionKey = "your_encryption_key",
customerEmail = "customer@example.com",
customerName = "John Doe",
customerPhoneNumber = "1234567890",
customerId = "customer_id",
paymentDescription = "Payment for services",
appLogo = R.drawable.your_logo,
appName = "Your App",
debugMode = true,
requestCode = PAYMENT_REQUEST_CODE
)
```
# Angular Library
Source: https://docs.spotflow.one/developer-resources/angular-library
The `Spotflow Angular SDK` enables users to make payments seamlessly. It integrates smoothly into your Angular application, providing a streamlined checkout experience.
### Features
* Collections: Card, Bank Transfers.
* Recurring payments: Recurring Payments: Tokenization and Subscriptions.
## Requirements
* Spoflow Encryption keys
* Spotflow API keys
* Node versions >= 16.x.x npm >=7.x.x
## Installation
```JavaScript theme={null}
npm install @spot-flow/ng-spotflow-checkout
```
```JavaScript theme={null}
yarn add @spot-flow/ng-spotflow-checkout
```
```JavaScript theme={null}
pnpm add @spot-flow/ng-spotflow-checkout
```
## Usage
### As a component
**app.component.ts**
```JavaScript theme={null}
import { Component } from '@angular/core';
import { RouterOutlet } from '@angular/router';
import { SpotflowAngularCheckoutModule } from '@spot-flow/ng-spotflow-checkout';
@Component({
selector: 'app-root',
standalone: true,
imports: [RouterOutlet, SpotflowAngularCheckoutModule],
templateUrl: './app.component.html',
styleUrl: './app.component.css',
})
export class AppComponent {
title = '';
options = {
amount: 4000, // Not required for subscription payment
currency: "NGN",
email: "temi@mailinator.com", // Email of customer
name: "John", // Name of customer: Not required
phoneNumber: "09090909090", // Phone number of customer: Not required
reference: "MC-123456", // Not required, a unique payment reference will be generated if not provided
merchantKey: "pk_test_fXXXXedhXXXXXXXXXXXXXXXX",
planId: "9e0808304-344d-XXXXXXXXX-XXXXX834034", // Not required for a one time payment
encryptionKey:"SKKXXXXXXXXXXXXXXXXX"
};
}
```
**app.component.html**
```JavaScript theme={null}
Make Payment
```
### Parameters
Your API Secret
Your transaction reference. This MUST be unique for every transaction
Amount to charge the customer. NB: For subscription payments, amount comes from the plan details. This is not required for subscription payments.
Currency to charge in.
This is only required when a payment is being made in USD
This is the encryption key for the merchant. This is required for card payments.
This is the plan ID being paid for however, this is not required for one time payments.
This is the Customer's Name
This is the Customer's Phone Number
This is the Customer's Email Address
This contains other information about the product such as the product name and other additional properties. Product Name should not be passed if planId is being passed
This is the URL the browser redirects to on success of a payment
Need more information check out our [documentation](https://www.npmjs.com/package/@spot-flow/ng-spotflow-checkout)
# Introduction
Source: https://docs.spotflow.one/developer-resources/flutter-sdk
Our Flutter SDK provides a rich set of pre-built UI components and APIs to seamlessly integrate payment functionalities within your Flutter application.
The `Spotflow Flutter SDK` pallows you to integrate smooth and secure payment flows into your Flutter apps. It supports both Android and iOS platforms, making it versatile for mobile app development.
Android: Ensure INTERNET permission is declared in `AndroidManifest.xml`
iOS: No special permissions required beyond basic networking
## Requirements
Ensure your Flutter environment meets the following:
* **context**: Flutter 3.7.0 or later
* **context**: Dart 2.19 or later
* **context**: Compatible with Android (minSdkVersion 21) and iOS (iOS 11+)
* **context**: Internet permission for Android `AndroidManifest.xml`
The Flutter SDK is currently a beta release. If you encounter any issues, kindly reach out to our support team at [support@spotflow.one](mailto:support@spotflow.one).
## Installation
To use the `Spotflow Flutter SDK` package, add the following dependencies to your `pubspec.yaml` file:
```yaml theme={null}
dependencies:
spotflow_flutter: ^1.0.0 # or the latest version
```
Then run `flutter pub get` to fetch the package.
### Parameters Required by the SDK
|
This key is used to encrypt the card for secure transactions.
|
|
customerEmail `String`
|
The email address of the customer.
|
|
customerName `String`
|
The name of the customer (optional).
|
|
customerPhoneNumber `String`
|
The phone number of the customer (optional).
|
|
customerId `String`
|
The unique identifier for the customer (optional).
|
|
paymentDescription `String`
|
Description of the payment (optional).
|
|
appLogo `String`
|
App logo widget (optional).
|
|
appName `String`
|
The name of the app (optional).
|
|
debugMode `bool`
|
Enable or disable debug mode.
|
Always ensure that your key and encryptionKey are stored securely. Avoid hardcoding them in production apps.
## Usage Example
Here is an example of how to make a payment using the `Spotflow` package:
```kotlin lines theme={null}
import 'package:spotflow_flutter/spotflow_flutter.dart';
SpotflowFlutter.startPayment(
context: context,
customerId: "cust_001",
customerEmail: "jane@example.com",
customerName: "Jane Doe",
customerPhoneNumber: "+123456789",
currency: "USD",
amount: 100.0,
key: "your_public_key",
encryptionKey: "your_encryption_key",
paymentDescription: "Payment for services",
planId: "plan_001",
appName: "MyApp",
appLogo: Image.asset('assets/logo.png'), // Or any Widget
debugMode: true,
);
```
### Testing Your implementation
Test cards can be found [here](/expert-desk/testing-payments)
## Running the Example Project
An example project has been provided on our [Github Repository](https://github.com/Spotflow-One/spotflow_flutter). Clone the repository and navigate to the example folder. Open it with a supported IDE or run `flutter run` from the terminal in that folder.
# Introduction
Source: https://docs.spotflow.one/developer-resources/iOS-sdk
The Spotflow iOS SDK is a SwiftUI library that allows developers to integrate payment collection functionality into their iOS applications. It provides a simple interface to navigate to a payment screen, handle payment logic, and manage success or failure callbacks using the `SpotFlowPaymentUI` class.
The iOS SDK is currently a beta release. If you encounter any issues, kindly reach out to our support team at [support@spotflow.one](mailto:support@spotflow.one).
## Project Requirements
To integrate the Spotflow iOS SDK into your project, ensure the following prerequisites are met:
* Xcode 13.0 or later
* iOS 11.0 or higher
* Swift 5.3 or later
* Swift Package Manager (SPM) for dependency management
## Installation
### Using Swift Package Manager (SPM)
To add `SpotFlow - iOS` SDK to your project using Xcode or by updating your `Package.swift` file:
```yaml theme={null}
dependencies: [
.package(url: "https://github.com/Spotflow-One/SpotflowIOS.git", from: "1.0.0")
],
targets: [
.target(
name: "YourApp",
dependencies: ["Spotflow"]),
]
```
After adding the dependency, import the Spotflow module where needed:
```kotlin wrap theme={null}
import Spotflow
```
### Parameters Required by the SDK
|
This key is used to encrypt the card for secure transactions.
|
|
customerEmail `String`
|
The email address of the customer.
|
|
customerName `String`
|
The name of the customer (optional).
|
|
customerPhoneNumber `String`
|
The phone number of the customer (optional).
|
|
customerId `String`
|
The unique identifier for the customer (optional).
|
|
paymentDescription `String`
|
Description of the payment (optional).
|
|
appLogo `String`
|
App logo widget (optional).
|
|
appName `String`
|
The name of the app (optional).
|
|
debugMode `bool`
|
Enable or disable debug mode.
|
Never expose your key or encryptionKey directly in the app for production. Use a secure server to perform sensitive operations.
### Navigating to the Payment Screen
To navigate to the payment screen and initiate a payment process, create an instance of `SpotFlowPaymentManager` with the required parameters and pass it to `SpotFlowPaymentUI`.
### Example Usage
```kotlin lines theme={null}
import SwiftUI;
import Spotflow
let config = SpotflowPaymentConfig(
planId: "plan_001",
currency: "USD",
amount: 50.0,
key: "your_public_key",
encryptionKey: "your_encryption_key",
customerEmail: "user@example.com",
customerName: "Jane Smith",
customerPhoneNumber: "+123456789",
customerId: "user_123",
paymentDescription: "Monthly Subscription",
appLogo: UIImage(named: "AppLogo"),
appName: "MyApp",
debugMode: true
);
Spotflow.shared.startPayment(
from: self,
config: config,
onSuccess: { transactionId, paymentData in
// Handle success
},
onFailure: { errorCode, errorMessage in
// Handle failure
}
)
```
## SpotFlowPaymentUI Parameters
manager: An instance of `SpotFlowPaymentManager` containing payment and customer information.
onPaymentSuccess: A closure that gets called when the payment is successful.
onPaymentFailure: A closure that gets called when the payment fails, with an error as a parameter
## SpotFlowPaymentManager
`SpotFlowPaymentManager` is a struct that holds all necessary information for a payment transaction.
### Properties/Parameters
The merchant ID
The plan ID
The API key
The Encryption key
The customer's email
The customer's name
The customer's phone number
The customer ID
paymentDescription
The logo of the app
The name of the app
## Handling Error Messages
This SDK provides comprehensive error handling mechanisms to assist in troubleshooting and providing informative feedback to users. Upon encountering an error, detailed error codes and descriptions are returned. By extracting error messages from the response, you can effectively communicate the issue to the user and take appropriate actions. Ensure you implement appropriate error handling mechanisms to provide informative feedback to the user.
## Testing
Thoroughly test the integration with different payment scenarios including successful payments, failures, and edge cases to ensure a smooth user experience. Spotflow provides testing helpers that allows you to simulate different payment scenarios
For your convenience, here are the testing helpers available:
* **Card Testing:** Test cards can be found [here](https://app.spotflow.co/)
* **Bank Transfer Testing:** Test bank transfer scenarios with the testing account details provided during your integration.
These testing helpers help you ensure that your integration handles various payment scenarios effectively before deploying your application to a production environment. It's recommended to thoroughly test your integration with these testing details to provide a reliable payment experience to your users.
# Introduction
Source: https://docs.spotflow.one/developer-resources/inline-js
InlineJS is Spotflow's JavaScript library designed to simplify the integration of payment functionalities into your web application. By embedding InlineJS into your checkout page, you can create a seamless payment experience without the need for redirects. It integrates smoothly into your application, providing a streamlined checkout experience.
## Browser Support
Spotflow InlineJS is compatible with all recent versions of modern web browsers that support ECMAScript 5 or later. This includes:
#### Supported Browsers
* **Google Chrome**: Version 23 and above (all platforms)
* **Safari**: Version 7 and above (macOS and iOS)
* **Mozilla Firefox**: Version 21 and above (desktop)
* **Microsoft Edge**: Version 79 and above (Chromium-based, desktop)
* **Opera**: Version 15 and above (desktop)
#### Mobile Browsers
* **Chrome Mobile**: Android 5.0+
* **Safari Mobile**: iOS 10+
* **Samsung Internet**: Version 4.0+
### Unsupported Browsers
The following browsers and configurations are not supported:
* **Internet Explorer (all versions, including IE 11)**
* **Opera Mini in Super Saver/Extreme mode**
* **Browsers with JavaScript disabled**
* **Legacy browsers that do not support ECMAScript 5**
### Recommendations
For the best experience, we recommend using the latest stable version of any supported browser with JavaScript enabled.
## Installation
```JavaScript theme={null}
npm install @spot-flow/checkout-inline-js
```
```JavaScript theme={null}
yarn add @spot-flow/checkout-inline-js
```
```JavaScript theme={null}
```
If you used `NPM` or `Yarn`, ensure you import the library as shown below:
```JavaScript theme={null}
// Add for NPM, Yarn
import { CheckoutForm } from "@spot-flow/checkout-inline-js";
```
## Usage
### One Time Payment
```JavaScript lines theme={null}
import { CheckoutForm } from "@spot-flow/checkout-inline-js";
const checkout = new CheckoutForm({});
checkout.setup({
email: "temi@mailinator.com",
encryptionKey: "gF1SPEMA3ido2Dg4ByXxxxxxxxxxxxxxxxxx", // The encryption key for the merchant
merchantKey: "pk_test_8a586f9801254xxxxxxxxxxxx", // Your Merchant Public Key generated on Spotflow
currency: "NGN", //can be in USD or in the local currency of your collection region e.g NGN, GHS
localCurrency: "NGN", //optional and only needed if currency is in USD
amount: 500
});
```
### Subscription Payment
```JavaScript lines theme={null}
const checkout = new CheckoutForm({});
checkout.setup({
email: "temi@mailinator.com",
encryptionKey: "gF1SPEMA3ido2Dg4ByXxxxxxxxxxxxxxxxxx", // The encryption key for the merchant
merchantKey: "pk_test_8a586f9801254xxxxxxxxxxxx", // Your Merchant Public Key generated on Spotflow
planId: "7447a235-9f53-4d44-xxxxxxxxxxxxxx", // Replace with your plan ID
currency: "NGN", //can be in USD or in the local currency of your collection region e.g NGN, GHS
localCurrency: "NGN", //optional and only needed if currency is in USD
});
```
### One-Time Payment via CDN
Alternatively, to integrate InlineJS into your web application, you can include it directly in your HTML via a CDN. Include the following script tag in the `` section of your HTML file:
**HTML**
```HTML theme={null}
```
```JavaScript lines theme={null}
```
```JavaScript lines theme={null}
```
# Create Spotflow Payment Links In Under 5 Minutes (No Code Required)
Source: https://docs.spotflow.one/developer-resources/integration-guide
This guide will help you create a Spotflow Payment Link in under 5 minutes with no code required.
Accepting online payments can feel complicated if you don’t have a website or payment gateway setup. Spotflow makes this simple with one powerful feature: Payment Links.
In this quick guide, you’ll learn how to create a secure payment link directly from the Spotflow Dashboard — no coding, plugins, or integrations required. This works perfectly for Instagram sellers, freelancers, event organizers, consultants, small businesses or any type of business.
## What You'll Learn
By the end of this guide, you’ll know how to:
* Log in to the Spotflow Dashboard
* Create a payment link
* Set pricing and details
* Share the link with customers
* Test payments
* Track payments in real time
## Step 1: Log In to the Spotflow Dashboard
Log in to your [Spotflow account](https://app.spotflow.co/) or [Sign Up](https://app.spotflow.co/) if you don't have one.
## Step 2: Open the Payment Links Page
From the left menu, click Payment Links. This page lets you generate shareable URLs for quick customer payments.
## Step 3: Create a New Payment Link
Click Create Payment Link and fill in:
* Title (product/service name)
* Description (short summary)
* Amount
* Currency
## Step 4: Configure Extra Settings (Optional)
You can:
* Allow customers enter any amount.
* Collect customer's phone number.
* Redirect user after payment.
## Step 5: Generate the Link
Once everything looks as you desire, click Create.
Spotflow instantly generates a secure checkout URL you can share through:
* WhatsApp
* Instagram DMs
* Email
* Facebook Messenger
* Telegram
Your customer just clicks and pays.
## Step 6: Test Your Payment Link
Spotflow includes a Test Mode, allowing you to simulate real payments without charging anything.
Create a payment link in test mode, open it and use the provided [test card details](https://docs.spotflow.one/testing-payment).
## Step 7: Track Payments in Real Time
According to the different currencies you created the payment link, head back to the Collections page on your dashboard to see:
* Payment status
* Timestamps
* Payment channels/methods
* Customer details
You can also configure webhooks for payment notifications:
* Go to Settings > Webhooks
* Add a webhook URL for payment notifications
* [Detailed Guide](/developer-resources/webhooks/overview)
This makes reconciliation quick and stress-free.
### Who Is This For?
Payment links are ideal for:
* Instagram sellers
* Freelancers
* Consulting sessions
* Donations
* Digital products
* Event tickets
* Course enrollments
If someone can click a link, they can pay you.
### Why Spotflow?
Compared to traditional gateways:
* Setup takes minutes
* No technical experience needed
* Clean, simple dashboard
* Mobile-friendly checkout
* Flexible configuration options
Most importantly: you get paid faster.
Contributed by [Riddhima Singhal](https://github.com/riddhima-7321) during Hacktoberfest '25 with Spotflow
# Introduction
Source: https://docs.spotflow.one/developer-resources/introduction
Welcome to the Spotflow Core - This section contains everything you need to successfully integrate, test, master and go live with the Spotflow platform.
## API Keys
Use the appropriate API keys :
* Test: `sk_test_fXXXXedhXXXXXXXXXXXXX`
* Live: `sk_live_fXXXXedhXXXXXXXXXXXXX`
Learn more about [Test vs Live Keys](/expert-desk/test-mode-vs-live-mode).
## Integration Steps
Follow these steps to integrate Spotflow:
1. [Set up your account](https://app.spotflow.co/) and get your API keys
2. Choose your integration method:
* [Use our SDKs](/developer-resources/iOS-sdk)
* [Redirect Checkout API integration](/api-reference/payments/initialize-collection)
* [Direct API integration for merchants with PCI DSS license](/api-reference/payments/create-collection)
3. [Set up webhooks](https://app.spotflow.co/) for real-time updates
4. [Test your integration](/expert-desk/testing-payments)
5. Go live!
Your roadmap for getting specific payment methods up and running quickly.
Stay ahead of every event with real time alerts.
Don't deploy until you're sure. Use our testing environment to simulate every scenario before pushing anything live.
Pre-built code packages for your favorite languages. Drop our SDKs into your project and start accepting payments in minutes, not days.
Lightweight code modules for maximum flexibility. Cherry-pick the components you need and build your integration exactly how you want it.
## What's Next?
Browse all available endpoints
# React Library
Source: https://docs.spotflow.one/developer-resources/react-library
The `Spotflow React SDK` helps you or rather enables your users to make payments seamlessly. It integrates smoothly into your application, providing a streamlined checkout experience.
### Features
* Collections: Card, Bank Transfer, Mobile Money and more
* Recurring payments: Tokenization and Subscriptions.
## Requirements
* Spoflow Encryption keys
* Spotflow API keys
* Node versions >= 18.x.x
* React version >= 18.8.0
## Installation
```JavaScript theme={null}
npm i @spot-flow/react-spotflow-checkout
```
```JavaScript theme={null}
yarn add @spot-flow/react-spotflow-checkout
```
```JavaScript theme={null}
pnpm add @spot-flow/react-spotflow-checkout
```
## Usage
### Payment CheckoutButton
```JavaScript theme={null}
import React from "react";
import { SpotflowButton } from "@spot-flow/react-spotflow-checkout";
const PaymentComponent = () => {
return (
);
};
```
SpotflowButton has the ButtonProps which can allow you to customize to your design
### Hooks
```JavaScript theme={null}
import React from "react";
import { useSpotflowPayment } from "@spot-flow/react-spotflow-checkout";
const PaymentComponent = () => {
const config = {
amount: 4000, // Not required for subscription payment
currency: "NGN",
email: "temi@mailinator.com", // Email of customer
name: "John", // Name of customer: Not required
phoneNumber: "09090909090", // Phone number of customer: Not required
reference: "MC-123456", // Not required, a unique payment reference will be generated if not provided
merchantKey: "pk_test_fXXXXedhXXXXXXXXXXXXXXXX",
planId: "9e0808304-344d-XXXXXXXXX-XXXXX834034", // Not required for a one time payment
encryptionKey:"SKKXXXXXXXXXXXXXXXXX"
}
const initialFn = useSpotflowPayment();
return (
);
};
```
### Parameters
Your API Public Key
Your transaction reference. This MUST be unique for every transaction
Amount to charge the customer. NB: For subscription payments, amount comes from the plan details. This is not required for subscription payments.
Currency to charge in.
This is only required when a payment is being made in USD
This is the encryption key for the merchant. This is required for card payments.
This is the plan ID being paid for however, this is not required for one time payments.
This is the Customer's Name
This is the Customer's Phone Number
This is the Customer's Email Address
This contains other information about the product such as the product name and other additional properties. Product Name should not be passed if planId is being passed
This is the URL the browser redirects to on success of a payment
Need more information check out our [documentation](https://www.npmjs.com/package/@spot-flow/react-spotflow-checkout)
# Integrate Spotflow Initialize/Redirect API Into Your Application
Source: https://docs.spotflow.one/developer-resources/redirectapi-in-your-app
This tutorial will help you integrate the Spotflow API into your application.
**Watch the full demo:**
Integrating a payment gateway into your application goes beyond processing payments.
You need to ensure customers can make payments easily, without delays or frustrating declined error messages that make them hiss. At the same time, you want to ensure transactions are adequately secure to protect customer-sensitive data and prevent malicious actors from manipulating transaction status.
This is where the [Spotflow Initialize Payment API](/api-reference/payments/initialize-collection) shines. It allows you to seamlessly initialize a payment, complete the checkout process, and securely verify the transaction to ensure only valid transactions are approved.
This tutorial provides a practical step-by-step process for integrating the Initialize Payment API in your application. It explains how to:
* Initialize a payment.
* Redirect to the checkout URL to complete the payment.
* Securely verify the transaction.
## Prerequisites
To integrate the Spotflow Initialize Payment API endpoint, you must have the following:
1. A Spotflow merchant account that is KYB Verified and Configured. You can sign up for an account [here](https://app.spotflow.co).
2. Get your API Credentials(API Keys) i.e your test secret key or live secret key from your Spotflow dashboard. This will be used to authenticate your request.
## Step-by-step Process on How to Integrate Spotflow Initialize Payment API
To make this tutorial practical, we will build a simple event ticket app. Although this may differ from the app you want to build, the process is usually the same.
This way, you can understand how the integration works and easily add the API to your application.
Before we start, make sure you have:
* A Spotflow merchant account
* Basic familiarity with Python/Django
## Step 1: Retrieve your customers basic information
Retrieve the basic customer information you need to process their transactions. E.g., name, email address, amount, etc.
You can retrieve customer information from your database or from an HTML form, just like the one in the example below.
```yaml theme={null}
```
```yaml theme={null}
def ticket(request):
if request.method == "POST":
username = request.POST.get("username")
email = request.POST.get("email")
ticket = request.POST.get("ticket")
return render(request, "ticket.html",)
```
## Step 2: Temporarily store the retrieved data if you are using the HTML form method
```yaml theme={null}
def ticket(request):
if request.method == "POST":
username = request.POST.get("username")
email = request.POST.get("email")
ticket = request.POST.get("ticket")
try:
ticket = int(ticket) #converts the ticket input to integer
request.session["ticket"] = ticket # temporarily store the ticket input
request.session["username"] = username # temporarily store the username
request.session["email"] = email # temporarily store the email
return redirect("checkout")
except ValueError:
messages.info(request, "Invalid input") # throws an error if the input is not an integer
return redirect("ticket")
return render(request, "ticket.html",)
```
## Step 3: Get your test secret key or Live secret key.
You can use the test secret key when testing the API, and the live key when you are ready to go live.
```yaml theme={null}
API_KEY = "YOUR_SECRET_KEY"
```
## Step 4: Set the authorization header.
```yaml theme={null}
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
```
## Step 5: Get your `callBackUrl`.
This represents the specific URL you want to redirect customers to immediately after the checkout process.
You can set this on your Spotflow dashboard in **Settings --> Payments --> API Keys --> Webhooks & CallBack --> CallBack URL**.
```yaml theme={null}
callBackUrl = "https://spotflow-demo.onrender.com/verify/"
```
You can skip this for now and add it later once you set up the verification page on your site.
## Step 6: Retrieve all the information you need to send a request to the `initalize` API in your checkout function.
Information like username, amount, and email is compulsory.
```yaml theme={null}
def checkout(request):
ticket = request.session.get("ticket") # retrieves the number of tickets
username = request.session.get("username") # retrieves the username
email = request.session.get("email") # retrieves the email
price = 1000 # represents the ticket price
amount = price * ticket # calculates the ticket amount
reference = f"ref-{uuid.uuid4()}" # this represents the unique ID, but should be replaced by a unique ID generated by your company
currency = "NGN"
API_KEY = "YOUR_SECRET_KEY"
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
```
The `reference` in the example above generates a universally unique identifier, but must be replaced by a unique ID from your system to make payments easy to track.
## Step 7: Pass in the retrieved details as body parameters.
```yaml theme={null}
ticket = request.session.get("ticket")
username = request.session.get("username")
email = request.session.get("email")
price = 1000
amount = price * ticket
reference = f"ref-{uuid.uuid4()}"
currency = "NGN"
payload = {
"reference": reference,
"amount": amount,
"currency": "NGN",
"localCurrency": currency,
"metadata": {
"productName": "Tech Workshop 2025",
"title": "dTechreative Ticket",
},
"callBackUrl": "https://spotflow-demo.onrender.com/verify/",
"customer":{
"email": email,
"name": username,
}
}
API_KEY = "YOUR_SECRET_KEY"
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
```
## Step 8: Set the `initialize payment` endpoint and pass in the body parameters.
```yaml theme={null}
response = requests.post("https://api.spotflow.co/api/v1/payments/initialize", json=payload, headers=headers)
```
## Step 9: Retrieve the API response.
If it is successful, convert it to JSON; else, display an error message if the request failed.
```yaml theme={null}
if response.status_code == 200:
converter = response.json()
else:
messages.info(request, "An error occurred.")
return redirect("ticket")
```
You should have a typical API response like this:
```yaml theme={null}
{
"reference": "ref-f537b2f7-c149-40ea-bdd0-5d15ea9c84d9",
"checkoutUrl": "https://checkout.spotflow.co/JVLGMqU9CgkGCrp",
"paymentCode": "JVLGMqU9CgkGCrp",
"status": "pending",
"callBackUrl": "https://spotflow-demo.onrender.com/verify/",
"metadata": {
"title": "dTechreative Ticket",
"productName": "Tech Workshop 2025"
}
}
```
**In the API response,**
* `reference`: represents the unique reference ID.
* `checkoutUrl`: represents the checkout URL you will redirect the user to complete their payment.
* `status`: represents the transaction status.
* `callBackUrl`: represents your callback URL.
* `metadata`: represents your product metadata.
* `title`: represents your product title.
* `productName`: represents your product name.
## Step 10: Retrieve `reference` and `checkoutUrl` from the response.
These are the two important keys you need.
```yaml theme={null}
if response.status_code == 200:
converter = response.json()
extractData = {
"reference": converter.get("reference"), # this retrieves the reference from the response stored in the `converter` variable
"checkoutURL": converter.get("checkoutUrl"), # this retrieves checkoutUrl from the response stored in the `converter` variable
}
```
## Step 11: Redirect the user to the `checkoutUrl` to complete the checkout process.
This is where users will securely make payments using the Spotflow secure payment gateway.
```yaml theme={null}
if response.status_code == 200:
converter = response.json()
extractData = {
"reference": converter.get("reference"),
"checkoutURL": converter.get("checkoutUrl"),
}
return redirect(extractData["checkoutURL"]) # redirects user to the checkout page
else:
messages.info(request, "An error occurred.")
return redirect("ticket")
```
Once a user clicks the “Pay” button in the frontend, it initializes a transaction by making a POST request to the `Initialize` API and then redirects to the `checkoutUrl` to make payments.
You should have something like this:
The user can then complete their payment via bank transfer or card. This is one of the most important aspects of using the Spotflow API.
It enables you to securely process transactions faster without revealing sensitive customer financial details.
To pay with a card, you can use Spotflow’s [test cards](/expert-desk/testing-payments) in test mode and then a real card in live mode.
## Step 12: Once the payment is complete, it will automatically redirect them to the `callBackUrl` you specified earlier.
Important Notes:
1. You, as the merchant that owns the application and the user who made the payment, will receive the payment receipt in your email once the payment is successful.
2. If you don’t specify the `callbackUrl`, the user will not be redirected to your site after payments.
Now, the next step is to verify their transaction.
## How to Securely Verify a Transaction Status
Once the user completes payment, you need to verify the transaction status to prevent fraud.
There are two ways to verify a transaction status. You can either use the [`verify payment` API](/api-reference/payments/verify-collection) or the webhooks.
However, the webhook method is often preferred because it provides real-time updates and is more efficient than calling the `verify payment` API repeatedly to check transaction status.
### How to Verify Transaction Status Using Webhooks
Webhooks are event-triggered messages that automatically update you whenever a payment status changes.
For instance, when a customer makes a payment and the transaction is successful/failed, that is an event. Spotflow instantly sends a POST request to the webhook URL you set.
This request provides information about the event, such as the reference, amount, etc. Then you can retrieve the data and determine how you want to update your user on the status of their transaction or the next steps.
There are two main steps involved when using the webhook methods.
#### Step 1: Create a webhook URL
You can instantly create a webhook URL on sites like [`webhook.site`](https://webhook.site/) when testing and then create a new URL (specific endpoint) in your backend when you want to go live.
1. Set up the webhook URL path in the `urls.py` if you are using Django.
```yaml theme={null}
urlpatterns = [
path('webhook/', views.webhook, name="webhook"),
]
```
2. In your views function, set up a simple POST request that Spotflow can send updates to.
```yaml theme={null}
import json
from django.http import JsonResponse, HttpResponseBadRequest
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt # This exempts the view function from CSRF protection
def webhook (request):
if request.method == "POST":
try:
payload = json.loads(request.body) # retrieves the request body
eventType = payload.get("event") # retrieves the event type
data = payload.get("data", {}) # retrieves the data
if eventType == "payment_successful": # checks if payment is successful
reference = data.get("reference") # retrieves the payment reference from the data
amount = data.get("amount") # retrieves the amount from the data
print("Payment successful with ID", reference, "Amount", amount) # displays success message or provide a logic to update the database
elif eventType == "payment_failed": # checks if payment failed
reference = data.get("reference") # retrieves the payment reference from the data
print("Payment failed with ID", reference) # failure message or provide a logic to update the database
return JsonResponse({"status": "success"}, status=200) # must always return a 200 status code to acknowledge an event occurred and to prevent triggering the webhook multiple times
except Exception as e:
print("Error processing webhook", e) # displays an error message
return JsonResponse({"status": "error"}, status=400)
return JsonResponse({"status": "Method not allowed"}, status=405)
```
3. Test and deploy your new webhook URL.
#### Step 2: Register your webhook URL in the Spotflow dashboard.
1. Log in to your [Spotflow Dashboard](https://app.spotflow.co/).
2. Navigate to the “Settings” section and click the “Payments” tab.
3. Click the “API Keys” option and scroll down to the “Webhook” section.
4. Enter your webhook URL in the box and click the save/update button.
If you are using a unique webhook URL from webhook testing tools like webhook.site, paste it here directly.
If you configured it in your backend, paste the deployed URL here.
5. Enter the OTP from your authenticator app to complete the process.
After setting this up, your webhook URL will be triggered whenever an event occurs. Then you can use the event information to verify transaction status.
You will receive something like this in your server logs whenever an event is triggered. E.g., when a payment is successful.
```yaml theme={null}
Payload: {
"event":"payment_successful"
"data":{
"id":"9f005772-ab63-4f19-8f6d-fa8022943512","reference":"ref-4a1ca154-a988-4d60-8ad6-14f6a477c415",
"spotflowReference":"SPF-SPA-9559706d9944422db02b9f0d9b96bbaa",
"amount":1000.00,
"currency":"NGN",
"channel":"bank_transfer",
"status":"successful",
"customer":{
"id":"0e9f774b-3436-4385-9d92-aa2db375b790",
"name":"gloriaSilver",
"email":"silver@gmail.com"
},
"providerMessage":"Payment completed successfully.",
"rate":1499.85,
"region":"Nigeria",
"bankDetails":{
"accountName":"SPOTFLOW LTD",
"accountNumber":"3370386001",
"bankName":"Jollof Bank"
},
"createdAt":"2025-11-06T08:04:29Z",
"Metadata":{
"title":"dTechreative Ticket",
"productName":"Tech Workshop 2025"
},
"totalTaxAmount":0.0000,
"totalLocalAmount":1000.0000
}
}
```
### How to Verify Transaction Status Using the Verify Payment API
The Spotflow [`Verify Payment` API](/api-reference/payments/verify-collection) allows you to verify transaction status using your set unique reference ID at payment creation.
Here is how the verification process typically works.
#### Step 1: Retrieve the unique `reference` ID in the `initialize payment` API response.
```yaml theme={null}
reference = request.GET.get("reference")
```
#### Step 2: Get your API keys and set your headers.
#### Step 3: Pass the `reference` ID as a path parameter to the `verify payment` endpoint.
```yaml theme={null}
response = requests.get(f" https://api.spotflow.co/api/v1/payments/verify?reference={reference}", headers=headers)
```
#### Step 4: Send your API request.
```yaml theme={null}
{
"id": "e0fd7f62-8431-4fd2-9177-4e362a5e85d9",
"reference": "ref-3b7c063a-b0a2-4d0c-a637-2bdfc7353ba2",
"spotflowReference": "SPF-SPA-cc75701e381c4b63bd005750572c8e6d",
"amount": 3000.00,
"currency": "NGN",
"channel": "bank_transfer",
"status": "successful",
"customer": {
"id": "05562200-1ef2-49f0-b92d-c824eb3905b9",
"name": "gloriaSilver",
"email": "glow@gmail.com"
},
"providerMessage": "Payment completed successfully.",
"rate": 1530.46,
"region": "Nigeria",
"bankDetails": {
"accountName": "SPOTFLOW LTD",
"accountNumber": "8419470846",
"bankName": "Jollof Bank"
},
"createdAt": "2025-10-22T12:14:01Z",
"metadata": {
"title": "dTechreative Ticket",
"productName": "Tech Workshop 2025"
},
"totalTaxAmount": 0.0000,
"totalLocalAmount": 3000.0000
}
```
#### Step 5: Retrieve the specific data you need in the API response.
```yaml theme={null}
if response.status_code == 200:
convertJson = response.json()
extractResponse = {
"id": convertJson.get("id",),
"reference": convertJson.get("reference"),
"status": convertJson.get("status"),
"name": convertJson.get("customer", {}).get("name"),
"email": convertJson.get("customer", {}).get("email"),
"amount": convertJson.get("amount"),
}
else:
messages.info(request, "An error occurred during verification.")
```
#### Step 6: Display the necessary details you want users to see in the verification page.
Something like this:
Now, you have securely verified the transaction status using the Spotflow verify payment endpoint.
You can watch the demo video above to see the complete payment workflow, or check the [live demo](https://spotflow-demo.onrender.com/).
## Troubleshooting
Common issues and their solutions:
**Possible causes:**
* Invalid/missing fields.
* Region and Service providers not configured.
* Network connectivity issues.
**Solutions:**
1. Verify that you added all the necessary/required fields.
2. Verify from our support team that you've been region and service provider configured as a merchant. By default, this is not set.
3. Test API connectivity with a simple GET request
The Spotflow Initialize/Redirect API not only allows you to process and verify payments securely but also makes integration in your application easy.
## Congratulations! You've Implemented the Initialize/Redirect API
You've successfully integrated the Redirect checkout with Spotflow! Here's what you accomplished:
Your application can now accept payments securely through Spotflow
You can create payment sessions and generate unique checkout URLs for your customers
Your users are automatically redirected to Spotflow's secure checkout page to complete payments
You've implemented either webhook or API-based verification to confirm payment status & prevent fraud with a complete end-to-end payment workflow from initialization to verification
This example demonstrates only a minimal implementation of the Initialize/Redirect API. For production use, you should add robust error handling, authentication, data validation, security measures, and adapt the logic to fit your application's requirements.
## What's Next?
Now that you have the basics working, you can:
* **Go Live**: Switch from test mode to live mode using your live secret key and start accepting real payments.
* **Customize Metadata**: Add more product information and custom fields to track your business-specific data
* **Monitor Transactions**: Use your Spotflow dashboard to track payments collections and manage your business
* **Explore More Features**: Check out our other APIs for [subscriptions](/api-reference/subscription-plans/create-single-plan), [disbursements](/api-reference/transfer-api/create-single-transfer), and more
Need help or have questions? Reach out to our [support team](mailto:support@spotflow.one) or check our [FAQ section](/expert-desk/faq).
Contributed [by](https://github.com/gloriadasilva) [Gloria Tejuosho](https://medium.com/@gloriadasilva_28376/how-to-integrate-spotflows-initialize-redirect-api-in-your-application-18c002b16ec0) during Hacktoberfest '25 with Spotflow
# Vue Library
Source: https://docs.spotflow.one/developer-resources/vue-library
This `Spotflow Vue.js library` wraps around the [inline library](https://github.com/Spotflow-One/spotflow-checkout-inline), which enables your users to make payments seamlessly. It integrates smoothly into your Vue.js application, providing a streamlined checkout experience.
### Features
* Collections: Card, Bank Transfers, USSD.
* Recurring payments: Recurring payments: Tokenization and Subscriptions.
## Requirements
* Spoflow Encryption keys
* Spotflow API keys
* Node versions >= 16.x.x npm >=7.x.x
## Installation
```JavaScript theme={null}
npm install @spot-flow/vue-spotflow-checkout
```
```JavaScript theme={null}
yarn add @spot-flow/vue-spotflow-checkout
```
## Usage
### Using Composable
`in payment-component.vue`
```JavaScript theme={null}
```
### Using SpotflowButton Component in Vue 3
```JavaScript theme={null}
Payment Component
Pay Now
```
### Parameters
Your API Public Key
Your transaction reference. This MUST be unique for every transaction
Amount to charge the customer. NB: For subscription payments, amount comes from the plan details. This is not required for subscription payments.
Currency to charge in.
This is only required when a payment is being made in USD
This is the encryption key for the merchant. This is required for card payments.
This is the plan ID being paid for however, this is not required for one time payments.
This is the Customer's Name
This is the Customer's Phone Number
This is the Customer's Email Address
This contains other information about the product such as the product name and other additional properties. Product Name should not be passed if planId is being passed
This is the URL the browser redirects to on success of a payment
Need more information check out our [documentation](https://www.npmjs.com/package/@spot-flow/vue-spotflow-checkout)
# Accounts
Source: https://docs.spotflow.one/developer-resources/webhooks/accounts
This is the structure of the data payload sent to your webhook URL to notify your system about debits, credits, status updates related to Spotflow Wallets and Dynamic Accounts.
## **Accounts Events**
| **Event Name** | **Event Type** | **Description** | |
| ----------------------------- | --------------------------- | --------------------------------------------------------------------------------------------- | - |
| **Account Credit Successful** | `account_credit_successful` | Occurs when a credit is made successfully to your main wallet, sub wallet or virtual account. | |
| **Account Debit Successful** | `account_debit_successful` | Occurs when money is debited or disbursed successfully from your balances. | |
## **Payload Example Structure**
#### ***Account Credit Successful for Main Wallets***
```yaml theme={null}
{
"event": "account_credit_successful",
"data": {
"id": "294b7632-08c2-41de-8728-d52ac3bf51bf",
"account": {
"id": "04a6031a-ada4-4d25-9e49-1a9648f3fc17",
"account_number": "4576690890",
"account_name": "Main NGN Account"
},
"merchant_id": "2br9bffb-a498-497c-9cfa-fd0412aa8978",
"reference": "API-VACT_TRA-30D70-8340643d-f26e-4650-92d0-1dc28ea01a35",
"spotflow_reference": "SPF-CRDT-02374ba82fdd4efd875982d9f36f00f6",
"amount": 100,
"fee": 0,
"currency": "NGN",
"type": "credit",
"status": "successful",
"source": "virtual_account",
"description": "Transfer from AMY JAMES",
"sender": {
"account_name": "AMY JAMES",
"account_number": "8083299876",
"bank_name": "Paycom (Opay)"
},
"mode": "live",
"transaction_date": "2025-10-28T20:35:42Z"
}
}
```
#### ***Account Credit Successful for Sub Wallets***
```yaml theme={null}
{
"event": "account_credit_successful",
"data": {
"id": "9a4587ad-da36-4e09-ba8c-eed769da48db",
"account": {
"id": "e49a1ac2-4e32-4f5d-a41c-bc4d983e5e9a",
"account_number": "1370758907",
"account_name": "Kelly Jones"
},
"merchant_id": "2br9bffb-a498-497c-9cfa-fd0412aa0410",
"reference": "API-VACT_TRA-30D70-bb882eaa-4850-4fb0-863b-c0f9775f65bb",
"spotflow_reference": "SPF-CRDT-af3c78785aa34cd9bff539576e76b75d",
"amount": 100,
"fee": 0,
"currency": "NGN",
"type": "credit",
"status": "successful",
"source": "virtual_account",
"description": "Transfer from AMY JAMES",
"sender": {
"account_name": "AMY JAMES",
"account_number": "8083299876",
"bank_name": "Paycom (Opay)"
},
"mode": "live",
"transaction_date": "2025-10-28T20:43:42Z"
}
}
```
#### ***Account Debit Successful from Main Wallet balances***
```yaml theme={null}
{
"event": "account_debit_successful",
"data": {
"id": "6bca4872-546c-4755-b27f-8338baae5fe3",
"account": {
"id": "04a6031a-ada4-4d25-9e49-1a9648f3fc17",
"account_number": "4576690890",
"account_name": "Main NGN Account"
},
"merchant_id": "2br9bffb-a498-497c-9cfa-fd0412aa8978",
"reference": "SPF-MHB1NQRN-84326FC1-AC66-4E36-9",
"spotflow_reference": "SPF-TRSF-f804244ea942479194b1d48ef578b5cb",
"amount": 100,
"fee": 0,
"currency": "NGN",
"type": "debit",
"status": "successful",
"source": "transfer",
"description": "foodstuff",
"destination": {
"account_name": "AMY JAMES",
"account_number": "8083299876",
"bank_code": "SPB-73260",
"bank_name": "Paycom (Opay)"
},
"mode": "live",
"transaction_date": "2025-10-28T20:53:56.060729Z"
}
}
```
# Overview
Source: https://docs.spotflow.one/developer-resources/webhooks/overview
Webhooks are your essential tool for real-time notifications. They provide instant, server-to-server notifications when critical events occur within the Spotflow platform, ensuring your application is always up-to-date, enabling seamless integration.
## Getting Started
This guide will walk you through setting up and securely handling webhooks. Our implementation follows the [Standard Webhooks](https://standardwebhooks.com/) specification.
Your webhook setup is simple: just define the URL where you want to receive event data. You'll find the **Webhook Payloads** for [payment collections](/developer-resources/webhooks/payment-collections) and [accounts i.e spotflow wallets and dynamic accounts](/developer-resources/webhooks/accounts) here.
Follow these steps to set up your webhook:
1. Access Webhook Settings: Navigate to the [Spotflow Dashboard](https://app.spotflow.co/) and go to Settings > API Keys.
2. Define your URL: Enter the URL where you want to receive webhook events. You can typically find a dedicated field here for your Webhook URL.
3. Save Changes: Ensure you enter your one time code from your Authenticator app and save the settings to activate the webhook URL.
**Idempotency (The "No Duplicates" Rule):** Each webhook event includes a unique webhook-id header. Use this identifier to implement idempotency. Your system must be designed to gracefully handle receiving the same event more than once (due to retries) without causing errors or duplicate actions.
## Securing Webhooks: Trust, but Verify
To protect your system from bad actors and ensure the data is authentically from Spotflow, always validate the payload and use HTTPS.
To verify signatures, we follow the Standard Webhooks specification. Each webhook request includes a webhook-signature header from us which is `x-spotflow-signature`, an HMAC SHA256 signature of the payload and timestamp.
**Ordering is Not Guaranteed:** Webhook events may be delivered out of order due to network retries. Always use the webhook-id or other data within the payload to ensure correct event processing, regardless of arrival sequence.
You will always receive the latest payload data at the time of delivery, regardless of when the webhook event was initially emitted.
# Payment Collections
Source: https://docs.spotflow.one/developer-resources/webhooks/payment-collections
This is the structure of the data payload sent to your webhook URL whenever a payment collection is successful within Spotflow.
## **Payment Collection Events**
| **Event Name** | **Event Type** | **Description** |
| ---------------------- | -------------------- | -------------------------------------------------------------------------------------------- |
| **Payment Successful** | `payment_successful` | Triggered when a payment is successfully processed. |
| **Payment Failed** | `payment_failed` | Occurs when a payment attempt fails due to customer errors, declined cards, or other issues. |
## **Payload Example Structure**
#### ***Payment Collection Successful***
```yaml theme={null}
{
"event": "payment_successful",
"data": {
"id": "f78ada70-3290-48d3-b751-6fd1a0c42564",
"reference": "ref-2d2dc728-57be-48b0-a1e1-ae798017f44c",
"spotflowReference": "SPF-PSK-a564bb4d43674d9c83c35ee99758cc7c",
"amount": 100,
"currency": "NGN",
"channel": "card",
"status": "successful",
"customer": {
"id": "2f39de57-e110-4423-8a66-9e643103da0a",
"name": "Olly",
"email": "olly@gmail.com",
"phoneNumber": "09098788901"
},
"providerMessage": "successful",
"rate": 18.5,
"region": "Nigeria",
"card": {
"type": "Mastercard",
"firstSix": "555555",
"lastFour": "4444"
},
"createdAt": "2025-10-28T19:07:38Z",
"metadata": {
"Test-Webhook": "test"
},
"totalTaxAmount": 0,
"totalLocalAmount": 100,
"planId": "95mn9078d-b11a-44b2-8422-a1955ca0lo7d"
}
}
```
#### ***Payment Collection Failed***
```yaml theme={null}
{
"event": "payment_failed",
"data": {
"id": "8da0788a-ef1d-43ac-915d-f2daf39f2940",
"reference": "ref-08ab300d-3f3a-443d-b928-312c400b3828",
"spotflowReference": "SPF-ISW-e68a4286577447d2a0baf3a6bcb3c110",
"amount": 2000.00,
"currency": "NGN",
"channel": "card",
"status": "failed",
"customer": {
"id": "2f39de57-e110-4423-8a66-9e643103da0a",
"name": "Olly",
"email": "olly@gmail.com",
"phoneNumber": "07001228900"
},
"providerMessage": "Error processing payment",
"rate": 1699.5,
"region": "Nigeria",
"card": {
"type": "Visa",
"firstSix": "408408",
"lastFour": "4081"
},
"createdAt": "2025-11-12T13:58:08Z",
"metadata": {
"SubscriptionPlan": "Test Trial",
"productName": "Free Trial"
},
"totalTaxAmount": 0.0000,
"totalLocalAmount": 2000.0000
}
}
```
# FAQs
Source: https://docs.spotflow.one/expert-desk/faq
Comprehensive answers to common questions about Spotflow, covering everything from onboarding, payments, subscriptions, compliance to technical integration, designed to help you navigate and make the most of our platform.
## Getting Started & Account Setup
A: Visit our dashboard and use your login email, password and OTP from your Authenticator app. If you face any issues, please reach out to our support team.
A: Verification requires your business registration documents (for KYB). For full details, check the [verification process page](/expert-desk/verification-process).
A: The process usually takes 24–72 working hours.
Note that this time may extend if additional documents are requested for compliance review.
A: You will receive an email with the reason and a message from our support team with more details about the issue. You’ll be able to resolve the issue, correct your documentation, and resubmit with the support team.
A: No, absolutely not. Start integrating immediately using Test Mode. Once your KYB verification is successful, you can switch to Live Mode instantly.
Learn more about the difference: [Test Mode vs. Live Mode](/expert-desk/test-mode-vs-live-mode).
A: Ensure you have submitted all KYB verification documents in the KYB onboarding page. If you are stuck past 24 hours, check that same page for any reasons why and contact the support team.
## Payment Collections & Transactions
A: Spotflow supports a variety of payment methods, including debit cards, bank transfers, EFT, mobile money, and virtual wallets. We handle both one-time and recurring subscription payments for digital products.
A: You can track the status of all payments from the Collections Page of your dashboard.
Transactions are listed with clear indicators: In Progress, Abandoned, Failed, or Successful.
A: Spotflow charges the customer immediately upon subscription creation unless the product has been configured with a trial period.
A: You likely attempted to test a real card using your Live Keys.
Always test using your Test Keys and the [test card numbers](/expert-desk/testing-payments) provided in our documentation.
## Payouts & Funds Flow
A: Payouts are the transfer of your collected revenue to your preferred bank account.
Payouts are processed at most T+1 days, barring bank holidays or emergencies.
A: Payout fees are the transaction costs for transferring funds from Spotflow to your bank account. We constantly work with local partners to reduce these costs.
Please reach out to our support team for detailed information.
## Webhooks & Technical Integration
A: No. For security and compliance, the hosted checkout flow does not support embedding in an iframe.
You must redirect users to the Spotflow checkout URL.
A: - Webhook URL: Configured in your Dashboard. Receives secure POST payloads about events.
* Callback/Redirect URL: Configured in your dashboard or sent in your payment API request.
It sends the user's browser back to your app with basic query parameters (?status=successful).
Use Webhooks to automate things like DB updates, and callbacks/redirects to show thank you screens.
A: No. Redirect parameters are user-facing and can be tampered with.
Always use and wait for payment.successful webhooks or make a final API call to the verify payment endpoint to confirm payment status.
Treat redirects as confirmations for the user, not proof of payment.
A: Check this list:
1. Is your webhook URL configured correctly in the Dashboard?
2. Are you confusing the webhook URL with the callback/redirect URL?
3. Does your URL accept POST requests and reply with a 2xx status? If the issue persists, escalate on your dedicated support group chat.
You can have both a webhook and a callback/redirect URL - they serve different purposes.
A: Check the Signature. Every webhook includes a x-spotflow-signature header.
You must use your Webhook Secret Key to recompute the HMAC-SHA256 signature and compare it to the received signature from Spotflow.
If they match, the webhook is authentic. We recommend using libraries provided by [Standard Webhooks](https://www.standardwebhooks.com/).
## Testing & Local Development
A:Yes — subscriptions can be fully simulated and tested in Test Mode. Ensure you don’t use real test cards.
A:Yes. Using real customer names/emails helps debug your full workflow, simulate webhooks but no real money will be transferred.
Card details must be test cards.
A:
* On your Spotflow dashboard, look for a Test Mode toggle.
* Switch to use test mode and simulate payments.
* You’ll see “Test Mode” label on all screens. Make sure to use the corresponding API key or environment when switching.
## Support & Security
A:You can contact our support team by sending an email to [support@spotflow.one](mailto:support@spotflow.one). We are here to assist you with any issues or questions you may have.
A: If you've messaged your dedicated personalized group chat and there is no response, escalate immediately by emailing [support@spotflow.one](mailto:support@spotflow.one) with the subject line URGENT: No Response – \[Your Email].
A: We use real-time fraud detection to monitor suspicious transactions and maintain PCI-DSS compliance to ensure all payment information is encrypted and secure.
A: Yes. We rely on data encryption and tokenization. We never store raw customer payment data directly on our servers, ensuring maximum security during transactions.
# Help and Support
Source: https://docs.spotflow.one/expert-desk/help-support
We understand that even the most seamless platforms require a lifeline now and then. At Spotflow, we keep our support channels tight and highly technical, ensuring you get the right expert, fast.
## 1. **Self-Service Documentation (The First Stop)**
The Spotflow Documentation Portal is your primary resource for comprehensive platform and integration details. Before raising an issue, 99% of your answers are here.
This portal includes: Detailed feature explanations, step-by-step integration guides, API documentation, and Frequently Asked Questions (FAQs).
This feature empowers you as a merchant with structured, self-paced learning to master our platform on your own time.
📌 **Best for**: Technical documentation, In-depth learning and implementation guidance.
## 2. **Dedicated Technical Chat Support**
If you hit a wall, you need engineers, not bots. For complex or integration-specific issues, we move straight to a personalized technical group chat.
* The Channel: We prefer Slack, but WhatsApp groups are also available upon request if preferred.
* The Team: When you raise an issue that requires escalation, we assemble a dedicated channel for you that includes:
1. Integration Engineers to guide your setup with technical walkthrough calls/videos.
2. Support/Operations Specialists for account-level issues or questions.
3. Backend Engineers (for deep technical bug fixes).
📌 **Best for**: Account-related concerns, technical escalations, and complex troubleshooting that requires direct code-level input.
**Our Pledge**: We skip the long queue. If your issue is confirmed as technical, we get the right eyes on it immediately to unblock your development.
Response and resolution time is instantaneously 1 hour to 24 business hours.
## **Your Support Channels Overview**
| **Support Channel** | **Purpose** | **Response Time** |
| --------------------- | ------------------------------------------- | ----------------- |
| **Self-Service Docs** | Integration guides, API reference, features | Self-paced |
| **Chat Support** | Personalized assistance for complex issues | 1 hour - 24 hours |
As a merchant, you can choose the channel that best suits your need—whether it’s self-paced discovery or urgent technical intervention based on the complexity of your query and the required response time.
For further assistance, kindly send an email to [support@spotflow.one](mailto:support@spotflow.one).
# Adding Fake Funds for Testing
Source: https://docs.spotflow.one/expert-desk/simulating-funds
Learn how to use our funding simulator to add fake money to your virtual accounts and currency balances. This is currently for NGN and GHS only.
When you connect Spotflow to your app, you will need to test how your system handles incoming money—like what happens when a customer pays into a virtual account and how your system updates your balance.
Since you cannot use real money during development, Spotflow provides a [**Funding Simulator Web App**](https://jollofbank.spotflow.one/) so you can safely send fake money to your test accounts.
## Supported Ways to Add Test Funds
Spotflow lets you send fake funds to two types of accounts. The simulator automatically routes the money to your currency balances:
| Account Type | What it is | How to test it |
| :----------------------------------------------- | :-------------------------------------------------------------------------- | :-------------------------------------------------------------------------------- |
| **Virtual Accounts** | Unique bank account numbers created for your customers. | Type in the customer's test `accountNumber` to pretend they made a bank transfer. |
| **Balances** | Separate currency pockets that shows the main account for those currencies. | Enter the account balance to add money directly to a specific currency balance. |
| **Payment links and Bank Transfers on Checkout** | Separate currency pockets that shows the main account for those currencies. | Enter the account balance to add money directly to a specific currency balance. |
***
## Adding Test Funds Using the Web App
If you want to test incoming payments quickly without writing any code, you can use our live web funding simulator app:
**[Launch Spotflow Funding Simulator](https://jollofbank.spotflow.one/)**
### Steps to follow:
1. **Get your details:** Go to your Spotflow Dashboard (make sure you are in **Test Mode**) and copy a virtual account number that you created, or main account number in your separate currency balances.
2. **Open the web app:** Launch the [Funding Simulator](https://jollofbank.spotflow.one/).
3. **Fill out the form:**
* **Account Number:** Paste the number you copied in Step 1.
* **Currency:** Pick your test currency (`NGN`, `GHS` only).
* **Amount:** Type in any number you want to send.
* **Narration (*Optional*):** Add a short note (like "test transfer") to help you find it in your logs later.
4. **Click Send:** Hit **Fund Account**. The form will instantly clear out, and a message will pop up confirming it worked!
**HOW TO CHECK IF IT WORKED**
Once the simulator says "Success!", open your **Spotflow Test Dashboard** or check your app backend. The balance will update instantly, you'll receive an email and your system will receive a webhook notification.
***
## Testing Webhooks
Whenever you use the Funding Simulator to send a successful test payment, Spotflow will automatically send a notification payload to your webhook link set up on your dashboard.
Look out for the `account_credit_successful` event name:
```json theme={null}
{
"event": "account_credit_successful",
"data": {
"account": {
"accountName": "Main NGN Account",
"accountNumber": "04a6031a-ada4-4d25-9e49-1a9648f3fc17",
"id": "04a6031a-ada4-4d25-9e49-1a9648f3fc17"
},
"amount": 105,
"currency": "NGN",
"description": "NIP/John Doe to SPOTFLOWMAIN NGN ACCOUNTSent 105 to Jollof Bank M/2264619087",
"fee": 0,
"id": "0676224b-59da-46ce-a1f9-f18b4337a2f9",
"merchantId": "98wgbffb-a498-497c-9cfa-fd0412aa0410",
"mode": "live",
"reference": "API-VACT_TRA-30D70-8011ffbe-10af-4961-813f-cf9c4f5b6d70",
"sender": {
"accountName": "John Doe",
"accountNumber": "1013339087",
"bankName": "Jollof Bank"
},
"source": "virtual_account",
"spotflowReference": "SPF-CRDT-98ij44a277c04225a31e5d397a34987y",
"status": "successful",
"transactionDate": "2026-05-20T10:31:39Z",
"type": "credit"
}
}
```
# Test Mode Vs Live Mode
Source: https://docs.spotflow.one/expert-desk/test-mode-vs-live-mode
Learn the critical differences between Test and Live mode and how to switch between them.
Test Mode is your sandbox: a safe, isolated environment for you to code, simulate, and debug your entire Spotflow integration without touching real money. Live Mode is the production environment where your business accepts and processes actual payments.
Find the detailed breakdown of the features available in test mode vs live mode.
## Feature Comparison
| **Feature** | **Test Mode** | **Live Mode** | **Is Environment Dependent?** |
| --------------------------------------------- | ------------- | ------------- | ----------------------------- |
| **Create Subscription plans** | ✓ | ✓ | YES |
| **Generate Payment Links** | ✓ | ✓ | YES |
| **Simulate Payments (Card, Transfers, etc.)** | ✓ | x | YES |
| **Process Real Payments** | x | ✓ | YES |
| **Issue Refunds on Collections** | ✓(Simulated) | ✓ (Real) | YES |
| **Access Transaction History** | ✓(Simulated) | ✓ (Real) | YES |
| **Payouts to Bank Account** | x | ✓ | YES |
| **API Keys generation** | ✓ | ✓ | YES |
| **Real-time Fraud Detection** | x | ✓ | YES |
| **Webhook Creation** | ✓ | ✓ | YES |
| **My Profile section** | ✓ | ✓ | NO |
| **Transaction Emails** | ✓(Simulated) | ✓ | YES |
### Environment Dependency
**Environment Dependent(YES):** Data created here lives here. API Keys, transaction history are completely isolated and changes made in one environment will not affect the other. Eg. API Keys generated in Test Mode will be independent of API keys generated in Live Mode and vice versa. So changes in Test Mode will never affect your Live deployment, and vice versa.
**Environment Independent(NO):** Features like your My Profile section maintain the same data across both modes. Changes made in one will affect the other. Eg. My Profile section will have the same data in test mode and live mode.
Live Mode will be available only post successful completion of Identity verification and Business Verification. You can accept real payments only in \`live mode\`.
Live Mode is accessible only after successful completion of KYB verification. You cannot accept real payments until this step is complete.
API Hostnames for Test Mode and Live Mode are below:
The API Hostnames for both environments is [`app.spotflow.co`](https://api.spotflow.co)
## Key Highlights
1. Isolation is Key: All products, API keys, and webhooks created are strictly limited to their respective environments.
2. KYB Submission: Documents submitted for KYB verification are shared between both environments.
## Testing
For detailed information on the test cards, please refer to our comprehensive [Testing Payments](/expert-desk/testing-payments) guide.
You can use our [Fund Simulator App](https://jollofbank.spotflow.one/) to add fake funds for transfers/accounts crediting. Please refer to our [Adding Fake Funds For Testing](/expert-desk/simulating-funds) guide to know more.
Test payment methods are only valid in test mode. Never use them for real payments.
# Testing Payments
Source: https://docs.spotflow.one/expert-desk/testing-payments
You can use the following details to test your implementation for card and mobile money payments before going live. Note that this works only with your test keys.
## Cards
#### ***NGN Successful Payments***
| **Auth** | **Number** | **Expiry** | **CVV** | **PIN** | **OTP** |
| ------------- | ---------------- | ---------- | ------- | ------- | ------------------------------------------------------------------------------------ |
| **No Auth** | 4111112000062555 | 12/2030 | 321 | - | - |
| **PIN** | 5555558684543932 | 12/2030 | 321 | 4321 | - |
| **PIN + OTP** | 5555567973581842 | 12/2030 | 321 | 4321 | 654321 |
| **3DS** | 5555577124976817 | 12/2030 | 321 | - | - |
| **AVS** | 4111124373708482 | 12/2030 | 321 | - | Address: 1, Spotflow Street, City: Lekki, State: Lagos, Country: Nigeria, ZIP: 10123 |
## Mobile Money
#### ***GHS Successful Payments***
| **Phone Number** | **OTP** |
| ---------------- | ------- |
| **0244123456** | 654321 |
| **0987654321** | 654321 |
#### ***ZAR Successful Payments***
| **Phone Number** | **OTP** |
| ---------------- | ------- |
| **0710000000** | 654321 |
#### ***KES Successful Payments***
| **Phone Number** | **OTP** |
| ---------------- | ------- |
| **0712345678** | 654321 |
| **0710000000** | 654321 |
#### ***TZS Successful Payments***
| **Phone Number** | **OTP** |
| ---------------- | ------- |
| **0729004954** | 654321 |
### So the XAF & XOF numbers below should be used respectively for the countries and their countryCodes in brackets.
West African CFA Franc - XOF
* Ivory Coast (CI)
* Senegal (SN)
* Burkina Faso (BF)
* Mali (ML)
* Benin (BJ)
* Niger (NE)
* Togo (TG)
* Guinea-Bissau (GW)
Central African CFA Franc - XAF
* Cameroon (CM)
* Gabon (GA)
* Chad (TD)
* Republic of the Congo (CG)
* Equatorial Guinea (GQ)
* Central African Republic (CF)
#### ***XAF Successful Payments Choosing only MTN as the Provider on Checkout***
| **Phone Number** | **OTP** |
| ---------------- | ------- |
| **892009934** | 654321 |
#### ***XOF Successful Payments Choosing only MTN as the Provider on Checkout***
| **Phone Number** | **OTP** |
| ---------------- | ------- |
| **734177280** | 654321 |
To test other payment methods like bank transfer in test mode, follow the usual testing procedures and using Spotflow's Jollof Bank test account details created for you, you can use our [Fund Simulator App](https://jollofbank.spotflow.one/) to add fake funds.
Kindly refer to our [Adding Fake Funds For Testing](/expert-desk/simulating-funds) guide to know more.
# Verification Process
Source: https://docs.spotflow.one/expert-desk/verification-process
Learn how to successfully complete our mandatory onboarding verification process, ensuring compliance and facilitating quick approval so you can start processing payments.
At Spotflow, a thorough verification process is non-negotiable. We are a Merchant of Record, and we take compliance seriously with regulatory standards and platform policies.
This process covers Business Verification and strict Anti-Money Laundering (AML) checks.
### KYB Verification (Know Your Business)
This is required for all registered entities to confirm company legitimacy and the authority of its representatives.
Required Details:
* **Company Registration Number**: Provide the number and a supporting document (e.g., Certificate of Incorporation).
* **Tax ID**: Provide a valid Tax ID and its documents. (Examples: EIN, CRN, VAT ID, GSTIN)
* **Director/Owner Information**: Details about all individuals appointed as Directors/Business Owners, as per local laws.
### Additional Information
Our compliance team may occasionally request additional information from time to time. These requests won't block payments, but failure to submit them may result in temporary pauses in payouts or account restrictions.
### Timeline & Support
* Typical verification time: **1–3 business days (weekends and public holidays excluded)**
* Support: If you need assistance, reach out to [support@spotflow.one](mailto:support@spotflow.one).
### Resubmission of Documents
If there are issues with your initial submission, our Support/Compliance Team will notify you via email and request specific documents.
### When Resubmission is needed:
* **Missing or Incomplete essential details**: If essential details such as identification numbers, business name, or other key data are missing.
* **Document Mismatch with the information provided**: When the documents submitted do not match the business or personal information provided.
* **Unreadable or Expired documents**: If the uploaded documents are unclear, illegible, or have expired.
* **Additional Clarification Needed**: If the verification team requires further documentation to clarify your identity or business information.
### How to Resubmit Documents:
Simply reply to the notification email from our support team at [support@spotflow.one](mailto:support@spotflow.one) and send the corrected files.
# Account Management
Source: https://docs.spotflow.one/features/account-management
The Payout process is how your earned revenue moves from your Spotflow Balance to your preferred Bank Account via Bank Transfer. We offer flexible cycles to match your cash flow needs.
## My Profile: Personalize your space
Merchants can easily access and manage their personal account information for a more customized Spotflow experience. This includes updating contact details and your brand’s logo.
### Access and Update Your Profile
1. Navigate to Profile: Go to Settings → Profile.
2. Edit Details: Here, you can update your Contact Name and upload your Profile Image/Logo for personalization.
3. Save: Click Save to apply the changes.
# Available Regions
Source: https://docs.spotflow.one/features/available-regions
Explore Spotflow's geographic coverage and supported payment channels.
## Overview
Spotflow provides a unified payment infrastructure that helps global and African businesses manage collections, disbursements, and multi-currency settlements through a single integration. We offer payment orchestration (**cards**, **mobile money**, **bank transfers**, **EFT**), built-in liquidity and reconciliation, and a compliance rail that handles KYC, AML, and regulatory requirements across markets.
Our platform is built for enterprises, African businesses, and fintechs/PSPs that want to expand into Africa and other regions without stitching together multiple local providers, supported by developer-first APIs and deep integrations with major PSPs.
### Region Coverage & Payment Methods
| Region | Payment Methods | Supported MNOs |
| :---------------- | :------------------------- | :--------------------------------- |
| **Benin** | Mobile Money | MTN, Moov |
| **Burkina Faso** | Mobile Money | Orange, Mobicash |
| **Cameroon** | Mobile Money | Orange, MTN |
| **Côte d’Ivoire** | Mobile Money | Orange, MTN, Moov, Wave |
| **Egypt** | Card | — |
| **Ghana** | Card, Mobile Money | Airtel, MTN, Vodafone |
| **Kenya** | Mobile Money | SAFKE, AIRTELKE |
| **Mali** | Mobile Money | Orange, Mobicash |
| **Nigeria** | Card, Bank transfers, USSD | — |
| **Senegal** | Mobile Money | Orange, Free, Wave |
| **South Africa** | EFTs, Card | - |
| **Tanzania** | Mobile Money | Halotel, AIRTELZ, VodaMula, TIGOTZ |
| **Togo** | Mobile Money | Moov, Togocell |
| **Uganda** | Mobile Money | AIRTELUG, MTNUG |
| **Zambia** | Mobile Money | PRIMENET, TINGGMTN, TINGGZAMTEL |
# Virtual Accounts
Source: https://docs.spotflow.one/features/dynamic-accounts
Virtual accounts are intelligent payment routing tools that automatically channel incoming collections directly to your main Spotflow account. Think of them not as bank accounts that hold money, but as virtual smart conduits that simplify payment collection without fund segregation.
### Key Features
| **Feature** | **Description** |
| --------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| **Payment Routing** | Automatically forward all incoming collections to your main merchant account. |
| **No Fund Storage** | Virtual accounts do not hold or store money independently—it's immediately routed. |
| **Simplified Setup** | No lengthy verification (like BVN) is required during the creation process. |
| **API-Driven** | All Virtual account operations are performed seamlessly through API endpoints. |
| **Expiry Time Limit** | Accounts have a default maximum expiry of 30 minutes, but you can set your own time limit via the API during creation. |
### Key Features
Virtual accounts are collection-focused, meaning they come with strict restrictions:
* No Outgoing Payments: They cannot be used to process outbound transfers or payments (they're strictly a one-way street).
* No Terminal Support: They cannot be linked to payment terminals or POS devices.
* Routing Only: Their function is exclusively as payment collection points.
### API Operations
| **Action** | **Endpoint** | **Key Detail** |
| ------------------ | ------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------- |
| **Create Account** | [Virtual Account Creation API](/api-reference/dynamic-accounts/create-dynamic-account) | Specify parameters (name, currency), returns a unique Virtual account number. No BVN needed for creation. |
| **Fetch Data** | [Fetch Virtual Account by ID Endpoint](/api-reference/dynamic-accounts/dynamic-account-id) | Retrieve individual account information and access its status. |
| **List All** | [List Virtual Accounts Endpoint](/api-reference/dynamic-accounts/list-dynamic-account) | Retrieve all accounts (test or live). Supports filtering and provides efficient, paginated responses. |
### Webhook Notifications
You will receive webhook and email notifications when a Virtual account is funded.
**Action Item**: Ensure you configure your system to receive these payment status updates. Set or update your Webhook URL on the merchant dashboard under Settings → API & Webhooks → URLs.
# Mobile Money Subscriptions
Source: https://docs.spotflow.one/features/mobile-money-subscriptions
Set up recurring billing plans and collect automated subscription payments using Mobile Money providers.
# Mobile Money Subscriptions
Spotflow supports recurring billing through mobile money, allowing you to charge customers on a set schedule using their mobile money wallets.
**How MoMo subscriptions differ from card subscriptions**
Card subscriptions charge the customer automatically in the background after the first payment. Mobile money networks do not allow silent background charges. Because of telecom rules, **the customer must approve each recurring payment directly on their phone.**
Spotflow handles this with a semi-automated workflow that sends reminders, renewal links, payment prompts, and retries on your behalf.
***
## What Spotflow Handles for You
* **Reminder emails** sent to customers before their next billing date
* **Renewal checkout links** included in every reminder so customers can pay early
* **Direct phone prompts (STK Push)** sent on the due date for one-tap approval
* **Automatic retries** if the due-date payment fails
* **Webhooks** sent to your server whenever a subscription changes state
***
## Supported Regions and Providers
| Country | Provider |
| ---------------------------- | ------------------------------------------------------------------------- |
| Ghana | MTN Mobile Money, Telecel Cash (formerly Vodafone Cash), AirtelTigo Money |
| Kenya | M-Pesa (Safaricom), Airtel Money |
| Cameroon | MTN Mobile Money, Orange Money |
| Congo | MTN Mobile Money, Airtel Money |
| Democratic Republic of Congo | MTN Mobile Money, Airtel Money, M-Pesa (Vodacom) |
| Gabon | MTN Mobile Money, Airtel Money |
| Rwanda | MTN Mobile Money, Airtel Money |
| Senegal | Orange Money, Wave |
| Sierra Leone | MTN Mobile Money, Orange Money, Africell Money |
| Uganda | MTN Mobile Money, Vodafone Cash, AirtelTigo Money |
| Zambia | MTN Mobile Money, Vodafone Cash, AirtelTigo Money |
| Benin | MTN Mobile Money, Vodafone Cash, AirtelTigo Money |
Support for more providers and regions is ongoing. Contact [support@spotflow.one](mailto:support@spotflow.one) to check availability for your requested region.
***
## How Card and Mobile Money Subscriptions Compare
| | Card Subscriptions | Mobile Money Subscriptions |
| ------------------------------ | ------------------------------------- | ------------------------------------------------ |
| **How recurring charges work** | Card token stored after first payment | Customer approves each renewal |
| **Customer action required** | First payment only | Phone prompt approval on each due date |
| **Renewal trigger** | Automatic via stored token | Automatic phone prompt on due date |
| **Failure scenario** | Card decline or expiry | Insufficient balance, prompt ignored, or timeout |
| **Supported currencies** | USD, NGN, GHS, and others | Depends on provider and region |
***
## The Subscription Lifecycle
Before subscribing a customer, create a plan that sets the price, currency, and billing frequency.
```json theme={null}
{
"title": "Standard Monthly Plan",
"frequency": "monthly",
"internalReference": "PLAN-STD-001",
"pricingOptions": [
{ "amount": 123, "currency": "NGN" }
]
}
```
See [Create Plan](/api-reference/subscription-plans/create-single-plan) below for all available fields including trials, cycle limits, and end dates.
Start the subscription by initiating a payment with the customer's mobile money details and the `planId`.
```json theme={null}
{
"reference": "SUB-10001",
"planId": "9743add1-5f71-4d8d-a2aa-1ec5dc554a93",
"currency": "GHS",
"localCurrency": "GHS",
"amount": 10,
"channel": "mobile_money",
"customer": {
"name": "John Doe",
"phoneNumber": "233XXXXXXXXX",
"email": "john@example.com"
},
"mobileMoney": {
"phoneNumber": "233XXXXXXXXX",
"provider": "telecel"
}
}
```
If you omit `planId`, the payment is treated as a one-time charge, not a subscription.
Once the first payment succeeds, the subscription becomes active and the billing cycle begins.
Spotflow automatically sends reminder emails with a secure checkout link before each billing date.
* **Weekly plans:** Reminder sent 3 days before expiry
* **Monthly and yearly plans:** Reminders sent 1 week before expiry, then again 3 days before
If the customer has not renewed early using the checkout link, Spotflow sends an automatic payment prompt directly to their phone on the due date. The customer approves it by entering their mobile wallet PIN.
If the due-date payment fails:
* A retry email with a fresh checkout link is sent every **3 days** after the due date
* If no payment is received by the **4th day after the due date**, the subscription is automatically cancelled
***
## Create Plan
**Endpoint:** `POST /api/v1/plans`
```json theme={null}
{
"title": "Standard Monthly Plan",
"frequency": "monthly",
"internalReference": "PLAN-STD-001",
"pricingOptions": [
{ "amount": 123, "currency": "NGN" }
],
"trial": {
"periodInDays": 7,
"pricingList": [
{ "amount": 0, "currency": "NGN" }
]
},
"endDate": "2026-10-29",
"cycleCount": 3,
"retrial": 2
}
```
### Request Body
| Field | Type | Required | Description |
| ------------------- | -------- | -------- | ------------------------------------------------------------------------------------------ |
| `title` | string | Yes | Name of the subscription plan |
| `frequency` | string | Yes | How often to bill: `weekly`, `monthly`, `yearly` |
| `internalReference` | string | Yes | Your own internal reference for the plan |
| `pricingOptions` | array | Yes | List of prices per currency |
| `trial` | object | No | Trial configuration. See [Plan Trials](/features/plan-trials-discounts-and-currency-rules) |
| `endDate` | datetime | No | The date all subscription cycles end |
| `cycleCount` | integer | No | Maximum number of billing cycles before the subscription completes |
| `retrial` | integer | No | Number of retry attempts for failed payments. Applies to card subscriptions only |
### Retrial Limits by Frequency
| Frequency | Maximum Retries |
| --------- | --------------- |
| Hourly | 2 |
| Daily | 6 |
| Weekly | 9 |
| Monthly | 10 |
| Yearly | 10 |
`retrial` defaults to `0`, which means no retries. Set a value above `0` to enable automatic payment retries on card subscriptions.
***
## Subscription Statuses
| Status | What it means |
| ----------- | ---------------------------------------------------------------------------------- |
| `active` | The subscription is running and waiting for the next billing cycle |
| `failed` | All retry attempts were exhausted and payment was never collected |
| `completed` | The subscription reached its set end date or cycle count |
| `cancelled` | The subscription was stopped by you, the customer, or the system after non-payment |
***
## Subscription Management Endpoints
| Method | Endpoint | Description |
| ------ | ------------------------------------------- | ------------------------------------------------------------- |
| `GET` | `/subscriptions` | Returns a paginated list of all subscriptions |
| `GET` | `/subscriptions/{subscription-id}` | Returns details for a single subscription |
| `GET` | `/subscriptions/count/{plan-id}` | Returns a count of subscriptions grouped by status for a plan |
| `POST` | `/subscriptions/{subscription-id}/activate` | Reactivates a cancelled subscription |
| `POST` | `/subscriptions/{subscription-id}/cancel` | Cancels an active subscription |
***
## Webhooks and Events
Spotflow sends a `POST` request to your webhook URL whenever a subscription changes state. All events share the same payload structure.
### Payload Structure
```json theme={null}
{
"event": "event_name",
"data": {
"id": "subscription-id",
"customerId": "customer-id",
"planId": "plan-id",
"status": "subscription-status",
"amount": 10,
"currency": "GHS",
"regionName": "Ghana",
"startDate": "2026-05-15T12:55:45.407Z",
"nextPaymentDate": "2026-05-22T12:55:45.407Z",
"createdAt": "2026-05-15T12:55:45.408Z",
"metadata": {}
}
}
```
### Event Reference
| Event | When it fires |
| ----------------------------- | ------------------------------------------------------------- |
| `subscription_created` | A new subscription was created successfully |
| `subscription_activated` | A cancelled subscription was reactivated |
| `subscription_renewed` | A recurring payment succeeded before expiry |
| `subscription_cancelled` | A subscription was cancelled |
| `subscription_payment_failed` | A single recurring payment attempt failed |
| `subscription_failed` | All retry attempts were exhausted and the subscription failed |
| `subscription_completed` | The subscription reached its configured end condition |
```json theme={null}
{
"event": "subscription_created",
"data": {
"id": "913e4921-60e0-4883-b042-aa57d7b97380",
"customerId": "fdfa9e33-babb-44da-add0-a48a9b2e5854",
"planId": "9743add1-5f71-4d8d-a2aa-1ec5dc554a93",
"status": "active",
"amount": 10,
"currency": "GHS",
"regionName": "Ghana",
"startDate": "2026-05-15T12:55:45.407Z",
"nextPaymentDate": "2026-05-22T12:55:45.407Z",
"createdAt": "2026-05-15T12:55:45.408Z",
"metadata": {}
}
}
```
```json theme={null}
{
"event": "subscription_activated",
"data": {
"id": "913e4921-60e0-4883-b042-aa57d7b97380",
"customerId": "fdfa9e33-babb-44da-add0-a48a9b2e5854",
"planId": "9743add1-5f71-4d8d-a2aa-1ec5dc554a93",
"status": "active",
"amount": 10,
"currency": "GHS",
"regionName": "Ghana",
"startDate": "2026-05-15T12:55:45.407Z",
"nextPaymentDate": "2026-05-22T12:55:45.407Z",
"createdAt": "2026-05-15T12:55:45.408Z",
"metadata": {}
}
}
```
```json theme={null}
{
"event": "subscription_renewed",
"data": {
"id": "913e4921-60e0-4883-b042-aa57d7b97380",
"customerId": "fdfa9e33-babb-44da-add0-a48a9b2e5854",
"planId": "9743add1-5f71-4d8d-a2aa-1ec5dc554a93",
"status": "active",
"amount": 10,
"currency": "GHS",
"regionName": "Ghana",
"startDate": "2026-05-15T12:55:45.407Z",
"nextPaymentDate": "2026-05-22T12:55:45.407Z",
"createdAt": "2026-05-15T12:55:45.408Z",
"metadata": {}
}
}
```
```json theme={null}
{
"event": "subscription_cancelled",
"data": {
"id": "913e4921-60e0-4883-b042-aa57d7b97380",
"customerId": "fdfa9e33-babb-44da-add0-a48a9b2e5854",
"planId": "9743add1-5f71-4d8d-a2aa-1ec5dc554a93",
"status": "cancelled",
"amount": 10,
"currency": "GHS",
"regionName": "Ghana",
"startDate": "2026-05-15T12:55:45.407Z",
"nextPaymentDate": "2026-05-22T12:55:45.407Z",
"createdAt": "2026-05-15T12:55:45.408Z",
"metadata": {}
}
}
```
```json theme={null}
{
"event": "subscription_payment_failed",
"data": {
"id": "913e4921-60e0-4883-b042-aa57d7b97380",
"customerId": "fdfa9e33-babb-44da-add0-a48a9b2e5854",
"planId": "9743add1-5f71-4d8d-a2aa-1ec5dc554a93",
"status": "active",
"amount": 10,
"currency": "GHS",
"regionName": "Ghana",
"startDate": "2026-05-15T12:55:45.407Z",
"nextPaymentDate": "2026-05-22T12:55:45.407Z",
"createdAt": "2026-05-15T12:55:45.408Z",
"metadata": {}
}
}
```
```json theme={null}
{
"event": "subscription_failed",
"data": {
"id": "913e4921-60e0-4883-b042-aa57d7b97380",
"customerId": "fdfa9e33-babb-44da-add0-a48a9b2e5854",
"planId": "9743add1-5f71-4d8d-a2aa-1ec5dc554a93",
"status": "failed",
"amount": 10,
"currency": "GHS",
"regionName": "Ghana",
"startDate": "2026-05-15T12:55:45.407Z",
"nextPaymentDate": "2026-05-22T12:55:45.407Z",
"createdAt": "2026-05-15T12:55:45.408Z",
"metadata": {}
}
}
```
```json theme={null}
{
"event": "subscription_completed",
"data": {
"id": "913e4921-60e0-4883-b042-aa57d7b97380",
"customerId": "fdfa9e33-babb-44da-add0-a48a9b2e5854",
"planId": "9743add1-5f71-4d8d-a2aa-1ec5dc554a93",
"status": "completed",
"amount": 10,
"currency": "GHS",
"regionName": "Ghana",
"startDate": "2026-05-15T12:55:45.407Z",
"nextPaymentDate": "2026-05-22T12:55:45.407Z",
"createdAt": "2026-05-15T12:55:45.408Z",
"metadata": {}
}
}
```
***
## Cancelling a Mobile Money Subscription
* **Cancel one customer's subscription:** [Cancel Subscription](/api-reference/subscriptions/subscription-cancel)
* **Cancel an entire plan:** [Cancel Plan](/api-reference/subscription-plans/cancel-plan) — stops all active subscriptions under that plan
* **Reactivate a cancelled subscription:** [Activate Subscription](/api-reference/subscriptions/subscription-activate)
***
## Best Practices
* **Always collect the customer's phone number** at sign-up. Spotflow needs it to send the payment prompt to the right wallet.
* **Tell customers what to expect.** Let them know upfront that they will receive a phone prompt to approve recurring charges. Unexpected prompts are the most common reason for declines.
* **Build a re-enrolment flow.** If a mandate expires or a subscription is cancelled due to non-payment, customers should be able to restart easily with the same plan.
* **Notify before the first charge after a trial.** Spotflow triggers the charge automatically when a trial ends. Send your own reminder 24 hours before so the customer expects the prompt and has funds in their wallet.
* **Test everything in test mode first.** Simulate approvals, failures, and retries before going live.
Free trials and discounts are fully supported for mobile money subscriptions. See [Plan Trials & Currency Rules](/features/plan-trials-and-currency-rules).
***
## Need Help?
Reach out to the Spotflow team at [support@spotflow.one](mailto:support@spotflow.one)
# MoR VS PG
Source: https://docs.spotflow.one/features/mor-vs-pg
Digital businesses often face a choice: the hands-on approach of a Payment Gateway (PG) or the simplified path of a Merchant of Record (MoR). At Spotflow, we operate as your Merchant of Record (MoR) to simplify global payments, especially across Africa, by managing compliance, local taxes, and complex payment rails.
## Introduction
This guide compares the MoR model with the traditional Payment Gateway approach, helping you understand the advantages Spotflow brings to your business.
## The Core Difference
| Feature | MoR (Spoflow) | Payment Gateway (Traditional PG) |
| ---------------- | ------------------------------------------------------------------------ | ------------------------------------------------------------------ |
| Legal Seller | Spotflow assumes legal seller status (MoR) | Your Company |
| Tax & Compliance | Spotflow handles local taxes, VAT, and regulatory burden | You are responsible for local laws, tax collection, and remittance |
| Payment Methods | Access to local methods (Mobile Money, EFT) across 13+ African countries | Limited to major global card networks |
| Risk Management | Built-in fraud and chargeback protection | You manage and set up your own tools |
| Payouts | Aggregated, simplified global payouts to your preferred account | Direct from PG to you, requiring complex bank setup |
## What It Means For You
Choosing Spotflow as your MoR means we become the legal seller to your customers, allowing you to:
* Launch Fast in Africa: Instantly access local payment methods crucial for conversion (Mobile Money, Bank Transfers) without integrating multiple PSPs.
* Decentralize Risk: Spotflow assumes liability for compliance, local laws, and currency conversion.
* Focus on Product: Skip setting up local entities, avoid handling VAT/GST, and reduce your entire legal risk profile.
* Visual: Imagine selling a subscription in Ghana. With Spotflow, we collect the payment via Mobile Money, handle the local tax, and send you the net revenue. No local entity required. Just growth.
## Why It Matters for African Expansion
For scaling digital businesses, managing multiple local payment rails and tax mandates is the bottleneck.
| With a Payment Gateway... | With Spotflow as Your MoR... |
| ------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- |
| You are responsible for integrating/maintaining 13+ local payment integrations. | You gain access to a unified library of high-conversion payment methods managed by us. |
| You must handle local tax and VAT registration in every country you sell in. | Taxes are calculated, collected, and remitted on your behalf automatically. |
## Who Should Use MoR?
Spotflow is ideal for:
* SaaS & digital product companies targeting or scaling across Africa.
* Businesses who want to offer Mobile Money and local bank transfers without technical overhead.
* Anyone who prefers to outsource the complexity of global tax, compliance, and payment operations.
## Why Choose Spotflow?
We offer the comprehensive solution for selling digital products globally:
* All-in-one payments, tax, and compliance stack.
* Real-time FX and multi-currency support.
* Integrated access to critical African local payment rails.
* Automated tax handling and built-in fraud prevention.
Let Spotflow handle the hard stuff—so you can focus on building a great product.
# Accepting Payment Collections
Source: https://docs.spotflow.one/features/payment-collections
Payments are processed by creating a transaction using our APIs, libraries, or SDKs.
We offer flexible solutions to match your integration preference:
### I. Integration Options: Choose Your Flow
| **Solution** | **Best For** | **Technical Flow** |
| ----------------------------------------------------------------------- | ------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------- |
| **[Spotflow Redirect](/api-reference/payments/initialize-collection)** | Fast, secure payments without extensive UI integration. | Initiate via API from your server → [Redirect](https://www.spotflow.one/demo) customer to a secure Spotflow-hosted payment page. |
| **[Spotflow Embed (Client-Side)](/developer-resources/inline-js)** | Seamless, intuitive in-app/on-site checkout experience. | Embed our JavaScript library directly. We handle the entire UI/UX without redirecting users off your site. |
| **[Spotflow Classic (API)](/api-reference/payments/create-collection)** | Businesses needing a highly custom payment experience and with PCI-DSS license | You build the entire UI; Spotflow processes the encrypted transaction from your server. |
### II. Core API Management
* Create Payments: Use POST [/payments/initialize](/api-reference/payments/initialize-collection) or POST [/payments](/api-reference/payments/create-collection) for one-time and recurring payment collections.
* List & Retrieve: Use GET /payments to [list all](/api-reference/payments/list-collection), and GET [/payments/](/api-reference/payments/fetch-collection) to retrieve details.
* Payment Webhooks: React to events like [payment.successful](/developer-resources/webhooks/payment-collections) in your backend.
SECURITY NOTE: Your SECRET\_KEY must never be exposed on the client-side. All API interactions must originate from and be managed by your secure backend server.
### III. Spotflow Classic: Direct API Integration (Advanced)
The Spotflow Classic API grants total control but imposes strict security and compliance requirements such as having PCI-DSS License.
* Payment Webhooks: React to events like [payment.successful](/developer-resources/webhooks/payment-collections) in your backend.
#### A. Prerequisites for Card Payments
To process card payments directly through the Payment API, you must meet these non-negotiable requirements:
1. Account Status: Ensure your Spotflow account is fully activated and verified.
2. Merchant Configuration: Request activation for your collection regions and service providers by contacting [support@spotflow.one](mailto:support@spotflow.one). (This is disabled by default for new accounts).
3. PCI-DSS Compliance: You must be PCI-DSS certified. Spotflow may require a specific level (e.g., Level 1) due to handling raw card data. Consult with support for full details.
4. API Keys: Obtain your SECRET\_KEY and Encryption Key from the Dashboard.
5. URLs: Configure your Webhook URL (for server-to-server status updates) and Callback URL (for customer redirects).
#### B. The Card Payment Flow
The Classic API flow is a two-step process designed for security and compliance:
#### Step 1: Encrypt and Create Payment
Before making the POST request to [https://api.spotflow.co/api/v1/payments](https://api.spotflow.co/api/v1/payments), you must:
1. Collect Card Data: Gather the customer's raw card details (PAN, CVV, expiry).
2. Encrypt Data: Crucially, encrypt the raw card data using your unique Encryption Key and AES-256 encryption from your server. This ensures sensitive data is never transmitted in the clear.
3. Send Request: Send the request with the required parameters, including the encrypted card data.
| **Parameter** | **Type** | **Description** |
| ----------------- | -------- | ----------------------------------------------------------- |
| **reference** | String | Your unique transaction ID. |
| **amount** | Integer | Charge amount (in the smallest subunit). |
| **currency** | String | USD or your local currency (NGN, GHS, etc.). |
| **localCurrency** | String | Required when currency is USD. Sets the local FX reference. |
| **encryptedCard** | String | The AES-256 encrypted raw card string. |
#### Step 2: Authorization (3D Secure, OTP, PIN, AVS)
Upon receiving the initial status: pending response, the card may require secondary authorization.
The system indicates the required mode in the response's authorization object:
| **Mode** | **Action Required** | **Endpoint Used** |
| ---------- | -------------------------------------------------------------------------- | ----------------------------------------------------------------------------- |
| **PIN** | Collect the customer's PIN. | [POST /authorize-payment](/api-reference/payments/authorize-collection) with |
| **OTP** | Collect the One-Time Password sent to the customer. | [POST /authorize-payment](/api-reference/payments/authorize-collection) with |
| **3DS** | Redirect the customer to the provided redirectUrl. | No API call needed; customer handles auth. |
| **AVS** | Collect the customer's Address Verification details. | [POST /authorize-payment](/api-reference/payments/authorize-collection) with |
| **ENROLL** | Collect the phone number for card enrollment (e.g., for some Verve cards). | [POST /authorize-payment](/api-reference/payments/authorize-collection) with |
#### C. Bank Transfer Payments (Non-Card)
For Bank Transfers ("channel": "bank\_transfer"), the flow is simpler as no encryption is needed.
* The initial POST /payments request returns a status: pending with the required bankDetails (Account Number, Bank Name) in the response.
* The customer must then make the transfer to these details.
* Final Status: Spotflow monitors the transfer. You must Verify the Payment to confirm the final successful status.
#### D. Final Step: Verify Payment
For every transaction—especially after an authorization step or a bank transfer—you must call the [Verify Payment endpoint](/api-reference/payments/verify-collection) using your transaction reference to confirm the final and definitive status.
**Important**: This is the most critical step. You must always verify the status of the payment before you give value to the customer. Do not trust the redirect URL parameters or the response from the final authorization step alone!
#### How to Verify:
1. **Retrieve Reference**: Get the unique transaction reference ID from your system or from the query parameters sent back to your Callback URL.
2. **Call Verify Endpoint**: Send a request to our Verify Payment Collection Endpoint (GET /payments/).
3. **Confirm Status**: The verification response provides the definitive, server-to-server confirmed status (successful, failed, etc.).
#### Receive Payment Confirmation Via Webhook
As a concurrent and reliable method, when a payment is successful, Spotflow sends a payment\_successful webhook event to your specified Webhook URL.
**Best Practice**: Treat the webhook as an alert and the verification API call as the confirmation. Only fulfill the order after the verification API call confirms the status is successful.
***Important Information: Payment Data Requirements***:
To avoid frustrating errors, ensure your request body adheres to these critical formatting and data rules:
* **Amount Format**: The amount should always be in the subunit of the supported currency (e.g., kobo for NGN, cents for USD).
* **Unique Reference**: You must use a unique reference ID generated by your company for the reference field to identify each customer and transaction.
* **Currency Selection**:
1. Select the currency for the payment collection (e.g., USD or NGN).
2. If currency is set to USD, you must also include the localCurrency field set to the local currency of your collection region (e.g., NGN, GHS, KSH).
This is required for accurate FX calculation and compliance.
To learn more about what you can do with payment collections on Spotflow, check out our [API Reference](/api-reference/payments/initialize-collection).
If you've got any questions, don’t hesitate to check our [FAQs](/expert-desk/faq) or reach out to our team at [support@spotflow.one](mailto:support@spotflow.one).
# Payment Methods
Source: https://docs.spotflow.one/features/payment-methods
This is your complete guide to the payment methods currently supported by Spotflow. We activate and manage these regional options automatically to maximize your conversion across Africa.
#### Automatic Activation
No manual setup is required. All supported methods below are pre-configured and managed by Spotflow once your merchant account is verified, region coverages are added and Live Mode is enabled.
#### Supported Payment Methods
Spotflow provides high-conversion, locally-relevant methods across our currently supported 13 African countries. Check out [available regions](/features/available-regions) to see what payment method and region we currently support.
"13 African Countries" refers to the specific nations where Spotflow has integrated the local Bank Transfer, card, EFT, and Mobile Money rails.
#### Expanding Payment Options
We are continuously expanding our payment network. If you require a specific payment method not mentioned here, please contact us at [support@spotflow.one](mailto:support@spotflow.one), and we'll certainly consider it for our roadmap.
# Payout Structure
Source: https://docs.spotflow.one/features/payout-structure
The Payout process is how your earned revenue moves from your Spotflow Balance to your preferred Bank Account via Bank Transfer. We offer flexible cycles to match your cash flow needs.
#### Instantaneous Payouts (Self-Service)
You don't always have to wait. You can initiate a payout yourself in the local currency collected using the Single or Bulk Disbursement page on your Dashboard.
* How it works: Disburse funds immediately from the available balance in your multi-currency wallets.
#### Scheduled Payout Cycles
Requesting Weekly: Merchants with higher transaction volume may contact [support@spotflow.one](mailto:support@spotflow.one) to request a weekly payout cycle.
For USD payouts, funds typically reflect in your bank account in T+1 days after initiation.
#### Key Requirements & Timelines
* Payouts are only initiated if all verifications are successful and the Minimum Payout Threshold is met during the billing period.
* Certain high-risk merchants may be placed on a Monthly cycle at Spotflow's discretion.
#### Payout Deductions
Before the funds are transferred, the following are deducted from your sales amount:
* Fees: Spotflow Processing Fees and Payout Fees. (Contact [support](mailto:support@spotflow.one) for a detailed breakdown)
# Plan Trials & Currency Rules
Source: https://docs.spotflow.one/features/plan-trials-and-currency-rules
Learn how to set up free trials on subscription plans, and understand how currency rules work across plans.
# Plan Trials & Currency Rules
This page covers two things that affect how you configure subscription plans on Spotflow: free trials, and the rules around which currencies can be combined in a single plan.
***
## Currency Rules
### USD Plans Are Standalone
If you want to bill in USD, it must be its own plan. You cannot mix USD with any other currency in the same plan.
**Not allowed:**
```json theme={null}
{
"title": "Pro Plan",
"frequency": "MONTHLY",
"pricingOptions": [
{ "amount": 10, "currency": "USD" },
{ "amount": 5000, "currency": "NGN" }
]
}
```
**Correct — USD only:**
```json theme={null}
{
"title": "Pro Plan – USD",
"frequency": "MONTHLY",
"pricingOptions": [
{ "amount": 10, "currency": "USD" }
]
}
```
***
### Local Currencies Can Be Combined
NGN, GHS, TZS, KES, ZAR, XOF, XAF, and other local currencies can all live in one plan. This is the recommended approach if you serve customers across multiple African markets.
**Correct — multiple local currencies in one plan:**
```json theme={null}
{
"title": "Pro Plan – Africa",
"frequency": "MONTHLY",
"pricingOptions": [
{ "amount": 5000, "currency": "NGN" },
{ "amount": 10, "currency": "GHS" },
{ "amount": 2000, "currency": "TZS" }
]
}
```
***
### Quick Reference
| Combination | Allowed |
| --------------------- | ------- |
| USD only | ✅ |
| NGN + GHS | ✅ |
| NGN + GHS + TZS + KES | ✅ |
| USD + NGN | ❌ |
| USD + GHS | ❌ |
| USD + NGN + GHS | ❌ |
If you need to offer both USD and local currency pricing for the same product, create two separate plans and point customers to the one that matches their currency.
***
## Free Trials
A free trial gives new subscribers access to a plan for a set number of days before their first charge.
* **For card subscriptions:** The card is authorised but not charged during the trial period.
* **For mobile money subscriptions:** The customer approves the mandate prompt on their phone, but no funds are taken until the trial ends.
### How It Works
1. The customer goes through the normal sign-up flow
2. Their card or mobile wallet is authorised but not charged
3. The trial runs for the number of days you set
4. On the last day of the trial, the first billing cycle begins and the charge is collected
If the customer cancels before the trial ends, they are not charged.
### Setting Up a Trial
Add a `trial` object when creating your plan:
```json theme={null}
{
"title": "Pro Plan",
"frequency": "monthly",
"pricingOptions": [
{ "amount": 5000, "currency": "NGN" },
{ "amount": 10, "currency": "GHS" }
],
"trial": {
"periodInDays": 7,
"pricingList": [
{ "amount": 0, "currency": "NGN" },
{ "amount": 0, "currency": "GHS" }
]
}
}
```
Setting `amount` to `0` in `pricingList` makes the trial completely free. If you omit `pricingList`, the trial also defaults to free.
### Trial Object Fields
Trial configuration for the plan.
How long the trial lasts in calendar days. Example: `7` or `14`.
The price to charge during the trial. Set `amount` to `0` for a fully free trial. If omitted, defaults to free.
The trial price. Use `0` for free.
The 3-letter ISO currency code. Must match one of your `pricingOptions` currencies.
### Webhook Events During a Trial
| Event | When it fires |
| ---------------------------- | ----------------------------------------------- |
| `subscription_trial_started` | Customer successfully enrolled in a trial |
| `subscription_trial_ending` | 3 days before the trial ends |
| `subscription_trial_ended` | Trial period is over and billing begins |
| `payment_successful` | First charge after trial collected successfully |
Listen for `subscription_trial_ending` and send your own reminder email. Customers who know a charge is coming are far less likely to dispute it or cancel.
***
## Trials With Mobile Money
Free trials work the same way for mobile money subscriptions as they do for card subscriptions.
**For trials:** The customer approves the mandate during the trial period, but no money is taken until the trial ends. The first debit happens automatically when the trial closes.
The same webhook events apply for mobile money trial subscriptions. See [Mobile Money Subscriptions](/features/mobile-money-subscriptions) for the full list of events and payloads.
***
## Full Example: Regional Plan with Free Trial
```bash cURL theme={null}
curl --request POST \
--url https://api.spotflow.one/api/v1/plans \
--header 'Authorization: Bearer sk_test_xxxxxxxxxx' \
--header 'Content-Type: application/json' \
--data '{
"title": "Pro Tier - Regional",
"frequency": "monthly",
"internalReference": "PLAN-PRO-REG-01",
"pricingOptions": [
{ "amount": 5000, "currency": "NGN" },
{ "amount": 50, "currency": "GHS" }
],
"trial": {
"periodInDays": 7,
"pricingList": [
{ "amount": 0, "currency": "NGN" },
{ "amount": 0, "currency": "GHS" }
]
}
}'
```
***
## Best Practices
* **Create separate plans for USD and local currencies.** Mixing them is not supported and will cause errors.
* **Only offer trials when you have a plan to convert users.** A free trial with no follow-up leads to churn when billing starts.
* **Always tell customers when their trial ends.** A surprise price jump is one of the most common reasons customers cancel.
* **For mobile money trials:** The customer will still see a phone prompt to approve the mandate even on a free trial. Make it clear on your sign-up page that they will not be charged today, but approving the prompt is what starts the trial.
* **Notify before the first charge after a trial ends.** Send an email or in-app notification 24 hours before so the customer is ready with funds in their wallet.
* **Test before going live.** Run through trial enrollments, and renewal flows in test mode to make sure everything works as expected.
***
## Need Help?
Reach out to the Spotflow team at [support@spotflow.one](mailto:support@spotflow.one)
# Security Reporting Policy
Source: https://docs.spotflow.one/features/security-policy
At Spotflow, security is foundational and we take it seriously. If you discover a vulnerability, we appreciate your responsible disclosure to help us improve our platform and maintain its integrity.
### Reporting Security Vulnerabilities
If you identify a security issue, please contact us at [tech@spotflow.one](mailto:tech@spotflow.one) and include the following details:
* Description: A clear and concise explanation of the vulnerability.
* Steps to Reproduce: Detailed, easy-to-follow instructions to replicate the issue.
* Impact: The potential risk or harm that could arise from the vulnerability.
* Suggested Mitigations: (Optional) Your recommendation on how to fix the issue.
### How We Handle Reports
* Acknowledgment: Our technical team will confirm receipt of your report promptly within a reasonable time frame.
* Assessment: We review and prioritize the report based on severity, impact, and exploitability.
* Resolution: We will provide an update on the expected resolution timeline if the issue is confirmed, already known and logged internally.
* Follow-up: We may reach out for additional information or clarification as needed.
### No Monetary Rewards (Bug Bounty Program)
Currently, Spotflow does not have an official bug bounty program. While we deeply appreciate security researchers’ efforts, we do not offer monetary rewards for vulnerability disclosures. This ensures fairness for all individuals who report similar issues.
### Recognition & Appreciation
We highly value the contributions of ethical researchers. While Spotflow does not currently offer a formal, paid bug bounty program, we believe in tangible appreciation.
For valid security reports, we would be delighted to consider a premium Spotflow Swag Pack/Build-Kit as a token of our sincere thanks.
### Responsible Disclosure Guidelines
To ensure an ethical process and protect our platform and users, please adhere to these non-negotiable rules to avoid legal actions:
* Do Not Publicly Disclose vulnerabilities until our team has had a reasonable time to address them.
* Do Not Exploit the vulnerability beyond what is strictly necessary to demonstrate the issue.
* Do Not perform any activity that could disrupt our services through denial-of-service, spamming, or similar activities.
If you have any security concerns or need further assistance, please use the contact email above.
# Settlement
Source: https://docs.spotflow.one/features/settlement
Settlement is the process of transferring collected funds from your Spotflow platform account directly into your designated bank account. Think of it as Spotflow's job of making sure your hard work actually pays the bills.
## Settlement Process Overview
1. Collection: Funds are successfully collected from your customers.
2. Reconciliation: Spotflow meticulously verifies all collected payments to ensure every penny is accounted for (no phantom funds allowed).
3. Initiation: Once reconciled, the settlement request is initiated (either automatically or by you, depending on your schedule).
4. Fund Transfer: Spotflow transfers the collected funds to your specified bank account.
5. Confirmation: You receive a confirmation with the exact amount transferred and the settlement date.
### Settlement Schedule
Spotflow offers flexible options, with funds generally hitting your account in T + 1 days (Transaction day plus one business day) after collection.
You can typically choose the settlement cycles you'll prefer. For better details, contact [support@spotflow.one](mailto:support@spotflow.one) for better details.
Your settlement cycle is dependent on your transaction volume. The higher your transaction volume, the easier it is for us to provide you flexible settlement options.
Kindly contact [support@spotflow.one](mailto:support@spotflow.one) for better details.
### Settlement Fees
* Spotflow charges settlement fees based on the settlement amount, currency, and the original payment method.
* For detailed information on your specific fee structure, please contact the Spotflow support team at [support@spotflow.one](mailto:support@spotflow.one).
### Reconciliation & Responsibility
You are responsible for cross-checking the Spotflow settlement reports with your own bank statements.
* Spotflow provides detailed reports to make this process as painless as possible.
* Spot a discrepancy? Report it immediately to [support@spotflow.one](mailto:support@spotflow.one) for investigation.
### Additional Considerations
* Currency Exchange: If you accept multiple currencies, Spotflow handles the conversion during settlement using prevailing exchange rates.
* Dispute Resolution: We have mechanisms in place to help handle any disputes related to settlements, ensuring a fair process.
# Single and Bulk Disbursements
Source: https://docs.spotflow.one/features/single-and-bulk-disbursements
With our APIs, initiating funds disbursements is straightforward and seamless. We maintain strict security and compliance standards to ensure every transaction is processed safely and responsibly. This process covers payouts to vendors, contractors, or moving funds between accounts.
## Linking & Prerequisites for Initiating Disbursements
To execute disbursements successfully, follow these steps:
1. **Perform a Bank Account Lookup**: Before sending funds, it’s highly recommended to confirm the recipient's details. Use the [Resolve Bank Account Endpoint](/api-reference/transfer-api/transfer-resolve-account) which requires the recipient’s accountNumber and bankCode(the unique bank identifier) as input. This prevents accidentally sending money to the wrong bank entirely.
2. Ensure Linked Account: Disbursements are initiated from the primary operational account Spotflow creates for you internally. Ensure this is properly funded and linked to your operations.
## Executing Disbursements
You can move funds from your internal Spotflow account to an external bank account using one of two methods:
| **Disbursement Type** | **API Endpoint** | **Description** |
| ----------------------- | ---------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Single Disbursement** | [Create Disbursement Endpoint](/api-reference/transfer-api/create-single-transfer) | Initiate a single payout. Requires key details like the disbursement amount, your chosen unique reference for reconciliation, and the recipient’s accountNumber and bankCode. |
| **Bulk Disbursement** | [Bulk Disbursement Endpoint](/api-reference/transfer-api/create-bulk-transfer) | Initiate multiple payouts with a single API call. Ideal for mass payments (e.g., payroll or vendor payments). |
**Remember**: A solid reconciliation reference is your best friend when dealing with finance. Use that reference wisely!
# Spotflow Checkout Demo
Source: https://docs.spotflow.one/features/spotflow-demo-checkout
This is a fully realistic showcase of our redirect checkout solution that eliminates the need for direct payment gateway integration on your application. See exactly how hassle-free, professional, and smooth the user journey is for payment collections.
#### ***Key Details***:
* URL: [`Spotflow Checkout Demo`](https://www.spotflow.one/demo)
* What You'll See: A complete, functional demonstration of the payment collection flow in action.
# Subscription Payment Collections
Source: https://docs.spotflow.one/features/subscription-payment-collections
Offer recurring billing for memberships, SaaS, or services with flexible cycles, tiered pricing, and automated renewals. This is your engine for predictable revenue.
## What Subscriptions Are (And Who Needs Them)
Subscriptions are recurring products purchased on a set schedule. They are perfect for:
* SaaS Licenses: Apps, APIs, or platform access.
* Memberships: Communities, programs, or clubs.
* Digital Content: Courses, media, or premium access.
## Key Benefits of Spotflow Subscriptions:
* Predictable Revenue: Automated renewals handle the heavy lifting.
* Flexible Cycles: Monthly, daily, weekly, annual, custom intervals, and trials are all supported.
* Plan Agility: Manage upgrades, and optional add-ons.
* Developer-First: Clear APIs for creation, changes, and usage tracking.
## Core Requirement: Card Tokenization
Spotflow's recurring billing relies on secure Card Tokenization.
***How it Works***:
After a customer's initial successful card payment, Spotflow replaces the sensitive card information with a unique, secure token.
Subsequent payments are processed using this token. Therefore, recurring payments are currently limited to card payments only.
You can choose automated payment plans, Set the cycle and amount; Spotflow handles the rest.
## Creating Subscription Plans
Create recurring plans either directly in your Spotflow Dashboard or programmatically via API.
To set up a [recurring billing plan](/api-reference/subscription-plans/create-single-plan), define these key elements:
| Field | Description |
| --------------------- | --------------------------------------------------------------------------------------- |
| **Title & Frequency** | A descriptive label and how often to charge (Daily, Weekly, Monthly, Annually, etc.). |
| **Currency** | You can set pricing in USD or in a Local Currency (e.g., NGN, GHS, ZAF). |
| **Pricing Options** | Allows you to set different local prices for the same product across different regions. |
## Example: Creating a Local Currency Plan (NGN, GHS)
```java Create.plan lines icon="repeat" theme={null}
{
"title": "My Pro Plan",
"frequency": "MONTHLY",
"pricingOptions": [
{
"amount": 10000, "currency": "NGN"
},
{ "amount": 10, "currency": "GHS"
}
]
}
```
## Mobile Money Subscriptions
If your customers pay via mobile money, the recurring billing flow works differently from card subscriptions. Instead of card tokenisation, Spotflow uses a mandate system where the customer approves recurring charges upfront.
[Learn how to set up mobile money subscriptions →](/features/mobile-money-subscriptions)
There are rules around which currencies can be combined in a single plan. You can also add free trials and discounts to any plan. See [Plan Trials, Discounts & Currency Rules](/features/plan-trials-discounts-and-currency-rules) for details.
## API Management & Enrollment
Once a plan is created, enrolling a customer is simple: reference the planId during the customer's initial charge.
| **Action** | **API Endpoint** | **Description** |
| ----------------------------------- | -------------------------------------------------------------------------------- | ------------------------------------------------------- |
| **Create Subscription Plan** | [POST /subscription plans](/api-reference/subscription-plans/create-single-plan) | Create a new subscription programmatically. |
| **Update Subscription Plan** | [PUT /subscription plans/](/api-reference/subscription-plans/update-plan) | Modify quantities, change plans, or set cancellation. |
| **List/Retrieve Subscription Plan** | [GET /subscriptions](/api-reference/subscription-plans/fetch-plan) | View all or retrieve details for a single subscription. |
You can also create a ***bulk subscription plan*** using a CSV file. Learn more [here](/api-reference/subscription-plans/create-bulk-plan).
## Enrollment Sample (Using [Spotflow Initialize/Redirect API](/api-reference/payments/initialize-collection)):
When initiating the charge, include the planId and customer details. Spotflow tokenizes the card for future charges based on the plan frequency.
```java Create.plan lines icon="repeat" theme={null}
{
"planId": "961ca3d6-0505-4bc5-8dd3-fc160ac4afc9",
"currency": "USD",
"localCurrency": "NGN", // Used for FX calculation in the local region
"customer":
{ "email": "customer@email.com"
}, // ... other charge details (encrypted card, metadata)
}
```
## Webhooks: Real-Time Event Tracking
Spotflow sends automated webhooks to your server for all critical subscription events.
To set up a [recurring billing plan](/api-reference/subscription-plans/create-single-plan), define these key elements:
| **Event** | **Purpose** | **Sample Payload Key** |
| ---------------------------- | ------------------------------------------------------- | ---------------------- |
| **payment\_successful** | Notifies you of the first successful payment charge | |
| **subscription\_successful** | Notifies you of a successful renewal charge | |
| **payment\_failed** | Alerts you when an attempted charge fails | |
| **subscription\_cancelled** | Notifies you when a customer or you cancel the service. | |
## Canceling and Activating
* Cancel Subscription: Cancel an individual customer subscription via the [Cancel Subscription Endpoint](/api-reference/subscriptions/subscription-cancel).
* Cancel Plan: Canceling [the entire plan](/api-reference/subscription-plans/cancel-plan) cancels all associated customer subscriptions.
* Reactivating: Canceled [subscriptions](/api-reference/subscriptions/subscription-activate) and [plans](/api-reference/subscription-plans/activate-plan) can be reactivated using the corresponding Activate endpoints.
## Best Practices
* Start with clear tiers: Keep base plans simple and define 2–3 plans with obvious value differences.
* Communicate pricing: Always show the total price, proration costs (if applicable), and the date of the next renewal.
* Test changes: Validate all plan changes and proration logic meticulously in Test Mode before deploying live.
To learn more about what you can do with plans on Spotflow, check out our [API Reference](/api-reference/subscription-plans/activate-plan).
If you've got any questions, don’t hesitate to reach out to our team at [support@spotflow.one](mailto:support@spotflow.one).
# Tax Configuration
Source: https://docs.spotflow.one/features/tax-collections
Learn how to configure collection and management of transaction taxes or extra service fees from your customers.
Spotflow lets you add and collect taxes or extra compliance fees from your customers during checkout. This works across all supported currencies and countries.
Whether you need to charge a percentage tax (like VAT) or a fixed fee (like stamp duty), you can set everything up automatically using either your **Spotflow Dashboard** or the [**Tax APIs**](/api-reference/tax-collections-configuration/get-tax-status).
***
## How to Set Up Tax Configuration
To keep your checkout flow running smoothly, turning on tax Configuration follows a simple, step-by-step setup process:
By default, tax features are turned off. First, reach out to our support team and tell us which countries you want to collect taxes in. We will turn those regions on for your account behind the scenes.
Once we open up those countries for you, you need to turn them on from your side. You can do this with a single click on your **Spotflow Dashboard** - **Settings** > **Payment** > Tax or by calling our API. This extra step ensures you never charge taxes to your customers by accident.
Once a country is active on your account, you can create your specific tax rules. You can choose between two types of charges: a **Flat Fee** (charging a fixed amount) or a **Percentage** (charging a percentage of the customer's total order).
When you create a new tax, it starts out as `inactive`. This lets you double-check your settings safely. When you are ready to start charging live customers during checkout, change its status to `active`.
***
## Understanding Tax Settings
When you build or update your tax rules on the dashboard or via the API, you will use these three main settings:
* **Tax Type (`taxType`):** \* `flat`: Charges a fixed, unchanging amount on every transaction (for example, a flat 50 NGN Stamp Duty fee).
* `percentage`: Calculates a fee based on the customer's total checkout amount (for example, a 7.5% sales tax).
* **Cap Amount (`capAmount`):** The maximum amount of tax a customer can ever be charged for a single transaction. For example, if a 5% tax on a large order comes out to 4,500 NGN, but your cap is set to `2000`, Spotflow will stop at `2000` to protect your customer from overpaying.
* **Threshold Amount (`thresholdAmount`):** The minimum order amount required before this tax applies. If you set this to `1000`, any order under 1,000 stays tax-free; the tax will only kick in for orders of 1,000 and above.
***
## Best Practices
* **Keep new taxes Inactive first:** Always create your new tax rules as `inactive` first. Take your time to review the names and rates with your finance team, and then flip the switch to `active` when you are completely ready.
* **Match your Test and Live settings:** Make sure you set up the exact same tax configurations in your test dashboard (sandbox) and your live dashboard. This guarantees your calculations will work exactly the same way in production as they did during testing.
# Collections
Source: https://docs.spotflow.one/features/transactions/collections
The Collections page provides a detailed, real-time overview of all customer transactions processed through Spotflow. Here, you as a merchant can track collection statuses, initiate refunds, resend webhooks, and access comprehensive payment details for every transaction.
## Collections Listing Overview
The Collections listing serves as a single record of every transaction, featuring vital information such as the amount, currency, status, and the payment method used.
| **Status** | **Meaning** |
| --------------- | --------------------------------------------------------------------------------------------------------------------- |
| **In Progress** | The collection is currently being processed by the financial institution. |
| **Abandoned** | The user initiated the checkout process but did not complete the collection (they left the cart at the payment step). |
| **Failed** | The collection attempt was unsuccessful. |
| **Successful** | The collection was completed successfully, and funds are secured. |
The final payment method and timestamp are updated only once the collection reaches a final state (Successful, Failed, or Abandoned).
## Collection Details Page
Clicking any entry in the listing directs you to the Collection Details Page, which offers a comprehensive breakdown of that specific transaction.
| **Detail Category** | **Information Provided** |
| ------------------------ | ----------------------------------------------------------------- |
| **Transaction Details** | Amount, currency, payment method, fees, and processing timestamp. |
| **Customer Information** | Name, email, and any available billing details. |
| **Actions** | Options to initiate a Refund or Resend Webhook. |
| **Status** | The final status of the transaction. |
### How to Navigate and Use the Collections Page
1. Access Collections: Open the Transactions page and click on the Collections tab to view all transaction records.
2. Filter and Search: Use available filters to narrow down your view:
* Status Filter: View transactions by a specific status (e.g., filter for "Abandoned" to analyze drop-off).
* Date Range: Select custom dates to view collections from a specific period.
* Search: Locate payments by reference, customer name, or email.
### Important Information on Payment Methods
1. Automatic Activation: All supported collection methods become available automatically once your Spotflow account is verified and Live Mode is enabled.
2. Zero Configuration: Merchants do not need to configure these payment options; they are pre-defined and fully managed by Spotflow (we handle the complexity, you handle the selling).
3. Expanding Roster: We are constantly adding new payment methods. If you require a specific payment method that's not listed,
please write to us at [support@spotflow.one](mailto:support@spotflow.one), and we'll add to our roadmap if not present.
# Spotflow Accounts
Source: https://docs.spotflow.one/features/wallets
Spotflow Accounts (formerly called sub-accounts) are powerful, virtual, API-only financial containers designed to store and manage funds independently within your account ecosystem. Unlike Dynamic Accounts, which simply route payments, Wallets maintain their own balances and act as genuine repositories for money.
### Key Features
| **Wallet Feature** | **Details** |
| -------------------------- | ---------------------------------------------------------------------------------- |
| **Fund Storage** | Wallets hold and maintain balances completely separate from your main account. |
| **Unlimited Creation** | You can create an unlimited number of Wallets via API. |
| **Non-Expiring** | Wallets do not expire, unlike Dynamic Accounts. They're permanent storage pockets. |
| **Supported Currencies** | Currently available only for NGN and GHS. |
| **Independent Management** | Each Wallet operates with its own unique ID, balance, and transaction history. |
| **Simplified Setup** | No Bank Verification Number (BVN) submission is required for creation. |
### Prerequisites for Wallet Creation
Before you can create your first Wallet, your account needs to be fully configured for merchant operations.
1. KYB Completion: Successfully complete your account signup and Know Your Business (KYB) onboarding.
2. Configuration Activation: Merchant configuration is NOT enabled by default. You must contact support at [support@spotflow.one](mailto:support@spotflow.one) to explicitly request activation.
3. API Credentials: Ensure you have your SECRET\_KEY from the merchant dashboard for authorization purposes.
### API Operations
| **Action** | **Endpoint** | **Key Detail** |
| --------------------- | ------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------- |
| **Create Wallet** | [Wallet Creation API Endpoint](/api-reference/wallets/create-account) | Specify parameters (name, currency). Returns a unique Wallet identifier. |
| **Fetch Wallet Data** | [Fetch Wallet by ID Endpoint](/api-reference/wallets/spotflow-wallet-id) | Retrieve individual Wallet information and details. |
| **View Balances** | [Fetch Balances Endpoint](/api-reference/wallets/main-account-balance) | Access the Wallet's real-time balance and transaction history (also available on your Spotflow dashboard). |
| **List All** | [List Wallets Endpoint](/api-reference/wallets/list-spotflow-wallets) | Retrieve all Wallets associated with your main account. You can also use this to fetch details for your main account. |
### Webhook Notifications
You will receive webhook and email notifications when a wallet is credited.
**Action Item**: Ensure you configure your system to receive these payment status updates. Set or update your Webhook URL on the merchant dashboard under Settings → API & Webhooks → URLs.
# Your Team Members
Source: https://docs.spotflow.one/features/your-team-members
The Spotflow Invite/Add User feature enables you to onboard team members to your dashboard, granting them secure access based on customizable roles and permissions. Ensure secure and flexible collaboration by allowing full modification rights or restricting access to view-only mode.
## How to add a teammate?
1. Navigate to the User Management page on your dashboard.
2. Click on +**Invite/Add User** button on the top right corner.
3. Enter the teammate’s email and assign an appropriate role.
4. Click Send Invite/Add User.
## How can a teammate access the dashboard?
The invited teammate receives an email link. Upon clicking it, they set up their password and configure their Authenticator App (OTP) for secure login before gaining access to the dashboard.
## Spotflow Default Roles and Permissions
Spotflow provides three primary user roles with distinct access level.
| **Role** | **Access Level** | **Exclusive Abilities & Notes** |
| ------------- | ------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Admin** | Full Control (Highest Access) | The original creator of the account holds this role. They are the only one who can invite users and create custom roles/permissions. They can also invite another admin to the account. Account ownership cannot be transferred. |
| **Finance** | Financial & Operational Access | Can view balances, collections, initiate payouts, and invite users. Lacks access to sensitive API keys. |
| **Developer** | Technical Access | Can view and manage API Keys, Webhooks, and other technical configurations. Lacks access to balances, collections, or finance-related operations. |
#### Custom Roles:
As an Admin, you can create multiple custom roles with unique names and specific permissions tailored exactly to your team's operational needs.
No two teams are identical, so why should your roles be?
# Introduction
Source: https://docs.spotflow.one/introduction
Welcome to Spotflow, the Merchant of Record (MOR) that simplifies global payments. We handle the entire end-to-end lifecycle for your business—from managing transactions and compliance to ensuring timely payouts.
## Quick Start: Launch in Minutes
Want to get started off using Spotflow right away? Follow these essential steps to go from zero to payment processing:
### Follow these steps
Log in using your email and password. If you don't have an account yet, you can create one at [https://app.spotflow.co/signup](https://app.spotflow.co/signup).
**How It Works**
This critical, compliance-driven step confirms your identity and the legitimacy of your business with legal and regulatory standards. You must complete this to unlock full platform access, including processing and payouts.
Submit business registration documents for manual review and compliance clearance.Visit the KYB verification process page
Generate a payment link right from your dashboard on either test or live mode, OR, try a live transaction at [Spotflow Demo](https://www.spotflow.one/demo) to see it in action.
## Developer Integration
Get started with technical integration. Explore detailed guides on integrating our APIs with your system.