Skip to main content
A virtual account is the trader version of “give me your account number.” Except this one is issued by OPay in partnership with a Nigerian bank, it costs you nothing, and every transfer that comes in writes to your Guild ledger automatically. You don’t have to bring a customer to your bank app. You don’t have to share your personal account. You give them ten digits and a bank name, they transfer, you see the inflow on your phone before they’ve finished walking out of the stall.

The two kinds

OPay supports two virtual-account types and we use both.

Static (B2B)

A permanent ten-digit account you give to anyone who wants to pay you. Same number for every customer, every transaction, forever. This is what Mama Bisi prints on a small card and tapes to her counter.

Dynamic

A one-time account for a specific transaction. Created on demand, with a fixed amount and a TTL. Useful when you want to enforce “transfer exactly ₦15,000, this number expires in 30 minutes.” No risk of someone underpaying or overpaying.
For the everyday market stall, static is what you want. We’ll cover both.

Opening a static virtual account

You can do this from any rail — WhatsApp, web, or by replying to a Tier 2 KYC prompt.
Send account in your Guild chat.If you’ve completed Tier 2 KYC (business name, industry, staff count, payout bank), we provision the account immediately through OPay’s virtual-account service. A ten-digit number and a bank name come back, and we save them to your account.The reply lands two seconds later:
Your Guild account is ready. Bank: Access Bank Account number: 9012345678 Account name: Adeyemi Bisi Provisions Share these details with anyone who wants to transfer to you.
If you haven’t done Tier 2 yet, we’ll walk you through the five questions first — trade, tenure, daily volume band, work location, payment mix — and then provision the account at the end.

What “account name” actually is

The name on the virtual account is your name (or your business name, if you’ve given us one as part of Tier 2). When a customer transfers, their bank app shows them this name during confirmation — “You are sending ₦5,000 to Adeyemi Bisi Provisions. Continue?” That’s the verification that they’re paying the right person. This matters because customers in Nigeria check the name on the receiving side reflexively. If the name doesn’t look right, they cancel the transfer. Tier 2 KYC verifies your name against your phone records, your trade declaration, and (later, at Tier 3) your BVN.

What happens when a customer transfers

You don’t have to do anything. The flow runs without you.
1

Customer initiates a transfer

From their bank app or a USSD code. They put your ten-digit account number, your bank name, and the amount.
2

OPay's NIBSS layer receives the transfer

Routes it to your virtual account. The transfer settles into OPay’s pooled account at the partner bank.
3

OPay fires a webhook to our endpoint

Body contains the transaction reference, the amount received, your virtual account ID, and the sender’s name and account number.
4

We verify the signature

HMAC-SHA512 over the raw body. Same hardening as every other OPay webhook — three signature schemes, timing-safe compare, idempotency check.
5

The reconcile guard runs

Even for inflows, we re-verify the transaction against OPay’s authoritative verify service before crediting anything. Status must be success. Amount must match.
6

Your wallet credits

Your wallet balance goes up by the amount received. A row writes to payments_audit with the sender’s name and account masked appropriately.
7

You get notified

SMS hits your phone: “₦5,000 from Funmilayo Adeyinka. Balance: ₦47,500.” If you’re active on WhatsApp, the same message lands there too.
Total wall-clock time from “customer hits send” to “your phone buzzes” is usually under four seconds.

When to use a dynamic virtual account

The static account is for everyday flow. The dynamic account is for “this specific person, this specific amount, this specific window.” Use a dynamic VA when:
  • You’re invoicing a customer for a specific amount and don’t want them under- or over-paying.
  • You’re collecting from a customer remotely (WhatsApp negotiation) and want to expire the offer in 30 minutes.
  • You’re handling a special-case sale (wholesale order, custom bundle) and want it tagged in your ledger as a distinct line item.
You create one from the dashboard or via WhatsApp:
“Create a one-time account for ₦15,000, expires in 30 minutes, for Funmi’s wholesale order.”
We open a dynamic VA through OPay with the amount and TTL. You get back a fresh ten-digit number to send to that one customer. When the transfer lands (or the TTL expires), the account closes. The webhook for a dynamic VA comes with transaction_type = "dynamic_virtual_account" and one of three statuses: SUCCESS, EXPIRED, or MISMATCH. We handle all three — MISMATCH (wrong amount sent) goes into a review queue and you can decide whether to accept it or refund.

Costs

No fee to open a virtual account. No fee per inflow. No monthly account fee. OPay’s bill for the rails is wrapped into our overall revenue model — we don’t pass it through to traders.

Switching off the virtual account

You can deactivate your virtual account from guild.com.ng/settings. The number stops accepting new transfers. Pending inflows that were already initiated will still land. The account record stays in our database for audit purposes but the routing is closed. You can re-enable it later. Same number comes back.
Your Guild virtual account is not the same as your personal bank account. Inflows here go to your Guild wallet, not your Access Bank or OPay account. To move money from Guild to your personal bank, use Withdraw (the same flow Job Seekers use).

Next

Take payments

The full picture of how customers pay you — transfers, wallet-to-wallet, QR.

Sales velocity

How inflow patterns shape your standing tier and unlock inventory-advance offers.