// private solana pay invoices

Get paid.
Say less.

Status: Ticker (placeholder, no token exists):
// invoice opened from a private link

You've been sent an invoice

The details below were decrypted in your browser from the part of the link after #, which browsers never send to a server.

Write your own invoice
// the working app

Write an invoice. Hand over a QR. Watch it land.

Everything is built in this page: the Solana Pay URL, the one-time reference key, the QR code and the encrypted share link. Payment detection reads mainnet through this site's read-only proxy.

New invoice

Only public information goes into the payment link. Put private details in the sealed note.

Your invoice will print here.

Payment watch

Polls getSignaturesForAddress(reference), then checks the transaction with getTransaction.

  • Invoice issued with a fresh reference
  • Waiting for a transaction that includes the reference
  • Transaction found
  • Amount, recipient & reference verified
// how it works

Four quiet steps

  1. A fresh reference per invoice. The page generates a brand-new ed25519 keypair (Web Crypto, or an in-page BigInt fallback), keeps only the 32-byte public key as the reference, and drops the secret immediately — it is never needed. Two invoices never share a reference.
  2. A standard Solana Pay link. solana:<you>?amount=…&reference=…&label=…&message=… (plus spl-token and memo if used). Any Solana Pay wallet adds the reference as a read-only account on the transfer, which is what makes the payment findable.
  3. Detection by reading, not holding. The page asks mainnet for signatures that touch the reference, fetches the first one, and checks it succeeded, that the reference is really in it, and that your address received at least the amount (lamports for SOL, token-balance delta for SPL). If you set a memo, it checks that too.
  4. Details in a sealed envelope. The invoice and your note are encrypted with a random AES-256-GCM key. The ciphertext and the key ride in the link's #fragment, which browsers never send in requests — or, in split mode, the key travels separately.
// privacy model

What stays quiet, and what doesn't

Kept off-chain and off-server

  • The sealed note (line items, contact details, terms)
  • Label and message — they live only in the link/QR the payer's wallet reads
  • Which invoice a payment settles: only the random reference is on-chain, not an invoice number or customer name
  • Cross-invoice links through the reference: each one is used once

Still public on-chain

  • Your receiving address, the payer's address, the amount and the time
  • The memo, if you set one — forever
  • That a transaction used some reference key (anyone holding your QR or link can look it up)
  • Every payment to the same address can be grouped by that address — use a fresh receiving address if that matters

Quietpay reduces how much you put on the public record. It does not make you or your payer anonymous.

Known limitations — please read

  • Not anonymity. Solana is a public ledger. Sender, recipient, amount and timing of every payment are visible to anyone.
  • The link is the secret. Whoever has the full share link (with key) can read the invoice and note. Chat apps, email scanners and link previewers may store or open links. Use split-key mode for anything sensitive.
  • Your QR is a lookup handle. Anyone who sees the QR or link can find the payment on-chain by its reference. Show it only to your payer.
  • Invoices live in this tab. Nothing is stored on a server. Reloading clears the invoice book — keep your share link (it holds everything needed to watch again).
  • Detection depends on RPC. It reads mainnet through a public RPC endpoint by default. Rate limits or lag can delay detection; always confirm large payments in your own wallet.
  • Checks are basic. It confirms success, reference, recipient and amount (≥). It does not handle refunds, partial payments across several transactions, or transfer-fee tokens.
  • Experimental and unaudited. The QR encoder and curve code are hand-written for this demo. Verify the address in your wallet before sharing any invoice.