올리브영 모니터링 시스템

올리브영에서는 순위가 곧 매출이다

나는 제조업 기반 뷰티 회사 브랜드사업부에서 일한다.

올리브영은 국내 뷰티 유통의 기준점이다. K-뷰티 브랜드는 여기서 자기 위치를 처음 확인하고 소비자는 "요즘 뭐가 좋아?"를 여기서 검색한다. 검색 순위가 그냥 숫자로 끝나지 않는 이유다. 순위가 오르면 노출이 늘고, 노출이 늘면 오가닉 매출이 붙는다.

그러니 올리브영에서는 순위 싸움이 치열하다.

브랜드들은 챌린저스, 스토어링크 같은 체험단 서비스를 상시로 돌려 순위를 지킨다. 체험단으로 구매를 일으켜 검색 순위를 올리고, 거기서 생긴 노출로 오가닉 매출을 잡는 식이다. "오늘의 특가" 같은 하루짜리 프로모션 날엔 더 노골적이다. 특정 시간대에 체험단 구매를 몰아 카테고리 1위를 차지하고, 그 순간을 캡처해 마케팅 소재로 쓴다. "올리브영 여드름 패치 1위" 같은 문구를 한 번쯤 봤을 거다.

여기서 버티려면 경쟁사가 뭘 하는지부터 알아야 한다.

알고 싶은 건 경쟁사의 행동이다

"우리 제품 순위가 몇 위야?"보다 더 궁금한 게 따로 있다.

경쟁사 A가 이번 주에 체험단을 돌렸나? 오늘의 특가를 연 날 하루 종일 1위를 지켰나? 그 프로모션 뒤 2주 동안 리뷰는 몇 개 늘었나? 리뷰 이벤트 리워드는 어느 정도였나?

이걸 보려면 매일 데이터가 쌓여야 한다. 경쟁사 순위 변동, 리뷰 증가량, 프로모션 시작일과 종료일, 새로 들어온 제품을 하루 단위로 모으면 경쟁사가 움직이는 패턴이 보인다.

매출은 알 수 없다. 그건 그 회사 영업비밀이다. 근데 리뷰 증가량은 따라갈 수 있다. 프로모션 전후로 리뷰가 얼마나 늘었는지 보면 체험단 규모를 역산할 수 있고, 이게 쌓이면 "어떤 액션이 어느 정도 효과를 내는지" 윤곽이 잡힌다.

순위를 "확인"만 해서는 쓸 데가 없다.
목적은 경쟁사의 행동과 그 결과를 추적하는 거다.

근데 이걸 매일 팀원에게 시킬 수는 없다. 올리브영 사이트에서 6페이지를 넘기며 129개 제품을 하나하나 보고, 어제 데이터와 비교해 변화량을 계산하고, 엑셀에 정리한다. 매일 30분에서 1시간이 든다. 한 달이면 그 팀원 근무 시간의 10%가 이 일에 들어간다.

그래서 자동화했다.

올리브영 크롤링 자동화는 생각보다 단순하다

거창한 기술은 안 들어간다. Python, GitHub Actions, Google Sheets 세 개면 된다. 서버도 DB도 없고 인프라 비용은 0원이다.

파이프라인은 5단계다.

# 파이프라인 전체 흐름
def run(self):
    previous = sheets.get_previous_data()  # 1. 전일 데이터 조회
    products = crawler.crawl()              # 2. 올리브영 크롤링
    processed = processor.process(          # 3. 변화량 계산
        products, previous
    )
    sheets.save(processed)                  # 4. Sheets 저장
    teams.send(processed)                   # 5. Teams 리포트

크롤링부터 알림까지 매일 아침 알아서 돈다. 한 번 도는 데 1분 45초 걸린다.

단계별로는 이렇다.

1단계: 올리브영 크롤링

Selenium으로 headless Chrome을 띄워 올리브영 검색 페이지 6페이지를 돌며 데이터를 긁는다. 검색 페이지는 CSS 셀렉터로 깔끔하게 파싱된다.

# CSS 셀렉터 기반 데이터 추출
product_name = element.find_element(By.CSS_SELECTOR, ".prd_name").text
brand = element.find_element(By.CSS_SELECTOR, ".tx_brand").text
discount_price = element.find_element(By.CSS_SELECTOR, ".tx_cur .tx_num").text
reviews = element.find_element(By.CSS_SELECTOR, ".prd_review_cnt").text

