<?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>Forem: jimquote</title>
    <description>The latest articles on Forem by jimquote (@jimquote).</description>
    <link>https://forem.com/jimquote</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3657978%2Fd38725c3-d243-4f0f-8805-42524c99623b.png</url>
      <title>Forem: jimquote</title>
      <link>https://forem.com/jimquote</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/jimquote"/>
    <language>en</language>
    <item>
      <title>PPanel 完整安装指南：从零开始部署代理面板</title>
      <dc:creator>jimquote</dc:creator>
      <pubDate>Fri, 26 Dec 2025 01:46:19 +0000</pubDate>
      <link>https://forem.com/jimquote/ppanel-122-wan-zheng-an-zhuang-zhi-nan-cong-ling-kai-shi-bu-shu-dai-li-mian-ban-ip6</link>
      <guid>https://forem.com/jimquote/ppanel-122-wan-zheng-an-zhuang-zhi-nan-cong-ling-kai-shi-bu-shu-dai-li-mian-ban-ip6</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;本文原载于 &lt;a href="https://blog.payin.com/zh/posts/ppanel-install-guide/" rel="noopener noreferrer"&gt;PayIn Blog&lt;/a&gt;，转载请注明出处。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frqzkhnuajhiumwze8m0k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frqzkhnuajhiumwze8m0k.png" alt="PPanel 安装指南" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;前言&lt;/strong&gt;：本文基于 PPanel 1.2.2 版本编写。由于 PPanel 项目持续更新，官方文档 &lt;a href="https://ppanel.dev/" rel="noopener noreferrer"&gt;https://ppanel.dev/&lt;/a&gt; 可能存在滞后，本文记录了我在实际安装过程中遇到的问题和解决方案，希望能帮助到同样踩坑的朋友。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  目录
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;PPanel 架构概述&lt;/li&gt;
&lt;li&gt;第一步：下载并解压 Server&lt;/li&gt;
&lt;li&gt;第二步：使用 Docker 安装 MySQL 和 Redis&lt;/li&gt;
&lt;li&gt;第三步：配置 ppanel.yaml&lt;/li&gt;
&lt;li&gt;第四步：启动 Server&lt;/li&gt;
&lt;li&gt;第五步：构建并部署前端&lt;/li&gt;
&lt;li&gt;第六步：Nginx 反向代理与 Cloudflare HTTPS 配置&lt;/li&gt;
&lt;li&gt;第七步：部署 PPanel Node&lt;/li&gt;
&lt;li&gt;总结&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  PPanel 架构概述
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6uxw62y31im5ubrib8h5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6uxw62y31im5ubrib8h5.png" alt="PPanel 架构图" width="800" height="497"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PPanel 由以下四个独立组件组成，可以部署在同一台服务器，也可以分布式部署：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;组件&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Server&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;核心后端服务，提供所有 API 接口&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Admin Frontend&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;管理员后台界面&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;User Frontend&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;用户前台界面&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PPanel Node&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;边缘节点代理服务&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  第一步：下载并解压 Server
&lt;/h2&gt;

&lt;p&gt;从 GitHub Releases 页面下载对应系统的服务端版本：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 以 Linux amd64 为例&lt;/span&gt;
wget https://github.com/perfect-panel/server/releases/download/v1.2.2/ppanel-server-linux-amd64.tar.gz

&lt;span class="c"&gt;# 解压&lt;/span&gt;
&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-xzf&lt;/span&gt; ppanel-server-linux-amd64.tar.gz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;解压后目录结构：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.
├── ppanel-server          # 可执行文件
└── etc/
    └── ppanel.yaml        # 配置文件（初始为空）
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  第二步：使用 Docker 安装 MySQL 和 Redis
&lt;/h2&gt;

&lt;p&gt;推荐使用 Docker 安装 MySQL 和 Redis，便于管理和迁移。&lt;/p&gt;

&lt;h3&gt;
  
  
  安装 Docker
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Ubuntu/Debian&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://get.docker.com | bash

&lt;span class="c"&gt;# 启动 Docker&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start docker
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  创建 Docker 网络
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker network create ppanel-net
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  启动 MySQL
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; ppanel-mysql &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--network&lt;/span&gt; ppanel-net &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;你的root密码 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;MYSQL_DATABASE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ppanel &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;MYSQL_USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ppanel &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;MYSQL_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;你的密码 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; ppanel-mysql-data:/var/lib/mysql &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 3306:3306 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--restart&lt;/span&gt; unless-stopped &lt;span class="se"&gt;\&lt;/span&gt;
  mysql:8.0 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--character-set-server&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;utf8mb4 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--collation-server&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;utf8mb4_unicode_ci
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  启动 Redis
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; ppanel-redis &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--network&lt;/span&gt; ppanel-net &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; ppanel-redis-data:/data &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 6379:6379 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--restart&lt;/span&gt; unless-stopped &lt;span class="se"&gt;\&lt;/span&gt;
  redis:7-alpine &lt;span class="se"&gt;\&lt;/span&gt;
  redis-server &lt;span class="nt"&gt;--appendonly&lt;/span&gt; &lt;span class="nb"&gt;yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;如需设置 Redis 密码：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; ppanel-redis &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--network&lt;/span&gt; ppanel-net &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; ppanel-redis-data:/data &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 6379:6379 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--restart&lt;/span&gt; unless-stopped &lt;span class="se"&gt;\&lt;/span&gt;
  redis:7-alpine &lt;span class="se"&gt;\&lt;/span&gt;
  redis-server &lt;span class="nt"&gt;--appendonly&lt;/span&gt; &lt;span class="nb"&gt;yes&lt;/span&gt; &lt;span class="nt"&gt;--requirepass&lt;/span&gt; 你的Redis密码
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  验证服务
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 检查容器状态&lt;/span&gt;
docker ps

&lt;span class="c"&gt;# 测试 MySQL 连接&lt;/span&gt;
docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; ppanel-mysql mysql &lt;span class="nt"&gt;-uppanel&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt;你的密码 &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"SHOW DATABASES;"&lt;/span&gt;

&lt;span class="c"&gt;# 测试 Redis 连接&lt;/span&gt;
docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; ppanel-redis redis-cli ping
&lt;span class="c"&gt;# 应返回 PONG&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  第三步：配置 ppanel.yaml
&lt;/h2&gt;

&lt;p&gt;参考 &lt;a href="https://github.com/perfect-panel/server/blob/master/doc/config-zh.md" rel="noopener noreferrer"&gt;配置文档&lt;/a&gt;，编辑 &lt;code&gt;etc/ppanel.yaml&lt;/code&gt;：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 服务器设置&lt;/span&gt;
&lt;span class="na"&gt;Host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;0.0.0.0&lt;/span&gt;
&lt;span class="na"&gt;Port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8080&lt;/span&gt;
&lt;span class="na"&gt;Debug&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;

&lt;span class="c1"&gt;# JWT 认证配置&lt;/span&gt;
&lt;span class="na"&gt;JwtAuth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;AccessSecret&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;请替换为一个随机的长字符串"&lt;/span&gt;  &lt;span class="c1"&gt;# 重要：用于 token 加密&lt;/span&gt;
  &lt;span class="na"&gt;AccessExpire&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;604800&lt;/span&gt;  &lt;span class="c1"&gt;# token 有效期，单位秒，默认 7 天&lt;/span&gt;

&lt;span class="c1"&gt;# MySQL 数据库配置（Docker）&lt;/span&gt;
&lt;span class="na"&gt;MySQL&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;Addr&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;127.0.0.1:3306"&lt;/span&gt;
  &lt;span class="na"&gt;Username&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ppanel"&lt;/span&gt;
  &lt;span class="na"&gt;Password&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;你的密码"&lt;/span&gt;
  &lt;span class="na"&gt;Dbname&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ppanel"&lt;/span&gt;
  &lt;span class="na"&gt;MaxIdleConns&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
  &lt;span class="na"&gt;MaxOpenConns&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;
  &lt;span class="na"&gt;LogMode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;info"&lt;/span&gt;
  &lt;span class="na"&gt;SlowThreshold&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1000&lt;/span&gt;

&lt;span class="c1"&gt;# Redis 缓存配置（Docker）&lt;/span&gt;
&lt;span class="na"&gt;Redis&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;Host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;127.0.0.1:6379"&lt;/span&gt;
  &lt;span class="na"&gt;Pass&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;  &lt;span class="c1"&gt;# 如果设置了密码则填入&lt;/span&gt;
  &lt;span class="na"&gt;DB&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;

&lt;span class="c1"&gt;# 管理员账户（首次启动时自动创建）&lt;/span&gt;
&lt;span class="na"&gt;Administer&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;Email&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;admin@example.com"&lt;/span&gt;  &lt;span class="na"&gt;Password&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;你的管理员密码"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;重要提示&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;AccessSecret&lt;/code&gt; 请使用随机生成的字符串，可用 &lt;code&gt;openssl rand -hex 32&lt;/code&gt; 生成&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Administer&lt;/code&gt; 配置仅在首次启动时生效，之后修改不会更新数据库&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  第四步：启动 Server
&lt;/h2&gt;

&lt;p&gt;使用 screen 或 tmux 在后台启动服务：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 使用 screen&lt;/span&gt;
screen &lt;span class="nt"&gt;-S&lt;/span&gt; ppanel

&lt;span class="c"&gt;# 启动服务&lt;/span&gt;
./ppanel-server run &lt;span class="nt"&gt;--config&lt;/span&gt; etc/ppanel.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;首次启动时，Server 会自动初始化数据库表结构，可以从终端日志中观察：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[INFO] Starting database migration...
[INFO] Creating table: users
[INFO] Creating table: servers
...
[INFO] Database migration completed
[INFO] Starting server on 0.0.0.0:8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;按 &lt;code&gt;Ctrl+A D&lt;/code&gt; 将 screen 放入后台。&lt;/p&gt;

&lt;h3&gt;
  
  
  验证服务是否正常
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://localhost:8080/v1/common/site/config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;如果返回 JSON 配置信息，说明服务启动成功。&lt;/p&gt;




&lt;h2&gt;
  
  
  第五步：构建并部署前端
&lt;/h2&gt;

&lt;h3&gt;
  
  
  环境准备
&lt;/h3&gt;

&lt;p&gt;推荐使用 Bun（也可使用 Node.js 20+）：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 安装 Bun&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://bun.sh/install | bash
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  克隆代码并安装依赖
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/perfect-panel/frontend.git
&lt;span class="nb"&gt;cd &lt;/span&gt;frontend
bun &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  配置环境变量
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;管理端&lt;/strong&gt; &lt;code&gt;apps/admin/.env.production&lt;/code&gt;：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;VITE_API_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://api.你的域名.com
&lt;span class="nv"&gt;VITE_CDN_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://cdn.jsdmirror.com
&lt;span class="nv"&gt;VITE_TUTORIAL_DOCUMENT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;用户端&lt;/strong&gt; &lt;code&gt;apps/user/.env.production&lt;/code&gt;：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;VITE_API_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://api.你的域名.com
&lt;span class="nv"&gt;VITE_CDN_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://cdn.jsdmirror.com
&lt;span class="nv"&gt;VITE_SHOW_LANDING_PAGE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  构建
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 构建所有应用&lt;/span&gt;
bun run build

&lt;span class="c"&gt;# 或分别构建&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;apps/admin &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; bun run build
&lt;span class="nb"&gt;cd &lt;/span&gt;apps/user &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; bun run build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;构建产物位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;管理端：&lt;code&gt;apps/admin/dist/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;用户端：&lt;code&gt;apps/user/dist/&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  部署到 Nginx
&lt;/h3&gt;

&lt;p&gt;将构建产物复制到 Web 目录：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /var/www/ppanel-admin /var/www/ppanel-user
&lt;span class="nb"&gt;sudo cp&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; apps/admin/dist/&lt;span class="k"&gt;*&lt;/span&gt; /var/www/ppanel-admin/
&lt;span class="nb"&gt;sudo cp&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; apps/user/dist/&lt;span class="k"&gt;*&lt;/span&gt; /var/www/ppanel-user/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;配置 Nginx（前端站点）：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;admin.你的域名.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;root&lt;/span&gt; &lt;span class="n"&gt;/var/www/ppanel-admin&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;index&lt;/span&gt; &lt;span class="s"&gt;index.html&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;try_files&lt;/span&gt; &lt;span class="nv"&gt;$uri&lt;/span&gt; &lt;span class="nv"&gt;$uri&lt;/span&gt;&lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="n"&gt;/index.html&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;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;user.你的域名.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;root&lt;/span&gt; &lt;span class="n"&gt;/var/www/ppanel-user&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;index&lt;/span&gt; &lt;span class="s"&gt;index.html&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;try_files&lt;/span&gt; &lt;span class="nv"&gt;$uri&lt;/span&gt; &lt;span class="nv"&gt;$uri&lt;/span&gt;&lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="n"&gt;/index.html&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;blockquote&gt;
&lt;p&gt;&lt;strong&gt;踩坑提醒&lt;/strong&gt;：不建议使用 Vercel 一键部署。实测发现 User 前端部署到 Vercel 后，&lt;code&gt;VITE_API_BASE_URL&lt;/code&gt; 环境变量不生效。这是因为 Vite 的环境变量在构建时会被打包进代码，Vercel 的运行时环境变量对其无效。&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  第六步：Nginx 反向代理与 Cloudflare HTTPS 配置
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1esk5pdhoknwjtokwed9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1esk5pdhoknwjtokwed9.png" alt="CORS 和 HTTPS 问题解决" width="800" height="395"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  问题说明
&lt;/h3&gt;

&lt;p&gt;前端部署完成后，你可能会遇到两个问题：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CORS 跨域拦截&lt;/strong&gt;：Admin/User 前端通过浏览器异步请求 Server API，当前端域名（如 &lt;code&gt;admin.example.com&lt;/code&gt;）与 API 域名（如 &lt;code&gt;api.example.com&lt;/code&gt;）不一致时，浏览器会触发 CORS 安全机制阻止请求。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;HTTPS 混合内容拦截&lt;/strong&gt;：前端通常部署在 HTTPS 下，而 PPanel Server 默认监听 HTTP 8080 端口。浏览器会阻止从 HTTPS 页面向 HTTP 接口发起请求。&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  配置 Nginx 反向代理解决 CORS
&lt;/h3&gt;

&lt;p&gt;创建 API 服务器的 Nginx 配置：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;api.你的域名.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;# 反向代理到 PPanel Server&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://127.0.0.1:8080&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;# 代理头信息&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Host&lt;/span&gt; &lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Real-IP&lt;/span&gt; &lt;span class="nv"&gt;$remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Forwarded-For&lt;/span&gt; &lt;span class="nv"&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Forwarded-Proto&lt;/span&gt; &lt;span class="nv"&gt;$scheme&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;# CORS 配置&lt;/span&gt;
        &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;'Access-Control-Allow-Origin'&lt;/span&gt; &lt;span class="s"&gt;'*'&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;'Access-Control-Allow-Methods'&lt;/span&gt; &lt;span class="s"&gt;'GET,&lt;/span&gt; &lt;span class="s"&gt;POST,&lt;/span&gt; &lt;span class="s"&gt;PUT,&lt;/span&gt; &lt;span class="s"&gt;DELETE,&lt;/span&gt; &lt;span class="s"&gt;OPTIONS'&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;'Access-Control-Allow-Headers'&lt;/span&gt; &lt;span class="s"&gt;'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization'&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;'Access-Control-Expose-Headers'&lt;/span&gt; &lt;span class="s"&gt;'Content-Length,Content-Range'&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;# 处理 OPTIONS 预检请求&lt;/span&gt;
        &lt;span class="kn"&gt;if&lt;/span&gt; &lt;span class="s"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request_method&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'OPTIONS')&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;'Access-Control-Allow-Origin'&lt;/span&gt; &lt;span class="s"&gt;'*'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;'Access-Control-Allow-Methods'&lt;/span&gt; &lt;span class="s"&gt;'GET,&lt;/span&gt; &lt;span class="s"&gt;POST,&lt;/span&gt; &lt;span class="s"&gt;PUT,&lt;/span&gt; &lt;span class="s"&gt;DELETE,&lt;/span&gt; &lt;span class="s"&gt;OPTIONS'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;'Access-Control-Allow-Headers'&lt;/span&gt; &lt;span class="s"&gt;'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;'Access-Control-Max-Age'&lt;/span&gt; &lt;span class="mi"&gt;1728000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;'Content-Type'&lt;/span&gt; &lt;span class="s"&gt;'text/plain&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="kn"&gt;charset=utf-8'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;'Content-Length'&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="kn"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;204&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;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;重载 Nginx：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nginx &lt;span class="nt"&gt;-t&lt;/span&gt;          &lt;span class="c"&gt;# 检查配置语法&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl reload nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  配置 Cloudflare 实现 HTTPS
&lt;/h3&gt;

&lt;p&gt;建议为所有三个域名（API、Admin、User）都配置 HTTPS，避免混合内容问题。使用 Cloudflare 的 Flexible SSL 是最简单的解决方案。&lt;/p&gt;

&lt;h4&gt;
  
  
  1. 将域名接入 Cloudflare
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;登录 &lt;a href="https://dash.cloudflare.com/" rel="noopener noreferrer"&gt;Cloudflare&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;添加你的域名，按提示修改 DNS 服务器&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  2. 添加 DNS 记录
&lt;/h4&gt;

