개발자 연동 문서

Affly 포스트백 연동 가이드

가입한 광고주가 자체 결제·주문 백엔드를 Affly에 연동하는 기술 문서입니다. 서버-투-서버 포스트백 한 줄이면 끝 — 쿠키에 의존하지 않아 사파리 ITP·애드블록·인앱 웹뷰에서도 동작합니다.

연동 개요

소비자 클릭부터 전환 리포트까지의 전체 흐름입니다.

STEP 1

추적링크 클릭

/r/<slug>

STEP 2

click_id 발급

랜딩 URL에 부착

STEP 3

고객 구매 완료

주문에 affly_ref 저장

STEP 4

포스트백 POST

/pb/<token>

STEP 5

리포트 반영

pending → cleared

이 문서는 자체 결제·주문 백엔드를 직접 연동하는 광고주용입니다. Partnerize·Awin·Impact 등 네트워크로 들어오는 전환은 Affly가 자동 수집하므로 이 작업이 필요 없어요.
STEP 01

도메인 인증

소유권을 확인하면 계정이 자동으로 활성화(pending → active)됩니다.

대시보드 INTEGRATION → 도메인 인증에서 토큰을 확인한 뒤 아래 두 방식 중 하나를 적용하세요. Affly가 DNS → 파일 순으로 확인해 먼저 성공하는 쪽으로 인증합니다.

방식 A — DNS TXT 레코드

호스트(Name):  _affly.yourstore.com
타입(Type):    TXT
값(Value):     affly-verify=<your-token>

DNS 반영에 보통 5~30분 걸립니다 (Cloudflare는 거의 즉시). 직접 DNS를 제어하는 도메인에 적합해요.

방식 B — .well-known 파일

URL:   https://yourstore.com/.well-known/affly-verify.txt
내용:   <your-token>      ← 다른 문자 없이 토큰만, 한 줄

HTTPS 200 응답에 본문이 토큰과 정확히 일치해야 합니다. 즉시 반영되어 DNS 접근이 없는 Shopify·Cafe24·Webflow에 적합해요.

인증되면 상태가 active로 자동 전환됩니다. 30분마다 백그라운드 재확인되니 버튼을 누르지 않아도 곧 라이브돼요. 인증 전에는 일부 기능(캠페인 노출 등)이 제한됩니다.
STEP 02

추적 파라미터 (subId)

랜딩 시 도착하는 추적 식별자(subId)를 주문에 저장해 두는 것이 핵심입니다.

퍼블리셔의 Affly 추적링크(linkaffly.com/r/<slug>)를 소비자가 클릭하면, 추적 식별자(subId)가 상품 URL에 파라미터로 붙어 광고주 사이트로 전달됩니다. 파라미터 이름은 오퍼 설정을 따르며 기본은 affly_ref입니다 (placeholder 없는 직접 머천트 URL은 aff_sub로 부착).

# 추적링크 클릭 → 광고주 랜딩 URL (예시)
https://yourstore.com/products/123?affly_ref=<subId>

이 값을 포스트백의 subId로 그대로 돌려줘야 어트리뷰션이 됩니다. subId 표준 형식:

subId = "<publisher_uuid>:<tracking_link_uuid>"
⚠️ 랜딩에서 받은 affly_ref 값을 주문 메타데이터에 반드시 저장하세요. 결제 완료 시 이 값을 subId로 보내야 클릭↔주문이 연결됩니다.
STEP 03

포스트백 API

고객이 결제를 마치면 백엔드에서 단일 POST로 전환을 보고합니다.

POSThttps://linkaffly.com/pb/{postback_token}

postback_token은 대시보드 → 포스트백에서 확인·재발급할 수 있어요. GET도 받지만 자체 백엔드는 JSON 본문 POST를 사용하세요.

요청 본문

POST https://linkaffly.com/pb/{postback_token}
Content-Type: application/json

{
  "orderId":    "ORDER-12345",
  "amount":     50000,
  "subId":      "<affly_ref 값>",
  "commission": 7500,
  "signature":  "<hex HMAC-SHA256>",
  "metadata":   { "plan": "pro-12m" }
}
필드타입필수설명
orderIdstring필수주문 고유 ID (1~120자). (파트너, orderId) 조합으로 중복 제거됩니다.
amountnumber필수주문 금액. 파트너 정산 통화 기준이며 KRW가 아닐 수 있습니다. 음수 불가.
subIdstring필수랜딩 시 받은 affly_ref 값 (1~120자).
commissionint선택파트너가 직접 계산한 커미션(정산 통화). metadata.commission_from_postback=true일 때만 반영.
signaturestring필수HMAC-SHA256 서명 (hex). 아래 참고.
metadataobject선택임의 key-value. conversions.metadata에 저장됩니다.

서명 (HMAC-SHA256)

서명 메시지는 |로 이어붙인 문자열이며, commission을 보낼 때만 끝에 추가합니다. 시크릿(POSTBACK_SECRET)은 입점 시 안내드려요.

// 서명 메시지
message = `${orderId}|${amount}|${subId}`          // commission 미포함
message = `${orderId}|${amount}|${subId}|${commission}`  // commission 포함

// Node.js 예시 — hex 인코딩
import crypto from 'node:crypto';
const signature = crypto
  .createHmac('sha256', process.env.POSTBACK_SECRET)
  .update(message)
  .digest('hex');

응답 코드

코드의미
201전환 신규 생성
200중복 — 동일 (파트너, orderId) 재전송. 재시도 안전(idempotent).
400invalid_payload — 본문 스키마 오류
401invalid_signature — 서명 불일치
404알 수 없는 postback token
429레이트리밋(분당 200) 초과 — Retry-After 헤더 참고
500서버/ingest 오류
STEP 04

전환 처리 & 리포트

포스트백이 접수되면 ingest 파이프라인이 원자적으로 전환을 기록합니다.

  • ·어트리뷰션subId로 퍼블리셔·추적링크를 찾고, 최근 30일 이내 마지막 클릭(last-click)에 귀속합니다.
  • ·FX 환산 — 정산 통화가 외화면 당일 환율로 KRW 환산 후 플랫폼 마진을 적용합니다 (KRW면 그대로).
  • ·커미션 산정 — 포스트백 override(허용 시) 또는 오퍼의 percent/flat 규칙으로 계산합니다.
  • ·상태 전이 pending → 홀드 기간(기본 30일) 경과 시 cleared → 정산 배치 후 paid. 환불·취소 시 reversed.

기록된 전환은 대시보드 전환 검수 청구·정산에 반영됩니다. 모든 포스트백 호출(성공·거부 포함)은 로그에 남아 디버깅에 쓸 수 있어요.

인터랙티브 데모

샌드박스에서 직접 테스트

실제 추적링크와 동일한 클릭→쿠키→포스트백 흐름을 사용합니다. 단, 실제 트래픽 테이블에는 기록되지 않습니다 (샌드박스 쿠키만 사용).

1

데모 클릭 발생 → click_id 쿠키 발급

실제 운영에서는 어필리에이트의 추적링크 클릭 시 자동 발급됩니다.

2

주문 완료 시 포스트백 전송

결제 콜백에서 affly로 단일 POST 호출. 쿠키의 click_id로 자동 매칭됩니다.

연동 준비가 끝났다면

대시보드에서 포스트백 토큰을 확인하고, 셀프 테스트로 ingest 파이프라인을 검증해 보세요. 연동 중 막히는 부분은 언제든 문의 주세요.

1:1 문의