제품명, 브랜드, 정가, 할인가, 할인율, 리뷰수, 평점, 프로모션, URL까지 제품 하나에 9개 필드를 뽑는다. 6페이지를 다 돌면 129개 제품이 모인다.

프로모션은 패턴 매칭으로 잡는다. "1+1", "2+1", "증정", "오늘드림", "세트할인", "쿠폰" 같은 키워드다. 올리브영은 프로모션을 텍스트로 표시하는데 형식이 제각각이라 키워드로 걸러야 한다. 경쟁사가 오늘의 특가를 시작했는지, 증정 이벤트를 열었는지가 여기서 드러난다.

2단계: 전일 대비 변화 계산

크롤링만 하면 오늘 하루 스냅샷으로 끝난다. 쓸모는 전일 데이터와 비교할 때 생긴다.

Google Sheets에 쌓인 전일 데이터를 불러와 제품명+브랜드 조합으로 맞춘 뒤 변화량을 계산한다.

# 전일 대비 변화량 계산
key = f"{brand}::{name}"
if key in previous_lookup:
    prev = previous_lookup[key]
    rank_change = prev.rank - today.rank      # 양수 = 순위 상승
    review_increase = today.reviews - prev.reviews
    review_growth = (review_increase / prev.reviews) * 100
    price_change = today.discount_price - prev.discount_price
else:
    is_new = True  # 신규 진입 제품

비교 데이터가 있으니 이런 문장을 쓸 수 있다. "경쟁사 A가 어제 오늘의 특가를 진행했고, 당일 1위를 점유했다. 그 이후 2주간 리뷰가 +73개 늘었다."

3단계: Google Sheets 저장

저장소는 Google Sheets로 정했다. 이유는 두 가지다.

하나, 서버가 없어도 된다. SQLite를 쓰면 파일을 어딘가에 호스팅해야 하고 서버 비용이 붙는다. Google Sheets는 Google이 호스팅한다.

또 하나, 팀원이 직접 열어 본다. DB 쿼리는 개발자 일이지만 스프레드시트는 누구나 다룬다. 리포트 말고 원본 데이터를 파고 싶을 때 링크 하나면 된다.

Google Sheets 데이터

시트는 3개다.

일일_전체데이터: 129개 제품의 날짜, 순위, 브랜드, 가격, 리뷰수, 프로모션, URL이 들어간다. 카테고리를 한눈에 보는 원본이다.

스노우투플러스_상세: 자사 제품만 걸러 순위 변동, 리뷰 증가, 가격 변동을 담는다. 하루 성과를 한 번에 본다.

상위20개_트렌드: 상위 20개 제품의 변화를 따라간다. 누가 올라오는지, 어떤 프로모션이 먹히는지 여기서 본다. 경쟁 분석은 주로 이 시트로 한다.

90일이 지난 데이터는 자동으로 지운다. 분기 분석엔 그걸로 충분하고 시트도 무거워지지 않는다.

4단계: GitHub Actions로 매일 자동 실행

매일 아침 9시에 돌아야 한다. 서버를 띄우면 돈이 드니까 GitHub Actions를 썼다.

# .github/workflows/oliveyoung-monitor.yml
on:
  schedule:
    - cron: '0 0 * * *'  # UTC 00:00 = KST 09:00
  workflow_dispatch:       # 수동 실행도 가능

GitHub Actions 무료 티어는 월 2,000분이다. 이 워크플로는 한 번 도는 데 1분 45초라 매일 돌려도 월 53분이다. 무료 한도의 2.6%다.

GitHub Actions 워크플로

76회 연속 성공했다. 12월 말부터 매일 돌았다. 크롤링이 실패하면 5초 뒤 다시 시도하고 최대 3번까지 해 본다. 3번 다 실패하면 Teams로 에러 알림을 보내게 해 뒀는데, 그 알림은 아직 한 번도 안 왔다.

SIGNAL에서는 쿠팡 광고센터 크롤링이 매일 새벽에 죽어서 고생했다. 올리브영은 달랐다. 검색 페이지 구조가 안정적이라 headless Chrome으로 단순하게 긁어도 안 깨진다.

5단계: Power Automate로 Teams 알림

크롤링 결과는 Power Automate로 Teams에 보낸다. MS 365를 쓰는 회사면 이미 라이선스가 있어서 돈이 더 들지 않는다.

연결도 간단하다. Power Automate에서 "HTTP 요청을 받을 때" 트리거로 워크플로를 만들면 HTTP POST URL이 나온다. Python에서 이 URL로 메시지를 POST하면 Power Automate가 받아 Teams 채팅에 올린다. Webhook URL 하나로 끝난다.

