결제 및 구독
구독 등급, 업그레이드 처리 방식, 그리고 체험 기간이 끝나면 벌어지는 일입니다.
요금제와 접근 등급
Athenum은 네 가지 멤버십 단계를 판매합니다. Free, Lite, Pro, Pro+입니다. 내부적으로는 네 가지 접근 등급인 preview, single_domain, multi_domain, full_access에 대응하며, 어떤 기능이 열려 있는지 판단할 때 제품이 확인하는 것은 바로 이 등급입니다. 유료 계열은 각각 월간과 연간 두 가지 청구 주기로 판매됩니다. 등급은 저장 가능한 레이아웃 수, 실시간 데이터와 지연 데이터, 알림, 데이터 내보내기, 시계열 조회가 얼마나 과거까지 닿을 수 있는지 같은 구체적인 한도를 정합니다. 현재 가격은 여기서 반복하지 않고 가격 안내 영역에 게시되어 있습니다.
등급이 실제로 열어주는 것
접근 권한은 스위치 하나가 아닙니다. 요금제 카탈로그는 등급마다 이름이 붙은 기능 묶음을 정해 두고, 제품의 나머지 부분은 요금제 이름이 아니라 그 묶음을 읽습니다. 켜고 끄는 방식의 기능은 다음과 같습니다. API 키 생성, 실시간 데이터 접근, 고급 지표 사용, 고래 알림 수신, 매크로 알림 수신, 우선 지원, 상업용 API 접근, 데이터 내보내기, 그리고 Pro 예측 시장 신호 계열 접근입니다. 그 옆에는 단계별 한도가 있습니다. 저장 레이아웃 할당량, API 키 할당량, 기능당 거래소 수 상한, 시계열 조회가 닿을 수 있는 과거 범위 상한, Argus 지표 단계, 요청 가능한 차트 타임프레임 집합, 요청 가능한 종목 집합입니다.
Free 등급인 preview는 켜고 끄는 기능이 모두 꺼져 있고, 저장 레이아웃 1개, API 키 없음, 종목 1개, 그리고 1h, 4h, 1d 타임프레임만 제공합니다. Lite에 해당하는 single_domain은 실시간 데이터, 고래 알림, API 키 생성을 켜고, 모든 타임프레임과 전체 종목 목록을 열며, 첫 번째 Argus 단계를 해제합니다. Pro에 해당하는 multi_domain은 고급 지표, 매크로 알림, Pro 예측 시장 신호, 상한 없는 거래소 목록, 그리고 긴 조회 기간을 더합니다. Pro+에 해당하는 full_access는 우선 지원, 상업용 API, 데이터 내보내기, 마지막 Argus 단계를 더합니다. 유료 계열은 각각 월간과 연간으로 판매되며, 청구 주기는 가격과 갱신일을 바꿀 뿐 기능 묶음은 바꾸지 않습니다.
단계별 한도는 인터페이스에서만이 아니라 데이터를 가져오는 지점에서 적용됩니다. 등급 허용치보다 긴 조회 요청은 거부되는 대신 그 허용치로 잘립니다. 거래소 목록은 고정된 우선순위로 정렬된 뒤 등급의 거래소 상한까지만 남으므로, 낮은 등급도 임의의 일부가 아니라 순위가 가장 높은 거래소들을 보게 됩니다. 등급이 허용하지 않는 타임프레임이나 종목을 요청하면 결제 필요 응답으로 거부됩니다. 도메인 선택에는 자체 할당량이 있습니다. Lite는 1개, Pro는 3개이며 그중 고급 그룹에서는 최대 1개, Pro+는 5개 전부이고 이는 자동으로 선택됩니다.
요금제 카탈로그와 가격 안내 문구가 어긋나는 지점
요금제를 설명하는 목록은 두 가지입니다. 하나는 서버가 실제로 적용하는 기능 카탈로그이고, 다른 하나는 가격 페이지에 표시되는 기능 목록입니다. 둘은 서로에게서 생성되지 않으며, 여러 곳에서 어긋납니다. 예를 들어 가격 목록은 Lite에 우선 지원이 포함된다고 적고 있지만, 기능 카탈로그에서 우선 지원은 Lite에서 꺼져 있고 Pro+에서만 켜져 있습니다. 가격 목록은 Lite에 모든 거래소가 포함된다고 적고 있지만, 카탈로그는 Lite의 기능당 거래소 수를 적은 값으로 제한하고 Pro 이상에서만 그 상한을 풉니다. 가격 목록은 Lite에 전체 과거 데이터가 포함된다고 적고 있지만, 카탈로그는 Lite에 짧은 조회 기간을 주고 긴 기간은 Pro와 Pro+에만 남겨 둡니다.
또 다른 항목은 아예 대응하는 것이 없습니다. 가격 목록은 등급별 알림 허용 개수를 제시하지만, 기능 카탈로그는 알림을 고래 알림과 매크로 알림이라는 두 개의 켜고 끄는 기능으로만 모델링하며, 적용 경로 어디에도 등급별 알림 개수는 없습니다. 두 목록이 다를 때 제품이 실제로 확인하는 것은 기능 카탈로그입니다. 서로 모순은 아니지만 헷갈리기 쉬운 한 쌍도 있습니다. 자기 계정용 API 키 생성은 Lite부터 가능하지만, 상업용 프로그래밍 API와 웹훅은 Pro+만 가지는 별개의 기능입니다.
결제 수단
두 가지 결제 경로가 구현되어 있습니다. 카드 결제는 Stripe를 통해 처리되며 Stripe가 호스팅하는 결제 페이지로 이동합니다. 크립토 결제는 Plisio를 통해 처리되며 호스팅되는 크립토 청구서를 발행합니다. 시작하기 전에 지원 자산을 골라야 하며, Bitcoin, Ethereum, Solana, BNB Chain, Zcash, Tron의 USDT, Solana의 USDT, Solana의 USDC 중에서 선택할 수 있습니다. 두 경로 모두 완전히 같은 멤버십을 구매합니다. 결제를 시작하려면 인증된 청구 이메일이 필요하므로, 지갑만 연결한 계정은 먼저 주소를 추가하고 확인해야 합니다.
업그레이드가 진행되는 방식
업그레이드는 Upgrade 페이지에서 시작하며, 요금제를 지정한 딥링크로 바로 들어올 수도 있습니다. 요금제 계열과 청구 주기를 고른 다음 카드 또는 크립토를 선택합니다. 앱이 결제 세션을 만들고 결제사가 호스팅하는 결제 페이지로 이동시키며, 결제가 끝나면 URL에 결제 상태를 담은 채 앱으로 돌아옵니다. 크립토 결제는 입금 주소, QR 코드, 금액, 만료 카운트다운, 실시간 승인 횟수를 보여주는 전용 청구서 페이지로 이어지며, 승인 수가 쌓이면 멤버십이 자동으로 활성화됩니다. 이미 활성 구독이 있다면 결제는 거부되고, 카드 경로에서는 대신 Stripe 결제 포털이 열려 그곳에서 요금제를 바꿀 수 있습니다.
크립토 청구서의 내부
크립토를 고르면 결제 처리사에 청구서가 만들어지고, 처리사의 사이트로 보내는 대신 Athenum이 호스팅하는 페이지에 계속 머무르게 됩니다. 청구서는 60분 창으로 열리며, 페이지는 그 마감까지의 카운트다운과 함께 입금 주소, QR 코드, 견적된 크립토 금액, 달러 환산액, 승인 횟수를 보여줍니다. 청구서를 만들려면 먼저 지원 자산을 골라야 하며, 고르지 않으면 요청이 거부됩니다. 처리사가 몇 번의 승인을 요구하는지 알려주지 않은 경우, 카운터는 아무것도 표시하지 않는 대신 2로 대체해 보여줍니다.
이 페이지는 스스로 주기적으로 조회하지 않습니다. 카운트다운은 로컬에서 흘러가지만, 결제 상태는 상태 버튼을 누르거나 페이지를 새로 고칠 때만 갱신됩니다. 활성화 자체는 처리사가 콜백을 보낼 때 서버에서 일어납니다. 상태 엔드포인트는 청구서가 최종 상태에 도달한 뒤에는 저장된 기록으로 답하고, 그 전에는 처리사에 실시간으로 조회합니다. 처리사에 닿을 수 없으면, 엔드포인트는 잘못된 상태를 알리는 대신 마지막으로 알려진 snapshot을 담은 서비스 불가 응답을 반환하며 잠시 후 다시 시도해 달라고 안내합니다.
금액 검증은 페이지가 아니라 콜백에서 이루어집니다. 완료 콜백이 청구 금액과 다른 달러 금액을 보고하거나, 검증 가능한 달러 금액을 전혀 보고하지 않으면, 금액 불일치 사유가 담긴 결제 실패로 변환되고 멤버십은 활성화되지 않습니다. 처리사 자체의 불일치 상태도 같은 방식으로 처리됩니다. 만료된 청구서는 만료 사유가 담긴 결제 실패가 되고, 취소된 청구서는 취소 사유가 담긴 결제 실패가 됩니다. 만료된 청구서는 다시 결제할 수 없으며, 페이지가 새 결제를 시작하라고 안내합니다.
무료 체험
체험은 7일 동안 이어지고 계정당 한 번만 시작할 수 있으며, 그 기간에는 full_access 등급을 부여합니다. 카드가 등록된 구독이 아니므로 자동 갱신도, 청구도 없습니다. 체험이 진행되는 동안 Settings의 멤버십 카드는 남은 일수와 종료일, 그리고 “결제 수단 추가” 동작을 보여줍니다. 7일이 지나면 계정은 체험에 포함되었던 내용을 정리해 보여주는 종료 페이지로 이동하며 두 가지 길을 제시합니다. Upgrade 흐름으로 Pro+를 다시 시작하거나, 도메인 선택 마법사를 통해 Free 등급으로 계속 이용하는 것입니다. 어느 쪽이든 계정과 레이아웃, 관심목록은 그대로 유지됩니다.
체험 대상과 체험에서 빠지는 것
체험은 가격 페이지에서 구매하는 것이 아닙니다. 계정 온보딩 도중에 부여되며, 세 가지 조건이 모두 충족되어야 합니다. 첫째, 시스템이 만들기 어렵다고 보는 신원이어야 합니다. 주소가 인증된 이메일 가입이거나, 주소가 인증된 Google 계정이어야 합니다. 지갑만으로 가입한 경우는 명시적으로 대상이 아닙니다. 둘째, 체험 가입에 대한 운영용 kill switch(차단 스위치)가 꺼져 있어야 합니다. 켜져 있으면 온보딩은 정상적으로 끝나되 체험만 부여되지 않습니다. 셋째, 계정이 이전에 체험을 쓴 적이 한 번도 없어야 합니다. 평생 한 번 표시가 체험 구독을 만드는 것과 같은 트랜잭션 안에서 기록되므로, 동시에 두 번 시도해도 둘 다 성공할 수는 없습니다.
체험은 7일 동안 full_access 등급을 부여하되 의도적인 예외가 하나 있습니다. 체험 중에는 API 키를 만들 수 없습니다. 키 엔드포인트는 부여된 등급과 구독의 요금제 코드를 모두 확인하고, 체험에 대해서는 일반적인 업그레이드 안내 대신 체험 전용 메시지로 답합니다. 마감일을 기준으로 알림 메일 두 통이 예약되는데, 3일 남았을 때와 1일 남았을 때입니다. 각각은 메시지를 보내기 전에 기록되는 자체 표시로 보호되므로, 재시도 과정에서 알림이 누락될 수는 있어도 두 번 발송되는 일은 없습니다.
결제와 구독이 가질 수 있는 상태
시스템이 기록하는 모든 결제는 다섯 가지 상태 중 정확히 하나를 가집니다. pending, succeeded, failed, refunded, partially refunded입니다. 결제는 결제사와 결제사 자체의 결제 참조 번호를 키로 저장되며, 같은 참조에 대한 콜백이 반복되면 두 번째 기록을 넣는 대신 기존 기록을 갱신합니다. 그래서 웹훅이 재시도되어도 내역에 청구가 중복되지 않습니다. 실패한 결제에는 실패 코드와 메시지도 저장되며, 크립토 경로에서는 앞서 설명한 금액 불일치, 만료, 취소, 처리 오류 사유가 여기에 해당합니다.
구독은 더 많은 상태를 가집니다. incomplete, incomplete_expired, trialing, active, past_due, canceled, unpaid, paused, expired입니다. 이 중 접근 권한을 부여하는 것은 active, trialing, past_due 셋뿐이며, 상태 간 이동은 명시적인 전이 표로 제한되므로 잘못된 도약은 기록을 조용히 망가뜨리는 대신 오류를 냅니다. 접근 권한은 상태만으로 결정되지 않습니다. past_due 구독은 유예 기한이 지나면 접근 권한 부여를 멈추고, 어떤 구독이든 만료 시각이 지나면 저장된 상태가 무엇이라고 적혀 있든 접근 권한 부여를 멈춥니다.
크립토 청구서는 이 둘과 별도로 추적되며 자체적인 여덟 가지 상태를 가집니다. new, pending, confirming, completed, expired, cancelled, mismatch, error입니다. 이 중 네 가지, 즉 completed, expired, cancelled, error는 최종 상태이며, 청구서가 그중 하나에 도달하면 앱은 처리사에 다시 묻지 않고 자체 기록으로 답합니다. mismatch는 의도적으로 최종이 아닙니다. 이 상태의 청구서는 처리사가 새로운 소식을 전하면 pending, confirming, completed, cancelled로 계속 이동할 수 있습니다.
결제가 실패했을 때
결제 실패 웹훅은 구독을 past_due로 옮기고 실패 시점으로부터 7일 뒤의 유예 기한을 찍습니다. 그 기간에는 접근이 계속됩니다. past_due가 접근 권한을 부여하는 세 상태 중 하나이고, 접근을 끝내는 것은 상태가 아니라 유예 기한이기 때문입니다. 그 웹훅이 도착하기 전에 카드 결제사가 무엇을 하는지, 즉 거절된 청구를 몇 번이나 어떤 기간에 걸쳐 재시도하는지는 결제사에서 설정되며 이 애플리케이션이 정하지 않습니다.
크립토 멤버십은 자동으로 청구되지 않으므로, 갱신은 예약 작업으로 돌아갑니다. 기간이 끝나기 7일 전, 그리고 다시 3일 전과 1일 전에, 열려 있는 갱신 청구서를 만들거나 재사용해 메일로 보냅니다. 아직 유효 기간 안에 있거나 이미 승인 대기 중인 청구서는 교체하지 않고 재사용합니다. 결제되지 않은 채 기간이 끝나면 구독은 기간 종료 7일 뒤의 유예 기한과 함께 past_due로 표시되고 연체 안내가 발송됩니다. 그 기한이 결제 없이 지나면 구독은 해지되고 만료 안내가 발송됩니다. 기간이 아직 진행 중일 때 실패한 갱신 청구서는 past_due를 유발하지 않습니다.
알아둘 만한 부수 효과가 두 가지 있습니다. 기존 조건이 유지되던 프로모션 혜택은 구독이 그 혜택에서 벗어나거나 해지되거나 만료될 때 소멸로 표시되며, 이후 같은 혜택을 요구하는 결제는 거부됩니다. 그리고 구독이 더 이상 접근 권한을 부여하지 않는 상태로 전이될 때마다, 해당 계정의 캐시된 세션 권한 정보는 스스로 만료되기를 기다리지 않고 즉시 비워집니다. 그래서 변경 사항이 캐시 수명이 지난 뒤가 아니라 바로 다음 요청부터 적용됩니다.
기존 멤버십 관리하기
Settings의 멤버십 카드가 조작 화면입니다. 카드 구독자에게는 Stripe 결제 포털을 여는 “멤버십 관리”와 저장된 결제 수단을 다루는 별도 동작이 제공됩니다. 해지는 “기간 종료 시 종료”로 제공됩니다. 즉시가 아니라 현재 청구 기간이 끝날 때 멈추도록 표시되며, 이미 종료가 예약된 구독에는 대신 “멤버십 재활성화”가 표시됩니다. 등급을 낮추는 요금제 변경이나 연간에서 월간으로 바꾸는 변경은 즉시 적용되지 않고 기간 종료 시점으로 예약됩니다. 청구서는 첫 청구 주기가 끝나면 날짜, 상태, 금액, 영수증 링크와 함께 목록에 표시됩니다. 크립토 청구서가 아직 대기 중이라면 카드에 “크립토 결제 이어서 하기”가 표시됩니다.
청구서와 영수증
Settings의 청구서 목록은 두 출처를 합칩니다. 카드 청구서는 Stripe에서 가장 최근 24건을 읽어오며, 각각 청구서 번호, 상태, 통화, 총액, 결제된 금액, 호스팅 청구서 페이지 링크, PDF 링크를 담습니다. 크립토 청구서는 Athenum 자체 기록에서 오며, 처리사의 거래 참조 번호를 식별자로 하여 주문 번호, 청구서 상태, 달러 총액, 그리고 목적(신규 구독, 갱신, 요금제 변경)과 요금제를 함께 적은 설명이 표시됩니다. 두 집합은 합쳐진 뒤 최신순으로 정렬됩니다.
여기서 실질적인 차이가 두 가지 생깁니다. 크립토 청구서에는 PDF가 없습니다. 링크는 앱 안의 청구서 페이지로 돌아가며, 결제되지 않은 청구서를 이어서 진행하는 방법도 이 경로입니다. 그리고 Stripe 고객 기록이 없는 계정도 크립토 청구서는 받아볼 수 있습니다. Stripe 고객이 없는 상황은 오류가 아니라 빈 결과로 처리되기 때문입니다. 크립토 청구서에서 결제된 금액은 청구서가 completed 상태에 도달했을 때만 총액 전체로 보고되고 그전에는 0으로 보고되므로, 일부만 확인된 송금이 목록에서 결제 완료처럼 보이는 일은 없습니다.
등급이 바뀌면 내 데이터는 어떻게 되는가
등급 변경은 조용한 필드 수정이 아니라 하나의 이벤트로 처리됩니다. 등급이 오르거나 내려가면 현재의 도메인 선택이 만료되고 도메인 선택 화면을 다시 거치게 됩니다. 할당량과 고를 수 있는 도메인 집합이 모두 달라졌기 때문이며, 등급 하향의 경우 그 사유가 명시적으로 기록됩니다. full_access는 예외로, 다시 묻는 대신 모든 도메인을 자동으로 다시 선택합니다. 해지 역시 선택을 만료시킵니다. 캐시된 온보딩 판단은 이런 전이가 있을 때마다 지워지므로, 다음 요청에서 현재 상태를 기준으로 다시 계산됩니다.
저장된 레이아웃은 삭제되지 않습니다. 레이아웃 한도는 새로 저장할 때 확인되며, 한도를 넘는 생성 요청은 업그레이드 안내와 함께 거부됩니다. 반면 목록 엔드포인트는 저장해 둔 모든 것을 반환하고 새 상한을 넘는 것도 숨기지 않습니다. 요금제 변경은 카드 전용 경로입니다. 크립토 멤버십에서는 현재 기간이 끝난 뒤 새로 결제하라는 안내와 함께 요청이 거부됩니다. 또한 멤버십에 이미 종료가 예약되어 있으면 요금제 변경은 아예 거부되므로, 멤버십을 바꾸려면 먼저 그 예약을 되돌려야 합니다.
약관
위에서 설명하지 않은 내용을 포함한 계약상의 조건은 서비스 약관과 개인정보 처리방침에 정리되어 있습니다. 특정 청구 건에 대한 문의는 앱 안에서 Support에 연락해 주세요.