Payment Gateway Guide
FluidGrids supports multiple payment methods to accommodate users worldwide. This guide explains each payment gateway, their features, and how to use them effectively.
Supported Payment Methods
BOFF Workspace supports three payment methods, each optimized for different use cases and regions.
Credits (Direct)
Use your existing credit balance for instant purchases.
Key Features:
- Processing Time: Instant (immediate confirmation)
- Transaction Fees: None
- Best For: Users with existing credit balance
- Currency: Credits only (1 credit = base currency equivalent)
- Refunds: Via support ticket with review process
- Security: Secure database transaction with audit trail
- Availability: All regions
Advantages:
- No processing delays
- No transaction fees
- Immediate access to purchases
- Works regardless of geographic location
When to Use:
- You have sufficient credit balance
- Need immediate access to resources
- Want to avoid payment processing delays
- Making small or frequent purchases
Razorpay (India)
India's leading payment gateway with comprehensive local payment support.
Key Features:
- Processing Time: 5-15 minutes average
- Transaction Fees: Standard Razorpay fees apply (varies by payment method)
- Best For: Indian customers and businesses
- Currency: INR only (automatically selected for Indian accounts)
- Payment Methods:
- UPI (Google Pay, PhonePe, Paytm, BHIM)
- Credit/Debit Cards (Visa, Mastercard, RuPay, Amex)
- Net Banking (50+ banks)
- Wallets (Paytm, Mobikwik, Freecharge, etc.)
- 3D Secure: Yes (OTP verification for cards)
- Refunds: Processed via Razorpay dashboard (3-7 business days)
- Security: PCI DSS Level 1 compliant
- Modal Interface: Popup payment form with Razorpay branding
Advantages:
- Wide variety of local payment methods
- Support for all major Indian banks
- UPI for instant bank transfers
- Familiar interface for Indian users
- Competitive transaction fees for India
When to Use:
- You're based in India
- Prefer UPI or net banking
- Want to use Indian credit/debit cards
- Need local payment options
Fee Structure:
- Credit/Debit Cards: ~2% + GST
- Net Banking: ~₹10-15 per transaction + GST
- UPI: 0% (free for customers, small fee for merchants)
- Wallets: Varies by wallet provider
Stripe (International)
Global payment platform supporting customers worldwide.
Key Features:
- Processing Time: 5-15 minutes average
- Transaction Fees: Standard Stripe fees apply (varies by region and card type)
- Best For: International customers and global businesses
- Currencies: USD, EUR, GBP, INR, and 135+ more
- Payment Methods:
- Credit/Debit Cards (Visa, Mastercard, Amex, Discover, JCB, Diners Club)
- Apple Pay
- Google Pay
- Link (Stripe's one-click payment)
- 3D Secure: Yes (Strong Customer Authentication SCA compliant)
- Refunds: Processed via Stripe dashboard (5-10 business days)
- Security: PCI DSS Level 1 compliant, fraud detection included
- Form Interface: Embedded payment elements with modern UI
Advantages:
- Global currency support
- Advanced fraud protection
- Modern, secure payment form
- Support for digital wallets
- Industry-leading reliability
- Automatic currency conversion
When to Use:
- You're outside India
- Need to pay in non-INR currency
- Prefer international cards
- Want Apple Pay or Google Pay
- Making large or international purchases
Fee Structure:
- Domestic Cards: ~2.9% + $0.30 per transaction
- International Cards: ~3.9% + $0.30 per transaction
- Currency Conversion: Additional 1% for conversion
- Varies by country and card type
Payment Flow
For Razorpay
Follow these steps when using Razorpay for payment:
-
Select Razorpay at Checkout
- Choose Razorpay as your payment method
- Currency is automatically locked to INR
-
Review Order Summary
- Verify items in your cart
- Check total amount in INR
- Review any applied discounts or credits
-
Click "Complete Purchase"
- Initiates payment process
- Opens Razorpay payment modal
-
Razorpay Modal Opens
- Branded Razorpay interface appears
- Shows merchant details and amount
- Displays available payment methods
-
Choose Payment Method
- UPI: Select UPI app or enter VPA
- Cards: Enter card details and OTP
- Net Banking: Select bank and login
- Wallets: Choose wallet and authenticate
-
Complete Payment
- Follow method-specific steps
- Complete any required authentication (OTP, PIN, etc.)
- Wait for confirmation
-
Verification Callback
- System receives payment confirmation from Razorpay
- Validates payment signature
- Checks transaction status
-
Order Status Updates
- Status changes from "Pending" to "Processing"
- Then to "Completed" upon successful verification
- You'll see real-time status updates
-
Credits/Items Delivered
- Credits added to your account immediately
- Subscriptions activated instantly
- Store items made available
- Email confirmation sent
Troubleshooting Razorpay Payments:
- Payment Stuck: Wait 15 minutes before retrying
- UPI Timeout: Check bank app, payment may have succeeded
- Card Decline: Verify OTP entry, check card limits
- Modal Not Opening: Disable popup blockers
For Stripe
Follow these steps when using Stripe for payment:
-
Select Stripe at Checkout
- Choose Stripe as your payment method
- Currency selection becomes available
-
Choose Currency
- Select from: USD, EUR, GBP, INR, or other supported currencies
- System shows converted amount based on current exchange rates
- Exchange rate displayed for transparency
-
Enter Card Details in Embedded Form
- Card Number: Enter 16-digit card number
- Expiry Date: MM/YY format
- CVC: 3 or 4-digit security code
- Billing Postal Code: For additional verification
- Form validates entries in real-time
-
Click "Pay" Button
- Submits payment information securely to Stripe
- Initiates payment processing
-
3D Secure Authentication (if required)
- Browser redirects to card issuer's authentication page
- Enter OTP sent to phone
- Or use bank's mobile app for authentication
- Required for cards in EU and other regions with SCA
-
Payment Processing
- Stripe processes the transaction
- Fraud detection systems analyze the payment
- Typically completes within seconds
- May take longer for international cards
-
Webhook Notification
- Stripe sends secure webhook to our servers
- Contains payment confirmation and transaction details
- System validates webhook signature
-
Order Status Updates
- Real-time status updates shown in UI
- Progress from "Processing" to "Completed"
- Automatic page updates via polling
-
Credits/Items Delivered
- Credits added to account immediately
- Subscriptions activated
- Store items provisioned
- Email receipt and confirmation sent
Troubleshooting Stripe Payments:
- Card Declined: Check card details, ensure sufficient funds
- 3D Secure Failed: Contact your bank, ensure SMS/app access
- Currency Issues: Verify correct currency selected
- Form Errors: Check all fields are filled correctly
Hybrid Payment (Credits + Gateway)
Combine existing credits with gateway payment for flexible purchasing.
How Hybrid Payment Works
If you have partial credits:
-
System Detects Credit Balance
- Automatically checks your available credits
- Calculates remaining amount needed
-
Payment Split Calculation
- Credits applied first (up to available balance)
- Remaining amount calculated for gateway payment
- Clear breakdown shown at checkout
-
Example Scenario:
Total Purchase: $100
Available Credits: $30
Payment Breakdown:
- Credits Applied: $30
- Pay via Gateway: $70 -
Complete Payment
- Credits deducted immediately
- Gateway processes remaining amount
- Both transactions must succeed
- If gateway fails, credits are refunded automatically
Benefits of Hybrid Payment
- Use Existing Credits: Don't let credits go unused
- Reduce Payment Fees: Lower transaction fees on smaller gateway amount
- Flexible Budgeting: Combine multiple payment sources
- Instant Partial Payment: Credit portion applies instantly
When Hybrid Payment Applies
Hybrid payment is automatically offered when:
- Your credit balance is greater than $0
- Your credit balance is less than total purchase amount
- You haven't opted out of using credits
- Purchase supports credit payment
Transaction Status Polling
After completing payment, the system monitors transaction status to ensure delivery.
How Polling Works
- Initial Status: Transaction marked as "Processing"
- Polling Begins: System checks status every 3-5 seconds
- Gateway Query: Queries payment gateway for transaction status
- Status Updates: UI updates automatically without page refresh
- Completion Detection: Stops polling when final status received
- Timeout Handling: After 5 minutes, shows message but continues checking in background
What You See
- Processing Indicator: Animated spinner with "Processing payment..." message
- Status Messages:
- "Verifying payment with gateway..."
- "Confirming transaction..."
- "Almost there..."
- Progress Updates: Real-time status changes
- Final Confirmation: Success message with order details or error notification
If Timeout Occurs
If polling times out (rare), don't panic:
-
Wait 5-15 Minutes
- Payment may still be processing
- Gateway confirmations can be delayed
- System continues checking in background
-
Check Billing Dashboard
- Go to Billing & Subscriptions
- Check Recent Transactions
- Look for your transaction ID
- Status will update there once confirmed
-
Don't Retry Payment Immediately
- You might create duplicate charges
- Wait for first payment to complete or fail
- Check email for payment confirmation
-
Contact Support if Not Resolved After 30 Minutes
- Provide Transaction ID
- Include screenshot of payment confirmation
- Support can manually verify status
- Typical resolution time: 1-2 hours
Transaction Status Meanings
- Pending: Payment initiated, awaiting confirmation
- Processing: Gateway processing the payment
- Verifying: System confirming with gateway
- Completed: Payment successful, items delivered
- Failed: Payment declined or error occurred
- Timeout: Status check timed out (doesn't mean payment failed)
API Reference (for developers)
Integrate payment functionality into your applications using our GraphQL API.
Create Razorpay Order
Initiate a Razorpay payment order.
mutation CreateRazorpayOrder($input: createRazorpayOrderInput!) {
createRazorpayOrder(input: $input) {
orderID
amount
currency
key
transactionID
}
}
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
billingAccountId | String | Yes | Your billing account ID |
currencySelected | String | Yes | "INR" (only supported currency for Razorpay) |
planId | String | Optional | Plan ID for subscription purchases |
storeItemId | String | Optional | Store item ID for marketplace purchases |
creditAmount | Float | Optional | Amount of credits to purchase |
addOnIds | [String] | Optional | Array of add-on IDs to purchase |
recurrence | Boolean | Optional | true for recurring subscription, false for one-time |
includeCredits | Boolean | Optional | true to use hybrid payment with existing credits |
Response Fields:
orderID: Razorpay order identifier (use for payment modal)amount: Total amount in smallest currency unit (paise for INR)currency: "INR"key: Razorpay public key for your accounttransactionID: Internal transaction ID (use for status polling)
Example Request:
{
"input": {
"billingAccountId": "bill_abc123",
"currencySelected": "INR",
"planId": "plan_pro_monthly",
"recurrence": true,
"includeCredits": false
}
}
Example Response:
{
"data": {
"createRazorpayOrder": {
"orderID": "order_razorpay_xyz789",
"amount": 99900,
"currency": "INR",
"key": "rzp_live_1234567890",
"transactionID": "txn_internal_abc123"
}
}
}
Create Stripe Order
Initiate a Stripe payment intent.
mutation CreateStripeOrder($input: createStripeOrderInput!) {
createStripeOrder(input: $input) {
clientSecret
amount
key
transactionID
}
}
Parameters:
All parameters same as Razorpay with the following differences:
| Parameter | Type | Required | Description |
|---|---|---|---|
currencySelected | String | Yes | "USD", "EUR", "GBP", "INR", or other supported currency |
Response Fields:
clientSecret: Stripe client secret (use for payment element)amount: Total amount in smallest currency unit (cents for USD)key: Stripe publishable keytransactionID: Internal transaction ID (use for status polling)
Example Request:
{
"input": {
"billingAccountId": "bill_abc123",
"currencySelected": "USD",
"creditAmount": 100.00,
"includeCredits": true
}
}
Example Response:
{
"data": {
"createStripeOrder": {
"clientSecret": "pi_secret_xyz789",
"amount": 7000,
"key": "pk_live_1234567890",
"transactionID": "txn_internal_def456"
}
}
}
Check Transaction Status
Poll transaction status after payment completion.
query PollingStatus($transactionID: String!) {
pollingStatus(transactionID: $transactionID) {
status
message
}
}
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
transactionID | String | Yes | Transaction ID from order creation |
Response Fields:
status: Transaction status ("pending", "processing", "completed", "failed")message: Human-readable status message
Example Request:
{
"transactionID": "txn_internal_abc123"
}
Example Response:
{
"data": {
"pollingStatus": {
"status": "completed",
"message": "Payment successful. Credits have been added to your account."
}
}
}
Polling Best Practices:
- Poll every 3-5 seconds
- Implement exponential backoff after 1 minute
- Stop polling after receiving "completed" or "failed" status
- Timeout after 5 minutes, but inform user to check later
- Include error handling for network failures
Error Responses
All API calls may return errors. Common error codes:
{
"errors": [
{
"message": "Insufficient credits in billing account",
"extensions": {
"code": "INSUFFICIENT_CREDITS",
"availableCredits": 50.00,
"requiredCredits": 100.00
}
}
]
}
Common Error Codes:
INSUFFICIENT_CREDITS: Not enough credits for hybrid paymentINVALID_BILLING_ACCOUNT: Billing account not found or no accessINVALID_CURRENCY: Unsupported currency for selected gatewayPAYMENT_GATEWAY_ERROR: Gateway returned an errorDUPLICATE_TRANSACTION: Transaction already in progressINVALID_PLAN: Plan not found or not availableINVALID_ADDON: Add-on not compatible with plan
Security Considerations
Data Protection
- PCI Compliance: Never send card details to our servers; goes directly to gateway
- Encryption: All payment data encrypted in transit (TLS 1.3)
- Tokenization: Card details tokenized by payment gateway
- No Storage: We never store complete card numbers or CVV
Fraud Prevention
- Gateway Fraud Detection: Both Stripe and Razorpay include fraud analysis
- 3D Secure: Required for supported cards to prevent unauthorized use
- Velocity Checking: Multiple failed payments temporarily blocked
- Risk Scoring: Suspicious transactions flagged for review
Best Practices
- Keep Credentials Secret: Never share API keys or client secrets
- Verify SSL: Always check for HTTPS in payment pages
- Monitor Transactions: Regularly review billing dashboard
- Report Suspicious Activity: Contact support immediately for unusual charges
- Use Strong Authentication: Enable 2FA on your account
Choosing the Right Payment Method
Decision Matrix
| Scenario | Recommended Method | Reason |
|---|---|---|
| Located in India | Razorpay | Local payment methods, lower fees |
| International user | Stripe | Multi-currency support |
| Have credit balance | Credits (Direct) | Instant, no fees |
| Large purchase | Stripe | Better for high-value transactions |
| Recurring subscription | Either gateway | Both support auto-renewal |
| Need immediate access | Credits | Instant processing |
| Prefer UPI | Razorpay | Best UPI support |
| Using Apple Pay | Stripe | Apple Pay supported |
Next Steps
Now that you understand payment gateways:
- Set Up Payment Method: Add your preferred payment option in billing settings
- Make a Purchase: Try purchasing credits or a subscription
- Monitor Transactions: Check billing dashboard after purchase
- Save for Future: Payment methods can be saved for faster checkout
- Enable Auto-Reload: Set up automatic credit reload (coming soon)
Related Documentation
- Purchasing Credits - Buy credits using payment gateways
- Managing Subscriptions - Subscribe to plans
- Common Errors and Solutions - Troubleshoot payment issues
Secure, flexible payment options ensure you can access FluidGrids features regardless of your location.