&lt;p&gt;为三个子域名都添加 A 记录：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;名称&lt;/th&gt;
&lt;th&gt;内容&lt;/th&gt;
&lt;th&gt;代理状态&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;api&lt;/td&gt;
&lt;td&gt;你的服务器IP&lt;/td&gt;
&lt;td&gt;已代理（橙色云朵）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;admin&lt;/td&gt;
&lt;td&gt;你的服务器IP&lt;/td&gt;
&lt;td&gt;已代理（橙色云朵）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;user&lt;/td&gt;
&lt;td&gt;你的服务器IP&lt;/td&gt;
&lt;td&gt;已代理（橙色云朵）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;重要&lt;/strong&gt;：确保三个域名的代理状态都为"已代理"（橙色云朵），这样 Cloudflare 才会提供 HTTPS 证书&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  3. 配置 SSL/TLS 加密模式
&lt;/h4&gt;

&lt;p&gt;进入 &lt;strong&gt;SSL/TLS&lt;/strong&gt; → &lt;strong&gt;概述&lt;/strong&gt;，选择加密模式为 &lt;strong&gt;Flexible&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Flexible 模式说明&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;浏览器 ↔ Cloudflare：HTTPS（加密）&lt;/li&gt;
&lt;li&gt;Cloudflare ↔ 你的服务器：HTTP（不加密）&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这样无需在服务器配置 SSL 证书，Cloudflare 会自动为三个域名提供 HTTPS。&lt;/p&gt;

&lt;h3&gt;
  
  
  请求流程总结
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu9qch58zmycy9nr46jve.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu9qch58zmycy9nr46jve.png" alt="请求流程" width="800" height="1192"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  第七步：部署 PPanel Node
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi3a3rayp5hros60ohmpi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi3a3rayp5hros60ohmpi.png" alt="节点部署" width="800" height="395"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  在管理后台创建服务器
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;登录 Admin 前端&lt;/li&gt;
&lt;li&gt;进入 &lt;strong&gt;节点管理&lt;/strong&gt; → &lt;strong&gt;服务器管理&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;点击 &lt;strong&gt;新增服务器&lt;/strong&gt;，填入节点服务器信息&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;重要&lt;/strong&gt;：在选择协议配置时，&lt;strong&gt;必须指定协议端口&lt;/strong&gt;！否则虽然能保存成功，但协议实际上并未启用，后续节点无法正常工作。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  获取安装命令
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;服务器创建后，点击 &lt;strong&gt;连接&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;弹出安装命令，&lt;strong&gt;注意修改 API 主机地址&lt;/strong&gt;为你的 Server URL&lt;/li&gt;
&lt;li&gt;在节点服务器执行修改后的命令&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  创建节点
&lt;/h3&gt;

&lt;p&gt;安装完成后，管理界面可能仍显示服务器"离线"，这是正常的。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;在管理界面创建 &lt;strong&gt;节点&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;将节点关联到刚创建的服务器&lt;/li&gt;
&lt;li&gt;等待几分钟，服务器状态应变为"在线"&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  排查问题
&lt;/h3&gt;

&lt;p&gt;如果长时间未上线，到节点服务器查看日志：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ppnode log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;常见问题：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API 地址配置错误&lt;/li&gt;
&lt;li&gt;防火墙阻止了通信端口&lt;/li&gt;
&lt;li&gt;SSL 证书问题（如果使用 HTTPS）&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  总结
&lt;/h2&gt;

&lt;p&gt;至此，PPanel 完整安装完成！整体架构如下：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────┐     ┌─────────────────┐
│  Admin Frontend │     │  User Frontend  │
│  (admin.xxx)    │     │  (user.xxx)     │
└────────┬────────┘     └────────┬────────┘
         │                       │
         └───────────┬───────────┘
                     │ HTTPS (Cloudflare)
              ┌──────▼──────┐
              │   Server    │
              │  (api.xxx)  │
              └──────┬──────┘
                     │
         ┌───────────┼───────────┐
         │           │           │
    ┌────▼────┐ ┌────▼────┐ ┌────▼────┐
    │ Node 1  │ │ Node 2  │ │ Node N  │
    └─────────┘ └─────────┘ └─────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;其他高级配置（订阅、支付、邮件通知等），请参考 &lt;a href="https://ppanel.dev/" rel="noopener noreferrer"&gt;PPanel 官方文档&lt;/a&gt;。&lt;/p&gt;

&lt;h2&gt;
  
  
  资源链接
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ppanel.dev/" rel="noopener noreferrer"&gt;PPanel 官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/perfect-panel/server" rel="noopener noreferrer"&gt;PPanel Server GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/perfect-panel/frontend" rel="noopener noreferrer"&gt;PPanel Frontend GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/perfect-panel/server/blob/master/doc/config-zh.md" rel="noopener noreferrer"&gt;配置文档（中文）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;本文基于 PPanel v1.2.2 编写，更新于 2025 年 12 月 26 日。&lt;/em&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;原文链接：&lt;a href="https://blog.payin.com/zh/posts/ppanel-install-guide/" rel="noopener noreferrer"&gt;https://blog.payin.com/zh/posts/ppanel-install-guide/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>devops</category>
      <category>docker</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to accept USDC: A Complete Guide</title>
      <dc:creator>jimquote</dc:creator>
      <pubDate>Tue, 23 Dec 2025 23:55:53 +0000</pubDate>
      <link>https://forem.com/jimquote/how-to-get-paid-in-usdc-a-complete-guide-56kf</link>
      <guid>https://forem.com/jimquote/how-to-get-paid-in-usdc-a-complete-guide-56kf</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4hz7n8f6j61tf3eivl5s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4hz7n8f6j61tf3eivl5s.png" alt="How to Get Paid in USDC" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're reading this, you've probably had enough of waiting 2-5 business days for international wire transfers, paying $30-50 in bank fees, or watching 3% disappear to payment processors. USDC offers a better way.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why USDC?
&lt;/h2&gt;

&lt;p&gt;USDC (USD Coin) is a dollar-pegged stablecoin issued by Circle. Unlike Bitcoin or Ethereum, its value stays at $1, making it practical for real business payments.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa3wbc6w0whj92r7jz6k6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa3wbc6w0whj92r7jz6k6.png" alt="Traditional Payments vs USDC" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Traditional Bank Wire&lt;/th&gt;
&lt;th&gt;PayPal/Stripe&lt;/th&gt;
&lt;th&gt;USDC&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Speed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2-5 business days&lt;/td&gt;
&lt;td&gt;Instant to 2 days&lt;/td&gt;
&lt;td&gt;Minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fees&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$25-50 flat&lt;/td&gt;
&lt;td&gt;2.9% + $0.30&lt;/td&gt;
&lt;td&gt;$0.01-1 (network fee)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cross-border&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Complex, expensive&lt;/td&gt;
&lt;td&gt;Limited countries&lt;/td&gt;
&lt;td&gt;Global, borderless&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Settlement&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;T+2 to T+5&lt;/td&gt;
&lt;td&gt;T+2&lt;/td&gt;
&lt;td&gt;Instant&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Account Risk&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Can be frozen&lt;/td&gt;
&lt;td&gt;Can be frozen&lt;/td&gt;
&lt;td&gt;Self-custody&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The math is simple: for a $1,000 international payment, you might pay $40 in wire fees and wait a week. With USDC on Base or Polygon, you pay under $0.10 and receive funds in minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who Should Accept USDC?
&lt;/h2&gt;

&lt;p&gt;USDC payments make sense for:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cross-border Freelancers&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No more $30 wire fees eating into your $500 invoice&lt;/li&gt;
&lt;li&gt;Get paid from clients in any country&lt;/li&gt;
&lt;li&gt;No currency conversion delays or fees&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;API/SaaS Providers&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Serve global developers without Stripe's country restrictions&lt;/li&gt;
&lt;li&gt;Avoid chargebacks on digital goods&lt;/li&gt;
&lt;li&gt;Enable programmatic, metered billing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Digital Content Creators&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Receive direct payments from fans worldwide&lt;/li&gt;
&lt;li&gt;No platform taking 30% cuts&lt;/li&gt;
&lt;li&gt;Instant settlement for tips and donations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;E-commerce Merchants&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No chargebacks (blockchain transactions are final)&lt;/li&gt;
&lt;li&gt;Lower fees than credit cards&lt;/li&gt;
&lt;li&gt;Tap into the crypto-native customer base&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Current Payment Methods: A Comparison
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frtem7a5u04y7t5jsom2p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frtem7a5u04y7t5jsom2p.png" alt="USDC Payment Methods Overview" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's a comprehensive look at the available options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Direct wallet&lt;/strong&gt; - Share your address, receive payments manually&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payment processors&lt;/strong&gt; - Third-party services like Coinbase Commerce, Request Network, and Superfluid&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom solutions&lt;/strong&gt; - Build your own smart contracts or use protocols like x402&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1. Direct Wallet Address
&lt;/h3&gt;

&lt;p&gt;The simplest approach: share your wallet address and receive payments directly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; One-off transactions, personal payments, tips&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zero cost&lt;/li&gt;
&lt;li&gt;Complete control&lt;/li&gt;
&lt;li&gt;No third-party dependency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No payment tracking&lt;/li&gt;
&lt;li&gt;No invoicing&lt;/li&gt;
&lt;li&gt;Manual reconciliation&lt;/li&gt;
&lt;li&gt;No payment requests
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your USDC Address (Base): 0x1234...abcd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Payment Processors
&lt;/h3&gt;

&lt;p&gt;Third-party services that handle the complexity of crypto payments for you:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;th&gt;Fees&lt;/th&gt;
&lt;th&gt;Key Feature&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Coinbase Commerce&lt;/td&gt;
&lt;td&gt;E-commerce, product sales&lt;/td&gt;
&lt;td&gt;1%&lt;/td&gt;
&lt;td&gt;Shopify/WooCommerce plugins, brand trust&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Request Network&lt;/td&gt;
&lt;td&gt;B2B invoicing, accounts receivable&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;On-chain invoices, payment proofs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Superfluid&lt;/td&gt;
&lt;td&gt;Subscriptions, salaries&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Real-time streaming by the second&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Common Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Professional checkout/invoice experience&lt;/li&gt;
&lt;li&gt;Handles payment tracking automatically&lt;/li&gt;
&lt;li&gt;Multi-currency support&lt;/li&gt;
&lt;li&gt;Easier than building from scratch&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Common Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Third-party dependency&lt;/li&gt;
&lt;li&gt;Some require KYC&lt;/li&gt;
&lt;li&gt;Custody varies (Coinbase holds funds; Request/Superfluid are non-custodial)&lt;/li&gt;
&lt;li&gt;Less flexibility than custom solutions
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Coinbase Commerce example&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;charge&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;coinbaseCommerce&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;charges&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;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Premium Plan&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;pricing_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;fixed_price&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;local_price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;50.00&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;USD&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;// Superfluid streaming example&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;flowRate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;385802469135802&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// $1000/month in wei/second&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;sf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cfaV1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createFlow&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;receiver&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;merchantAddress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;superToken&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;USDCx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;flowRate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;flowRate&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Custom Smart Contract
&lt;/h3&gt;

&lt;p&gt;Build your own payment logic on-chain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Complex payment requirements, escrow, multi-party splits&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complete customization&lt;/li&gt;
&lt;li&gt;Programmable conditions&lt;/li&gt;
&lt;li&gt;No third-party fees&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;High development cost&lt;/li&gt;
&lt;li&gt;Security audit required&lt;/li&gt;
&lt;li&gt;Maintenance burden&lt;/li&gt;
&lt;li&gt;Smart contract risk&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Gap: What's Missing?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feba15j28py1bifzt32uw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feba15j28py1bifzt32uw.png" alt="Pull vs Push Payment Model" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Direct wallets and payment processors all share a common pattern: they're &lt;strong&gt;"pull" payments&lt;/strong&gt;. The user initiates and approves each transaction.&lt;/p&gt;

&lt;p&gt;This works for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One-time purchases&lt;/li&gt;
&lt;li&gt;Subscription sign-ups&lt;/li&gt;
&lt;li&gt;Invoice payments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But it fails for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pay-per-use APIs&lt;/strong&gt;: How do you charge $0.001 per API call?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Agent autonomy&lt;/strong&gt;: An AI can't click "approve" on MetaMask&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Metered services&lt;/strong&gt;: Real-time usage-based billing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Micropayments&lt;/strong&gt;: Transaction fees make small payments impractical&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're building an API service or working with AI agents, you've probably faced this problem: there's no good way to charge per request without building a complex prepaid credit system.&lt;/p&gt;

&lt;h2&gt;
  
  
  The New Option: x402 Protocol
&lt;/h2&gt;

&lt;p&gt;x402 is a new open protocol that flips the payment model. Instead of users initiating payments, the &lt;strong&gt;resource itself requests payment&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Client requests a paid resource&lt;/li&gt;
&lt;li&gt;Server returns HTTP 402 with payment requirements&lt;/li&gt;
&lt;li&gt;Client automatically signs and pays&lt;/li&gt;
&lt;li&gt;Server verifies and delivers the resource
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client                          Server
  |                               |
  |--- GET /api/data -----------&amp;gt;|
  |                               |
  |&amp;lt;-- 402 Payment Required -----|
  |    (price: $0.01, payTo: 0x..)|
  |                               |
  |--- GET /api/data -----------&amp;gt;|
  |    X-PAYMENT: [signed tx]     |
  |                               |
  |&amp;lt;-- 200 OK + data ------------|
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why this matters:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Payment Processors&lt;/th&gt;
&lt;th&gt;x402&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Initiation&lt;/td&gt;
&lt;td&gt;User-initiated&lt;/td&gt;
&lt;td&gt;Resource-initiated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Micropayments&lt;/td&gt;
&lt;td&gt;Impractical&lt;/td&gt;
&lt;td&gt;Native support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI Agent Compatible&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Per-request Billing&lt;/td&gt;
&lt;td&gt;Requires prepaid system&lt;/td&gt;
&lt;td&gt;Built-in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fees&lt;/td&gt;
&lt;td&gt;0-1%&lt;/td&gt;
&lt;td&gt;0% protocol fee&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Quick Example
&lt;/h3&gt;

&lt;p&gt;Adding x402 to an API is remarkably simple:&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Hono&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;hono&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&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;paymentMiddleware&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;402ok-hono&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;app&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;Hono&lt;/span&gt;&lt;span class="p"&gt;();&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;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/api/ai-summary&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;paymentMiddleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0xYourWallet&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;GET /api/ai-summary&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;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;$0.01&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;base&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="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;));&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;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;/api/ai-summary&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&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="c1"&gt;// This code only runs after payment is confirmed&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;summary&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;generateAISummary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&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="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;url&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;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;summary&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's it. No payment provider dashboard. No API keys. No custody concerns.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decision Guide: Which Method to Choose?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpeifcg5xaitmv7vobf1s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpeifcg5xaitmv7vobf1s.png" alt="Payment Method Decision Tree" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Use this framework to choose:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do you need invoicing for B2B clients?&lt;/strong&gt;&lt;br&gt;
→ &lt;strong&gt;Request Network&lt;/strong&gt; or direct wallet with separate invoicing tool&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Are you selling products or subscriptions?&lt;/strong&gt;&lt;br&gt;
→ &lt;strong&gt;Coinbase Commerce&lt;/strong&gt; for easy integration&lt;br&gt;
→ &lt;strong&gt;Superfluid&lt;/strong&gt; for pure streaming subscriptions&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do you need pay-per-use API billing?&lt;/strong&gt;&lt;br&gt;
→ &lt;strong&gt;x402&lt;/strong&gt; is purpose-built for this&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Building for AI agents or autonomous systems?&lt;/strong&gt;&lt;br&gt;
→ &lt;strong&gt;x402&lt;/strong&gt; with 402ok libraries&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Just need to receive one-off payments?&lt;/strong&gt;&lt;br&gt;
→ &lt;strong&gt;Direct wallet address&lt;/strong&gt; is simplest&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Need complete customization?&lt;/strong&gt;&lt;br&gt;
→ &lt;strong&gt;Custom smart contract&lt;/strong&gt; (but consider the maintenance burden)&lt;/p&gt;

&lt;h3&gt;
  
  
  Hybrid Approaches
&lt;/h3&gt;

&lt;p&gt;Many real applications combine methods:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;E-commerce + x402&lt;/strong&gt;: Coinbase Commerce for product checkout, x402 for API access&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SaaS + Streaming&lt;/strong&gt;: One-time setup fee via direct payment, subscription via Superfluid&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Marketplace + Escrow&lt;/strong&gt;: Custom smart contract for escrow, direct wallet for simple sales&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Option 1: Start with Direct Wallet
&lt;/h3&gt;

&lt;p&gt;The lowest barrier to entry:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a wallet (Coinbase Wallet, MetaMask, or any EVM wallet)&lt;/li&gt;
&lt;li&gt;Share your address for USDC on your preferred chain (Base recommended for low fees)&lt;/li&gt;
&lt;li&gt;Verify with a test transaction&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Option 2: Add Coinbase Commerce
&lt;/h3&gt;

&lt;p&gt;For e-commerce integration:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sign up at &lt;a href="https://commerce.coinbase.com" rel="noopener noreferrer"&gt;commerce.coinbase.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Complete merchant verification&lt;/li&gt;
&lt;li&gt;Install the Shopify/WooCommerce plugin or use their API&lt;/li&gt;
&lt;li&gt;Test with a small transaction&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Option 3: Implement x402
&lt;/h3&gt;

&lt;p&gt;For API monetization:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install the SDK: &lt;code&gt;npm install 402ok-hono&lt;/code&gt; (or Express, Fastify variants)&lt;/li&gt;
&lt;li&gt;Add the middleware to your paid routes&lt;/li&gt;
&lt;li&gt;Point it to your wallet address&lt;/li&gt;
&lt;li&gt;Deploy and test with Base Sepolia (testnet) first
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Get testnet USDC&lt;/span&gt;
&lt;span class="c"&gt;# Visit: https://faucet.circle.com&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;USDC payments are no longer experimental. With options ranging from simple wallet addresses to sophisticated protocols like x402, there's a solution for every use case.&lt;/p&gt;