# Teams 알림 발송
def send(self, processed_data):
    message = self._build_text_message(processed_data)
    requests.post(
        self.webhook_url,
        json={"text": message},
        headers={"Content-Type": "application/json"}
    )

매일 아침 Teams에 리포트가 온다

아침에 Teams를 열면 이게 와 있다.

Teams 일일 리포트

핵심 지표: 자사 제품의 오늘 순위, 전일 대비 변동, 리뷰 증가. 이것만 봐도 오늘 상황을 안다.

라인별 현황: 제품 라인별 순위와 리뷰 변동. 어느 라인이 밀리는지 바로 보인다.

TOP 10: 카테고리 상위 10개 제품의 상세 현황. 신규 진입, 당일배송, 증정 프로모션 여부를 아이콘으로 표시한다. 경쟁사가 오늘 뭘 시작했는지 여기서 다 보인다.

인사이트: 데이터에서 뽑은 코멘트가 자동으로 붙는다. "TOP10 중 10개 오늘드림 배송, 배송 경쟁력 확보 검토"처럼 바로 실행할 수 있는 제안이다.

전에는 브랜드 매니저가 30분 들여 직접 확인하던 정보다. 이제는 Teams를 열면 끝난다.

근데 진짜 쓸모는 이 데이터가 90일 치 쌓였을 때 나온다. 경쟁사 A가 분기에 오늘의 특가를 몇 번 여는지, 체험단을 돌린 뒤 리뷰가 평균 얼마나 느는지, 리뷰 이벤트 리워드를 어느 수준으로 걸어야 먹히는지가 보인다.


결과

129일일 모니터링 제품
76일연속 운영
1m 45s실행 시간
₩0인프라 비용

자동화한 것들

  • 경쟁사 추적: 129개 제품을 매일 자동으로 모으고 전일과 비교한다
  • 프로모션 감지: 1+1, 증정, 오늘드림, 세트할인, 쿠폰을 자동으로 잡는다
  • 리뷰 분석: 일별 리뷰 증가량과 성장률을 따라가고, 체험단 규모를 역산할 수 있다
  • 리포트 발송: 매일 오전 Teams로 리포트와 인사이트가 자동으로 온다
  • 데이터 보관: 90일 치를 자동으로 관리하고 Google Sheets에서 바로 열어 본다
  • 장애율: 0%, 76일 동안 한 번도 안 멈췄다

작은 프로젝트가 먼저 효과를 냈다

ONE STOCK이나 SIGNAL에 비하면 작은 프로젝트다. Python 파일 6개에 코드는 다 합쳐 800줄이다. React도 Express도 AI도 안 썼다. 제일 기본적인 도구만 썼다.

근데 현장에서 제일 먼저 효과를 본 게 이거다.

브랜드 매니저는 매일 아침 Teams 리포트부터 열고, 경쟁사 동향을 보고 그날 마케팅 대응을 정한다. 경쟁사가 체험단을 돌리기 시작하면 우리도 대응 시점을 잡는다. 오늘의 특가 뒤 리뷰가 느는 추이를 보고 다음 프로모션 설계에 반영한다. 수동으로 30분 걸리던 일이 없어진 것도 있지만, 전엔 아예 못 하던 "90일 치 경쟁 행동 패턴 분석"을 하게 된 게 더 크다.

Python과 Selenium으로 크롤링하고, Google Sheets에 쌓고, GitHub Actions로 매일 돌리고, Power Automate로 Teams에 보낸다. 거창한 인프라 없이 이미 있는 도구를 엮었다. 비용은 0원이고 한 번 세팅하면 알아서 돈다.

쌓인 데이터를 AI에게 읽히는 단계로 넘어가면 정할 게 두 개 더 생긴다. AI에게 어디까지 보여줄지, 토큰 비용을 얼마나 쓸지다. 앞은 ERP를 AI에 붙이기 전에 정해야 하는 여섯 가지에, 뒤는 모델별 API 요금 비교에 적었다.

올리브영 경쟁사 모니터링이 필요하다면
이 정도 시스템은 누구나 만들 수 있다. 도구도 전부 무료다.

다음은 키워드를 늘리는 거다. 지금은 "여드름 패치" 하나만 보는데, "트러블 패치", "스팟 패치" 같은 관련 키워드를 더하면 카테고리 전체 시장이 보인다. 이걸 SIGNAL에 붙이면 올리브영 경쟁 현황까지 한곳에서 본다.