<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Shieldz</title>
    <description>The latest articles on DEV Community by Shieldz (@shieldz).</description>
    <link>https://dev.to/shieldz</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4009922%2F8bffcbf6-e65c-4de8-8ebd-1b990c8511e2.png</url>
      <title>DEV Community: Shieldz</title>
      <link>https://dev.to/shieldz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shieldz"/>
    <language>en</language>
    <item>
      <title>Crypto payments for SaaS: bill in USDC, keep the keys</title>
      <dc:creator>Shieldz</dc:creator>
      <pubDate>Tue, 08 Sep 2026 15:40:47 +0000</pubDate>
      <link>https://dev.to/shieldz/crypto-payments-for-saas-bill-in-usdc-keep-the-keys-44oa</link>
      <guid>https://dev.to/shieldz/crypto-payments-for-saas-bill-in-usdc-keep-the-keys-44oa</guid>
      <description>&lt;p&gt;SaaS teams asking how to take &lt;strong&gt;crypto payments for SaaS&lt;/strong&gt; usually get a custodial processor: a balance they do not control, a percentage on every invoice, and a freeze risk if the account looks "wrong". You can skip that path. Shieldz is a non-custodial checkout: the customer pays on-chain, funds settle to the wallet you configured, and your app learns about it from a signed webhook. &lt;a href="https://shieldz.cash/pricing" rel="noopener noreferrer"&gt;$0 platform fee&lt;/a&gt;, &lt;a href="https://shieldz.cash/no-kyc" rel="noopener noreferrer"&gt;no KYC to start&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This sits next to the &lt;a href="https://shieldz.cash/blog/crypto-payment-api" rel="noopener noreferrer"&gt;crypto payment API quickstart&lt;/a&gt; and &lt;a href="https://shieldz.cash/blog/how-to-accept-crypto-payments" rel="noopener noreferrer"&gt;how to accept crypto payments&lt;/a&gt;. Use those for the HTTP details. Use this post for the SaaS-specific loop: plan amount, invoice, hosted checkout, webhook, entitlement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why SaaS billing and custodial gateways fight each other
&lt;/h2&gt;

&lt;p&gt;Card rails price a $29/month plan as a percentage plus a fixed fee. On a year of that plan, 2.9% + 30¢ per charge is material. A custodial crypto gateway often adds its own cut and a withdrawal delay. Chargebacks do not exist on a confirmed on-chain payment, which is useful for digital access, but only if the processor cannot freeze the balance after the customer paid.&lt;/p&gt;

&lt;p&gt;A non-custodial model removes the middle balance. You store a public receive key (an address, an xpub, or a Zcash viewing key). Shieldz derives a fresh pay target per invoice and watches the chain. It cannot spend. Verify that claim on &lt;a href="https://shieldz.cash/verify" rel="noopener noreferrer"&gt;/verify&lt;/a&gt; if you need the cryptographic version.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the SaaS loop looks like
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Your billing job decides the amount in USD cents (plan price, seat add-on, or one-off invoice).&lt;/li&gt;
&lt;li&gt;You &lt;code&gt;POST /api/v1/invoices&lt;/code&gt; with &lt;code&gt;amount_usd_cents&lt;/code&gt;, a memo, an &lt;code&gt;idempotency_key&lt;/code&gt;, and metadata that points at the customer and the period.&lt;/li&gt;
&lt;li&gt;You send the customer to &lt;code&gt;pay_url&lt;/code&gt; (hosted checkout with QR and wallet deep-link).&lt;/li&gt;
&lt;li&gt;On confirm, Shieldz POSTs &lt;code&gt;invoice.paid&lt;/code&gt; to your webhook. You verify &lt;code&gt;X-Shieldz-Signature&lt;/code&gt; and grant the period.&lt;/li&gt;
&lt;li&gt;Settlement lands in the token and chain you configured. If the buyer pays a different supported coin, swap-settle routes through NEAR, Chainflip, or Relay via the LeoKit aggregator. Shieldz takes no affiliate cut on that swap.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Amount bounds on the API today: $1.00 to $100,000.00 per invoice (&lt;code&gt;amount_usd_cents&lt;/code&gt; 100 to 10,000,000). Default expiry is 30 minutes (45 minutes when ZEC is in play).&lt;/p&gt;

&lt;h2&gt;
  
  
  Step-by-step: wire it to your billing stack
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Create a merchant and a receive target
&lt;/h3&gt;

&lt;p&gt;Sign in at the &lt;a href="https://merchant.shieldz.cash/signup" rel="noopener noreferrer"&gt;dashboard&lt;/a&gt;. Add the public key or address for the chain you want to settle on. Prefer USDC or USDT if you want invoice amounts to match books. See &lt;a href="https://shieldz.cash/blog/accept-stablecoin-payments" rel="noopener noreferrer"&gt;accept stablecoin payments&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Mint an API key
&lt;/h3&gt;

&lt;p&gt;Dashboard → Developers. &lt;code&gt;sk_live_…&lt;/code&gt; moves real funds. &lt;code&gt;sk_test_…&lt;/code&gt; is for staging. The raw key is shown once.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Create the invoice from your backend
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://shieldz.cash/api/v1/invoices &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer sk_live_…"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "amount_usd_cents": 2900,
    "memo": "Pro plan, Sep 2026",
    "idempotency_key": "sub_cus_123_2026_09",
    "metadata": { "customer_id": "cus_123", "period": "2026-09" }
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Redirect or email &lt;code&gt;pay_url&lt;/code&gt;. Reuse the same &lt;code&gt;idempotency_key&lt;/code&gt; if the job retries.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Verify the webhook before you extend the plan
&lt;/h3&gt;

&lt;p&gt;Header: &lt;code&gt;X-Shieldz-Signature: t=&amp;lt;unix&amp;gt;,v1=&amp;lt;hex&amp;gt;&lt;/code&gt;. HMAC-SHA256 over &lt;code&gt;`${t}.${rawBody}`&lt;/code&gt; with your &lt;code&gt;whsec_&lt;/code&gt; secret. Use the raw body, not a re-serialized JSON object. Deliveries are at-least-once. Key fulfilment on &lt;code&gt;invoice.id&lt;/code&gt; plus your period metadata so a retry does not double-credit. Full snippet is in the &lt;a href="https://shieldz.cash/blog/crypto-payment-api" rel="noopener noreferrer"&gt;API post&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Recurring plans without storing cards
&lt;/h3&gt;

&lt;p&gt;On-chain checkout is pull-less. For monthly SaaS you generate a new invoice each period and send the link (email, in-app banner, or &lt;a href="https://shieldz.cash/tools/payment-link" rel="noopener noreferrer"&gt;payment link&lt;/a&gt;). When the webhook fires, extend the entitlement. If it expires unpaid, keep the account in a grace state the same way you would for a failed card.&lt;/p&gt;

&lt;p&gt;Agents and keyless flows are a separate cluster: &lt;a href="https://shieldz.cash/blog/crypto-payments-for-ai-agents" rel="noopener noreferrer"&gt;crypto payments for AI agents&lt;/a&gt; and the &lt;a href="https://shieldz.cash/blog/agents-keyless-mcp-payments" rel="noopener noreferrer"&gt;MCP path&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What not to promise in your pricing page
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Shieldz does not hold a merchant balance and cannot pay you out in fiat. If you need fiat settlement, that is a different product class. See &lt;a href="https://shieldz.cash/blog/crypto-payment-gateways-fiat-settlement" rel="noopener noreferrer"&gt;crypto payment gateways and fiat settlement&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Gas is paid by the buyer (and by the swap route when they pay a non-settlement asset). Do not market "free on-chain transfers".&lt;/li&gt;
&lt;li&gt;NEAR and SOL are not live source chains for swap-settle right now. Do not list them as pay-in options.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Can I take crypto for monthly SaaS plans?&lt;/strong&gt;&lt;br&gt;
Yes. Create one invoice per period, send &lt;code&gt;pay_url&lt;/code&gt;, grant access on a verified &lt;code&gt;invoice.paid&lt;/code&gt; webhook. There is no on-chain mandate you can charge later without the customer sending again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I need KYC to start?&lt;/strong&gt;&lt;br&gt;
No. Signup is wallet, Google, or Telegram. Read &lt;a href="https://shieldz.cash/blog/do-crypto-payment-gateways-require-kyc" rel="noopener noreferrer"&gt;do crypto payment gateways require KYC&lt;/a&gt; and &lt;a href="https://shieldz.cash/blog/accept-crypto-payments-without-kyc" rel="noopener noreferrer"&gt;accept crypto payments without KYC&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where does the money go?&lt;/strong&gt;&lt;br&gt;
To the address or derived child address from the public key you registered. Shieldz never holds keys. Details in &lt;a href="https://shieldz.cash/blog/non-custodial-crypto-payment-gateway" rel="noopener noreferrer"&gt;non-custodial crypto payment gateway&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if the customer pays a different coin than I settle in?&lt;/strong&gt;&lt;br&gt;
Swap-settle quotes through NEAR, Chainflip, or Relay (LeoKit). You still receive the settlement asset you configured, with no Shieldz take rate on the swap.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://merchant.shieldz.cash/signup" rel="noopener noreferrer"&gt;Create a merchant&lt;/a&gt;, then either paste invoices from the dashboard or follow the &lt;a href="https://shieldz.cash/docs" rel="noopener noreferrer"&gt;API reference&lt;/a&gt;. WordPress stores should use the &lt;a href="https://shieldz.cash/blog/accept-crypto-payments-woocommerce" rel="noopener noreferrer"&gt;WooCommerce plugin&lt;/a&gt; instead of a custom billing job.&lt;/p&gt;

