Codex · III

Pay by mail

The pay-by-mail flow

  1. The buyer clicks the Coin Moebius button on your site and picks "Pay by mail" in the picker. They see a preview first: your mailing address, the amount due, and any instructions you set, with a <strong>"Confirm, I'll send payment"</strong> button. Nothing is recorded yet, and there is no reference code at this stage.
  2. The buyer clicks "Confirm, I'll send payment." That is the step that creates the transaction: Coin Moebius generates a unique reference code like X2M-K9P-R7QW and shows it alongside your mailing address. The buyer puts the reference code inside the package or on the check.
  3. Once they confirm, a row appears in your dashboard's Transactions tab with status pending_manual. The top of the list also shows a callout reminding you that mailed-payment confirmations are waiting.
  4. When the buyer's payment arrives in your mailbox (cash, check, Goldback, whatever the expected currency was), type the reference code into the search box on the Transactions tab to find the matching row. Click Mark received. The buyer's success URL is fired (so they get a confirmation page), and you proceed to ship whatever they bought.
  5. If the buyer's payment never arrives, the row auto-expires after 30 days. You can also Cancel a row manually before that.
  6. If you confirmed receipt but later discover the payment was invalid (counterfeit, wrong item, empty envelope), click Undo confirmation on the row. The status changes to manual_revoked. This corrects your records in the dashboard. Communicating with the buyer about what happened next is between you and them.

Testing pay-by-mail

Pay-by-mail has no sandbox, no test keys, and no external account to configure. The entire flow happens between your site and your dashboard. There are two ways to test it: the full round trip from a buy button on a page, or a quick test straight from the dashboard.

Quick test from the dashboard

The dashboard can create a test transaction for any provider without involving a real payment. This is useful for seeing what a transaction row looks like, practicing the "Mark received" flow for pay-by-mail, or previewing how a crypto payment appears in your list before spending real money.

  1. Open the Transactions tab on your project and click Send a test event.
  2. Pick a product, choose what happened (payment, refund, pay-by-mail, subscription renewal), and pick the provider you want to simulate (Stripe, NOWPayments, or Pay by mail). For pay-by-mail events, the provider is set automatically.
  3. Click Send test event. A new row appears tagged "test" so it doesn't mix with live data. The row shows up under the correct provider filter, just like a real transaction would.

For pay-by-mail specifically, choose "A pay-by-mail order is waiting" to create a pending_manual row with a real reference code. You can then practice clicking "Mark received," "Cancel," and "Undo confirmation" on it.

Test events don't count toward your monthly transaction quota.

Full round trip from a buy button

To test the complete flow (what your buyer sees through what you see), walk through these steps. The whole thing takes about two minutes.

  1. Set up the provider. In your dashboard, go to your project's Providers tab and click "Add provider" → Pay by mail. Enter any mailing address (your own is fine for testing) and any currency (e.g., USD, GBK). Save.
  2. Add a product. In the Products tab, create a product with a name like "Test item" and a price. Set the currency to match what you entered for the provider.
  3. Put the buy button on a page. Paste the buy button HTML on any page, even a bare HTML file on your computer. Point the endpoint attribute at your Cloud project URL. If you're running the worker locally, use http://localhost:8787 instead.
  4. Click the button and pick "Pay by mail." The picker opens showing every provider you've connected. Pick "Pay by mail." You'll see a preview with your mailing address, the expected amount and currency, and a "Confirm, I'll send payment" button. No reference code yet.
  5. Click "Confirm, I'll send payment." This is the buyer committing to send payment. Coin Moebius records the transaction and shows a reference code like X2M-K9P-R7QW.
  6. Open the dashboard. Go to the Transactions tab. A new row appears with status pending_manual and the same reference code you just saw. If this is your first pending row, a callout at the top of the list reminds you that mailed payments are waiting for confirmation.
  7. Click "Mark received." The row's status changes to succeeded. That's the complete happy path, from the buyer's click to your confirmation.

Finding a transaction by reference code

When a payment arrives in your mailbox, look for the reference code the buyer included (printed on the envelope, written on the check memo, or tucked inside the package). Then type that code into the search box on the Transactions tab and press Enter. The table filters to matching rows so you can click "Mark received" on the right one without paging through your full transaction history.

Testing the other outcomes

Run through the same steps again, but instead of marking the row received, try each of these:

  • Cancel it. Click "Cancel" on the pending row. The status changes to manual_canceled. This is what you'd do when a buyer tells you they changed their mind before mailing anything.
  • Let it expire. Leave a pending row alone. After 30 days it auto-expires to manual_expired. You don't need to wait 30 days to verify the behavior. Expiration works the same as Cancel, except it happens automatically on a schedule.
  • Enter a different amount. When clicking "Mark received," enter a received amount that differs from what was expected (e.g., the buyer sent 4 Goldbacks instead of 5). The transaction still succeeds, but the dashboard shows both the expected and received amounts so your records reflect what actually arrived.
  • Undo a confirmation. First mark a row received so it shows succeeded, then click "Undo confirmation" on that row. The status changes to manual_revoked. This is how you'd correct a mistake or flag a payment that turned out to be invalid after the fact.

What to look for

  • The reference code in the picker matches the reference code on the dashboard row.
  • Your mailing address displays correctly in the picker.
  • The "Mark received" and "Cancel" buttons appear only on pending_manual rows, not on card or crypto transactions.
  • After marking received, the row shows succeeded with the correct amount.
  • Searching by reference code in the search box finds the right row.

Full round-trip transactions created during testing count toward your monthly quota. On the free tier (150 transactions/month), a handful of test runs won't make a dent. Test events sent from the dashboard's "Send a test event" button don't count at all.

Ready to wire it up?

Free tier covers most sites and never asks for a card.