Business Automation 01/04/2025

Automatic Payment System with Stripe/PayPal - How to Get Paid 24/7 (And Sleep Well)

The complete guide to building a payment system that works for you. Including Webhooks, automatic invoices and tips that saved me thousands of hours.

Reading time: 9 min Naor Cohen
Automatic Payment System with Stripe/PayPal - How to Get Paid 24/7 (And Sleep Well)

3 AM. Phone buzzes. Stripe notification: "New payment received - $299". I smile and go back to sleep. The system works for me even when I'm sleeping.

I'm Naor, and over the past three years I've built automatic payment systems for dozens of businesses. The biggest lesson? Every minute you waste on manual payment collection = money thrown in the trash.

💸 Why Payment Automation is a Game Changer

Let's be honest. How much time do you waste on:

  • Sending invoices manually? (At least an hour per week)
  • Tracking unpaid payments? (Another two hours)
  • Updating customers that payment was received? (Another hour)
  • Handling declined cards? (Don't ask...)

Total: 20+ hours per month on something a computer can do in 0.001 seconds.

🎯 The Story That'll Convince You - From Chaos to Automation

Before: Yoga Studio with 200 Members

Ronit, studio owner: "Every month I'd sit for 3 days sending WhatsApp messages - 'Hi, please pay your membership'. 40% didn't pay on time, 20% forgot, and 10% just didn't respond".

After: Complete Automatic System

Today? 98% of payments are collected automatically on the 1st. Customers get a nice reminder 3 days before, payment link, and invoice immediately after. Ronit? "I went back to teaching yoga instead of chasing money".

🛠️ Let's Build a Working System - Stripe vs PayPal

The Honest Comparison (From 50+ Projects Experience):

Criteria Stripe 🏆 PayPal
Fee 2.9% + $0.30 2.9% + $0.30 (more for international)
User Experience Stay on your site ✅ Redirect to PayPal ❌
API & Docs Excellent, clear, examples for every language Complex, not intuitive
Receiving Money 7 business days (initially) Instant (big advantage!)

My recommendation: Stripe for serious businesses, PayPal for those who need money fast.

💻 Working Code - Stripe System in 5 Minutes

Step 1: Basic Installation

// Install Stripe
npm install stripe express dotenv

// Create simple Express server
const express = require("express");
const stripe = require("stripe")(process.env.STRIPE_SECRET_KEY);
const app = express();

app.use(express.json()); // Important for webhooks!

Step 2: Creating One-Time Payment

// Endpoint for creating payment
app.post("/create-payment", async (req, res) => {
    const { amount, email, description } = req.body;
    
    try {
        // Create Payment Intent
        const paymentIntent = await stripe.paymentIntents.create({
            amount: amount * 100, // Stripe works in cents
            currency: "usd",
            metadata: {
                email: email,
                description: description
            }
        });
        
        // Send secret to client
        res.json({ 
            clientSecret: paymentIntent.client_secret,
            message: "System ready to receive payment!"
        });
        
    } catch (error) {
        console.error("Error:", error);
        res.status(500).json({ error: "Something went wrong..." });
    }
});

🔔 Webhooks - The Real Magic of Automation

Webhooks are like having a spy in Stripe that notifies you about everything that happens. Payment succeeded? You'll get notified. Card declined? You'll know immediately.

Setting Up Working Webhook:

// Webhook endpoint for Stripe
app.post("/webhook", express.raw({type: "application/json"}), async (req, res) => {
    const sig = req.headers["stripe-signature"];
    let event;
    
    try {
        // Verify the message is really from Stripe
        event = stripe.webhooks.constructEvent(
            req.body, 
            sig, 
            process.env.STRIPE_WEBHOOK_SECRET
        );
    } catch (err) {
        return res.status(400).send(`Webhook Error: ${err.message}`);
    }
    
    // Handle different event types
    switch (event.type) {
        case "payment_intent.succeeded":
            await handleSuccessfulPayment(event.data.object);
            break;
            
        case "payment_intent.payment_failed":
            await handleFailedPayment(event.data.object);
            break;
            
        case "customer.subscription.created":
            await welcomeNewSubscriber(event.data.object);
            break;
    }
    
    res.json({received: true});
});

📄 Automatic Invoices - The Gift That Keeps Giving

After each payment, the customer automatically receives:

  • ✅ Legal tax invoice (beautiful PDF)
  • ✅ Payment confirmation by email
  • ✅ Copy to accountant
  • ✅ Update in your CRM

Code That Creates Beautiful Invoices:

// Function for creating automatic invoice
async function handleSuccessfulPayment(paymentIntent) {
    // 1. Get customer details
    const customer = await getCustomerDetails(paymentIntent.metadata.email);
    
    // 2. Create invoice
    const invoice = await createInvoice({
        customerName: customer.name,
        amount: paymentIntent.amount / 100,
        description: paymentIntent.metadata.description,
        date: new Date()
    });
    
    // 3. Send by email
    await sendEmail({
        to: customer.email,
        subject: "Thanks for your purchase! Your invoice is attached 🎉",
        html: `
            

Hi ${customer.name}!

We received your payment successfully.

Amount: $${paymentIntent.amount / 100}

Invoice attached to this email.

Thanks for choosing us! 💪

`, attachments: [invoice.pdf] }); // 4. Update CRM await updateCRM(customer.id, { lastPayment: new Date(), totalSpent: customer.totalSpent + paymentIntent.amount / 100 }); }

💳 Recurring Subscriptions - Real Passive Income

The secret to stable income? Subscriptions that renew automatically. Customer signs up once and pays every month without feeling it.

Example of Working Subscription System:

// Create monthly subscription
app.post("/create-subscription", async (req, res) => {
    const { email, planId } = req.body;
    
    // Create customer in Stripe
    const customer = await stripe.customers.create({
        email: email,
        metadata: {
            source: "website",
            plan: planId
        }
    });
    
    // Create subscription
    const subscription = await stripe.subscriptions.create({
        customer: customer.id,
        items: [{ price: planId }],
        trial_period_days: 14, // 14 days free trial
        metadata: {
            firstMonth: "50off" // First month discount
        }
    });
    
    // Create checkout page link
    const session = await stripe.checkout.sessions.create({
        customer: customer.id,
        payment_method_types: ["card"],
        line_items: [{
            price: planId,
            quantity: 1
        }],
        mode: "subscription",
        success_url: "https://yoursite.com/welcome",
        cancel_url: "https://yoursite.com/pricing"
    });
    
    res.json({ checkoutUrl: session.url });
});

🚨 Handling Failures - Because It Will Happen

20% of payments fail on first attempt. Reasons: expired card, insufficient funds, bank blocks. What to do?

Smart Retry System:

  • Attempt 1: Immediately - sometimes it's just a temporary glitch
  • Attempt 2: After 3 days - maybe paycheck arrived
  • Attempt 3: After a week - with customer notification
  • Attempt 4: After 14 days - final warning

📊 Tracking Dashboard - Know What's Happening in Real Time

I built a simple dashboard that shows:

  • 💰 Revenue today/week/month
  • 📈 Trends - going up or down?
  • ⚠️ Failed payments needing attention
  • 🎯 VIP customers worth pampering

🔐 Security - Because It's Real Money

The Holy Rules:

  • Never store card details yourself - Stripe handles this
  • Always verify webhooks - otherwise anyone can fake a payment
  • HTTPS is mandatory - even in development, use ngrok
  • Log everything - you'll need it, trust me

💡 Tips from the Field (Learned the Hard Way)

1. Always Give Immediate Receipt

Even if the invoice takes a minute to generate, send immediate confirmation. Customers stress when they don't see confirmation.

2. Always Add Option to Update Card

Simple link in every email: "Update payment details". 40% of cancellations are due to expired cards.

3. Give Discount for Advance Payment

Annual payment = 10 months for the price of 12. Immediate cash flow + committed customer for a year.

🌍 International Payments - The World Is Your Market

Want to receive payments from abroad? Stripe supports 135+ currencies. PayPal 25. But beware of currency conversions - can eat another 3-4%.

🎁 My Bonus - Ready-to-Start System

I built a complete template including:

  • ✅ Node.js server with Stripe + PayPal
  • ✅ Beautiful and secure payment page
  • ✅ Automatic invoice system
  • ✅ Basic tracking dashboard
  • ✅ Ready webhooks for every scenario

[GitHub: naorx/payment-automation-starter] - 30 minutes from download to first payment.

📝 Summary - Money Doesn't Sleep, Neither Should You

An automatic payment system isn't a luxury - it's a necessity. Every hour you waste on manual collection = 10 customers you could have served.

Start simple. Single payment with Stripe. After a week add subscriptions. After a month? You'll wonder how you lived without it.

And most importantly? When the phone buzzes at 3 AM with "Payment received" - smile, turn to the other side, and keep dreaming. Because the system works for you.

Need help with your project?

Whether it's a website, bot, automation or something else - I'm here to help you build a solution that works

Share this article:

More Articles You Might Like

Keep reading and expand your knowledge