</description>
      <category>crypto</category>
      <category>payments</category>
      <category>fintech</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>Crypto payments for Minecraft servers: ranks, crates, and slots</title>
      <dc:creator>Shieldz</dc:creator>
      <pubDate>Tue, 08 Sep 2026 15:38:43 +0000</pubDate>
      <link>https://dev.to/shieldz/crypto-payments-for-minecraft-servers-ranks-crates-and-slots-3a4e</link>
      <guid>https://dev.to/shieldz/crypto-payments-for-minecraft-servers-ranks-crates-and-slots-3a4e</guid>
      <description>&lt;p&gt;Minecraft server networks that want &lt;strong&gt;crypto payments for ranks, crates, and slots&lt;/strong&gt; usually get a card processor or a custodial crypto balance. Chargebacks on a digital rank, a percentage on every crate key, and an account review when a launch weekend spikes. You can skip that path. Shieldz is a non-custodial checkout: the player pays on-chain, funds settle to the wallet you configured, and your store backend learns about it from a signed webhook. &lt;a href="https://shieldz.cash/pricing" rel="noopener noreferrer"&gt;$0 platform fee&lt;/a&gt;, &lt;a href="https://shieldz.cash/no-kyc" rel="noopener noreferrer"&gt;no KYC to start&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This sits next to the &lt;a href="https://shieldz.cash/blog/crypto-payment-api" rel="noopener noreferrer"&gt;crypto payment API quickstart&lt;/a&gt; and &lt;a href="https://shieldz.cash/blog/how-to-accept-crypto-payments" rel="noopener noreferrer"&gt;how to accept crypto payments&lt;/a&gt;. Use those for raw HTTP. Use this post for the Paper / Spigot / Purpur / Velocity shop loop: catalog SKU, invoice, hosted checkout, webhook, grant command.&lt;/p&gt;

&lt;h2&gt;
  
  
  The actual problem on a Minecraft store
&lt;/h2&gt;

&lt;p&gt;A typical network already has the hard parts: LuckPerms groups, a crate plugin, a whitelist, a webstore, maybe a Discord bot that opens tickets for unbans. Payment is the part that leaks money and time.&lt;/p&gt;

&lt;p&gt;Card rails price a $9.99 VIP month as a percentage plus a fixed fee. Across a few thousand ranks a year that cut is visible in the panel. Chargebacks arrive after &lt;code&gt;lp user &amp;lt;uuid&amp;gt; parent addtemp vip 30d&lt;/code&gt; has already run. Some processors treat game-server stores as high risk and freeze the balance in the same week you advertised a crate sale on YouTube.&lt;/p&gt;

&lt;p&gt;Custodial crypto gateways fix the card brand problem and keep a new one: they hold the coins, they take a cut, and they can stall a withdrawal. For a network that already runs its own boxes, that extra balance is not an advantage. You already operate infrastructure. You do not need a second custodian for $10 ranks.&lt;/p&gt;

&lt;p&gt;A non-custodial model removes the middle balance. You register a public receive key (an address, an xpub, or a Zcash viewing key). Shieldz derives a fresh pay target per invoice and watches the chain. It cannot spend. Verify that claim on &lt;a href="https://shieldz.cash/verify" rel="noopener noreferrer"&gt;/verify&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;On-chain confirmations do not reverse the way cards do. If you refund, you send crypto back yourself and revoke the group. That is a policy, not a network clawback.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you actually sell on a Minecraft network
&lt;/h2&gt;

&lt;p&gt;Keep the catalog boring and explicit. The invoice does not care which plugin fulfills it. Your webhook handler does.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ranks and timed groups.&lt;/strong&gt; VIP, MVP, media, helper-trial. LuckPerms temporary parents map cleanly to a 7-day or 30-day invoice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crate keys and cosmetic kits.&lt;/strong&gt; One-shot SKUs. Grant on paid, do not auto-renew.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reserved slots and queue skip.&lt;/strong&gt; Useful on survival and minigames networks that hit the player cap on Friday nights.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unban and unmute appeals.&lt;/strong&gt; Fixed-price admin products. Put the ticket id in metadata so staff can see the payment next to the case.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extra claims, homes, or auction slots.&lt;/strong&gt; Anything your plugin already exposes as a permission node.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network-wide versus per-server SKUs.&lt;/strong&gt; Put &lt;code&gt;server: survival-1&lt;/code&gt; or &lt;code&gt;server: network&lt;/code&gt; in metadata so the grant targets the right proxy backend.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do not invent an in-game coin inside Shieldz. If you run an economy plugin, that ledger stays on the box. Shieldz only tells you that USD-denominated invoice &lt;code&gt;inv_...&lt;/code&gt; moved from &lt;code&gt;pending&lt;/code&gt; to &lt;code&gt;paid&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The server loop
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;The player picks a SKU on the webstore (or a Discord button that hits the same backend).&lt;/li&gt;
&lt;li&gt;Your backend &lt;code&gt;POST /api/v1/invoices&lt;/code&gt; with &lt;code&gt;amount_usd_cents&lt;/code&gt;, a memo, an &lt;code&gt;idempotency_key&lt;/code&gt;, and metadata for &lt;code&gt;uuid&lt;/code&gt;, &lt;code&gt;username&lt;/code&gt;, &lt;code&gt;sku&lt;/code&gt;, and &lt;code&gt;server&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;You send the player to &lt;code&gt;pay_url&lt;/code&gt;. That is the hosted checkout: coin picker, QR, wallet deep-link.&lt;/li&gt;
&lt;li&gt;On confirm, Shieldz POSTs &lt;code&gt;invoice.paid&lt;/code&gt; to your webhook. You verify &lt;code&gt;X-Shieldz-Signature&lt;/code&gt;, then grant once.&lt;/li&gt;
&lt;li&gt;Settlement lands in the token and chain you configured. If the player pays a different supported coin, swap-settle routes through NEAR, Chainflip, or Relay via the LeoKit aggregator. Shieldz takes no affiliate cut on that swap.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Amount bounds on the API today: $1.00 to $100,000.00 per invoice (&lt;code&gt;amount_usd_cents&lt;/code&gt; 100 to 10,000,000). Default expiry is 30 minutes (45 minutes when ZEC is in play). A crate impulse-buy should stay inside that window. A "think about VIP" page should mint the invoice when they click Pay, not when they land on the listing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step-by-step: store VPS to grant command
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Create a merchant and a receive target
&lt;/h3&gt;

&lt;p&gt;Sign in at the &lt;a href="https://merchant.shieldz.cash/signup" rel="noopener noreferrer"&gt;dashboard&lt;/a&gt;. Add the public key or address for the chain you want to settle on. Prefer USDC or USDT if rank prices are in dollars. That keeps books aligned with the storefront. See &lt;a href="https://shieldz.cash/blog/accept-stablecoin-payments" rel="noopener noreferrer"&gt;accept stablecoin payments&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Use a wallet the network already treats as treasury, not a personal hot wallet that also holds staff salaries. Shieldz never holds that key. Compromise of the API key can mint invoices and read status. It cannot move the treasury.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Mint an API key and a webhook secret
&lt;/h3&gt;

&lt;p&gt;Dashboard → Developers. &lt;code&gt;sk_live_…&lt;/code&gt; moves real funds. &lt;code&gt;sk_test_…&lt;/code&gt; is for staging. The raw key is shown once. Put it in the store VPS environment, not in a public plugin jar, not in a GitHub gist, not in a Discord paste.&lt;/p&gt;

