Credit Card Payments (Stripe)
Complete guide to subscribing, managing, and troubleshooting Stripe credit card payments for FortiBlox Nexus
Credit Card Payments with Stripe
FortiBlox Nexus uses Stripe for secure, reliable credit card processing. This guide covers everything you need to know about subscribing, managing your subscription, and handling payment issues.
Why Use Credit Card Payments?
Advantages:
- Instant subscription activation
- Automatic monthly billing
- Easy to upgrade/downgrade
- Self-service billing portal
- Invoice history and PDF receipts
- PCI-compliant security
- Fraud protection
- Familiar checkout experience
Accepted Cards:
- Visa
- Mastercard
- American Express
- Discover
- Diners Club
- JCB
How to Subscribe
Step 1: Sign Up for FortiBlox Nexus
If you haven't already:
- Go to nexus.fortiblox.com/signup
- Create your account (email, Google, GitHub, or Telegram)
- Verify your email address
- You'll start on the Free tier automatically
Step 2: Choose Your Tier
- Log into Developer Portal
- Navigate to Billing → Pricing
- Review tier features and pricing
- Click "Subscribe" on your chosen tier
Step 3: Enter Payment Details
You'll be redirected to Stripe Checkout (secure payment page):
- Email: Pre-filled with your account email
- Card Information:
- Card number
- Expiration date (MM/YY)
- CVC security code
- ZIP/Postal code
- Name on card: Cardholder name
- Billing address: Required for tax calculation
Screenshot Placeholder
[IMAGE: Stripe Checkout page showing payment form]
Location: /docs/images/billing/stripe-checkout.pngStep 4: Complete Payment
- Review subscription details:
- Tier name
- Monthly price
- Tax (if applicable)
- Total amount
- Click "Subscribe" button
- Wait for payment processing (usually 1-3 seconds)
- 3D Secure authentication may be required for some cards
3D Secure Authentication
Some cards require additional verification:
- You'll see a popup from your bank
- Enter your 3D Secure password or code
- Approve the payment
- Return to FortiBlox
[IMAGE: 3D Secure authentication popup]
Location: /docs/images/billing/3ds-auth.pngStep 5: Confirmation
After successful payment:
- You'll be redirected to Developer Portal
- See confirmation: "Subscription activated!"
- Your tier is updated immediately
- Credits are reset to your new tier's allocation
- Receive confirmation email with receipt
Managing Your Subscription
View Subscription Details
Access your subscription information:
- Log into Developer Portal
- Navigate to Billing → Subscription
You'll see:
- Current tier
- Monthly cost
- Next billing date
- Payment method (last 4 digits)
- Credits used this period
- Credits remaining
// Or fetch via API
const response = await fetch('https://nexus.fortiblox.com/api/subscription', {
headers: {
'Authorization': 'Bearer YOUR_API_KEY'
}
});
const subscription = await response.json();
console.log(subscription);
/*
{
subscription_id: 'sub_1QKmN4B5tZ...',
tier: 'developer',
status: 'active',
current_period_start: '2025-11-21T00:00:00Z',
current_period_end: '2025-12-21T00:00:00Z',
cancel_at_period_end: false,
credits_allocated: 50000000,
credits_used: 12500000,
credits_remaining: 37500000
}
*/Update Payment Method
Change your credit card without interrupting service:
Via Developer Portal
- Navigate to Billing → Subscription
- Click "Update Payment Method"
- You'll be redirected to Stripe Customer Portal
- Click "Update payment method"
- Enter new card details
- Click "Save"
- Return to Developer Portal
Via Stripe Customer Portal
Direct link: Manage Billing
- Enter your email address
- Check email for verification code
- Enter code to access portal
- Click "Update payment method"
- Enter new card details
- Save changes
// Or get Customer Portal link via API
const response = await fetch('https://nexus.fortiblox.com/api/billing/portal', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
return_url: 'https://nexus.fortiblox.com/billing'
})
});
const { url } = await response.json();
// Redirect user to this URL
window.location.href = url;Upgrade Your Tier
Upgrade to a higher tier at any time:
- Navigate to Billing → Pricing
- Click "Upgrade" on desired tier
- Review prorated charge:
- Remaining time on current tier is credited
- New tier price is charged
- You pay the difference
- Click "Confirm Upgrade"
- Payment processed immediately
- Credits updated to new tier
- Rate limits increased immediately
Prorated Charge Example
Current Tier: Developer ($49/month)
New Tier: Business ($499/month)
Days into billing cycle: 15 of 30
Days remaining: 15
Calculation:
- Credit for unused Developer time: $49 × (15/30) = $24.50
- Charge for remaining Business time: $499 × (15/30) = $249.50
- Net charge: $249.50 - $24.50 = $225.00
You pay: $225.00
Next billing: Full $499.00 in 15 days// Upgrade via API
const response = await fetch('https://nexus.fortiblox.com/api/billing/upgrade', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
new_tier: 'business'
})
});
const result = await response.json();
console.log(result);
/*
{
success: true,
message: 'Successfully upgraded to business tier',
subscription: {
id: 'sub_1QKmN4B5tZ...',
tier: 'business',
proration_amount: 22500, // cents
next_billing_amount: 49900, // cents
next_billing_date: '2025-12-06T00:00:00Z'
}
}
*/Downgrade Your Tier
Downgrade to a lower tier (takes effect at period end):
- Navigate to Billing → Pricing
- Click "Downgrade" on desired tier
- Review downgrade terms:
- Change takes effect at end of current billing period
- No refund for current period
- Continue using current tier until then
- Credits will decrease at period end
- Click "Confirm Downgrade"
- Confirmation message displayed
- Email confirmation sent
Important: Downgrade is scheduled but not immediate. You keep full access to your current tier until the billing period ends.
// Downgrade via API
const response = await fetch('https://nexus.fortiblox.com/api/billing/downgrade', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
new_tier: 'developer'
})
});
const result = await response.json();
console.log(result);
/*
{
success: true,
message: 'Downgrade scheduled for end of billing period',
subscription: {
id: 'sub_1QKmN4B5tZ...',
current_tier: 'business',
scheduled_tier: 'developer',
effective_date: '2025-12-21T00:00:00Z'
}
}
*/Cancel Subscription
You can cancel your subscription at any time:
See complete cancellation guide →
Invoice History
View Past Invoices
Access all your invoices:
- Navigate to Billing → Invoices
- See list of all past invoices
- Click invoice to view details
Each invoice shows:
- Invoice number
- Date
- Amount charged
- Payment method used
- Tax amount (if applicable)
- PDF download link
Via Stripe Customer Portal
- Access Customer Portal
- Navigate to "Invoice history" tab
- View all invoices
- Download PDF receipts
// Get invoice history via API
const response = await fetch('https://nexus.fortiblox.com/api/billing/invoices', {
headers: {
'Authorization': 'Bearer YOUR_API_KEY'
}
});
const invoices = await response.json();
console.log(invoices);
/*
{
invoices: [
{
id: 'in_1QKmN4B5tZ...',
number: 'FB-2025-001',
amount_paid: 4900, // cents
currency: 'usd',
status: 'paid',
created: 1732147200,
period_start: '2025-11-21T00:00:00Z',
period_end: '2025-12-21T00:00:00Z',
invoice_pdf: 'https://pay.stripe.com/invoice/.../pdf',
hosted_invoice_url: 'https://pay.stripe.com/invoice/...'
},
// ... more invoices
]
}
*/Download PDF Receipts
- Find invoice in Billing → Invoices
- Click "Download PDF" button
- PDF receipt opens in new tab
- Save or print as needed
PDF includes:
- Your business details
- FortiBlox business details
- Invoice date and number
- Subscription details
- Amount breakdown
- Payment method
- Tax information
Email Receipts
After each successful payment, you'll receive:
- Subject: "Receipt from FortiBlox [#FB-2025-001]"
- From: FortiBlox (via Stripe)
- Contents:
- Payment confirmation
- Amount charged
- PDF receipt attachment
- Link to view online
Payment Issues
Failed Payment Handling
If a payment fails:
- Immediate notification: Email sent immediately
- Automatic retry: Stripe retries payment in 3 days
- Second retry: 5 days after first retry
- Third retry: 7 days after second retry
- Final notification: If all retries fail
Total retry period: Up to 15 days
During retry period:
- ✅ Full access to your tier
- ✅ Credits available
- ⚠️ "Past Due" status shown
- 📧 Email reminders sent
If all retries fail:
- ❌ Subscription cancelled
- ❌ Downgrade to Free tier
- 📧 Final notice email sent
Common Failure Reasons
| Reason | Solution |
|---|---|
| Insufficient funds | Add funds to bank account, update payment method |
| Expired card | Update payment method with new expiration date |
| Card declined by bank | Contact your bank, try different card |
| Incorrect CVC | Update payment method with correct CVC |
| Address mismatch | Update billing address |
| 3D Secure failed | Complete 3D Secure authentication |
| Card not supported | Use Visa, Mastercard, Amex, or Discover |
How to Resolve Failed Payment
Option 1: Update Payment Method
- Navigate to Billing → Subscription
- Click "Update Payment Method"
- Enter new card details
- Payment will be retried immediately
Option 2: Retry Payment
- Navigate to Billing → Subscription
- If payment failed, you'll see "Retry Payment" button
- Click to process payment again with existing card
- May be prompted for 3D Secure
Option 3: Contact Support
If you continue having issues:
Email: [email protected]
Include:
- Your account email
- Last 4 digits of card
- Error message (if any)
- Screenshot of issue
Response time: Within 24 hours
Grace Period
During the retry period (up to 15 days):
✅ You can:
- Continue using your paid tier
- Access all credits
- Use all features
- Update payment method
- Upgrade tier (to retry with higher amount)
❌ You cannot:
- Downgrade tier (would prevent payment recovery)
- Cancel subscription (must resolve payment first)
Preventing Payment Failures
Set up backup payment method:
- Access Stripe Customer Portal
- Add second payment method
- Stripe will try backup if primary fails
Enable email notifications:
- Verify email address in your profile
- Check spam folder for Stripe emails
- Add [email protected] to contacts
Monitor card expiration:
- Set calendar reminder 1 month before expiration
- Update payment method proactively
- Check Billing dashboard for expiration warnings
Code Examples
Complete Subscription Flow
// Full example: Subscribe to a tier
import { loadStripe } from '@stripe/stripe-js';
// Initialize Stripe (use your Publishable Key)
const stripe = await loadStripe('pk_test_YOUR_PUBLISHABLE_KEY');
async function subscribeToDeveloperTier() {
try {
// Step 1: Create checkout session
const response = await fetch('https://nexus.fortiblox.com/api/billing/create-checkout', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
tier: 'developer',
success_url: 'https://yourapp.com/success',
cancel_url: 'https://yourapp.com/cancel'
})
});
if (!response.ok) {
throw new Error('Failed to create checkout session');
}
const session = await response.json();
// Step 2: Redirect to Stripe Checkout
const result = await stripe.redirectToCheckout({
sessionId: session.id
});
if (result.error) {
console.error(result.error.message);
alert('Payment failed: ' + result.error.message);
}
} catch (error) {
console.error('Subscription error:', error);
alert('Failed to start subscription process');
}
}
// Usage
document.getElementById('subscribe-btn').addEventListener('click', subscribeToDeveloperTier);Handle Successful Payment
// After redirect back from Stripe Checkout
// URL will contain: ?session_id=cs_test_xxx
async function handleSuccessfulPayment() {
const params = new URLSearchParams(window.location.search);
const sessionId = params.get('session_id');
if (sessionId) {
// Verify session with backend
const response = await fetch('https://nexus.fortiblox.com/api/billing/verify-session', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({ session_id: sessionId })
});
const result = await response.json();
if (result.success) {
// Show success message
showNotification('Subscription activated! Welcome to ' + result.tier + ' tier.');
// Redirect to dashboard
setTimeout(() => {
window.location.href = '/dashboard';
}, 2000);
}
}
}
// Run on page load
if (window.location.pathname === '/success') {
handleSuccessfulPayment();
}Check Subscription Status
// Check if user has active subscription
async function checkSubscriptionStatus() {
try {
const response = await fetch('https://nexus.fortiblox.com/api/subscription', {
headers: {
'Authorization': 'Bearer YOUR_API_KEY'
}
});
const subscription = await response.json();
// Check status
switch (subscription.status) {
case 'active':
console.log('Subscription active');
return true;
case 'past_due':
console.warn('Payment failed - please update payment method');
showPaymentWarning();
return true; // Still has access during grace period
case 'canceled':
console.log('Subscription cancelled');
return false;
case 'incomplete':
console.log('Payment pending - please complete payment');
showPaymentPrompt();
return false;
default:
console.log('No active subscription');
return false;
}
} catch (error) {
console.error('Failed to check subscription:', error);
return false;
}
}Update Payment Method
// Get Stripe Customer Portal URL to update payment
async function updatePaymentMethod() {
try {
const response = await fetch('https://nexus.fortiblox.com/api/billing/portal', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
return_url: window.location.href // Return to current page
})
});
const { url } = await response.json();
// Redirect to Stripe Customer Portal
window.location.href = url;
} catch (error) {
console.error('Failed to open billing portal:', error);
alert('Could not open payment settings');
}
}
// Usage
document.getElementById('update-payment-btn').addEventListener('click', updatePaymentMethod);Security & Privacy
PCI Compliance
FortiBlox Nexus is PCI-DSS compliant through Stripe:
- ✅ Your card details never touch our servers
- ✅ All data encrypted in transit (TLS 1.2+)
- ✅ Stripe stores card data securely
- ✅ We only store Stripe customer ID
- ✅ Regular security audits
Data We Store
FortiBlox stores:
- ✅ Stripe customer ID (
cus_xxx) - ✅ Stripe subscription ID (
sub_xxx) - ✅ Subscription tier
- ✅ Subscription status
- ✅ Billing cycle dates
We DO NOT store:
- ❌ Full card numbers
- ❌ CVC codes
- ❌ Card expiration dates
- ❌ Billing addresses (stored by Stripe only)
Fraud Protection
Stripe provides automatic fraud detection:
- Machine learning models analyze transactions
- 3D Secure authentication for high-risk payments
- Address verification (AVS)
- CVC verification
- Velocity checks (multiple failed attempts blocked)
Support
Need help with Stripe payments?
Documentation:
Contact:
- Email: [email protected]
- Live Chat: Available in Developer Portal
- Response Time: Within 24 hours
Stripe Support:
Last Updated: 2025-11-21