&lt;p&gt;The key is matching the method to your needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Simplicity&lt;/strong&gt; → Direct wallet&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;E-commerce&lt;/strong&gt; → Coinbase Commerce&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Invoicing&lt;/strong&gt; → Request Network&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subscriptions&lt;/strong&gt; → Superfluid&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API/Micropayments&lt;/strong&gt; → x402&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The crypto payment infrastructure is maturing fast. The best time to start accepting USDC was yesterday. The second best time is now.&lt;/p&gt;




&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.circle.com/en/usdc" rel="noopener noreferrer"&gt;Circle USDC Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://commerce.coinbase.com" rel="noopener noreferrer"&gt;Coinbase Commerce&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://request.network" rel="noopener noreferrer"&gt;Request Network&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.superfluid.finance" rel="noopener noreferrer"&gt;Superfluid Protocol&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.x402.org" rel="noopener noreferrer"&gt;x402 Protocol&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Originally posted at &lt;a href="https://blog.payin.com/posts/how-to-get-paid-in-usdc/" rel="noopener noreferrer"&gt;blog.payin.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>x402 V2: What's New in the Internet-Native Payments Protocol</title>
      <dc:creator>jimquote</dc:creator>
      <pubDate>Tue, 23 Dec 2025 13:16:24 +0000</pubDate>
      <link>https://forem.com/jimquote/x402-v2-whats-new-in-the-internet-native-payments-protocol-2kaf</link>
      <guid>https://forem.com/jimquote/x402-v2-whats-new-in-the-internet-native-payments-protocol-2kaf</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally posted at &lt;a href="https://blog.payin.com/posts/x402-v2-whats-new/" rel="noopener noreferrer"&gt;blog.payin.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;The x402 protocol has hit a major milestone. Since its launch in May 2025, it has processed over &lt;strong&gt;100 million payments&lt;/strong&gt;. Now, with the release of V2 on December 11, 2025, the internet-native payments standard evolves beyond single-call transactions into a comprehensive payment infrastructure.&lt;/p&gt;

&lt;p&gt;Let's break down what's new and why it matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Evolution from V1 to V2
&lt;/h2&gt;

&lt;p&gt;The original x402 specification elegantly solved a core problem: enabling HTTP-native payments without intermediaries. You make a request, get a 402 response with payment requirements, pay, and access the resource.&lt;/p&gt;

&lt;p&gt;V2 keeps this simplicity while addressing the real-world needs that emerged from production usage:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multi-chain complexity&lt;/strong&gt; — Different networks, different tokens, different routing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repeated access&lt;/strong&gt; — Paying for every single request is inefficient&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developer experience&lt;/strong&gt; — Integrations required too much custom logic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ecosystem growth&lt;/strong&gt; — Adding new chains meant modifying core specs&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's New in V2
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Unified Payment Interface
&lt;/h3&gt;

&lt;p&gt;One of the biggest friction points in crypto payments is dealing with multiple networks and assets. V2 standardizes how networks and assets are identified across the entire protocol.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Supported Networks:
├── Base (Coinbase L2)
├── Solana
├── Other L2s
└── Traditional rails (ACH, SEPA)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key insight: &lt;strong&gt;no custom logic required&lt;/strong&gt;. Whether a user pays with USDC on Base or SOL on Solana, the protocol handles the differences. Services can accept payments from any supported chain without building chain-specific integrations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Extensible Architecture
&lt;/h3&gt;

&lt;p&gt;V2 introduces a clean separation between three layers:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Protocol Specification&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Core standard, rarely changes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SDK Implementation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Developer tools, frequently updated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Facilitators&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Payment processors, ecosystem participants&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This plugin-driven architecture means developers can register new chains and payment schemes without touching the core specification. Want to add support for a new L2? Write a plugin. New stablecoin? Plugin. The protocol grows without fragmenting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wallet-Based Access &amp;amp; Sessions
&lt;/h3&gt;

&lt;p&gt;Here's where V2 gets interesting. The original model required a payment for every resource access. Fine for one-time purchases, problematic for repeated interactions.&lt;/p&gt;

&lt;p&gt;V2 introduces the &lt;code&gt;@x402/paywall&lt;/code&gt; package with session support:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;User connects wallet and makes initial payment&lt;/li&gt;
&lt;li&gt;Service issues a session token tied to wallet identity&lt;/li&gt;
&lt;li&gt;Subsequent requests within the session skip the full payment flow&lt;/li&gt;
&lt;li&gt;No additional on-chain interactions needed&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This enables subscription-like experiences without traditional subscription infrastructure. Your wallet becomes your identity and your access credential.&lt;/p&gt;

&lt;h3&gt;
  
  
  Automatic Discovery
&lt;/h3&gt;

&lt;p&gt;Services now expose structured metadata that facilitators automatically crawl. Pricing, supported networks, and payment routes stay synchronized without manual updates.&lt;/p&gt;

&lt;p&gt;For developers, this means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No hardcoding facilitator endpoints&lt;/li&gt;
&lt;li&gt;Automatic route optimization&lt;/li&gt;
&lt;li&gt;Real-time pricing updates&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Multi-Facilitator Support
&lt;/h3&gt;

&lt;p&gt;V2 treats multiple facilitators as first-class citizens. Developers can express preferences:&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="c1"&gt;// Prefer Solana for lower fees&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;prefer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;solana&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Only accept USDC&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;assets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;usdc&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;// Use specific facilitator&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;facilitator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;preferred-facilitator.com&lt;/span&gt;&lt;span class="dl"&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 SDK handles chain selection and payment routing automatically. If your preferred path is congested or expensive, it falls back to alternatives.&lt;/p&gt;

&lt;h2&gt;
  
  
  New HTTP Headers
&lt;/h2&gt;

&lt;p&gt;V2 modernizes the HTTP header structure:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Header&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PAYMENT-REQUIRED&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Signals that payment is needed (replaces 402 body in some flows)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PAYMENT-SIGNATURE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Cryptographic proof of payment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PAYMENT-RESPONSE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Server acknowledgment of payment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SIGN-IN-WITH-X&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;em&gt;Coming soon&lt;/em&gt; — Wallet identity based on CAIP-122&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;SIGN-IN-WITH-X&lt;/code&gt; header is particularly notable. It enables wallet-based authentication following the CAIP-122 standard, bringing Sign-In with Ethereum (SIWE) patterns to the x402 ecosystem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Backward Compatibility
&lt;/h2&gt;

&lt;p&gt;V2 maintains backward compatibility with V1 implementations. The reference SDKs support both versions, so existing integrations continue working while you migrate to new features at your own pace.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Means for Developers
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Simpler Integrations
&lt;/h3&gt;

&lt;p&gt;Before V2, supporting multiple chains meant writing chain-specific code. Now:&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="c1"&gt;// V2: One integration, all chains&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;x402&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="s1"&gt;@x402/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;payment&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;x402&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pay&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.example.com/premium&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="c1"&gt;// SDK handles chain selection automatically&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Better User Experience
&lt;/h3&gt;

&lt;p&gt;Sessions mean users don't pay per-request. Automatic discovery means services always have current pricing. Multi-facilitator support means payments route through the best available path.&lt;/p&gt;

&lt;h3&gt;
  
  
  Future-Proof Architecture
&lt;/h3&gt;

&lt;p&gt;New chains and payment methods integrate as plugins. Your integration today will support networks that don't exist yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bigger Picture
&lt;/h2&gt;

&lt;p&gt;x402 V2 represents a maturation of internet-native payments. The protocol has moved from "proof of concept" to "production infrastructure" status.&lt;/p&gt;

&lt;p&gt;Key metrics tell the story:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;100M+ payments&lt;/strong&gt; processed since May 2025&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;600+ builders&lt;/strong&gt; in the community Telegram&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-chain support&lt;/strong&gt; across major L2s and traditional rails&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The vision remains the same: HTTP 402 as the standard for web payments, just as HTTP 200 is the standard for successful responses. V2 brings that vision closer to reality by solving the practical problems that emerged at scale.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;The x402 V2 specification and SDKs are available on GitHub through the Coinbase Developer Platform. The community is active on Telegram with 600+ developers building on the protocol.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;x402 is an open protocol for internet-native payments. Learn more at &lt;a href="https://x402.org" rel="noopener noreferrer"&gt;x402.org&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>news</category>
      <category>web3</category>
    </item>
    <item>
      <title>Payment Gateway vs. Payment Processor: Was ist der Unterschied?</title>
      <dc:creator>jimquote</dc:creator>
      <pubDate>Mon, 22 Dec 2025 04:41:30 +0000</pubDate>
      <link>https://forem.com/jimquote/payment-gateway-vs-payment-processor-was-ist-der-unterschied-5gad</link>
      <guid>https://forem.com/jimquote/payment-gateway-vs-payment-processor-was-ist-der-unterschied-5gad</guid>
      <description>&lt;p&gt;Wenn du schon einmal Online-Zahlungen in eine Anwendung integriert hast, bist du wahrscheinlich auf die Begriffe &lt;strong&gt;Payment Gateway&lt;/strong&gt; und &lt;strong&gt;Payment Processor&lt;/strong&gt; gestoßen. Viele Entwickler verwenden sie synonym, aber sie sind tatsächlich unterschiedliche Komponenten im Zahlungsökosystem.&lt;/p&gt;

&lt;p&gt;In diesem Artikel erkläre ich, was jede Komponente tut, wie sie zusammenarbeiten und was das für dich als Entwickler bedeutet.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📌 &lt;em&gt;Ursprünglich veröffentlicht auf: &lt;a href="https://blog.payin.com/posts/payment-gateway-vs-processor" rel="noopener noreferrer"&gt;https://blog.payin.com/posts/payment-gateway-vs-processor&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Das große Ganze: Wie Online-Zahlungen funktionieren
&lt;/h2&gt;

&lt;p&gt;Bevor wir ins Detail gehen, schauen wir uns an, was passiert, wenn ein Kunde auf deiner Website auf „Jetzt bezahlen" klickt.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw0v1md1li7e1fcouedik.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw0v1md1li7e1fcouedik.png" alt="Zahlungsablauf-Diagramm" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Der vereinfachte Ablauf:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Kunde&lt;/strong&gt; gibt seine Kartendaten auf deiner Checkout-Seite ein&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deine Website&lt;/strong&gt; sendet die Zahlungsanfrage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payment Gateway&lt;/strong&gt; verschlüsselt und überträgt die Daten sicher&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payment Processor&lt;/strong&gt; leitet die Transaktion an das Kartennetzwerk weiter&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kartennetzwerk&lt;/strong&gt; (Visa, Mastercard) leitet sie an die ausstellende Bank weiter&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ausstellende Bank&lt;/strong&gt; genehmigt oder lehnt die Transaktion ab&lt;/li&gt;
&lt;li&gt;Die Antwort läuft denselben Weg zurück&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Dieser gesamte Prozess dauert nur 2-3 Sekunden. Schauen wir uns nun die Hauptakteure an.&lt;/p&gt;

&lt;h2&gt;
  
  
  Was ist ein Payment Gateway?
&lt;/h2&gt;

&lt;p&gt;Stell dir ein Payment Gateway als das &lt;strong&gt;digitale Äquivalent eines Kassenterminals&lt;/strong&gt; vor. Wenn du deine Karte in einem Geschäft durchziehst, liest das POS-Terminal deine Karte und sendet die Daten. Online übernimmt das Payment Gateway dieselbe Aufgabe.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hauptaufgaben
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sensible Daten verschlüsseln&lt;/strong&gt;: Schützt Kartennummern während der Übertragung&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deine Website mit dem Zahlungsnetzwerk verbinden&lt;/strong&gt;: Fungiert als Brücke zwischen deiner App und dem Finanzsystem&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transaktionsergebnisse zurückgeben&lt;/strong&gt;: Teilt deiner App mit, ob die Zahlung erfolgreich war oder nicht&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Betrugserkennung&lt;/strong&gt;: Viele Gateways bieten grundlegende Betrugserkennung&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Aus Entwicklersicht
&lt;/h3&gt;

&lt;p&gt;Das Payment Gateway ist das, womit du tatsächlich interagierst. Wenn du Stripe, Braintree oder einen anderen Zahlungsdienst integrierst, arbeitest du mit deren Gateway-API.&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="c1"&gt;// Hier kommunizierst du mit dem Payment Gateway&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;stripe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;stripe&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sk_test_xxx&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;paymentIntent&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;stripe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;paymentIntents&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&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// 20,00 €&lt;/span&gt;
  &lt;span class="na"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;eur&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;payment_method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pm_card_visa&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;confirm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Das Gateway übernimmt Verschlüsselung, Übertragung und gibt das Ergebnis zurück&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;paymentIntent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 'succeeded'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Alles, was nach diesem API-Aufruf passiert – das Routing, die Bankkommunikation, die Autorisierung – wird im Hintergrund erledigt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Was ist ein Payment Processor?
&lt;/h2&gt;

&lt;p&gt;Der Payment Processor ist die &lt;strong&gt;Engine, die tatsächlich das Geld bewegt&lt;/strong&gt;. Während das Gateway die Datenübertragung übernimmt, kommuniziert der Processor mit Banken und Kartennetzwerken, um Transaktionen zu autorisieren und abzuwickeln.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hauptaufgaben
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Transaktionsautorisierung&lt;/strong&gt;: Prüft, ob die Karte gültig ist und ausreichend Deckung hat&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kommunikation mit Kartennetzwerken&lt;/strong&gt;: Spricht die Sprache von Visa, Mastercard usw.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Abwicklung&lt;/strong&gt;: Überweist Geld vom Kundenkonto auf das Händlerkonto&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compliance&lt;/strong&gt;: Erfüllt die komplexen regulatorischen Anforderungen&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Zwei Arten von Processoren
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Front-End-Processoren&lt;/strong&gt;: Verbinden sich mit Kartennetzwerken und übernehmen die Autorisierung&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Back-End-Processoren&lt;/strong&gt;: Übernehmen die Abwicklung und Geldtransfers&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Als Entwickler interagierst du selten direkt mit Processoren. Sie arbeiten im Hintergrund und erledigen die finanzielle Infrastruktur.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gateway vs. Processor: Die wichtigsten Unterschiede
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F41585j1fme7mea64xzty.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F41585j1fme7mea64xzty.png" alt="Gateway vs. Processor Vergleich" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspekt&lt;/th&gt;
&lt;th&gt;Payment Gateway&lt;/th&gt;
&lt;th&gt;Payment Processor&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hauptfunktion&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Datenverschlüsselung &amp;amp; -übertragung&lt;/td&gt;
&lt;td&gt;Transaktionsautorisierung &amp;amp; -abwicklung&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Wer nutzt es&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Entwickler/Händler&lt;/td&gt;
&lt;td&gt;Banken/Kartennetzwerke&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Technische Schnittstelle&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;REST-APIs, SDKs, gehostete Formulare&lt;/td&gt;
&lt;td&gt;Bankprotokolle (ISO 8583)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sichtbarkeit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Du programmierst direkt dagegen&lt;/td&gt;
&lt;td&gt;Arbeitet im Hintergrund&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Verarbeitete Daten&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Verschlüsselte Kartendaten&lt;/td&gt;
&lt;td&gt;Autorisierungsanfragen, Geldtransfers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PCI-Umfang&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Reduziert deine PCI-Last&lt;/td&gt;
&lt;td&gt;Vollständig PCI-konforme Infrastruktur&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Eine einfache Analogie
&lt;/h3&gt;

&lt;p&gt;Stell dir vor, du verschickst ein internationales Paket:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Payment Gateway&lt;/strong&gt; = Die Website des Versandunternehmens, auf der du Adressen eingibst und bezahlst&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payment Processor&lt;/strong&gt; = Das tatsächliche Logistiknetzwerk, das das Paket über Grenzen transportiert, den Zoll abwickelt und es zustellt&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Du interagierst mit der Website, aber die schwere Arbeit passiert im Logistiknetzwerk.&lt;/p&gt;

&lt;h2&gt;
  
  
  Die moderne Realität: All-in-One-Lösungen
&lt;/h2&gt;

&lt;p&gt;Jetzt wird es interessant. Die meisten modernen Zahlungsdienste wie &lt;strong&gt;Stripe&lt;/strong&gt;, &lt;strong&gt;PayPal&lt;/strong&gt;, &lt;strong&gt;Adyen&lt;/strong&gt; und &lt;strong&gt;Square&lt;/strong&gt; bieten sowohl Gateway- ALS AUCH Processor-Funktionalität.&lt;/p&gt;

&lt;h3&gt;
  
  
  Warum die Bündelung?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Einfachere Integration&lt;/strong&gt;: Eine API, ein Dashboard, ein Support-Team&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Schnelleres Onboarding&lt;/strong&gt;: Keine separaten Konten nötig&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bessere Entwicklererfahrung&lt;/strong&gt;: Einheitliche Dokumentation und SDKs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Klarere Preisgestaltung&lt;/strong&gt;: Eine Gebührenstruktur statt mehrerer
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Mit Stripe bekommst du Gateway + Processor in einem&lt;/span&gt;
&lt;span class="c1"&gt;// Keine separaten Dienste zu konfigurieren&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;charge&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;stripe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;charges&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&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;currency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;eur&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tok_visa&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Beispielzahlung&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Wann würdest du sie trennen?
&lt;/h3&gt;

