Game day energy! Big win today ๐๐ฅ
Training like a beast ๐ช #AthleteTok
Grateful for @adidas supporting my journey
When the play goes perfect ๐ค
Workout Wednesday with @gatorade ๐ง
Day in the life of a D1 athlete
Catch compilation ๐
Recovery essentials ft. @nike ๐
Help me reach my athletic goals
Your support helps me afford training, nutrition, equipment, and travel to competitions. Every contribution makes a difference in my athletic career!
Note: For custom amounts, please use the $5, $10, $25, or $50 quick tip buttons above, or contact me directly to set up a custom payment.
Secure payment processing powered by Stripe
Michael J.
Sent $25 โข 2 hours ago
Sarah K.
Sent $10 โข 5 hours ago
David T.
Sent $50 โข 1 day ago
47 supporters this month โข $1,247 raised
Available for events & collaborations
Available for speaking engagements, autograph sessions, brand activations, content creation, and more!
Events, autograph signings, meet & greets, brand activations
Zoom calls, webinars, virtual Q&As, online workshops
Social media posts, product reviews, brand partnerships
Click a booking option above to pay securely with Stripe
Typically responds within 24 hours
Professional brand resources
Download my complete media kit with stats, demographics, past partnerships, and high-resolution photos.
Real-time analytics showing engagement trends and audience growth
Game-winning touchdown celebration
Best catches of the season
Thank you @adidas for the support
Intense training session
Michigan, USA
Primary location
Ohio, USA
Big Ten region
Illinois, USA
Midwest fanbase
Pennsylvania, USA
East coast followers
Other Locations
International & other states
Host exclusive audio rooms, live video sessions, and interactive Q&As with your biggest supporters
Join me live right now! Answering questions about today's game and talking about the season.
Voice-only sessions with live chat and Q&A
HD video streaming with real-time interaction
Interactive fan questions and answers
Watch games together with live commentary
Join me for a live workout session where I'll share my training routine, nutrition tips, and answer your fitness questions in real-time.
Ask me anything about this season, my training, NIL deals, balancing school and athletics, or anything else on your mind!
Premium subscribers only! Join me as I break down game tape from this season's biggest plays. Learn how I read defenses and make split-second decisions.
Start an instant audio room or video session with your fans
Notify all 26.3K followers
Schedule in advance or go live instantly
Fans get notified when you go live
Interactive chat and Q&A features
Receive tips during live sessions
Recordings available for replay
Paid/exclusive sessions available
Get exclusive access to behind-the-scenes content, private sessions, early merch drops, and direct interaction
The ultimate fan experience. Limited to 50 members only. Get unprecedented access to my journey, exclusive 1-on-1 interactions, signed merchandise, and VIP game day experiences.
Exclusive Training Session
45 min video
Behind the Scenes
Photo gallery
1-on-1 Call Recording
Private video
Game Film Breakdown
30 min analysis
One-time purchases
Current member benefits
All income streams combined
Gold Membership
Sarah K. โข 2 hours ago
Virtual Appearance
Tech Corp โข 5 hours ago
Training eBook
Mike R. โข 1 day ago
Fan Tip
Anonymous โข 1 day ago
Ready to transfer to your bank
All revenue streams connected to your master Stripe account for seamless payments and instant payouts
Your Stripe account is fully verified and ready to accept payments. All revenue streams are automatically connected to your master account.
All payment methods below are routed through your master Stripe account. Funds are automatically consolidated and available for instant payout.
One-time payments
Recurring billing
Appearance fees
eBooks, courses
Paid sessions
During broadcasts
All payments are processed securely through Stripe and automatically deposited into your connected bank account.
Supporter sends tip, subscribes, or purchases through any revenue stream
Payment is securely processed through your master Stripe account
Funds automatically deposited to your bank account weekly
Instant Payouts
Get paid in minutes, not days (for verified accounts)
Automatic Consolidation
All revenue streams deposited to one account
Recurring Billing
Automatic monthly subscriptions with retry logic
Multiple Payment Methods
Credit cards, debit cards, Apple Pay, Google Pay
Refund Management
Easy refunds directly from your dashboard
Tax Reporting
Automatic 1099-K forms and detailed reports
PCI DSS Level 1
Highest level of payment security certification
256-bit SSL Encryption
All payment data encrypted in transit and at rest
Fraud Protection
Advanced machine learning detects suspicious activity
No Card Data Storage
Card details never touch your servers
3D Secure Support
Extra authentication layer for card payments
Dispute Management
Automated chargeback protection and evidence submission
View detailed analytics, manage payouts, and configure settings
Everything you need to implement Stripe payments on your backend and start accepting payments
Add keys to your backend .env file (never frontend!)
Copy backend code examples below to your server
const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);
// Create Tip Checkout Session
app.post('/api/stripe/create-tip-session', async (req, res) => {
const { amount, message, athleteId } = req.body;
const session = await stripe.checkout.sessions.create({
payment_method_types: ['card'],
line_items: [{
price_data: {
currency: 'usd',
product_data: {
name: 'Athlete Tip',
description: message,
},
unit_amount: amount, // cents
},
quantity: 1,
}],
mode: 'payment',
success_url: `${YOUR_DOMAIN}/athlete-profile?session_id={CHECKOUT_SESSION_ID}`,
cancel_url: `${YOUR_DOMAIN}/athlete-profile`,
metadata: { type: 'tip', athleteId, message },
});
res.json({ id: session.id });
});
import stripe
stripe.api_key = os.environ.get('STRIPE_SECRET_KEY')
@app.route('/api/stripe/create-tip-session', methods=['POST'])
def create_tip_session():
data = request.json
session = stripe.checkout.Session.create(
payment_method_types=['card'],
line_items=[{
'price_data': {
'currency': 'usd',
'product_data': {
'name': 'Athlete Tip',
'description': data['message'],
},
'unit_amount': data['amount'],
},
'quantity': 1,
}],
mode='payment',
success_url=f"{YOUR_DOMAIN}/athlete-profile?session_id={{CHECKOUT_SESSION_ID}}",
cancel_url=f"{YOUR_DOMAIN}/athlete-profile",
metadata={'type': 'tip', 'athleteId': data['athleteId']},
)
return jsonify({'id': session.id})
/api/stripe/create-tip-session
Tips & Donations
/api/stripe/create-subscription-session
Memberships
/api/stripe/create-booking-session
Bookings
/api/stripe/create-product-session
Digital Products
/api/stripe/create-session-ticket
Live Sessions
/api/stripe/create-connect-account
Athlete Payouts
/api/stripe/create-payout
Process Payouts
/webhook/stripe
Webhooks (Critical!)
4242 4242 4242 4242
Any future date โข Any CVC
4000 0000 0000 0002
Test decline scenarios
4000 0025 0000 3155
Tests authentication
4000 0076 0000 0016
Test international cards
Full payment integration is live on the frontend. Just add backend endpoints to start accepting payments!
100% Ready โ
Add 8 endpoints ๐ง
Copy from Stripe Dashboard โ API Keys
pk_test_...
Add key to stripe-integration.js line 11
STRIPE_PUBLISHABLE_KEY
Add 8 endpoints using code above
Ready to accept payments!
The frontend is 100% complete and tested. Once you add the 8 backend endpoints (copy/paste from examples above), you can immediately start accepting payments from athletes and fans. All revenue streams will be consolidated into athlete Stripe Connect accounts for easy payouts.
Your frontend payment system is fully configured and ready to accept payments
โ Safe to use in browser JavaScript
โ ๏ธ NEVER expose this in frontend code! Use only in backend server.
Payment library automatically loads on page
Publishable key verified and active
All buttons configured with data attributes
JavaScript functions ready to process payments
Beautiful loading overlays during checkout
Graceful error messages for failed payments
Your frontend is ready. Now add backend endpoints to process payments.
POST /api/stripe/create-tip-session
POST /api/stripe/create-subscription-session
POST /api/stripe/create-booking-session
POST /api/stripe/create-product-session
POST /api/stripe/create-session-ticket
POST /api/stripe/create-connect-account
POST /api/stripe/create-payout
POST /api/stripe/verify-payment
POST /webhook/stripe
Free hosting on Vercel or Netlify - takes 10 minutes to deploy
โก Recommended - Fastest
Alternative Option
Create a new folder, add these files, then deploy to Vercel or Netlify
gameplan-nil-backend/
โโโ api/
โ โโโ stripe/
โ โโโ create-tip-session.js
โ โโโ create-subscription-session.js
โ โโโ create-booking-session.js
โ โโโ create-product-session.js
โ โโโ create-session-ticket.js
โ โโโ create-connect-account.js
โ โโโ create-payout.js
โ โโโ verify-payment.js
โ โโโ webhook.js
โโโ package.json
โโโ vercel.json
โโโ .env
{
"name": "gameplan-nil-backend",
"version": "1.0.0",
"description": "Backend API for GamePlan NIL payments",
"main": "index.js",
"scripts": {
"dev": "vercel dev",
"deploy": "vercel --prod"
},
"dependencies": {
"stripe": "^14.0.0"
},
"engines": {
"node": ">=18.0.0"
}
}
# Stripe Keys
STRIPE_SECRET_KEY=sk_test_51SK0hxQmUj3bn69MVchgYBzuZgsHLRSID0GA9QUMACGnUCucnwmrllRv2k4qXqeOj17IIK8IEIq5avEdOsUKAF4r00CC3JxCdY
STRIPE_WEBHOOK_SECRET=whsec_YOUR_WEBHOOK_SECRET_HERE
# Your Domain
FRONTEND_URL=https://gameplan-nil.com
โ ๏ธ Never commit .env to Git! Add to .gitignore
const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);
module.exports = async (req, res) => {
// Enable CORS
res.setHeader('Access-Control-Allow-Origin', process.env.FRONTEND_URL);
res.setHeader('Access-Control-Allow-Methods', 'POST');
res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
if (req.method === 'OPTIONS') {
return res.status(200).end();
}
if (req.method !== 'POST') {
return res.status(405).json({ error: 'Method not allowed' });
}
try {
const { amount, message, athleteId } = req.body;
// Create Checkout Session
const session = await stripe.checkout.sessions.create({
payment_method_types: ['card'],
line_items: [
{
price_data: {
currency: 'usd',
product_data: {
name: 'Athlete Tip',
description: message || 'Support for athlete',
},
unit_amount: amount, // amount in cents
},
quantity: 1,
},
],
mode: 'payment',
success_url: `${process.env.FRONTEND_URL}/athlete-profile?session_id={CHECKOUT_SESSION_ID}`,
cancel_url: `${process.env.FRONTEND_URL}/athlete-profile`,
metadata: {
type: 'tip',
athleteId: athleteId,
message: message,
},
});
res.status(200).json({ id: session.id });
} catch (error) {
console.error('Error creating tip session:', error);
res.status(500).json({ error: error.message });
}
};
const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);
module.exports = async (req, res) => {
res.setHeader('Access-Control-Allow-Origin', process.env.FRONTEND_URL);
res.setHeader('Access-Control-Allow-Methods', 'POST');
res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
if (req.method === 'OPTIONS') return res.status(200).end();
if (req.method !== 'POST') return res.status(405).json({ error: 'Method not allowed' });
try {
const { tier, priceId, athleteId } = req.body;
// Map tier to price
const prices = {
bronze: 499, // $4.99
gold: 999, // $9.99
platinum: 4999, // $49.99
};
const session = await stripe.checkout.sessions.create({
payment_method_types: ['card'],
line_items: [
{
price_data: {
currency: 'usd',
product_data: {
name: `${tier.charAt(0).toUpperCase() + tier.slice(1)} Membership`,
description: `Monthly subscription to athlete's exclusive content`,
},
unit_amount: prices[tier] || prices.bronze,
recurring: {
interval: 'month',
},
},
quantity: 1,
},
],
mode: 'subscription',
success_url: `${process.env.FRONTEND_URL}/athlete-profile?session_id={CHECKOUT_SESSION_ID}`,
cancel_url: `${process.env.FRONTEND_URL}/athlete-profile`,
metadata: {
type: 'subscription',
tier: tier,
athleteId: athleteId,
},
});
res.status(200).json({ id: session.id });
} catch (error) {
console.error('Error creating subscription:', error);
res.status(500).json({ error: error.message });
}
};
const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);
module.exports = async (req, res) => {
if (req.method !== 'POST') {
return res.status(405).json({ error: 'Method not allowed' });
}
const sig = req.headers['stripe-signature'];
let event;
try {
// Verify webhook signature
event = stripe.webhooks.constructEvent(
req.body,
sig,
process.env.STRIPE_WEBHOOK_SECRET
);
} catch (err) {
console.error('Webhook signature verification failed:', err.message);
return res.status(400).send(`Webhook Error: ${err.message}`);
}
// Handle the event
switch (event.type) {
case 'checkout.session.completed':
const session = event.data.object;
console.log('Payment successful:', session);
// TODO: Save to database, send confirmation email, etc.
// Update athlete revenue, member access, etc.
break;
case 'invoice.payment_succeeded':
const invoice = event.data.object;
console.log('Subscription payment succeeded:', invoice);
// TODO: Extend member access for another month
break;
case 'customer.subscription.deleted':
const subscription = event.data.object;
console.log('Subscription cancelled:', subscription);
// TODO: Revoke member access
break;
default:
console.log(`Unhandled event type: ${event.type}`);
}
res.status(200).json({ received: true });
};
Create a new repo and push the backend code above
git init
git add .
git commit -m "Initial backend"
git push origin main
Import your GitHub repo to Vercel
In Vercel dashboard โ Settings โ Environment Variables
Your API will be live at:
https://your-project.vercel.app/api/stripe/create-tip-session
Complete testing checklist to verify everything works before going live
4242 4242 4242 4242
12/34
123
12345
4000 0000 0000 0002
Tests error handling for declined cards
4000 0025 0000 3155
Tests 3D Secure authentication flow
4000 0000 0000 9995
Tests insufficient funds error