Revolut Gateway for Gravity Forms

1. Overview

Revolut Gateway for Gravity Forms by PatSaTECH turns any Gravity Forms form into a Revolut Business checkout. When the form is submitted, the add-on creates a Revolut Merchant API order for the form total and sends the visitor to the secure Revolut Hosted Checkout Page, where they pay by card, Apple Pay, Google Pay or Revolut Pay (whichever Revolut enables on your account). Card data never touches your site.

It is built on the official Gravity Forms Payment Add-On Framework, so each entry gets its native payment status, transaction ID, notes and Sales report data. You paste one Secret API key; the webhook is registered for you. Notifications, post creation and other add-on feeds can wait until the payment is confirmed, and refunds are made from the entry screen.

2. Features

  • Revolut Hosted Checkout Page
  • Cards, Apple Pay, Google Pay, Revolut Pay
  • Payment Add-On Framework
  • Sandbox & Live keys
  • Key checked on save
  • Webhook registered automatically
  • Signed webhooks (Revolut-Signature v1)
  • Return-URL check with the API
  • Amount & currency verification
  • Per-entry lock: never paid twice
  • Full & partial refunds from the entry
  • Refund completion tracked
  • Clear decline messages
  • Unpaid entries marked Failed on a timer
  • Delayed notifications & posts
  • Post Payment Actions for other feeds
  • Optional forced 3D Secure
  • Phone numbers in E.164
  • Debug log (no secrets logged)
  • Translation-ready (.pot)

3. Requirements

ComponentMinimum
WordPress6.0 (tested up to 7.1.3)
Gravity Forms2.5 (tested up to 2.10.3)
PHP7.4
SSL / HTTPSRequired (return URLs and webhooks)
Revolut accountA Revolut Business account with an approved Merchant account (live), or a free Revolut Business sandbox (testing), and its Secret API key (sk_…)
CountryYour business must be in a country where Revolut offers Merchant accounts: see Eligibility

Tested on: WordPress 7.1.3, Gravity Forms 2.10.3, Revolut Business sandbox, PHP 8.1.34 (LiteSpeed). Requires PHP 7.4 or later.

4. Installation

  1. In WordPress admin go to Plugins → Add New → Upload Plugin.
  2. Choose gravityforms-revolut-1.0.0.zip and click Install Now.
  3. Activate Revolut Gateway for Gravity Forms. Gravity Forms must be active.

FTP: upload the gravityforms-revolut folder to /wp-content/plugins/ and activate it.

Step-by-step setup with screenshots

Live-tested on Gravity Forms with a Revolut Business sandbox Merchant account. Verified:
  • Card payment, entry marked Paid with the Revolut transaction ID (entry 9613)
  • Webhook registered automatically; signed webhooks verified (a bad signature is rejected with 401)
  • Two partial refunds requested from the entry, with refund tracking (entry 9613; Revolut had not completed them yet when the screenshots were taken)
  • Declined card (expired card): decline message above the form and entry marked Failed with the reason (entry 9619)
  • Unpaid entries marked Failed after the time limit (entries 9608–9612)

Click any screenshot to open it full size. Keys, Revolut order, payment and refund IDs, email addresses, phone numbers and IP addresses are blurred.

Part A: Revolut Business

  1. Copy your Secret API key

    In Revolut Business click your avatar → Settings → APIs → Merchant API tab and copy the API secret key (sk_…). For testing use the sandbox at sandbox-business.revolut.com. Full details: Getting your Revolut Secret API key.

    Revolut Merchant API keys
    Settings → APIs → Merchant API (keys blurred).

