Engineering2026-04-0911 min read

경쟁자 메타데이터 변경을 밤사이 감지하는 법

경쟁자가 오후 3시에 부제를 바꿉니다. 다음 날 아침 8시에는 그 변경과 본인 랭크 하락을 연결하는 이메일이 도착합니다. 그 뒤의 cron 기반 감지 파이프라인을 정리했습니다.

문제: 2주 늦게 알게 된다

경쟁자가 앱 부제를 "Simple Expense Tracker"에서 "AI Budget Planner & Expense Tracker"로 바꿨습니다. 그 메타데이터 변경 하나가 카테고리 전체의 키워드 랭킹을 흔들 수 있습니다. 그들이 "AI budget", "budget planner", "expense tracker"에 한꺼번에 랭크되기 시작합니다. 본인 앱은 "expense tracker"에서 3 위치 떨어지고, 본인은 주간 다운로드 숫자가 이상해 보일 때까지 모릅니다.

발견할 때쯤이면 — 어쩌면 2주 뒤, 어쩌면 영영 — 피해는 끝났습니다. 그들은 새 랭킹을 굳혔고, 본인은 따라잡기 모드. 앱스토어는 빨리 움직이는 자에게 보상합니다. 그날 알았다면, 몇 시간 안에 본인 키워드를 조정할 수 있었습니다.

이 문제를 풀기 위해 만들었습니다: 밤사이 경쟁자 메타데이터 변경 감지하고, 본인 랭킹 변동과 자동으로 연결.

아키텍처: 스냅샷과 diff

개념은 단순. 매일 각 경쟁자 공개 메타데이터의 스냅샷. 오늘 스냅샷을 어제 것과 비교. 뭔가 바뀌었으면 기록. 그리고 그 변경을 본인 키워드 랭킹 히스토리와 교차 참조해 연결성 확인.

구현은 4단계: 데이터 수집기, diff 엔진, 교차 진단 시스템, 알림 파이프라인. 각각이 일일 cron 시퀀스의 별도 스테이지로 동작합니다.

스테이지 1: 일일 경쟁자 스냅샷

매일 UTC 19:00 (KST 새벽 4시)에 Vercel Cron job이 경쟁자 동기화를 트리거. Competitors 탭에 추가한 각 경쟁자에 대해, iTunes Search API를 호출해 풀 메타데이터 스냅샷:

  • 앱 이름 — 앱스토어 표시 이름.
  • 부제 — 이름 아래 짧은 텍스트. 검색에서 가중치가 큽니다.
  • 설명 — 전체 설명 텍스트. 검색 가중치는 적지만 여전히 관련.
  • 평점 — 현재 평균 평점과 총 평점 수.
  • 가격 — 무료, 유료, 구독.
  • 버전 — 현재 버전 번호와 릴리스 날짜.
  • 스크린샷·아이콘 URL — 시각적 리브랜드 변경 감지용.

각 스냅샷은 타임스탬프와 함께 CompetitorSnapshot 테이블에 저장. 모든 스냅샷 보관 — 덮어쓰기 없음. 즉, 경쟁자의 메타데이터가 어느 날에 어떤 모습이었는지 정확히 거슬러 볼 수 있습니다.

iTunes Search API는 무료고 인증 불필요. 다만 레이트 리밋이 있어서, 요청 사이에 약간의 지연을 두고 배치. 경쟁자 3~10개 추적하는 사용자 대부분의 경우 전체 동기화가 1분 안에 완료.

스테이지 2: diff 엔진

오늘 스냅샷 수집 후, 다음 단계는 같은 경쟁자에 대해 어제 스냅샷과 비교. 필드별 비교:

텍스트 필드(이름, 부제, 설명)는 정확한 문자열 비교. 글자 하나 — 쉼표 추가, 단어 대소문자 다름 — 도 플래그. 숫자 필드(평점, 평점 수, 가격)는 값 직접 비교.

차이가 감지되면 MetaChange 레코드를 만듭니다:

  • 경쟁자 앱 ID와 이름.
  • 어떤 필드가 바뀌었는지 (예: "subtitle").
  • 옛 값과 새 값.
  • 감지 타임스탬프.

"변경 중요도" 점수도 계산. 부제 변경이 설명 변경보다 더 중요 — 부제가 앱스토어 검색에서 가중치가 더 크니까. 이름 변경이 가장 중요 — 앱이 포지셔닝을 완전히 피벗하는 게 아니면 이름은 잘 안 바뀝니다.

