Overview
Ionic enables financial institutions and software platforms to offer payment processing as part of their service offering. Whether you’re a community bank, credit union, financial services provider, or a SaaS/ISV platform, you can embed seamless payment acceptance for your customers.
Skip the build time and compliance burden. Ionic provides white-label infrastructure with custom integrations all managed for you.
Use Cases
Vertical SaaS Industry-specific software platforms (dental, legal, automotive) that want to offer integrated payments to their customers
Marketplaces Multi-vendor marketplaces that need to process payments and route funds to sellers while taking platform fees
Franchise Management Systems managing multiple franchise locations under a single brand with centralized reporting
E-commerce Platforms Shopping cart or website builder platforms offering payment processing to merchants
Partner Models
Embed payments and turn transactions into recurring revenue. Ideal for SaaS companies, marketplaces, and vertical software platforms.
What you get:
Flexible API with competitive revenue share
Skip the build time and compliance burden
Seamless integration with your platform
White-label payment processing
Benefits:
Faster time to market
No PCI compliance burden
Monetize transactions from your customers
Focus on your core product
Architecture Overview
┌─────────────────────────────────────────┐
│ Your Platform/SaaS │
│ ┌────────────┐ ┌────────────┐ │
│ │ Merchant A │ │ Merchant B │ │
│ │ Dashboard │ │ Dashboard │ │
│ └────────────┘ └────────────┘ │
│ │ │ │
│ └───────────┬───────┘ │
│ │ │
│ ┌──────────▼──────────┐ │
│ │ Your API Backend │ │
│ │ (Master Merchant) │ │
│ └──────────┬──────────┘ │
└─────────────────────┼───────────────────┘
│
│ HTTPS/API
│
┌──────────▼──────────┐
│ Ionic Gateway │
│ (Payment Service) │
└─────────────────────┘
Step 1: Merchant Onboarding
When a new merchant signs up for your platform:
Collect merchant information (business details, banking info, ownership)
Submit to Ionic for underwriting and approval
Receive sub-merchant ID from Ionic
Store mapping between your platform user and their sub-merchant ID
Contact your Ionic account manager to enable platform capabilities and discuss underwriting requirements.
Step 2: Processing Payments
Use the sub-merchant variables to identify each merchant with their transactions:
Direct API
Node.js
Python
PHP
curl -X POST https://api.ionicfi.com/api/transact.php \
-d "security_key=YOUR_MASTER_SECURITY_KEY" \
-d "type=sale" \
-d "amount=100.00" \
-d "ccnumber=4111111111111111" \
-d "ccexp=1225" \
-d "cvv=999" \
-d "submerchant_id=SUB_MERCHANT_001" \
-d "submerchant_name=Acme Coffee Shop" \
-d "submerchant_mcc=5814" \
-d "submerchant_address=123 Main St" \
-d "submerchant_city=Portland" \
-d "submerchant_state=OR" \
-d "submerchant_zip=97201" \
-d "submerchant_country=US"
const axios = require ( 'axios' );
async function processPlatformPayment ( merchantId , paymentData ) {
// Fetch sub-merchant details from your database
const merchant = await db . merchants . findById ( merchantId );
const response = await axios . post ( 'https://api.ionicfi.com/api/transact.php' , {
security_key: process . env . IONIC_MASTER_KEY ,
type: 'sale' ,
amount: paymentData . amount ,
ccnumber: paymentData . cardNumber ,
ccexp: paymentData . expiration ,
cvv: paymentData . cvv ,
// Sub-merchant identification
submerchant_id: merchant . ionicSubMerchantId ,
submerchant_name: merchant . businessName ,
submerchant_mcc: merchant . mcc ,
submerchant_address: merchant . address ,
submerchant_city: merchant . city ,
submerchant_state: merchant . state ,
submerchant_zip: merchant . zip ,
submerchant_country: merchant . country ,
// Additional fields
orderid: ` ${ merchantId } - ${ Date . now () } ` ,
orderdescription: paymentData . description
});
return response . data ;
}
import requests
def process_platform_payment ( merchant_id , payment_data ):
# Fetch sub-merchant details from your database
merchant = db.merchants.find_by_id(merchant_id)
payload = {
'security_key' : os.environ[ 'IONIC_MASTER_KEY' ],
'type' : 'sale' ,
'amount' : payment_data[ 'amount' ],
'ccnumber' : payment_data[ 'card_number' ],
'ccexp' : payment_data[ 'expiration' ],
'cvv' : payment_data[ 'cvv' ],
# Sub-merchant identification
'submerchant_id' : merchant[ 'ionic_submerchant_id' ],
'submerchant_name' : merchant[ 'business_name' ],
'submerchant_mcc' : merchant[ 'mcc' ],
'submerchant_address' : merchant[ 'address' ],
'submerchant_city' : merchant[ 'city' ],
'submerchant_state' : merchant[ 'state' ],
'submerchant_zip' : merchant[ 'zip' ],
'submerchant_country' : merchant[ 'country' ],
# Additional fields
'orderid' : f " { merchant_id } - { int (time.time()) } " ,
'orderdescription' : payment_data[ 'description' ]
}
response = requests.post(
'https://api.ionicfi.com/api/transact.php' ,
data = payload
)
return response.json()
<? php
function processPlatformPayment ( $merchantId , $paymentData ) {
// Fetch sub-merchant details from your database
$merchant = $db -> merchants -> findById ( $merchantId );
$payload = [
'security_key' => $_ENV [ 'IONIC_MASTER_KEY' ],
'type' => 'sale' ,
'amount' => $paymentData [ 'amount' ],
'ccnumber' => $paymentData [ 'cardNumber' ],
'ccexp' => $paymentData [ 'expiration' ],
'cvv' => $paymentData [ 'cvv' ],
// Sub-merchant identification
'submerchant_id' => $merchant -> ionicSubMerchantId ,
'submerchant_name' => $merchant -> businessName ,
'submerchant_mcc' => $merchant -> mcc ,
'submerchant_address' => $merchant -> address ,
'submerchant_city' => $merchant -> city ,
'submerchant_state' => $merchant -> state ,
'submerchant_zip' => $merchant -> zip ,
'submerchant_country' => $merchant -> country ,
// Additional fields
'orderid' => $merchantId . '-' . time (),
'orderdescription' => $paymentData [ 'description' ]
];
$ch = curl_init ( 'https://api.ionicfi.com/api/transact.php' );
curl_setopt ( $ch , CURLOPT_POST , 1 );
curl_setopt ( $ch , CURLOPT_POSTFIELDS , http_build_query ( $payload ));
curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , true );
$response = curl_exec ( $ch );
curl_close ( $ch );
return json_decode ( $response , true );
}
?>
Step 3: Reporting & Settlement
Transaction Reporting
Use the Query API to retrieve transaction details for specific sub-merchants: curl -X POST https://api.ionicfi.com/api/query.php \
-d "security_key=YOUR_MASTER_SECURITY_KEY" \
-d "submerchant_id=SUB_MERCHANT_001" \
-d "start_date=20240101" \
-d "end_date=20240131"
Settlement
Configure settlement options with your Ionic account manager:
Master Settlement : All funds settle to your master account, you pay out sub-merchants
Split Settlement : Funds automatically split between platform fees and sub-merchant payouts
Direct Settlement : Sub-merchants receive direct deposits
Reconciliation
Use webhooks to receive real-time transaction notifications and update your platform’s records: // Webhook endpoint in your platform
app . post ( '/webhooks/ionic' , ( req , res ) => {
const event = req . body ;
if ( event . transaction_type === 'sale' && event . response === '1' ) {
// Find merchant by submerchant_id
const merchant = await db . merchants . findBySubMerchantId (
event . submerchant_id
);
// Update merchant's transaction records
await db . transactions . create ({
merchantId: merchant . id ,
amount: event . amount ,
transactionId: event . transactionid ,
timestamp: event . time
});
}
res . sendStatus ( 200 );
});
Required Sub-Merchant Variables
Unique identifier for the sub-merchant. Use your internal merchant ID or Ionic-provided ID.
Legal business name or DBA of the sub-merchant. Appears on cardholder statements.
Merchant Category Code (MCC) that describes the sub-merchant’s business type. Common MCC Codes:
5814 - Fast Food Restaurants
5812 - Eating Places, Restaurants
5399 - Miscellaneous General Merchandise
5734 - Computer Software Stores
7372 - Computer Programming Services
7299 - Miscellaneous Personal Services
Street address of the sub-merchant’s business location.
City of the sub-merchant’s business location.
Two-letter state/province code.
Postal code of the sub-merchant’s business location.
Two-letter ISO country code (e.g., US, CA, GB).
White-Label Options
Hosted Payment Pages
Customize Collect Checkout with your branding:
Custom Domain : payments.yourplatform.com
Logo & Colors : Match your platform’s brand identity
Custom Fields : Add platform-specific data collection
Receipt Templates : Branded confirmation pages and emails
Contact your account manager to configure white-label checkout pages.
Use Collect.js to embed tokenized payment forms directly in your platform:
< script src = "https://secure.ionicfi.com/token/Collect.js"
data-tokenization-key = "YOUR_TOKENIZATION_KEY"
data-custom-css = '{"border-color": "#yourcolor", "font-family": "Your Font"}' ></ script >
< form action = "/process-payment" method = "POST" id = "payment-form" >
< input type = "hidden" name = "merchant_id" value = "123" />
< div id = "ccnumber" ></ div >
< div id = "ccexp" ></ div >
< div id = "cvv" ></ div >
< button type = "submit" > Process Payment </ button >
</ form >
Custom Merchant Dashboard
Build your own merchant portal using Ionic APIs:
Transaction history via Query API
Settlement reports
Refund/void management
Customer vault management
Custom analytics and reporting
Common Integration Patterns
Marketplace Split Payments
Process a transaction and track platform fees vs. merchant earnings:
async function processMarketplaceOrder ( order ) {
const seller = await db . merchants . findById ( order . sellerId );
const platformFee = order . amount * 0.05 ; // 5% platform fee
const sellerAmount = order . amount - platformFee ;
// Process full amount through Ionic
const transaction = await ionic . charge ({
amount: order . amount ,
submerchant_id: seller . ionicSubMerchantId ,
submerchant_name: seller . businessName ,
// ... other submerchant fields
orderid: order . id ,
orderdescription: `Order ${ order . id } - ${ seller . businessName } `
});
if ( transaction . response === '1' ) {
// Record split in your database
await db . transactions . create ({
orderId: order . id ,
totalAmount: order . amount ,
sellerAmount: sellerAmount ,
platformFee: platformFee ,
sellerId: seller . id ,
ionicTransactionId: transaction . transactionid
});
// Update seller balance for future payout
await db . merchants . incrementBalance ( seller . id , sellerAmount );
}
return transaction ;
}
Multi-Tenant SaaS
Route payments to the correct sub-merchant based on the current user/tenant:
// Middleware to identify current merchant context
function identifyMerchant ( req , res , next ) {
// Extract from subdomain, JWT token, or session
const subdomain = req . hostname . split ( '.' )[ 0 ];
const merchant = await db . merchants . findBySubdomain ( subdomain );
req . merchant = merchant ;
next ();
}
// Payment processing route
app . post ( '/api/charge' , identifyMerchant , async ( req , res ) => {
const response = await ionic . charge ({
amount: req . body . amount ,
payment_token: req . body . token ,
// Automatically include merchant from context
submerchant_id: req . merchant . ionicSubMerchantId ,
submerchant_name: req . merchant . businessName ,
submerchant_mcc: req . merchant . mcc ,
submerchant_address: req . merchant . address ,
submerchant_city: req . merchant . city ,
submerchant_state: req . merchant . state ,
submerchant_zip: req . merchant . zip ,
submerchant_country: req . merchant . country
});
res . json ( response );
});
Franchise Management
Process payments for multiple franchise locations under a single brand:
async function processFranchisePayment ( locationId , paymentData ) {
const location = await db . locations . findById ( locationId );
const franchise = await db . franchises . findById ( location . franchiseId );
const transaction = await ionic . charge ({
amount: paymentData . amount ,
payment_token: paymentData . token ,
// Location-specific sub-merchant details
submerchant_id: location . ionicSubMerchantId ,
submerchant_name: ` ${ franchise . brandName } - ${ location . name } ` ,
submerchant_mcc: franchise . mcc ,
submerchant_address: location . address ,
submerchant_city: location . city ,
submerchant_state: location . state ,
submerchant_zip: location . zip ,
submerchant_country: location . country ,
// Custom tracking fields
orderid: ` ${ locationId } - ${ Date . now () } ` ,
customer_receipt: true
});
// Update franchise-level and location-level analytics
await analytics . recordSale ({
franchiseId: franchise . id ,
locationId: location . id ,
amount: paymentData . amount ,
transactionId: transaction . transactionid
});
return transaction ;
}
Security Best Practices
Never expose your master merchant security_key to client-side code or share it with sub-merchants.
Key Management
Master Key : Your platform’s primary API key - keep this secure on your backend
Tokenization Key : Public key for Collect.js - safe to use client-side
Sub-Merchant Isolation : Each sub-merchant should only access their own data
PCI Compliance
As a platform, you have several options:
Tokenization (Recommended): Use Collect.js to tokenize cards client-side
Hosted Pages : Use Collect Checkout for fully hosted payment pages
Direct API : Requires PCI SAQ D compliance if handling raw card data
Data Storage
✅ Recommended
❌ Never Store
// Store in your database
{
merchantId : "123" ,
ionicSubMerchantId : "SUB_MERCHANT_001" ,
businessName : "Acme Coffee" ,
mcc : "5814" ,
// ... address fields
lastTransactionAt : "2024-01-15T10:30:00Z"
}
// DO NOT STORE: Card numbers, CVV, full magnetic stripe data
// NEVER store these fields
{
cardNumber : "4111111111111111" , // ❌
cvv : "999" , // ❌
trackData : "..." , // ❌
pin : "1234" // ❌
}
Use the Customer Vault to securely store payment methods with Ionic instead of in your own database.
Test Sub-Merchants
Create test sub-merchant entries in your platform during development:
const testMerchants = [
{
id: "test_merchant_1" ,
ionicSubMerchantId: "TEST_SUB_001" ,
businessName: "Test Coffee Shop" ,
mcc: "5814" ,
address: "123 Test St" ,
city: "Portland" ,
state: "OR" ,
zip: "97201" ,
country: "US"
},
{
id: "test_merchant_2" ,
ionicSubMerchantId: "TEST_SUB_002" ,
businessName: "Test Retail Store" ,
mcc: "5399" ,
address: "456 Demo Ave" ,
city: "Seattle" ,
state: "WA" ,
zip: "98101" ,
country: "US"
}
];
Test Transaction Scenarios
Use Ionic’s test card numbers with sub-merchant data:
# Approved transaction
curl -X POST https://api.ionicfi.com/api/transact.php \
-d "security_key=YOUR_TEST_KEY" \
-d "type=sale" \
-d "amount=10.00" \
-d "ccnumber=4111111111111111" \
-d "ccexp=1225" \
-d "cvv=999" \
-d "submerchant_id=TEST_SUB_001" \
-d "submerchant_name=Test Coffee Shop" \
-d "submerchant_mcc=5814" \
-d "submerchant_city=Portland" \
-d "submerchant_state=OR" \
-d "submerchant_country=US"
# Declined transaction (amount triggers decline)
curl -X POST https://api.ionicfi.com/api/transact.php \
-d "security_key=YOUR_TEST_KEY" \
-d "type=sale" \
-d "amount=50.00" \
-d "ccnumber=4111111111111111" \
# ... same submerchant fields
See the full Testing Guide for test card numbers and scenarios.
Getting Started
Contact Ionic
Reach out to your account manager or [email protected] to discuss platform requirements and partnership options.
Complete Underwriting
Provide business documentation and complete underwriting process for your master merchant account.
Receive Credentials
Obtain your master merchant security_key and tokenization keys for testing and production.
Build Integration
Implement sub-merchant onboarding flow and payment processing with sub-merchant variables in your platform.
Test Thoroughly
Test with multiple sub-merchants, various transaction types, and error scenarios.
Launch
Go live and start processing payments for your platform customers!
Additional Resources
Support
Questions about platform integration or partnership opportunities?