&lt;p&gt;Set &lt;code&gt;PUT /api/v1/webhook_endpoint&lt;/code&gt; to an HTTPS URL you control. You get a &lt;code&gt;whsec_…&lt;/code&gt; signing secret. Rotate with &lt;code&gt;{rotate:true}&lt;/code&gt; if it leaks. The previous secret stays valid for 24 hours.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Create the invoice from the shop backend
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://shieldz.cash/api/v1/invoices &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer sk_live_…"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "amount_usd_cents": 999,
    "memo": "VIP 30 days",
    "idempotency_key": "mc_9f3a2c_vip30_2026_09",
    "metadata": {
      "uuid": "9f3a2c8e-4b11-4d20-8a77-0c1d2e3f4a5b",
      "username": "NotchFan",
      "sku": "vip_30d",
      "server": "survival-1"
    }
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Always key the player by UUID, not by current username. Usernames change. LuckPerms and most crate plugins accept UUID.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;idempotency_key&lt;/code&gt; should be stable for one intended purchase (&lt;code&gt;uuid + sku + period&lt;/code&gt;). If the storefront retries because the player double-clicked Buy, you get the same invoice back with &lt;code&gt;idempotent_replay: true&lt;/code&gt; instead of two VIP charges.&lt;/p&gt;

&lt;p&gt;Open &lt;code&gt;pay_url&lt;/code&gt; in the browser. Official &lt;a href="https://shieldz.cash/sdks" rel="noopener noreferrer"&gt;SDKs&lt;/a&gt; cover Node, Python, Rust, and PHP. Most custom Minecraft shops are already Node or PHP.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Verify the webhook, then grant once
&lt;/h3&gt;

&lt;p&gt;Header: &lt;code&gt;X-Shieldz-Signature: t=&amp;lt;unix&amp;gt;,v1=&amp;lt;hex&amp;gt;&lt;/code&gt;. HMAC-SHA256 over &lt;code&gt;`${t}.${rawBody}`&lt;/code&gt; with the &lt;code&gt;whsec_&lt;/code&gt; secret. Use the raw body, not a re-serialized JSON object. Deliveries are at-least-once. Retries follow &lt;code&gt;1m → 5m → 25m → 2h → 12h&lt;/code&gt; (5 attempts), then dead until you retry by hand.&lt;/p&gt;

&lt;p&gt;Fulfilment key: &lt;code&gt;invoice.id&lt;/code&gt; plus &lt;code&gt;uuid&lt;/code&gt; plus &lt;code&gt;sku&lt;/code&gt;. Store that tuple before you run RCON. If the same delivery arrives again, return 200 and do nothing.&lt;/p&gt;

&lt;p&gt;Grant examples (your plugin, not Shieldz):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;LuckPerms timed rank: &lt;code&gt;lp user &amp;lt;uuid&amp;gt; parent addtemp vip 30d&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;LuckPerms permanent cosmetic: &lt;code&gt;lp user &amp;lt;uuid&amp;gt; parent add donor&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Crate keys: &lt;code&gt;crates give &amp;lt;uuid&amp;gt; legendary 5&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Reserved slot: write the UUID into the allow list your proxy already reads&lt;/li&gt;
&lt;li&gt;Unban: remove the ban entry and close the ticket id from metadata&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Talk to the live server over RCON, plugin messaging, or a small queue worker. Do not block the webhook HTTP handler on a lagged main thread. Acknowledge 200 after signature verify and enqueue the grant. If RCON is down, keep the delivery id and retry the grant from your own queue. Shieldz will retry the webhook too. Your idempotency table is what prevents a double crate drop.&lt;/p&gt;

&lt;p&gt;Full signature snippet: &lt;a href="https://shieldz.cash/blog/crypto-payment-api" rel="noopener noreferrer"&gt;crypto payment API&lt;/a&gt;. Broader pattern: &lt;a href="https://shieldz.cash/blog/how-to-verify-crypto-payments" rel="noopener noreferrer"&gt;how to verify crypto payments&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Recurring VIP without storing cards
&lt;/h3&gt;

&lt;p&gt;On-chain checkout is pull-less. There is no mandate you can fire in 30 days without the player sending again.&lt;/p&gt;

