---
template: policy-doc@1
doc_id: 03-subscription-order
title: 구독·주문 도메인 — 구독 상태 어휘 · 무료체험 · 실패 건과 재구독 · 주문/주문상세 두 층 · 조직 필터 · 상품 주기 · 정산확정 취소가드 미배포
config: ../_meta/template-config.yaml
last_verified: 4d798f55
policies:
  - id: SUBSCRIPTION_STATE_VOCAB
    status: active-prod
    evidence: [S-schema, S-route]
    limitations:
      - 상태 어휘가 선언된 자리와 가입·조회 입구까지가 관측이다. 상태 사이의 허용 전이는 이 문서가 판정하지 않으며 그 자리는 총론 상태 축이 진다
      - 한 주체가 동시에 가질 수 있는 구독 수는 이 문서가 세지 않았다
    anchors:
      - insuniverse-server/apps/api/src/modules/subscribe/subscribe/subscribe.entity.ts:5
      - insuniverse-server/apps/api/src/modules/subscribe/subscribe/subscribe.controller.ts:32
      - insuniverse-server/apps/api/src/modules/subscribe/subscribe/subscribe.repository.ts:181
  - id: SUBSCRIPTION_TRIAL
    status: active-prod
    evidence: [S-contract, S-constant]
    limitations:
      - 가입 시점에 체험 구독이 함께 생긴다는 것과 그 상품을 고르는 자리까지가 관측이다. 체험 기간의 길이는 상품 자료의 값이라 적지 않는다
      - 체험이 끝난 뒤의 전이를 무엇이 일으키는지는 이 문서가 추적하지 않았다
    anchors:
      - insuniverse-server/apps/api/src/modules/subscribe/subscribe/subscribe.service.ts:136
      - insuniverse-server/apps/api/src/modules/product/product.repository.ts:88
  - id: SUBSCRIPTION_FAILED_RETRY
    status: active-prod
    evidence: [S-schema, S-roles]
    limitations:
      - 실패 건이 별도 자료로 쌓이고 관리자가 다시 태울 수 있다는 것까지가 관측이다. 재시도가 성공했을 때 실패 행이 지워지는지 남는지는 이 문서가 판정하지 않는다
      - 실패 사유 문자열의 어휘 집합은 고정돼 있지 않다
    anchors:
      - insuniverse-server/apps/api/src/modules/subscribe/subscribe-failed/subscribe-failed.entity.ts:5
      - insuniverse-server/apps/api/src/modules/subscribe/subscribe-failed/subscribe-failed.service.ts:58
      - insuniverse-server/apps/api/src/modules/subscribe/subscribe-failed/subscribe-failed-admin.controller.ts:36
  - id: ORDER_TWO_LAYERS
    status: active-prod
    evidence: [S-schema, S-route]
    limitations:
      - 주문과 주문상세가 각각 자기 자료형과 상태 어휘를 갖는다는 것까지가 관측이다. 두 층의 상태가 서로를 어떻게 제약하는지는 이 문서가 판정하지 않는다
      - 상세 1건이 분석 1건과 어떤 대응 관계인지는 `01-analysis.md` 축이며 여기서 다시 쓰지 않는다
    anchors:
      - insuniverse-server/apps/api/src/modules/order/order/order.entity.ts:7
      - insuniverse-server/apps/api/src/modules/order/order-detail/order-detail.entity.ts:5
      - insuniverse-server/apps/api/src/modules/order/order-detail/order-detail.controller.ts:54
  - id: ORDER_ORG_FILTER
    status: active-prod
    evidence: [S-guard, S-contract]
    limitations:
      - 목록과 내려받기가 같은 조직 필터를 거친다는 것까지가 관측이다. 부분트리의 산출이 옳은지는 총론 권한 축이 진다
      - 필터가 비었을 때(소속 조직 없음)의 낙착점은 이 문서가 세지 않았다
    anchors:
      - insuniverse-server/apps/api/src/modules/subscribe/subscribe/subscribe-admin.controller.ts:29
      - insuniverse-server/apps/api/src/modules/subscribe/subscribe/subscribe.service.ts:74
  - id: PRODUCT_CYCLE_AXES
    status: active-prod
    evidence: [S-constant, S-roles]
    limitations:
      - 상품이 종류 축과 주기 축을 따로 갖는다는 것까지가 관측이다. 각 값의 뜻과 금액은 운영 자료라 적지 않는다
      - 상품 편집이 관리자 한 종류라는 것은 관측이되 상품 삭제 시 기존 구독의 처리는 세지 않았다
    anchors:
      - insuniverse-server/apps/api/src/modules/product/product.entity.ts:6
      - insuniverse-server/apps/api/src/modules/product/product.entity.ts:12
      - insuniverse-server/apps/api/src/modules/product/product-admin.controller.ts:29
  - id: SUBSCRIPTION_POST_PAYMENT_ATOMICITY
    status: active-prod
    evidence: [S-contract, A-comment]
    limitations:
      - 개인 경로와 기업 경로가 원자성에서 갈린다는 것까지가 관측이다. 개인 경로에 보상 처리가 다른 자리에 있는지는 이 문서가 전수로 세지 않았다
      - 흡수된 실패를 뒤에 발견하는 경로가 있는지는 세지 않았다. 그 물음은 이월 원장에 있다
    anchors:
      - insuniverse-server/apps/api/src/modules/subscribe/subscribe/subscribe.service.ts:177
      - insuniverse-server/apps/api/src/modules/subscribe/subscribe/subscribe.service.ts:208
      - insuniverse-server/apps/api/src/modules/subscribe/subscribe/subscribe.service.ts:222
      - insuniverse-server/apps/api/src/modules/order/order/order.service.ts:286
      - insuniverse-server/apps/api/src/modules/order/order/order.service.ts:344
      - insuniverse-server/apps/api/src/modules/order/order/order.service.ts:370
  - id: ORDER_SETTLE_CONFIRM_GUARD
    status: staged-only
    evidence: [S-guard, A-release]
    limitations:
      - 미도달 판정의 근거는 이 앵커 행의 최종 변경 커밋 하나다. 그 행이 뒤에 다른 커밋으로 밀리면 같은 규칙이 도달로 뒤집힐 수 있다
      - 정산 확정의 뜻과 그 확정을 누가 내리는지는 `04-settlement-money.md` 축이며 여기서 다시 쓰지 않는다
    anchors:
      - insuniverse-server/apps/api/src/modules/order/order/order.repository.ts:175
  - id: ORDER_CORP_VIEW_GATE
    status: staged-only
    evidence: [S-guard, A-release]
    limitations:
      - 미도달 판정의 근거는 이 앵커 행의 최종 변경 커밋 하나다. 그 행이 뒤에 다른 커밋으로 밀리면 같은 규칙이 도달로 뒤집힐 수 있다
      - 등급 값의 비교 규칙은 총론 권한 축이 지며 이 문서는 그 층이 이 도메인 입구에 결선된 사실만 낸다
    anchors:
      - insuniverse-server/apps/api/src/modules/order/order-detail/order-detail-admin.controller.ts:36
---

# 구독·주문 도메인 — 구독 상태 어휘 · 무료체험 · 실패 건과 재구독 · 주문/주문상세 두 층 · 조직 필터 · 상품 주기 · 정산확정 취소가드 미배포

**무엇을 사서 무엇을 쓸 수 있게 되는가**를 다룬다. 구독의 상태 어휘, 가입과 함께 생기는 체험 구독, 결제가 실패한 건의 적재와 재시도, 주문과 주문상세 두 층, 기업 측 목록에 걸리는 조직 필터, 상품의 종류·주기 축이 여기 있다.

**여기 없는 것** — 결제 승인 자체와 정산·머니 차감은 `04-settlement-money.md` 가, 주문상세 1건이 여는 분석 결과는 `01-analysis.md` 가 진다. 한도 규칙의 정의와 상태 전이의 계약, 결제 주기 스케줄은 총론 소관이며 이 문서는 그 규칙이 이 도메인 자료에 걸리는 자리만 낸다.

## 정책 (기획)

### SUBSCRIPTION_STATE_VOCAB

**구독은 코드값으로 고정된 상태 어휘를 갖는다.** 가입·해지·변경·실패가 그 어휘의 원소이고, 화면이 임의로 다른 값을 넣지 못한다. 가입은 사용자 입구에서 열리고, 한 주체의 현재 구독 상태를 되묻는 조회가 따로 있다.

이 조회는 탈퇴 가능 여부 판정의 입력이기도 하다.

### SUBSCRIPTION_TRIAL

**회원 가입 시점에 체험 구독이 함께 만들어진다.** 어떤 상품으로 만들지는 상품 자료에서 체험용으로 표시된 것을 골라 정하며, 사용자가 고르지 않는다.

### SUBSCRIPTION_FAILED_RETRY

**결제가 실패한 구독은 별도 자료로 쌓이고, 관리자가 골라 다시 태울 수 있다.** 실패 건에는 사유가 문자열로 함께 남고, 목록은 관리자와 영업 주체가 열며 내려받기 자리가 따로 있다.

### ORDER_TWO_LAYERS

**주문은 두 층이다.** 결제 단위인 주문이 있고 그 아래 실제로 쓰이는 단위인 주문상세가 있으며, 각각 자기 종류·상태 어휘를 갖는다. 주문상세의 상태는 사용자 쪽 입구에서도 바뀔 수 있다.

### ORDER_ORG_FILTER

**기업 측 주체가 여는 구독·주문 목록은 조직 필터를 거친다.** 목록과 내려받기가 같은 필터를 쓰며, 필터는 요청한 조직 하나가 아니라 그 부분트리 전체를 분모로 삼는다.

### PRODUCT_CYCLE_AXES

**상품은 종류 축과 주기 축을 따로 갖는다.** 무엇을 파는가와 얼마 간격으로 결제·이용하는가가 서로 다른 코드값이며, 편집은 관리자 한 종류만 한다.

### SUBSCRIPTION_POST_PAYMENT_ATOMICITY

**개인 구독과 기업 구독은 원자성에서 갈린다.** 기업 구독은 전체를 하나의 되돌릴 수 있는 묶음으로 감싸지만, **개인 구독은 감싸지 않는다.**

개인 경로의 순서가 그 차이를 드러낸다 — 구독 행을 **먼저** 만들고 그 다음 주문을 만들며, 결제는 주문 안에서 일어난다. 그래서 **결제가 실패하면 요청은 오류로 끝나지만 앞서 만들어진 구독 행은 그대로 남는다.**

결제가 성공한 뒤의 후속 처리도 묶여 있지 않다. 주문 행 적재는 실패하면 요청 전체를 실패시키지만, 그 뒤의 **적립과 알림톡 발송은 각각 개별로 흡수된다** — 실패해도 주문은 정상 처리로 끝나고 로그만 남는다. 코드 주석이 그 의도를 명시한다.

즉 결제 승인 뒤 잔여 상태는 이렇다: 주문과 구독은 반영되고, 적립·알림은 반영되지 않았을 수 있으며, 그 사실은 응답에 나타나지 않는다.

## 강제 지점 (개발)

### SUBSCRIPTION_STATE_VOCAB

상태 어휘는 `insuniverse-server/apps/api/src/modules/subscribe/subscribe/subscribe.entity.ts:5` 의 열거형이다. 가입 입구는 `insuniverse-server/apps/api/src/modules/subscribe/subscribe/subscribe.controller.ts:32`, 현재 상태 되묻기는 `insuniverse-server/apps/api/src/modules/subscribe/subscribe/subscribe.repository.ts:181` 이다. 상태 전이의 계약 자체는 `../03-contracts/04-state-transitions.md#state:subscription-lifecycle` 가 진다.

### SUBSCRIPTION_TRIAL

체험 구독 생성은 `insuniverse-server/apps/api/src/modules/subscribe/subscribe/subscribe.service.ts:136`, 체험용 상품 선택은 `insuniverse-server/apps/api/src/modules/product/product.repository.ts:88` 이 진다.

### SUBSCRIPTION_FAILED_RETRY

실패 건의 자료형은 `insuniverse-server/apps/api/src/modules/subscribe/subscribe-failed/subscribe-failed.entity.ts:5`, 재시도 처리기는 `insuniverse-server/apps/api/src/modules/subscribe/subscribe-failed/subscribe-failed.service.ts:58`, 목록 입구의 허용 역할은 `insuniverse-server/apps/api/src/modules/subscribe/subscribe-failed/subscribe-failed-admin.controller.ts:36` 이다.

### ORDER_TWO_LAYERS

주문 종류 어휘는 `insuniverse-server/apps/api/src/modules/order/order/order.entity.ts:7`, 주문상세 상태 어휘는 `insuniverse-server/apps/api/src/modules/order/order-detail/order-detail.entity.ts:5` 다. 사용자 쪽 상태 변경 입구는 `insuniverse-server/apps/api/src/modules/order/order-detail/order-detail.controller.ts:54` 이다. 진행과 결과를 가르는 계약은 `../03-contracts/04-state-transitions.md#state:progress-and-outcome-separate` 가 진다.

