Everything you need to build a complete e-commerce checkout for PetalsWings Iris Farm — from Stripe to Synchrony BNPL.
A full e-commerce checkout system that replaces Shopify's built-in cart — giving PetalsWings complete control over the buying experience, payment processing, and customer data.
A beautiful, iris-themed shopping cart with real-time updates, quantity management, and shipping calculation — all under our domain.
FrontendAccept credit cards, Apple Pay, Google Pay, PayPal, and Buy Now Pay Later — meeting customers wherever they prefer to pay.
IntegrationStripe Elements handles all card data — no sensitive numbers ever touch our servers. PCI-DSS Level 1 certified out of the box.
SecurityPetalsWings currently runs on Shopify, which handles the entire checkout experience. We're building our own to gain full control over branding, reduce platform fees, own the customer relationship, and integrate unique features like Synchrony financing — something Shopify can't do natively.
Five ways for customers to pay, all working together through a unified checkout experience.
Credit cards, debit cards, and serves as the backbone for Apple Pay and Google Pay integration.
Stripe Elements — a pre-built, customizable card input that's PCI-DSS Level 1 certified. Card numbers never touch our server.
Real-time card validation, 3D Secure authentication, fraud detection via Radar, webhook events for order management.
Funds deposited to your bank account on a 2-day rolling basis. No monthly fees or minimums.
Handled entirely through Stripe's Payment Request API — no separate Apple merchant account needed.
Domain verification required — upload a verification file to petalswings.com/.well-known/
Safari on macOS, iOS Safari, and in-app browsers. Works with Face ID and Touch ID for instant checkout.
One-tap checkout — no typing card numbers. Average 2x faster checkout completion vs. manual entry.
Same Payment Request API as Apple Pay — one integration covers both. Stripe detects the user's platform automatically.
Chrome on Android and desktop. Works with any card saved in Google Wallet.
No domain verification needed (unlike Apple Pay). Works immediately once Stripe is configured.
PayPal JavaScript SDK — Smart Payment Buttons that automatically show the most relevant payment options (PayPal, Venmo, Pay Later).
2.59% + $0.49 per transaction with PayPal Advanced — includes custom card fields within your checkout page.
PayPal's Purchase Protection covers eligible purchases — builds customer confidence for first-time iris buyers.
~30% of online shoppers prefer PayPal. For a niche product like iris rhizomes, reducing friction = more conversions.
Garden/outdoor category credit card. Customers get 6-12 month promotional financing on qualifying purchases. Perfect for bulk iris orders ($200+).
Synchrony's installment plan option — fixed monthly payments over 3-48 months. Lower barrier for larger collections.
Afterpay: 4 interest-free payments. Klarna: Pay in 4 or monthly financing. Affirm: 3-36 month plans. All have merchant APIs.
Requires merchant application — Chris works at Synchrony, which may streamline the process. Application takes 2-4 weeks.
As a VP at Synchrony leading payment integrations, Chris has insider knowledge of how these APIs work. The Synchrony HOME card in the garden/outdoor category is a natural fit for an iris farm selling rhizomes and garden collections.
| Feature | Stripe | Apple Pay | Google Pay | PayPal | Synchrony |
|---|---|---|---|---|---|
| Setup Cost | Free | Free | Free | Free | Application |
| Per-Transaction | 2.9% + $0.30 | Via Stripe | Via Stripe | 2.89% + $0.49 | MDR varies |
| Monthly Fees | None | None | None | None | Possible |
| Card Support | Visa, MC, Amex, Discover | All cards in Wallet | All cards in GPay | PayPal balance + cards | Synchrony card |
| Mobile UX | Good | Excellent | Excellent | Good | Fair |
| Buyer Protection | Via card network | Via card network | Via card network | PayPal Protection | Via Synchrony |
| Financing | — | — | — | Pay Later option | 6-48 mo promo |
| Integration | Stripe.js + API | Payment Request API | Payment Request API | PayPal JS SDK | Synchrony API |
| PCI Burden | Minimal (Elements) | None | None | None (redirect) | None (hosted) |
Three layers working together — a static frontend, serverless backend, and managed database.
Static HTML/CSS/JS served from Cloudflare's edge network. The cart UI, checkout forms, and Stripe Elements all run client-side. Fast, free, globally distributed.
Free hostingServerless functions that handle Stripe payment intents, validate orders, check inventory, and trigger confirmation emails. No server to manage.
Free tier: 100K req/dayCloudflare D1 (SQLite) for product catalog and orders, or Workers KV for simpler key-value storage. Both serverless, both on Cloudflare.
Free tier availableHTTPS is mandatory (Cloudflare provides this automatically). Stripe Elements means card numbers never touch our servers — they go directly from the customer's browser to Stripe's PCI-certified infrastructure. Our server only sees a token. This gives us SAQ-A level PCI compliance — the simplest and most secure level.
Six steps from browsing to confirmation — each one designed to minimize friction.
Customer reviews items, adjusts quantities, sees subtotal. Cart persists in localStorage. Shows estimated shipping and tax preview.
Name, address, email, phone. Address validation via USPS API (or manual entry). Calculate shipping rates based on zone + weight. Show delivery estimate.
Choose: Credit card (Stripe Elements), Apple Pay, Google Pay, PayPal, or Synchrony Financing. Payment buttons appear based on device/browser capability.
Final summary — items, shipping address, shipping cost, tax, payment method, total. Last chance to edit before committing.
Backend creates Stripe PaymentIntent (or PayPal order), confirms payment, validates inventory, creates order record, decrements stock.
Success page with order number. Confirmation email sent via Cloudflare Workers + Resend/SendGrid. Order appears in admin dashboard.
Key integration snippets to show how the pieces fit together.
// Initialize Stripe Elements const stripe = Stripe('pk_live_your_publishable_key'); const elements = stripe.elements({ appearance: { theme: 'night', variables: { colorPrimary: '#7c3aed', colorBackground: '#12121a', fontFamily: 'Inter, sans-serif', } } }); // Mount the Payment Element (cards + wallets in one) const paymentElement = elements.create('payment'); paymentElement.mount('#payment-element'); // Handle form submission async function handleSubmit() { const { error } = await stripe.confirmPayment({ elements, confirmParams: { return_url: 'https://petalswings.com/order-confirmed', }, }); if (error) { // Show error to customer document.getElementById('error-message').textContent = error.message; } }
// Cloudflare Worker — Create Payment Intent export default { async fetch(request, env) { const { items, shipping } = await request.json(); // Calculate total server-side (never trust the client!) const total = calculateTotal(items, shipping); // Create Stripe PaymentIntent const response = await fetch('https://api.stripe.com/v1/payment_intents', { method: 'POST', headers: { 'Authorization': `Bearer ${env.STRIPE_SECRET_KEY}`, 'Content-Type': 'application/x-www-form-urlencoded', }, body: new URLSearchParams({ amount: Math.round(total * 100), // Stripe uses cents currency: 'usd', automatic_payment_methods: '{"enabled": true}', metadata: JSON.stringify({ order_items: items.map(i => i.sku).join(','), }), }), }); const paymentIntent = await response.json(); return new Response(JSON.stringify({ clientSecret: paymentIntent.client_secret, })); } };
// PayPal Smart Payment Buttons paypal.Buttons({ style: { layout: 'vertical', color: 'black', shape: 'rect', label: 'paypal', }, async createOrder() { const res = await fetch('/api/paypal/create-order', { method: 'POST', body: JSON.stringify({ cart: getCartItems() }), }); const data = await res.json(); return data.id; }, async onApprove(data) { const res = await fetch(`/api/paypal/capture/${data.orderID}`, { method: 'POST', }); const order = await res.json(); showConfirmation(order); }, }).render('#paypal-button-container');
Stripe's Payment Element automatically shows Apple Pay and Google Pay buttons when available on the customer's device — no extra code needed. It adapts to show the most relevant payment options.
Your checklist — complete these before we start building.
Go to stripe.com → Sign up with business info for PetalsWings/Aspire Digital. You'll need business name, EIN, bank account for payouts. Takes ~10 minutes. Gives us API keys immediately.
In Stripe Dashboard → Settings → Payment Methods → Apple Pay → Add Domain → Download verification file → Upload to petalswings.com/.well-known/apple-developer-merchantid-domain-association. Link can handle the upload.
Go to paypal.com/business → Sign up with business email. Enable "PayPal Checkout" in your account settings. Get Client ID and Secret for API integration.
If pursuing BNPL: apply at synchronybusiness.com. Garden/outdoor category = Synchrony HOME card. Chris's internal connections may expedite this. Allow 2-4 weeks for approval.
Option A: Flat rate ($X for all orders). Simple. Option B: Weight-based (heavier rhizome bundles cost more). Option C: Real-time carrier rates via USPS/UPS API. Recommend starting with flat rate, upgrading later.
We have the Etsy CSV export. Chris should review it and confirm: product names, descriptions, prices, weights, images, and stock quantities for each iris variety.
A phased approach — start accepting payments in weeks, not months.
Set up Stripe account, build cart UI, integrate Stripe Payment Element (covers cards + Apple Pay + Google Pay in one component), create backend payment intent endpoint, build order confirmation flow. This gets us 80% of payment methods in one shot.
Add PayPal JS SDK, implement Smart Payment Buttons, build backend order creation and capture endpoints. Test PayPal sandbox. Deploy alongside existing Stripe checkout.
Apply for Synchrony merchant account (2-4 week approval). Integrate Synchrony promotional messaging. Add financing option to checkout. This phase depends on merchant application timeline. Can also evaluate Afterpay/Klarna as faster alternatives.
End-to-end testing with real cards (Stripe test mode), mobile testing, accessibility audit, SEO optimization, analytics setup, email template design. Go live! 🚀
Spoiler: setup is free. You only pay per transaction.
Shopify Basic: $39/month + 2.9% + $0.30 per transaction + 2% fee for non-Shopify Payments. Our setup: $0/month + same ~3% per transaction. At 50 orders/month, you'd save ~$500/year in platform fees alone — plus you own the code, the data, and the customer relationship.