&lt;p&gt;Operational pattern that matches how networks already work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On first purchase, grant &lt;code&gt;vip&lt;/code&gt; for 30 days and store &lt;code&gt;expires_at&lt;/code&gt; next to &lt;code&gt;uuid&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Seven days before expiry, mint a new invoice and send &lt;code&gt;pay_url&lt;/code&gt; (in-game mail if you have it, otherwise Discord DM or email from &lt;code&gt;customer_email&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;On &lt;code&gt;invoice.paid&lt;/code&gt;, extend the parent. On expiry with no payment, &lt;code&gt;lp user &amp;lt;uuid&amp;gt; parent remove vip&lt;/code&gt; or let the temporary parent fall off on its own.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A &lt;a href="https://shieldz.cash/tools/payment-link" rel="noopener noreferrer"&gt;payment link&lt;/a&gt; works for one-off unban appeals and staff-posted crate sales where you do not want to stand up metadata plumbing the same day.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Test mode before the first real crate sale
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;sk_test_…&lt;/code&gt; against staging. Confirm four things before you announce in Discord:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Invoice creates and &lt;code&gt;pay_url&lt;/code&gt; loads.&lt;/li&gt;
&lt;li&gt;Signature verify rejects a flipped bit in the body.&lt;/li&gt;
&lt;li&gt;A simulated or test payment reaches &lt;code&gt;invoice.paid&lt;/code&gt; and runs the grant exactly once.&lt;/li&gt;
&lt;li&gt;A replay of the same webhook does not stack a second 30-day parent.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then switch the store to &lt;code&gt;sk_live_…&lt;/code&gt; and a live receive address.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture notes that save a 3 a.m. page
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Where the secret lives.&lt;/strong&gt; Store VPS or a small worker next to the webstore. Not inside a public Spigot jar. Players can decompile a plugin. An API key in that jar is a support incident.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Proxy versus backend.&lt;/strong&gt; Velocity or Bungee does not need to know about Shieldz. Grant on the lobby or on the survival backend that owns the permission plugin. Metadata &lt;code&gt;server&lt;/code&gt; is how the worker chooses the RCON target.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Offline players.&lt;/strong&gt; LuckPerms can mutate a UUID that is offline. Crate plugins vary. If a plugin requires an online player, queue the grant and apply it on next login. The invoice is already &lt;code&gt;paid&lt;/code&gt;. Do not wait to acknowledge the webhook until they log in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Username changes.&lt;/strong&gt; Display the current name on the storefront. Persist UUID. If you only store &lt;code&gt;NotchFan&lt;/code&gt;, the next webhook after a name change grants the wrong account or none.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Partial payments and expiry.&lt;/strong&gt; If the invoice expires unpaid, mint a new one. Do not try to stitch a late on-chain send onto an expired public id unless your ops process for unattributed deposits is documented. The dashboard lists unattributed deposits for staff, not for the player storefront.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Staff refunds.&lt;/strong&gt; There is no chargeback button. Send the settlement asset back from treasury and revoke the node. Write the refund tx next to the invoice id so the next admin does not re-grant.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this is not
&lt;/h2&gt;

&lt;p&gt;Shieldz is checkout and settlement. It is not a Tebex replacement with a built-in Bukkit listener. It is not an economy plugin, not a crate plugin, and not a fiat payout rail. You keep the grant path you already trust.&lt;/p&gt;

&lt;p&gt;Microsoft and Mojang storefront rules still apply to those storefronts. This post is for infrastructure you operate: the dedicated box, the panel, the webshop, the Discord ticket tool.&lt;/p&gt;

&lt;p&gt;Same invoice object works on nearby dedicated-server shops (Rust, ARK, FiveM, GMod, Terraria). The grant command changes. The webhook does not. This article stays on Minecraft because that is where rank/crate/slot catalogs are most standardized.&lt;/p&gt;

&lt;h2&gt;
  
  
  What not to promise on the store page
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Shieldz does not hold a merchant balance and cannot pay you out in fiat. See &lt;a href="https://shieldz.cash/blog/crypto-payment-gateways-fiat-settlement" rel="noopener noreferrer"&gt;crypto payment gateways and fiat settlement&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Gas is paid by the buyer (and by the swap route when they pay a non-settlement asset). Do not market "free on-chain transfers".&lt;/li&gt;
&lt;li&gt;NEAR and SOL are not live source chains for swap-settle right now. Do not list them as pay-in options.&lt;/li&gt;
&lt;li&gt;Checkout deep-links trigger a token &lt;code&gt;transfer()&lt;/code&gt;. They never ask for &lt;code&gt;approve&lt;/code&gt; / allowance.&lt;/li&gt;
&lt;li&gt;Do not tell players the rank is instant before the webhook has been verified. "Usually under a minute after the transaction confirms" is honest. "Instant regardless of chain congestion" is not.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keyless one-off links for tips or unban appeals: &lt;a href="https://shieldz.cash/blog/accept-crypto-payments-one-url" rel="noopener noreferrer"&gt;accept crypto payments with one URL&lt;/a&gt;. Broader product frame: &lt;a href="https://shieldz.cash/blog/what-is-a-crypto-payment-gateway" rel="noopener noreferrer"&gt;what is a crypto payment gateway&lt;/a&gt;. Custody frame: &lt;a href="https://shieldz.cash/blog/non-custodial-crypto-payment-gateway" rel="noopener noreferrer"&gt;non-custodial crypto payment gateway&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Can I sell Minecraft ranks and crates for crypto?&lt;/strong&gt;&lt;br&gt;
Yes, if you control fulfillment. Create one invoice per SKU, send &lt;code&gt;pay_url&lt;/code&gt;, grant on a verified &lt;code&gt;invoice.paid&lt;/code&gt; webhook. Deduplicate on invoice id plus UUID plus SKU.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I need KYC to start?&lt;/strong&gt;&lt;br&gt;
No. Signup is wallet, Google, or Telegram. Read &lt;a href="https://shieldz.cash/blog/do-crypto-payment-gateways-require-kyc" rel="noopener noreferrer"&gt;do crypto payment gateways require KYC&lt;/a&gt; and &lt;a href="https://shieldz.cash/blog/accept-crypto-payments-without-kyc" rel="noopener noreferrer"&gt;accept crypto payments without KYC&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where does the money go?&lt;/strong&gt;&lt;br&gt;
To the address or derived child address from the public key you registered. Shieldz never holds keys.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if the player pays a different coin than I settle in?&lt;/strong&gt;&lt;br&gt;
Swap-settle quotes through NEAR, Chainflip, or Relay (LeoKit). You still receive the settlement asset you configured, with no Shieldz take rate on the swap.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can Shieldz charge the player again next month by itself?&lt;/strong&gt;&lt;br&gt;
No. There is no on-chain card-style mandate. Mint a new invoice for the next period and send the link.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://merchant.shieldz.cash/signup" rel="noopener noreferrer"&gt;Create a merchant&lt;/a&gt;, add a receive address, mint a test key, then follow the &lt;a href="https://shieldz.cash/docs" rel="noopener noreferrer"&gt;API reference&lt;/a&gt;. If the shop is WordPress rather than a custom panel, use the &lt;a href="https://shieldz.cash/blog/accept-crypto-payments-woocommerce" rel="noopener noreferrer"&gt;WooCommerce plugin&lt;/a&gt;. File downloads instead of live ranks: &lt;a href="https://shieldz.cash/blog/sell-digital-downloads-for-crypto-edd" rel="noopener noreferrer"&gt;sell digital downloads for crypto&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>crypto</category>
      <category>payments</category>
      <category>fintech</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>Low-fee crypto payment gateways in 2026: all 35 verified options under 1%</title>
      <dc:creator>Shieldz</dc:creator>
      <pubDate>Wed, 02 Sep 2026 16:05:11 +0000</pubDate>
      <link>https://dev.to/shieldz/low-fee-crypto-payment-gateways-in-2026-all-35-verified-options-under-1-5g8d</link>
      <guid>https://dev.to/shieldz/low-fee-crypto-payment-gateways-in-2026-all-35-verified-options-under-1-5g8d</guid>
      <description>&lt;p&gt;The median crypto payment gateway charges &lt;a href="https://shieldz.cash/blog/average-crypto-payment-gateway-fee" rel="noopener noreferrer"&gt;1% per transaction&lt;/a&gt;. In our &lt;a href="https://github.com/ShieldZCash/crypto-payment-gateways-dataset" rel="noopener noreferrer"&gt;86-gateway dataset&lt;/a&gt;, &lt;strong&gt;35 gateways have a fee verified below that median on an official pricing page, and 15 of them advertise 0%&lt;/strong&gt;. This post lists every one of them, because "low fee" is where gateway marketing gets creative: a 0% headline can hide a 4% exit, a conversion spread, or a monthly subscription. We read the pricing pages so you can see where each fee actually lives.&lt;/p&gt;

&lt;p&gt;Only fees confirmed on an official provider page are included (the dataset's &lt;code&gt;verified&lt;/code&gt; flag). Roughly &lt;a href="https://shieldz.cash/blog/crypto-payment-gateway-pricing-transparency" rel="noopener noreferrer"&gt;a third of gateways publish no checkable fee at all&lt;/a&gt;; they cannot be on this list by definition.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three kinds of "low fee"
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. True zero.&lt;/strong&gt; No percentage, no subscription, no spread: you pay only network gas. In the dataset this is the smallest group: &lt;strong&gt;Shieldz&lt;/strong&gt; (non-custodial, &lt;a href="https://shieldz.cash/blog/do-crypto-payment-gateways-require-kyc" rel="noopener noreferrer"&gt;no KYC&lt;/a&gt;, buyer pays gas), &lt;strong&gt;BTCPay Server&lt;/strong&gt; and &lt;strong&gt;Bitcart&lt;/strong&gt; (free open source, but you run the server), &lt;strong&gt;Solana Pay&lt;/strong&gt; (an open protocol, not a service), and &lt;strong&gt;DV.net&lt;/strong&gt; (self-hosted). Zero here is real because there is no intermediary business model to feed: settlement is &lt;a href="https://shieldz.cash/blog/non-custodial-crypto-payment-gateway" rel="noopener noreferrer"&gt;direct to your wallet&lt;/a&gt; or on your own infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Zero percent, flat subscription.&lt;/strong&gt; &lt;strong&gt;MyCryptoCheckout&lt;/strong&gt; ($49/yr) and &lt;strong&gt;Zaprite&lt;/strong&gt; ($25/mo) charge a fixed plan instead of a percentage on their core flows. Above a few thousand dollars of monthly volume this beats any percentage fee; below it, do the division first. Zaprite is also a good example of why fine print matters inside a single provider: invoices, payment links and POS carry no percentage, but its API and WooCommerce transactions cost 1% (capped at $15). We updated the dataset row when we re-checked the pricing page; that granularity is exactly what the per-row sources are for.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Zero up front, paid somewhere else.&lt;/strong&gt; The exchange giants advertise 0% and recover it downstream: &lt;strong&gt;Binance Pay&lt;/strong&gt; (0% payments, 0.8% payouts), &lt;strong&gt;Bybit Pay&lt;/strong&gt; (1% conversion to USDT), &lt;strong&gt;Strike&lt;/strong&gt; (0.49-1.29% fiat conversion), &lt;strong&gt;Kraken Pay&lt;/strong&gt; and &lt;strong&gt;Coinify&lt;/strong&gt; (conversion at their rate, where the margin lives), &lt;strong&gt;Coinbase Payments&lt;/strong&gt; (no gateway fee, USDC-on-Base rails). None of this is illegitimate, but it is not 0% either; it is 0% at the door. The exit-fee pattern gets worse further down the market; see PayKassa's 0%-in, 4%-out in the &lt;a href="https://shieldz.cash/blog/worst-crypto-payment-gateways-2026" rel="noopener noreferrer"&gt;worst gateways ranking&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Every verified sub-1% gateway
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fee&lt;/th&gt;
&lt;th&gt;Gateway&lt;/th&gt;
&lt;th&gt;The fine print&lt;/th&gt;
&lt;th&gt;Custody&lt;/th&gt;
&lt;th&gt;KYC&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;td&gt;Shieldz&lt;/td&gt;
&lt;td&gt;$0 platform fee; buyer pays network gas&lt;/td&gt;
&lt;td&gt;non-custodial&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;td&gt;BTCPay Server&lt;/td&gt;
&lt;td&gt;open source; you pay your own hosting&lt;/td&gt;
&lt;td&gt;self-hosted&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;td&gt;Bitcart&lt;/td&gt;
&lt;td&gt;free open source&lt;/td&gt;
&lt;td&gt;self-hosted&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;td&gt;Solana Pay&lt;/td&gt;
&lt;td&gt;open protocol; network fees only&lt;/td&gt;
&lt;td&gt;non-custodial&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;td&gt;DV.net&lt;/td&gt;
&lt;td&gt;0% commission; network fees only&lt;/td&gt;
&lt;td&gt;self-hosted&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;td&gt;MyCryptoCheckout&lt;/td&gt;
&lt;td&gt;$49/yr unlimited plan&lt;/td&gt;
&lt;td&gt;non-custodial&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;td&gt;Zaprite&lt;/td&gt;
&lt;td&gt;$25/mo; 1% on API and WooCommerce (cap $15/tx)&lt;/td&gt;
&lt;td&gt;non-custodial&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;td&gt;PayRam&lt;/td&gt;
&lt;td&gt;0% processing; optional orchestration up to 2.5%&lt;/td&gt;
&lt;td&gt;self-hosted&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;td&gt;Request Finance&lt;/td&gt;
&lt;td&gt;SaaS plans; 0.95-1.5% off-ramp&lt;/td&gt;
&lt;td&gt;non-custodial&lt;/td&gt;
&lt;td&gt;optional&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;td&gt;Binance Pay&lt;/td&gt;
&lt;td&gt;0.8% on payouts (cap $5)&lt;/td&gt;
&lt;td&gt;custodial&lt;/td&gt;
&lt;td&gt;required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;td&gt;Bybit Pay&lt;/td&gt;
&lt;td&gt;1% conversion when swapping to USDT&lt;/td&gt;
&lt;td&gt;custodial&lt;/td&gt;
&lt;td&gt;required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;td&gt;Coinbase Payments&lt;/td&gt;
&lt;td&gt;no gateway fee; USDC on Base via Shopify&lt;/td&gt;
&lt;td&gt;hybrid&lt;/td&gt;
&lt;td&gt;required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;td&gt;Kraken Pay&lt;/td&gt;
&lt;td&gt;conversion at market rate&lt;/td&gt;
&lt;td&gt;custodial&lt;/td&gt;
&lt;td&gt;required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;td&gt;Coinify&lt;/td&gt;
&lt;td&gt;margin on customer exchange rates&lt;/td&gt;
&lt;td&gt;custodial&lt;/td&gt;
&lt;td&gt;required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;td&gt;Strike Business&lt;/td&gt;
&lt;td&gt;0.49-1.29% fiat conversion&lt;/td&gt;
&lt;td&gt;custodial&lt;/td&gt;
&lt;td&gt;required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.2%&lt;/td&gt;
&lt;td&gt;XAIGATE&lt;/td&gt;
&lt;td&gt;first 500 tx/mo free&lt;/td&gt;
&lt;td&gt;non-custodial&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.23%&lt;/td&gt;
&lt;td&gt;CoinRemitter&lt;/td&gt;
&lt;td&gt;charged on withdrawal only&lt;/td&gt;
&lt;td&gt;custodial&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.4%&lt;/td&gt;
&lt;td&gt;B2BinPay&lt;/td&gt;
&lt;td&gt;0.05% enterprise tier&lt;/td&gt;
&lt;td&gt;custodial&lt;/td&gt;
&lt;td&gt;required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.4%&lt;/td&gt;
&lt;td&gt;MaxelPay&lt;/td&gt;
&lt;td&gt;no monthly fee&lt;/td&gt;
&lt;td&gt;non-custodial&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.4%&lt;/td&gt;
&lt;td&gt;OxaPay&lt;/td&gt;
&lt;td&gt;from 0.4%&lt;/td&gt;
&lt;td&gt;custodial&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.4%&lt;/td&gt;
&lt;td&gt;Trybit (ex-CryptoCloud)&lt;/td&gt;
&lt;td&gt;from 0.4%&lt;/td&gt;
&lt;td&gt;custodial&lt;/td&gt;
&lt;td&gt;required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.5%&lt;/td&gt;
&lt;td&gt;NOWPayments&lt;/td&gt;
&lt;td&gt;volume discounts&lt;/td&gt;
&lt;td&gt;non-custodial&lt;/td&gt;
&lt;td&gt;optional&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.5%&lt;/td&gt;
&lt;td&gt;CoinPayments&lt;/td&gt;
&lt;td&gt;0.5% coins, 1% tokens&lt;/td&gt;
&lt;td&gt;custodial&lt;/td&gt;
&lt;td&gt;required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.5%&lt;/td&gt;
&lt;td&gt;Copperx&lt;/td&gt;
&lt;td&gt;~0.5%&lt;/td&gt;
&lt;td&gt;custodial&lt;/td&gt;
&lt;td&gt;required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.5%&lt;/td&gt;
&lt;td&gt;Crypto.com Pay&lt;/td&gt;
&lt;td&gt;zero tx fee; 0.5% settlement&lt;/td&gt;
&lt;td&gt;custodial&lt;/td&gt;
&lt;td&gt;required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.5%&lt;/td&gt;
&lt;td&gt;PassimPay&lt;/td&gt;
&lt;td&gt;+0.2% auto-conversion&lt;/td&gt;
&lt;td&gt;custodial&lt;/td&gt;
&lt;td&gt;required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.5%&lt;/td&gt;
&lt;td&gt;Paymento&lt;/td&gt;
&lt;td&gt;free up to $20k volume&lt;/td&gt;
&lt;td&gt;non-custodial&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.5%&lt;/td&gt;
&lt;td&gt;Plisio&lt;/td&gt;
&lt;td&gt;0.5% gateway fee&lt;/td&gt;
&lt;td&gt;custodial&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.5%&lt;/td&gt;
&lt;td&gt;Radom&lt;/td&gt;
&lt;td&gt;+ $0.50 per transaction&lt;/td&gt;
&lt;td&gt;hybrid&lt;/td&gt;
&lt;td&gt;required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.5%&lt;/td&gt;
&lt;td&gt;Sphere&lt;/td&gt;
&lt;td&gt;+ $0.05 per transaction&lt;/td&gt;
&lt;td&gt;custodial&lt;/td&gt;
&lt;td&gt;required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.5%&lt;/td&gt;
&lt;td&gt;Whalestack&lt;/td&gt;
&lt;td&gt;0.5% settlement&lt;/td&gt;
&lt;td&gt;custodial&lt;/td&gt;
&lt;td&gt;required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.8%&lt;/td&gt;
&lt;td&gt;Aurpay&lt;/td&gt;
&lt;td&gt;to 0.5% at volume&lt;/td&gt;
&lt;td&gt;non-custodial&lt;/td&gt;
&lt;td&gt;optional&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.8%&lt;/td&gt;
&lt;td&gt;Confirmo&lt;/td&gt;
&lt;td&gt;0.5% on payouts&lt;/td&gt;
&lt;td&gt;custodial&lt;/td&gt;
&lt;td&gt;required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.8%&lt;/td&gt;
&lt;td&gt;TripleA&lt;/td&gt;
&lt;td&gt;volume-tiered&lt;/td&gt;
&lt;td&gt;custodial&lt;/td&gt;
&lt;td&gt;required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.99%&lt;/td&gt;
&lt;td&gt;ALFAcoins&lt;/td&gt;
&lt;td&gt;0.99% flat&lt;/td&gt;
&lt;td&gt;custodial&lt;/td&gt;
&lt;td&gt;optional&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Fees as of August 2026, each read from the provider's official pricing page; per-row source links are in the &lt;a href="https://github.com/ShieldZCash/crypto-payment-gateways-dataset" rel="noopener noreferrer"&gt;dataset&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Low fee is necessary, not sufficient
&lt;/h2&gt;

&lt;p&gt;Two thirds of the sub-1% list is still custodial: the provider's wallet receives your money before you do, which is a &lt;a href="https://shieldz.cash/blog/custody-gap-crypto-payment-gateways" rel="noopener noreferrer"&gt;risk that no fee discount compensates&lt;/a&gt;. And 17 of the 35 still require business KYC before your first payment. If you filter the list to &lt;strong&gt;0% fee, non-custodial, and no KYC&lt;/strong&gt;, you are left with the open-source self-hosters (BTCPay, Bitcart, DV.net), an open protocol (Solana Pay), and Shieldz as the hosted option. That intersection is the cheapest way to accept crypto that exists, and it is &lt;a href="https://shieldz.cash/blog/easiest-crypto-payment-gateway" rel="noopener noreferrer"&gt;also the fastest to set up&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Fee minimization has a generational pattern too: gateways founded after 2022 have a median verified fee of 0%, versus 1% for the 2009-2014 cohort. The full breakdown is in &lt;a href="https://shieldz.cash/blog/crypto-payment-gateway-generations" rel="noopener noreferrer"&gt;gateway generations&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Which crypto payment gateways have the lowest fees in 2026?&lt;/strong&gt; 15 of 86 gateways advertise a verified 0% platform fee. The unconditionally free ones are Shieldz (hosted, non-custodial), BTCPay Server, Bitcart and DV.net (self-hosted) and Solana Pay (open protocol); others recover costs via payouts, conversion spreads or subscriptions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is a 0% crypto payment gateway really free?&lt;/strong&gt; Sometimes. Check three places where the fee migrates: payout/withdrawal fees (Binance Pay charges 0.8% there), conversion spreads (Bybit, Kraken, Coinify), and flat subscriptions (Zaprite, MyCryptoCheckout). A true-zero gateway leaves only network gas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How many gateways charge below the market median?&lt;/strong&gt; 35 of the 86 in the dataset have a fee verified below the 1% median on an official page: 15 at 0% and 20 between 0.2% and 0.99%.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do low fees mean the gateway is non-custodial?&lt;/strong&gt; No. About two thirds of the verified sub-1% gateways are still custodial. Fee and custody are independent axes; check both.&lt;/p&gt;

&lt;h2&gt;
  
  
  Independence statement
&lt;/h2&gt;

&lt;p&gt;This list is generated from independently collected data. &lt;strong&gt;We do not accept paid placements, sponsored positions, link sales, or any exchange of money for how a gateway appears here.&lt;/strong&gt; Providers have asked; the answer is no, at any price. Shieldz competes with many gateways on this list, including several we describe favorably above, which is why the &lt;a href="https://github.com/ShieldZCash/crypto-payment-gateways-dataset" rel="noopener noreferrer"&gt;raw data&lt;/a&gt;, methodology and per-row sources are public. Wrong row? &lt;a href="https://github.com/ShieldZCash/crypto-payment-gateways-dataset" rel="noopener noreferrer"&gt;Open a pull request&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>crypto</category>
      <category>payments</category>
      <category>fintech</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>Accept crypto payments in FastAPI (non-custodial, $0 fees)</title>
      <dc:creator>Shieldz</dc:creator>
      <pubDate>Sun, 05 Jul 2026 08:21:01 +0000</pubDate>
      <link>https://dev.to/shieldz/accept-crypto-payments-in-fastapi-non-custodial-0-fees-4c9b</link>
      <guid>https://dev.to/shieldz/accept-crypto-payments-in-fastapi-non-custodial-0-fees-4c9b</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Originally published on &lt;a href="https://shieldz.cash/accept-crypto-fastapi" rel="noopener noreferrer"&gt;shieldz.cash&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://shieldz.cash" rel="noopener noreferrer"&gt;Shieldz&lt;/a&gt; is a non-custodial crypto payment gateway: the buyer pays an address that belongs to you, funds settle straight to your own wallet, and there is no platform fee. Here is how to add it to a FastAPI app.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Create an invoice
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;shieldz&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Shieldz&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi.responses&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;RedirectResponse&lt;/span&gt;

&lt;span class="n"&gt;shieldz&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Shieldz&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SHIELDZ_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="nd"&gt;@app.post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/checkout&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;checkout&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;invoice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;shieldz&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;invoices&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;amount_usd_cents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;memo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Order&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;RedirectResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;invoice&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pay_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;303&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The customer lands on a hosted checkout and pays with Bitcoin, USDC/USDT on five chains, or shielded Zcash.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Verify the webhook
&lt;/h2&gt;

&lt;p&gt;Shieldz sends an HMAC-signed &lt;code&gt;invoice.paid&lt;/code&gt; webhook. Verify the signature before fulfilling:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;shieldz&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;construct_event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SignatureVerificationError&lt;/span&gt;

&lt;span class="nd"&gt;@app.post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/webhooks/shieldz&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;webhook&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;body&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;construct_event&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;x-shieldz-signature&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SHIELDZ_WEBHOOK_SECRET&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;SignatureVerificationError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;HTTPException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;invoice.paid&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="p"&gt;...&lt;/span&gt;  &lt;span class="c1"&gt;# fulfill the order
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ok&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why non-custodial
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;$0 platform fee&lt;/strong&gt; — you pay only network gas, never a percentage of sales.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No custody&lt;/strong&gt; — Shieldz only ever holds a public key, so there is nothing to freeze and nothing to skim. &lt;a href="https://shieldz.cash/verify" rel="noopener noreferrer"&gt;Verify it yourself&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No KYC to start.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Full guide and API docs: &lt;a href="https://shieldz.cash/accept-crypto-fastapi" rel="noopener noreferrer"&gt;Accept crypto in FastAPI&lt;/a&gt; and the &lt;a href="https://shieldz.cash/docs" rel="noopener noreferrer"&gt;API reference&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>python</category>
      <category>fastapi</category>
      <category>crypto</category>
      <category>payments</category>
    </item>
    <item>
      <title>Accept crypto payments in Next.js (non-custodial, $0 fees)</title>
      <dc:creator>Shieldz</dc:creator>
      <pubDate>Sun, 05 Jul 2026 08:20:30 +0000</pubDate>
      <link>https://dev.to/shieldz/accept-crypto-payments-in-nextjs-non-custodial-0-fees-2ai</link>
      <guid>https://dev.to/shieldz/accept-crypto-payments-in-nextjs-non-custodial-0-fees-2ai</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Originally published on &lt;a href="https://shieldz.cash/accept-crypto-nextjs" rel="noopener noreferrer"&gt;shieldz.cash&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Most crypto payment gateways hold your customers' money and take a cut. &lt;a href="https://shieldz.cash" rel="noopener noreferrer"&gt;Shieldz&lt;/a&gt; is non-custodial: the buyer pays an address that belongs to you, funds settle straight to your own wallet, and there is no platform fee. Here is how to wire it into a Next.js app.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Create an invoice
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/api/checkout/route.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Shieldz&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@shieldz/sdk&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;shieldz&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Shieldz&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SHIELDZ_API_KEY&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;POST&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;invoice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;shieldz&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;invoices&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;amount_usd_cents&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;memo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Order&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;redirect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;invoice&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pay_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;303&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The customer lands on a hosted checkout and pays with Bitcoin, USDC/USDT on five chains, or shielded Zcash.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Verify the webhook
&lt;/h2&gt;

&lt;p&gt;When the payment confirms, Shieldz sends an HMAC-signed &lt;code&gt;invoice.paid&lt;/code&gt; webhook. Verify the signature before fulfilling:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/api/webhooks/shieldz/route.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;constructEvent&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@shieldz/sdk&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;POST&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;constructEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nx"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;x-shieldz-signature&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SHIELDZ_WEBHOOK_SECRET&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;invoice.paid&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// fulfill the order&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ok&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bad signature&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why non-custodial
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;$0 platform fee&lt;/strong&gt; — you pay only network gas, never a percentage of sales.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No custody&lt;/strong&gt; — Shieldz only ever holds a public key, so there is nothing to freeze and nothing to skim. You can &lt;a href="https://shieldz.cash/verify" rel="noopener noreferrer"&gt;verify that yourself&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No KYC to start.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Full guide and API docs: &lt;a href="https://shieldz.cash/accept-crypto-nextjs" rel="noopener noreferrer"&gt;Accept crypto in Next.js&lt;/a&gt; and the &lt;a href="https://shieldz.cash/docs" rel="noopener noreferrer"&gt;API reference&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>crypto</category>
      <category>payments</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Best crypto payment gateways in 2026 (non-custodial vs custodial)</title>
      <dc:creator>Shieldz</dc:creator>
      <pubDate>Tue, 30 Jun 2026 22:02:26 +0000</pubDate>
      <link>https://dev.to/shieldz/best-crypto-payment-gateways-in-2026-non-custodial-vs-custodial-2m0h</link>
      <guid>https://dev.to/shieldz/best-crypto-payment-gateways-in-2026-non-custodial-vs-custodial-2m0h</guid>
      <description>&lt;p&gt;If you searched "best crypto payment gateways 2026," you have already seen ten listicles that rank whoever pays them the most. This one ranks on the only axis that actually changes your risk: &lt;strong&gt;who holds your money.&lt;/strong&gt; Everything else, fees, payout delays, account freezes, follows from that single decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one question that sorts every gateway
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Custodial&lt;/strong&gt; gateways receive the customer's coins into &lt;em&gt;their&lt;/em&gt; wallet, hold a balance for you, and pay you out on their schedule. Convenient, and the source of every percentage fee, payout delay, and "your account is under review" email.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Non-custodial&lt;/strong&gt; gateways never hold your money. You give a public receiving key, the customer pays an address that belongs to you, and the gateway only watches the chain and tells you it landed. No balance to skim, nothing to freeze.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sort the 2026 field by that first, then look at fees.&lt;/p&gt;

&lt;h2&gt;
  
  
  The comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Gateway&lt;/th&gt;
&lt;th&gt;Custody&lt;/th&gt;
&lt;th&gt;Platform fee&lt;/th&gt;
&lt;th&gt;KYC to start&lt;/th&gt;
&lt;th&gt;Coins&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Shieldz&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Non-custodial&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;$0&lt;/strong&gt; (network gas only)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;BTC, shielded Zcash, USDC/USDT on 5 chains&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BTCPay Server&lt;/td&gt;
&lt;td&gt;Non-custodial (self-hosted)&lt;/td&gt;
&lt;td&gt;$0 (you host it)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;BTC, Lightning, some altcoins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coinbase Commerce&lt;/td&gt;
&lt;td&gt;Custodial flows&lt;/td&gt;
&lt;td&gt;~1%&lt;/td&gt;
&lt;td&gt;Business verification&lt;/td&gt;
&lt;td&gt;Major coins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BitPay&lt;/td&gt;
&lt;td&gt;Custodial&lt;/td&gt;
&lt;td&gt;~1% + settlement&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Major coins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NOWPayments&lt;/td&gt;
&lt;td&gt;Processor-custody&lt;/td&gt;
&lt;td&gt;~0.5%+&lt;/td&gt;
&lt;td&gt;Varies&lt;/td&gt;
&lt;td&gt;300+ coins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CryptAPI&lt;/td&gt;
&lt;td&gt;Non-custodial router&lt;/td&gt;
&lt;td&gt;~1% per tx&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Many&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;(Honest note: BTCPay Server is excellent and genuinely non-custodial, but you run the servers, nodes, and uptime yourself. Shieldz is the hosted, $0-fee, non-custodial option for people who do not want to operate infrastructure.)&lt;/p&gt;

&lt;h2&gt;
  
  
  How to read it
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Custody first.&lt;/strong&gt; If a provider holds a balance, you have inherited their fraud risk, their payout schedule, and their right to freeze you. Prefer non-custodial. With &lt;a href="https://shieldz.cash" rel="noopener noreferrer"&gt;Shieldz&lt;/a&gt; you can &lt;a href="https://shieldz.cash/verify" rel="noopener noreferrer"&gt;verify the non-custodial claim yourself&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real cost, not headline rate.&lt;/strong&gt; "1%" usually hides withdrawal fees and float. A non-custodial model charges $0 and you pay only the blockchain's network gas. See the &lt;a href="https://shieldz.cash/crypto-payment-fees" rel="noopener noreferrer"&gt;full fee breakdown&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;KYC and privacy.&lt;/strong&gt; Decide up front whether you want to route customers through identity checks. Some gateways gate signup behind business documents; Shieldz has &lt;a href="https://shieldz.cash/no-kyc" rel="noopener noreferrer"&gt;no KYC to start&lt;/a&gt; and supports shielded Zcash.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coins your customers actually pay with.&lt;/strong&gt; You rarely need 300 long-tail coins. You need stablecoins, Bitcoin, and the chains your buyers use, with single-token settlement so you are not left holding volatility.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The honest pick for 2026
&lt;/h2&gt;

&lt;p&gt;If you want zero infrastructure, $0 platform fees, and to never hand custody to anyone: &lt;strong&gt;Shieldz&lt;/strong&gt;. If you are happy running your own server: &lt;strong&gt;BTCPay Server&lt;/strong&gt;. Everything else asks you to trade custody (and a percentage) for convenience.&lt;/p&gt;

&lt;p&gt;Read the practical version: &lt;a href="https://shieldz.cash/blog/how-to-accept-crypto-payments" rel="noopener noreferrer"&gt;how to accept crypto payments&lt;/a&gt;, or &lt;a href="https://merchant.shieldz.cash/signup" rel="noopener noreferrer"&gt;start free&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>crypto</category>
      <category>payments</category>
      <category>webdev</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>Crypto payment API: a 10-minute quickstart</title>
      <dc:creator>Shieldz</dc:creator>
      <pubDate>Tue, 30 Jun 2026 17:01:56 +0000</pubDate>
      <link>https://dev.to/shieldz/crypto-payment-api-a-10-minute-quickstart-dgl</link>
      <guid>https://dev.to/shieldz/crypto-payment-api-a-10-minute-quickstart-dgl</guid>
      <description>&lt;p&gt;If you want to accept crypto from your own backend, you want a &lt;strong&gt;crypto payment API&lt;/strong&gt; that is small, predictable, and does not take custody of your money. This is a 10-minute quickstart for the Shieldz API: create an invoice, send your customer to the hosted checkout, and verify the webhook that tells you it was paid. JSON in, JSON out, &lt;a href="https://dev.to/pricing"&gt;$0 platform fees&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The full reference lives in the &lt;a href="https://dev.to/docs"&gt;docs&lt;/a&gt;; this is the shortest path to a working integration.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Get a key
&lt;/h2&gt;

&lt;p&gt;Create a secret key in your dashboard under Developers. Keys are &lt;code&gt;sk_live_…&lt;/code&gt; (real funds) or &lt;code&gt;sk_test_…&lt;/code&gt; (test mode). The key is shown once, so store it safely.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxx
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Create an invoice
&lt;/h2&gt;

&lt;p&gt;One required field, &lt;code&gt;amount_usd_cents&lt;/code&gt;. Everything else is optional.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://shieldz.cash/api/v1/invoices &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer sk_live_…"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "amount_usd_cents": 5000,
    "memo": "Order #1234",
    "idempotency_key": "ord_1234",
    "metadata": { "order_id": "1234" }
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response is an invoice object with a &lt;code&gt;pay_url&lt;/code&gt;. Send your customer there, it is the hosted checkout with a QR code and a pay link. The customer can pay BTC, ETH, USDC, USDT, Zcash and more; you settle to the one token you chose, and the funds go straight to your wallet. Shieldz never holds them.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Verify the webhook
&lt;/h2&gt;

&lt;p&gt;When the payment confirms on-chain, Shieldz sends a signed &lt;code&gt;invoice.paid&lt;/code&gt; webhook. &lt;strong&gt;Always verify the signature&lt;/strong&gt; before you act on it. The header is &lt;code&gt;X-Shieldz-Signature: t=&amp;lt;unix&amp;gt;,v1=&amp;lt;hex&amp;gt;&lt;/code&gt;, where the hex is &lt;code&gt;HMAC_SHA256(secret, "&amp;lt;t&amp;gt;.&amp;lt;rawBody&amp;gt;")&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;node:crypto&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;verify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rawBody&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;header&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;parts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromEntries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;header&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;expected&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createHmac&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;sha256&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;rawBody&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;digest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hex&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;timingSafeEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;expected&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;v1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Express handler (use the RAW body, not the parsed one)&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/webhooks/shieldz&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;*/*&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ok&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;verify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;x-shieldz-signature&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SHIELDZ_WEBHOOK_SECRET&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;401&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;invoice.paid&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// fulfil the order — webhooks are idempotent and delivered at least once&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the whole integration: create, redirect, verify. Test the entire flow with a &lt;code&gt;sk_test_&lt;/code&gt; key and the dashboard's simulate-payment tool before you touch real funds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a non-custodial API matters for developers
&lt;/h2&gt;

&lt;p&gt;A custodial API quietly makes you responsible for someone else holding your customers' money. A non-custodial one does not: you only ever pass a public receiving key, payments land in your wallet, and there is no balance for anyone to freeze. If you are weighing the two paths, the &lt;a href="https://dev.to/blog/pay-any-coin-trust-tradeoff"&gt;pay-any-coin trust tradeoff&lt;/a&gt; post covers exactly what happens to custody when a buyer pays a different coin than you settle in.&lt;/p&gt;

&lt;h2&gt;
  
  
  SDKs
&lt;/h2&gt;

&lt;p&gt;If you would rather not hand-roll HTTP, there are official SDKs for &lt;a href="https://dev.to/sdks"&gt;Node, Python, Rust and PHP&lt;/a&gt;, plus an &lt;a href="https://dev.to/agents"&gt;MCP server&lt;/a&gt; so AI agents can create payment links with no API key at all.&lt;/p&gt;

&lt;p&gt;Ready? &lt;a href="https://dev.to/docs"&gt;Read the full API reference&lt;/a&gt; or &lt;a href="https://merchant.shieldz.cash/signup" rel="noopener noreferrer"&gt;start free&lt;/a&gt;. For the non-technical version, see &lt;a href="https://dev.to/blog/how-to-accept-crypto-payments"&gt;how to accept crypto payments&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>api</category>
      <category>crypto</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>What is a crypto payment gateway, and how to choose one</title>
      <dc:creator>Shieldz</dc:creator>
      <pubDate>Tue, 30 Jun 2026 16:54:43 +0000</pubDate>
      <link>https://dev.to/shieldz/what-is-a-crypto-payment-gateway-and-how-to-choose-one-2a5i</link>
      <guid>https://dev.to/shieldz/what-is-a-crypto-payment-gateway-and-how-to-choose-one-2a5i</guid>
      <description>&lt;p&gt;A &lt;strong&gt;crypto payment gateway&lt;/strong&gt; is the piece of infrastructure that lets a business accept cryptocurrency and turn it into a clean, confirmed payment: a checkout for the customer, address handling and conversion under the hood, and a notification to your app when the money arrives. Think of it as the crypto equivalent of a card payment gateway, minus the card networks taking a cut.&lt;/p&gt;

&lt;p&gt;That is the simple definition. The part that actually matters is &lt;em&gt;who holds the money&lt;/em&gt;, because every other difference between providers follows from it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Custodial vs non-custodial crypto payment processing
&lt;/h2&gt;

&lt;p&gt;There are two models, and they are not close.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Custodial.&lt;/strong&gt; The gateway receives the customer's coins into its own wallet, holds a balance for you, and pays you out on its schedule. This is how most "crypto payment platforms" work. It is convenient, and it is exactly where the problems come from: a percentage fee on every payment, payout delays "for security," and the standing ability to freeze or offboard your account. You did the work; they decide when you get paid.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Non-custodial.&lt;/strong&gt; The gateway never holds your money. You give it a public receiving key, the customer pays an address that belongs to you, and the gateway only watches the blockchain and tells you it landed. There is no balance to skim, no payout to delay, no account to freeze, because the funds were never in the middle. This is the model &lt;a href="https://dev.to/"&gt;Shieldz&lt;/a&gt; is built on, with &lt;a href="https://dev.to/pricing"&gt;$0 platform fees&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you only remember one thing about choosing a crypto payment gateway: &lt;strong&gt;non-custodial removes the entire risk category&lt;/strong&gt;, not just the fee. You can &lt;a href="https://dev.to/verify"&gt;verify the non-custodial claim yourself&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a good gateway does for you
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Hosted checkout.&lt;/strong&gt; A drop-in payment page so you do not build crypto UI yourself.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-coin acceptance with single-token settlement.&lt;/strong&gt; Customers pay BTC, ETH, USDC, USDT, Zcash and more; you receive the one token you chose. Volatile coins get routed through a swap so you are not left holding price risk.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Signed webhooks.&lt;/strong&gt; A verifiable, idempotent notification the instant a payment confirms on-chain, so fulfilment is automatic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An API and SDKs.&lt;/strong&gt; So the gateway fits your stack instead of the other way around. See the &lt;a href="https://dev.to/blog/crypto-payment-api"&gt;crypto payment API quickstart&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How to choose one: a short checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Custody:&lt;/strong&gt; non-custodial, or are they holding your balance? (This is the whole game.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real cost:&lt;/strong&gt; is it $0 + network gas, or a percentage plus withdrawal fees plus float? Here is the &lt;a href="https://dev.to/crypto-payment-fees"&gt;fee comparison&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;KYC:&lt;/strong&gt; can you start without uploading business documents? Shieldz has &lt;a href="https://dev.to/no-kyc"&gt;no KYC to start&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coins and chains:&lt;/strong&gt; does it cover what your customers actually pay with, across the chains you care about? See &lt;a href="https://dev.to/supported-coins"&gt;supported coins&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developer experience:&lt;/strong&gt; real &lt;a href="https://dev.to/docs"&gt;docs&lt;/a&gt;, signed webhooks, and SDKs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chargebacks:&lt;/strong&gt; on crypto they do not exist; a confirmed payment is final.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is also worth comparing specific providers directly, for example &lt;a href="https://dev.to/vs-coinbase-commerce"&gt;Shieldz vs Coinbase Commerce&lt;/a&gt;, &lt;a href="https://dev.to/vs-bitpay"&gt;vs BitPay&lt;/a&gt; and &lt;a href="https://dev.to/vs-btcpay"&gt;vs BTCPay Server&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bottom line
&lt;/h2&gt;

&lt;p&gt;A crypto payment gateway should make accepting crypto boring in the best way: customers pay, the right token lands in &lt;em&gt;your&lt;/em&gt; wallet, your app gets told, and nobody in the middle takes a cut or holds the money. If a provider cannot say "non-custodial" plainly, that is your answer.&lt;/p&gt;

&lt;p&gt;Want the practical version? Read &lt;a href="https://dev.to/blog/how-to-accept-crypto-payments"&gt;how to accept crypto payments&lt;/a&gt;, or &lt;a href="https://merchant.shieldz.cash/signup" rel="noopener noreferrer"&gt;start free&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>crypto</category>
      <category>payments</category>
      <category>webdev</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>How to accept crypto payments (a practical 2026 guide)</title>
      <dc:creator>Shieldz</dc:creator>
      <pubDate>Tue, 30 Jun 2026 16:54:42 +0000</pubDate>
      <link>https://dev.to/shieldz/how-to-accept-crypto-payments-a-practical-2026-guide-3nd6</link>
      <guid>https://dev.to/shieldz/how-to-accept-crypto-payments-a-practical-2026-guide-3nd6</guid>
      <description>&lt;p&gt;If you sell anything online, "how do I accept crypto payments?" has a longer answer than it should. Most guides quietly assume you will hand your money to a company that holds it, takes a cut, and decides when you can withdraw. You do not have to. This is the short, honest version of how to accept crypto payments in 2026, and how to do it without giving up custody of a single cent.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "accept crypto payments" actually means
&lt;/h2&gt;

&lt;p&gt;There are three separate things people lump together:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Receiving&lt;/strong&gt; the coins a customer sends.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Settling&lt;/strong&gt; into the asset you actually want (say, a stablecoin instead of a volatile coin).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Knowing&lt;/strong&gt; a payment happened so your app can ship the order.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A good setup does all three without ever taking custody of your funds. A custodial processor does all three by holding your money in the middle, which is where the fees, the payout delays, and the account freezes come from.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your options, briefly and honestly
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A custodial gateway&lt;/strong&gt; (the BitPay / Coinbase Commerce model). Easy to start, but they hold a balance, charge a percentage, and can freeze or offboard you. See the &lt;a href="https://dev.to/crypto-payment-fees"&gt;fee comparison&lt;/a&gt; and &lt;a href="https://dev.to/trust"&gt;why custody is the real cost&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run your own node&lt;/strong&gt; (BTCPay Server and friends). Fully self-hosted and non-custodial, but you maintain servers, nodes, and uptime yourself.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A non-custodial gateway&lt;/strong&gt; (what Shieldz is). You give a public receiving key, customers pay that address directly, and the service only watches the chain and notifies you. No balance to hold, nothing to freeze, &lt;a href="https://dev.to/pricing"&gt;$0 platform fees&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want the definition and the trade-offs in one place, the &lt;a href="https://dev.to/blog/what-is-a-crypto-payment-gateway"&gt;crypto payment gateway explainer&lt;/a&gt; goes deeper.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to accept crypto payments with Shieldz, in five minutes
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Sign in&lt;/strong&gt; with a wallet, Google, or Telegram. No business documents, &lt;a href="https://dev.to/no-kyc"&gt;no KYC to start&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add a receiving address&lt;/strong&gt; (or an extended public key / Zcash viewing key). Shieldz derives a fresh address per invoice from it; it never sees a spending key.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create an invoice&lt;/strong&gt; from the dashboard or the &lt;a href="https://dev.to/blog/crypto-payment-api"&gt;API&lt;/a&gt;. You get a hosted checkout link and a QR code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Send the customer&lt;/strong&gt; to that link. They pay BTC, ETH, USDC, USDT, Zcash or others from any wallet; you settle to the one token you chose.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Get a signed webhook&lt;/strong&gt; the moment it confirms on-chain, so your app can fulfil the order automatically.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is the whole loop. The money goes from the buyer's wallet to yours. We never touch it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which coins should you accept?
&lt;/h2&gt;

&lt;p&gt;Start with what people actually pay in: &lt;strong&gt;USDC and USDT&lt;/strong&gt; (stable, no volatility risk), &lt;strong&gt;Bitcoin&lt;/strong&gt;, and &lt;strong&gt;shielded Zcash&lt;/strong&gt; for privacy. You can read the per-coin guides for &lt;a href="https://dev.to/accept-bitcoin"&gt;Bitcoin&lt;/a&gt;, &lt;a href="https://dev.to/accept-usdc"&gt;USDC&lt;/a&gt;, &lt;a href="https://dev.to/accept-usdt"&gt;USDT&lt;/a&gt; and &lt;a href="https://dev.to/accept-zcash"&gt;Zcash&lt;/a&gt;. If a customer pays in a coin you do not settle in, an independent swap routes it and you still receive your chosen token.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to watch for
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Custody.&lt;/strong&gt; If a provider holds a balance for you, every other risk follows from that. Prefer non-custodial. &lt;a href="https://dev.to/verify"&gt;Verify it yourself.&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real cost.&lt;/strong&gt; "Low fee" often hides a percentage plus a withdrawal fee plus float. With a non-custodial model you pay only network gas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chargebacks.&lt;/strong&gt; They do not exist on crypto. A confirmed payment is final, which removes a whole category of fraud for digital goods.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy and KYC.&lt;/strong&gt; Decide up front whether you want to route customers through identity checks. Shieldz does not gate signup behind paperwork.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The one-line summary
&lt;/h2&gt;

&lt;p&gt;To accept crypto payments well: take the coins &lt;strong&gt;directly to your own wallet&lt;/strong&gt;, settle to a stablecoin if you want predictability, and use signed webhooks to automate fulfilment. That is exactly what Shieldz is built to do, for $0. &lt;a href="https://merchant.shieldz.cash/signup" rel="noopener noreferrer"&gt;Start free&lt;/a&gt; or &lt;a href="https://dev.to/docs"&gt;read the API docs&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>crypto</category>
      <category>payments</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
