Skip to main content
Accept payments in your app with either the Replit Stripe connector or your own Stripe API keys. Choose the connector for managed sandbox setup, or use your own keys when you need control over the integration.

Choose one method per environment

Use one method in each environment, not both at once. Combining them in the same environment causes connection conflicts. You can use different methods across environments, such as the connector’s sandbox in development and your own live keys in production.

Best for

  • Founders who run bookings, rentals, or appointments and need deposits that protect their time.
  • Builders who want payments working in a sandbox today and live payments without a manual key setup.
  • Teams with an existing Stripe account or requirements that need a manually managed SDK and webhook integration.

Replit Stripe connector

Use this method to take a refundable deposit at booking and charge the balance later, without pasting API keys.

Connectors

Before you start

Start from an App with a backend, sign-in, and a database, so each booking can store its payment status. Then pick the math:
  • Deposit at booking: a flat amount, such as $500, or a percentage of the total.
  • Balance later: the rest of the price, charged to the saved card when the customer arrives.
  • Refund window: how late a customer can cancel and still get the deposit back. 48 hours is a common default.

Prompt the agent

Agent proposes the Stripe connector and sets up a Stripe sandbox for you. You don’t need to copy keys from the Stripe Dashboard.

What to expect

Agent adds checkout, the deposit and balance flows, and the refund rule. Test them in Preview with Stripe’s test card 4242 4242 4242 4242, any future expiry, and any 3-digit CVC:
  1. Make a booking and pay the deposit. Confirm the booking shows the deposit as paid and a card on file.
  2. Charge the balance from the booking. Confirm it shows as paid.
  3. Cancel a second booking outside the refund window. Confirm the refund in your Stripe sandbox dashboard.
  4. Cancel a third booking inside the window. Confirm the app keeps the deposit and explains why.
  5. Pay with Stripe’s decline test card 4000 0000 0000 0002. Confirm the booking isn’t confirmed.
When the flows work, connect your live Stripe account from the Publish pane. Follow Go live on the Stripe Payments page, then make one low-cost real booking with your own card before you share the app.

Make it work for you

Troubleshooting

  • The deposit succeeds but the booking isn’t confirmed: ask Agent to connect the Stripe payment success event to the booking status in the database, then test another booking.
  • Agent asks you to paste Stripe keys or set up a webhook: tell Agent to use the Replit Stripe connector instead. Mixing the connector and your own keys in the same environment causes conflicts.
  • Publishing asks you to connect a live Stripe account: the sandbox only takes test payments. Connect your live account from the Publish pane, as described in Go live.
  • You need subscriptions for a mobile app: use RevenueCat subscriptions instead.

Your own Stripe keys

Connect Stripe yourself: store your own API keys in Secrets, take payments with the Stripe SDK, and receive payment events through a webhook. Use this path when you already manage a Stripe account and want full control over the setup.
This is a manual setup. You create and rotate the keys, register the webhook, and keep the integration working. Replit doesn’t manage it. For a setup without API keys, use the Replit Stripe connector.

Before you start with your own keys

Copy your test API keys from the Stripe Dashboard and add them to your app’s Secrets. Add the webhook signing secret later, when you start the listener described below. Keep test keys in development. Configure live keys separately in your published app’s secrets. To add a key, select Tools in the Project Editor, then Secrets under Setup. Select New Secret, enter the exact name in Key, enter your Stripe key in Value, and select Add Secret.
Project Editor with Secrets selected under Setup and the new-secret form highlighted, showing STRIPE_SECRET_KEY in Key and an empty Value field

Enter the exact secret name in Key. The example leaves Value empty; enter your own key there.

After completing the webhook setup below, your Secrets list contains the three names with their values hidden:
Replit Secrets pane showing the STRIPE_SECRET_KEY, STRIPE_PUBLISHABLE_KEY, and STRIPE_WEBHOOK_SECRET secrets

Prompt the agent for manual setup

Test the manual integration

Agent adds checkout and a webhook endpoint. For development, follow Stripe’s webhooks quickstart to install and authenticate the Stripe CLI in your project’s Shell. Ask Agent for your server’s local port and webhook path. Run the listener in that same environment, replacing the example port and path with your app’s values:
Save the signing secret printed by stripe listen as STRIPE_WEBHOOK_SECRET in your development Secrets, then restart your app so it reads the value. Keep both the app and the listener running while you test in Preview. The listener forwards test events to the development server, so you don’t need a published URL or a public development webhook endpoint yet. Watch the walkthrough to see the full setup: Test with Stripe’s test card 4242 4242 4242 4242, any future expiry, and any 3-digit CVC. Confirm the order shows as paid in your app and the Stripe CLI reports a successful response from your webhook endpoint.

Publish with your own live keys

Keep your development test keys and listener secret unchanged. In Publishing > Adjust settings > Production app secrets, set STRIPE_SECRET_KEY and STRIPE_PUBLISHABLE_KEY to your live keys. See Manage production secrets. Register a separate live-mode webhook endpoint in Stripe using your published app URL plus the webhook path. Set STRIPE_WEBHOOK_SECRET in Production app secrets to that endpoint’s signing secret, not the CLI listener’s secret, then publish or republish. If this is your first publish, establish the published URL first, then finish the endpoint and secret setup and republish before accepting payments. If development uses the Replit Stripe connector’s sandbox and production uses your own keys, publishing checks STRIPE_SECRET_KEY:
  • It must hold a live secret key (sk_live_...) or a live restricted key (rk_live_...). Test keys, publishable keys, and keys stored under other names don’t count.
  • Without a valid live key, publishing stops with Connect a live Stripe account before publishing.
  • Products and prices don’t sync from the sandbox to your live account. Create them in your live Stripe account yourself.

Customize the manual integration

Troubleshoot the manual integration

  • Publishing says “Connect a live Stripe account before publishing”: check that the secret is named exactly STRIPE_SECRET_KEY and holds a live key that starts with sk_live_ or rk_live_.
  • Webhook events fail signature checks: make sure STRIPE_WEBHOOK_SECRET matches the endpoint’s signing secret, and that you use the live-mode secret in production.
  • The connector and your own keys are both set up in one environment: remove one of them. To remove the connector, see Update or remove the Stripe connection.

Payments and Stripe help

Answers about setup methods, required secret names, and publishing errors.

Stripe Payments

How the Stripe connector works, from sandbox to live account.