결제 · 구독 커리큘럼으로

기술 문서 (프로토타입 버전)

Polar 연동 계획

저장소의 docs/plan-polar-integration.md 와 동일한 원문입니다. 아래에서 Markdown과 HTML 변환 결과를 각각 복사할 수 있습니다.

공개 문서 원문 (Markdown)

# [Plan] polar-integration

> **Feature**: Polar 결제·구독 연동 (End-to-End)
> **Created**: 2026-04-09
> **Phase**: Plan
> **Status**: In Progress

### 진행 로그 (로컬 `.env.local`)

| 일자 | 내용 |
|------|------|
| 2026-04-09 | `POLAR_ACCESS_TOKEN`(Organization token), `POLAR_PRODUCT_ID_PRO=<Polar PRO product UUID>`(실제 값은 Polar 대시보드·Vercel env와 대조), `POLAR_SERVER=production` 반영. `pnpm check-env` **미통과**: `POLAR_WEBHOOK_SECRET`, `SUPABASE_SERVICE_ROLE_KEY` 가 비어 있음(웹훅·DB upsert 전까지 필수). |
| 2026-04-09 | Supabase 대시보드 **Publishable** → `NEXT_PUBLIC_SUPABASE_ANON_KEY`, **Secret** → `SUPABASE_SERVICE_ROLE_KEY`. `check-env`·`/api/health` 가 Publishable 전용 변수(`NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY`)만 있어도 통과하도록 보강. 남음: `POLAR_WEBHOOK_SECRET`. |
| 2026-04-09 | Supabase **Legacy JWT** `anon`·`service_role` 로 `.env.local` 재설정(Publishable/`sb_*` 대체). `pnpm check-env` 남은 항목: `POLAR_WEBHOOK_SECRET` 만. |
| 2026-04-09 | Supabase 대시보드의 **Publishable**·**서버 전용 Secret** 키 값은 Git 비추적 `docs/supabase-dashboard-keys.local.md` 에 별도 보관. 매핑 설명은 `docs/reference/supabase-key-formats.md`. |

---

## 1. 목적 (Why)

saas-engine에 Polar 결제·구독 플로우를 완전히 연결한다.
현재 코드 골격(checkout, webhooks, subscriptions API)은 있으나, 환경 변수 및 Polar 대시보드 설정이 없는 상태이므로 E2E 결제가 동작하지 않는다.

**완료 기준**:
- `/pricing` → 결제 버튼 → Polar 체크아웃 페이지 이동
- 결제 완료 후 웹훅 수신 → `public.subscriptions` upsert 반영
- `/dashboard` 플랜 섹션에 구독 정보 표시
- `pnpm check-env` 전 항목 통과

---

## 2. 범위 (Scope)

### 포함 (In Scope)
- Supabase 전제 조건 확인 및 `public.subscriptions` 마이그레이션 실행
- `.env.local` 필수 환경 변수 세팅 (`pnpm check-env` 기준)
- Polar Organization Access Token 발급 및 설정
- Polar 상품(Product) ID 확인 및 설정
- Polar 웹훅 엔드포인트 등록 + `POLAR_WEBHOOK_SECRET` 취득
- 로컬 환경에서 ngrok/Cloudflare Tunnel로 웹훅 테스트
- `NEXT_PUBLIC_APP_URL` 설정 (리다이렉트 기준 URL)
- E2E 검증: 로그인 → 결제 → 웹훅 → 대시보드 반영

### 제외 (Out of Scope)
- Polar 상품 생성 (이미 생성됐거나 사용자가 직접 생성)
- Supabase 프로젝트 신규 생성
- 새 결제 기능 코드 추가 (기존 코드 활용)
- 프로덕션 배포 자동화 (Vercel 설정은 별도)

---

## 3. 전제 조건 (Prerequisites)

| 조건 | 확인 방법 |
|------|-----------|
| Supabase 프로젝트 활성 (Paused 아님) | 대시보드에서 확인 |
| `NEXT_PUBLIC_SUPABASE_URL`, `NEXT_PUBLIC_SUPABASE_ANON_KEY` 세팅 | `pnpm check-env` |
| `/login` 동작 확인 | 브라우저 |
| `supabase/migrations/005_subscriptions.sql` 실행 완료 | SQL 에디터 |
| Polar 계정 및 Organization 존재 | polar.sh 로그인 |

