How to book x402 payments: USDC, exchange rates and receipts

Your agent paid in USDC, your books are in euros. What each payment needs, which rate to use, the two booking lines and the documents to keep.

Florian BarazNov 3, 20266 min read

At the end of the month, the wallet of an agent that buys data shows something few accountants have seen before: hundreds of transfers of a few cents each, to addresses like 0x110c…b784. No invoices, no supplier names, and all of it in USDC, not in euros.

This guide is about turning that into clean books. It is written with German rules in mind, because they are among the strictest. The principles carry over to most of the EU, the details differ. It is general information, not tax advice, so agree your method with your tax adviser before the first month end.

What the chain gives you

For every x402 payment the chain records the paying wallet, the receiving wallet (the seller's payTo), the amount in USDC, the block time and the transaction hash. That is all.

What the agent bought, the seller's name and the price list live somewhere else: in the 402 answer the agent received before it paid. How x402 works shows what such an answer contains.

So the first rule is a practical one. Keep the 402 answer together with the transaction hash, or at least the URL, the description and the price. Without it you can prove that money left, but not what it was for.

Rule 1: every booking needs a document

German bookkeeping rules (the GoBD) allow no booking without a document. For a normal supplier, that document is the invoice. x402 sellers usually send none. You have three options, from strongest to weakest.

Document
When you have it
What it gives you
Invoice from the seller
the seller issues one, or lets someone issue it in its name
full proof, and input VAT for German sellers
Monthly statement per seller
you or a service collect all payments to one seller in a month
one document per seller and month instead of hundreds
Own document (Eigenbeleg)
there is no outside document
accepted as an exception when it holds all the facts and says why nothing else exists

Invoice from the seller

When you have it
the seller issues one, or lets someone issue it in its name
What it gives you
full proof, and input VAT for German sellers

Monthly statement per seller

When you have it
you or a service collect all payments to one seller in a month
What it gives you
one document per seller and month instead of hundreds

Own document (Eigenbeleg)

When you have it
there is no outside document
What it gives you
accepted as an exception when it holds all the facts and says why nothing else exists

An own document names the date, the amount, the recipient, what was bought and why there is no outside document. For x402 that last part is easy: the protocol has no invoices. Attach the transaction hashes, and anyone with a block explorer can check every line.

Rule 2: convert each payment to euros at the time of payment

Your books are kept in euros and the payment was made in USDC. Each payment needs a euro value at the moment it happened, and the rate you used has to be on record. Three methods are common.

Method
Strength
Weakness
ECB reference rate for USD, one USDC counted as one dollar
public, simple, easy to check
exact only while USDC holds its peg, which it has done closely in normal markets
USDC to EUR rate of an exchange at block time
closest to what you could have sold for
a second source you have to archive
Monthly VAT conversion rate for USD from the German finance ministry
convenient for monthly closing
it is a dollar rate, not a USDC rate

ECB reference rate for USD, one USDC counted as one dollar

Strength
public, simple, easy to check
Weakness
exact only while USDC holds its peg, which it has done closely in normal markets

USDC to EUR rate of an exchange at block time

Strength
closest to what you could have sold for
Weakness
a second source you have to archive

Monthly VAT conversion rate for USD from the German finance ministry

Strength
convenient for monthly closing
Weakness
it is a dollar rate, not a USDC rate

Pick one, describe it in your process documentation and use it for every payment. Changing methods from month to month is what creates questions in an audit.

Rule 3: two lines per payment

This is where USDC differs from a bank transfer. In most German companies USDC is not booked as cash. It is an asset that you bought at some point, at some rate. Paying with it means part of that asset leaves your books. So one payment produces two things.

  1. The expense, at the euro value at the time of payment.
  2. The disposal of USDC, at the value it has in your books, which is what you paid for it. The difference between the two is a small gain or loss from the exchange rate.

If you bought USDC at different times and rates, your accountant decides which purchase each payment uses up, for example first in, first out.

Worked example

This example uses Acme GmbH, an invented company, with invented rates.

On October 1, Acme buys 2,000 USDC for 1,724.00 €, so 0.8620 € per USDC. On October 14 its research agent makes 120 calls to a market data API at 0.25 USDC each, 30 USDC in total. The ECB reference rate that day is 0.8590 € per dollar.

The expense is 30 × 0.8590 = 25.77 €. The 30 USDC were worth 30 × 0.8620 = 25.86 € in the books. The difference of 0.09 € is an exchange rate loss.

Line
Debit
Credit
Amount
1
Data and software services (expense)
USDC (asset)
25.77 €
2
Exchange rate loss
USDC (asset)
0.09 €

1

Debit
Data and software services (expense)
Credit
USDC (asset)
Amount
25.77 €

2

Debit
Exchange rate loss
Credit
USDC (asset)
Amount
0.09 €

Over the whole month the agent pays 390 USDC to this seller. At the daily rates that is 335.40 € of expense and 0.78 € of exchange rate loss.

Thousands of lines of half a cent make a ledger unreadable. Many accountants book one pair of lines per seller and day, with the single payments listed in the attached document. Ask yours what they accept.

Rule 4: name the supplier, not the wallet

A wallet address is not a supplier. Under § 160 of the German Fiscal Code (AO), the tax office can refuse an expense if you cannot say who received the money. 0x110c…b784 is not a name.

For every wallet you pay, find out who is behind it and put it on the document: company name, country, and if possible address and VAT ID. Who is behind this wallet? shows how. The seller's country also decides the VAT treatment, which is the next rule.

Rule 5: VAT is usually reverse charge

Most x402 sellers today are based outside Germany, many outside the EU. When a German company buys services from a foreign business, the service counts as supplied in Germany, and the buyer reports the VAT and deducts it again in the same return. The cases, the documents and the boxes in the return are in VAT on x402 payments.

Rule 6: no gas line, and keep everything for eight years

Two details that save questions later.

Gas. With x402 the facilitator submits the transaction and pays the network fee. Your agent's wallet only sends USDC, so there is no gas to book.

Retention. Booking documents are kept for eight years in Germany. Store the documents together with the transaction hashes and your rate source. The chain stays readable, but the 402 answers and the rate pages you used may not.

A month end checklist

For each seller and month
Where it comes from
Seller name, country, address
the seller's website and company register, or a wallet register
What was bought
the 402 answers or the seller's catalogue
Number of payments and USDC total
the chain, filtered by your wallets and the seller's payTo
Euro value per payment and the rate used
ECB reference rate or the source you chose
Book value of the USDC spent
your USDC purchases
VAT case
the seller's country and status
Transaction hashes
the chain

Seller name, country, address

Where it comes from
the seller's website and company register, or a wallet register

What was bought

Where it comes from
the 402 answers or the seller's catalogue

Number of payments and USDC total

Where it comes from
the chain, filtered by your wallets and the seller's payTo

Euro value per payment and the rate used

Where it comes from
ECB reference rate or the source you chose

Book value of the USDC spent

Where it comes from
your USDC purchases

VAT case

Where it comes from
the seller's country and status

Transaction hashes

Where it comes from
the chain

Where 402lounge comes in

You can do all of this by hand with the checklist above. 402lounge does it from your wallets: a receipt for every payment, and once a month one document per seller with the euro values at the ECB rate and every transaction hash in the appendix.

Receipts for every x402 payment

402lounge reads your wallets on Base and writes a receipt for every payment, plus one document per seller and month with euro values and transaction hashes.

Read next