๐ŸชAccept MOTA as a merchant

From first-time pop-up booth to full point-of-sale integration. MotaCoin was designed as a payment rail for dispensaries and cannabis-adjacent businesses that can't get clean access to the card networks. This guide covers both ends of the spectrum โ€” a hand-drawn QR on a chalkboard, and a full API-driven checkout with automatic settlement.

The merchant advantage on MotaCoin

Tier 1 ยท Single-address pop-up (hand-drawn QR)

For a booth, event, or very low-volume setup. Generate one receive address, print a big QR of it, write your price list next to it, show customers where to scan. Done in 5 minutes.

  1. Generate a fresh address

    $ motacoin-cli getnewaddress "booth-2026-04-20"
    "MNCfNkGJuku1DLtVHeimVVLCtfk2YWKq8c"

    Label it so you can track later. One address per event keeps your accounting sane.

  2. Generate a QR

    Use paper.motacoin.net โ†’ Wallet Details tab โ†’ paste the private key, copy the public-address QR. Or any QR library pointed at motacoin:MNCfNkGJuku1DLtVHeimVVLCtfk2YWKq8c.

  3. Print it big

    24ร—24 cm minimum. Laminate it. Stick it to the counter.

  4. Watch receipts live

    $ watch -n 5 'motacoin-cli getreceivedbyaddress MNCfNkGJuku1DLtVHeimVVLCtfk2YWKq8c 0'

    The 0 minimum-confirmations flag includes unconfirmed receipts โ€” good enough to cross-reference against the customer's displayed "Sent!" screen on their wallet.

Trade-off: everyone is paying into the same address. At a busy booth you'll see all payments mixed together โ€” fine if you trust your own eyes and the customer's phone-screen confirmation, awkward if you need strict per-sale reconciliation. For that, go to Tier 2.

Tier 2 ยท Fresh-address per invoice (recommended default)

A new receive address per sale. Each invoice's address has a known expected amount, so your POS can verify "sale #420 paid in full" with zero ambiguity.

Minimal PHP / Node.js POS handler

// Node.js โ€” server side, talks to motacoind via local RPC
const { RpcClient } = require('motacoin-rpc');   // or any JSON-RPC client
const rpc = new RpcClient({ host: '127.0.0.1', port: 14420, user: 'mota', pass: '...' });

// When a customer checks out
app.post('/checkout', async (req, res) => {
  const orderId = req.body.orderId;
  const priceMota = req.body.priceMota;

  // Fresh receive address, labeled with the order ID
  const addr = await rpc.call('getnewaddress', [`order-${orderId}`]);

  // Store in DB: orderId โ†’ addr, priceMota, status=pending
  await db.orders.insert({ orderId, addr, priceMota, status: 'pending' });

  // Render QR for the customer
  res.json({
    address: addr,
    uri: `motacoin:${addr}?amount=${priceMota}&label=Order+${orderId}`,
    qrDataUrl: await generateQrDataUrl(`motacoin:${addr}?amount=${priceMota}`)
  });
});

// Background poller โ€” runs every 30 seconds
setInterval(async () => {
  const pending = await db.orders.find({ status: 'pending' });
  for (const order of pending) {
    const received = await rpc.call('getreceivedbyaddress', [order.addr, 0]);
    if (received >= order.priceMota) {
      await db.orders.update(order.orderId, { status: 'paid' });
      fulfillOrder(order.orderId);
    }
  }
}, 30_000);

That's the entire integration. No third-party processor, no webhook signing, no reconciliation reports. Your database is the source of truth, motacoind is the oracle.

The motacoin: URI format

Following the BIP-21 convention Bitcoin pioneered:

motacoin:MNCfNkGJuku1DLtVHeimVVLCtfk2YWKq8c?amount=12.5&label=OrderN123&message=Optional+note

Most modern wallets parse this URI directly โ€” scan the QR, the amount and label auto-populate, the customer just taps Send. Amount is in MOTA, not satoshis.

Zero-confirmation vs. one-confirmation

Settling to stablecoins via the bridge

Your till fills up with mainchain MOTA. You want USDC for wholesale costs. The path:

  1. Decide how much to settle

    Weekly settlement is common โ€” every Monday, bridge the previous week's receipts out to Solana.

  2. Bridge MOTA โ†’ Solana SPL

    $ motacoin-cli bridgetosol 5000 "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU"

    Your Solana wallet receives 5,000 SPL MOTA (minus the $3 or 0.25% bridge fee) after ~45 minutes.

  3. Swap SPL MOTA โ†’ USDC on Jupiter

    Open jup.ag, paste the MOTA SPL mint, swap to USDC. Confirms in seconds.

  4. Off-ramp USDC to fiat (if needed)

    Via a US/EU on-ramp (Coinbase, Kraken, Circle), or via Phantom โ†’ USDC โ†’ any accepting bank. Off-ramp is outside this tutorial โ€” a thousand options exist depending on jurisdiction.

Real-world example โ€” The Tuti Hostel, Tehran

The Tuti Hostel has accepted MotaCoin for room bookings since 2022. Their setup:

Why it works for them: Iran's international payment rails are famously hostile, USD-denominated card payments are impossible for most merchants, and a permissionless chain-based rail costs nothing to set up and has no geographic restrictions.

Tuti Hostel accepting MotaCoin

Accounting and tax

Consult a local accountant โ€” this is not tax advice. Generally speaking, accepting crypto as payment for goods or services is a taxable event at the fair-market-value of the crypto at the moment of receipt, same as any barter transaction. Keep records of:

Community support If you're a dispensary, cafรฉ, or any other business actively using MOTA at POS, join the merchant channel on Telegram or Discord. Existing merchants share integration code, POS-plugin forks, and tax-documentation templates.