&lt;p&gt;Einige Unternehmen nutzen weiterhin separate Gateway und Processor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Große Unternehmen&lt;/strong&gt; mit bestehenden Bankbeziehungen und ausgehandelten Tarifen&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Händler mit hohem Volumen&lt;/strong&gt;, bei denen kleine Gebührenunterschiede erheblich ins Gewicht fallen&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spezifische geografische Anforderungen&lt;/strong&gt;, wo lokale Processoren benötigt werden&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Branchenspezifische Bedürfnisse&lt;/strong&gt; wie Gaming, Erwachsenenunterhaltung oder Hochrisiko-Branchen&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Die richtige Lösung wählen
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Szenario A: Startup oder kleines Unternehmen
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Empfehlung&lt;/strong&gt;: All-in-One-Lösung (Stripe, Braintree, PayPal)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Schnelle Einrichtung (oft unter einer Stunde)&lt;/li&gt;
&lt;li&gt;Kein separates Händlerkonto nötig&lt;/li&gt;
&lt;li&gt;Vorhersehbare Preise&lt;/li&gt;
&lt;li&gt;Hervorragende Dokumentation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Szenario B: Etabliertes Unternehmen mit Bankbeziehungen
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Empfehlung&lt;/strong&gt;: Gateway-Only-Dienste in Betracht ziehen&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nutze deinen bestehenden Processor/Acquiring-Bank&lt;/li&gt;
&lt;li&gt;Potenziell niedrigere Transaktionsgebühren&lt;/li&gt;
&lt;li&gt;Mehr Kontrolle über den Zahlungs-Stack&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Szenario C: Großunternehmen mit hohem Volumen
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Empfehlung&lt;/strong&gt;: Gesamtbetriebskosten evaluieren&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Separate Gateway und Processor könnten Geld sparen&lt;/li&gt;
&lt;li&gt;Erhöht aber die Integrationskomplexität&lt;/li&gt;
&lt;li&gt;Benötigt ein dediziertes Payment-Operations-Team&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Was das für Entwickler bedeutet
&lt;/h2&gt;

&lt;p&gt;Wenn du eine Zahlungsintegration baust, solltest du Folgendes wissen:&lt;/p&gt;

&lt;h3&gt;
  
  
  Du programmierst gegen das Gateway
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Python-Beispiel mit Stripe
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;stripe&lt;/span&gt;
&lt;span class="n"&gt;stripe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sk_test_xxx&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# Erstelle einen PaymentIntent - das ist Gateway-Interaktion
&lt;/span&gt;&lt;span class="n"&gt;intent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;stripe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PaymentIntent&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&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1099&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;currency&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;eur&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;payment_method_types&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;card&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;# Bestätige die Zahlung
&lt;/span&gt;&lt;span class="n"&gt;confirmed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;stripe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PaymentIntent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;confirm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;payment_method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;pm_card_visa&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;# Die Processor-Arbeit passiert innerhalb von Stripes Infrastruktur
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;confirmed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# 'succeeded'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Gateway-Antworten richtig behandeln
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&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;payment&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;gateway&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;charge&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;eur&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;token&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;payment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;succeeded&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;// Datenbank aktualisieren, Bestätigung senden&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="nx"&gt;error&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;error&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="s1"&gt;card_error&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;// Karte wurde abgelehnt - benutzerfreundliche Nachricht anzeigen&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&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;error&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="s1"&gt;api_error&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;// Gateway hatte ein Problem - eventuell erneut versuchen&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;h3&gt;
  
  
  Der Processor ist abstrahiert
&lt;/h3&gt;

&lt;p&gt;Du musst dir keine Gedanken machen über:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Welche Acquiring-Bank deine Transaktion verarbeitet&lt;/li&gt;
&lt;li&gt;Wie Gelder auf dein Konto abgewickelt werden&lt;/li&gt;
&lt;li&gt;Die spezifischen Kartennetzwerk-Protokolle&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Das Gateway übernimmt all das für dich.&lt;/p&gt;

&lt;h2&gt;
  
  
  Häufige Missverständnisse
&lt;/h2&gt;

&lt;h3&gt;
  
  
  „Gateway und Processor sind dasselbe"
&lt;/h3&gt;

&lt;p&gt;Nein. Das Gateway übernimmt die Datenübertragung; der Processor bewegt tatsächlich das Geld. Moderne Plattformen bündeln sie nur zusammen.&lt;/p&gt;

&lt;h3&gt;
  
  
  „Ich brauche nur ein Gateway, um Zahlungen zu akzeptieren"
&lt;/h3&gt;

&lt;p&gt;Du brauchst beides. Ein Gateway allein kann keine Transaktionen autorisieren oder Geld bewegen. Wenn du einen Gateway-Only-Dienst nutzt, brauchst du einen separaten Processor/Händlerkonto.&lt;/p&gt;

&lt;h3&gt;
  
  
  „Processor-Gebühren sind immer gleich"
&lt;/h3&gt;

&lt;p&gt;Processor-Gebühren variieren je nach Kartentyp, Transaktionsvolumen, Geschäftsart und ausgehandelten Tarifen. Händler mit hohem Volumen verhandeln oft bessere Konditionen.&lt;/p&gt;

&lt;h3&gt;
  
  
  „All-in-One ist immer teurer"
&lt;/h3&gt;

&lt;p&gt;Nicht unbedingt. Während gebündelte Dienste transparente Preise haben, überwiegt die Bequemlichkeit oft kleine Gebührenunterschiede, besonders für kleinere Unternehmen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Zusammenfassung
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Komponente&lt;/th&gt;
&lt;th&gt;Was sie tut&lt;/th&gt;
&lt;th&gt;Wer sie sieht&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Payment Gateway&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Verschlüsselt &amp;amp; überträgt Zahlungsdaten&lt;/td&gt;
&lt;td&gt;Entwickler (APIs, SDKs)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Payment Processor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Autorisiert &amp;amp; wickelt Transaktionen ab&lt;/td&gt;
&lt;td&gt;Banken &amp;amp; Kartennetzwerke&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Die wichtigsten Punkte:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gateway&lt;/strong&gt; = Dein Integrationspunkt (APIs, Webhooks, gehostete Formulare)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Processor&lt;/strong&gt; = Die finanzielle Infrastruktur (läuft im Hintergrund)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Moderne Plattformen&lt;/strong&gt; (Stripe, PayPal usw.) kombinieren beides&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wähle All-in-One&lt;/strong&gt;, es sei denn, du hast spezifische Enterprise-Anforderungen&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Für die meisten Entwickler, die heute Zahlungsintegrationen bauen, ist der Unterschied hauptsächlich lehrreich. Du arbeitest mit einer einheitlichen API, die alles abwickelt. Aber zu verstehen, was unter der Haube passiert, macht dich zu einem besseren Entwickler und hilft beim Debuggen von Problemen oder Optimieren deines Zahlungsablaufs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Weiterführende Lektüre
&lt;/h2&gt;

&lt;p&gt;Wenn du tiefer in das Thema Zahlungen einsteigen möchtest:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PCI-DSS-Compliance&lt;/strong&gt;: Sicherheitsstandards für den Umgang mit Kartendaten&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3D Secure&lt;/strong&gt;: Zusätzliche Authentifizierungsebene (Visa Secure, Mastercard Identity Check)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payment Orchestration&lt;/strong&gt;: Verwaltung mehrerer Zahlungsanbieter&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Acquiring Banks vs. Issuing Banks&lt;/strong&gt;: Die anderen Hauptakteure im Ökosystem&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Hast du Fragen zu Zahlungsintegrationen? Schreib sie in die Kommentare!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>backend</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Payment Gateway vs Payment Processor: What's the Difference?</title>
      <dc:creator>jimquote</dc:creator>
      <pubDate>Mon, 22 Dec 2025 03:34:11 +0000</pubDate>
      <link>https://forem.com/jimquote/payment-gateway-vs-payment-processor-whats-the-difference-5h6d</link>
      <guid>https://forem.com/jimquote/payment-gateway-vs-payment-processor-whats-the-difference-5h6d</guid>
      <description>&lt;p&gt;If you've ever integrated online payments into an application, you've probably encountered the terms &lt;strong&gt;payment gateway&lt;/strong&gt; and &lt;strong&gt;payment processor&lt;/strong&gt;. Many developers use them interchangeably, but they're actually different components in the payment ecosystem.&lt;/p&gt;

&lt;p&gt;In this article, I'll break down what each one does, how they work together, and what this means for you as a developer.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📌 &lt;em&gt;Originally posted at: &lt;a href="https://blog.payin.com/posts/payment-gateway-vs-processor" rel="noopener noreferrer"&gt;PayIn&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The Big Picture: How Online Payments Work
&lt;/h2&gt;

&lt;p&gt;Before diving into the specifics, let's understand what happens when a customer clicks "Pay Now" on your website.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw0v1md1li7e1fcouedik.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw0v1md1li7e1fcouedik.png" alt="Payment Flow Diagram" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's the simplified flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Customer&lt;/strong&gt; enters their card details on your checkout page&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your Website&lt;/strong&gt; sends the payment request&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payment Gateway&lt;/strong&gt; encrypts and securely transmits the data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payment Processor&lt;/strong&gt; routes the transaction to the card network&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Card Network&lt;/strong&gt; (Visa, Mastercard) forwards it to the issuing bank&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Issuing Bank&lt;/strong&gt; approves or declines the transaction&lt;/li&gt;
&lt;li&gt;The response travels back through the same path&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This entire process happens in just 2-3 seconds. Now let's look at the key players.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a Payment Gateway?
&lt;/h2&gt;

&lt;p&gt;Think of a payment gateway as the &lt;strong&gt;digital equivalent of a point-of-sale terminal&lt;/strong&gt;. When you swipe your card at a physical store, the POS terminal reads your card and sends the data. Online, the payment gateway does the same job.&lt;/p&gt;

&lt;h3&gt;
  
  
  Core Responsibilities
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Encrypt sensitive data&lt;/strong&gt;: Protects card numbers during transmission&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connect your website to the payment network&lt;/strong&gt;: Acts as the bridge between your app and the financial system&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Return transaction results&lt;/strong&gt;: Tells your app if the payment succeeded or failed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fraud screening&lt;/strong&gt;: Many gateways include basic fraud detection&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  From a Developer's Perspective
&lt;/h3&gt;

&lt;p&gt;The payment gateway is what you actually interact with. When you integrate Stripe, Braintree, or any payment service, you're working with their gateway API.&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="c1"&gt;// This is you talking to the payment gateway&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;stripe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;stripe&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sk_test_xxx&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;paymentIntent&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;stripe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;paymentIntents&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&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// $20.00&lt;/span&gt;
  &lt;span class="na"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;usd&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;payment_method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pm_card_visa&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;confirm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// The gateway handles encryption, transmission, and returns the result&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;paymentIntent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 'succeeded'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything that happens after you call this API—the routing, bank communication, authorization—is handled behind the scenes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a Payment Processor?
&lt;/h2&gt;

&lt;p&gt;The payment processor is the &lt;strong&gt;engine that actually moves money&lt;/strong&gt;. While the gateway handles data transmission, the processor communicates with banks and card networks to authorize and settle transactions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Core Responsibilities
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Transaction authorization&lt;/strong&gt;: Checks if the card is valid and has sufficient funds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Communication with card networks&lt;/strong&gt;: Speaks the language of Visa, Mastercard, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Settlement&lt;/strong&gt;: Moves money from customer's bank to merchant's account&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compliance&lt;/strong&gt;: Handles the complex regulatory requirements&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Two Types of Processors
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Front-end processors&lt;/strong&gt;: Connect to card networks and handle authorization&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Back-end processors&lt;/strong&gt;: Handle settlement and fund transfers&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As a developer, you rarely interact with processors directly. They work in the background, handling the financial plumbing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gateway vs Processor: Key Differences
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F41585j1fme7mea64xzty.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F41585j1fme7mea64xzty.png" alt="Gateway vs Processor Comparison" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Payment Gateway&lt;/th&gt;
&lt;th&gt;Payment Processor&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Primary Function&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Data encryption &amp;amp; transmission&lt;/td&gt;
&lt;td&gt;Transaction authorization &amp;amp; settlement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Who Uses It&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Developers/Merchants&lt;/td&gt;
&lt;td&gt;Banks/Card networks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Technical Interface&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;REST APIs, SDKs, hosted forms&lt;/td&gt;
&lt;td&gt;Banking protocols (ISO 8583)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Visibility&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;You code against it directly&lt;/td&gt;
&lt;td&gt;Works behind the scenes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data Handled&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Encrypted card data&lt;/td&gt;
&lt;td&gt;Authorization requests, fund transfers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PCI Scope&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Reduces your PCI burden&lt;/td&gt;
&lt;td&gt;Fully PCI compliant infrastructure&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  A Simple Analogy
&lt;/h3&gt;

&lt;p&gt;Imagine sending an international package:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Payment Gateway&lt;/strong&gt; = The shipping company's website where you enter addresses and pay&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payment Processor&lt;/strong&gt; = The actual logistics network that moves the package across borders, handles customs, and delivers it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You interact with the website, but the heavy lifting happens in the logistics network.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Modern Reality: All-in-One Solutions
&lt;/h2&gt;

&lt;p&gt;Here's where it gets interesting. Most modern payment services like &lt;strong&gt;Stripe&lt;/strong&gt;, &lt;strong&gt;PayPal&lt;/strong&gt;, &lt;strong&gt;Adyen&lt;/strong&gt;, and &lt;strong&gt;Square&lt;/strong&gt; provide both gateway AND processor functionality.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why the Bundling?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Simpler integration&lt;/strong&gt;: One API, one dashboard, one support team&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Faster onboarding&lt;/strong&gt;: No need to set up separate accounts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better developer experience&lt;/strong&gt;: Unified documentation and SDKs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clearer pricing&lt;/strong&gt;: One fee structure instead of multiple
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// With Stripe, you get gateway + processor in one&lt;/span&gt;
&lt;span class="c1"&gt;// No need to configure separate services&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;charge&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;stripe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;charges&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&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;currency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;usd&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tok_visa&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Example charge&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  When Would You Separate Them?
&lt;/h3&gt;

&lt;p&gt;Some businesses still use separate gateway and processor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Large enterprises&lt;/strong&gt; with existing bank relationships and negotiated rates&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High-volume merchants&lt;/strong&gt; where small fee differences matter significantly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Specific geographic requirements&lt;/strong&gt; where local processors are needed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Industry-specific needs&lt;/strong&gt; like gaming, adult content, or high-risk verticals&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Choosing the Right Solution
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Scenario A: Startup or Small Business
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Recommendation&lt;/strong&gt;: All-in-one solution (Stripe, Braintree, PayPal)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quick setup (often under an hour)&lt;/li&gt;
&lt;li&gt;No separate merchant account needed&lt;/li&gt;
&lt;li&gt;Predictable pricing&lt;/li&gt;
&lt;li&gt;Great documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Scenario B: Established Business with Bank Relationships
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Recommendation&lt;/strong&gt;: Consider gateway-only services&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use your existing processor/acquiring bank&lt;/li&gt;
&lt;li&gt;Potentially lower transaction fees&lt;/li&gt;
&lt;li&gt;More control over the payment stack&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Scenario C: Enterprise with High Volume
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Recommendation&lt;/strong&gt;: Evaluate total cost of ownership&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Separate gateway and processor might save money&lt;/li&gt;
&lt;li&gt;But adds integration complexity&lt;/li&gt;
&lt;li&gt;Need dedicated payment operations team&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What This Means for Developers
&lt;/h2&gt;

&lt;p&gt;When you're building a payment integration, here's what you need to know:&lt;/p&gt;

&lt;h3&gt;
  
  
  You're Coding Against the Gateway
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Python example with Stripe
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;stripe&lt;/span&gt;
&lt;span class="n"&gt;stripe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sk_test_xxx&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# Create a PaymentIntent - this is gateway interaction
&lt;/span&gt;&lt;span class="n"&gt;intent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;stripe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PaymentIntent&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&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1099&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;currency&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;usd&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;payment_method_types&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;card&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;# Confirm the payment
&lt;/span&gt;&lt;span class="n"&gt;confirmed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;stripe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PaymentIntent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;confirm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;payment_method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;pm_card_visa&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;# The processor work happens inside Stripe's infrastructure
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;confirmed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# 'succeeded'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Handle Gateway Responses Properly
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&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;payment&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;gateway&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;charge&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;usd&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;token&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;payment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;succeeded&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;// Update your database, send confirmation&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="nx"&gt;error&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;error&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="s1"&gt;card_error&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;// Card was declined - show user-friendly message&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&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;error&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="s1"&gt;api_error&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;// Gateway had an issue - maybe retry&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;h3&gt;
  
  
  The Processor is Abstracted Away
&lt;/h3&gt;

&lt;p&gt;You don't need to worry about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which acquiring bank processes your transaction&lt;/li&gt;
&lt;li&gt;How funds are settled to your account&lt;/li&gt;
&lt;li&gt;The specific card network protocols used&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The gateway handles all of this for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Misconceptions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  "Gateway and processor are the same thing"
&lt;/h3&gt;

&lt;p&gt;No. Gateway handles data transmission; processor handles actual fund movement. Modern platforms just bundle them together.&lt;/p&gt;

&lt;h3&gt;
  
  
  "I only need a gateway to accept payments"
&lt;/h3&gt;

&lt;p&gt;You need both. A gateway alone can't authorize transactions or move money. If you use a gateway-only service, you'll need a separate processor/merchant account.&lt;/p&gt;

&lt;h3&gt;
  
  
  "Processor fees are always the same"
&lt;/h3&gt;

&lt;p&gt;Processor fees vary based on card type, transaction volume, business type, and negotiated rates. High-volume merchants often negotiate better rates.&lt;/p&gt;

&lt;h3&gt;
  
  
  "All-in-one is always more expensive"
&lt;/h3&gt;

&lt;p&gt;Not necessarily. While bundled services have straightforward pricing, the convenience often outweighs small fee differences, especially for smaller businesses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;What It Does&lt;/th&gt;
&lt;th&gt;Who Sees It&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Payment Gateway&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Encrypts &amp;amp; transmits payment data&lt;/td&gt;
&lt;td&gt;Developers (APIs, SDKs)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Payment Processor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Authorizes &amp;amp; settles transactions&lt;/td&gt;
&lt;td&gt;Banks &amp;amp; card networks&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Key takeaways:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gateway&lt;/strong&gt; = Your integration point (APIs, webhooks, hosted forms)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Processor&lt;/strong&gt; = The financial infrastructure (runs in the background)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modern platforms&lt;/strong&gt; (Stripe, PayPal, etc.) combine both&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Choose all-in-one&lt;/strong&gt; unless you have specific enterprise needs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For most developers building payment integrations today, the distinction is primarily educational. You'll work with a unified API that handles everything. But understanding what happens under the hood makes you a better engineer and helps when debugging issues or optimizing your payment flow.&lt;/p&gt;




&lt;h2&gt;
  
  
  Further Reading
&lt;/h2&gt;

&lt;p&gt;If you want to dive deeper into payments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PCI DSS Compliance&lt;/strong&gt;: Security standards for handling card data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3D Secure&lt;/strong&gt;: Additional authentication layer (Visa Secure, Mastercard Identity Check)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payment Orchestration&lt;/strong&gt;: Managing multiple payment providers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Acquiring Banks vs Issuing Banks&lt;/strong&gt;: The other key players in the ecosystem&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Have questions about payment integrations? Drop them in the comments!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>backend</category>
      <category>learning</category>
      <category>architecture</category>
      <category>api</category>
    </item>
    <item>
      <title>How to keep your OSX awake after closing screen</title>
      <dc:creator>jimquote</dc:creator>
      <pubDate>Sun, 21 Dec 2025 10:24:56 +0000</pubDate>
      <link>https://forem.com/jimquote/how-to-keep-your-osx-awake-after-closing-screen-551k</link>
      <guid>https://forem.com/jimquote/how-to-keep-your-osx-awake-after-closing-screen-551k</guid>
      <description>&lt;p&gt;There are a few ways to keep your Mac awake with the lid closed:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Clamshell Mode (Built-in)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is Apple's official method. Connect your Mac to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An external display&lt;/li&gt;
&lt;li&gt;A power adapter&lt;/li&gt;
&lt;li&gt;An external keyboard and mouse (or trackpad)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then close the lid. Your Mac will stay awake and use the external display.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Using the Terminal&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Run this command to prevent sleep indefinitely:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;caffeinate -s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Press &lt;code&gt;Ctrl+C&lt;/code&gt; to stop it. You can also set a time limit (e.g., &lt;code&gt;caffeinate -t 3600&lt;/code&gt; for 1 hour).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Third-Party Apps&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you need the Mac awake with the lid closed &lt;em&gt;without&lt;/em&gt; an external display (e.g., for downloads or running a server):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Amphetamine&lt;/strong&gt; (free on the Mac App Store) — has a "Closed-Display Mode" feature specifically for this&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;KeepingYouAwake&lt;/strong&gt; — a lightweight open-source alternative&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Important note:&lt;/strong&gt; Running with the lid closed without an external display can cause heat buildup since MacBooks partially vent through the keyboard. Amphetamine will warn you about this and requires you to enable the feature explicitly in its settings.&lt;/p&gt;

&lt;p&gt;Which use case are you trying to solve? I can give more specific guidance if needed.&lt;/p&gt;

</description>
      <category>cli</category>
      <category>productivity</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to Get Paid in USDC - The Easiest Way</title>
      <dc:creator>jimquote</dc:creator>
      <pubDate>Fri, 19 Dec 2025 13:29:26 +0000</pubDate>
      <link>https://forem.com/jimquote/how-to-accept-usdc-the-easiest-way-4k38</link>
      <guid>https://forem.com/jimquote/how-to-accept-usdc-the-easiest-way-4k38</guid>
      <description>&lt;p&gt;If you've ever tried to integrate cryptocurrency payments into your application, you know the pain. Between managing gas fees, handling multiple chains, dealing with custody concerns, and wrestling with complex wallet integrations, what seems like a simple "accept payment" feature can quickly turn into a multi-week engineering project.&lt;/p&gt;

&lt;p&gt;In this post, I'll walk through the technical landscape of USDC payment acceptance and share an approach that eliminates most of the friction.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Traditional Approach (and Why It's Hard)
&lt;/h2&gt;

&lt;p&gt;Let's say you want to accept USDC payments on Ethereum or Solana. Here's what you'd typically need to handle:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Gas Fee Management
&lt;/h3&gt;

&lt;p&gt;On EVM chains, every token transfer requires the sender to pay gas in the native token (ETH). This creates a terrible UX:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User: "I want to pay 100 USDC"
System: "Sure, but first you need 0.002 ETH for gas"
User: "I don't have ETH, I only have USDC"
System: "..."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You either force users to hold native tokens, or you build a complex gas abstraction layer yourself.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Multi-chain Complexity
&lt;/h3&gt;

&lt;p&gt;USDC exists on Ethereum, Polygon, Solana, Base, Arbitrum, and more. Each chain has different:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Contract addresses&lt;/li&gt;
&lt;li&gt;Transaction formats&lt;/li&gt;
&lt;li&gt;Confirmation times&lt;/li&gt;
&lt;li&gt;RPC endpoints&lt;/li&gt;
&lt;li&gt;Wallet connection methods&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Supporting even 2-3 chains means maintaining parallel codepaths.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Custody Concerns
&lt;/h3&gt;

&lt;p&gt;Most payment processors hold your funds temporarily. This introduces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Counterparty risk&lt;/li&gt;
&lt;li&gt;Compliance headaches&lt;/li&gt;
&lt;li&gt;Withdrawal delays&lt;/li&gt;
&lt;li&gt;Trust requirements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For many use cases, you just want funds to go directly to your wallet.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Webhook Reliability
&lt;/h3&gt;

&lt;p&gt;Building reliable payment notifications means handling:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Retry logic&lt;/li&gt;
&lt;li&gt;Signature verification&lt;/li&gt;
&lt;li&gt;Idempotency&lt;/li&gt;
&lt;li&gt;Chain reorgs&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A Better Approach: Gasless, Non-Custodial Payments
&lt;/h2&gt;

&lt;p&gt;The key insight is that modern stablecoins like USDC support &lt;strong&gt;meta-transactions&lt;/strong&gt; via ERC-3009 (EVM) and similar patterns on Solana. This means:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Users can authorize transfers by signing a message, without paying gas themselves.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here's how it works technically:&lt;/p&gt;

&lt;h3&gt;
  
  
  ERC-3009: Transfer With Authorization
&lt;/h3&gt;

&lt;p&gt;USDC implements &lt;code&gt;transferWithAuthorization&lt;/code&gt;, which allows gasless transfers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function transferWithAuthorization(
    address from,
    address to,
    uint256 value,
    uint256 validAfter,
    uint256 validBefore,
    bytes32 nonce,
    bytes memory signature
) external;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;User signs an EIP-712 typed message authorizing the transfer&lt;/li&gt;
&lt;li&gt;A relayer (who pays gas) submits the transaction with the signature&lt;/li&gt;
&lt;li&gt;USDC contract verifies the signature and executes the transfer&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The user never needs ETH. They just sign.&lt;/p&gt;

&lt;h3&gt;
  
  
  Building the Payment Flow
&lt;/h3&gt;

&lt;p&gt;Here's a simplified version of what a gasless payment integration looks like:&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;// Frontend: Collect user signature&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;domain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;USD Coin&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;chainId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8453&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Base&lt;/span&gt;
  &lt;span class="na"&gt;verifyingContract&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;USDC_ADDRESS&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;types&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;TransferWithAuthorization&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;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;from&lt;/span&gt;&lt;span class="dl"&gt;'&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="s1"&gt;address&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;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;to&lt;/span&gt;&lt;span class="dl"&gt;'&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="s1"&gt;address&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;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;value&lt;/span&gt;&lt;span class="dl"&gt;'&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="s1"&gt;uint256&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;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;validAfter&lt;/span&gt;&lt;span class="dl"&gt;'&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="s1"&gt;uint256&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;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;validBefore&lt;/span&gt;&lt;span class="dl"&gt;'&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="s1"&gt;uint256&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;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;nonce&lt;/span&gt;&lt;span class="dl"&gt;'&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="s1"&gt;bytes32&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="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;userAddress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;merchantAddress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;parseUnits&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;10&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;// 10 USDC&lt;/span&gt;
  &lt;span class="na"&gt;validAfter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;validBefore&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;nonce&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;randomBytes32&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;signature&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;wallet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;signTypedData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;types&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Backend: Submit to relayer for settlement&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&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;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://relayer.example.com/settle&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;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&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;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;base&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;message&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;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;txHash&lt;/span&gt; &lt;span class="p"&gt;}&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;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The relayer handles gas, the user just signs, and funds go directly to the merchant address.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical Implementation
&lt;/h2&gt;

&lt;p&gt;If you want to skip building all this infrastructure yourself, there are services that handle the relayer, multi-chain support, and notification systems out of the box.&lt;/p&gt;

&lt;p&gt;One option I've been exploring is &lt;a href="https://go.payin.com" rel="noopener noreferrer"&gt;Payin Go&lt;/a&gt;, which provides:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Payment Links (No-code)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create a payment link via API&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://go.payin.com/api/v1/link/create &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;'{
    "recipientAddress": "0xYourWallet...",
    "name": "My Store"
  }'&lt;/span&gt;

&lt;span class="c"&gt;# Response&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"linkId"&lt;/span&gt;: &lt;span class="s2"&gt;"abc123"&lt;/span&gt;,
  &lt;span class="s2"&gt;"payUrl"&lt;/span&gt;: &lt;span class="s2"&gt;"https://go.payin.com/link/abc123"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Share the link. Payers choose their chain, enter amount, sign, done. No gas needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;API Integration (Programmatic)&lt;/strong&gt;&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;// Create a checkout session&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;checkout&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;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://go.payin.com/api/v1/checkout/create&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;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&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;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;25.00&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;USDC&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;base-sepolia&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;recipientAddress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0xYourWallet...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;callbackUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://yoursite.com/webhook&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;callbackSecret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;your-webhook-secret&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="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;paymentId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;paymentUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;expiresAt&lt;/span&gt; &lt;span class="p"&gt;}&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;checkout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Redirect user to paymentUrl&lt;/span&gt;
&lt;span class="c1"&gt;// They pay, you get a webhook&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key properties:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Benefit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Non-custodial&lt;/td&gt;
&lt;td&gt;Funds go directly to your wallet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gasless&lt;/td&gt;
&lt;td&gt;Users pay with USDC only, no ETH/SOL needed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-chain&lt;/td&gt;
&lt;td&gt;Base, Solana, Polygon, etc. from one integration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No registration&lt;/td&gt;
&lt;td&gt;Start accepting payments in seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Handling Webhooks
&lt;/h2&gt;

&lt;p&gt;When a payment completes, you'll want to verify the webhook:&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createHmac&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="s1"&gt;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;verifyWebhook&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&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="kr"&gt;string&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;expected&lt;/span&gt; &lt;span class="o"&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="s1"&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="nx"&gt;payload&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="s1"&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;signature&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s2"&gt;`sha256=&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="s2"&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;// In your webhook handler&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="s1"&gt;/webhook&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;signature&lt;/span&gt; &lt;span class="o"&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="s1"&gt;x-payingo-signature&lt;/span&gt;&lt;span class="dl"&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="o"&gt;!&lt;/span&gt;&lt;span class="nf"&gt;verifyWebhook&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;rawBody&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;WEBHOOK_SECRET&lt;/span&gt;&lt;span class="p"&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;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&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="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Invalid 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="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;paymentId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;txHash&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;amount&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;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="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fulfillOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;paymentId&lt;/span&gt;&lt;span class="p"&gt;);&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;status&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="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Real-world Use Cases
&lt;/h2&gt;

&lt;p&gt;This pattern works well for:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;E-commerce&lt;/strong&gt;&lt;br&gt;
Fixed-price checkout with webhook confirmation. Customer pays, you ship.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SaaS Subscriptions&lt;/strong&gt;&lt;br&gt;
Generate payment links per customer, track via webhooks, activate accounts programmatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Donations / Tips&lt;/strong&gt;&lt;br&gt;
Create a permanent link, share it everywhere, receive payments with optional email notifications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Point of Sale&lt;/strong&gt;&lt;br&gt;
Real-time WebSocket notifications for in-person payments. Customer scans, pays, you hear a ding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI Agent Payments&lt;/strong&gt;&lt;br&gt;
HTTP 402 "Payment Required" responses for machine-to-machine micropayments. Your API can literally charge per request.&lt;/p&gt;
&lt;h2&gt;
  
  
  Solana Support
&lt;/h2&gt;

&lt;p&gt;The same pattern works on Solana, but instead of EIP-712 signatures, you use partially-signed transactions:&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;// User signs a transaction where feePayer is left blank&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;transaction&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;Transaction&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nf"&gt;createTransferCheckedInstruction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;userTokenAccount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;USDC_MINT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;merchantTokenAccount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;userPublicKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="c1"&gt;// decimals&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// User signs their part&lt;/span&gt;
&lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;partialSign&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userKeypair&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Send to relayer, who adds feePayer signature and submits&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;serialized&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;serialize&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;requireAllSignatures&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The relayer fills in the fee payer, signs, and broadcasts. User never needs SOL.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;Accepting USDC doesn't have to be complicated. The combination of:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Meta-transactions (ERC-3009) for gasless UX&lt;/li&gt;
&lt;li&gt;Non-custodial architecture for trust minimization&lt;/li&gt;
&lt;li&gt;Unified APIs across chains for simplicity&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;...makes it possible to add crypto payments to any application in an afternoon.&lt;/p&gt;

&lt;p&gt;If you're building something and want to accept stablecoin payments without the infrastructure headache, check out &lt;a href="https://go.payin.com" rel="noopener noreferrer"&gt;Payin Go&lt;/a&gt;. It's free to use and you can create your first payment link in about 30 seconds.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have questions about crypto payment integration? Drop a comment below or find me on Twitter.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;code&gt;#webdev&lt;/code&gt; &lt;code&gt;#blockchain&lt;/code&gt; &lt;code&gt;#payments&lt;/code&gt; &lt;code&gt;#cryptocurrency&lt;/code&gt; &lt;code&gt;#tutorial&lt;/code&gt;&lt;/p&gt;

</description>
      <category>cryptocurrency</category>
      <category>tutorial</category>
      <category>web3</category>
    </item>
    <item>
      <title>Claude Skills vs MCP: Complete Guide to Token-Efficient AI Agent Architecture</title>
      <dc:creator>jimquote</dc:creator>
      <pubDate>Tue, 16 Dec 2025 23:28:06 +0000</pubDate>
      <link>https://forem.com/jimquote/claude-skills-vs-mcp-complete-guide-to-token-efficient-ai-agent-architecture-4mkf</link>
      <guid>https://forem.com/jimquote/claude-skills-vs-mcp-complete-guide-to-token-efficient-ai-agent-architecture-4mkf</guid>
      <description>&lt;p&gt;&lt;em&gt;Learn when to use Claude Skills, MCP (Model Context Protocol), or both — with real-world examples and token consumption analysis.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;As AI agents become more capable, developers face a critical architectural decision: how do you extend Claude's capabilities efficiently without burning through your context window?&lt;/p&gt;

&lt;p&gt;Anthropic offers two powerful extension mechanisms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agent Skills&lt;/strong&gt;: Modular instruction packages that Claude loads on-demand&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP (Model Context Protocol)&lt;/strong&gt;: Standardized tool interfaces for external integrations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Choosing the right approach — or combining them effectively — can dramatically impact both token consumption and reliability. This guide breaks down everything you need to know.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Are Claude Skills?
&lt;/h2&gt;

&lt;p&gt;Skills are self-contained folders that package expertise into discoverable capabilities. Each Skill contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;code&gt;SKILL.md&lt;/code&gt; file with YAML frontmatter (metadata) and Markdown instructions&lt;/li&gt;
&lt;li&gt;Optional scripts, templates, and reference files&lt;/li&gt;
&lt;li&gt;Executable code that Claude can run&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How Skills Work
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User Request → Claude scans skill metadata → 
Matches relevant skill → Loads SKILL.md → 
Follows instructions → Executes task
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Skills operate through &lt;strong&gt;progressive disclosure&lt;/strong&gt; — Claude only loads what it needs, when it needs it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example Skill Structure
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pdf-processor/
├── SKILL.md           # Core instructions (~2-4k tokens)
├── REFERENCE.md       # Additional docs (loaded if needed)
├── extract_text.py    # Executable script
└── templates/
    └── output.json    # Output template
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  What Is MCP (Model Context Protocol)?
&lt;/h2&gt;

&lt;p&gt;MCP is a standardized protocol that allows Claude to interact with external services through well-defined tool interfaces. Think of it as a universal adapter for APIs.&lt;/p&gt;

&lt;h3&gt;
  
  
  How MCP Works
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User Request → Claude identifies need for external data →
Calls MCP tool with parameters → MCP server executes →
Returns structured response → Claude continues
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MCP servers expose &lt;strong&gt;functions&lt;/strong&gt; that Claude can call directly, similar to function calling in traditional APIs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example MCP Integration
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// MCP server exposes tools like:&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;create_task&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;description&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Create a new task in project management system&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;parameters&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;due_date&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;assignee&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Skills vs MCP: Key Differences
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Skills&lt;/th&gt;
&lt;th&gt;MCP&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Nature&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Instruction documents + scripts&lt;/td&gt;
&lt;td&gt;Standardized tool protocol&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Invocation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Model-invoked (Claude decides)&lt;/td&gt;
&lt;td&gt;Model-invoked via tool calls&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Environment&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Requires code execution sandbox&lt;/td&gt;
&lt;td&gt;Works without code execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Token Pattern&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Progressive loading&lt;/td&gt;
&lt;td&gt;Fixed per tool definition&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Flexibility&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;High (natural language instructions)&lt;/td&gt;
&lt;td&gt;Structured (defined schemas)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reliability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Depends on Claude's interpretation&lt;/td&gt;
&lt;td&gt;Deterministic execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Portability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cross-model compatible&lt;/td&gt;
&lt;td&gt;Anthropic ecosystem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Development&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Low barrier (Markdown + scripts)&lt;/td&gt;
&lt;td&gt;Requires server implementation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Token Consumption: A Deep Dive
&lt;/h2&gt;

