> ## Documentation Index
> Fetch the complete documentation index at: https://docs.base44.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Payments

> Configure Stripe and Wix Payments, read payment analytics, and recognize inbound payment webhook traffic

<Note>
  The Apps API is in beta. Its endpoints and responses may change.
</Note>

These endpoints cover the app's payment setup: connecting and configuring Stripe or Wix Payments, managing a Stripe product and price catalog, reading payment analytics, and recognizing the webhook traffic the providers send back to Base44.

## Prerequisites

* A personal API key. See [Authentication](/developers/references/apps-api/get-started/authentication) to get one.
* An app you can edit. Most operations here require write access, not just read access.

## App ID

Endpoints that act on a specific app include the app's ID in the URL path as `app_id`.

**To get your app ID:**

1. Go to [app.base44.com](https://app.base44.com/).
2. Open your app in the app editor.
3. Copy the app ID from the editor URL: `"https://app.base44.com/apps/<app_id>/editor"`.

## Two independent providers

An app connects to Stripe, Wix Payments, or the legacy Payments by Wix integration. These are separate setups with separate credentials, so connecting one does not affect the others, and the analytics and dashboard-link endpoints take a provider-specific path rather than a shared one.

<Note>
  Payments by Wix is a legacy integration. It supports existing connections only, and new installations are not supported.
</Note>

## Stripe: sandbox first, then live

A Stripe integration starts in a test sandbox and moves to live mode only when you configure or provision live keys.

1. [Install Stripe integration](/api-reference/install-stripe-integration) sets up the sandbox and stores test credentials. It reuses an existing usable installation rather than creating a duplicate.
2. [Get Stripe onboarding link](/api-reference/get-stripe-onboarding-link) returns a link to claim the sandbox or resume unfinished activation, refreshing onboarding state as it does.
3. Switch to live mode with either [Configure live Stripe keys](/api-reference/configure-live-stripe-keys), which stores keys you already have from Stripe, or [Provision live Stripe keys](/api-reference/provision-live-stripe-keys), which creates them after Stripe activation. Provisioning is limited to 5 requests per user per 60 seconds.
4. [Get Stripe integration status](/api-reference/get-stripe-integration-status) reports the current mode and setup state without returning any API keys.

<Warning>
  Onboarding and claim links are one-time credentials. Treat a link returned by these endpoints the same way you'd treat a password.
</Warning>

[Remove Stripe integration](/api-reference/remove-stripe-integration) deletes the sandbox record and stored secrets and clears the app's Stripe mode. It does not delete the Stripe account or catalog, revoke credentials at Stripe, or redeploy functions that already deployed with the old credentials.

## The Stripe catalog

The product and price endpoints read and write the catalog of whichever Stripe account the app's stored credentials select. Live keys reach the live catalog, and test keys reach the test catalog, so two apps sharing one Stripe account share its catalog too.

[List Stripe products](/api-reference/list-stripe-products) and [List Stripe prices](/api-reference/list-stripe-prices) each return a single batch of up to 100 records, with no cursor to retrieve the rest. There's no way to page through a catalog larger than the batch you request.

Updates only touch the fields you send. [Update Stripe product](/api-reference/update-stripe-product) and [Update Stripe price](/api-reference/update-stripe-price) leave omitted or null fields unchanged, and an empty update body leaves the record as it was. A price's amount, currency, and recurring schedule can't be changed after creation. Creating a product or price is not idempotent: retrying a create request can leave you with a duplicate.

## Inbound payment webhooks

<Note>
  Base44 registers the webhook endpoints under **Webhooks** with the payment provider for you, and the provider is the only caller. You can't invoke them for your own app or repoint them. They're documented so you can recognize the traffic and read the acknowledgements they return.
</Note>

Every webhook responds with the same acknowledgement shape: a `status` of `processed`, `acknowledged`, `ignored`, or (Stripe only) `logged`, plus an optional `reason` or `action` explaining it. These endpoints authenticate the provider's signature instead of a Base44 API key, so they carry no `api_key` requirement.

A verified event that fails processing returns an error so the provider retries it. An event Base44 can't attribute to an app, such as one missing the app ID it expects back, is acknowledged as `ignored` rather than failed.

## Payment analytics

[Get payment analytics](/api-reference/get-payment-analytics) is the revenue summary: totals and a daily breakdown, both filterable by currency and window (7, 30, or 90 days, or an explicit `start_date`/`end_date` pair sent together). Every money field is in the currency's smallest unit, so `2500` in USD is \$25.00.

<Warning>
  When a window mixes currencies, `summary.currency` comes back `null` and the totals are a sum across currencies. Filter to a single currency before treating a total as a real amount.
</Warning>

[Get recent payment transactions](/api-reference/get-recent-payment-transactions) and [Get top payment customers](/api-reference/get-top-payment-customers) return bounded results (up to 10 rows) with no cursor for more, and they include customer names and emails when Stripe enrichment succeeds. Both endpoints read from an analytics store that can lag behind the provider, so a payment that just happened may not show up immediately.

## Rate limits

Provisioning live Stripe keys is limited to 5 requests per user per 60 seconds. See [Rate limits](/developers/references/apps-api/get-started/rate-limits) for the base limit that applies to every other operation here.