Part B: WordPress / Gravity Forms

  1. Activate the add-on

    Upload gravityforms-revolut-1.0.0.zip under Plugins → Add New → Upload Plugin and activate it.

    Add-on activated
    Revolut Gateway for Gravity Forms 1.0.0 active.
  2. Paste your sandbox key and save

    Go to Forms → Settings → Revolut, choose Mode: Sandbox, paste the Sandbox secret API key and click Save Settings. Leave the signing secret empty: the add-on checks the key, registers the webhook (https://your-site.com/?callback=gravityforms-revolut) and fills in the signing secret.

    Revolut plugin settings
    Mode, sandbox and live keys (masked), webhook URL with the “Register webhook now” buttons.
    Revolut settings bottom
    Automatic webhook setup, 3D Secure, statement descriptor suffix, the unpaid-entry time limit, default phone country and debug log.
  3. Create a Revolut feed

    Open your form, go to Settings → Revolut → Add New, set Transaction Type: Products and Services, choose the payment amount and map the billing fields (Email is required). See Creating a Revolut feed.

    Revolut feed settings
    Revolut feed: name, transaction type, payment amount and billing information.

Part C: Test payment

  1. Submit the form

    Fill in and submit the form on the front end.

    Payment form
    A Gravity Forms form with a product and total (email blurred).
  2. Pay on the Revolut Hosted Checkout Page

    The visitor is sent to Revolut’s page, which shows the amount and the methods enabled on your account. In the sandbox pay by card with 4929 4205 7359 5709, any future expiry and any CVC.

    Revolut Hosted Checkout Page
    Revolut Hosted Checkout Page for entry 9613 ($2.10).
    Payment successful
  3. Confirmation

    The visitor returns to your form’s confirmation. If Revolut is still confirming the payment, they see “Your payment is being confirmed by Revolut” instead.

    Confirmation
    Form confirmation after payment.
    Payment being confirmed
    Shown while Revolut is still confirming: the visitor is asked not to pay again.
  4. Entry is marked Paid

    The entry’s Payment Status becomes Paid, the Revolut order ID is the Transaction ID, and a note records the amount and method. Delayed notifications and feeds run now.

    Entry paid
    Entry 9613 Paid, with the Revolut notes (IDs and email blurred).

5. Getting your Revolut Secret API key

  1. Sandbox (for testing): sign up for free at sandbox-business.revolut.com. The sandbox needs no real business verification and moves no real money (if it shows a “We need to confirm a few details” prompt, you do not need to complete it to get the sandbox API keys). Live: sign in to business.revolut.com; your Merchant account must be approved by Revolut first (see eligibility).
  2. Click your avatar (profile picture) at the top right and choose Settings.
    Revolut Business avatar menu with Settings
    Revolut Business (sandbox): avatar menu → Settings (handle blurred).
  3. In Settings open APIs and select the Merchant API tab. Under API Keys you see the API secret key (it starts with sk_) and the API public key. Use the eye button to show the secret key or the copy button to copy it. You do not need the public key for this plugin.
    Revolut Business Settings, APIs, Merchant API tab
    Settings → APIs → Merchant API: the Sandbox API secret key (blurred) with its show and copy buttons.
  4. Paste the key into the plugin’s Sandbox secret API key (or Live secret API key) field and save.
  5. No webhook to create. Revolut Business has no webhook screen: the plugin registers the webhook through the Merchant API as soon as you save the key (see Webhooks). You can see it worked in the plugin: the message “Revolut Sandbox webhook registered for … and its signing secret saved.” (or “… already existed; its signing secret was saved.”), the webhook signing secret field filled in, and a line “Sandbox webhook … created for …” in the debug log.
  6. Repeat in your live account at business.revolut.com when Revolut has approved your Merchant account (same Settings → APIs → Merchant API path; only the sandbox screens were captured for this guide). Sandbox and live keys are different and only work in their own environment.
Keep the Secret key secret. Anyone with it can create payments and refunds on your account. Store it only in the plugin settings (it is kept in your WordPress database and never written to the log). Never put it in theme files, JavaScript, e-mails or a public repository. If it leaks, regenerate it in Revolut Business and paste the new key.

6. Plugin settings

Forms → Settings → Revolut

SettingDescription
ModeLive or Sandbox (default Sandbox). Entries keep the mode they were created in.
Sandbox / Live secret API keyFrom Revolut Business → avatar → Settings → APIs → Merchant API → API secret key. Checked with Revolut when you save.
Sandbox / Live webhook signing secretFilled in automatically (wsk_…) when the add-on registers the webhook.
WebhookYour webhook URL (https://your-site.com/?callback=gravityforms-revolut) with Register sandbox webhook now / Register live webhook now buttons.
Automatic webhook setupOn by default: registers the webhook when a key is saved and the signing secret is empty.
3D Secure“Always ask card holders for 3D Secure”. Off by default (Revolut decides).
Statement descriptor suffixOptional, up to 19 characters. {entry} is replaced with the entry ID.
Mark unpaid entries Failed after (minutes)Default 60. The Revolut checkout link expires and the entry is marked Failed if it is still unpaid.
Default countryUsed to format phone numbers in E.164 when the form has no country (default GB).
Debug logLogs webhooks, API calls and info messages (needs Forms → Settings → Logging enabled for this add-on). Errors are always logged; keys and signing secrets never are.

7. Webhooks (registered automatically, 6 events)

You do not need to create the webhook by hand (Revolut Business has no webhook screen). When you save a valid Secret key and the signing secret is empty, the add-on registers https://your-site.com/?callback=gravityforms-revolut in your Revolut Merchant account (or reuses a webhook that already points there, adding missing events) and saves the signing secret. Use the Register webhook now buttons to run it again.

#Event (registered automatically)What the plugin does
1ORDER_COMPLETEDThe plugin re-reads the Revolut order from the API; if it is completed and the amount and currency match, the order / entry is marked paid.
2ORDER_AUTHORISEDTriggers the same API check (orders use automatic capture, so Revolut completes them on its own).
3ORDER_CANCELLEDRecords that the Revolut order was cancelled before it was paid.
4ORDER_FAILEDRecords that the payment failed and ends the attempt.
5ORDER_PAYMENT_DECLINEDCard declined: adds a note with the Revolut decline reason and the message the customer was shown.
6ORDER_PAYMENT_FAILEDPayment failed (for example a 3D Secure challenge that was abandoned): adds a note with the reason.
How webhooks are verified. The Revolut-Signature header must match v1= + HMAC-SHA256 of v1.<timestamp>.<raw body> with your signing secret, within 5 minutes; otherwise the add-on answers 401. The add-on then re-reads the Revolut order from the API before it changes the entry, so a forged or replayed event cannot mark an entry paid.
Revolut allows at most 10 webhooks per Merchant account, and sends no webhooks for refunds (the add-on checks refunds itself). Allow /?callback=gravityforms-revolut through any firewall. Revolut’s documented webhook IPs: 35.242.130.242 and 35.242.162.241 (sandbox), 35.246.21.235 and 34.89.70.170 (live).

8. Creating a Revolut feed

  1. Edit the form → Settings → Revolut → Add New.
  2. Name the feed and set Transaction Type to Products and Services (one-time payments; subscriptions are not supported).
  3. Payment Amount: Form Total or a product field.
  4. Billing Information: map First Name, Last Name, Email (required), Phone and Country (used to format the phone number).
  5. Optional: Conditional Logic, and the delay options under Notifications & Post Payment Actions.
  6. Save the feed.

9. Payment flow & entry statuses

SituationEntry payment status
Visitor sent to Revolut, not paid yetProcessing
Revolut still confirmingProcessing; “being confirmed” message; re-checked automatically
Revolut order completed (amount and currency match)Paid; transaction ID = Revolut order ID
Payment declined or failed, or the Revolut order cancelledFailed, with a note (reason and the message the visitor saw). If the visitor then pays on the same Revolut page, the entry becomes Paid.
Time limit reachedFailed; the Revolut checkout link is cancelled
Fully refundedRefunded

The add-on checks each payment on return (waiting up to 8 seconds), on every webhook, 25 minutes after the redirect, and with an hourly clean-up (WP-Cron) for entries left Processing.

10. Transaction ID

The Revolut order ID is saved as the entry’s Transaction ID. Payment and refund IDs are in the entry notes. Search for them in Revolut Business under Merchant → Payments.

Finding the payment in Revolut Business

In Revolut Business open Merchant in the left menu. The orders list shows every Revolut order the plugin created, with its status (Paid, Failed, Canceled, Partially refunded…), customer, channel Merchant API, card and amount. Gravity Forms entries appear as GF-<entry ID> (for example GF-9613); the Revolut order ID is also the entry’s transaction ID.

Revolut Business Merchant orders list
Merchant orders list in the Revolut sandbox (customer name blurred).

Click an order to see its details, line items, customer and the Payment summary with every refund.

Revolut order detail with refunds
Order GF-9613 (a Gravity Forms test entry): Partially refunded, with the $1.00 refund completed and the $1.10 refund still Pending (order ID and email blurred).

11. Refunds

  1. Open a Paid entry. The Refund via Revolut box shows the refundable balance.
  2. Enter an amount (leave it blank for a full refund), an optional reason, and click Refund via Revolut.
  3. A note records the refund request. Revolut completes refunds in the background and sends no refund webhook, so the add-on checks each refund after 1, 1, 1, 2, 3, 5, 10, 30, 60, 360 and 1440 minutes and whenever you open the entry, then adds a “completed” (or failed) note.

Refunds still waiting on Revolut are listed in the box, with the time of the last check, and count against the balance, so you cannot refund more than was paid. When completed refunds reach the paid amount, the entry becomes Refunded.

Refund requested
A refund requested from the entry (IDs blurred).
Refund notes and pending-refunds list
Entry 9613: the payment and both refund requests in the notes, and the Refund via Revolut box listing the two refunds still “Waiting for Revolut to complete” with the time of the last check. Nothing is left to refund (IDs blurred).
SCREENSHOT TODO: Entry notes after Revolut completes the refunds (“completed” notes) and the entry status Refunded. Revolut had not completed the sandbox refunds for entry 9613 when the screenshots were taken.
Revolut cannot refund Pay by Bank payments and only refunds completed orders.

12. Pending, declined & expired payments

The Revolut page has no cancel button. A visitor whose card is declined can try another card on the Revolut page. If they come back to your form with the browser’s Back button, the add-on re-checks the payment and shows the reason above a fresh copy of the form: “… You can submit the form again to retry.”

Failed entry
Entry 9610 marked Failed after the time limit (IDs and email blurred).
Decline message above the form
After a declined card (expired card) the visitor came back with the Back button: the reason is shown above a fresh copy of the form, which they can submit again (email blurred).
Declined entry notes
Entry 9619 marked Failed: “Revolut payment declined (webhook ORDER_PAYMENT_DECLINED). Reason: expired_card. Customer was told: …”, then a note that the customer came back and was shown the reason (IDs blurred).

13. Decline messages customers see

Revolut decline reasonTable keyMessage the customer sees
Card declined by the issuer (do not honour, invalid PIN…)issuerYour payment was declined by the card issuer. Please try a different card or payment method.
Insufficient fundsfundsYour payment was declined because the card has insufficient funds. Please try a different card or payment method.
Expired card / wrong expiryexpiredYour payment was declined because the card has expired. Please try a different card or payment method.
Wrong security codecvcYour payment was declined because the security code (CVC) is incorrect. Please check the card details or try a different card.
Invalid or unknown card numbernumberYour payment was declined because the card number is not valid. Please check the card details or try a different card.
Card limit exceededlimitYour payment was declined because it exceeds the limit on your card. Please try a different card or payment method.
3D Secure / customer challenge failed or abandonedauthYour bank could not verify this payment (3D Secure authentication failed). Please try again or use a different card.
Revolut risk check (high risk, suspected fraud…)riskYour payment was declined for security reasons. Please try a different card or payment method.
Processing errorprocessYour payment could not be processed. Please try again in a few minutes or use a different payment method.
Cancelled or rejected in the banking appcustomerThe payment was cancelled or rejected in your banking app. Please try again or use a different payment method.
Card can’t pay in this currencycurrencyThis card cannot be used to pay in this currency. Please try a different card or payment method.
Anything elsegenericYour payment was not successful. Please try a different card or payment method.

Change any message with the gf_revolut_decline_message filter (message, Revolut payment, table key).

14. Testing with the Revolut sandbox (test cards)

Use any future expiry date (for example 12/30) and any 3-digit CVC. Card numbers are from Revolut’s sandbox test-card list.

ScenarioCardNotes
SuccessVisa 4929 4205 7359 5709 · Mastercard 5281 4388 0180 4148Used for the successful test payments.
Declined: insufficient funds4929 5736 3812 5985Shows the insufficient-funds message.
Declined: expired card4532 3367 4387 4205Shows the expired-card message.
Declined: do not honour2720 9988 3777 9594Shows the “declined by the card issuer” message.
3D Secure failed5215 6741 1512 7070Revolut reason customer_challenge_failed.
  • 3D Secure: Revolut has no dedicated 3D Secure success card. Tick Always ask card holders for 3D Secure in the settings to see the challenge.
  • Revolut Pay (sandbox): the one-time codes 1001–1005 choose the scenario; the sandbox passcode is 124455 (from Revolut’s test-flow docs).
  • Apple Pay is not available in the Revolut sandbox. Google Pay results in the sandbox depend on the amount (see Revolut’s test-flow docs).
In our sandbox tests some card payments stayed “pending” on Revolut’s side for 15–19 minutes before Revolut failed them without a reason (entries 9608–9612). This is sandbox behaviour; the add-on records the result and marks the entry Failed. Simply submit the form again.

15. Notifications & Post Payment Actions

  • Notifications: tick Send notifications only when payment is received and choose which notifications wait. You can also use the Payment Completed, Payment Failed and Payment Refunded notification events.
  • Post Payment Actions: Process [add-on] feed only when payment is received for other add-ons such as Mailchimp or User Registration.
  • Posts: Create post only when payment is received.

16. Eligibility, currencies & payment methods

Who can get a Revolut Merchant account. According to Revolut’s help centre (checked October 2026), Merchant accounts are available only to Revolut Business accounts opened in: Australia, Austria, Belgium, Bulgaria, Croatia, Cyprus, Czech Republic, Denmark, Estonia, Finland, France, Germany, Greece, Hungary, Iceland, Ireland, Italy, Latvia, Lithuania, Luxembourg, Malta, Netherlands, Norway, Poland, Portugal, Romania, Slovakia, Slovenia, Singapore, Spain, Sweden and the United Kingdom. Revolut Business customers in Switzerland, the United States and Liechtenstein cannot open a Merchant account, and businesses in other countries (for example India) are not eligible. To accept payments through the API or a plugin, Revolut also requires a fully working website. Revolut’s limit is £50,000 (or equivalent) per transaction.

Currencies. Cards, Apple Pay and Google Pay: AUD CAD CHF CZK DKK EUR GBP HKD HUF ILS JPY MXN NOK NZD PLN RON SEK SGD TRY USD ZAR (21 currencies). Revolut Pay additionally accepts AED CLP COP INR ISK KRW PHP QAR RSD SAR THB. The plugin sends amounts in each currency’s minor units (JPY, ISK, CLP and KRW have no decimals).

Payment methods. The Revolut Hosted Checkout Page shows the methods Revolut enables on your Merchant account: cards (Visa, Mastercard and others), Apple Pay, Google Pay and Revolut Pay. The plugin cannot turn individual methods on or off; that is done by Revolut.

Tested so far: Revolut sandbox only, with USD test orders: card payments, declined cards, partial and full refunds and signed webhooks. Revolut Pay and Google Pay appeared on the hosted page but were not paid with in the tests. Live payments and Apple Pay have not yet been tested by PatSaTECH. Eligibility and currency lists are Revolut’s and can change; check Revolut’s help centre before you buy.

Set the form currency under Forms → Settings → Currency; it must be one Revolut accepts.

17. Debug logs

Enable Forms → Settings → Logging, turn on logging for Revolut Gateway for Gravity Forms, and tick Debug log in the Revolut settings. View the log from Forms → Settings → Logging. Errors and webhook receipts are always logged; keys and signing secrets are never logged.

SCREENSHOT TODO: Forms → Settings → Logging → Revolut log for a test entry (IDs blurred).

18. Troubleshooting & FAQ

The key was rejected

Check the Mode matches the key (sandbox key with Sandbox), and that you copied the Secret key (sk_…), not the Public key.

The webhook could not be registered

The site must be reachable over HTTPS from the internet, and the account must have fewer than 10 webhooks. Revolut Business has no webhook screen; registration is confirmed by the success message in the settings, the filled-in signing secret and the add-on log.

Check the signing secret is filled in (or click Register webhook now), that a firewall is not blocking /?callback=gravityforms-revolut, and that WP-Cron runs. Open the entry to trigger a check; see the log.

A refund has no “completed” note

Revolut has not completed it yet. The box shows the last check; open the entry later.

Subscriptions?

No. One-time payments (Products and Services) only.

Can I hide the “Get $10 by joining Revolut” box?

No. It is Revolut’s promotion on its hosted page.

19. Tested on

  • WordPress 7.1.3
  • Gravity Forms 2.10.3
  • PHP 8.1.34 (LiteSpeed server); PHP 7.4 or later required
  • Revolut Business sandbox Merchant account, USD entries. Live payments and Apple Pay not yet tested.
  • Scenarios: card payment, automatic webhook registration, signed webhooks, declined card with decline message, partial refunds with refund tracking, unpaid entries marked Failed

20. Changelog

1.0.0 — 2026-10-18

  • Initial release on the Gravity Forms Payment Add-On Framework.
  • Revolut Merchant API order + Hosted Checkout Page (cards, Apple Pay, Google Pay, Revolut Pay).
  • Sandbox and live keys checked on save; webhook registered automatically (6 events).
  • Signed webhooks; every change re-checked with the API under a per-entry lock.
  • Clear decline messages; unpaid entries marked Failed on a timer; hourly clean-up.
  • Full and partial refunds from the entry with completion tracking.
  • Delayed notifications, posts and Post Payment Actions; E.164 phone numbers; debug logging (no secrets).

21. Support

PatSaTECH · [email protected] · www.patsatech.com

Please include your WordPress, Gravity Forms and PHP versions, the mode (sandbox or live) and the relevant log lines (never send your Secret key).

Our Partners

fraudlabs
opayo
nochex
Razorpay
durango merchant services
2checkout is now verifone
authorizenet
gravity forms
whmcs