데브포일 홈
WordPress 자동화
Guest
STAGE 19 · Lv.96

ROI 자동 계산 시스템

비용 추적, 매출 기여 분석, ROAS 계산, 자동 ROI 리포트, 캠페인 성과 비교 시스템을 구축합니다.

ROI 자동 측정이 마케팅 효율화의 핵심

마케팅 ROI의 중요성

ROI(Return on Investment)는 투자 대비 수익률입니다. 마케팅에서 ROI를 정확히 측정하면 어떤 채널에 더 투자하고 어떤 채널을 줄여야 하는지 데이터 기반으로 결정할 수 있습니다.


많은 기업이 마케팅 예산을 "감"으로 배분합니다. "SNS가 중요하니까 더 투자하자", "경쟁사가 광고를 늘렸으니 우리도" 같은 의사결정은 비효율적입니다. ROI 자동 계산 시스템은 각 채널의 실제 투자 수익을 숫자로 보여주어, 예산 1원까지 최적으로 배분할 수 있게 합니다.


핵심 마케팅 ROI 지표:


ROI (투자 수익률): (매출 - 마케팅 비용) / 마케팅 비용 x 100%. 예: 100만원 투자 → 500만원 매출 = ROI 400%. 마이너스면 적자입니다.


ROAS (광고 수익률): 매출 / 광고비. 예: ROAS 4.0 = 1만원 투자 → 4만원 매출. 일반적으로 ROAS 3.0 이상이면 수익성 있음.


CAC (고객 획득 비용): 총 마케팅 비용 / 신규 고객 수. 예: 월 300만원 마케팅 → 100명 신규 = CAC 3만원.


LTV (고객 생애 가치): 평균 주문가 x 연간 구매 횟수 x 평균 유지 기간. LTV:CAC 비율이 3:1 이상이면 건강한 비즈니스.


CPA (전환당 비용): 총 비용 / 전환 수. 리드 생성 비즈니스에서 중요.

💰
ROI
투자 수익률
채널별 자동 계산
📊
ROAS
광고 수익률
실시간 추적
🔄
LTV
고객 생애 가치
자동 산출
🎯
CAC
고객 획득 비용
채널별 비교
지표 계산 공식 좋은 기준 적용 상황
ROI(매출-비용)/비용 x 100%100% 이상 (2배 이상 회수)전체 마케팅 효율 평가
ROAS매출 / 광고비3.0 이상유료 광고 채널 평가
CAC총 비용 / 신규 고객 수LTV의 1/3 이하고객 획득 효율
LTVAOV x 연구매횟수 x 유지기간CAC의 3배 이상장기 수익성 평가
CPA총 비용 / 전환 수상품 마진의 50% 이하리드 생성 캠페인
Payback PeriodCAC / (AOV x 마진율)3개월 이내현금흐름 관리

비용 추적 시스템 구축

// =============================================
// 마케팅 비용 추적 시스템 - 완전 구현
// =============================================

class Marketing_Cost_Tracker {
    private $table_name;

    public function __construct() {
        global $wpdb;
        $this->table_name = $wpdb->prefix . 'marketing_costs';
    }

    // 데이터베이스 테이블 생성
    public function activate() {
        global $wpdb;
        $charset = $wpdb->get_charset_collate();
        $sql = "CREATE TABLE IF NOT EXISTS {$this->table_name} (
            id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
            channel VARCHAR(50) NOT NULL,
            sub_channel VARCHAR(100) DEFAULT '',
            campaign VARCHAR(255) DEFAULT '',
            amount DECIMAL(12,2) NOT NULL DEFAULT 0,
            currency VARCHAR(3) DEFAULT 'KRW',
            cost_date DATE NOT NULL,
            cost_type ENUM('advertising','content','tool','labor','other') DEFAULT 'advertising',
            notes TEXT DEFAULT '',
            auto_imported TINYINT(1) DEFAULT 0,
            source VARCHAR(50) DEFAULT 'manual',
            created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
            INDEX idx_channel_date (channel, cost_date),
            INDEX idx_date (cost_date),
            INDEX idx_campaign (campaign(100))
        ) {$charset};";

