Payments - Stripe setup

web2app connects directly to your own Stripe account. Every payment from your funnel goes straight to you. You set up the connection once in Settings, then attach a Price ID to each plan in the editor.

Payments are optional while you build

You do not need Stripe keys to create funnels, edit steps, or publish drafts. Keys are required only when visitors should complete a real payment at the Checkout step. Until then, you can design the full flow and add keys when you are ready to test or go live.

What each Stripe key does

KeyWhere it runsWhat breaks without it
Secret Keyweb2app serverCheckout cannot create a payment — you see "Stripe is not configured"
Publishable KeyVisitor browserPayment form does not load even if the server created a payment
Webhook Signing Secretweb2app serverPayment may succeed in Stripe, but Subscribers will not update

The Publishable Key is public by design (like in any Stripe integration). web2app stores it as-is, not encrypted. Only server-side secrets are encrypted at rest.

Prefer Paddle?

web2app also supports Paddle as an alternative processor. Paddle is a Merchant of Record - it handles VAT and global tax compliance for you. See Payments - Paddle setup.


Step 1 - Get your Stripe API keys

  1. Sign in at dashboard.stripe.com.
  2. Go to Developers -> API keys.
  3. Copy the Publishable key (pk_live_...).
  4. For the server key, prefer a Restricted key instead of a full Secret key when possible.

Recommended restricted key permissions

web2app only uses your Stripe key to create checkout payment objects and to read Stripe objects needed to reconcile webhooks. It does not create refunds, transfers, payouts, disputes, products, or prices.

Stripe resourceAccessWhy web2app needs it
PaymentIntentsWriteCreates one-time payments for One-time/Lifetime plans.
PaymentIntentsReadReads payment intent metadata during invoice/refund webhook handling.
CustomersWriteCreates a Stripe Customer before creating a subscription checkout.
SubscriptionsWriteCreates subscriptions for recurring plans.
SubscriptionsReadReads subscription metadata/status from invoice webhooks.
InvoicesReadSubscription creation expands latest_invoice.payment_intent; paid invoice webhooks are used for renewals.
PricesReadRecurring plans reference your Stripe Price ID (price_...).
ProductsReadPrice/Product metadata may be returned with subscription/price data.

Leave unrelated resources at None, especially Refunds Write, Transfers, Payouts, Disputes, Files, and account/balance management resources. Refunds should be created manually in Stripe Dashboard; web2app only listens for refund events.

Use test mode first

Switch the Stripe Dashboard toggle to Test mode to get pk_test_... / restricted test keys while you're building. Replace them with live keys when you're ready to go live. Test cards: 4242 4242 4242 4242, any future date, any CVC.


Step 2 - Add keys in Settings

  1. In the dashboard sidebar, open Settings.
  2. In the Active payment processor toggle, select Stripe.
  3. Paste your Secret Key and Publishable Key -> click Save.

Both keys are required for checkout. You will add the Webhook Signing Secret in the next step after creating the endpoint in Stripe.


Step 3 - Create a webhook endpoint

Stripe uses webhooks to tell web2app when a payment succeeds, a subscription renews, a charge fails, or a refund happens.

  1. In the Stripe Dashboard go to Developers -> Webhooks -> Add endpoint.
  2. In web2app Settings, copy the Webhook endpoint URL shown under your Stripe fields. It is unique to your workspace; paste it exactly as displayed.
  3. Paste that URL into the Endpoint URL field in Stripe.
  4. Under Events to send, select:
    • payment_intent.succeeded
    • invoice.payment_succeeded
    • invoice.payment_failed
    • customer.subscription.created
    • customer.subscription.updated
    • customer.subscription.deleted
    • charge.refunded
  5. Click Add endpoint.
  6. On the endpoint detail page, click Reveal next to Signing secret and copy the whsec_... value.
  7. Back in Settings, paste it into Webhook Signing Secret -> Save again.

One webhook per workspace

Each workspace has its own webhook URL in Settings. Do not reuse another team's URL or share yours where it could be misused.


Step 4 - Create a Price in Stripe

For each paid plan in your funnel you need a Stripe Price ID.

  1. In Stripe Dashboard go to Product catalogue -> Add product.
  2. Fill in the product name, for example "Monthly Subscription".
  3. Under Pricing, choose:
    • Recurring -> pick interval: Weekly, Monthly, Every 3 months (quarterly), or Yearly
    • One-time -> for lifetime or single-charge plans
  4. Set the amount and currency.
  5. Click Save product.
  6. Copy the Price ID. It starts with price_, for example price_1AbCdEfGhIjKlMn.

Step 5 - Attach the Price ID to a plan

  1. Open your funnel in the editor.
  2. Click the Paywall step.
  3. Open the Pricing section and find the plan you want (Monthly, Yearly, etc.).
  4. Paste the Price ID into the Stripe Price ID field.
  5. Set Billing in the editor to match what you chose in Stripe (Weekly / Monthly / Quarterly / Yearly / One-time).
  6. Save the step.

Repeat for each plan that should charge through Stripe.

One-time and lifetime plans

For One-time and Lifetime billing periods, Stripe charges the amount you entered in the editor directly. A Price ID is still required for these plans.


Step 6 - Publish and test

  1. Publish the funnel.
  2. Use Preview from the editor for a quick checkout check, or use Copy link for a full live-link test.
  3. Complete the flow to the Checkout step.
  4. Pay with a test card: 4242 4242 4242 4242, any future date, any CVC.
  5. Check Subscribers in the dashboard. The payment should appear within seconds.

Keep the full default link

If your funnel uses the default domain, the copied URL includes workspace details. Keep the full link when testing Stripe checkout.

Express checkout methods

Express checkout methods are configured in Stripe, not in web2app. Apple Pay, Google Pay, Link, PayPal, Klarna, and Amazon Pay appear only when Stripe can offer them for the visitor's browser, device, currency, domain, and account settings. Apple Pay requires HTTPS and a verified merchant domain in Stripe. If you use a custom funnel domain, verify that exact visitor-facing domain.


Billing periods reference

Editor valueStripe intervalStripe creates
WeeklyEvery 1 weekSubscription
MonthlyEvery 1 monthSubscription
QuarterlyEvery 3 monthsSubscription
YearlyEvery 1 yearSubscription
One-time-PaymentIntent
Lifetime-PaymentIntent

What happens after payment

  • Subscriptions (weekly / monthly / quarterly / yearly): Stripe handles renewals automatically. Failures update the status in Subscribers to Past due. Cancellations set it to Canceled.
  • One-time / Lifetime: a single charge; no renewal.
  • The visitor is sent to your Success step.

Refunds and disputes

Process refunds and handle disputes directly in your Stripe Dashboard. Refund events (charge.refunded) sync back to web2app purchase access state and can trigger refund.created webhooks.


Troubleshooting

SymptomLikely causeFix
"Stripe is not configured" on checkoutSecret Key missing, not saved, or Paddle is activeIn Settings, select Stripe and save the Secret Key
Payment form empty / publishable key errorPublishable Key missing or not savedIn Settings, save the Publishable Key (pk_...)
"This plan has no Stripe Price ID"Price ID missing on the planEdit the Paywall step, add price_... to the plan
Payment succeeds but Subscribers not updatedWebhook not set up, wrong secret, or missing eventCheck webhook URL, signing secret, and selected events in Settings
Card declinedTest card used in live mode (or vice versa)Use 4242... in test mode; use real card in live mode