스테이지 3: 본인 랭킹과 교차 진단

여기가 흥미로워지는 지점. 경쟁자가 부제 바꾼 걸 감지하는 건 유용. 경쟁자가 부제 바꿨고 그리고 본인 키워드 랭킹이 동시에 떨어진 걸 감지하는 건 행동 가능.

교차 진단 시스템은 경쟁자 diff와 키워드 랭킹 수집이 모두 끝난 후 실행. 상관관계를 찾습니다:

  1. 최근 랭킹 하락 조회. 최근 3일간 5위 이상 떨어진 키워드.
  2. 최근 경쟁자 변경 조회. 같은 3일 윈도우에서 감지된 메타데이터 변경.
  3. 키워드 오버랩 체크. 경쟁자의 새 부제가 본인 떨어진 키워드와 매칭되는 단어 포함이면, 그게 상관관계.
  4. RANK_DROP_DIAGNOSIS 인사이트 생성. AI가 랭킹 데이터와 경쟁자 변경 데이터를 함께 받아 설명 생성.

결과 인사이트가 이렇게 읽힐 수 있습니다: "'expense tracker'에서 본인 랭킹이 최근 3일간 #8에서 #14로 떨어졌습니다. 같은 기간에 Competitor X가 부제에 'expense tracker'를 포함하도록 변경. 이 단어에 대한 경쟁이 증가했을 가능성."

이 인사이트는 Correlation 신뢰도 배지를 받습니다 — Fact가 아닙니다. 인과를 증명할 수 없습니다. 앱스토어 랭킹은 많은 요소에 의존: 다운로드 속도, 리뷰 정서, 애플 알고리즘 업데이트 등. 하지만 시간적 상관관계는 충분히 강해서 조사할 가치가 있습니다.

스테이지 4: 알림

마지막 스테이지가 결과를 본인에게 전달. Apsity는 두 채널로 알림 전송:

인앱 알림. Apsity 열면 Overview 탭이 인사이트 카드를 보여주고, 랭크 하락 진단이 상단에 노출. 각 카드에 영향 받은 키워드, 랭킹 변경, 그것을 일으켰을 가능성이 있는 경쟁자 액션 표시.

이메일 알림. 다음 날 KST 08:00에 이메일 요약 발송. 경쟁자 메타데이터 변경, 주요 랭킹 하락, 그리고 교차 진단 발견 포함. 이메일 모양:

Competitor Alert — 2026년 4월 7일

BudgetPal이 부제를 변경:

옛: "Simple Budget Tracker"

새: "AI Budget Planner & Expense Tracker"

본인 랭킹 영향:

"expense tracker": #8 → #14 (▼6 위치, 최근 3일)

"budget planner": #22 → #31 (▼9 위치, 최근 3일)

이메일이 행동할지 결정할 수 있는 충분한 맥락 제공. 신경 쓰는 키워드의 하락이라면, AI 키워드 옵티마이저를 다시 돌려서 경쟁 변화를 반영한 새 100자 세트 생성. 우선순위 낮은 단어의 하락이라면 무시.

밤사이 감지가 중요한 이유

앱스토어 키워드 랭킹은 메타데이터 변경에 빠르게 반응. 경쟁자가 인기 단어를 부제에 추가하면, 애플 알고리즘이 24~48시간 안에 그 단어로 랭크하기 시작할 수 있습니다. 일주일 기다려서 알아채면, 그들이 이미 그 키워드의 다운로드 모멘텀을 축적했습니다.

밤사이 감지는 본인이 ~24시간 이상 뒤지지 않게 한다는 뜻. 경쟁자가 화요일 동안 메타데이터 변경. cron job이 수요일 새벽에 감지. 수요일 아침 8시에 이메일. 수요일 오후에 본인 키워드 업데이트. 총 반응 시간: 하루 미만.

"2주 뒤 우연히 알아챔" 접근법과 비교하면, 큰 차이입니다 — 특히 여러 앱이 적극적으로 ASO 최적화하는 경쟁 카테고리에서.

기술 디테일: cron 시퀀스