---

## 4. 구현 순서 (Implementation Order)

### Step 0: Supabase 전제 확인
1. Supabase 프로젝트 Resume 확인
2. `005_subscriptions.sql` → SQL 에디터 실행 → `public.subscriptions` 생성
3. Authentication → URL Configuration → Redirect URLs에 `http://localhost:<포트>` 및 `/auth/callback` 추가
4. `NEXT_PUBLIC_SUPABASE_URL`, `NEXT_PUBLIC_SUPABASE_ANON_KEY` → `.env.local` 설정
5. `/login` 정상 동작 확인

### Step 1: Polar 계정·토큰 준비
1. polar.sh 로그인 → Organization 확인
2. Organization Settings / Developers → **Organization Access Token** 발급 (Polar UI에 표시되는 토큰 문자열)
3. `.env.local` 에 **변수 `POLAR_ACCESS_TOKEN`** 을 추가하고, Polar에서 발급한 Organization Access Token을 값으로 넣는다 (Git 금지).
4. `POLAR_SERVER=production` (또는 `sandbox`) 설정

### Step 2: 상품 ID 확인
1. Polar 대시보드 → Products → 해당 상품 URL의 UUID 복사
2. `.env.local` 에 **변수 `POLAR_PRODUCT_ID_PRO`** 를 추가하고, 값은 Polar Products에서 복사한 **해당 상품의 UUID**로 한다 (전체 UUID는 Git·문서 본문에 붙이지 않는다).

### Step 3: 앱 URL 설정
1. `.env.local` → `NEXT_PUBLIC_APP_URL=http://localhost:3000` (실제 포트와 일치)

### Step 4: Service Role Key
1. Supabase 대시보드 → Settings → API → `service_role` 키 복사
2. `.env.local` 에 **변수 `SUPABASE_SERVICE_ROLE_KEY`** 를 추가하고, 값은 Supabase **service_role** 용 서버 전용 비밀키로 한다 (Git 금지).

### Step 5: 환경 변수 검증
```bash
pnpm check-env
```
아래 항목 전부 통과해야 함:

| 변수 | 용도 |
|------|------|
| `NEXT_PUBLIC_SUPABASE_URL` | 인증·클라이언트 |
| `NEXT_PUBLIC_SUPABASE_ANON_KEY` | 인증·클라이언트 |
| `POLAR_ACCESS_TOKEN` | Checkout 생성 |
| `POLAR_WEBHOOK_SECRET` | 웹훅 서명 검증 (Step 6 후) |
| `POLAR_PRODUCT_ID_PRO` | Checkout 상품 |
| `NEXT_PUBLIC_APP_URL` | success/return URL |
| `SUPABASE_SERVICE_ROLE_KEY` | 웹훅 DB upsert |

### Step 6: pnpm dev → 체크아웃 확인
```bash
pnpm dev
```
- 로그인 후 `/pricing` → 결제 버튼 → `/api/checkout` → Polar 페이지 이동 확인
- ⚠️ 이 단계에서는 웹훅 없으므로 결제 후 DB 반영 안 됨이 정상

### Step 7: 웹훅 등록 → POLAR_WEBHOOK_SECRET
**배포 URL이 있는 경우**:
- Polar 대시보드 Webhooks → `https://<배포도메인>/api/webhooks/polar` 등록

**로컬 전용**:
```bash
# ngrok 예시
ngrok http 3000
# → https://xxxx.ngrok-free.app/api/webhooks/polar
```
- 위 URL을 Polar Webhooks에 등록
- 등록 시 표시되는 **서명 시크릿**을 `.env.local` 의 **변수 `POLAR_WEBHOOK_SECRET`** 값으로 넣는다 (Git 금지).
- `pnpm check-env` 재실행 → 전부 통과 확인
- 앱 재시작

### Step 8: E2E 검증
1. 테스트 결제 실행
2. 웹훅 수신 → `app/api/webhooks/polar` 로그 확인
3. `public.subscriptions` 행 upsert 확인
4. `/dashboard` → 플랜 섹션 업데이트 확인

---

## 5. 주요 파일 (Key Files)

