A small store on Astro with Stripe Checkout

Under about 50 products, Astro and Stripe Checkout can replace a store platform. Real fees next to Snipcart and Shopify, and what you give up.

Published 8 minute readWebsites
A simple product page with one orange buy button leading to a card

A candle maker with 14 products does not need a store platform. They need good product pages, a way to take a card, and an email when someone buys. Most of the stores we see at that size pay a monthly platform fee for an admin they open twice a week.

Stripe already covers the hard part. Stripe Checkout is a payment page Stripe hosts, with cards, Apple Pay and Google Pay, receipts and shipping addresses. An Astro site covers the rest: fast pages, built from Markdown files, hosted for free or close to it. Put the two together and a small store runs on card fees alone. The trade is that some store features become your job, and it’s worth knowing which ones before you skip the platform.

TLDR

For a catalog under about 50 products, an Astro site with Stripe Payment Links or Stripe Checkout costs only Stripe’s 2.9% + 30¢ per US card payment, with no monthly plan. You give up stock tracking, a real order admin, built-in abandoned cart emails and tax unless you add Stripe Tax at 0.5% per transaction. Snipcart adds a cart and stock for $20 a month under $1,000 in sales, or 2% above it. Shopify Basic at $25 a month is the step up when variants, accounts or daily order handling arrive.

Three ways to take the money

A Payment Link is a Stripe-hosted page for one product, made in the Stripe Dashboard. The Astro product page has a “Buy” button that points to it. That’s the whole integration. The site stays fully static, so it can sit on any free static host.

From the Dashboard, without code, a Payment Link can collect shipping addresses, charge shipping rates, let the shopper change the quantity, take promotion codes, and send an automatic receipt. It can also limit the number of payments. Stripe’s own example for that limit is “limited inventory”: when the link reaches the number, it deactivates and shows a message you write, like “Sold out for now”.

The limit is that one link is one checkout. A shopper who wants three different candles goes through three payment pages, or you make a bundle link. For a shop where most orders are one item, that’s fine.

Checkout Sessions, one small server route

When shoppers buy several things at once, the site needs a cart and a server route that creates a Checkout Session with every line in it. Astro handles this with one on-demand route: add an adapter for your host, then mark the single endpoint with export const prerender = false. Every other page stays static.

A one-product version, as a form post, looks like this:

// src/pages/api/checkout.ts
import type { APIRoute } from 'astro';
import Stripe from 'stripe';

export const prerender = false;

const stripe = new Stripe(import.meta.env.STRIPE_SECRET_KEY);

// Price IDs stay on the server, so a shopper can't swap in a cheaper price.
const prices: Record<string, string> = {
  'lavender-candle': 'price_123',
  'cedar-candle': 'price_456',
};

export const POST: APIRoute = async ({ request }) => {
  const form = await request.formData();
  const price = prices[String(form.get('product'))];
  if (!price) return new Response('Unknown product', { status: 400 });

  const session = await stripe.checkout.sessions.create({
    mode: 'payment',
    line_items: [{ price, quantity: 1 }],
    shipping_address_collection: { allowed_countries: ['US', 'CA'] },
    success_url: 'https://example.com/thanks?session_id={CHECKOUT_SESSION_ID}',
  });

  return new Response(null, { status: 303, headers: { Location: session.url! } });
};

The product page posts a hidden product field to /api/checkout, and the shopper lands on Stripe’s payment page. A cart version takes a list of products and quantities instead of one, and builds line_items from it the same way. Put the secret key in your host’s environment variables, never in the repository.

One rule matters more than the code. Stripe’s fulfillment guide says webhooks are required, because “it’s not guaranteed customers visit” your thank-you page. A shopper can pay and lose their connection before it loads. So anything that must happen after a sale, like lowering stock or emailing the workshop, runs from the checkout.session.completed webhook, not from the thank-you page.

Snipcart, a cart you drop in

Snipcart adds a cart and checkout to any static site with a script tag. Products are buttons with data-item-id, data-item-price and data-item-url attributes. Before confirming an order, Snipcart’s server fetches that URL and checks the product button is really on the page with the same ID, and products that share an ID must share a price or validation fails.

In return for the fee you get the parts Stripe alone leaves out: a multi-item cart with no server code, stock levels that go down with each sale, tax rates, an order notification email, and invoice emails to the buyer. The catch is that the product’s page must be public and live, since the validation crawler needs to read it.

What each one costs

All figures are for US cards on standard pricing.

