Checkout and billing fields
Updated November 3, 2026
Choose the fields buyers fill in at checkout, and decide whether they need an account to pay.
How a buyer pays
The checkout holds the payment form and an order summary. You can place it as the Checkout block, the [releasecart_checkout] shortcode or an Elementor widget. The Checkout page setting under ReleaseCart → Settings → General tells ReleaseCart which page holds it. Storefront pages covers that setting.

- The buyer fills in Email address and any other fields you turned on, then clicks Pay now.
- ReleaseCart checks the cart and the fields, creates a pending order and starts a payment at Stripe. The Stripe payment form then opens in the Payment section with the note "Enter your payment details above to finish."
- The buyer enters their payment details and clicks Pay now again. Stripe runs any check the buyer's bank asks for, such as 3D Secure.
- Stripe sends the buyer back to the checkout page. It shows "Thank you for your purchase!" and updates when the order completes.
This is the checkout after step 2, with a discount code applied. The fields Stripe shows depend on the payment methods you turn on in your Stripe Dashboard and on the buyer's country.

The order completes when Stripe's webhook confirms the payment, not when the buyer's browser comes back. Stripe payments explains the webhook.
If the total changes between loading the page and paying, for example because a discount code ran out, the checkout shows the new total and asks the buyer to review it before they enter payment details. Paying needs JavaScript. Without it, the checkout says so.
When the PayPal gateway in ReleaseCart Pro is set up next to Stripe, the Payment section asks the buyer to pick a Payment method. PayPal payments covers it.
Checkout settings
Open ReleaseCart → Settings → General. The checkout options are in the Checkout group. Change them and click Save changes. They apply to every checkout on the site, whether you placed it as a block, a shortcode or an Elementor widget.
| Setting | Default | What it does |
|---|---|---|
| Require terms acceptance at checkout | Off | Adds a checkbox the buyer must tick before paying. |
| Collect a billing country | Off | Adds a country list. |
| Collect a VAT or tax ID | Off | Adds an optional tax ID field. |
| Collect a billing address | Do not collect an address | Adds address fields, optional or required. |
| Show a login panel at checkout | On | Lets a returning customer log in before paying. |
| Create an account for guests | Off | Creates a WordPress account when a guest's purchase completes. |
| Allow guest checkout | On | Lets buyers pay without an account. |
| Require a first name at checkout | Off | Makes the first name mandatory. |
| Require a last name at checkout | Off | Makes the last name mandatory. |
| Offer a company purchase option | On | Adds an "I am buying as a company" checkbox. |
The buyer's name
The Contact section always has Email address, First name and Last name. Both name fields are optional and say so in their labels. Turn on Require a first name at checkout or Require a last name at checkout to make one mandatory. The browser then will not submit the form while it is empty, and the server refuses a payment that arrives without it. While your Stripe account is in India, both names are required whatever these settings say. Stripe accounts in India explains why.
ReleaseCart saves the names on the customer record. When ReleaseCart creates a WordPress account for the buyer, it copies the names to the account. ReleaseCart Pro invoices print them.
ReleaseCart also stores the names typed at each checkout on that order, and sends them to Stripe with the payment. What ReleaseCart sends to Stripe lists the details.
Terms and conditions
Turn on Require terms acceptance at checkout to add a checkbox to the Payment section. Its label reads "I agree to the Terms and Conditions and Privacy Policy." Each name links to the page you chose as Terms page or Privacy policy page under ReleaseCart → Settings → General, and opens in a new tab. If Privacy policy page is empty, the name links to the page set under Settings → Privacy in WordPress. A name with no page at all shows as plain text.
The browser will not submit the form until the box is ticked, and the server refuses a payment without it. ReleaseCart records when the buyer accepted, and the order screen shows it as Terms accepted.
Billing country
Turn on Collect a billing country to add a Country list to the Billing section. Buyers can leave it blank. The order screen shows the choice as Billing country. While your Stripe account is in India, the list always shows and the buyer must choose a country.
The list holds every country in ReleaseCart's catalog. To sell to fewer countries, narrow it with the releasecart_checkout_countries filter. The filter can only remove countries, and if it leaves none, the full list comes back.
add_filter( 'releasecart_checkout_countries', function ( array $countries ): array {
return array_intersect_key( $countries, array_flip( array( 'US', 'CA', 'GB' ) ) );
} );
The country list and the tax ID field follow the two settings. An extension can turn either one on with the releasecart_checkout_collect_field filter, but it cannot turn off a field you collect. The filter gets the setting's value and the field key, billing_country or vat_number. Answer for the field you need and return the value unchanged for the other, or you undo another extension's request.
add_filter( 'releasecart_checkout_collect_field', function ( bool $collect, string $key ): bool {
return 'billing_country' === $key ? true : $collect;
}, 10, 2 );
While a field is on for an extension, its setting under ReleaseCart → Settings → General says so. ReleaseCart Pro taxes uses the filter: while tax calculation is on, the country list and the tax ID field always show, and Pro makes the country required.
An extension can also make the first name, the last name or the country required with the releasecart_checkout_field_required filter. The filter gets the setting's value and the field key: first_name, last_name or billing_country. Like the collect filter, it can add a requirement but cannot remove one you set. The country is required only while the list shows, so an extension that requires it must also turn it on with releasecart_checkout_collect_field. The browser will not submit the form while a required field is empty, and the server refuses a payment without it.
add_filter( 'releasecart_checkout_field_required', function ( bool $required, string $key ): bool {
return 'last_name' === $key ? true : $required;
}, 10, 2 );
Company purchases and tax IDs
Offer a company purchase option is on by default. It adds an I am buying as a company checkbox to the Billing section. Ticking it opens a Company name field, plus the tax ID field when Collect a VAT or tax ID is on.
Collect a VAT or tax ID adds the field VAT, GST, or tax ID (optional). It is always optional. With the company option on, the field sits behind the company checkbox. With the company option off, it shows on its own.
ReleaseCart stores the company name and the tax ID on the order, not on the customer, because the same buyer may buy privately next time. It stores each one only when its field is on and the buyer filled it in. The order screen shows them as Company and Tax ID, and the orders CSV export has both. A ReleaseCart Pro invoice prints the company name, and ReleaseCart Pro taxes use the tax ID for the EU reverse charge.
Billing address
Collect a billing address has three options.
| Option | Result |
|---|---|
| Do not collect an address (default) | No address fields. |
| Collect an optional address | The fields show, and the buyer can leave them blank. |
| Require an address | The buyer must fill in Address and City. |
The fields are Address, Address line 2 (optional), City, State or region (optional) and Postal code (optional). The postal code stays optional for buyers in countries that have none. ReleaseCart stores the address on the order. The order screen shows it as Billing address, and the orders CSV export has it in one column. The fields start empty on every purchase.
With ReleaseCart Pro, the invoice option Show the buyer's billing address on invoices is on by default. While it is on, the checkout requires an address whatever this setting says, and the setting's description tells you so.
While your Stripe account is in India, the checkout also requires an address whatever this setting says. Stripe accounts in India explains why. The setting's description then gives the Stripe reason, even with the invoice option on.
Accounts at checkout
By default a buyer can pay as a guest with an email address only. Three settings change that.
Show a login panel
With Show a login panel at checkout on, a logged-out buyer sees a collapsed panel above the form that reads "Returning customer?" with a Log in link. It opens a login form. After login, the buyer comes back to the checkout with their email filled in. Logged-in buyers never see the panel.
Create an account for guests
With Create an account for guests on, ReleaseCart gives a guest a WordPress account when their purchase completes, so their orders, downloads and licenses show in the account area.
- If a WordPress account already uses the buyer's email, ReleaseCart links the customer record to it and leaves the account alone.
- Otherwise it creates an account with the buyer's name. The account gets your site's default role when that role can only read, as Subscriber can. If the default role can do more, such as Author, the account gets Subscriber. WordPress emails the buyer a link to set a password. No password is sent.
ReleaseCart creates the account when the payment completes, so an abandoned checkout never makes one. If the account cannot be created, the purchase still completes and ReleaseCart logs the error. The buyer is not logged in automatically. Developers can change the new account with the releasecart_auto_register_user_args filter, or stop the email with releasecart_auto_register_notify. The filter cannot give the account a role that can do more than read.
Require an account
Turn off Allow guest checkout to require an account. What a logged-out buyer sees then depends on Create an account for guests.
| Create an account for guests | What a logged-out buyer sees |
|---|---|
| On | The normal checkout, with a note that ReleaseCart will create an account when the purchase completes and email a link to set a password. The login panel also shows, even when Show a login panel at checkout is off. |
| Off | "Please log in to check out" and a login form in place of the payment form. The order summary stays visible. |
With both settings off, a buyer must have an account before they can pay. The login form shows a Create an account link to your Registration page when one is set. Without one, it links to the WordPress registration form when the WordPress setting Anyone can register is on (Settings → General in WordPress). With neither, only people who already have an account can buy.
While guest checkout is off, a logged-in buyer's email field is locked to their account email, so the order always belongs to their account.
The order summary
The summary lists each line with its plan and price. By default it also repeats the plan details from the product details page: the license length and the activation limit, for a licensed product. With ReleaseCart Pro, a recurring plan also shows its billing schedule and any free trial. Under the lines come any discount, a tax line when tax applies, and the total.
The tax line reads Tax. Developers can rename it with the releasecart_checkout_tax_label filter, for example to "VAT" or "Sales tax". The cart summary's last row has its own filter, releasecart_cart_summary_total_label (Cart summary). Both strip HTML tags and keep the default for an empty value.
add_filter( 'releasecart_checkout_tax_label', fn () => 'VAT' );
In the editable summary, each line has a Quantity field with an Update button, and a Remove button. A plan sold as a single unit shows only Remove. Each change reloads the checkout with new totals, so it works without JavaScript. The server holds the quantity to the plan's minimum and maximum.
If a plan's quantity limits changed after the buyer added it, the checkout uses the allowed quantity and shows a notice above the form that names the product and the new quantity.
Checkout options
The Checkout block, the [releasecart_checkout] shortcode and the Elementor widget have the same options. The shortcode uses the attribute names.
| Option | Attribute | Default | What it does |
|---|---|---|---|
| Title | title |
Checkout | The heading above the checkout. Leave it empty to hide it. |
| Button text | button_text |
Pay now | The label on the Stripe payment button. |
| Show order summary | show_summary |
On | Shows the summary beside the form. With it off, the discount box sits below the form. |
| Editable order summary | editable_summary |
On | Lets buyers change quantities and remove lines. Off shows each quantity as a plain badge, such as "x 2". |
| Show plan details | show_plan_details |
On | Repeats each line's license length and activation limit. With ReleaseCart Pro, a recurring line also shows its billing. |
| Show discount code field | show_discount |
On | Shows the Discount code box. |
| Layout | layout |
two-column |
two-column puts the form beside the summary where there is room. single stacks them. |
[releasecart_checkout editable_summary="false" layout="single"]
The Cart summary block has its own Show plan details option. The shortcodes page lists every attribute.
Discount codes at checkout
The Discount code box sits under the order summary. The buyer types a code and clicks Apply. The summary then shows a discount line and the new total. An accepted code turns into "Code SAVE10 applied" with a Remove button. A rejected code shows the reason under the box.
The applied code stays with the cart, so it survives a reload or a new tab. A cart lasts 48 hours from when the buyer first added a product to it. ReleaseCart checks the code again when the buyer clicks Pay now. A code that has run out or expired by then is dropped, and the buyer sees the new total before entering payment details. Apply and Remove also work without JavaScript.
Discount codes lists the messages buyers see and the limits a code can have.
Common questions
Why is the billing country required when I left it off?
Your Stripe account is in India, or tax calculation is on in ReleaseCart Pro. Stripe needs the country of buyers abroad, so ReleaseCart requires it for an Indian Stripe account. Pro needs the country for tax, so it turns on the country list and the tax ID field and makes the country required. The settings under ReleaseCart → Settings → General say which applies.
Why does checkout say "Too many checkout attempts"?
ReleaseCart limits each IP address, in 10 minutes, to 10 payment starts, 10 rejected discount codes and 60 total recalculations. A code that is accepted does not count. Past a limit, the request fails with HTTP 429 and the code releasecart_rate_limited, and the buyer sees "Too many checkout attempts. Please wait a moment and try again." Developers can change the limits with the releasecart_rest_rate_limits filter (the scopes are checkout_intent, checkout_discount and checkout_quote).
Why does the checkout ask for an address when address collection is off?
Your Stripe account is in India, or the ReleaseCart Pro invoice option Show the buyer's billing address on invoices is on. Stripe needs the address of buyers abroad for an Indian account, so that requirement stays while the account is in India. For the invoice option, turn it off under the invoice settings to let Collect a billing address decide again.