Connect Bubble to Payoneer using the API Connector with OAuth 2.0 client credentials — retrieve an access token from POST /v4/oauth2/token, store it in a Bubble 'App Config' database record, and refresh it every 55 minutes via a scheduled recurring workflow. All payout calls use the stored token via a Private header. Production API access requires Payoneer partner approval (1–4 weeks).
| Fact | Value |
|---|---|
| Tool | Payoneer |
| Category | Payments |
| Method | Bubble API Connector |
| Difficulty | Advanced |
| Time required | 5–8 hours |
| Last updated | July 2026 |
Why Payoneer is More Complex Than Stripe — And Why It's Worth It
If you need to pay international contractors in 190+ countries with local bank account delivery, Payoneer is the tool Stripe cannot replace. Stripe Payouts works well in the US and EU; Payoneer reaches freelancers in countries that simply do not have Stripe-compatible banking infrastructure.
However, Payoneer's integration in Bubble is significantly more complex than Stripe. There are three layers of complexity to understand before building:
Layer 1 — OAuth 2.0 Instead of a Static Key: Stripe gives you an sk_* key that never expires. Payoneer gives you a client_id and client_secret that you exchange for an access token that expires in ~3600 seconds. That token is what you use to make payout calls. When it expires, all payout calls fail with 401 until you refresh the token. In Bubble, this means you need an automated token refresh system — a scheduled recurring workflow.
Layer 2 — A Token Storage System: The access token must live somewhere Bubble's workflows can read it. A dedicated 'App Config' data type (a single-row database record) is the standard Bubble pattern for storing application-level credentials. Your payout workflows look up the current token from this record before making the API call.
Layer 3 — Partner Approval Gate: Unlike Stripe (which gives you live API access immediately after account creation), Payoneer's Production API requires a formal partner application and approval process — budget 1–4 weeks. Sandbox access is immediate. This means you can build and test your entire integration in sandbox, but cannot accept real payouts until Payoneer approves your program.
Once these three systems are in place (OAuth flow + token storage + refresh schedule), the actual payout call is straightforward: POST the payee's Payoneer email or ID, amount, and currency. Payoneer handles the cross-border complexity — currency conversion, local bank routing, compliance — invisibly.
The audience for this integration is founders building platforms that pay international workers: content marketplaces, translation platforms, remote-first freelance boards, and global service agencies.
Integration method
Payoneer REST API called through Bubble's API Connector using OAuth 2.0 client credentials — access token stored in a Bubble database record and refreshed every 55 minutes by a scheduled recurring workflow.
Prerequisites
- A Payoneer partner account — apply at developer.payoneer.com. You will receive sandbox credentials immediately; production access requires partner program approval (1–4 weeks)
- Your Payoneer client_id, client_secret, and program_id from the Payoneer Partner Portal — the program_id identifies your platform within Payoneer's system
- A paid Bubble plan (Starter $32/month or above) — required for scheduled recurring workflows (needed for automated token refresh) and for Backend Workflows to receive Payoneer webhooks
- Basic understanding of Bubble's scheduled workflows and App Settings — the token refresh system uses both
- A list of your payees' Payoneer account email addresses or payee IDs — recipients must have Payoneer accounts (they register at payoneer.com separately from your platform)
Step-by-step guide
Set Up the Payoneer API Connector with OAuth Token Endpoint
Payoneer's auth flow uses OAuth 2.0 client credentials — you POST your client_id and client_secret to receive a Bearer access token. This token is what all subsequent payout calls use. In Bubble, the token endpoint is a separate API Connector call from the payout call. In Bubble, click Plugins → Add plugins → search 'API Connector' → Install (free, by Bubble). Click 'Add another API' and name the group 'Payoneer'. For this group, do NOT add shared headers yet — the token endpoint requires a different auth approach than the payout endpoint. Add Call 1 — Get Token: - Name: Get Access Token - Method: POST - URL: https://api.sandbox.payoneer.com/v4/oauth2/token - Content Type: application/x-www-form-urlencoded (important — the token endpoint requires form encoding, not JSON) - Use as: Action - Body parameters: - grant_type: client_credentials (static text) - client_id: your_client_id (mark as Private — this is sensitive) - client_secret: your_client_secret (mark as Private — this is sensitive) - No Authorization header on this call — credentials go in the body For initialization, paste your actual sandbox client_id and client_secret into the body parameters and click Initialize. Payoneer returns a JSON response with access_token (a long JWT string) and expires_in (typically 3600 seconds). Bubble will detect these fields. Note the Content-Type requirement: Payoneer's token endpoint requires application/x-www-form-urlencoded, not application/json. In the API Connector, make sure the body parameters are sent as form data, not JSON. Bubble's API Connector handles this automatically when you set the Content-Type header accordingly.
1// API Connector Group: Payoneer23// Call 1: POST /v4/oauth2/token4// URL: https://api.sandbox.payoneer.com/v4/oauth2/token5// Content-Type: application/x-www-form-urlencoded6// Use as: Action78// Body parameters (all Private):9{10 "grant_type": "client_credentials",11 "client_id": "YOUR_CLIENT_ID",12 "client_secret": "YOUR_CLIENT_SECRET"13}1415// Payoneer token response:16{17 "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",18 "token_type": "Bearer",19 "expires_in": 3600,20 "scope": "read write"21}2223// Production URL (after partner approval):24// https://api.payoneer.com/v4/oauth2/tokenPro tip: The Payoneer access token is a JWT (JSON Web Token) — a very long string. When storing it in Bubble's database, make sure the field type is 'Text' (not limited-length). Bubble's default Text field supports up to 1000 characters, but some Payoneer JWTs can be longer — test the token length from your sandbox and use a 'Long text' field if needed.
Expected result: The Get Access Token API Connector call is configured and initialized. Bubble has detected the access_token and expires_in fields from Payoneer's response. You can see the sandbox access token returned in the initialization response.
Create the App Config Data Type for Token Storage
The access token expires every ~60 minutes and must be shared across all Bubble workflows that make payout calls. A dedicated 'App Config' data type (a single-row record) is the standard Bubble pattern for application-level state. Go to the Data tab in your Bubble editor. Create a new data type called 'App Config' with these fields: - payoneer_access_token (type: text) — stores the current access token - payoneer_token_expires_at (type: date) — stores the exact datetime when the token expires - payoneer_program_id (type: text) — stores your Payoneer program ID (rarely changes, but useful to have here) Create ONE record of this type manually (via Bubble's Data → App Data → App Config → Create new record). Set payoneer_program_id to your actual program ID from the Payoneer Partner Portal. Leave the token fields empty for now — the first workflow run will populate them. IMPORTANT: Set Privacy Rules for App Config. Go to Data → Privacy → App Config. Because this data type stores an access token that can initiate payouts on behalf of your entire platform, restrict all visibility: - 'Find this in searches': No (never searchable in frontend contexts) - 'View all fields': Only logged-in users with an admin role (or never, if you only access it from Backend Workflows) For accessing the App Config in workflows: use 'Do a search for App Config (all entries): first item' to get the single App Config record. This gives you the payoneer_access_token field. Consider also adding an app-level boolean field 'payoneer_token_refreshing' (yes/no) to prevent race conditions if two workflows try to refresh the token simultaneously — one sets this to 'yes' and checks it before refreshing.
1// Bubble Data Type: App Config (single-row application settings)23// Fields:4// payoneer_access_token → Text (long text — JWT can be 500+ chars)5// payoneer_token_expires_at → Date6// payoneer_program_id → Text78// Privacy Rules for App Config:9// Find in searches: Never (No)10// View all fields: Never (access only from Backend Workflows)1112// Accessing in workflows:13// Expression: "Do a search for App Config"'s first item's payoneer_access_token1415// NEVER expose the App Config record via:16// - Public Repeating Groups17// - Bubble's Data API endpoints18// - URL parameters19// - Response from any user-facing workflowPro tip: The 'App Config' pattern (a single-row database record for application-level settings) is useful beyond Payoneer — you can add other app-level values to the same record (e.g., app_version, feature_flags, other OAuth tokens). Just ensure the Privacy Rules prevent ANY frontend access.
Expected result: The App Config data type is created with token storage fields. One App Config record exists in your database (visible in Data → App Data). Privacy rules prevent the record from appearing in any user-facing search or data query.
Build the Token Refresh System with Scheduled Recurring Workflow
The access token expires in ~3600 seconds (60 minutes). Your platform's payout workflows need a valid token at all times. The solution is a scheduled recurring workflow that refreshes the token every 55 minutes — giving you a 5-minute buffer before expiry. This step requires a paid Bubble plan (Starter $32/month or above) — Bubble's recurring events and Backend Workflows are not available on the Free plan. Go to Backend Workflows in the left sidebar (if you don't see this, go to Settings → API → enable 'This app exposes a Workflow API' first). Create a new Backend Workflow: name it 'payoneer_token_refresh'. Set authentication to 'Not accessible to the user'. Add workflow actions: - Action 1: Call the 'Payoneer - Get Access Token' API Connector action - Action 2: Make changes to 'Do a search for App Config first item' - payoneer_access_token = Result of step 1's access_token - payoneer_token_expires_at = Current date/time + 3595 seconds (use Bubble's 'More' date operator: 'Current date/time + 3595 seconds') Now schedule this workflow to run on a recurring schedule: click 'Schedule' button on the Backend Workflow → 'Create a Recurring Event'. Set the interval to 55 minutes (3300 seconds). The first time the workflow runs, the App Config record gets populated with a valid token. Every 55 minutes after that, the token is refreshed before it can expire. In your payout workflows, add a safety check before calling the payout API: check if 'App Config's payoneer_token_expires_at < Current date/time + 5 minutes'. If yes, call the token refresh workflow first. This handles edge cases where Bubble's scheduler had a delay and the token is close to expiry. RapidDev's team has implemented this OAuth token management pattern for multiple Payoneer integrations on client platforms — if your platform has high-volume payout requirements or complex payee onboarding, a free scoping call at rapidevelopers.com/contact can help you design the architecture.
1// Backend Workflow: payoneer_token_refresh2// Schedule: Every 55 minutes (3300 seconds)34// Step 1: Call API - Payoneer Get Access Token5// (POST /v4/oauth2/token with client credentials)6// Returns: { access_token: "eyJ...", expires_in: 3600 }78// Step 2: Make changes to App Config (first item)9// payoneer_access_token = Result of Step 1's access_token10// payoneer_token_expires_at = Current date/time + 3595 seconds1112// Payout Workflow Safety Check (add before any payout call):13// Condition: Only when App Config first item's payoneer_token_expires_at14// is before Current date/time + 5 minutes15// Action: Trigger payoneer_token_refresh workflow16// Then proceed with payout1718// WU Cost Estimate:19// Token refresh = ~1 WU per run × (60 min × 24 hr × 30 days / 55 min)20// = ~787 WU/month just for token refresh21// Budget accordingly on your Bubble planPro tip: Bubble's scheduled recurring events can occasionally fire slightly late. The 5-minute buffer (setting expires_at to 3595 seconds, not 3600, and refreshing if within 5 minutes of expiry) protects against clock drift causing a 401 on your payout calls. Consider adding a Logs tab check after deploying the refresh workflow to confirm it is running on schedule.
Expected result: The payoneer_token_refresh Backend Workflow is active and scheduled to run every 55 minutes. After the first run, the App Config record contains a valid access_token with a populated expires_at timestamp. Bubble's Logs tab shows the workflow runs and confirms successful token responses from Payoneer.
Add the Payout API Call and Build the Payout Workflow
With the token refresh system in place, add the actual payout call to your API Connector and build the workflow that sends money to payees. In the API Connector → Payoneer group, add Call 2 — Send Payout: - Name: Send Payout - Method: POST - URL: https://api.sandbox.payoneer.com/v4/programs/[program_id]/payments/payout (Replace [program_id] with your actual program_id from the Payoneer Partner Portal) - Use as: Action - Headers (shared or call-level): Authorization: Bearer [token] — but here is the challenge: the token is dynamic (retrieved from the database), not static. You cannot mark a dynamic database value as Private in the traditional sense. The solution for dynamic auth tokens in Bubble: add the Authorization header as a call-level parameter (not a shared header), where the value is set dynamically in the workflow. In the API Connector call, add a Header parameter: key = 'Authorization', value = a placeholder. In your payout workflow, you will pass the actual token value from the App Config record as the header value. Alternatively, use the API Connector's 'Key' parameter mechanism: add a parameter named 'Authorization_header' and use it in the call configuration as a header value reference. When you call this action in a workflow, you pass the stored access_token as the value. Body parameters for the payout call: - payee_id OR payee_email: the recipient's Payoneer account identifier - amount: the payout amount (in decimal format for most currencies — EUR 150.00, not 15000) - currency: currency code (USD, EUR, GBP, etc.) - description: memo text visible to the payee - client_reference_id: your internal reference ID for this payout (use Bubble record's unique ID) After configuring, initialize the call using sandbox test payee values from the Payoneer sandbox documentation. Build the Payout workflow in Bubble: 1. Retrieve the App Config record 2. Check if token is close to expiry → refresh if needed 3. Call Send Payout with the token from App Config 4. Save the returned payment_id to your Bubble database 5. Update the payout record status to 'Pending' (Payoneer processes asynchronously)
1// API Connector: Payoneer group2// Call 2: Send Payout3// Method: POST4// URL: https://api.sandbox.payoneer.com/v4/programs/YOUR_PROGRAM_ID/payments/payout56// Headers (dynamic, set from workflow):7// Authorization: Bearer [access_token from App Config]89// Body (JSON):10{11 "payee_id": "<payoneer_account_id or email>",12 "amount": "150.00",13 "currency": "USD",14 "description": "Payment for Project #12345",15 "client_reference_id": "bubble_payout_UNIQUE_ID"16}1718// Payoneer payout response:19{20 "payment_id": "PAY-ABC123456",21 "status": "PENDING",22 "amount": 150.00,23 "currency": "USD",24 "payee_id": "payee@email.com",25 "created_at": "2024-01-15T10:30:00Z"26}2728// Payout Workflow:29// Step 1: Get App Config first item30// Step 2: [If token expires soon: call payoneer_token_refresh]31// Step 3: Call Payoneer - Send Payout32// Authorization header = App Config's payoneer_access_token33// payee_id = Payee's payoneer_email field34// amount = Payee earnings amount35// currency = USD36// Step 4: Make changes to Payout record37// payoneer_payment_id = Result's payment_id38// status = PendingPro tip: Payoneer amounts use decimal notation for most currencies — EUR 150.00 is sent as '150.00', not 15000. This differs from Stripe and Square, which use the smallest currency unit (cents). Always verify the expected format for each currency in Payoneer's API documentation, as some currencies may have different decimal conventions.
Expected result: The Send Payout API Connector call is configured. A test payout workflow can be triggered from an admin page, retrieves the token from App Config, calls the Payoneer sandbox API, and stores the returned payment_id in your database.
Store Payee Information and Handle Production Requirements
Before your platform can pay real contractors, you need to collect and store their Payoneer account information, and you need to complete Payoneer's partner approval process for production access. Payee data model: Create a 'Payee' data type in Bubble (or add fields to your existing Contractor or User type) with: - payoneer_email (text): the email address associated with the payee's Payoneer account - payoneer_payee_id (text): if available, Payoneer's internal payee ID (more reliable than email) - payout_currency (text): the currency this payee prefers to receive payments in - payouts_enabled (yes/no): whether this payee has been validated and can receive payouts Important: Payoneer payees do NOT register through your platform — they create their own Payoneer accounts at payoneer.com independently. Your platform collects their Payoneer email or ID, stores it, and uses it as the recipient when initiating payouts. You cannot programmatically create Payoneer accounts for payees. For production partner approval: go to developer.payoneer.com and click 'Apply for API access'. You will need to provide: - Your platform name and description - Estimated monthly payout volume - Countries you will pay to - Business verification documents (similar to financial institution KYC requirements) Approval typically takes 1–4 weeks. During this time, build and test your complete integration in sandbox. Payoneer sandbox provides test payee IDs that simulate different payout scenarios. For production API calls, change all URLs from https://api.sandbox.payoneer.com to https://api.payoneer.com. Update the client_secret in the token call if Payoneer provides separate production credentials (check your partner portal after approval). WU monitoring: The token refresh workflow runs every 55 minutes regardless of traffic. Budget approximately 800 WU per month for token refresh alone. Add payout calls (each is ~1 WU) based on your expected payout volume. For high-volume platforms, budget for Bubble's Professional plan or higher.
1// Bubble Data Type: Payee2// Fields:3// payoneer_email → Text4// payoneer_payee_id → Text (optional, more reliable identifier)5// payout_currency → Text (default: USD)6// payouts_enabled → Yes/No (default: No — enable after verification)7// user → User (link to the Bubble user account)89// Privacy Rules for Payee:10// Find in searches: Only when This Payee's user = Current User11// View all fields: Only when This Payee's user = Current User12// (admin users can have separate visibility rules)1314// Production Checklist:15// 1. Partner approval received from Payoneer → update API URLs16// 2. Token URL: change to https://api.payoneer.com/v4/oauth2/token17// 3. Payout URL: change to https://api.payoneer.com/v4/programs/{id}/payments/payout18// 4. Verify client_id / client_secret (may differ for production)19// 5. Test with a real payout ($1.00 to your own Payoneer account)20// 6. Set up error notification workflow for 401 responsesPro tip: Payoneer does not provide a way for your platform to verify whether a payee email is registered in the Payoneer system before sending a payout. Failed payouts (to non-existent Payoneer accounts) are returned with an error response. Add a 'payouts_enabled' boolean to your payee records that you set to true only after confirming with the payee that their Payoneer account is active.
Expected result: Your Bubble app has a Payee data type for storing contractor Payoneer account details. You have applied for Payoneer production partner access. The sandbox integration is complete and can initiate test payouts to sandbox payee IDs.
Common use cases
International Freelancer Marketplace Payouts
A marketplace platform that connects clients with freelancers in 50+ countries. When a project is marked complete and the client releases payment, Bubble calls the Payoneer payout API to transfer the freelancer's earnings directly to their Payoneer account. The platform's Bubble backend handles the OAuth token lifecycle automatically.
Build a Bubble workflow that triggers when a Project's status changes to Completed: retrieve the current Payoneer access token from the App Config record, call POST /v4/programs/{program_id}/payments/payout with the freelancer's Payoneer email, the project amount minus the platform fee, and USD as the currency. Store the returned payment_id in the Project record.
Copy this prompt to try it in Bubble
Content Creator Earnings Distribution
A content platform distributes monthly revenue share to international creators based on their content performance metrics. Bubble calculates each creator's earnings, then batches payout calls to Payoneer at the end of each billing cycle. The scheduled workflow handles token refresh; a separate monthly trigger initiates all pending payouts.
Create a Bubble scheduled workflow that runs on the 1st of each month: search for all Content Creators with pending_earnings > 0, loop through them using 'Schedule API workflow on a list', call Payoneer payout for each with amount=their pending_earnings, and update each Creator's last_payout_date and reset pending_earnings to 0.
Copy this prompt to try it in Bubble
Agency Contractor Payment System
A digital agency uses Bubble to track hours worked by international contractors. When the agency admin approves a timesheet, Bubble triggers a Payoneer payout for the contractor's billable hours at their contracted rate. The system tracks payout status and sends automated payment confirmations.
Design a Bubble admin workflow for approving timesheets: check if the token in App Config expires within 5 minutes (refresh if so), call POST /v4/programs/{program_id}/payments/payout with the contractor's Payoneer ID and the calculated pay amount, save the payout_id to the Timesheet record, and send the contractor an email with payment confirmation.
Copy this prompt to try it in Bubble
Troubleshooting
Payoneer token API returns 401 Unauthorized
Cause: The client_id or client_secret in the token request body is incorrect, or the wrong environment URL is being used (production credentials with sandbox URL, or vice versa).
Solution: Verify your client_id and client_secret in the Payoneer Partner Portal under your application's credentials section. Check that you are using the sandbox URL (api.sandbox.payoneer.com) with sandbox credentials, not the production URL. The token endpoint requires application/x-www-form-urlencoded content type — if Bubble is sending JSON, the request will fail.
1// Correct token request format:2// URL: https://api.sandbox.payoneer.com/v4/oauth2/token3// Content-Type: application/x-www-form-urlencoded4// Body: grant_type=client_credentials&client_id=YOUR_ID&client_secret=YOUR_SECRET56// Common mistake — sending JSON instead:7// { "grant_type": "client_credentials", ... } → Will failPayout call fails with 401 even though the token was just refreshed
Cause: The access token stored in App Config was overwritten by a race condition (two refresh workflows running simultaneously), or the token was retrieved from App Config before the refresh completed.
Solution: Add a 'token_refreshing' boolean field to App Config. In the refresh workflow, check this field before refreshing — if true, skip the refresh. Set it to true at the start of the refresh workflow and back to false at the end. In payout workflows, add a short delay (Schedule API workflow with 2-second delay) after triggering a token refresh before reading the new token from App Config.
Payout API returns 'Payee not found' or 400 error for a known payee email
Cause: The payee's Payoneer account may not be active, or the email does not match their registered Payoneer account email exactly (case-sensitive match in some cases). Also occurs when using sandbox test emails in production or production payee IDs in sandbox.
Solution: Verify with the payee that their Payoneer account is active and that the email you have on file matches exactly. In sandbox, use Payoneer's official test payee IDs from the documentation — these are pre-configured sandbox accounts that accept test payouts. Do not use real email addresses in sandbox — the sandbox system has its own payee registry.
'There was an issue setting up your call' when initializing the token endpoint
Cause: The API Connector initialization requires real credentials in the body. Placeholder values like 'test123' will fail because Payoneer validates the client_id format.
Solution: Use your actual sandbox client_id and client_secret in the initialization test values. These are safe to use for initialization (they are stored Private in the API Connector). After initialization, Bubble will have detected the access_token and expires_in fields. If you do not want to put real credentials in the initialization fields, click 'Initialize call' with your real values and then immediately note the detected fields — you can then change the values back to placeholders for display purposes.
Recurring workflow for token refresh is not running on schedule
Cause: Bubble's recurring events require the Backend Workflow to be active and the 'This app exposes a Workflow API' setting to be enabled. The recurring event may not have been properly activated after creation.
Solution: Go to Settings → API → confirm 'This app exposes a Workflow API' is checked. Go to Backend Workflows → Recurring Events → verify the payoneer_token_refresh recurring event shows as Active. If it is not running, check the Bubble Logs tab → Workflow logs for any errors in the refresh workflow itself. A common issue is the App Config 'first item' search returning empty (no App Config record exists) — verify the record was created manually.
Best practices
- Never hardcode the Payoneer access token in an API Connector header — it expires every hour and will break all payout calls. Always retrieve it dynamically from the App Config database record.
- Set Privacy Rules on the App Config data type to prevent any user-facing access — the access_token grants the ability to initiate payouts on your entire platform and must be restricted to Backend Workflow access only.
- Add a 5-minute buffer to your token expiry check — if the token expires in less than 5 minutes when a payout is triggered, refresh the token first before proceeding. Scheduled workflow delays can cause the 55-minute refresh to arrive late.
- Store the client_reference_id (your internal Bubble record ID) with every payout call — this allows you to reconcile Payoneer payment IDs back to Bubble records if a webhook is missed or a payout status needs manual investigation.
- Budget for the WU cost of token refresh: approximately 800 WU per month for the scheduled refresh workflow alone, plus ~1 WU per payout call. High-volume platforms should be on a plan that accommodates this baseline overhead.
- Apply for Payoneer production partner access early — the 1–4 week approval window means you should submit the application as soon as your business use case is defined, not after the integration is built. Sandbox testing can happen in parallel.
- Set up an error notification workflow that triggers when the payout call returns a non-200 response — send an email or Slack notification to your team. Failed payouts are not automatically retried by Payoneer, and your contractors expect to receive payment.
- Store payout currency preferences per payee — different contractors may prefer different currencies, and Payoneer supports multi-currency payouts. Storing this in the Payee data type avoids having to ask contractors each time.
Alternatives
PayPal Payouts uses a similar OAuth 2.0 token pattern but is better for US-centric B2C disbursements (referral rewards, cashback) where recipients already have PayPal accounts. Payoneer is better for international B2B contractor payments where local bank delivery (not just PayPal wallet) is required.
Stripe Connect handles marketplace payment splits at charge time and is easier to set up in Bubble than Payoneer. However, Stripe Connect payouts work best in the US, Canada, and EU. Payoneer reaches 190+ countries, including many where Stripe Connect is not available for seller payouts.
Basic Stripe supports single-merchant payouts to a linked bank account in supported countries. For paying international contractors at scale, Stripe does not match Payoneer's country coverage or freelancer ecosystem. Payoneer is the better choice for international B2B mass payouts.
Frequently asked questions
How long does Payoneer partner approval take, and what do I need to apply?
The partner approval process typically takes 1–4 weeks. You need to provide your business name and registration details, a description of your platform and how it will use payouts, your estimated monthly payout volume, the countries you plan to pay to, and supporting business documents (similar to opening a business bank account). Apply at developer.payoneer.com as early in your project as possible — sandbox testing can happen in parallel during the waiting period.
Do my payees need to sign up with Payoneer, or does my platform create accounts for them?
Payees must create their own Payoneer accounts at payoneer.com — your platform cannot create accounts on their behalf. You collect their registered Payoneer email address or payee ID and use it as the recipient in your payout API calls. This means you need an onboarding step in your Bubble app where contractors confirm their Payoneer account details before they become eligible for payouts.
Why is the token expiry only 3600 seconds? What happens if the refresh fails?
Payoneer uses short-lived tokens as a security measure — even if a token is compromised, it is only valid for an hour. If your scheduled refresh workflow fails (e.g., Payoneer's token endpoint is temporarily unavailable), payout calls will fail with 401 errors until the next successful refresh cycle. Add a payout workflow condition that checks token expiry and triggers an emergency refresh if needed, and set up error notifications so your team knows immediately when payout failures occur.
How does Payoneer handle currency conversion for international payouts?
Payoneer handles currency conversion automatically. You specify the payout amount and currency in your API call (e.g., USD 150.00), and Payoneer converts and delivers in the payee's local currency or Payoneer balance currency. Payoneer applies their own exchange rate and a conversion fee. Unlike Stripe, you do not specify the destination currency in your API call — the payee's account settings determine how they receive the funds.
Can I use Payoneer in Bubble without a paid plan?
No — not for a production-ready integration. The token refresh system requires scheduled recurring workflows, which are only available on paid Bubble plans (Starter $32/month or above). You could manually refresh the token by clicking a button in an admin panel (which technically works on the Free plan), but this is not viable for a production marketplace where payouts need to run reliably without manual intervention.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation