기존 콘텐츠는 앱 밖의 웹페이지에서 참여했습니다. 앱 안에서도 참여하도록 확장하면서 제가 지켜야 할 조건은 실제로 열린 환경과 콘텐츠 URL이 말하는 환경을 일치시키는 것이었습니다. 앱 안에서 열기를 시도하다 실패해 외부 웹으로 갔는데 URL에는 여전히 인앱 참여라고 적혀 있으면, 후속 요청은 잘못된 문맥을 읽을 수 있었습니다.

저는 진입·복귀·완료 화면을 맡고 서버·디자인·매체 앱 담당자와 링크 계약을 맞췄습니다. 공급사 연동 계층은 동료가 맡았습니다. 범위는 핵심 참여와 외부 폴백까지로 좁히고 교차 추천은 후속 작업으로 남겼습니다.

추적 링크와 사용자가 도착할 URL은 같지 않았다

상단 카드와 오퍼월 등 진입점마다 방문을 기록하는 추적 링크를 만드는 방식이 달랐습니다. 사용자가 도착할 콘텐츠 주소와 이를 감싼 추적 링크를 구별하지 않으면, 앱 안에서 참여한다는 정보를 잘못된 주소에 붙일 수 있었습니다.

서버가 최종 콘텐츠 주소에 인앱 표식을 붙인 뒤 추적 링크로 감싸는 계약을 사용했습니다. 프론트엔드에서는 받은 추적 링크를 임의로 수정하지 않고 목적지가 읽어야 할 표식과 실제 열기 방식이 맞는지 확인했습니다.

실제 콘텐츠 URL에 인앱 참여 여부 연결
  → 추적 URL로 감싸기
  → 사용자 진입
  → 콘텐츠가 인앱 참여 여부를 읽고 참여

이 표식은 어떤 방식으로 열지를 고르는 정보입니다. 앱 실행이나 시청을 증명하는 값은 아닙니다.

폴백에서는 실패한 실행의 문맥도 바꿨다

앱 인터페이스 호출에 실패하면 외부 브라우저를 열고, 내부 콘텐츠 URL의 인앱 표식만 제거했습니다. 실행 경로가 바뀌는 순간 후속 요청이 읽을 문맥도 함께 바꾼 것입니다.

같은 이름의 URL 파라미터라도 광고주 주소에 있는 값은 보존했습니다. 우리 콘텐츠의 실행 정보를 고치려다 외부 목적지의 의미까지 바꿀 권한은 없기 때문입니다. 사용자가 앱에서 돌아오는 신호는 열기 전에 기다리기 시작하고, 열기에 실패하면 그 감시를 정리했습니다.

완료 화면은 지급 판정과 분리했다

출시 후 이전 참여의 완료 기록이 새 카드에 적용되지 않도록 보완했습니다. 같은 콘텐츠여도 광고 할당·참여 회차가 다르거나 현재 클릭 이전의 기록이면 이번 완료로 표시하지 않도록 했고, 회귀 테스트에 남겼습니다.

로컬 기록은 완료 화면을 맞추는 신호로만 썼습니다. 외부 경로의 전환 확인과 승인·지급은 서버 판정에 따릅니다. 화면의 빠른 완료 표시를 실제 지급 완료라고 해석하지 않도록 경계를 나눴습니다.

확인한 범위

2026년 8월 19일 공동 상용 출시 뒤 동료들이 정상 참여를 확인했습니다. 폴백 URL과 완료 표시의 조건은 코드 및 회귀 테스트로 확인했습니다. 파트너 앱·기기별 실패율 변화는 확인하지 못했습니다.

이 확장에서 제 판단의 중심은 새 화면을 띄우는 일보다 앱 열기가 실패한 뒤에도 다음 요청이 실제로 열린 환경을 읽게 하는 것이었습니다.