프로스펙팅(prospecting) 캠페인(신규 고객 유치)을 최적화하기 위해, AppLovin은 귀사의 주문 내역 데이터를 AppLovin에 제공할 것을 강력히 권장합니다. 이를 통해 AppLovin은 기존 고객의 정확한 모델을 구축하여 가치가 높은 새로운 사용자를 찾을 수 있습니다.
Shopify 사용자로서 AppLovin Shopify 앱을 설치하고 이를 Ads Manager 계정에 연결하셨다면, 모든 준비가 완료된 것입니다!
그렇지 않은 경우, 아래의 요구 사항에 따라 이 데이터를 CSV 형식으로 업로드하십시오.
AppLovin에 고객 데이터를 제공하는 것은 필요한 고지 및 동의를 포함하여 귀사 자체의 개인정보 보호 준수 요구 사항을 따릅니다.
transaction_id를 기준으로 주문을 자동으로 중복 제거합니다.
AppLovin은 시스템에 이미 존재하는 transaction_id를 가진 데이터 행은 무시합니다.
단일 파일에 중복된 transaction_id를 가진 행이 존재하는 경우, AppLovin은 event_timestamp가 가장 빠른 행을 유지하고 나머지는 버립니다.CSV 파일에는 아래에 나열된 필수 헤더가 모두 포함되어야 하지만, 특정 필드는 선택적으로 채울 수 있습니다.
열 순서는 상관없지만, 헤더 이름은 정확히 일치해야 합니다.
이벤트 기간: AppLovin은 사용 가능한 모든 주문 내역을 업로드할 것을 강력히 권장합니다.
| 필드 | 값 필수 여부? | 유형 | 설명 | 값 |
|---|---|---|---|---|
country_code | 예 | String | ISO 3166 국가 코드 | US |
currency | 예 | String | ISO 4217 형식의 거래 통화 (3자리 코드) | USD |
email | 예 | String | 고객의 이메일 주소. 평문 이메일을 제공하십시오. AppLovin이 자체적으로 해싱합니다. | customer@example.com |
event_name | 예 | String | 반드시 purchase여야 합니다. | purchase |
event_timestamp | 예 | String | 구매가 발생한 시간
|
|
transaction_id | 예 | String | 주문의 고유 식별자 (예: 주문 ID, 체크아웃 ID). 이는 중복 제거에 매우 중요합니다. | txn_12345 |
user_id | 예 | String | 귀사의 내부 고객 ID. | user_abc123 |
value | 예 | Double | 거래의 총 가치. 0보다 크거나 같은 숫자여야 합니다. 통화 기호를 포함하지 마십시오. | 99.99 |
zip | 아니요 | String | 고객의 우편번호. 이는 해당 거래의 청구 우편번호여야 합니다. 미국 우편번호의 경우 처음 5자리만 포함하십시오. | 12345 |
idfv | 아니요 | String | 사용자의 IDFV. | f325g3gb-12fc-352f-c6c3-dz52f0f690d8 |
ifa | 아니요 | String | 사용자의 광고 식별자. IDFA 또는 GAID 중 하나입니다. | 918f1d4f-d195-4a8b-af47-44683fe11db9 |
phone | 아니요 | String | 고객의 전화번호. 국가 코드를 포함해야 합니다 (예: +1). 평문 번호를 제공하십시오. AppLovin이 자체적으로 해싱합니다. | +14155551234 |
AppLovin은 귀사가 제공하는 평문 이메일 주소와 전화번호를 해싱합니다.
직접 해싱을 수행하려는 경우, 다음 가이드라인을 주의 깊게 따르십시오.
emailphone1).
그 다음 SHA256을 통해 해싱합니다.
예시 (이메일 주소의 경우):
#include <iostream>
#include <string>
#include <iomanip>
#include <sstream>
#include <algorithm>
#include <openssl/sha.h>
std::string normalizeAndHash(const std::string& email) {
std::string normalized = email;
normalized.erase(0, normalized.find_first_not_of(" \t\n\r"));
normalized.erase(normalized.find_last_not_of(" \t\n\r") + 1);
std::transform(normalized.begin(), normalized.end(), normalized.begin(), ::tolower);
unsigned char hash[SHA256_DIGEST_LENGTH];
SHA256((unsigned char*)normalized.c_str(), normalized.size(), hash);
std::ostringstream oss;
for (int i = 0; i < SHA256_DIGEST_LENGTH; ++i)
oss << std::hex << std::setw(2) << std::setfill('0') << (int)hash[i];
return oss.str();
}
int main() {
std::cout << normalizeAndHash(" John_Smith@gmail.com") << std::endl;
}
using System;
using System.Text;
using System.Security.Cryptography;
class Program {
static string NormalizeAndHash(string email) {
string normalized = email.Trim().ToLower();
using (SHA256 sha256 = SHA256.Create()) {
byte[] bytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(normalized));
StringBuilder sb = new StringBuilder();
foreach (byte b in bytes)
sb.Append(b.ToString("x2"));
return sb.ToString();
}
}
static void Main() {
Console.WriteLine(NormalizeAndHash(" John_Smith@gmail.com"));
}
}
import java.security.MessageDigest;
import java.nio.charset.StandardCharsets;
public class HashEmail {
public static String normalizeAndHash(String email) throws Exception {
String normalized = email.trim().toLowerCase();
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(normalized.getBytes(StandardCharsets.UTF_8));
StringBuilder hex = new StringBuilder();
for (byte b : hash) hex.append(String.format("%02x", b));
return hex.toString();
}
public static void main(String[] args) throws Exception {
System.out.println(normalizeAndHash(" John_Smith@gmail.com"));
}
}
import { createHash } from "crypto";
function normalizeAndHash(email) {
const normalized = email.trim().toLowerCase();
return createHash("sha256").update(normalized).digest("hex");
}
// Example
console.log(normalizeAndHash(" John_Smith@gmail.com"));
import java.security.MessageDigest
fun normalizeAndHash(email: String): String {
val normalized = email.trim().lowercase()
val bytes = MessageDigest.getInstance("SHA-256").digest(normalized.toByteArray())
return bytes.joinToString("") { "%02x".format(it) }
}
fun main() {
println(normalizeAndHash(" John_Smith@gmail.com"))
}
import hashlib
def normalize_and_hash(email):
normalized = email.strip().lower()
return hashlib.sha256(normalized.encode()).hexdigest()
# Example
print(normalize_and_hash(" John_Smith@gmail.com"))
import Foundation
import CryptoKit
func normalizeAndHash(_ email: String) -> String {
let normalized = email.trimmingCharacters(in: .whitespacesAndNewlines).lowercased()
let hash = SHA256.hash(data: normalized.data(using: .utf8)!)
return hash.map { String(format: "%02x", $0) }.joined()
}
print(normalizeAndHash(" John_Smith@gmail.com"))
62a14e44f765419d10fea99367361a727c12365e2520f32218d505ed9aa0f62f
user_id와 email이 포함되어야 합니다.
AppLovin은 해당 열의 값이 누락된 행을 거부합니다.event_name 열이 존재해야 하며 그 값은 purchase여야 합니다.value 열에는 음수가 아닌 수(≥0)가 포함되어야 합니다.AX — 올란드 제도AD — 안도라AT — 오스트리아BE — 벨기에DK — 덴마크FO — 페로 제도FI — 핀란드FR — 프랑스DE — 독일GI — 지브롤터GR — 그리스GG — 건지IS — 아이슬란드IE — 아일랜드IM — 맨섬IT — 이탈리아JE — 저지LI — 리히텐슈타인LU — 룩셈부르크MT — 몰타MC — 모나코NL — 네덜란드NO — 노르웨이PT — 포르투갈SM — 산마리노ES — 스페인SJ — 스발바르 및 얀마옌SE — 스웨덴CH — 스위스GB — 영국다음은 유효한 CSV 파일의 예시입니다.
event_name,user_id,phone,email,event_timestamp,value,currency,transaction_id,country_code,zip,idfv,ifa
purchase,user_abc123,+14155551234,user@example.com,2025-11-10T16:45:00Z,99.99,USD,txn_12345,US,12345,f325g3gb-12fc-352f-c6c3-dz52f0f690d8,918f1d4f-d195-4a8b-af47-44683fe11db9
purchase,user_def456,+14155555678,customer@example.com,2025-11-10T16:45:00Z,149.5,USD,txn_67890,US,12345,f325g3gb-12fc-352f-c6c3-dz52f0f690d8,918f1d4f-d195-4a8b-af47-44683fe11db9
purchase,user_ghi789,+14155559012,shopper@example.com,2025-11-10T17:20:00Z,75,EUR,txn_11223,US,12345,f325g3gb-12fc-352f-c6c3-dz52f0f690d8,918f1d4f-d195-4a8b-af47-44683fe11db9