주문상세를 한 번에 여러 건 쓰는 자리에는 **총론 한도가 걸린다.** 그 한도의 정의와 값은 [대량 쓰기 청크 상한 정책](../04-limits/03-rate-limits-and-batch.md#limits:bulk-write-chunking)이 지고 이 문서는 그것을 다시 적지 않는다 — 이 도메인에서 그 규칙이 실제로 걸리는 자리는 `insuniverse-server/apps/api/src/modules/order/order-detail/order-detail.service.ts:115` 와 같은 파일 `:195` 두 곳이며, 그 정책의 `anchors` 가 이 두 좌표를 담는다.

**이 문서에 걸리는 총론 한도 정책은 그 하나뿐이다.** 나머지 한도 정책은 이 각론이 소유한 모듈(`order`·`product`·`subscribe`)을 `anchors` 로 갖지 않아 다른 각론이 진다 — 판정과 그 사유는 이 축의 마일스톤 10 원장이 정책별로 든다.

### ORDER_ORG_FILTER

관리자 쪽 입구의 결선 층은 `insuniverse-server/apps/api/src/modules/subscribe/subscribe/subscribe-admin.controller.ts:29`, 조직 필터 산출은 `insuniverse-server/apps/api/src/modules/subscribe/subscribe/subscribe.service.ts:74` 다. 쓰기 범위 층 자체는 `../02-access/03-authz-capabilities.md#ORG_WRITE_SCOPE` 가 진다.

### PRODUCT_CYCLE_AXES

종류 축은 `insuniverse-server/apps/api/src/modules/product/product.entity.ts:6`, 주기 축은 `insuniverse-server/apps/api/src/modules/product/product.entity.ts:12` 의 열거형이다. 편집 입구의 허용 역할은 `insuniverse-server/apps/api/src/modules/product/product-admin.controller.ts:29` 가 선언한다.

### SUBSCRIPTION_POST_PAYMENT_ATOMICITY

개인 경로의 구독 행 생성은 `insuniverse-server/apps/api/src/modules/subscribe/subscribe/subscribe.service.ts:177`, 그 뒤 결제 실패 시 던지는 자리는 `insuniverse-server/apps/api/src/modules/subscribe/subscribe/subscribe.service.ts:208` 이며 그 사이를 감싸는 트랜잭션이 없다. 기업 경로는 `insuniverse-server/apps/api/src/modules/subscribe/subscribe/subscribe.service.ts:222` 가 전체를 감싼다. 결제 호출은 `insuniverse-server/apps/api/src/modules/order/order/order.service.ts:286`, 결제 성공 뒤 적립과 알림톡의 개별 실패 흡수는 각각 `insuniverse-server/apps/api/src/modules/order/order/order.service.ts:344` 와 `insuniverse-server/apps/api/src/modules/order/order/order.service.ts:370` 이다. 흡수된 알림톡 실패를 뒤에 발견하는 자리는 `../05-schedules/03-monitoring.md#monitoring:alimtalk-status` 가 지며, 적립 쪽에는 그런 자리가 이 창의 관측에 없다.

### ORDER_SETTLE_CONFIRM_GUARD

정산이 확정된 주문인지를 되묻는 판정이 `insuniverse-server/apps/api/src/modules/order/order/order.repository.ts:175` 에 있다. 그 행의 최종 변경 커밋이 릴리스 인덱스의 미도달 집합에 있다.

### ORDER_CORP_VIEW_GATE

기업별 노출 등급 판정 층이 `insuniverse-server/apps/api/src/modules/order/order-detail/order-detail-admin.controller.ts:36` 의 결선 목록에 함께 실려 있다. 그 행의 최종 변경 커밋이 릴리스 인덱스의 미도달 집합에 있다. 등급 비교 규칙 자체는 `../02-access/03-authz-capabilities.md#CORP_ANALYSIS_VIEW_SCALE` 가 진다.

## 적용 범위 (actor × 서비스)

| 정책 id | server | site | admin |
|---|---|---|---|
| SUBSCRIPTION_STATE_VOCAB | 상태 어휘 · 가입 입구 · 상태 되묻기 | 가입·해지 화면 | 구독 목록의 상태 열 |
| SUBSCRIPTION_TRIAL | 체험 구독 생성 · 체험 상품 선택 | 가입 직후 체험이 붙는다 | — |
| SUBSCRIPTION_FAILED_RETRY | 실패 자료형 · 재시도 처리기 · 역할 선언 | — | 실패 목록·재시도 화면 |
| ORDER_TWO_LAYERS | 두 자료형 · 상태 변경 입구 | 주문 내역 화면 | 주문·주문상세 목록 |
| ORDER_ORG_FILTER | 결선 층 · 조직 필터 산출 | — | 기업 측 콘솔 목록·내려받기 |
| PRODUCT_CYCLE_AXES | 두 축 어휘 · 편집 역할 선언 | 상품 목록 조회 | 상품 편집 화면 |
| SUBSCRIPTION_POST_PAYMENT_ATOMICITY | 두 경로의 원자성 차이 · 두 흡수 자리 | 결제 요청이 이 경로를 탄다 | 기업 구독 등록이 감싸인 경로를 탄다 |
| ORDER_SETTLE_CONFIRM_GUARD | 정산 확정 여부 판정 | — | 취소 시도가 이 판정을 만난다 |
| ORDER_CORP_VIEW_GATE | 노출 등급 층 결선 | — | 기업 측 주문상세 목록이 이 층 뒤에 있다 |

`—` = 그 서비스가 이 정책의 경로에 등장하지 않음.

이 표의 열은 서비스 3종이며 actor 는 열이 아니다. 이 문서의 축은 구독·주문 자원에 걸리는 판정이라 actor 를 열로 두면 서버 한 칸만 차는 표가 된다. 열 이름 집합과 순서는 `../_meta/template-config.yaml` 의 `services` 를 그대로 따른다.

## 예외·폴백

| 정책 id | 예외 조건 | 폴백 동작 | 확인 근거 |
|---|---|---|---|
| SUBSCRIPTION_STATE_VOCAB | 어휘 밖 상태값을 실어 보낼 때 | 입력 검증에서 거부된다 | `insuniverse-server/apps/api/src/modules/subscribe/subscribe/subscribe.entity.ts:5` |
| SUBSCRIPTION_STATE_VOCAB | 살아 있는 구독을 둔 채 탈퇴를 시도할 때 | 상태 되묻기 결과가 그 판정의 입력이 된다 | `insuniverse-server/apps/api/src/modules/subscribe/subscribe/subscribe.repository.ts:181` |
| SUBSCRIPTION_TRIAL | 체험용으로 표시된 상품이 없을 때 | 고를 대상이 없어 체험 구독이 만들어지지 않는다 | `insuniverse-server/apps/api/src/modules/product/product.repository.ts:88` |
| SUBSCRIPTION_FAILED_RETRY | 재시도가 다시 실패할 때 | 실패 건이 그대로 남는다. 자동 재시도는 이 경로에 없다 | `insuniverse-server/apps/api/src/modules/subscribe/subscribe-failed/subscribe-failed.service.ts:58` |
| ORDER_TWO_LAYERS | 주문상세 상태를 사용자 쪽에서 바꿀 때 | 입구가 열려 있다. 어떤 상태로의 이동이 허용되는지는 이 문서가 판정하지 않는다 | `insuniverse-server/apps/api/src/modules/order/order-detail/order-detail.controller.ts:54` |
| ORDER_ORG_FILTER | 소속 조직이 없는 기업 측 주체일 때 | 필터의 낙착점을 이 문서가 세지 않았다 | `insuniverse-server/apps/api/src/modules/subscribe/subscribe/subscribe.service.ts:74` |
| PRODUCT_CYCLE_AXES | 관리자가 아닌 주체가 상품을 고칠 때 | 역할 판정에서 거부된다 | `insuniverse-server/apps/api/src/modules/product/product-admin.controller.ts:29` |
| SUBSCRIPTION_POST_PAYMENT_ATOMICITY | 개인 구독에서 결제가 실패할 때 | 요청은 오류로 끝나되 앞서 만들어진 구독 행은 남는다 | `insuniverse-server/apps/api/src/modules/subscribe/subscribe/subscribe.service.ts:208` |
| SUBSCRIPTION_POST_PAYMENT_ATOMICITY | 결제 성공 뒤 적립·알림이 실패할 때 | 주문은 정상 처리로 끝나고 로그만 남는다. 응답에 나타나지 않는다 | `insuniverse-server/apps/api/src/modules/order/order/order.service.ts:344` |
| SUBSCRIPTION_POST_PAYMENT_ATOMICITY | 기업 구독에서 중간이 실패할 때 | 전체가 되돌려진다 | `insuniverse-server/apps/api/src/modules/subscribe/subscribe/subscribe.service.ts:222` |
| ORDER_SETTLE_CONFIRM_GUARD | 이 규칙이 배포에 도달하지 않은 환경일 때 | 정산이 확정된 주문도 취소 경로를 만난다 | `insuniverse-server/apps/api/src/modules/order/order/order.repository.ts:175` |
| ORDER_CORP_VIEW_GATE | 이 규칙이 배포에 도달하지 않은 환경일 때 | 등급 판정 없이 역할·범위 층만 남는다 | `insuniverse-server/apps/api/src/modules/order/order-detail/order-detail-admin.controller.ts:36` |

## 부록

이 절의 정책은 **앵커 행의 최종 변경 커밋이 릴리스 인덱스의 미도달 집합에 있어 현행 배포를 판정하지 못한다.** 배치의 정본은 `../_meta/template-config.yaml` 의 `statuses` 이며, 도달이 확인되면 상태가 바뀌고 배치도 함께 옮긴다.

### ORDER_SETTLE_CONFIRM_GUARD

**정산이 확정된 주문은 취소 경로에서 걸러진다.** 이 판정이 도달한 환경에서는 확정 뒤의 취소가 막히고, 도달하지 않은 환경에서는 그 방어가 없다.

### ORDER_CORP_VIEW_GATE

**기업 측 주문상세 목록에 기업별 노출 등급 판정이 걸려 있다.** 이 층이 도달한 환경에서는 등급이 요구값에 못 미치는 기업이 목록에 닿지 못하고, 도달하지 않은 환경에서는 역할과 조직 범위만으로 열린다.

## 연혁

릴리스 태그가 존재하지 않는다. 릴리스 열은 `—` 로 두고 커밋 SHA 로 추적한다.

| 릴리스 | 날짜 | SHA | 변경 요약 |
|---|---|---|---|
| — | 2024-10-29 | `0b2c8761` | 구독 가입 입구의 이름·경로 정리 |
| — | 2024-11-12 | `7bf60c8f` | 상품 자료형과 종류 축 신설 |
| — | 2024-11-21 | `9cc87479` | 주문상세의 상태 열 이름 정리 |
| — | 2024-11-29 | `b65a4213` | 구독 상태 어휘가 열거형으로 고정됨 |
| — | 2024-12-05 | `d6d26225` | 주문 종류 어휘 정리 |
| — | 2024-12-11 | `1a00fbbe` | 탈퇴 판정이 현재 구독 상태를 되묻도록 변경 |
| — | 2024-12-13 | `433b632f` | 상품에 결제 주기·이용 주기 축 추가 |
| — | 2024-12-26 | `984cb421` | 주문상세 상태를 사용자 쪽에서 바꾸는 입구 신설 |
| — | 2025-01-13 | `c514d67a` | 가입 시점 체험 구독 생성과 체험 상품 선택 도입 |
| — | 2025-03-31 | `c85683c8` | 결제 실패 구독의 별도 자료형 신설 |
| — | 2025-03-31 | `f4113535` | 실패 건 재구독 처리기 신설 |
| — | 2025-06-24 | `780e6b64` | 상품 편집 입구에 역할 기반 판정 도입 |
| — | 2024-11-22 | `c7a71916` | 주문 안에서 결제를 호출하는 경로 신설 |
| — | 2025-03-26 | `60831114` | 기업 구독 등록이 트랜잭션으로 감싸짐 |
| — | 2025-11-21 | `68c81b11` | 결제 성공 시 적립이 붙고 그 실패가 흡수됨 |
| — | 2025-11-27 | `9ddfb818` | 결제 성공 알림톡이 붙고 그 실패가 흡수됨 |
| — | 2026-07-06 | `f064fca5` | 결제 실패 메시지를 그대로 되돌리도록 변경 |
| — | 2026-07-01 | `f0ce46c8` | 구독 관리자 입구에 조직 범위 층 결선 |
| — | 2026-07-02 | `23e0663e` | 구독·주문 목록과 내려받기에 조직 부분트리 필터 도입 |
| — | 2026-07-16 | `89bc923a` | 정산 확정 주문의 취소 방어 판정 추가 |
| — | 2026-07-24 | `54473012` | 기업별 분석 노출 등급 판정이 주문상세 입구에 결선됨 |
