Stripe is how you get paid. It handles your customers’ card details, charges them for minutes and phone numbers, and sends the money to your bank account.This is the last provider, and the longest chapter. It’s also the one where the decisions matter most, because they’re about real money: what you charge, what margin you keep, and what happens when a payment fails.
Have your government ID and your bank account details ready. Stripe verifies your identity and needs somewhere to send your earnings.
Enter your professional Hostinger email, your full name and a password, select your country, then click Create account.
2
Skip the onboarding questions
Stripe asks for a business name and location. Enter your domain or company name, pick your location, and click Continue.
A series of optional questions follows about what you’re building. Click Skip at the bottom right of each one until Stripe asks how you want to set up.
On Choose how to set up Stripe, select Set up in the Dashboard and click Continue.
The dashboard option, not the AI tool one.
3
Ask for your live account
Stripe starts you in a sandbox, which is a practice environment that can’t take real money. You need a live account, so click Get your live account now in the bottom right, not the more prominent Go to sandbox button beside it.
The sandbox can't accept real payments, so you go straight to a live account.
4
Verify your email
Stripe shows a Verify your email page and waits there. There’s nothing to click on it unless the email doesn’t arrive, in which case it offers a Resend email button.
Go to mail.hostinger.com, open the email from Stripe and click Verify email.
That takes you straight to an Email verified dialog. Click Activate products, not Close, since activating is what unlocks real payments.
Stripe now needs to know who you are before it will let you take money. This is a form with several sections, and Stripe shows your progress down the left as you go.It’s much faster if you have these ready before you start: your government ID, your home address, your phone number, your domain name, and the bank account you want to be paid into.
1
Business location and type
Choose your country, then your business type.The options depend on your country, because every country has its own legal categories. The United States offers Unregistered business, Registered business, Nonprofit and Government entity, while Canada shows Individual or sole proprietorship, and other countries have their own equivalents.Pick the one that’s actually true for you. If you’re starting out alone without a registered company, that’s the individual or unregistered option, which is the same thing under two names. The United States also asks whether you have an Employer Identification Number, and a one-person business with no employees usually answers no.
Answer honestly here. This is a legal declaration tied to your identity and your payouts, and getting it wrong causes problems when Stripe reviews your account.
Click Continue.
2
Personal details
Enter your legal name exactly as it appears on your government ID, your date of birth, home address and phone number. Your email should already be filled in.Click Continue.
3
Business website
Enter your own domain, the one your app is deployed on.Stripe reviews this address to check that what you’re charging for matches what you claim to sell, so it needs to be your real, live app.Click Continue.
4
Products and services
Select Software as the category, then describe plainly what your platform does and what customers pay for. Something like:
We provide a software platform that lets businesses create and manage AI voice agents that answer their phone calls. Customers purchase prepaid call minutes and monthly phone number subscriptions through the platform.
Be accurate rather than vague. Stripe compares this description against the charges that later appear on your account, and a mismatch is what triggers manual reviews and held payouts.Click Continue.
5
Customer support details
Stripe asks for a support phone number, which is required.Below it is a checkbox to show your phone number on receipts and invoices, and you can leave that unchecked. Stripe keeps your number on file either way, which is what they need for disputes. The checkbox only decides whether it’s printed on every receipt your customers receive, and if that’s your personal phone, keeping it off is sensible. Your app already gives customers a contact form that reaches your support email.Click Continue.
6
Statement descriptor
This is the text your customers see on their bank statement when you charge them. Use your own brand name, between 5 and 22 characters, and specifically the same one you entered as the Sender name in Supabase and will set on your platform’s Branding page.This matters more than it looks. Your customer signed up on your branded platform and gets emails from your brand, so if their statement shows something different, they won’t recognise the charge. People who don’t recognise a charge call their bank, and every dispute costs you a fee on top of the refunded sale, even though the payment was perfectly legitimate.The Shortened descriptor field below is optional, so you can leave it empty.Click Continue.
Use your brand name, not a generic word like Software or Payments.
7
Bank account
Stripe shows the main banks in your country as logos. If yours is there, select it and log in to connect it directly.If you don’t see it, or you’d rather not log into your bank through Stripe, use the Enter bank details manually instead link below the logos. Both routes end up in the same place.
Connecting your bank doesn’t move you to a new page. The same page grows instead, listing your linked account and adding a Select your payout schedule section underneath it, so there’s no button to click until you’ve made that choice.For the schedule, select Manual.This means your earnings stay in your Stripe balance until you decide to send them to your bank, which you can do at any time. We prefer it for two reasons: you stay in control of when you get paid, and keeping a balance in Stripe means that when your app issues a refund, it comes out of that balance rather than Stripe pulling money back from your bank.The one thing to remember is that manual means manual: your money waits until you go and pay yourself. You can switch to automatic later in your settings.Click Continue.
Manual keeps your earnings in Stripe until you choose to withdraw them.
Unlike the optional two-factor prompt on Vercel, this one is mandatory. Stripe requires it on every account, which makes sense given this is the account holding your money.
1
Choose authenticator app
You’re offered a security key or an authenticator app. Unless you own a physical security key, click Add authenticator app.
2
Scan the code
An Add authenticator app dialog shows a QR code. Scan it with an authenticator app on your phone, such as Google Authenticator, Microsoft Authenticator or Authy. If you already use one for other accounts, use that. If you can’t scan, use the Enter code manually link underneath instead.Once your app has added the account, click Continue.
Your authenticator app now generates a 6-digit code. Type it into the field and click Confirm.
3
Save your backup code
Stripe shows a backup code that lets you back in if you lose your phone.
Without this code, losing access to your authenticator app means losing access to the account your customers pay into.
Click Download, keep the file somewhere safe, then click I have saved my backup code.
An Authenticator app added dialog confirms it worked. Click Done.
The security section now shows two-step authentication as complete. Click Continue to move on.
Stripe offers three optional additions. On the tax and climate screens especially, the option that costs you something is the large coloured button while the free choice sits quietly underneath, so read these rather than clicking through them.
1
Fraud protection
Stripe pre-selects Standard, which charges a few cents on every transaction. You want Lite, which is included at no cost.You have no customers yet, so paying per transaction to prevent fraud that doesn’t exist is premature, and your charges are small enough that a few cents each is a real share of every sale. Your app also guards these endpoints already, since buying requires a confirmed account and purchases are rate limited.That said, telephony does attract fraud, with stolen cards used to buy numbers for scams. If you ever start seeing disputes or suspicious signups, switch to Standard in your Stripe settings.Select Lite, then click Continue with Lite.
Standard is pre-selected. Lite is the one to choose.
2
Tax calculation
Your platform doesn’t calculate tax at checkout, so turning this on wouldn’t change anything for your customers.That doesn’t mean tax isn’t your problem. Once you’re making real money you will have to collect and remit it. In Canada the federal threshold is thirty thousand dollars of revenue, with Quebec running its own separate registration on top. In the United States it works per state, with different thresholds and different rules about whether software subscriptions are taxable at all, based on where your customers are rather than where you are.
Sort this out with an accountant once you have real revenue. This is a setup guide, not tax advice.
Click Skip for now, the quieter option underneath the main button.
3
Climate contribution
Nothing against it, but it’s a direct deduction from your margin on a business without a single customer yet, and you can turn it on later from your dashboard once you know your numbers. It’s also worth knowing that your profit dashboard doesn’t track this contribution, so enabling it would make the profit it shows slightly higher than what you really made.Click No thanks, underneath the coloured button.
4
Review and submit
You’ll land on a summary of everything you entered. This is a good place to check your work: two-step authentication should say On, the fraud protection plan should say On with Radar Lite, and tax calculation and climate commitment should both say Off. Each block has an Edit button if something is wrong.When it all looks right, click Agree and submit.
Check the four settings on the right before submitting.
A dialog confirms you’re now in your live account. Click Continue.
Live account means real payments. You can still switch back to a sandbox later to test things.
Stripe may then offer to create a public profile for your business. Close it with the X in its corner, which drops you on your Stripe home page. It’s optional, nothing in your platform uses it, and it would publish your business address publicly, which at this stage is usually your home address.
Your account exists, but Stripe usually still wants a photo ID before it will let money move. It doesn’t put this in front of you, so you have to go and look for it.
1
Open your account status
Click the gear icon at the top right to open Settings.
In the Account settings section, click Business.
Open the Account status tab.
2
Start the verification
You’ll usually find a task asking you to verify your identity with a photo ID. Read what it says: payments and payouts get paused if you ignore it, and it comes with a deadline.Click Start.
Check this page from time to time even after today. It’s where Stripe tells you about anything that would stop your customers from paying you, and the notification emails are easy to miss.
Payments and payouts get paused if this task is left unresolved.
A Review and confirm page appears with your details, and the Management and ownership section marked Incomplete. Click Edit next to it.
3
Choose the verification method
Two methods are offered. Select Liveness verification (recommended), which takes a photo of your ID and a selfie and verifies immediately. The alternative needs two separate documents and takes one to two days.Then click Scan photo ID.
Liveness verification is immediate. The other option takes days.
Stripe explains that verification is handled by its partner. Click Agree and continue.
4
Verify on your phone
A Continue on your mobile device screen appears with a QR code. Scan it with your phone’s camera, and if scanning isn’t possible there’s an Other options link underneath for alternative ways to continue.Then follow the instructions on your phone to photograph your ID and take a selfie.
Have your phone and your ID ready before you start.
Once you scan the code, your computer switches to a waiting screen reading Complete verification on your mobile device to continue. Leave it alone and carry on with your phone.
This is just a waiting screen. Everything happens on your phone from here.
When you finish on your phone, your computer moves on by itself to the Review and confirm page. The Incomplete label on the management and ownership section is now gone, and ID document has been added to the list of information provided, which is what marks that section as done.Click Confirm.
ID document now appears in the list, and the Incomplete label is gone.
5
Check there's nothing left
Return to the Account status tab and make sure it says there are no active tasks for your account.Then click Product catalog in the sidebar, where the next section starts.
No active tasks means nothing is blocking your payments.
Your customers buy two things: packs of call minutes, and phone numbers. You’ll create both here, and the settings differ in ways that matter.
1
Create the minutes pack
Click Add a product.
Fill in the form:
Name: 100 Minutes
Description: 100 minutes of AI phone agent call time. Minutes are added to your account immediately after purchase and never expire.
Skip the image
Then two things in the pricing section that are easy to get wrong:Select One-off, not Recurring. Minutes are bought as a one-time purchase, and your app refuses the checkout if this price is recurring.Set the currency to USD even if you’re not American. Your platform records all its revenue in US dollars, and your profit dashboard shows wrong numbers if you charge in anything else.For the amount, enter 25.00, then click Add product.
One-off and USD are the two settings to get right here.
2
Understand that price
You’ll want to adjust this eventually, so it’s worth knowing what you’re working with.Every minute your customers talk costs you money: roughly nine and a half cents to Retell, plus about a cent to Twilio for the call itself. A hundred minute pack therefore costs you around eleven dollars before Stripe takes its cut. That’s your floor, and the arithmetic is simple: your pack size multiplied by what Retell charges per minute is the number you can never go below. Selling a hundred minutes for ten dollars doesn’t make you cheap, it makes you lose a dollar on every sale, and ten dollars whenever someone buys ten packs at once.At twenty five dollars you keep about thirteen dollars per pack after every cost, which is a margin that survives a customer emailing you with a problem. It’s also genuinely cheap for the buyer: a business assembling this themselves pays between twenty five and thirty three cents a minute for the same pieces, and agencies selling it as a service charge far more. Think about what your customer compares it to as well, which isn’t another software subscription, it’s a receptionist. A hundred minutes answers roughly thirty to sixty calls, and one booking they’d otherwise have missed pays for the whole pack several times over.Twenty five dollars is deliberately on the affordable side of that market, for the same reason the phone number is: while you have no customers and no reputation, a price nobody hesitates over is what gets you your first ones, and those first customers are what prove this works for you. Once you have a handful of them, some results to point at and a bit of a name, raising your price is a normal thing to do and much easier than starting high and waiting for someone to take a chance on you.Price higher or lower if your market calls for it. Twenty dollars is aggressive and still profitable, thirty works if you sell on service rather than price. Just don’t undercut yourself below the floor, and remember that raising prices on existing customers is harder than raising them for new ones, so it’s worth revisiting whenever your customer base grows.
3
Get its price ID
Click your 100 Minutes product to open it.
In the Pricing section, click the three dots at the end of the price row and choose Copy price ID.
The panel on the right also shows a Product ID starting with prod_, and that is not the one you want. The price ID starts with price_ and only appears in that three dots menu. Copying the wrong one gives you a checkout that fails.
Use the three dots on the price row, not the Product ID on the right.
In Vercel, open your project’s Environment Variables, find STRIPE_PRICE_ID, click the three dots, click Edit, paste it and click Save.While you’re there, find NEXT_PUBLIC_MINUTES_PER_UNIT. This is how many minutes your app actually credits after a purchase, so it has to match the pack you just created. The file you imported already set it to 100, so if you kept our pack size there’s nothing to change. If you chose a different size, edit it to your number, because if your product says 200 minutes and this says 100, your customers pay for 200 and receive 100.
4
Create the phone number product
Back in Product catalog, click Add a product again.
Fill it in:
Name: Phone Number
Description: A dedicated phone number for your AI agent, billed monthly. Cancel anytime from your billing portal.
This time the pricing is the opposite of the last one: choose Recurring, set the amount to 5.00, keep the currency on USD, and leave the billing period on Monthly. The preview on the right should confirm five dollars per month.Click Add product.
Recurring and Monthly this time, unlike the minutes pack.
5
Get its price ID too
Back in Product catalog, click your Phone Number product to open it.
Use the three dots on its price row and choose Copy price ID.
In Vercel, paste it into STRIPE_PHONE_NUMBER_PRICE_ID and save.Then find NEXT_PUBLIC_PHONE_NUMBER_PRICE. This is the price your app displays before checkout, and it has to match what Stripe actually charges. The file you imported already set it to 5.00, so if you kept our price there’s nothing to change. If you chose a different amount, edit it to match, because Stripe is what bills your customer and a mismatch means they see one price and get charged another.A word on this price too. A phone number costs you about a dollar fifteen a month from Twilio, so at five dollars you keep roughly three dollars forty after Stripe’s cut. That sounds small, but this is the only part of your business that bills automatically every month whether or not your customers make a single call, and it’s what turns this into predictable revenue instead of waiting for people to buy minutes.Five dollars is also extremely competitive. An ordinary business phone line costs between ten and thirty dollars a month, so most companies charging for something like this charge considerably more. That’s exactly why it works while you’re starting out: a price nobody hesitates over gets you your first customers quickly, and those first customers are what tell you whether this business works for you. You can raise prices later once you have proof and confidence, which is far easier than starting high and wondering why nobody’s signing up.Be careful going lower though, because Stripe takes thirty cents flat on every transaction no matter its size. That flat fee eats a much bigger share of a small charge, so dropping the price by a dollar or two costs you far more of your margin than it looks.
This is the most important part of the Stripe setup. Right now, if a customer paid you, Stripe would take their money and your app would never know: no minutes added, no phone number provisioned, nothing. The webhook is what tells your app a payment happened so it can deliver what was bought.
1
Open webhooks
Click Developers at the very bottom of the sidebar, then Webhooks in the menu that opens.
Click Add destination.
2
Select the four events
Leave the scope on Your account, the payload style on Snapshot, and the API version on whatever Stripe pre-selected.Then search for and check exactly these four events:
Event
What it handles
checkout.session.completed
Both purchases, minutes and phone numbers
invoice.payment_succeeded
A monthly phone number renewal going through
invoice.payment_failed
A renewal failing because a card was declined
customer.subscription.deleted
A subscription ending, so your app releases the number
These are the four your app knows how to handle. Selecting fewer breaks one of those flows; selecting more just sends events your app ignores.Click Continue.
Four events, no more and no fewer.
3
Choose the destination type
Select Webhook endpoint and click Continue.
4
Point it at your app
Give the destination a name you’ll recognise, such as yourdomain-webhook.For the endpoint URL, enter your domain followed by /api/webhooks/stripe:
https://www.yourdomain.com/api/webhooks/stripe
Use the www version, not the bare domain. Your bare domain redirects to www, and webhook deliveries don’t reliably follow redirects, which would mean payments that go through but never deliver anything.
The description is optional. Click Create destination.
5
Copy the signing secret
On your new destination’s page, the right side shows a Signing secret, hidden by default. This is what lets your app confirm a webhook really came from Stripe rather than from someone pretending to be Stripe.Click the reveal icon, copy it, then in Vercel find STRIPE_WEBHOOK_SECRET, paste it and save.Once saved, close this page with the X in its top right corner.
Reveal the secret, copy it into Vercel, then close the page with the X.
The billing portal is the Stripe-hosted page your app sends customers to when they manage their subscription: updating their card, seeing invoices, or cancelling a phone number.Every default on this page is already right for your app, but Stripe won’t open a portal whose settings have never been saved, so this section exists for one click.
1
Open the portal settings
Click the gear icon at the top right to open Settings.
In the Product settings section, click Billing.
Then click Customer portal.
2
Save it
Expand the Cancellations section and confirm that cancellations happen at the end of the billing period rather than immediately, which is the default.That’s what you want: your customer paid for the full month, so they keep their number until the month ends, and at that moment Stripe notifies your app, which releases the number automatically. Cancelling immediately would take away something they already paid for, which is how you get disputes.Leave everything else alone, including the Business information fields, since your app already tells Stripe where to send customers back to.Then click Save changes, even though you changed nothing.
That first save is what activates the portal on your live account. Skip it and the billing button in your app fails for every customer.
Once it’s saved, click Settings in the breadcrumb at the top to leave this page. Nothing depends on going there, it’s simply the easiest way back out to a general page before the last section.
Click Developers at the bottom of the sidebar, the same button you used for the webhooks, then click API keys.
You’ll land on the API keys tab, with a Standard keys section showing a Publishable key and a Secret key. You only need the secret one, since your app talks to Stripe from its server rather than from the browser.On the Secret key row, click Reveal live key.
2
Verify it's you
A Reveal live key dialog warns that this key can only be revealed once. Click Reveal.
Stripe shows this key one time only, which is why it asks twice.
Because this key can move real money, Stripe then verifies your identity, so don’t be surprised by what follows. A Verification required popup says it will send a link to your email, and asks you to open that link in another tab of the same browser. Keep this Stripe tab open and click Send verification.
The popup then asks you to check your email. Leave it open.
Go to mail.hostinger.com in a new tab, open the email from Stripe and click its verification button.
You’ll get a page confirming it worked, and there’s nothing to do on it. Switch back to your Stripe tab, which now asks for the 6-digit code from your authenticator app. Enter it.
3
Copy the key
Your key appears, starting with sk_live_.
Read the warning above it: you won’t be able to see this key again. Copy it now, and if you lose it before pasting you’ll have to rotate the key and repeat this step.
Treat this key like the password to your money: it can create charges and refunds on your account, so it lives in Vercel and nowhere else.Copy it, then in Vercel find STRIPE_SECRET_KEY, click the three dots, click Edit, paste it and click Save. Back in Stripe, click Done.
Every one of your 22 settings now holds a real value. But Vercel doesn’t apply changes to your live site automatically, it needs a fresh deployment to pick them up.
1
Redeploy
After saving the Stripe secret key, a message appeared at the bottom right of your Environment Variables page saying a new deployment is needed. Click its Redeploy button.If you dismissed that message or came back later, do the same from the Deployments tab in the sidebar: find the most recent deployment at the top, click the three dots at the end of its row and click Redeploy.
A popup asks you to confirm, already set to Production with your latest deployment selected. Leave everything as it is and click Redeploy.
2
Watch it build
A message confirms the deployment was created. Click View Deployment to watch it, which usually takes a minute or two.
When the Status line says Ready, your app is live with every real credential from every provider you configured. Click your domain in the Domains list on that page to open it.
Ready means your platform is running on real credentials.
Your platform is live. Every provider is connected: the code is deployed at your own domain over HTTPS, emails send from your brand, the database is running, agents can talk, calls come in through your own phone numbers, and customers can pay you.Go to your domain, sign up, confirm your email, and you should land on a working dashboard.
Sign up with the same email you set as NEXT_PUBLIC_SUPPORT_EMAIL. That’s what your app uses to recognise you as the admin, and it’s what unlocks the Profit Dashboard and the Branding page where you make the platform your own.