WPRuby Blog

Explore our blog for expert tips on WordPress plugins, development, and eCommerce solutions to grow your online business.

How to Upload Payment Proof in WooCommerce Checkout

Blog Image

WooCommerce’s built-in Direct bank transfer method shows your account details and then waits. It does not let the customer attach a receipt, a banking-app screenshot, or a PDF confirmation. You find out they paid when you check the bank — or when they email you a photo.

That delay is the problem. For bank wires, e-wallets, payment links, and crypto, the fastest way to confirm a transfer is to see the proof on the order itself.

This guide shows you how to add a file upload field at WooCommerce checkout using WooCommerce Custom Payment Gateway Pro. The customer selects your method, pays using the details you display, uploads the receipt, and places the order. The file is stored on the order for your team to review.

Why collect payment proof at checkout?

Card gateways confirm payment automatically. Manual methods do not. Without a receipt, every order is a guess until someone matches a bank statement to a customer name.

A checkout upload is useful when:

  • Customers pay by bank or wire transfer and send a screenshot from their banking app
  • You show a hosted payment link (Wise, PayPal.me, Stripe Payment Links, local e-wallets) and want proof before you ship
  • You accept crypto and want a screenshot alongside the transaction hash
  • You sell in markets where “pay, screenshot, then place the order” is the normal checkout habit
  • Your team wastes time chasing receipts in email after the order is already on hold

The plugin does not process the payment. It shows your instructions, collects the file, and holds the order until you confirm the money arrived.

Do not use this field for photos of credit cards, CVV codes, or ID documents you do not actually need. Use a PCI-compliant gateway for cards. Use the upload field for receipts and transfer confirmations only.

How the checkout flow works

A good payment-proof checkout does three things in this order:

  1. Shows how to pay — bank details, a payment-link button, a QR code, or a wallet address.
  2. Lets the customer pay now — they switch to their banking app or wallet, send the money, and come back.
  3. Collects the proof — they upload the screenshot or PDF, optionally type a reference, then place the order.

That is different from WooCommerce’s default bank-transfer copy, which tells people to pay after they have an order number. If they pay after checkout, they cannot attach a receipt yet. For a proof-at-checkout method, write the instructions so they pay before they click Place order, using a name, phone, or email as the transfer reference if they do not have an order number yet.

After checkout, the order sits On hold. You open it, open the uploaded file, match it to the incoming payment, then mark the order Processing or Completed.

Before you start

You will need:

  • A WooCommerce store with WooCommerce Custom Payment Gateway Pro installed and licensed
  • The payment details customers will use (bank account, payment link, or wallet)
  • A decision on whether the upload is required (no order without a file) or optional (they can send proof later)

Write the customer-facing copy first: what they pay, what file you want (screenshot vs PDF), and how long you take to confirm.

Step 1: Create a gateway that already includes the upload

The fastest path is a template that already has a file field.

  1. In WordPress, go to WooCommerce → Settings → Custom Payment Gateways.
  2. Under Create gateway, pick the template that matches how customers pay:
TemplateUpload field it addsUse it when
Bank Transfer / Wire TransferUpload payment receiptCustomers pay to your bank account
Manual Payment LinkUpload payment proofYou show a hosted link or QR at checkout
Crypto Manual PaymentUpload payment proofCustomers send crypto; you confirm by hand
  1. Enter a name such as Bank Transfer or Pay via Wise.
  2. Create the gateway, then click Configure (or go to WooCommerce → Settings → Payments and click Manage).

The template also adds a text field for a payment reference or transaction hash. Keep that. A file plus a reference is easier to match than a screenshot alone.

custom payment woocommerce templates

If you already have a custom gateway (including Pay by Invoice), skip this step and add a File Upload field in the field builder instead (Step 5).

Step 2: Enable the method and keep it admin-only while you test

On the gateway settings page:

  1. Check Enable Custom Payment.
  2. Check Enable Debug Mode.

Debug mode hides the method from customers. Only administrators see it at checkout, so you can upload a test file without offering the method to the store.

Leave debug mode on until a test order shows the file on the order screen and in emails (if you want it there).

Step 3: Set the title and tell customers to pay, then upload

Method Title is the label next to the other payment methods. Use the name they already know:

  • Bank Transfer
  • Pay with Wise
  • GCash / e-wallet
  • Crypto payment