| 파일 | 역할 |
|------|------|
| `app/api/checkout/route.ts` | Polar Checkout 세션 생성 |
| `app/api/webhooks/polar/route.ts` | 웹훅 수신·서명 검증·DB upsert |
| `app/api/subscription/route.ts` | 구독 상태 조회 |
| `app/api/customer-portal/route.ts` | Polar 고객 포털 리다이렉트 |
| `lib/polar.ts` | Polar SDK 클라이언트 초기화 |
| `scripts/check-env.mjs` | 환경 변수 검증 스크립트 |
| `supabase/migrations/005_subscriptions.sql` | subscriptions 테이블 DDL |
| `docs/operational-order.md` | 운영·로컬 순서 레퍼런스 |
| `.env.local` | 실제 시크릿 (Git 금지) |
| `.env.example` | 변수명 템플릿 |

---

## 6. 리스크 (Risks)

| 리스크 | 완화 방법 |
|--------|-----------|
| `POLAR_SERVER` 환경 불일치 (sandbox vs production) | 토큰·상품이 속한 환경과 반드시 일치 확인 |
| 웹훅 URL이 로컬 localhost라 등록 불가 | ngrok/Cloudflare Tunnel 사용 |
| `SUPABASE_SERVICE_ROLE_KEY` 없으면 웹훅 503 | Step 4에서 필수 설정 |
| 포트 변경 시 `NEXT_PUBLIC_APP_URL`·Supabase Redirect URL 미수정 | 포트 바꿀 때마다 두 곳 동시 수정 |
| 웹훅 설정 전 결제 → 대시보드 플랜 비어 있음 | Step 7 완료 전 결제하지 않음 |

---

## 7. 완료 체크리스트

- [ ] `public.subscriptions` 테이블 존재 확인
- [ ] `pnpm check-env` — 7개 변수 전부 통과
- [ ] `/pricing` → 결제 버튼 → Polar 페이지 이동
- [ ] 웹훅 등록 완료 (HTTPS URL)
- [ ] 테스트 결제 후 `public.subscriptions` 행 생성 확인
- [ ] `/dashboard` 플랜 섹션에 구독 정보 표시

---

## 8. 다음 단계

Plan 완료 후:
1. `/pdca design polar-integration` — 웹훅 플로우·DB 스키마 설계 문서
2. 또는 바로 구현 진행 (코드는 이미 존재, 환경 설정만 필요)

공개 문서 변환 코드 (HTML)

