How payments work

Parsley Pay uses Stripe to handle all payment processing. Payments go directly into your Stripe account — Parsley Pay never holds or touches your funds.

The payment flow

  1. You create an invoice and click Send.
  2. Parsley Pay creates a Stripe Checkout session using your Stripe API key and generates a unique payment link for the invoice.
  3. Your customer receives the invoice email and clicks Pay Now.
  4. They are taken to a Stripe-hosted Checkout page where they enter their payment details.
  5. Stripe processes the payment and sends a webhook notification to Parsley Pay.
  6. Parsley Pay receives the webhook, verifies it using your webhook signing secret, and marks the invoice as Paid.
  7. You receive a confirmation email. The funds are in your Stripe account.

Payment methods accepted

The payment methods available to your customers depend on your Stripe account configuration. By default, Stripe Checkout supports major credit and debit cards. You can enable additional payment methods (such as BACS Direct Debit, SEPA, or Apple Pay) from your Stripe dashboard under Settings → Payment methods.

Stripe fees

Stripe charges a transaction fee on each payment processed — this is separate from your Parsley Pay subscription. The fee depends on your Stripe plan and country. You can find the current rates at stripe.com/pricing.

Parsley Pay does not charge any per-invoice or per-transaction fees on top of Stripe's rates.

Your keys, your control

Because you provide your own Stripe API key, payments are processed entirely within your Stripe account. Parsley Pay only initiates and listens for payment events — we never receive or hold funds. Your Stripe API key is encrypted at rest using AES-256-GCM and only decrypted in memory when a payment action is required.

What if the webhook doesn't fire?

In rare cases, Stripe's webhook delivery might be delayed or fail. If you know a customer has paid but the invoice still shows as outstanding, check your Stripe dashboard under Developers → Webhooks to see if the event was delivered. You can also replay failed webhook events from that screen.