Customer Message is shown when they select the method, before they place the order. Tell them to pay now and attach the proof:

Pay using the details below, then upload a screenshot or PDF of the transfer. Use your name or order email as the payment reference. We will process the order after we confirm the payment.

For a payment-link method:

Open the payment link, complete the payment, then upload a screenshot of the confirmation. Your order will be processed after we verify the payment.

Keep this short. Account numbers, IBANs, links, and QR codes belong in payment details, not in this message.

Step 4: Fill in the payment details they need in order to pay

Customers cannot upload proof of a payment they cannot make. Fill in the template’s Payment details fields on the same settings page. Those appear at checkout, on the thank-you page, and in emails (when that option is enabled).

Bank transfer: bank name, account holder, IBAN or account number, SWIFT/BIC, and a line that says what to put as the reference (name or email, since they may not have an order number yet).

Manual payment link: provider name, the payment URL (shown as a button), optional QR image, and a sentence such as “Pay the cart total, then return here and upload the receipt.”

Crypto: coin/network, wallet address, optional QR, and a note to send the exact amount.

Set Order Status After The Checkout to On hold. You have a file to review, not a captured card payment. Avoid Completed — WooCommerce will treat the sale as finished before you have checked the receipt.

Step 5: Configure the file upload field

Scroll to Custom Form. The field builder has three panels: a field palette, a checkout preview, and field settings.

If you used a template, select Upload payment receipt or Upload payment proof in the preview. If you started from scratch or added this to an existing gateway, click File Upload in the palette.

Configure the file upload field

Set the field as follows.

SettingRecommended valueWhy
Field labelUpload payment proof or Upload payment receiptCustomers understand “proof” and “receipt” better than “file”
Help textScreenshot or PDF of the transfer. JPG, PNG, or PDF, max 5 MB.Tells them the format before they try
RequiredSee belowBlocks checkout if they skip the file
Allowed file extensionsjpg,jpeg,png,webp,pdf (default)Covers phone screenshots and bank PDFs
Max file size (MB)5Large enough for a screenshot, small enough to keep uploads fast
Show in admin order detailsYesYou need the link on the order
Show in emailsYes if your team works from inbox; otherwise NoA file link in the new-order email speeds review
Store with orderYesSaves the attachment on the order

Leave dangerous types out of the extensions list. The plugin already blocks files such as PHP, JS, HTML, SVG, EXE, and ZIP even if someone tries to add them.

Required vs optional

  • Set Required to Yes when you will not process the order without a receipt (common for bank transfer, e-wallet, and crypto). Checkout fails until they attach a valid file.
  • Set Required to No when some customers pay after they have an order number, or when a text reference is enough and the file is a bonus.

A typical bank-transfer form:

Field typeField labelRequiredHelp text
TextPayment reference / transaction IDNoThe reference shown on your transfer
File uploadUpload payment receiptYesScreenshot or PDF, JPG/PNG/PDF, max 5 MB
TextareaOptional noteNoAnything we should know when matching the payment

Save changes in the field builder when you are done.

Do not add fields for card numbers, expiry, or CVV. The plugin’s old credit-card field is deprecated and cannot be added to new gateways.

Step 6: Add a thank-you note

Customer Note is shown after checkout on the thank-you page and as a customer-visible order note. It is different from the checkout Customer Message.

  • Customer Message — pay now, then upload, before they place the order
  • Customer Note — what happens next, after they have uploaded and ordered

Example:

Thank you. We have your payment proof and will confirm the transfer within 1 business day. If we need a clearer screenshot, we will email you. Quote your order number in any reply.

Include a real accounts inbox or store phone so they are not waiting in silence if the file is unreadable.

Step 7: Show the method only where it belongs (optional)

An enabled gateway appears for everyone unless you add rules. You may want the proof-of-payment method only in countries where you actually accept that transfer type.

On the gateway settings page:

  1. Enable Conditional Display Rules.
  2. Add one or more conditions. In the current version, all conditions must match.

Useful examples:

  • Customer country is the country whose bank or e-wallet you support
  • Cart total greater than a threshold, if you only want wires above a certain amount
  • Logged-in status is logged in, if guests should use cards only

If the rules do not match, the gateway stays hidden. Stripe, PayPal, and other methods still show as usual.

