쿨랩오피스 1단계는 매출보고서 판매량을 채널→거점 고정 매핑(네이버→CJ, 쿠팡→로켓, 자사몰→플랜)으로 차감한 추정치다. 입력이 판매량 하나뿐이라 아래가 전부 '유령 차이'로 쌓인다.
즉 숫자가 틀린 게 아니라 모델이 흐름을 받을 자리가 없다. 판매량 차감 모델은 폐기하고, 재고를 '설명하는' 장부로 바꾼다.
| 거점 | API로 되는 것 | API로 안 되는 것 | 현실 수집 경로 | 접근 조건 · 주의 |
|---|---|---|---|---|
| 쿠팡 로켓그로스 FC partial |
재고 요약 rg/inventory/summaries — SKU별 주문가능수량 + 최근 30일 판매수(분당 50회)주문 rg/orders — 출고일 기준, 최대 30일 |
입고 · 반출 · 반품 복귀 · 불량 · 정산 API 없음. 재고도 '주문가능수량' 한 숫자뿐(입고 검수중·반출중 안 보임) | API 스냅샷 일 4회(계단 상승 = 입고 확정 시점) + WING 입고관리·반출관리 화면을 Playwright가 테이블로 읽기(엑셀 다운로드 불가 확인됨 — 캡처 판독 대체) | Open API 키는 판매자당 1개 — 연동업체(이지어드민) or 자체개발 택1. 현재 키가 이지어드민 연동이면 자체개발로 재발급(IP 최대 10개 등록, 이지어드민·이지싱크 IP 포함) 필요, 그 사이 플랜 쿠팡 주문수집 단절. 키 180일 만료(14일 전 재발급), 초당 5회 제한 |
| 플랜 3PL (이지어드민) 로그 완전 |
공식 API 있음(api2.ezadmin.co.kr, 재고·입출고 로그 조회) |
API는 고객사(플랜) 서명 동의 + 세팅비 200만 + 월 20만(2026-01~) — SKU 10개 규모엔 과함 | 재고로그 .xls(HTML 테이블) 다운로드 — 이미 파서 검증 완료(922행, 행별 잔액 포함). Playwright 자동 로그인 → 일 1회 수집. 보조: '판매처재고동기화' 기능으로 플랜 가용재고가 카페24에 전송되므로 카페24 Admin API로 스냅샷 무스크래핑 조회 가능 | 플랜이 자동화 전용 화주 하부계정을 발급해야 함(보안로그인 동시접속 1개 — 없으면 플랜 담당자 세션이 끊김). reCAPTCHA v3·30분 세션·IP 제한. 약관 11조(결과물 외부 복제) → 플랜 서면 양해 필수 |
| CJ LOIS eFLEXs (FBN 전환기) partial |
화주용 Open API 프로그램 존재(개발자 포털, Developer Guide v9.3.0) | 포털 접근은 영업사원→영업P팀 승인 후. 재고·입출고 이력이 제공 항목에 있는지 미확인, 항목 외 개발은 유상 | 포털 엑셀: 통합재고조회(가용/보류) · 입고 실적 현황 · 주문현황(15일) · 정산>고객매출확인. 전환기 한정이라 수동 드롭(주 2회)으로 최소 투자 | FBN 전환 후 eFLEXs 화주 계정 유지 여부 미확인(네이버 답변 "CJ 센터 유지"와 별개). 10/1 기준 S100 9/23 68개 미입고·8/18 유령 EO 340 정리 필요 |
| 네이버 N배송 FBN (전환 후) partial |
커머스API N배송 그룹 = SKU 마스터 4개(목록·조회·연결상품). 주문 상세 skuMappings(nsId·출고수량)로 주문→SKU 출고량 재구성. 채널상품 stockQuantity(판매가능 재고, 센터 실재고 아님) |
SKU별 센터 재고·입고·반출·반품·물류비 API 없음 — 네이버 공식 답변 3회 명시(#2900·#3396·#3578), 2025-09부터 4차례 요청에도 변화 없음 | ★스마트스토어센터 > N배송 관리 > N배송 이용 > SKU·재고에 흐름 원장이 이미 있음: ① SKU별 재고수량(1분 갱신, 센터별 엑셀) ② 월별 재고 보관 내역(매일 05시 센터·SKU 총재고 = 일별 스냅샷 시계열) ③ 월별 재고 변동 내역 엑셀(요약: 변동 전 + 입고·반품입고·출고·반출·폐기·재고이관 + 조정 = 변동 후 / 상세: 일자별). 입고 신청·반출 조회·반품 조회·물류비 청구서(매월 9일) 메뉴 | 센터 자동 다운로드는 2단계 인증·자동화 탐지 리스크 → 주 1회 수동 투입 폴백 전제. 내스토어 앱 2RPS 고정. 물류사에 따라 반출·폐기·이관이 '재고조정'으로 뭉뚱그려질 수 있음(FAQ 16582). 전환 전후 엑셀 컬럼 상이(보관 재고수량·PLT/CELL은 FBN 전용) |
| 본사 창고 시스템 없음 |
— | 구글시트 '본사_원장' 탭 1개 — 생산입고 · 직접출고(B2B 직납·샘플) · 실사 3종만. 본사→플랜 이송은 플랜 '입고' 로그(메모 'M/D 입고')에서 자동 파생하므로 입력 불필요 | 입력 누락은 플랜 입고 로그가 먼저 발견돼 '본사 출고 미기재' 큐로 역유도. 실사 분기 1회 | |
| 기성 솔루션 해당 없음 |
플레이오토(로켓그로스 '상품 기능만 제공')·넥스트엔진('재고/주문은 쿠팡 자체 관리')·사방넷(자체 창고 재고 내보내기용)·샵링커·셀메이트 — 로켓그로스·FBN 재고 수집 기능 전부 부재. 이카운트(월 4만+가입 20만)는 창고이동 전표·수불부가 있으나 수집은 어차피 자체 개발이라 이중 시스템. → 구독하지 않는다 | |||
관점을 달리한 설계 3개를 독립 생성하고 심사 3회(가시성·자동화·비용·유지·정확 50점). 3회 모두 A안(이벤트 원장) 승자 37/50 — 유일하게 실제 로그·시트를 실측해 분류 규칙을 세웠고, 심사자가 S100 로그 922행을 직접 재파싱해 규칙이 전부 맞음을 확인.
| 안 | 핵심 | 점수 | 치명 결함 | 가져온 것 |
|---|---|---|---|---|
| A 이벤트 원장 채택 | 거점 로그 → append-only 원장, 재고=누적합, 이동=출발/도착 상태기계, 스냅샷=대사용 | 37 | 어댑터 10개 유지보수 부담(→ C의 공학 틀로 보완) | 골격 전체 |
| B 스냅샷 차분 | 스냅샷을 진실로, Δ를 로그→집계→이동→반품 순으로 분해 | 28~29 | 비연동 시트 미사용 → 플랜 출고 76%('쿨랩' 703행)의 목적·목적지 상실. 판매처 사전확률이 실데이터와 반대. 집계 고정 매핑(네이버→CJ)을 설명 엔진에 재도입 = 771 원인 재현 | 쿠팡 스냅샷 일 4회 슬롯(계단 Δ = 입고/반출), 반품 풀, 전사 보존식, N배송 보관내역=일별 시계열 |
| C 파일 인박스 | 수집기↔파서를 파일 규약으로 분리, config·fixtures·멱등 | 33~35 | 이지어드민 API job 코드(in/out/retin…)를 .xls에 적용 — 실로그 작업값은 '배송·입고' 둘뿐이라 규칙 대부분 미발동, 박스 이동 한 건도 식별 못 함 | 인박스 파일명 규약, config.toml, tests/fixtures, sku_alias(grade A/B), inferred→confirmed 승격, 본사→플랜 파생 |
_input.json(리뷰작업·B2B·반품등급)을 재사용해 이중 입력 없음. 리뷰 가배송은 원장에 올리지 않음(실물 미발송·플랜 송장 미출력 — 10/1 확정)| 테이블 | 역할 | 핵심 컬럼 |
|---|---|---|
sku_master + sku_alias | 모든 시스템 ID를 바코드 하나로 | 바코드 · 박스입수(S100 34 · C100 48 · 쿨리 32 · 치카 32) · 이지어드민 상품코드(00007 등) · CJ 품목코드 · 쿠팡 옵션ID(로켓/판배 94986287594/반품등급 10개/이너쿨 결합) · 네이버 nsId · 집계 제품명. 미매핑 ID는 적재 안 하고 '매핑없음' 예외 1건 |
hubs | 거점 | HQ · PLAN · CJ(전환 전) · FBN(전환 후, 물류사 불문) · CP_FC(fc_name 속성: 인천14/고양1/동탄1) · TRANSIT · 버킷 GOOD/BAD/HOLD |
ledger_events | append-only 원장(정정은 역분개) | 일시 · 거점 · 버킷 · SKU · 타입(IN_PROD/IN_TRANSFER/OUT_TRANSFER/OUT_SALE/OUT_B2B/OUT_SAMPLE/IN_RETURN/WITHDRAW/DISPOSE/ADJ) · 수량(부호) · 상대거점 · 채널 · 근거(관리번호/orderId/시트행/입고ID) · confidence(confirmed/inferred/pending) |
transfers | 이동 상태기계 | 출발일·출발거점·목적지·FC명·보낸수량·도착일·확정수량·상태(SENT→RECEIVED/PARTIAL/OVERDUE/MISROUTED/DISPUTED)·송장 |
snapshots | 거점 보고 재고 | 거점·SKU·일자·슬롯(쿠팡 00/06/12/18)·가용·보류·원본 JSON |
reconciliation | 대사 큐 | 거점·SKU·일자·차이·자동설명·상태(UNEXPLAINED→RESOLVED)·사유·결정자 |
| 로그 값 | 의미 | 이벤트 |
|---|---|---|
| 작업 '배송' · 판매처 '카페24 (쿨랩)' | 자사몰 판매 출고 | OUT_SALE(자사몰) |
| 작업 '배송' · 판매처 '스마트스토어(쿨랩)' | 네이버 연동 자동수집 = 일반배송·당일발송 라인(부속품). ⚠10/1 실측: 롱호스·노즐팁이 S100 본체 코드 00007로 오매핑돼 9/23 1·9/28 8개가 본체 재고에서 빠짐 → SKU는 이지어드민 상품코드가 아니라 '판매처 상품코드'(13293107919 롱호스·13293145187 노즐팁·13726170664 원형모·13463003273 타원모)로 판정 | OUT_SALE(네이버) @PLAN, SKU=sku_alias(판매처 상품코드) — 본체 코드 불일치 시 '매핑경고' 큐 |
| 작업 '배송' · 판매처 '쿠팡(쿨랩)' | 판매자배송 연동 출고(실배송) | OUT_SALE(쿠팡판배) @PLAN |
| 작업 '배송' · 판매처 '쿨랩' | 비연동 수동 등록 전부(76%) → 구글시트 '플랜 비연동 요청(3PL)'과 (출고일·상품·수량) 조인 | 시트 목적별: 쿠팡 입고건→OUT_TRANSFER→CP_FC(FC명) / CJ풀필먼트 입고→OUT_TRANSFER→CJ / 네이버 주문건→OUT_SALE(네이버) / 쿠팡 주문건→OUT_SALE(판배) / CS건→OUT_CS / 공구·납품·단체→OUT_B2B / 체험단·샘플·시딩→OUT_SAMPLE |
| 같은 타임스탬프(±5초) 박스배수 행 N개 | 거점 이동 출발(예 9/21 17:10:40 34×7=238 → 시트 CJ 68 + 쿠팡 동탄1 170으로 분해) | OUT_TRANSFER → TRANSIT. 박스배수로 안 떨어지면 DISPUTED |
| 작업 '입고' · 메모 'M/D 입고' | 본사→플랜 도착 | IN_TRANSFER @PLAN + 본사 OUT_TRANSFER 자동 파생 |
| 작업 '입고' · 메모 '반품입고' | 반품 재입고(정상/불량은 '회수' 탭) | IN_RETURN |
| 메모 'cs 배송취소'(음수) | 역분개 | 원 이벤트 취소 |
매칭 키 우선순위: 송장번호 > (날짜창 · SKU · 수량 정확 일치) > (날짜창 · SKU · 박스배수 분해). 도착 윈도우: 쿠팡 10일(검수 3일 반영) · FBN 7일 · 플랜 5일. 윈도우 초과 → OVERDUE 큐.
① MD 확인 3건: WING>판매자정보>추가판매정보에서 Open API 키 연동방식(이지어드민 연동인지)·IP·만료일 / 플랜에 자동화 전용 화주 하부계정·IP 등록·자동 조회 서면 양해 요청 / FBN 전환 후 eFLEXs 계정 유지 여부·CJ 잔존재고 처리 방식 확인
② 스키마·config·sku_alias·box_qty 작성
③ 이지어드민 .xls 파서 + 비연동 시트 파서(본탭·회수·물류_운영) + classify(실측 규칙) + purpose_map
④ 7/1~9/30 백필 → '플랜 +771 · CJ −380' 재현 리포트 = 설계 검증 게이트. 통과 전엔 다음 단계 안 감
⑤ 본사_원장 탭 생성(생산입고·직접출고·실사 3종) + 초기 실사 1회
이동 상태기계·대사·큐·xlsx 뷰 3종·run_daily(06:30 스케줄러). 쿠팡 수집기 — 키 상태에 따라 (A) rg API 스냅샷 일 4회 + rg/orders 7일 롤링, 또는 (B) 키 전환 전까지 WING 화면 Playwright 읽기. CJ는 엑셀 수동 드롭 파서(주 2회). 백필 데이터로 8/18 MISROUTED·9/21 OVERDUE·C100 PARTIAL이 자동 검출되는지 확인
FBN 센터 엑셀 3종(SKU별 재고·월별 보관·월별 변동) 파서 + 커머스API 내스토어 앱(SKU 마스터·주문 skuMappings·GIFT_RECEIVED 보정). 이지어드민·센터 Playwright 자동 다운로드(headed + 영속 프로필로 2FA·캡차 재인증 최소화, 실패 시 '같은 파일 수동 투입' 폴백). 매월 5일 이후 FBN 전월 확정본 재수집
오피스: 고정 차감 로직·음수 재고 제거, 뷰 4개(v_stock_now·v_flow_daily·v_in_transit·v_queue_open) 화면화, 쓰기 3개(본사 입력·B2B 출고거점·큐 결정)만 허용. 2주간 구 재고와 병행하며 미설명 변동 주 2건 이하 달성 시 컷오버. 보고서검수 스킬에 '재고 원장 대조' 체크 추가
매일 반복되는 신규 수작업은 0건. 일일 집계는 기존 루틴 그대로.
| 구분 | 내용 |
|---|---|
| 그만두는 것 | ① 매출보고서 판매량 → 채널→거점 고정 매핑 차감 로직 전부 ② 음수 재고 표시(→ '미설명 변동' 배지) ③ 재고 수기 보정 화면(조정은 큐를 통해 사유 필수) |
| 받는 것 | inventory.sqlite 읽기 뷰 4개 — v_stock_now(거점×SKU 원장/스냅샷/차이·운송중) · v_flow_daily(수불부) · v_in_transit(이동 보드) · v_queue_open(큐). 화면은 뷰를 그대로 그리고 계산은 하지 않음(계산 주체는 원장 하나) |
| 주는 것 | ① 본사 입력 폼(생산입고·직접출고·실사) ② B2B 수주 레코드에 '출고거점' 필드 1개 ③ 큐 결정(resolved_as) 저장 — 유일한 쓰기 경로, source=manual_adj·결정자 기록 |
| 계속 주는 것 | 매출보고서의 일·채널·제품 판매량, B2B 행, 리뷰작업 — 집계 _input.json 경유로 대조 기대값에 사용(오피스 쪽 추가 작업 없음) |
| 이후 확장 | 재고 소진 예측·재발주 판단(거점 가용 ÷ 이동평균 판매), 거점별 물류비 원장(FBN 청구서·CJ 청구 xls·쿠팡 보관료) |