Accept Stripe payments without a website using Payment Links (shareable URL), Stripe Invoicing (email invoices), or the Virtual Terminal (manual card entry in Dashboard). Payment Links require zero code — create one in the Dashboard, copy the URL, and share it via email, social media, or messaging. Invoices work for B2B billing. The virtual terminal handles phone orders.
Accepting Payments Without a Website
Not every business needs a website to accept payments. Freelancers, consultants, pop-up shops, and service providers can use Stripe's no-code tools to collect payments immediately. Payment Links create a shareable URL that takes customers to a Stripe-hosted checkout page. Invoicing lets you send professional invoices via email. The virtual terminal (manual card entry) lets you charge cards from phone orders. All three methods work from the Stripe Dashboard with zero code.
Prerequisites
- A Stripe account (free to create at dashboard.stripe.com)
- Your Stripe account activated for live payments (identity verification complete)
- A product or service to sell
Step-by-step guide
Create a Payment Link
Create a Payment Link
Go to Dashboard → Payment Links → + Create payment link. Add your product name, price, and optional image. Set whether it is a one-time or recurring payment. Click 'Create link'. Copy the URL and share it anywhere — email, text, social media, QR code.
Expected result: A URL like https://buy.stripe.com/abc123 is generated. Anyone with the link can make a payment.
Create a Payment Link via the API (optional)
Create a Payment Link via the API (optional)
If you want to generate Payment Links programmatically (e.g., per-customer or per-order), use the API.
1const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);23const paymentLink = await stripe.paymentLinks.create({4 line_items: [{5 price_data: {6 currency: 'usd',7 product_data: {8 name: 'Consulting Session - 1 Hour',9 },10 unit_amount: 15000, // $150.0011 },12 quantity: 1,13 }],14});1516console.log('Payment Link:', paymentLink.url);Expected result: A Payment Link URL is returned that you can share with customers.
Send an invoice via email
Send an invoice via email
Go to Dashboard → Invoices → + Create invoice. Add the customer's email, line items with descriptions and amounts, and optional due date. Click 'Send invoice'. Stripe sends a professional email with a 'Pay this invoice' button that leads to a Stripe-hosted payment page.
Expected result: The customer receives an email with a link to pay. The invoice status updates as they pay.
Use the virtual terminal for manual card entry
Use the virtual terminal for manual card entry
Go to Dashboard → Payments → + Create payment. Enter the customer's card number, expiration, CVC, and amount. This is useful for phone orders or in-person payments when you do not have a card reader. Note: manually entered transactions have higher fraud risk and may have different fee structures.
Expected result: The payment is processed immediately and appears in your Payments list.
Test with a test card
Test with a test card
In test mode, use card 4242424242424242 with any future expiry and any CVC to test all three methods without processing real charges.
Expected result: Test payments appear in your test mode Dashboard. No real money is charged.
Complete working example
1const express = require('express');2const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);34const app = express();5app.use(express.json());67// Create a Payment Link8app.post('/api/payment-links', async (req, res) => {9 try {10 const { productName, amount, recurring } = req.body;1112 const priceData = {13 currency: 'usd',14 product_data: { name: productName },15 unit_amount: amount, // in cents16 };1718 if (recurring) {19 priceData.recurring = { interval: 'month' };20 }2122 const paymentLink = await stripe.paymentLinks.create({23 line_items: [{ price_data: priceData, quantity: 1 }],24 });2526 res.json({ url: paymentLink.url, id: paymentLink.id });27 } catch (err) {28 res.status(500).json({ error: err.message });29 }30});3132// Create and send an invoice33app.post('/api/invoices', async (req, res) => {34 try {35 const { customerEmail, items, daysUntilDue } = req.body;3637 // Find or create customer38 let customers = await stripe.customers.list({ email: customerEmail, limit: 1 });39 let customer = customers.data[0];40 if (!customer) {41 customer = await stripe.customers.create({ email: customerEmail });42 }4344 // Create invoice45 const invoice = await stripe.invoices.create({46 customer: customer.id,47 collection_method: 'send_invoice',48 days_until_due: daysUntilDue || 30,49 });5051 // Add line items52 for (const item of items) {53 await stripe.invoiceItems.create({54 customer: customer.id,55 invoice: invoice.id,56 description: item.description,57 amount: item.amount, // in cents58 currency: 'usd',59 });60 }6162 // Finalize and send63 await stripe.invoices.finalizeInvoice(invoice.id);64 await stripe.invoices.sendInvoice(invoice.id);6566 res.json({ id: invoice.id, status: 'sent' });67 } catch (err) {68 res.status(500).json({ error: err.message });69 }70});7172const PORT = process.env.PORT || 3000;73app.listen(PORT, () => console.log(`Server on port ${PORT}`));Common mistakes when integrating Stripe without a website
Why it's a problem: Using the virtual terminal as a primary payment method for e-commerce
How to avoid: The virtual terminal is for occasional manual entries. For regular online sales, use Payment Links or a proper checkout integration. Manually entered cards have higher fraud risk.
Why it's a problem: Not completing Stripe account verification before trying to accept live payments
How to avoid: You must verify your identity and business information before live mode works. Complete all onboarding steps in Dashboard → Settings → Account.
Why it's a problem: Sharing test mode Payment Links to real customers
How to avoid: Test mode links only work with test cards. Toggle to live mode in the Dashboard before creating Payment Links for real customers.
Best practices
- Use Payment Links for one-off sales, events, and social media selling — they require zero code
- Use Invoicing for B2B services, consulting, and contracts where you need due dates and reminders
- Use the virtual terminal only for phone orders or exceptional cases — not as a primary checkout method
- Add product images and descriptions to Payment Links for a professional checkout experience
- Enable automatic receipt emails in Settings → Emails so customers get payment confirmation
- Test all payment methods in test mode with card 4242424242424242 before going live
- Track all payments in Dashboard → Payments regardless of which method was used
Still stuck?
Copy one of these prompts to get a personalized, step-by-step explanation.
Write a Node.js script that creates a Stripe Payment Link for a product with a given name and price. Also write a function that creates and sends a Stripe Invoice to a customer email with line item descriptions and amounts. Use the stripe npm package.
Create a no-code payment collection system for my business. Set up Stripe Payment Links that I can share via email and social media, and add invoice generation so I can bill clients with due dates and automatic reminders.
Frequently asked questions
Are Payment Links free to create?
Yes. Creating Payment Links costs nothing. Stripe only charges its standard processing fee (2.9% + $0.30) when a customer actually makes a payment.
Can I customize the checkout page on a Payment Link?
You can add product images, descriptions, and adjust quantities. The checkout page uses your branding from Settings → Branding (logo, colors). For deeper customization, you need a coded Checkout Session.
Can I accept recurring payments with Payment Links?
Yes. When creating a Payment Link, set the price type to 'Recurring' and choose the billing interval (monthly, yearly, etc.). Customers will be enrolled in a subscription.
How do I track who paid through a Payment Link?
Go to Dashboard → Payments and filter by the Payment Link. Each payment shows the customer email, amount, and date. You can also view analytics per Payment Link.
Can I set up automatic payment reminders for invoices?
Yes. In Dashboard → Settings → Invoices, configure automatic reminders that are sent before the due date and after the invoice becomes overdue.
What if I eventually need a full website with Stripe integration?
When you are ready to build a website with integrated payments, the RapidDev team can help you set up a complete Stripe checkout flow, customer portal, and subscription management system.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation