---
url: /razorpay-acellemail/features/direct-payment.md
description: >-
  Take one-time invoice payments in AcelleMail through Razorpay checkout — UPI,
  cards, net banking and wallets — confirmed server-side and signature-verified.
---

# Direct Payment

The **Razorpay** gateway is the one-time payment side of this plugin. Whenever a customer needs to
settle a single AcelleMail invoice — a plan purchase, a top-up, any one-off charge — they pay through
Razorpay's hosted checkout and the plugin confirms the result before the invoice is marked paid. There
is nothing to map and no recurring commitment: this gateway simply collects a single INR payment.

## What your customer sees

When a customer chooses **Razorpay** at checkout, the plugin opens Razorpay's own payment window under
the heading **"Complete Your Payment"**. From there they can pay using any method Razorpay offers in
India:

* **UPI** — Google Pay, PhonePe, Paytm and any UPI app
* **Cards** — credit and debit cards
* **Net banking** — direct bank transfer
* **Wallets** — popular Indian wallets

![The Razorpay checkout window opening for a one-time payment](/razorpay-acellemail/img/razorpay-direct-payment-checkout.png)
*Admin → Payment Gateways → Razorpay*

Because the payment happens inside Razorpay's checkout, **card details are never handled by your
server** — Razorpay collects and processes them directly.

## What happens after they pay

Once the customer finishes (or abandons) the payment, they see one of three plain messages:

* **"Payment successful. Thank you!"** — the payment went through and the invoice is settled.
* **"Payment could not be completed. Please try again."** — the attempt failed; the customer can retry.
* **"Payment was cancelled."** — the customer closed checkout without paying.

The success message is only shown *after* the plugin has confirmed the payment on your server — the
browser's word is never taken at face value.

## How the payment is trusted

The moment Razorpay reports a result, the plugin verifies it before crediting anything:

1. Razorpay returns the payment together with an **HMAC signature**.
2. The plugin re-computes that signature from your API keys and compares it. A mismatch is rejected.
3. The outcome is then **confirmed server-side** against Razorpay — the browser callback alone is
   never trusted to mark an invoice paid.

This is why a customer who tampers with the return page, or replays an old success URL, cannot fake a
payment. See [Security](/razorpay-acellemail/features/security) for the full verification model.

## Currency

The Razorpay gateway is **INR-only** — it collects payments in Indian Rupees. No plan mapping is
required for direct payments; the amount comes straight from the AcelleMail invoice.

::: tip Test before you go live
While your API keys start with `rzp_test_`, every payment runs in Razorpay's test mode. Switch to your
`rzp_live_` keys when you're ready — see [Going live](/razorpay-acellemail/guides/going-live).
:::

## Related pages

* [Subscriptions](/razorpay-acellemail/features/subscriptions) — recurring billing via Razorpay
* [Security](/razorpay-acellemail/features/security) — signature verification and server-side confirmation
* [Configuration](/razorpay-acellemail/configuration) — enter your keys and enable the gateway
* [Get your API keys](/razorpay-acellemail/guides/get-api-keys) — Key ID and Key Secret
* [Errors](/razorpay-acellemail/errors) — payment message reference
