배송 보험·파손 클레임 자동화: CS 비용을 절반으로 줄이는 배송 사고 처리

이커머스

배송 보험클레임 자동화CS 자동화배송 사고택배 연동

이 글은 누구를 위한 것인가

  • 배송 파손·분실 CS가 하루에 수십 건씩 쌓이는 팀
  • 클레임 처리가 수동이라 3-5일씩 걸리는 운영팀
  • 배송 보험을 도입하고 싶은데 어떻게 연동할지 모르는 팀

들어가며

배송 파손 CS 하나당 평균 처리 시간은 20-30분이다. 월 500건이면 운영팀 전체가 거기에 묶인다. 자동화로 80%를 자동 승인하면 CS는 나머지 20%의 복잡한 케이스에 집중할 수 있다.

이 글은 bluefoxdev.kr의 이커머스 CS 자동화 전략 를 참고하여 작성했습니다.


1. 클레임 자동화 판단 기준

[자동 승인 가능 조건]
  상품 가격 < 50,000원
  AND 고객 클레임 이력 < 3회/년
  AND 사진 파손 증거 명확 (AI 판정 > 0.85)
  AND 택배사 보험 적용 상품

[수동 검토 필요 조건]
  상품 가격 >= 50,000원
  OR 클레임 이력 3회 이상
  OR 파손 판정 불명확 (0.5 < score < 0.85)
  OR 고가품 (전자제품, 명품)

[자동 거절 조건]
  배송 완료 후 7일 초과 신청
  OR 사진 미첨부
  OR 포장 파손 없이 상품만 파손 주장
  OR 동일 상품 재클레임

2. 클레임 접수 및 AI 판정

import anthropic
import base64
from dataclasses import dataclass
from enum import Enum

class ClaimDecision(Enum):
    AUTO_APPROVE = "auto_approve"
    MANUAL_REVIEW = "manual_review"
    AUTO_REJECT = "auto_reject"

@dataclass
class ClaimResult:
    decision: ClaimDecision
    damage_score: float
    compensation_amount: float
    reason: str

client = anthropic.Anthropic()

async def evaluate_damage_claim(claim: dict) -> ClaimResult:
    """사진 기반 파손 판정"""
    
    # 이미지를 base64로 인코딩
    images_content = []
    for image_url in claim.get("damage_photos", []):
        image_data = await download_image(image_url)
        images_content.append({
            "type": "image",
            "source": {
                "type": "base64",
                "media_type": "image/jpeg",
                "data": base64.standard_b64encode(image_data).decode("utf-8"),
            },
        })
    
    images_content.append({
        "type": "text",
        "text": f"""배송 파손 판정을 해주세요.
상품: {claim['product_name']}
가격: {claim['product_price']:,}원
클레임 내용: {claim['description']}

JSON 응답:
{{
  "damage_detected": true/false,
  "damage_score": 0.0-1.0,
  "damage_type": "packaging_damage|product_damage|complete_loss",
  "compensation_rate": 0.0-1.0,
  "reason": "판정 이유"
}}"""
    })
    
    response = client.messages.create(
        model="claude-opus-4-7",
        max_tokens=300,
        messages=[{"role": "user", "content": images_content}]
    )
    
    import json
    result = json.loads(response.content[0].text)
    
    # 보상 금액 계산
    compensation = claim["product_price"] * result["compensation_rate"]
    
    # 자동화 판정
    price = claim["product_price"]
    claim_count = await get_customer_claim_count(claim["user_id"])
    damage_score = result["damage_score"]
    
    if (price < 50000 and claim_count < 3 and damage_score > 0.85):
        decision = ClaimDecision.AUTO_APPROVE
    elif damage_score < 0.4:
        decision = ClaimDecision.AUTO_REJECT
    else:
        decision = ClaimDecision.MANUAL_REVIEW
    
    return ClaimResult(
        decision=decision,
        damage_score=damage_score,
        compensation_amount=compensation,
        reason=result["reason"],
    )

async def process_claim(claim_id: str):
    """클레임 처리 메인 플로우"""
    claim = await get_claim(claim_id)
    result = await evaluate_damage_claim(claim)
    
    if result.decision == ClaimDecision.AUTO_APPROVE:
        await approve_claim(claim_id, result.compensation_amount)
        await issue_refund(claim["user_id"], result.compensation_amount)
        await notify_customer(claim["user_id"], "승인", result.compensation_amount)
        
    elif result.decision == ClaimDecision.AUTO_REJECT:
        await reject_claim(claim_id, result.reason)
        await notify_customer(claim["user_id"], "거절", 0)
        
    else:
        await queue_for_manual_review(claim_id, result)
        await notify_customer(claim["user_id"], "검토중", 0)
    
    # 택배사에 보험 청구
    if result.decision == ClaimDecision.AUTO_APPROVE:
        await submit_carrier_insurance_claim(claim, result)

3. 택배사 보험 청구 자동화

async def submit_carrier_insurance_claim(claim: dict, result: ClaimResult):
    """CJ대한통운, 한진 등 택배사 보험 API 연동"""
    
    tracking_info = await get_tracking_info(claim["tracking_number"])
    
    insurance_payload = {
        "tracking_number": claim["tracking_number"],
        "claim_type": "damage",  # damage, loss
        "declared_value": claim["product_price"],
        "claimed_amount": result.compensation_amount,
        "damage_description": claim["description"],
        "evidence_urls": claim["damage_photos"],
        "recipient_info": {
            "name": claim["recipient_name"],
            "phone": claim["recipient_phone"],
            "address": claim["delivery_address"],
        },
    }
    
    # 택배사 API 호출 (예: CJ대한통운)
    async with httpx.AsyncClient() as client:
        response = await client.post(
            "https://api.cjlogistics.com/v1/insurance/claim",
            json=insurance_payload,
            headers={"Authorization": f"Bearer {CJ_API_KEY}"},
        )
        
    if response.status_code == 200:
        claim_number = response.json()["insurance_claim_number"]
        await save_insurance_claim(claim["id"], claim_number)

마무리

배송 클레임 자동화의 핵심은 "자동화 가능한 80%를 빠르게 처리하고, 나머지 20%에 인력을 집중"하는 것이다. AI 파손 판정은 5만원 이하 상품에 적용하고, 고가품은 반드시 사람이 검토해야 한다. 택배사 보험 자동 청구까지 연동하면 비용도 회수된다.