Skip to main content
RapidDev - Software Development Agency
stripe-guide

How to integrate Stripe without a website

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.

What you'll learn

  • How to create and share Stripe Payment Links without any code
  • How to send invoices to customers via email
  • How to use the Stripe Dashboard as a virtual terminal for manual charges
  • When to use each method based on your business needs
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Beginner6 min read10 minutesStripe Dashboard, no coding required for Payment Links and InvoicingMarch 2026RapidDev Engineering Team
TL;DR

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

1

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.

2

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.

typescript
1const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);
2
3const 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.00
11 },
12 quantity: 1,
13 }],
14});
15
16console.log('Payment Link:', paymentLink.url);

Expected result: A Payment Link URL is returned that you can share with customers.

3

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.

4

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.

5

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

payment-links.js
1const express = require('express');
2const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);
3
4const app = express();
5app.use(express.json());
6
7// Create a Payment Link
8app.post('/api/payment-links', async (req, res) => {
9 try {
10 const { productName, amount, recurring } = req.body;
11
12 const priceData = {
13 currency: 'usd',
14 product_data: { name: productName },
15 unit_amount: amount, // in cents
16 };
17
18 if (recurring) {
19 priceData.recurring = { interval: 'month' };
20 }
21
22 const paymentLink = await stripe.paymentLinks.create({
23 line_items: [{ price_data: priceData, quantity: 1 }],
24 });
25
26 res.json({ url: paymentLink.url, id: paymentLink.id });
27 } catch (err) {
28 res.status(500).json({ error: err.message });
29 }
30});
31
32// Create and send an invoice
33app.post('/api/invoices', async (req, res) => {
34 try {
35 const { customerEmail, items, daysUntilDue } = req.body;
36
37 // Find or create customer
38 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 }
43
44 // Create invoice
45 const invoice = await stripe.invoices.create({
46 customer: customer.id,
47 collection_method: 'send_invoice',
48 days_until_due: daysUntilDue || 30,
49 });
50
51 // Add line items
52 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 cents
58 currency: 'usd',
59 });
60 }
61
62 // Finalize and send
63 await stripe.invoices.finalizeInvoice(invoice.id);
64 await stripe.invoices.sendInvoice(invoice.id);
65
66 res.json({ id: invoice.id, status: 'sent' });
67 } catch (err) {
68 res.status(500).json({ error: err.message });
69 }
70});
71
72const 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.

ChatGPT Prompt

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.

Stripe Prompt

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.

RapidDev

Talk to an Expert

Our team has built 600+ apps. Get personalized help with your project.

Book a free consultation

Need help with your project?

Our experts have built 600+ apps and can accelerate your development. Book a free consultation — no strings attached.

Book a free consultation

We put the rapid in RapidDev

Need a dedicated strategic tech and growth partner? Discover what RapidDev can do for your business! Book a call with our team to schedule a free, no-obligation consultation. We'll discuss your project and provide a custom quote at no cost.