        require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
        dbDelta($sql);
    }

    // 비용 기록 (단건)
    public function record_cost($data) {
        global $wpdb;
        return $wpdb->insert($this->table_name, array(
            'channel'       => sanitize_text_field($data['channel']),
            'sub_channel'   => sanitize_text_field($data['sub_channel'] ?? ''),
            'campaign'      => sanitize_text_field($data['campaign'] ?? ''),
            'amount'        => (float)$data['amount'],
            'currency'      => $data['currency'] ?? 'KRW',
            'cost_date'     => $data['date'],
            'cost_type'     => $data['cost_type'] ?? 'advertising',
            'notes'         => sanitize_textarea_field($data['notes'] ?? ''),
            'auto_imported' => (int)($data['auto_imported'] ?? 0),
            'source'        => sanitize_text_field($data['source'] ?? 'manual'),
        ));
    }

    // 채널별 비용 합계
    public function get_costs_by_channel($date_from, $date_to) {
        global $wpdb;
        return $wpdb->get_results($wpdb->prepare(
            "SELECT channel,
                    SUM(amount) as total_cost,
                    COUNT(*) as entries,
                    COUNT(DISTINCT campaign) as campaigns,
                    MIN(cost_date) as first_cost,
                    MAX(cost_date) as last_cost
             FROM {$this->table_name}
             WHERE cost_date BETWEEN %s AND %s
             GROUP BY channel
             ORDER BY total_cost DESC",
            $date_from, $date_to
        ), ARRAY_A);
    }

    // 캠페인별 비용 상세
    public function get_costs_by_campaign($date_from, $date_to, $channel = null) {
        global $wpdb;
        $where = "cost_date BETWEEN %s AND %s";
        $params = array($date_from, $date_to);

        if ($channel) {
            $where .= " AND channel = %s";
            $params[] = $channel;
        }

        return $wpdb->get_results($wpdb->prepare(
            "SELECT channel, campaign,
                    SUM(amount) as total_cost,
                    COUNT(DISTINCT cost_date) as days_active
             FROM {$this->table_name}
             WHERE {$where}
             AND campaign != ''
             GROUP BY channel, campaign
             ORDER BY total_cost DESC",
            ...$params
        ), ARRAY_A);
    }

    // 일별 비용 추이
    public function get_daily_costs($date_from, $date_to) {
        global $wpdb;
        return $wpdb->get_results($wpdb->prepare(
            "SELECT cost_date, channel, SUM(amount) as daily_cost
             FROM {$this->table_name}
             WHERE cost_date BETWEEN %s AND %s
             GROUP BY cost_date, channel
             ORDER BY cost_date ASC",
            $date_from, $date_to
        ), ARRAY_A);
    }

    // 총 비용 합계
    public function get_total_cost($date_from, $date_to) {
        global $wpdb;
        return (float)$wpdb->get_var($wpdb->prepare(
            "SELECT COALESCE(SUM(amount), 0) FROM {$this->table_name}
             WHERE cost_date BETWEEN %s AND %s",
            $date_from, $date_to
        ));
    }
}

// Make.com 연동: 광고 비용 자동 가져오기 REST API
add_action('rest_api_init', function() {
    // Google Ads 비용 임포트
    register_rest_route('roi/v1', '/import/google-ads', array(
        'methods' => 'POST',
        'callback' => function($req) {
            $data = $req->get_json_params();
            $tracker = new Marketing_Cost_Tracker();

            $imported = 0;
            foreach ($data['campaigns'] ?? array() as $campaign) {
                $tracker->record_cost(array(
                    'channel'       => 'google_ads',
                    'sub_channel'   => $campaign['network'] ?? 'search',
                    'campaign'      => $campaign['name'],
                    'amount'        => $campaign['cost'],
                    'date'          => $campaign['date'],
                    'auto_imported' => 1,
                    'source'        => 'make_google_ads',
                ));
                $imported++;
            }

            return new WP_REST_Response(array('imported' => $imported));
        },
        'permission_callback' => function($req) {
            return $req->get_header('X-API-Key') === get_option('dashboard_api_key');
        },
    ));

    // Meta(Facebook/Instagram) Ads 비용 임포트
    register_rest_route('roi/v1', '/import/meta-ads', array(
        'methods' => 'POST',
        'callback' => function($req) {
            $data = $req->get_json_params();
            $tracker = new Marketing_Cost_Tracker();

            $imported = 0;
            foreach ($data['campaigns'] ?? array() as $campaign) {
                $tracker->record_cost(array(
                    'channel'       => 'meta_ads',
                    'sub_channel'   => $campaign['platform'] ?? 'facebook',
                    'campaign'      => $campaign['name'],
                    'amount'        => $campaign['spend'],
                    'date'          => $campaign['date'],
                    'auto_imported' => 1,
                    'source'        => 'make_meta_ads',
                ));
                $imported++;
            }

            return new WP_REST_Response(array('imported' => $imported));
        },
        'permission_callback' => function($req) {
            return $req->get_header('X-API-Key') === get_option('dashboard_api_key');
        },
    ));

    // 수동 비용 입력
    register_rest_route('roi/v1', '/costs', array(
        'methods' => 'POST',
        'callback' => function($req) {
            $data = $req->get_json_params();
            $tracker = new Marketing_Cost_Tracker();
            $tracker->record_cost($data);
            return new WP_REST_Response(array('status' => 'recorded'));
        },
        'permission_callback' => function() { return current_user_can('manage_options'); },
    ));
});

비용 추적에 포함해야 할 항목

정확한 ROI를 계산하려면 모든 마케팅 비용을 빠짐없이 추적해야 합니다. 흔히 누락되는 비용: (1) 광고비: Google Ads, Meta Ads, Naver 검색광고 등 (Make.com으로 자동 임포트). (2) 도구 비용: SEO 도구(Ahrefs, SEMrush), 이메일 서비스(Mailchimp), Make.com 구독료 등. (3) 콘텐츠 비용: 블로그 글 외주, 디자인 비용, 동영상 제작비. (4) 인건비: 마케팅 담당자 급여의 채널별 배분. (5) 기타: 호스팅 비용, 도메인, SSL 등 기술 인프라 비용. 도구/인건비는 월초에 수동으로 한 번 입력하고, 광고비는 Make.com으로 매일 자동 임포트하는 것을 권장합니다.

🔒
여기까지는 미리보기입니다
ROI 자동 계산 시스템
무료 가입하면 이어서 볼 수 있고, 강의를 완료할 때마다 XP와 레벨이 쌓입니다.
Google로 3초 만에 시작 →🧵 Threads로 시작무료 공개 강의 둘러보기 (Lv.1~3)