&lt;p&gt;Understanding token economics is crucial for building efficient agents. Here's how each approach consumes tokens:&lt;/p&gt;

&lt;h3&gt;
  
  
  Skills: Progressive Disclosure Architecture
&lt;/h3&gt;

&lt;p&gt;Skills use a &lt;strong&gt;three-tier loading system&lt;/strong&gt; that minimizes token waste:&lt;/p&gt;

&lt;h4&gt;
  
  
  Tier 1: Metadata Scanning (~100 tokens per skill)
&lt;/h4&gt;

&lt;p&gt;At session start, Claude only sees the skill's name and description from the YAML frontmatter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;PDF Processor&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Extract text and tables from PDF files, fill forms, merge documents&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cost&lt;/strong&gt;: ~100 tokens × number of skills&lt;/p&gt;

&lt;p&gt;If you have 10 skills installed, that's only ~1,000 tokens baseline — regardless of how large each skill's full content is.&lt;/p&gt;

&lt;h4&gt;
  
  
  Tier 2: Full Instructions (&amp;lt;5k tokens)
&lt;/h4&gt;

&lt;p&gt;Only when Claude determines a skill is relevant does it load the complete &lt;code&gt;SKILL.md&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# PDF Processor&lt;/span&gt;

&lt;span class="gu"&gt;## Instructions&lt;/span&gt;
&lt;span class="p"&gt;1.&lt;/span&gt; Use PyMuPDF for text extraction
&lt;span class="p"&gt;2.&lt;/span&gt; Use pdfplumber for tables
&lt;span class="p"&gt;3.&lt;/span&gt; Always validate output format...

&lt;span class="gu"&gt;## Examples&lt;/span&gt;
[Detailed examples here]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cost&lt;/strong&gt;: Typically 2,000-5,000 tokens, but only for activated skills&lt;/p&gt;

&lt;h4&gt;
  
  
  Tier 3: Reference Files (Variable)
&lt;/h4&gt;

&lt;p&gt;Additional files are loaded only when specifically needed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# In SKILL.md:&lt;/span&gt;
For complex forms, refer to FORMS_REFERENCE.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cost&lt;/strong&gt;: Only if Claude reads the file&lt;/p&gt;

&lt;h4&gt;
  
  
  Tier 4: Script Execution (Output Only)
&lt;/h4&gt;

&lt;p&gt;When Claude runs a script, the script code &lt;strong&gt;never enters the context window&lt;/strong&gt;. Only the output does:&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="c1"&gt;# This script code = 0 tokens in context
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;validate_pdf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# 50 lines of Python...
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Validation passed: 3 pages, 2 tables detected&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# Only this output consumes tokens: ~15 tokens
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;This is extremely efficient for complex operations.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  MCP: Fixed Tool Definitions
&lt;/h3&gt;

&lt;p&gt;MCP tools have a different token pattern:&lt;/p&gt;

&lt;h4&gt;
  
  
  Tool Definitions (Fixed Cost)
&lt;/h4&gt;

&lt;p&gt;Each MCP tool definition consumes tokens in the system prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"asana_create_task"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Create a task in Asana"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"parameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"workspace_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"project_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; 
    &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"notes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"due_date"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"assignee"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cost&lt;/strong&gt;: ~100-300 tokens per tool, loaded every request&lt;/p&gt;

&lt;h4&gt;
  
  
  Tool Calls and Responses
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Tool call: ~50 tokens&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tool&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;asana_create_task&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;input&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Review Q3 report&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;due_date&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2025-01-15&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;// Response: Variable based on data returned&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;task_id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;12345&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;status&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;created&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;url&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://app.asana.com/...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Token Comparison Table
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Skills&lt;/th&gt;
&lt;th&gt;MCP&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;10 capabilities installed, none used&lt;/td&gt;
&lt;td&gt;~1,000 tokens&lt;/td&gt;
&lt;td&gt;~2,000 tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1 capability activated&lt;/td&gt;
&lt;td&gt;+2,000-5,000 tokens&lt;/td&gt;
&lt;td&gt;~200 tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Complex operation with scripts&lt;/td&gt;
&lt;td&gt;Output only (~100 tokens)&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Simple API call&lt;/td&gt;
&lt;td&gt;~3,000 tokens total&lt;/td&gt;
&lt;td&gt;~400 tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Heavy reference docs needed&lt;/td&gt;
&lt;td&gt;+5,000-20,000 tokens&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Key Insight
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Skills are more efficient&lt;/strong&gt; when capabilities are installed but rarely used&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP is more efficient&lt;/strong&gt; for frequent, simple API calls&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skills excel&lt;/strong&gt; when operations need complex scripts (code never enters context)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP excels&lt;/strong&gt; for structured, predictable tool interactions&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  When to Use Skills
&lt;/h2&gt;

&lt;p&gt;Choose Skills when you need:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Complex Business Logic
&lt;/h3&gt;

&lt;p&gt;Skills shine when Claude needs to understand context, not just execute commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Customer Support Skill&lt;/span&gt;

&lt;span class="gu"&gt;## Escalation Rules&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; VIP customers (tier: platinum) → Always escalate billing issues
&lt;span class="p"&gt;-&lt;/span&gt; Response SLA: 4 hours for critical, 24 hours for normal
&lt;span class="p"&gt;-&lt;/span&gt; Never offer refunds &amp;gt; $500 without manager approval

&lt;span class="gu"&gt;## Tone Guidelines&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Match customer's formality level
&lt;span class="p"&gt;-&lt;/span&gt; Acknowledge frustration before problem-solving
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Multi-Step Workflows
&lt;/h3&gt;

&lt;p&gt;When a task involves multiple tools and decision points:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Data Pipeline Skill&lt;/span&gt;

&lt;span class="gu"&gt;## Workflow&lt;/span&gt;
&lt;span class="p"&gt;1.&lt;/span&gt; Validate incoming CSV format
&lt;span class="p"&gt;2.&lt;/span&gt; If validation fails → Run repair_csv.py
&lt;span class="p"&gt;3.&lt;/span&gt; Transform using transform.py
&lt;span class="p"&gt;4.&lt;/span&gt; Load to database using load.py
&lt;span class="p"&gt;5.&lt;/span&gt; Generate summary report
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Heavy Computation via Scripts
&lt;/h3&gt;

&lt;p&gt;Offload processing to scripts — only results enter context:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Image Processing Skill&lt;/span&gt;

For batch image optimization, run:
$ python optimize_images.py --input ./uploads --quality 85

Script output will contain file paths and compression ratios.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Rapid Prototyping
&lt;/h3&gt;

&lt;p&gt;No server to maintain — just edit a Markdown file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Quick API Skill&lt;/span&gt;

&lt;span class="gu"&gt;## API Details&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Endpoint: https://api.example.com/v1
&lt;span class="p"&gt;-&lt;/span&gt; Auth: Bearer token from $API_KEY
&lt;span class="p"&gt;-&lt;/span&gt; Rate limit: 100 requests/minute

&lt;span class="gu"&gt;## Usage&lt;/span&gt;
Use curl or Python requests to call the API.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  When to Use MCP
&lt;/h2&gt;

&lt;p&gt;Choose MCP when you need:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Reliable, Structured Operations
&lt;/h3&gt;

&lt;p&gt;For CRUD operations where consistency matters:&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="c1"&gt;// MCP guarantees this exact call structure&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;mcp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;database_query&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;table&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;users&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;filter&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;active&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Real-Time External Data
&lt;/h3&gt;

&lt;p&gt;When you need current information from external services:&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="c1"&gt;// Slack MCP&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;mcp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;slack_search_messages&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;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;project update&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#engineering&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Cross-Platform Compatibility
&lt;/h3&gt;

&lt;p&gt;MCP works in Claude.ai, API, and Claude Code — even without code execution:&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="c1"&gt;// Works everywhere Claude runs&lt;/span&gt;
&lt;span class="nx"&gt;mcp_servers&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;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;url&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://mcp.notion.com/sse&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Existing MCP Ecosystem
&lt;/h3&gt;

&lt;p&gt;Leverage community-built servers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Slack, GitHub, Notion, Asana&lt;/li&gt;
&lt;li&gt;Google Drive, Gmail, Calendar&lt;/li&gt;
&lt;li&gt;Databases (PostgreSQL, MongoDB)&lt;/li&gt;
&lt;li&gt;And many more...&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Hybrid Approach: Skills + MCP Together
&lt;/h2&gt;

&lt;p&gt;The most powerful pattern combines both: &lt;strong&gt;Skills provide the "how" and "when," while MCP provides the "execute."&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Architecture
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-crm-integration/
├── SKILL.md              # Business rules + decision logic
└── (references MCP)      # Actual API calls via MCP
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Example: Sales Pipeline Skill with MCP
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Sales Pipeline Manager&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Manage sales opportunities with CRM integration&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# Sales Pipeline Manager&lt;/span&gt;

&lt;span class="gu"&gt;## When to Use This Skill&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; User asks about deals, opportunities, or pipeline
&lt;span class="p"&gt;-&lt;/span&gt; User wants to update deal stages
&lt;span class="p"&gt;-&lt;/span&gt; User needs sales forecasting

&lt;span class="gu"&gt;## Business Rules&lt;/span&gt;

&lt;span class="gu"&gt;### Stage Transitions&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; "Qualified" → "Proposal" requires: Budget confirmed + Decision maker identified
&lt;span class="p"&gt;-&lt;/span&gt; "Proposal" → "Negotiation" requires: Proposal sent + Follow-up scheduled
&lt;span class="p"&gt;-&lt;/span&gt; "Negotiation" → "Closed Won" requires: Contract signed

&lt;span class="gu"&gt;### Data Enrichment&lt;/span&gt;
Before creating a new contact, always:
&lt;span class="p"&gt;1.&lt;/span&gt; Search existing contacts via MCP: &lt;span class="sb"&gt;`salesforce_search`&lt;/span&gt;
&lt;span class="p"&gt;2.&lt;/span&gt; If duplicate found, update instead of create
&lt;span class="p"&gt;3.&lt;/span&gt; Log activity via MCP: &lt;span class="sb"&gt;`salesforce_log_activity`&lt;/span&gt;

&lt;span class="gu"&gt;## MCP Tools Available&lt;/span&gt;
Use these Salesforce MCP tools:
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`salesforce_search`&lt;/span&gt;: Find records
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`salesforce_create`&lt;/span&gt;: Create new records
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`salesforce_update`&lt;/span&gt;: Update existing records
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`salesforce_log_activity`&lt;/span&gt;: Log calls/emails

&lt;span class="gu"&gt;## Example Workflow&lt;/span&gt;

User: "Move the Acme deal to negotiation"
&lt;span class="p"&gt;
1.&lt;/span&gt; Search for deal: &lt;span class="sb"&gt;`salesforce_search({ object: "Opportunity", name: "Acme" })`&lt;/span&gt;
&lt;span class="p"&gt;2.&lt;/span&gt; Verify stage requirements (see Business Rules above)
&lt;span class="p"&gt;3.&lt;/span&gt; If requirements met: &lt;span class="sb"&gt;`salesforce_update({ id: "...", stage: "Negotiation" })`&lt;/span&gt;
&lt;span class="p"&gt;4.&lt;/span&gt; Log activity: &lt;span class="sb"&gt;`salesforce_log_activity({ type: "Stage Change", notes: "..." })`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Token Flow in Hybrid Approach
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Session Start:
├── Skill metadata loaded: ~100 tokens
└── MCP tool definitions: ~400 tokens
    Total baseline: ~500 tokens

User asks about Acme deal:
├── Full SKILL.md loaded: ~3,000 tokens
├── MCP search call: ~200 tokens
├── MCP update call: ~200 tokens  
└── MCP log call: ~150 tokens
    Total for task: ~3,550 tokens

Next simple query (skill already loaded):
├── MCP call only: ~200 tokens
    Incremental cost: ~200 tokens
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Real-World Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Example 1: Document Processing Pipeline
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Approach&lt;/strong&gt;: Skill with embedded scripts&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Contract Analyzer&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Extract and analyze key terms from legal contracts&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# Contract Analyzer&lt;/span&gt;

&lt;span class="gu"&gt;## Capabilities&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Extract party names, dates, terms
&lt;span class="p"&gt;-&lt;/span&gt; Identify risk clauses
&lt;span class="p"&gt;-&lt;/span&gt; Generate summary reports

&lt;span class="gu"&gt;## Workflow&lt;/span&gt;
&lt;span class="p"&gt;
1.&lt;/span&gt; &lt;span class="gs"&gt;**Extract Text**&lt;/span&gt;
   Run: &lt;span class="sb"&gt;`python extract_pdf.py {input_file}`&lt;/span&gt;
   Output: Raw text + structure metadata
&lt;span class="p"&gt;
2.&lt;/span&gt; &lt;span class="gs"&gt;**Analyze Terms**&lt;/span&gt;
   Run: &lt;span class="sb"&gt;`python analyze_contract.py {extracted_text}`&lt;/span&gt;
   Output: JSON with key terms
&lt;span class="p"&gt;
3.&lt;/span&gt; &lt;span class="gs"&gt;**Risk Assessment**&lt;/span&gt;
   Apply these rules:
&lt;span class="p"&gt;   -&lt;/span&gt; Unlimited liability → HIGH RISK
&lt;span class="p"&gt;   -&lt;/span&gt; No termination clause → MEDIUM RISK
&lt;span class="p"&gt;   -&lt;/span&gt; Auto-renewal &amp;gt; 1 year → MEDIUM RISK
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Token Efficiency&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Script execution: 0 tokens (code never loaded)&lt;/li&gt;
&lt;li&gt;Only outputs enter context: ~500 tokens per document&lt;/li&gt;
&lt;li&gt;Full analysis: ~4,000 tokens total&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example 2: Multi-Service Integration
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Approach&lt;/strong&gt;: Skill + Multiple MCP Servers&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Standup Report Generator&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Generate daily standup reports from multiple sources&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# Standup Report Generator&lt;/span&gt;

&lt;span class="gu"&gt;## Data Sources (via MCP)&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; GitHub: Pull requests, commits
&lt;span class="p"&gt;-&lt;/span&gt; Jira: Ticket updates, status changes
&lt;span class="p"&gt;-&lt;/span&gt; Slack: Team channel highlights

&lt;span class="gu"&gt;## Report Format&lt;/span&gt;
Generate markdown with:
&lt;span class="p"&gt;1.&lt;/span&gt; Yesterday's completed items
&lt;span class="p"&gt;2.&lt;/span&gt; Today's planned work
&lt;span class="p"&gt;3.&lt;/span&gt; Blockers

&lt;span class="gu"&gt;## MCP Queries&lt;/span&gt;

&lt;span class="gu"&gt;### GitHub&lt;/span&gt;
&lt;span class="sb"&gt;`github_list_prs({ author: "@me", since: "yesterday" })`&lt;/span&gt;
&lt;span class="sb"&gt;`github_list_commits({ author: "@me", since: "yesterday" })`&lt;/span&gt;

&lt;span class="gu"&gt;### Jira&lt;/span&gt;
&lt;span class="sb"&gt;`jira_search({ assignee: "currentUser", updated: "&amp;gt;-1d" })`&lt;/span&gt;

&lt;span class="gu"&gt;### Slack&lt;/span&gt;
&lt;span class="sb"&gt;`slack_search({ query: "from:@me", after: "yesterday" })`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Token Efficiency&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Skill instructions: ~2,000 tokens (loaded once)&lt;/li&gt;
&lt;li&gt;6 MCP calls: ~1,200 tokens&lt;/li&gt;
&lt;li&gt;Each subsequent day: Only MCP calls (~1,200 tokens)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example 3: API Integration Without MCP
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Approach&lt;/strong&gt;: Pure Skill with curl/Python&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Weather Integration&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Fetch weather data for travel planning&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# Weather Integration&lt;/span&gt;

&lt;span class="gu"&gt;## API Details&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Provider: OpenWeatherMap
&lt;span class="p"&gt;-&lt;/span&gt; Key: Use $WEATHER_API_KEY environment variable
&lt;span class="p"&gt;-&lt;/span&gt; Base URL: https://api.openweathermap.org/data/2.5

&lt;span class="gu"&gt;## Usage&lt;/span&gt;

For current weather:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
bash&lt;br&gt;
curl "&lt;a href="https://api.openweathermap.org/data/2.5/weather?q=%7Bcity%7D&amp;amp;appid=$WEATHER_API_KEY" rel="noopener noreferrer"&gt;https://api.openweathermap.org/data/2.5/weather?q={city}&amp;amp;appid=$WEATHER_API_KEY&lt;/a&gt;"&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
For 5-day forecast:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
bash&lt;br&gt;
curl "&lt;a href="https://api.openweathermap.org/data/2.5/forecast?q=%7Bcity%7D&amp;amp;appid=$WEATHER_API_KEY" rel="noopener noreferrer"&gt;https://api.openweathermap.org/data/2.5/forecast?q={city}&amp;amp;appid=$WEATHER_API_KEY&lt;/a&gt;"&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
## Response Handling
Parse JSON response and extract:
- temp: Convert from Kelvin to Celsius
- weather[0].description: Human-readable condition
- wind.speed: In meters/second
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;When to Use This Pattern&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No existing MCP server for the API&lt;/li&gt;
&lt;li&gt;Simple REST calls&lt;/li&gt;
&lt;li&gt;Quick integration without server maintenance&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Best Practices for Token Optimization
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Structure Skills for Progressive Loading
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Main SKILL.md (~2k tokens)&lt;/span&gt;
Core instructions that apply to most requests.

