All articles
Development

Adding Stripe to Your Small Business Site: What Actually Matters

May 26, 2026 6 min read

Accepting payments online sounds simple until you actually wire it up. Refunds fail silently, webhooks get missed, customers get charged twice, and suddenly your support inbox is on fire. This Stripe integration guide for small businesses walks through the decisions and code that matter — based on what we ship for clients every week.

Pick the Right Stripe Product Before You Write Code

Stripe is not one product. Choosing wrong means rebuilding later. Here's how to decide:

  • Stripe Checkout — Hosted payment page. Fastest to implement (under an hour). Best if you sell a few products or services and don't need a custom checkout UI.
  • Stripe Payment Links — No code at all. Generate a URL, share it. Perfect for invoices, social media, or testing a new product.
  • Stripe Elements — Embedded payment form on your own site. Use when you want full design control or a multi-step checkout.
  • Stripe Billing — For subscriptions and recurring revenue. Handles proration, trials, and dunning automatically.
  • Stripe Connect — Only if you're a marketplace paying out to third parties (Etsy-style).

For 80% of small businesses we work with at Axoxweb, Stripe Checkout or Payment Links is the right starting point. Don't over-engineer.

The Setup That Saves You Headaches Later

1. Activate Your Account Properly

Before you write any code, finish these in the Stripe Dashboard:

  1. Complete business verification (tax ID, bank account, business address)
  2. Set your statement descriptor — this is what customers see on their card statement. Use something recognizable or you'll get chargebacks.
  3. Enable the payment methods you actually want: cards, Apple Pay, Google Pay, ACH, Link
  4. Set up Stripe Tax if you sell across state lines or internationally
  5. Configure email receipts in Settings → Emails

2. Use Restricted API Keys, Not Secret Keys

Most tutorials tell you to copy your sk_live_... secret key. Don't. Create a restricted key with only the permissions your app needs (e.g. write access to Payment Intents, read access to Customers). If it leaks, the blast radius is small.

3. Always Build in Test Mode First

Use test cards like 4242 4242 4242 4242 for success and 4000 0000 0000 0341 to simulate a card that fails after attaching. Test the failure cases, not just the happy path.

A Minimal Stripe Checkout Example

Here's a working Node.js/Express integration for a one-time payment. This is the version we actually ship, not a toy demo:

const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);

app.post('/create-checkout-session', async (req, res) => {
  const session = await stripe.checkout.sessions.create({
    mode: 'payment',
    line_items: [{
      price_data: {
        currency: 'usd',
        product_data: { name: 'Pro Plan Setup' },
        unit_amount: 29900, // $299.00 in cents
      },
      quantity: 1,
    }],
    success_url: 'https://yoursite.com/success?session_id={CHECKOUT_SESSION_ID}',
    cancel_url: 'https://yoursite.com/pricing',
    automatic_tax: { enabled: true },
    customer_email: req.body.email,
  });
  res.json({ url: session.url });
});

On the frontend, redirect the user to session.url. Stripe handles the rest — card entry, 3D Secure, receipts.

Webhooks Are Not Optional

The biggest mistake small businesses make: trusting the success URL to mark an order as paid. Users close the tab, networks drop, redirects fail. The only reliable source of truth is webhooks.

Webhook Events You Actually Need

  • checkout.session.completed — fulfill the order, send the product
  • payment_intent.payment_failed — log it, optionally email the customer
  • charge.refunded — revoke access or update your records
  • customer.subscription.deleted — for subscriptions, cancel access
  • invoice.payment_failed — trigger dunning emails

Verify the Webhook Signature

Anyone can POST to your webhook URL. Always verify:

const sig = req.headers['stripe-signature'];
const event = stripe.webhooks.constructEvent(
  req.rawBody,
  sig,
  process.env.STRIPE_WEBHOOK_SECRET
);

Use the Stripe CLI (stripe listen --forward-to localhost:3000/webhook) to test webhooks locally before going live.

Handling the Edge Cases That Cost You Money

Idempotency

Pass an idempotencyKey on every charge creation. If your server retries a request, you won't double-charge the customer:

await stripe.paymentIntents.create({...}, {
  idempotencyKey: `order_${orderId}`
});

Failed Payments and Dunning

For subscriptions, enable Smart Retries in Stripe Dashboard → Billing → Subscriptions and renewals. Stripe will retry failed cards on optimal days. Combine this with email reminders before the card expires.

Disputes and Chargebacks

Every chargeback costs you $15 plus the disputed amount. Reduce them by:

  • Using a clear statement descriptor (e.g. "AXOXWEB.COM" not "AXW LLC 4471")
  • Sending immediate email receipts with what was purchased
  • Offering visible, easy refunds — most chargebacks happen because the customer couldn't find a refund option
  • Enabling Stripe Radar with default rules

Tax, Compliance, and the Boring Stuff

If you sell digital products or services across multiple US states or to the EU/UK, sales tax/VAT is your problem, not the customer's bank's. Two options:

  1. Stripe Tax — 0.5% per transaction, calculates and collects automatically. Worth it once you're past a few hundred transactions per month.
  2. Manual — Charge a flat tax for your home jurisdiction only. Fine when you're starting out, risky once you scale.

Also: keep PCI compliance simple. As long as card data never touches your server (which is true for Checkout and Elements), you qualify for SAQ A — the easiest PCI level.

Pricing Math Small Businesses Forget

Stripe's standard US pricing is 2.9% + $0.30 per successful charge. That $0.30 fixed fee destroys margins on small transactions:

  • $5 charge → you keep $4.56 (fee is 8.8%)
  • $50 charge → you keep $48.25 (fee is 3.5%)
  • $500 charge → you keep $485.20 (fee is 3.0%)

If your average order value is under $20, consider bundling products, raising prices, or offering ACH (0.8%, capped at $5) for larger transactions.

Going Live Checklist

  1. Swap test API keys for live keys in environment variables
  2. Update webhook endpoint to live mode and copy the new signing secret
  3. Run a real $1 transaction on your own card, then refund it
  4. Confirm the receipt email arrives and looks correct
  5. Test on mobile — Apple Pay and Google Pay should appear automatically
  6. Set up Stripe Dashboard alerts for failed payments and disputes
  7. Document your refund process for whoever handles support

Stripe is powerful but the real work is everything around it: fulfillment, taxes, refunds, dunning, and the UX of getting people to actually complete checkout. If you'd rather have a team handle the integration end-to-end — including the parts no tutorial covers — Axoxweb builds and ships custom Stripe-powered websites and web apps for founders and small businesses. Get in touch and we'll have you taking payments in days, not weeks.

StripePaymentsSmall Business