Here's the deal:
Want a Solana POS terminal up and running? Cool. We're talking Solana Pay here - that super quick payment system on the Solana blockchain. Accepts SOL, USDC, stuff like that. Fees? Tiny, like ~0.000005 SOL per transaction. Lightning fast too. I set one up last week for a buddy's coffee shop test, and it took me under 30 minutes. But we're starting on Devnet first - no real money at risk. Sound good?
Why Devnet? It's your sandbox. Test everything without burning cash. Once you're comfy, you flip to Mainnet later. The thing is, Solana Pay's official repo has this point of sale demo that's perfect for beginners. No coding wizardry needed.
Okay, prerequisites. Don't skip this or you'll hate life later.
node -v in terminal.In my experience, if Node's not on your machine, half the errors come from that. Install it now. Restart terminal after.
Got Phantom? Open the browser one. Create a new wallet if needed - write down that seed phrase on paper, hide it. Switch to Devnet in settings. Same for your phone app. Why two wallets? One's merchant (you), one's customer (tester). Easy peasy.
Now, fire up your terminal. VS Code terminal's best - Ctrl+ on Windows, Cmd+ on Mac.
git clone https://github.com/solana labs/solana pay.gitcd solana pay/point of sale - yeah, it's in a subfolder.yarn install - this grabs all the deps. Might take a minute. Coffee break.If yarn bitches about permissions, sudo yarn install or fix your npm perms. Common on Mac.
Done? Your folder should have package.json and all that jazz. Look familiar?
Two terminals needed here. Split screen 'em.
First terminal, still in point of sale folder:
yarn devBoom. Local server at http://localhost:3000. Open it. You should see the POS demo - clean interface, amount input, QR code generator. Sweet.
Second terminal, new one, same folder:
yarn proxyThis runs a proxy on port 3001. Why? Makes the QR scanner work right with wallet redirects. Without it, payments flop.
Both running? No errors in terminal? You're golden. If port 3000's taken, kill whatever's using it or change ports in code (not recommended for noobs).
Grab this URL template:
https://localhost:3001?recipient=YOURMERCHANTADDRESS&label=Your+Store+Name
Copy it to notepad. Now, Phantom browser extension - Devnet mode. Copy your wallet address. That's your merchant wallet.
Swap it in: recipient=ActualAddressHere&label=Tunkunmi%27s+Coffee (use + for spaces).
Paste the full URL in a new browser tab. POS loads with your store name. Input like $5 or 0.1 SOL. Hit generate. QR code pops. But hold up - no real payments yet.
Phone time. Phantom app, switch to Devnet. Copy wallet address.
Go to Solfaucet (solfaucet.com). Paste address, ask for 2 SOL on Devnet. Instant drip. Why 2? Covers tests, fees negligible anyway.
Back to browser POS tab. Enter amount, say 0.05 SOL. Generate QR.
Phone app: Tap barcode scanner (top right). Scan that QR. Boom - payment request. Review, hit send. Watch it fly.
Check merchant Phantom browser - SOL arrived? Devnet SOL, but yeah. Transaction ID shows in explorer too. solscan.io, switch to Devnet, paste tx sig.
First payment done. Feels like magic, right?
Stuff goes wrong. Here's what I hit and fixed.
| Problem | Fix |
|---|---|
| yarn dev fails, port busy | Kill process on port 3000: lsof -ti:3000 | xargs kill -9 (Mac/Linux) |
| QR scan no redirect | Proxy not running? Restart yarn proxy |
| Faucet no funds | Wait 30s, rate limited. Or use multiple addresses. |
| Wallet network mismatch | Both on Devnet? Double check settings. |
| Tx fails, "insufficient funds" | Even tiny fees need SOL. Faucet more. |
The thing is, Solana's fast but RPCs can lag. If tx pending forever, switch RPC in Phantom settings to Helius or Quicknode free tier.
Devnet rocks for learning. Ready for real? Switch wallets to Mainnet. No faucet - buy SOL on Binance, Coinbase, send to your merchant wallet. Fees still ~0.000005 SOL, but real value.
Steps same, but URL becomes your public domain. Host the POS on Vercel or whatever. Free tier works. Update recipient to Mainnet address.
Customers scan with their Phantom/Solflare/Backpack. Supports USDC too - add &spl token=EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v for USDC QR.
I usually add labels like "Coffee - 5 USD" and reference="order123". Keeps receipts clean.
Honestly, for a pop up shop, print QR static ones. Or tablet as terminal. Battery lasts all day.
Software POS is free. Want a terminal? Cheap Android tablet + QR app. Or Raspberry Pi 4 (8GB) runs the server headless. I rigged one for $100 total.
Steps for Pi:
Power draw? Under 10W. Runs 24/7 no sweat.
Potential issue: WiFi drops. Ethernet if possible. Or USB tether phone hotspot.
Solana crushes Visa here. Average tx: 0.4s finality. Fee: 0.000005 SOL (~$0.001 at $200/SOL). No chargebacks. Global, 24/7.
Compare:
| Solana Pay | Stripe | Square | |
|---|---|---|---|
| Fee per tx | ~0.000005 SOL | 2.9% + 30¢ | 2.6% + 10¢ |
| Speed | <1s | 2-3 days | Instant (funds) |
| Cross border | Free ish | 1-2% | Varies |
That's why shops dig it. Coffee costs $5, you pocket almost all.
Train 'em quick. "Scan here, approve on phone." First timers fumble network settings. Print signs: "Phantom on Mainnet."
What if no Phantom? Direct to phantom.app/download. Or Solflare.
In my experience, 90% have it now. Crypto crowd anyway.
One POS good for tests. Multiple? Deploy to Vercel/Netlify. Environment vars for merchant.
API integration: Solana Pay protocol's open. Build custom backend verifies payments via RPC.
Code snippet for verify (Node):
const { Connection, PublicKey } = require('@solana/web3.js');
const connection = new Connection('https://api.mainnet beta.solana.com');
const sig = 'txsignaturehere';
const tx = await connection.getTransaction(sig);
if (tx) { console.log('Paid!'); }
Run that post scan. Reliable.
Don't mainnet without testing 50 Devnet txs. Addresses case sensitive. QR labels URL encoded.
Funds stuck? Check explorer. Failed txs refund auto, minus dust fee.
Security: Never hardcode private keys. Wallet signs client side.
Questions? "Why USDC over SOL?" Stable. Price swings suck for receipts.
Template: https://localhost:3001?recipient=ADDR&amount=5&spl token=EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v&label=Stripe+Test
Works same. Fund customer with USDC from faucet too (they have it).
Host on domain. HTTPS mandatory for wallets. Vercel free SSL.
Add cart? Fork repo, add state management. Simple.
Analytics: Log txs to Google Sheets via Zapier. Free tier.
I've seen shops hit $1k/day this way. Low overhead.
Stuck somewhere? Replay steps. Or hit Solana Discord - helpful folks.
That's your POS terminal. Go accept some crypto. You'll love it.