# Your own processor

Connecting your own Stripe or PayPal account, and what changes for buyers when you do.

## Why

With your own processor there is no Ripping fee: apps charge on your account and you pay only your processor's rates. Connect the account once on the **Connections** page, then pick it per app on the project's **Settings** tab under **Payments**.

## Your own Stripe

On **Connections**, add **Stripe** with two fields:

- **Publishable key** (`pk_live_…`), used in the browser.
- **Secret key** (`sk_live_…`). A restricted key works if it can read the balance (the check below), create Checkout sessions and refunds, and create webhook endpoints. Ripping stores it encrypted and only uses it on the server.

When you save:

1. Ripping makes one harmless call to Stripe (reading the balance) to check the key. A bad key fails with "Stripe rejected the key: *status*".
2. Ripping registers a webhook endpoint on your Stripe account, named "Ripping sales", for `checkout.session.completed`, `checkout.session.async_payment_succeeded` and `charge.refunded`. This is how a payment is recorded even when the buyer closes the tab after paying, and how a refund made in your Stripe dashboard shows up on the Sales tab.
3. The connection shows as **Connected** with the masked publishable key.

Saving again with a new key replaces the webhook. Removing the connection deletes it. **Test** re-runs the check and records the result on the connection.

Then, on the app's Settings → Payments, pick **My own Stripe**. Its note reads "Your Stripe account, your fees. Cards, Apple Pay, subscriptions." One-time products and subscriptions both work; subscriptions are followed through your webhook (see the [overview](/payments/overview)).

## Your own PayPal

On **Connections**, add **PayPal** from a PayPal business app:

- **Client ID**
- **Secret**
- **Mode**: `live` or `sandbox`. Sandbox lets you test with PayPal's test accounts; nothing real is charged.

Ripping verifies the pair against PayPal on save and shows "PayPal live · *masked id*" (or "PayPal sandbox"). A wrong pair fails with PayPal's reason.

Then pick **My own PayPal** on the app's Settings → Payments. Its note reads "Your PayPal business account. One-time payments." Subscription products cannot be sold through it.

## What changes for buyers

- **Stripe**: the buyer lands on Stripe Checkout under your account name and branding, pays by card, Apple Pay or Google Pay, and returns to the app. The receipt comes from your Stripe account.
- **PayPal**: the buyer lands on a PayPal approval page, approves the order, and returns to the app, which captures the payment. The buyer's PayPal email is recorded as the buyer.
- Prices still come from the app's product catalogue in Ripping, not from the app's code or from your Stripe products.
- Purchases still appear on the app's **Sales** tab (marked **Own Stripe** or **PayPal**) and on the buyer's **Purchases** page in the app. Refunds from the Sales tab go through your account.

## Errors

- "Stripe isn't connected for this app's owner (Connections)." or the PayPal equivalent: the app is set to a processor with no connection. Connect it, or switch the app back to Ripping Payments.
- "PayPal here takes one-time payments; sell subscriptions with Stripe.": a subscription product was checked out while PayPal was chosen.
- "No PayPal capture to refund" / "No charge to refund yet": the payment never completed, so there is nothing to return.

## Another gateway

The Payments page also mentions Paddle, Lemon Squeezy and other REST APIs: add them as a **REST** connection with a base URL and header, and the builder calls them through Ripping's proxy. These are not processors in the Settings → Payments sense: no product catalogue, no Sales rows, no refund button.