For advanced features, see ADVANCED.md
For API reference, see API_REFERENCE.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Separate rarely-used content into reference files.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Use Scripts for Heavy Lifting
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Don't&lt;/strong&gt;: Put 100 lines of data transformation logic in SKILL.md&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do&lt;/strong&gt;: Create a script and reference it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;For data transformation, run:
$ python transform.py --input data.json

The script handles all edge cases and validation.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Batch MCP Calls When Possible
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Inefficient&lt;/strong&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;await&lt;/span&gt; &lt;span class="nx"&gt;mcp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;get_user&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;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;mcp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;get_user&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;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;mcp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;get_user&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;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="c1"&gt;// 3 calls × ~200 tokens = 600 tokens&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Efficient&lt;/strong&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;await&lt;/span&gt; &lt;span class="nx"&gt;mcp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;get_users&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;ids&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="c1"&gt;// 1 call × ~250 tokens = 250 tokens&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Keep MCP Tool Descriptions Concise
&lt;/h3&gt;

&lt;p&gt;Every token in tool definitions is loaded every request:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verbose&lt;/strong&gt; (~300 tokens):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"This tool allows you to create a new task in the project management system. You can specify the task title, description, due date, priority level, assignee, project, tags, and custom fields. The task will be created and a confirmation with the task ID will be returned."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Concise&lt;/strong&gt; (~80 tokens):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Create a task. Returns task ID on success."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Choose the Right Tool for the Job
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;Recommendation&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Simple API call&lt;/td&gt;
&lt;td&gt;MCP&lt;/td&gt;
&lt;td&gt;Lower overhead, deterministic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Complex workflow&lt;/td&gt;
&lt;td&gt;Skill&lt;/td&gt;
&lt;td&gt;Natural language instructions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data processing&lt;/td&gt;
&lt;td&gt;Skill + Script&lt;/td&gt;
&lt;td&gt;Code never enters context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Real-time data&lt;/td&gt;
&lt;td&gt;MCP&lt;/td&gt;
&lt;td&gt;Direct external access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Business rules&lt;/td&gt;
&lt;td&gt;Skill&lt;/td&gt;
&lt;td&gt;Easy to read/update&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frequent operations&lt;/td&gt;
&lt;td&gt;MCP&lt;/td&gt;
&lt;td&gt;Consistent execution&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Skills and MCP are complementary technologies, not competitors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Skills&lt;/strong&gt; provide flexible, context-rich instructions with excellent token efficiency for complex workflows&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP&lt;/strong&gt; provides reliable, structured tool access for external integrations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Combined&lt;/strong&gt;, they create powerful AI agents that are both intelligent and efficient&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key to token optimization is understanding the loading patterns:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Skills use progressive disclosure — only pay for what you use&lt;/li&gt;
&lt;li&gt;MCP definitions are always loaded — keep them concise&lt;/li&gt;
&lt;li&gt;Scripts are the ultimate token saver — code never enters context&lt;/li&gt;
&lt;li&gt;The hybrid approach often provides the best of both worlds&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Start simple, measure your token usage, and evolve your architecture based on real-world patterns.&lt;/p&gt;




&lt;h2&gt;
  
  
  Further Reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.claude.com/en/docs/agents-and-tools/agent-skills/overview" rel="noopener noreferrer"&gt;Agent Skills Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://support.claude.com/en/articles/12512198-how-to-create-custom-skills" rel="noopener noreferrer"&gt;Creating Custom Skills&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://modelcontextprotocol.io/" rel="noopener noreferrer"&gt;MCP Specification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/anthropics/skills" rel="noopener noreferrer"&gt;Anthropic Skills Repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Last updated: December 2025&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>performance</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Building a Gasless Crypto Payment Flow: How ERC-3009 Eliminates User Gas Fees</title>
      <dc:creator>jimquote</dc:creator>
      <pubDate>Tue, 16 Dec 2025 13:34:02 +0000</pubDate>
      <link>https://forem.com/jimquote/building-a-gasless-crypto-payment-flow-how-erc-3009-eliminates-user-gas-fees-29mk</link>
      <guid>https://forem.com/jimquote/building-a-gasless-crypto-payment-flow-how-erc-3009-eliminates-user-gas-fees-29mk</guid>
      <description>&lt;p&gt;Gas fees have always been a UX nightmare for crypto payments. Users want to pay with USDC, but they need ETH first. This article explores a practical implementation using PayinGo — a payment service that leverages ERC-3009 signatures to make users' gas fees disappear.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Technical Challenge
&lt;/h2&gt;

&lt;p&gt;When a user pays with ERC-20 tokens, they must:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Hold the native token (ETH/SOL) for gas&lt;/li&gt;
&lt;li&gt;Approve the token transfer&lt;/li&gt;
&lt;li&gt;Execute the transfer&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This creates a chicken-and-egg problem: users can't spend their stablecoins without first acquiring gas tokens. Most solutions involve wrapping, meta-transactions, or relayers with complex smart contracts.&lt;/p&gt;

&lt;p&gt;ERC-3009 offers a cleaner path.&lt;/p&gt;




&lt;h2&gt;
  
  
  How ERC-3009 Works
&lt;/h2&gt;

&lt;p&gt;ERC-3009 (TransferWithAuthorization) allows token transfers via off-chain signatures. Instead of the user submitting a transaction, they sign an authorization message. Anyone holding that signature can execute the transfer on-chain.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function transferWithAuthorization(
    address from,
    address to,
    uint256 value,
    uint256 validAfter,
    uint256 validBefore,
    bytes32 nonce,
    uint8 v, bytes32 r, bytes32 s
) external;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;USDC on major chains (Base, Polygon, Ethereum) supports this natively. No wrapper contracts needed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Architecture Overview
&lt;/h2&gt;

&lt;p&gt;PayinGo implements this pattern with a facilitator model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────┐     ┌─────────────┐     ┌─────────────┐     ┌──────────────┐
│   Frontend  │────▶│  PayinGo    │────▶│ Facilitator │────▶│ USDC Contract│
│  (User signs│     │    API      │     │ (pays gas)  │     │  (on-chain)  │
│   EIP-712)  │     │ (validates) │     │             │     │              │
└─────────────┘     └─────────────┘     └─────────────┘     └──────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The user signs an EIP-712 typed message. The facilitator submits it on-chain and pays gas. Funds transfer directly from payer to recipient — the service never touches the money.&lt;/p&gt;




&lt;h2&gt;
  
  
  Implementation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Creating a Payment Session
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://go.payin.com/api/v1/checkout/create &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": "50.00",
    "currency": "USDC",
    "recipientAddress": "0xMerchantWallet",
    "network": "base",
    "metadata": { "orderId": "ORD-123" },
    "callbackUrl": "https://yoursite.com/webhook",
    "callbackSecret": "your-secret"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"payment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pay_abc123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"PENDING"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"paymentUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://go.payin.com/checkout/pay_abc123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"expiresAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2024-01-15T10:30:00Z"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Frontend Signing (EVM)
&lt;/h3&gt;

&lt;p&gt;The user's wallet signs an EIP-712 message:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;domain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;USD Coin&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;chainId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8453&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// Base&lt;/span&gt;
  &lt;span class="na"&gt;verifyingContract&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;USDC_ADDRESS&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;types&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;TransferWithAuthorization&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;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;from&lt;/span&gt;&lt;span class="dl"&gt;'&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="s1"&gt;address&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;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;to&lt;/span&gt;&lt;span class="dl"&gt;'&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="s1"&gt;address&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;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;value&lt;/span&gt;&lt;span class="dl"&gt;'&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="s1"&gt;uint256&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;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;validAfter&lt;/span&gt;&lt;span class="dl"&gt;'&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="s1"&gt;uint256&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;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;validBefore&lt;/span&gt;&lt;span class="dl"&gt;'&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="s1"&gt;uint256&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;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;nonce&lt;/span&gt;&lt;span class="dl"&gt;'&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="s1"&gt;bytes32&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="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;payerAddress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;merchantAddress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;parseUnits&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;50&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;  &lt;span class="c1"&gt;// USDC has 6 decimals&lt;/span&gt;
  &lt;span class="na"&gt;validAfter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;validBefore&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;900&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// 15 min&lt;/span&gt;
  &lt;span class="na"&gt;nonce&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;randomBytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;32&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;signature&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;wallet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;signTypedData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;types&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Webhook Handling
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&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="s1"&gt;/webhook&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;signature&lt;/span&gt; &lt;span class="o"&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="s1"&gt;x-payingo-signature&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;timestamp&lt;/span&gt; &lt;span class="o"&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="s1"&gt;x-payingo-timestamp&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;payload&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;stringify&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="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="s1"&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;WEBHOOK_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;timestamp&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;payload&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="s1"&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;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;signature&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;expected&lt;/span&gt;&lt;span class="p"&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;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&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="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Invalid 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="k"&gt;if &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="nx"&gt;event&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;payment.completed&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;// Update order status&lt;/span&gt;
    &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;orders&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="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="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;orderId&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;paid&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;txHash&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="nx"&gt;txHash&lt;/span&gt;
    &lt;span class="p"&gt;});&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;status&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="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Solana Implementation
&lt;/h2&gt;

&lt;p&gt;Solana doesn't have ERC-3009, so the approach differs. The frontend builds a partial transaction with the user as signer but the facilitator as fee payer:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;transaction&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;Transaction&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ComputeBudgetProgram&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setComputeUnitLimit&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;units&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100000&lt;/span&gt; &lt;span class="p"&gt;}))&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;createTransferCheckedInstruction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;payerTokenAccount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;USDC_MINT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;merchantTokenAccount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;payerPublicKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;e6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;6&lt;/span&gt;
  &lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;feePayer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;FACILITATOR_PUBKEY&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;recentBlockhash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getLatestBlockhash&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nx"&gt;blockhash&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// User signs&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;signed&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;wallet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;signTransaction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Send to API, facilitator adds fee payer signature and broadcasts&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Network Support
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Network&lt;/th&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Settlement&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Base&lt;/td&gt;
&lt;td&gt;ERC-3009&lt;/td&gt;
&lt;td&gt;~2s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Polygon&lt;/td&gt;
&lt;td&gt;ERC-3009&lt;/td&gt;
&lt;td&gt;~2s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Solana&lt;/td&gt;
&lt;td&gt;Partial TX signing&lt;/td&gt;
&lt;td&gt;~2s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Alternative: Payment Links
&lt;/h2&gt;