Show the method only where it belongs

Step 8: Place a test order and open the file

  1. Confirm Enable Debug Mode is still on.
  2. Log in as an administrator.
  3. Add a product to the cart and go to checkout (classic shortcode or block checkout — the plugin supports both).
  4. Select your method.

Check that:

  • Payment details (bank, link, or wallet) appear so you could actually pay
  • The file field is visible, with your label and help text
  • A disallowed type (for example .txt) or a file over the size limit is rejected
  • Checkout is blocked if the field is required and empty
  • The order is created with status On hold
  • The file appears in the Payment Information section on the order
  • You can open the file (it is stored in the WordPress media library)

If you enabled Add payment info to emails under WooCommerce → Settings → Custom Payment Gateways, and the field’s Show in emails is Yes, confirm the file link is in the new-order email.

When that all works, turn Enable Debug Mode off and save. Customers who match your rules (or everyone, if you did not add rules) can then upload proof at checkout.

After the order: review the proof, then fulfil

The upload gets the receipt onto the order. Your team still decides whether the payment is real.

  1. Open the new On hold order.
  2. In Payment Information, open the uploaded file and read the reference field.
  3. Match amount, date, and name or reference against the bank, wallet, or blockchain.
  4. If it matches, mark the order Processing or Completed and fulfil as usual.
  5. If the screenshot is cropped, the amount is wrong, or you cannot find the transfer, leave the order on hold and email the customer. Ask for a clearer file or the missing reference.

Do not mark the order paid only because a file exists. Treat the upload as evidence to check, not as a captured payment.

If Store Payment Information in the Database is turned off globally, or the field’s Store with order is No, the file will not be waiting on the order. Leave both on for this workflow.

Payment proof vs WooCommerce’s built-in bank transfer

WooCommerce Direct bank transfer (BACS) is enough when you only need to show account details and you are happy to match payments later with no file on the order.

Use a custom gateway with a file upload when you need any of the following:

  • A screenshot or PDF attached at checkout
  • A payment reference or transaction hash in the same form
  • A hosted payment link or crypto wallet with proof of payment
  • Instructions that tell the customer to pay before they place the order
  • The method limited by country, cart total, or login

You can run both. Many stores keep cards for retail, BACS for customers who will pay after they have an order number, and a proof-of-payment gateway for wires and e-wallets that you confirm from a screenshot.

Frequently asked questions

Can customers upload a file with the default WooCommerce bank transfer method?
No. BACS only shows instructions. You need a custom gateway with a File Upload field.

Does the customer pay inside WooCommerce?
No. They pay in their bank, wallet, or hosted link. The plugin collects the proof so you can confirm it.

What file types are allowed?
By default: jpgjpegpngwebp, and pdf, up to 5 MB. You can change extensions and size in the field settings. Executable and script types are blocked.

Where is the file stored?
As a WordPress media library attachment. The link is on the order when Show in admin order details and Store with order are enabled.

Should the upload be required?
Yes, if you will not ship or fulfil without a receipt. No, if some customers pay after checkout using the order number as the reference — they cannot attach a file they do not have yet.

Will this work with the WooCommerce block checkout?
Yes. Test on whichever checkout your theme uses (classic shortcode or blocks) before you turn off debug mode.

Can I use this together with Stripe or PayPal?
Yes. The custom method sits alongside your card gateways. Use conditional rules if only some customers should see it.

Can I add an upload to Pay by Invoice?
Yes. Invoice checkouts usually collect company and PO details rather than a receipt, but you can add a File Upload field for a purchase-order PDF. See How to add a Pay by Invoice payment method to WooCommerce.

Get payment-proof uploads on your checkout

If you confirm bank transfers, e-wallets, payment links, or crypto by hand, put the receipt on the order instead of collecting it by email.

WooCommerce Custom Payment Gateway Pro includes Bank Transfer, Manual Payment Link, and Crypto templates with a file upload already in the form, plus a field builder if you want to add proof of payment to an existing method.

Install the plugin, create the gateway from the matching template, test an upload as an administrator, then turn off debug mode when you are ready for customers to attach receipts at checkout.

Need help matching this to a specific bank or wallet workflow? Contact WPRuby support.

Leave a Reply

Your email address will not be published. Required fields are marked *