Setup Monthly fee Per order On a $40 order
Payment Links or Checkout $0 2.9% + 30¢ (Stripe) $1.46
Snipcart, under $1,000 a month in sales $20 Stripe’s fee only $1.46 plus the $20 a month
Snipcart, above $1,000 a month $0 2% plus Stripe’s fee $2.26
Shopify Basic with Buy Button $25, or $19 billed yearly Your Shopify Payments rate Depends on the rate in your admin

Stripe adds 1.5% for international cards and 1% when currency conversion is needed. Stripe Tax, if you need it, is 0.5% per transaction on the no-code setup, charged only where you’ve registered to collect tax.

At 20 orders of $40 a month, Stripe alone costs $29.20. Snipcart takes that to $49.20. Shopify Basic would be $25 plus card fees, and it brings a full admin with it. The gap is small at this size. Pick on the features you need, not on the fee table.

The Shopify Buy Button is the middle road. It’s included in all Shopify plans, embeds a product on any site, and checks out on Shopify. Your Astro site stays the shop window, and Shopify keeps the stock, orders and emails. For a store that expects to grow into a platform, starting here avoids a second move later.

What you give up without a platform

Stock

Stripe’s product catalog has names, prices and images. It has no stock count. The purchase limit on a Payment Link stands in for a single product with a fixed quantity, like 30 hand-poured candles in one batch. Variants with their own stock, like sizes and colors, need either Snipcart’s inventory or a webhook that keeps counts in a small database or even a spreadsheet, and a page that reads them.

Tax

Stripe doesn’t add sales tax or VAT unless you turn on Stripe Tax, at 0.5% per transaction on the no-code setup, and register where you need to collect. Whether you must collect tax at all depends on where you sell and how much. Check that with an accountant before launch, not after.

Order admin

Orders are payments in the Stripe Dashboard, with the line items, shipping address and any custom fields you collected. That’s enough for one person packing a few orders a day. It is not enough for a team with picking lists, partial refunds on line items, and order notes. That’s the clearest sign you’ve outgrown this setup.

Abandoned carts

Stripe Checkout can recover abandoned carts, but you send the email. Turn on recovery and promotional consent when you create the session. When the session expires, which is 24 hours later by default, Stripe sends a checkout.session.expired webhook with a recovery link. Your server emails that link, only to shoppers who agreed to promotional emails. It’s real work, and on Payment Links with a static site there’s no server to do it.

Where stock, orders and emails live

Stripe only Snipcart Shopify Buy Button
Products and prices Astro files plus Stripe catalog Astro files Shopify admin
Stock Payment Link limit or your webhook Snipcart dashboard Shopify admin
Orders Stripe Dashboard Snipcart dashboard Shopify admin
Buyer receipt Stripe receipt Snipcart invoice email Shopify order email
Your new-order email Stripe payment notification Snipcart order notification Shopify notification
Abandoned cart email You build it Snipcart email template Shopify settings, check your plan

When it’s enough, and when it isn’t

It’s enough when the catalog is under about 50 products, most orders are one or two items, one person handles orders, and stock is simple or doesn’t matter, like digital files, services, workshops or made-to-order items. A store like that pays card fees and nothing else, and the site loads fast because there’s no store theme behind it.

It isn’t enough when products have variants with their own stock, when customers expect accounts and order history, when you sell wholesale, or when more than one person processes orders. That store wants Shopify or WooCommerce behind an Astro front end, or a plain theme on the platform.

For a shop that fits, we build it as an Astro website from $1,500 fixed: product pages from Markdown, Payment Links or a Checkout route, the webhook if stock needs it, and a test order through every product before launch. Site care at $79 a month on the pricing page keeps the dependencies, Stripe keys and webhook watched after that.

Questions

Can a static Astro site take payments without a server?

Yes, with Stripe Payment Links. Each product gets a Stripe-hosted payment page, and the Astro site only links to it. Receipts, shipping addresses and shipping rates are set in the Stripe Dashboard. You need a server route only for a multi-item cart, automatic stock updates or your own order emails.

Does Stripe track inventory?

No. Stripe's product catalog holds names, prices and images, not stock counts. A Payment Link can be limited to a number of purchases, which works for one product with a fixed quantity. Anything more needs a webhook that updates stock somewhere you control, or a cart service like Snipcart that tracks it.

When should a small store move to Shopify or WooCommerce?

When products have variants with their own stock, when you need customer accounts or wholesale prices, when more than one person handles orders every day, or when the catalog grows past what you can keep straight in a spreadsheet. Around 50 products is where we start that conversation.

Have this problem on your store?Two sentences about it get you a written quote, or a plugin or app recommendation, within 48 hours.
Get a fixed quote