&lt;p&gt;For simpler use cases (donations, invoices), there's a no-code option:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://go.payin.com/api/v1/link/create &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;'{
    "name": "Project Donation",
    "evmAddress": "0xYourWallet",
    "notifyEmail": "you@example.com"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This returns a shareable URL. Users visit, connect wallet, enter amount, sign, done. No backend integration required.&lt;/p&gt;




&lt;h2&gt;
  
  
  Trade-offs
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What works well:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zero gas for end users&lt;/li&gt;
&lt;li&gt;Direct P2P settlement (non-custodial)&lt;/li&gt;
&lt;li&gt;Simple API surface&lt;/li&gt;
&lt;li&gt;Fast finality (~2 seconds)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Limitations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;USDC only (no ETH, BTC, or other tokens)&lt;/li&gt;
&lt;li&gt;Three networks currently (Base, Polygon, Solana)&lt;/li&gt;
&lt;li&gt;Dependent on facilitator availability&lt;/li&gt;
&lt;li&gt;Facilitator economics unclear long-term&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  When to Use This
&lt;/h2&gt;

&lt;p&gt;This pattern fits well for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;E-commerce checkout flows&lt;/li&gt;
&lt;li&gt;SaaS subscription payments&lt;/li&gt;
&lt;li&gt;Donations and tips&lt;/li&gt;
&lt;li&gt;Invoice payments&lt;/li&gt;
&lt;li&gt;Any scenario where UX matters more than token variety&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you need multi-token support or prefer fully decentralized infrastructure, other approaches (like Account Abstraction with ERC-4337) might be more appropriate.&lt;/p&gt;




&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://eips.ethereum.org/EIPS/eip-3009" rel="noopener noreferrer"&gt;ERC-3009 Specification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://go.payin.com/docs" rel="noopener noreferrer"&gt;PayinGo API Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.circle.com/stablecoins/docs" rel="noopener noreferrer"&gt;USDC Developer Docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Questions or alternative implementations? Drop a comment below.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ux</category>
      <category>web3</category>
      <category>ethereum</category>
      <category>cryptocurrency</category>
    </item>
    <item>
      <title>Crypto Payment Gateways Compared 2026</title>
      <dc:creator>jimquote</dc:creator>
      <pubDate>Thu, 11 Dec 2025 23:44:51 +0000</pubDate>
      <link>https://forem.com/jimquote/crypto-payment-gateways-compared-3oee</link>
      <guid>https://forem.com/jimquote/crypto-payment-gateways-compared-3oee</guid>
      <description>&lt;p&gt;Most articles about crypto payment gateways read like feature checklists: "This one supports 300 coins! That one has 0.5% fees!"&lt;/p&gt;

&lt;p&gt;But here's what nobody tells you: &lt;strong&gt;the most important question isn't which gateway has the most features—it's who controls your money.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In 2014, Mt. Gox collapsed, taking $450 million in customer funds. In 2022, FTX imploded, leaving billions unrecoverable. These weren't payment gateways, but they illustrate a critical point: &lt;strong&gt;when a third party holds your funds, you're one bad day away from losing everything.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This guide takes a different approach. We'll help you understand the real risks, explain why stablecoins are a game-changer for merchants, and match you with the right gateway for your specific business.&lt;/p&gt;

&lt;h2&gt;
  
  
  Part 1: The Question Nobody Asks First
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Custodial vs. Non-Custodial: What Does It Actually Mean?
&lt;/h3&gt;

&lt;p&gt;Every crypto payment gateway falls into one of two categories. Understanding the difference could save your business.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Custodial gateways&lt;/strong&gt; hold your funds for you. When a customer pays, the money goes to the gateway's wallet first. You can withdraw later—if they let you.&lt;/p&gt;

&lt;p&gt;Think of it like depositing money at a bank. Convenient? Yes. But if that bank fails, gets hacked, or decides to freeze your account? Your money is trapped.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Non-custodial gateways&lt;/strong&gt; never touch your funds. Payments go directly from your customer's wallet to yours. The gateway just facilitates the transaction.&lt;/p&gt;

&lt;p&gt;Think of it like a cash register that connects directly to your safe. The cashier (gateway) processes the sale, but the money lands in your hands, not theirs.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Real Risks of Custodial Gateways
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Risk&lt;/th&gt;
&lt;th&gt;What Happens&lt;/th&gt;
&lt;th&gt;Real-World Examples&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Platform hack&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hackers drain the gateway's wallets—including your funds&lt;/td&gt;
&lt;td&gt;Mt. Gox lost $450M (2014), Bitfinex lost $72M (2016)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Regulatory freeze&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Government orders accounts frozen during investigation&lt;/td&gt;
&lt;td&gt;Multiple exchanges frozen during 2022-2023 crackdowns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;KYC/AML triggers&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Suspicious activity flags lock your account for 30-90 days&lt;/td&gt;
&lt;td&gt;Common complaint across custodial services&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Insolvency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Company goes bankrupt, your funds become creditor claims&lt;/td&gt;
&lt;td&gt;FTX, Celsius, BlockFi (2022)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Policy changes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Gateway suddenly doesn't support your country or industry&lt;/td&gt;
&lt;td&gt;PayPal's history of merchant account terminations&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  When Custodial Makes Sense
&lt;/h3&gt;

&lt;p&gt;Custodial isn't always bad. It's appropriate when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're new to crypto and want a guided experience&lt;/li&gt;
&lt;li&gt;You need automatic fiat conversion (stablecoin → USD in your bank)&lt;/li&gt;
&lt;li&gt;Your transaction volume is low (&amp;lt;$5,000/month)&lt;/li&gt;
&lt;li&gt;You trust the provider's track record and insurance policies&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  When Non-Custodial Is Non-Negotiable
&lt;/h3&gt;

&lt;p&gt;Choose non-custodial if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You operate in a "high-risk" industry (gaming, adult content, supplements)&lt;/li&gt;
&lt;li&gt;You process significant volume (&amp;gt;$10,000/month)&lt;/li&gt;
&lt;li&gt;You've been burned by payment processor freezes before&lt;/li&gt;
&lt;li&gt;You want to sleep at night knowing no one can touch your money&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F23bxn5ip8ypi3x8ewwke.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F23bxn5ip8ypi3x8ewwke.png" alt="Custodial vs Non-Custodial Comparison" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Part 2: Why Stablecoins Changed Everything
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Volatility Problem (Solved)
&lt;/h3&gt;

&lt;p&gt;For years, accepting Bitcoin meant accepting risk. A $100 payment could be worth $90 tomorrow—or $110. Most merchants couldn't stomach that uncertainty.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stablecoins eliminated this problem entirely.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;USDC and USDT are pegged 1:1 to the US dollar. $100 in USDC today is $100 tomorrow. Period.&lt;/p&gt;

&lt;p&gt;This single innovation transformed crypto from a speculation tool into a legitimate payment method.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stablecoin Market Growth
&lt;/h3&gt;

&lt;p&gt;The numbers are staggering:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foljs9v7lhqv4ew72hmd5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foljs9v7lhqv4ew72hmd5.png" alt="Stablecoin Market Statistics 2024-2025" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;$27.6 trillion&lt;/strong&gt; in stablecoin transfer volume in 2024—surpassing Visa and Mastercard combined&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;$251.7 billion&lt;/strong&gt; total stablecoin market cap as of mid-2025&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;83% year-over-year growth&lt;/strong&gt; in transaction volume (July 2024 to July 2025)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;$72.3 billion annualized&lt;/strong&gt; in commercial stablecoin payments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This isn't a niche market. It's becoming the default for cross-border commerce.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Merchants Love Stablecoins
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F10z13bf5epvd8crkyhkh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F10z13bf5epvd8crkyhkh.png" alt="Transaction Fee Comparison" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5864i120woaxk3qjwroc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5864i120woaxk3qjwroc.png" alt="Settlement Speed Comparison" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Benefit&lt;/th&gt;
&lt;th&gt;Traditional Payments&lt;/th&gt;
&lt;th&gt;Stablecoin Payments&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Settlement time&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2-5 business days&lt;/td&gt;
&lt;td&gt;Minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Transaction fees&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2.5-3.5% (cards)&lt;/td&gt;
&lt;td&gt;0.5-1% or less&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Chargebacks&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes (costly fraud risk)&lt;/td&gt;
&lt;td&gt;No (irreversible)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;International fees&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3-5% FX + wire fees&lt;/td&gt;
&lt;td&gt;Same as domestic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Weekend processing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes, 24/7/365&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Account freeze risk&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Common&lt;/td&gt;
&lt;td&gt;None (non-custodial)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  The USDC vs. USDT Decision
&lt;/h3&gt;

&lt;p&gt;Both are dollar-pegged stablecoins, but they're not identical:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;USDC (Circle)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Market cap: ~$61 billion&lt;/li&gt;
&lt;li&gt;Fully backed by US treasuries and cash&lt;/li&gt;
&lt;li&gt;More regulatory-friendly, preferred by US businesses&lt;/li&gt;
&lt;li&gt;Transparent monthly attestations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;USDT (Tether)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Market cap: ~$153 billion (largest stablecoin)&lt;/li&gt;
&lt;li&gt;~90% of stablecoin transaction volume&lt;/li&gt;
&lt;li&gt;More widely held globally, especially in Asia&lt;/li&gt;
&lt;li&gt;Less transparent reserves, but massive liquidity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Our recommendation:&lt;/strong&gt; Accept both. USDC attracts compliance-conscious Western customers; USDT attracts the global majority. Most gateways support both.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📖 &lt;strong&gt;Deep Dive:&lt;/strong&gt; For a complete analysis of USDT vs USDC from a merchant's perspective—including transparency, regulations, and regional preferences—read our guide: &lt;a href="https://dev.to/blog/usdt-vs-usdc-merchants/"&gt;USDT vs USDC: Which Stablecoin Should Your Business Accept?&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Part 3: The Gateway Landscape (Honest Reviews)
&lt;/h2&gt;

&lt;p&gt;We've researched and tested the major players. Here's what you actually need to know—including the parts their marketing won't tell you.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tier 1: Enterprise-Grade
&lt;/h3&gt;

&lt;h4&gt;
  
  
  BVNK
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Large businesses needing regulatory compliance&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fees:&lt;/strong&gt; Custom pricing (enterprise)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custody:&lt;/strong&gt; Hybrid (custodial with insurance)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stablecoin support:&lt;/strong&gt; USDC, USDT, plus fiat rails&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Volume:&lt;/strong&gt; $25+ billion annually&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Strengths:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Licensed in 25+ jurisdictions&lt;/li&gt;
&lt;li&gt;Enterprise-grade compliance (SOC 2, ISO 27001)&lt;/li&gt;
&lt;li&gt;Dedicated account management&lt;/li&gt;
&lt;li&gt;Fiat on/off ramps built-in&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Weaknesses:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Not for small businesses (high minimums)&lt;/li&gt;
&lt;li&gt;Complex onboarding process&lt;/li&gt;
&lt;li&gt;Pricing not transparent&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; If you're processing millions and need to satisfy corporate compliance, BVNK is the professional choice. Everyone else should look elsewhere.&lt;/p&gt;




&lt;h3&gt;
  
  
  Tier 2: Mid-Market Leaders
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Coinbase Commerce
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Businesses wanting brand trust and instant USDC settlement&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fees:&lt;/strong&gt; 1% per transaction&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custody:&lt;/strong&gt; Non-custodial (funds go to your wallet)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stablecoins:&lt;/strong&gt; USDC, plus 100+ other cryptocurrencies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integrations:&lt;/strong&gt; Shopify, WooCommerce, custom API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Strengths:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Backed by Coinbase's reputation and security&lt;/li&gt;
&lt;li&gt;Simple setup, excellent documentation&lt;/li&gt;
&lt;li&gt;Automatic conversion to USDC available&lt;/li&gt;
&lt;li&gt;No KYC required for basic use&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Weaknesses:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1% fee is higher than some competitors&lt;/li&gt;
&lt;li&gt;Limited fiat withdrawal options (crypto-only)&lt;/li&gt;
&lt;li&gt;Support can be slow for smaller merchants&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; The safe, trusted choice for merchants who want "it just works" simplicity. The 1% fee is reasonable for the peace of mind.&lt;/p&gt;




&lt;h4&gt;
  
  
  CoinGate
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; EU-focused businesses prioritizing compliance&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fees:&lt;/strong&gt; 1% per transaction&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custody:&lt;/strong&gt; Custodial (with instant fiat settlement)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stablecoins:&lt;/strong&gt; USDT, USDC, plus 70+ cryptocurrencies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integrations:&lt;/strong&gt; Shopify, WooCommerce, Wix, custom API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Strengths:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Instant settlement to EUR, GBP, or USD&lt;/li&gt;
&lt;li&gt;Built-in AML/KYC tools (EU compliant)&lt;/li&gt;
&lt;li&gt;Refunds in crypto supported&lt;/li&gt;
&lt;li&gt;Point-of-sale app for physical stores&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Weaknesses:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;KYC required (not anonymous)&lt;/li&gt;
&lt;li&gt;Custodial model introduces counterparty risk&lt;/li&gt;
&lt;li&gt;Fiat conversion has FX spread costs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; Excellent for EU businesses that need regulatory cover. The custodial model means you're trusting CoinGate with your funds—but their compliance track record is solid.&lt;/p&gt;




&lt;h4&gt;
  
  
  NOWPayments
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Maximum flexibility and coin variety&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fees:&lt;/strong&gt; 0.5% base (+ 0.5% for auto-conversion)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custody:&lt;/strong&gt; Non-custodial&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stablecoins:&lt;/strong&gt; USDT, USDC, DAI, plus 300+ cryptocurrencies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integrations:&lt;/strong&gt; Shopify, WooCommerce, custom API, invoicing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Strengths:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lowest fees among major providers&lt;/li&gt;
&lt;li&gt;No KYC required&lt;/li&gt;
&lt;li&gt;300+ supported cryptocurrencies&lt;/li&gt;
&lt;li&gt;Excellent API documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Weaknesses:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No fiat withdrawal (crypto-only)&lt;/li&gt;
&lt;li&gt;Support quality varies&lt;/li&gt;
&lt;li&gt;Auto-conversion adds extra 0.5%&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; Best value for crypto-native businesses. The 0.5% fee is hard to beat. Just remember: no fiat off-ramp means you'll need a separate exchange relationship.&lt;/p&gt;




&lt;h3&gt;
  
  
  Tier 3: Budget-Friendly Options
&lt;/h3&gt;

&lt;h4&gt;
  
  
  BitPay
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Traditional businesses wanting crypto exposure&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fees:&lt;/strong&gt; 1% per transaction&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custody:&lt;/strong&gt; Custodial (with fiat settlement)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stablecoins:&lt;/strong&gt; USDT, USDC, DAI, plus ~15 cryptocurrencies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integrations:&lt;/strong&gt; Shopify, WooCommerce, QuickBooks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Strengths:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Oldest provider (founded 2011), proven track record&lt;/li&gt;
&lt;li&gt;Direct bank deposit in USD/EUR&lt;/li&gt;
&lt;li&gt;Multi-user access for teams&lt;/li&gt;
&lt;li&gt;Exchange rate locked at purchase time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Weaknesses:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Limited cryptocurrency selection (only ~15)&lt;/li&gt;
&lt;li&gt;Custodial model with KYC requirements&lt;/li&gt;
&lt;li&gt;Fees comparable to credit cards&lt;/li&gt;
&lt;li&gt;Account freezes reported by some users&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; A legacy player that's reliable but not innovative. Good if you want fiat settlement and don't mind the 1% fee. Not ideal if you're crypto-native.&lt;/p&gt;




&lt;h4&gt;
  
  
  CoinPayments
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Accepting obscure altcoins&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fees:&lt;/strong&gt; 0.5% per transaction&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custody:&lt;/strong&gt; Custodial&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stablecoins:&lt;/strong&gt; USDT, USDC, plus 2,300+ cryptocurrencies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integrations:&lt;/strong&gt; Shopify, WooCommerce, custom API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Strengths:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Massive coin selection (2,300+)&lt;/li&gt;
&lt;li&gt;Low 0.5% transaction fee&lt;/li&gt;
&lt;li&gt;Vault storage option for security&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Weaknesses:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Custodial (they hold your funds)&lt;/li&gt;
&lt;li&gt;Interface feels dated&lt;/li&gt;
&lt;li&gt;Support complaints are common&lt;/li&gt;
&lt;li&gt;Security concerns (2020 data breach)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; If you need to accept every altcoin imaginable, CoinPayments has coverage. But the custodial model and past security issues mean you're taking on risk.&lt;/p&gt;




&lt;h3&gt;
  
  
  Tier 4: Self-Hosted (Maximum Control)
&lt;/h3&gt;

&lt;h4&gt;
  
  
  BTCPay Server
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Technical teams wanting complete control&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fees:&lt;/strong&gt; $0 (only network fees)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custody:&lt;/strong&gt; Non-custodial (your server, your keys)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stablecoins:&lt;/strong&gt; Limited (Bitcoin/Lightning focused)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integrations:&lt;/strong&gt; WooCommerce, Shopify (via plugins)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Strengths:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Completely free and open-source&lt;/li&gt;
&lt;li&gt;No third party ever touches your funds&lt;/li&gt;
&lt;li&gt;No KYC, no account freezes, no limits&lt;/li&gt;
&lt;li&gt;Full privacy for you and customers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Weaknesses:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Requires technical setup (self-hosting)&lt;/li&gt;
&lt;li&gt;Bitcoin-focused; altcoin support is secondary&lt;/li&gt;
&lt;li&gt;No fiat conversion built-in&lt;/li&gt;
&lt;li&gt;You're responsible for security&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; The gold standard for Bitcoin maximalists and privacy advocates. But if you want easy stablecoin support or aren't comfortable running servers, look elsewhere.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 4: Choosing Your Gateway (Decision Framework)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Start With These 3 Questions
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Question 1: What's your monthly volume?&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Volume&lt;/th&gt;
&lt;th&gt;Recommendation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt; $5,000/month&lt;/td&gt;
&lt;td&gt;Coinbase Commerce or NOWPayments (simple setup)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$5,000 - $50,000/month&lt;/td&gt;
&lt;td&gt;NOWPayments or CoinGate (balance of cost and features)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$50,000+/month&lt;/td&gt;
&lt;td&gt;BVNK or custom integration (enterprise needs)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Question 2: Do you need fiat settlement?&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Need&lt;/th&gt;
&lt;th&gt;Options&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Yes, direct to bank&lt;/td&gt;
&lt;td&gt;BitPay, CoinGate, BVNK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No, happy with stablecoins&lt;/td&gt;
&lt;td&gt;NOWPayments, Coinbase Commerce, BTCPay&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maybe sometimes&lt;/td&gt;
&lt;td&gt;Use exchange (Coinbase, Kraken) for occasional conversion&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Question 3: What's your risk tolerance?&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Risk Profile&lt;/th&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Gateways&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Conservative&lt;/td&gt;
&lt;td&gt;Custodial with insurance&lt;/td&gt;
&lt;td&gt;BVNK, BitPay&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Balanced&lt;/td&gt;
&lt;td&gt;Non-custodial, established provider&lt;/td&gt;
&lt;td&gt;Coinbase Commerce, NOWPayments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maximum control&lt;/td&gt;
&lt;td&gt;Self-hosted&lt;/td&gt;
&lt;td&gt;BTCPay Server&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  By Business Type
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Business Type&lt;/th&gt;
&lt;th&gt;Recommended Gateway&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Freelancer / Consultant&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;NOWPayments&lt;/td&gt;
&lt;td&gt;Low fees, simple invoicing, no volume requirements&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;E-commerce (Shopify/WooCommerce)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Coinbase Commerce&lt;/td&gt;
&lt;td&gt;Easy integration, trusted brand, good documentation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SaaS / Subscriptions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CoinGate&lt;/td&gt;
&lt;td&gt;Recurring billing support, compliance-friendly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Gaming / Digital Goods&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;NOWPayments&lt;/td&gt;
&lt;td&gt;Low fees for microtransactions, no KYC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;High-risk industries&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;BTCPay Server&lt;/td&gt;
&lt;td&gt;No account freezes, complete control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;B2B / Wholesale&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;BVNK&lt;/td&gt;
&lt;td&gt;Large transaction support, enterprise compliance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;EU-focused business&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CoinGate&lt;/td&gt;
&lt;td&gt;GDPR/EU compliance built-in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Global, crypto-native&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;NOWPayments&lt;/td&gt;
&lt;td&gt;Widest coin support, global reach&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  The Hidden Costs Nobody Mentions
&lt;/h3&gt;

&lt;p&gt;When comparing gateways, watch for these hidden fees:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fee Type&lt;/th&gt;
&lt;th&gt;What to Ask&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Currency conversion&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"Is there a spread when converting to fiat or stablecoins?" (Often 1-3%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Withdrawal fees&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"What does it cost to move funds to my wallet or bank?"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Network fees&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"Do you pass through blockchain transaction fees, or are they included?"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Inactivity fees&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"Do you charge if my account is dormant?"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Minimum payouts&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"Is there a minimum balance before I can withdraw?"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Pro tip:&lt;/strong&gt; A gateway advertising "0.5% fees" might actually cost 3%+ after conversion spreads and withdrawal fees. Always calculate total cost.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 5: Getting Started (Action Plan)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  If You're Brand New to Crypto Payments
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Week 1: Set up your foundation&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a wallet (MetaMask for EVM chains, or Trust Wallet for multi-chain)&lt;/li&gt;
&lt;li&gt;Write down your seed phrase and store it securely&lt;/li&gt;
&lt;li&gt;Get your wallet addresses for Ethereum, Polygon, and any other chains you'll use&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Week 2: Choose and configure your gateway&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sign up for Coinbase Commerce or NOWPayments (both are free)&lt;/li&gt;
&lt;li&gt;Connect your wallet addresses&lt;/li&gt;
&lt;li&gt;Create a test payment link&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Week 3: Test and iterate&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Send a small test payment from another wallet&lt;/li&gt;
&lt;li&gt;Verify funds arrive in your wallet&lt;/li&gt;
&lt;li&gt;Time how long settlement takes on different networks&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Week 4: Go live&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add "Pay with Crypto" option to your checkout or invoices&lt;/li&gt;
&lt;li&gt;Start with stablecoins only (USDC + USDT)&lt;/li&gt;
&lt;li&gt;Monitor first real transactions closely&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  If You're Already Accepting Crypto
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Audit your current setup:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Is your gateway custodial or non-custodial?&lt;/li&gt;
&lt;li&gt;[ ] What are your actual total fees (including conversion)?&lt;/li&gt;
&lt;li&gt;[ ] Have you ever had funds frozen or withdrawal delays?&lt;/li&gt;
&lt;li&gt;[ ] Are you accepting stablecoins, or only volatile crypto?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Optimization opportunities:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Switch from custodial to non-custodial if you're comfortable&lt;/li&gt;
&lt;li&gt;Add stablecoin support if you haven't (most customer-friendly)&lt;/li&gt;
&lt;li&gt;Compare your current fees against NOWPayments' 0.5%&lt;/li&gt;
&lt;li&gt;Consider multi-chain support (Polygon/Solana for lower fees)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;The crypto payment gateway market has matured significantly. You no longer need to accept volatility risk—stablecoins like USDC and USDT offer dollar-stable payments with faster settlement and lower fees than traditional processors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Our honest recommendations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Most businesses:&lt;/strong&gt; Start with &lt;strong&gt;Coinbase Commerce&lt;/strong&gt; for simplicity and trust, or &lt;strong&gt;NOWPayments&lt;/strong&gt; for lower fees&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EU businesses:&lt;/strong&gt; &lt;strong&gt;CoinGate&lt;/strong&gt; for compliance peace of mind&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High-risk / privacy-focused:&lt;/strong&gt; &lt;strong&gt;BTCPay Server&lt;/strong&gt; for complete control&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enterprise:&lt;/strong&gt; &lt;strong&gt;BVNK&lt;/strong&gt; for institutional-grade infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whatever you choose, prioritize &lt;strong&gt;non-custodial solutions&lt;/strong&gt; unless you have a specific reason to trust a custodian. Your funds should be in your wallet, under your control.&lt;/p&gt;

&lt;p&gt;The businesses adopting stablecoin payments today are building a competitive advantage. Lower fees, faster settlements, global reach, no chargebacks—it's not a question of if this becomes standard, but when.&lt;/p&gt;

&lt;p&gt;The only question is whether you'll be ready.&lt;/p&gt;

</description>
      <category>crypto</category>
      <category>security</category>
      <category>web3</category>
    </item>
  </channel>
</rss>