Apsity는 매일 7개 cron job을 실행. 경쟁자 관련 잡들은 데이터 의존성을 보장하기 위해 순차 체인의 일부:

  1. 03:00 KST — 매출 동기화 (App Store Connect API).
  2. 03:15 KST — 키워드 랭킹 수집 (iTunes Search API).
  3. 04:00 KST — 경쟁자 스냅샷 수집 (iTunes Search API).
  4. 04:30 KST — AI 인사이트 생성, 교차 진단 포함 (Claude Sonnet).
  5. 08:00 KST — 이메일 알림 발송.

각 잡은 Vercel의 after() 패턴 사용: cron 엔드포인트가 즉시 200 응답하고, 백그라운드에서 작업 처리. Vercel 함수 타임아웃 회피용. 한 스테이지가 실패해도 에러 로깅 후 다음 스테이지는 계속 실행 — 부분 데이터가 데이터 없는 것보다 낫습니다.

AI 인사이트 스테이지가 가장 자원 집약적. 구조화된 데이터를 — 랭킹 히스토리, 경쟁자 diff, 키워드 난이도 점수 — Claude Sonnet에 보내고, 포맷된 인사이트 객체 받음. 각 인사이트에는 타입 태그 (RANK_DROP_DIAGNOSISCOMPETITOR_META_CHANGE 같은), 신뢰도 레벨, 사람이 읽을 수 있는 설명이 포함됩니다.

처리하는 엣지 케이스

신뢰할 수 있는 변경 감지를 만들려면 지저분한 현실 시나리오 처리:

  • iTunes API 일시 에러. 가끔 API가 불완전한 데이터 반환하거나 타임아웃. 5초 지연 후 1회 재시도. 또 실패하면 그 경쟁자는 그 날 스킵하고 갭 노트. 거짓 "다 바뀜" 알림 없음.
  • 로컬라이즈된 메타데이터. 경쟁자 앱이 로케일별로 다른 이름·부제 가질 수 있음. 본인 주 시장과 매칭되는 로케일로 스냅샷. "US"에서 키워드 추적하면 US 스토어 버전 스냅샷.
  • 평점 수 변동. 애플이 가끔 평점 수를 약간 수정 (스팸 리뷰 제거 등). 작은 변동(2% 미만)은 노이즈 회피용으로 필터.
  • 새 경쟁자 추가. 새 경쟁자 추가 시 비교할 이전 스냅샷이 없음. 첫 스냅샷이 베이스라인 — 둘째 날까지는 변경 보고 안 됨.
  • 경쟁자 앱이 스토어에서 제거. iTunes API가 추적 중인 경쟁자에 대해 404 반환하면, "Delisted"로 플래그하고 1회 알림 발송. 경쟁자는 다시 돌아올 수 있어 목록에 유지.

이게 안 하는 것

한계에 대한 투명성. 시스템은 무엇이 바뀌었는지 감지하고, 본인 랭킹이 언제 움직였는지와 상관 분석. 인과는 증명할 수 없습니다. 앱스토어 랭킹은 수십 가지 요소에 영향 받습니다 — 다운로드 속도, 사용자 참여, 애플 알고리즘 업데이트, 계절 트렌드 등. 경쟁자가 본인 랭킹 떨어진 같은 날 부제 바꾼 게 의심스럽지만, 우연일 수도 있습니다.

그래서 모든 교차 진단 인사이트가 Fact가 아닌 Correlation 배지를 받습니다. 증거를 보여주고 행동할지는 본인이 결정. 가치는 확실성이 아니라 — 인지(awareness)에 있습니다. 경쟁자가 움직였고 본인 랭킹이 흔들렸다는 걸 아는 게, 전혀 모르는 것보다 무한히 낫습니다.

밤사이 루프

전체 시스템이 닫힌 루프 형성: 경쟁자가 메타데이터 변경 → cron이 감지 → diff 엔진이 기록 → 교차 진단이 본인 랭킹과 연결 → AI가 설명 생성 → 본인이 이메일 받음. 6개 스테이지, 완전 자동, 본인이 자는 동안 매일 밤 동작.

Cron이 감시 담당. AI가 분석 담당. 본인은 결정 담당. 그게 우리가 설계한 분업입니다. 인디 개발자가 매일 경쟁자 앱스토어 페이지를 수동 체크해선 안 됩니다. 그게 정확히 자동화가 만들어진 지루하고 반복적인 작업의 종류.

Try Apsity for free

Track rankings, revenue, and competitors. Set up in 2 minutes.

Get Started Free