<h1>[Plan] polar-integration</h1>
<blockquote>
<p><strong>Feature</strong>: Polar 결제·구독 연동 (End-to-End)
<strong>Created</strong>: 2026-04-09
<strong>Phase</strong>: Plan
<strong>Status</strong>: In Progress</p>
</blockquote>
<h3>진행 로그 (로컬 <code>.env.local</code>)</h3>
<table>
<thead>
<tr>
<th>일자</th>
<th>내용</th>
</tr>
</thead>
<tbody><tr>
<td>2026-04-09</td>
<td><code>POLAR_ACCESS_TOKEN</code>(Organization token), <code>POLAR_PRODUCT_ID_PRO=&lt;Polar PRO product UUID&gt;</code>(실제 값은 Polar 대시보드·Vercel env와 대조), <code>POLAR_SERVER=production</code> 반영. <code>pnpm check-env</code> <strong>미통과</strong>: <code>POLAR_WEBHOOK_SECRET</code>, <code>SUPABASE_SERVICE_ROLE_KEY</code> 가 비어 있음(웹훅·DB upsert 전까지 필수).</td>
</tr>
<tr>
<td>2026-04-09</td>
<td>Supabase 대시보드 <strong>Publishable</strong> → <code>NEXT_PUBLIC_SUPABASE_ANON_KEY</code>, <strong>Secret</strong> → <code>SUPABASE_SERVICE_ROLE_KEY</code>. <code>check-env</code>·<code>/api/health</code> 가 Publishable 전용 변수(<code>NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY</code>)만 있어도 통과하도록 보강. 남음: <code>POLAR_WEBHOOK_SECRET</code>.</td>
</tr>
<tr>
<td>2026-04-09</td>
<td>Supabase <strong>Legacy JWT</strong> <code>anon</code>·<code>service_role</code> 로 <code>.env.local</code> 재설정(Publishable/<code>sb_*</code> 대체). <code>pnpm check-env</code> 남은 항목: <code>POLAR_WEBHOOK_SECRET</code> 만.</td>
</tr>
<tr>
<td>2026-04-09</td>
<td>Supabase 대시보드의 <strong>Publishable</strong>·<strong>서버 전용 Secret</strong> 키 값은 Git 비추적 <code>docs/supabase-dashboard-keys.local.md</code> 에 별도 보관. 매핑 설명은 <code>docs/reference/supabase-key-formats.md</code>.</td>
</tr>
</tbody></table>
<hr>
<h2>1. 목적 (Why)</h2>
<p>saas-engine에 Polar 결제·구독 플로우를 완전히 연결한다.
현재 코드 골격(checkout, webhooks, subscriptions API)은 있으나, 환경 변수 및 Polar 대시보드 설정이 없는 상태이므로 E2E 결제가 동작하지 않는다.</p>
<p><strong>완료 기준</strong>:</p>
<ul>
<li><code>/pricing</code> → 결제 버튼 → Polar 체크아웃 페이지 이동</li>
<li>결제 완료 후 웹훅 수신 → <code>public.subscriptions</code> upsert 반영</li>
<li><code>/dashboard</code> 플랜 섹션에 구독 정보 표시</li>
<li><code>pnpm check-env</code> 전 항목 통과</li>
</ul>
<hr>
<h2>2. 범위 (Scope)</h2>
<h3>포함 (In Scope)</h3>
<ul>
<li>Supabase 전제 조건 확인 및 <code>public.subscriptions</code> 마이그레이션 실행</li>
<li><code>.env.local</code> 필수 환경 변수 세팅 (<code>pnpm check-env</code> 기준)</li>
<li>Polar Organization Access Token 발급 및 설정</li>
<li>Polar 상품(Product) ID 확인 및 설정</li>
<li>Polar 웹훅 엔드포인트 등록 + <code>POLAR_WEBHOOK_SECRET</code> 취득</li>
<li>로컬 환경에서 ngrok/Cloudflare Tunnel로 웹훅 테스트</li>
<li><code>NEXT_PUBLIC_APP_URL</code> 설정 (리다이렉트 기준 URL)</li>
<li>E2E 검증: 로그인 → 결제 → 웹훅 → 대시보드 반영</li>
</ul>
<h3>제외 (Out of Scope)</h3>
<ul>
<li>Polar 상품 생성 (이미 생성됐거나 사용자가 직접 생성)</li>
<li>Supabase 프로젝트 신규 생성</li>
<li>새 결제 기능 코드 추가 (기존 코드 활용)</li>
<li>프로덕션 배포 자동화 (Vercel 설정은 별도)</li>
</ul>
<hr>
<h2>3. 전제 조건 (Prerequisites)</h2>
<table>
<thead>
<tr>
<th>조건</th>
<th>확인 방법</th>
</tr>
</thead>
<tbody><tr>
<td>Supabase 프로젝트 활성 (Paused 아님)</td>
<td>대시보드에서 확인</td>
</tr>
<tr>
<td><code>NEXT_PUBLIC_SUPABASE_URL</code>, <code>NEXT_PUBLIC_SUPABASE_ANON_KEY</code> 세팅</td>
<td><code>pnpm check-env</code></td>
</tr>
<tr>
<td><code>/login</code> 동작 확인</td>
<td>브라우저</td>
</tr>
<tr>
<td><code>supabase/migrations/005_subscriptions.sql</code> 실행 완료</td>
<td>SQL 에디터</td>
</tr>
<tr>
<td>Polar 계정 및 Organization 존재</td>
<td>polar.sh 로그인</td>
</tr>
</tbody></table>
<hr>
<h2>4. 구현 순서 (Implementation Order)</h2>
<h3>Step 0: Supabase 전제 확인</h3>
<ol>
<li>Supabase 프로젝트 Resume 확인</li>
<li><code>005_subscriptions.sql</code> → SQL 에디터 실행 → <code>public.subscriptions</code> 생성</li>
<li>Authentication → URL Configuration → Redirect URLs에 <code>http://localhost:&lt;포트&gt;</code> 및 <code>/auth/callback</code> 추가</li>
<li><code>NEXT_PUBLIC_SUPABASE_URL</code>, <code>NEXT_PUBLIC_SUPABASE_ANON_KEY</code> → <code>.env.local</code> 설정</li>
<li><code>/login</code> 정상 동작 확인</li>
</ol>
<h3>Step 1: Polar 계정·토큰 준비</h3>
<ol>
<li>polar.sh 로그인 → Organization 확인</li>
<li>Organization Settings / Developers → <strong>Organization Access Token</strong> 발급 (Polar UI에 표시되는 토큰 문자열)</li>
<li><code>.env.local</code> 에 <strong>변수 <code>POLAR_ACCESS_TOKEN</code></strong> 을 추가하고, Polar에서 발급한 Organization Access Token을 값으로 넣는다 (Git 금지).</li>
<li><code>POLAR_SERVER=production</code> (또는 <code>sandbox</code>) 설정</li>
</ol>
<h3>Step 2: 상품 ID 확인</h3>
<ol>
<li>Polar 대시보드 → Products → 해당 상품 URL의 UUID 복사</li>
<li><code>.env.local</code> 에 <strong>변수 <code>POLAR_PRODUCT_ID_PRO</code></strong> 를 추가하고, 값은 Polar Products에서 복사한 <strong>해당 상품의 UUID</strong>로 한다 (전체 UUID는 Git·문서 본문에 붙이지 않는다).</li>
</ol>
<h3>Step 3: 앱 URL 설정</h3>
<ol>
<li><code>.env.local</code> → <code>NEXT_PUBLIC_APP_URL=http://localhost:3000</code> (실제 포트와 일치)</li>
</ol>
<h3>Step 4: Service Role Key</h3>
<ol>
<li>Supabase 대시보드 → Settings → API → <code>service_role</code> 키 복사</li>
<li><code>.env.local</code> 에 <strong>변수 <code>SUPABASE_SERVICE_ROLE_KEY</code></strong> 를 추가하고, 값은 Supabase <strong>service_role</strong> 용 서버 전용 비밀키로 한다 (Git 금지).</li>
</ol>
<h3>Step 5: 환경 변수 검증</h3>
<pre><code class="language-bash">pnpm check-env
</code></pre>
<p>아래 항목 전부 통과해야 함:</p>
<table>
<thead>
<tr>
<th>변수</th>
<th>용도</th>
</tr>
</thead>
<tbody><tr>
<td><code>NEXT_PUBLIC_SUPABASE_URL</code></td>
<td>인증·클라이언트</td>
</tr>
<tr>
<td><code>NEXT_PUBLIC_SUPABASE_ANON_KEY</code></td>
<td>인증·클라이언트</td>
</tr>
<tr>
<td><code>POLAR_ACCESS_TOKEN</code></td>
<td>Checkout 생성</td>
</tr>
<tr>
<td><code>POLAR_WEBHOOK_SECRET</code></td>
<td>웹훅 서명 검증 (Step 6 후)</td>
</tr>
<tr>
<td><code>POLAR_PRODUCT_ID_PRO</code></td>
<td>Checkout 상품</td>
</tr>
<tr>
<td><code>NEXT_PUBLIC_APP_URL</code></td>
<td>success/return URL</td>
</tr>
<tr>
<td><code>SUPABASE_SERVICE_ROLE_KEY</code></td>
<td>웹훅 DB upsert</td>
</tr>
</tbody></table>
<h3>Step 6: pnpm dev → 체크아웃 확인</h3>
<pre><code class="language-bash">pnpm dev
</code></pre>
<ul>
<li>로그인 후 <code>/pricing</code> → 결제 버튼 → <code>/api/checkout</code> → Polar 페이지 이동 확인</li>
<li>⚠️ 이 단계에서는 웹훅 없으므로 결제 후 DB 반영 안 됨이 정상</li>
</ul>
<h3>Step 7: 웹훅 등록 → POLAR_WEBHOOK_SECRET</h3>
<p><strong>배포 URL이 있는 경우</strong>:</p>
<ul>
<li>Polar 대시보드 Webhooks → <code>https://&lt;배포도메인&gt;/api/webhooks/polar</code> 등록</li>
</ul>
<p><strong>로컬 전용</strong>:</p>
<pre><code class="language-bash"># ngrok 예시
ngrok http 3000
# → https://xxxx.ngrok-free.app/api/webhooks/polar
</code></pre>
<ul>
<li>위 URL을 Polar Webhooks에 등록</li>
<li>등록 시 표시되는 <strong>서명 시크릿</strong>을 <code>.env.local</code> 의 <strong>변수 <code>POLAR_WEBHOOK_SECRET</code></strong> 값으로 넣는다 (Git 금지).</li>
<li><code>pnpm check-env</code> 재실행 → 전부 통과 확인</li>
<li>앱 재시작</li>
</ul>
<h3>Step 8: E2E 검증</h3>
<ol>
<li>테스트 결제 실행</li>
<li>웹훅 수신 → <code>app/api/webhooks/polar</code> 로그 확인</li>
<li><code>public.subscriptions</code> 행 upsert 확인</li>
<li><code>/dashboard</code> → 플랜 섹션 업데이트 확인</li>
</ol>
<hr>
<h2>5. 주요 파일 (Key Files)</h2>
<table>
<thead>
<tr>
<th>파일</th>
<th>역할</th>
</tr>
</thead>
<tbody><tr>
<td><code>app/api/checkout/route.ts</code></td>
<td>Polar Checkout 세션 생성</td>
</tr>
<tr>
<td><code>app/api/webhooks/polar/route.ts</code></td>
<td>웹훅 수신·서명 검증·DB upsert</td>
</tr>
<tr>
<td><code>app/api/subscription/route.ts</code></td>
<td>구독 상태 조회</td>
</tr>
<tr>
<td><code>app/api/customer-portal/route.ts</code></td>
<td>Polar 고객 포털 리다이렉트</td>
</tr>
<tr>
<td><code>lib/polar.ts</code></td>
<td>Polar SDK 클라이언트 초기화</td>
</tr>
<tr>
<td><code>scripts/check-env.mjs</code></td>
<td>환경 변수 검증 스크립트</td>
</tr>
<tr>
<td><code>supabase/migrations/005_subscriptions.sql</code></td>
<td>subscriptions 테이블 DDL</td>
</tr>
<tr>
<td><code>docs/operational-order.md</code></td>
<td>운영·로컬 순서 레퍼런스</td>
</tr>
<tr>
<td><code>.env.local</code></td>
<td>실제 시크릿 (Git 금지)</td>
</tr>
<tr>
<td><code>.env.example</code></td>
<td>변수명 템플릿</td>
</tr>
</tbody></table>
<hr>
<h2>6. 리스크 (Risks)</h2>
<table>
<thead>
<tr>
<th>리스크</th>
<th>완화 방법</th>
</tr>
</thead>
<tbody><tr>
<td><code>POLAR_SERVER</code> 환경 불일치 (sandbox vs production)</td>
<td>토큰·상품이 속한 환경과 반드시 일치 확인</td>
</tr>
<tr>
<td>웹훅 URL이 로컬 localhost라 등록 불가</td>
<td>ngrok/Cloudflare Tunnel 사용</td>
</tr>
<tr>
<td><code>SUPABASE_SERVICE_ROLE_KEY</code> 없으면 웹훅 503</td>
<td>Step 4에서 필수 설정</td>
</tr>
<tr>
<td>포트 변경 시 <code>NEXT_PUBLIC_APP_URL</code>·Supabase Redirect URL 미수정</td>
<td>포트 바꿀 때마다 두 곳 동시 수정</td>
</tr>
<tr>
<td>웹훅 설정 전 결제 → 대시보드 플랜 비어 있음</td>
<td>Step 7 완료 전 결제하지 않음</td>
</tr>
</tbody></table>
<hr>
<h2>7. 완료 체크리스트</h2>
<ul>
<li><input disabled="" type="checkbox"> <code>public.subscriptions</code> 테이블 존재 확인</li>
<li><input disabled="" type="checkbox"> <code>pnpm check-env</code> — 7개 변수 전부 통과</li>
<li><input disabled="" type="checkbox"> <code>/pricing</code> → 결제 버튼 → Polar 페이지 이동</li>
<li><input disabled="" type="checkbox"> 웹훅 등록 완료 (HTTPS URL)</li>
<li><input disabled="" type="checkbox"> 테스트 결제 후 <code>public.subscriptions</code> 행 생성 확인</li>
<li><input disabled="" type="checkbox"> <code>/dashboard</code> 플랜 섹션에 구독 정보 표시</li>
</ul>
<hr>
<h2>8. 다음 단계</h2>
<p>Plan 완료 후:</p>
<ol>
<li><code>/pdca design polar-integration</code> — 웹훅 플로우·DB 스키마 설계 문서</li>
<li>또는 바로 구현 진행 (코드는 이미 존재, 환경 설정만 필요)</li>
</ol>