Как посчитать Attach Rate в SQL

Закрепи формулу attach rate в Карьернике
Запомнить надолго — 5 коротких сессий с задачами на эту тему. Бесплатно
Тренировать attach rate в Telegram

Зачем Attach Rate

Attach Rate — % покупателей primary product, кто купил accessory / add-on / warranty. Classic retail metric. Apple ~30-40% attach iPhone → case. SaaS — % subscribers, кто платит за add-on модули.

Формула

Attach Rate = orders_with_primary_AND_addon / orders_with_primary × 100%

Базовый расчёт

WITH primary_orders AS (
    SELECT
        order_id,
        user_id
    FROM order_items
    WHERE product_id = 'iphone-pro'  -- primary
),
addon_attach AS (
    SELECT DISTINCT
        po.order_id
    FROM primary_orders po
    JOIN order_items oi ON oi.order_id = po.order_id
    WHERE oi.product_id IN ('iphone-CASE', 'iphone-charger', 'applecare')
)
SELECT
    COUNT(DISTINCT po.order_id) AS primary_orders,
    COUNT(DISTINCT aa.order_id) AS orders_with_attach,
    COUNT(DISTINCT aa.order_id)::NUMERIC * 100
    / NULLIF(COUNT(DISTINCT po.order_id), 0) AS attach_rate_pct
FROM primary_orders po
LEFT JOIN addon_attach aa USING (order_id);

По primary product

WITH primary_purchases AS (
    SELECT
        oi.order_id,
        oi.user_id,
        oi.product_id AS primary_product
    FROM order_items oi
    JOIN products p USING (product_id)
    WHERE p.category = 'primary'  -- e.g. laptops, phones
)
SELECT
    pp.primary_product,
    COUNT(DISTINCT pp.order_id) AS orders,
    COUNT(DISTINCT pp.order_id) FILTER (
        WHERE EXISTS (
            SELECT 1 FROM order_items oi2
            JOIN products p2 USING (product_id)
            WHERE oi2.order_id = pp.order_id
              AND p2.category = 'accessory'
        )
    ) AS orders_with_accessory,
    COUNT(DISTINCT pp.order_id) FILTER (
        WHERE EXISTS (
            SELECT 1 FROM order_items oi2
            JOIN products p2 USING (product_id)
            WHERE oi2.order_id = pp.order_id
              AND p2.category = 'accessory'
        )
    )::NUMERIC * 100 / NULLIF(COUNT(DISTINCT pp.order_id), 0) AS attach_rate_pct
FROM primary_purchases pp
GROUP BY pp.primary_product
ORDER BY attach_rate_pct DESC;
Закрепи формулу attach rate в Карьернике
Запомнить надолго — 5 коротких сессий с задачами на эту тему. Бесплатно
Тренировать attach rate в Telegram

Attach Rate per addon

Different addons have different attach rates:

SELECT
    accessory.product_id AS accessory,
    COUNT(DISTINCT primary.order_id) AS primary_orders,
    COUNT(DISTINCT acc.order_id) AS attached_orders,
    COUNT(DISTINCT acc.order_id)::NUMERIC * 100 / NULLIF(COUNT(DISTINCT primary.order_id), 0) AS attach_pct
FROM (
    SELECT order_id, user_id FROM order_items WHERE product_id = 'macbook-pro'
) primary
LEFT JOIN (
    SELECT order_id, product_id FROM order_items WHERE product_id LIKE 'mb-accessory-%'
) acc USING (order_id)
GROUP BY acc.product_id
ORDER BY attach_pct DESC;

Attach Rate vs Cross-sell

Метрика Definition
Attach Rate Same order, addon to primary product
Cross-sell Subsequent order, different category

Attach — immediate. Cross-sell — over time.

Частые ошибки

Ошибка 1. «Bundle» considered as attach. Pre-bundled product (warranty included) — already attached. Don't double count.

Ошибка 2. Returns ignored. Customer attached case, returned. Net attach rate.

Ошибка 3. Threshold value. Attach rate without revenue context. Low-margin accessory не moves bottom line.

Ошибка 4. Different primaries. Phone attach rate ≠ laptop attach rate. Compare like-with-like.

Ошибка 5. Pre vs post checkout. Some accessories sold post-purchase (insurance offered later). Separate funnel.

Связанные темы

FAQ

Какой Attach Rate ok?

Phone case: 30-40%. Warranty: 10-20%. AirPods с iPhone: 25%.

Improve attach rate как?

  1. Recommend at PDP. 2) Bundle offer. 3) Cart-level prompt. 4) Educate (need-based).

Attach rate metric для SaaS?

Yes. % subscribers с paid add-on. Slack: % paid teams with apps.

Multiple accessories?

Attach rate per accessory + overall (any accessory).

Attach rate after warranty period?

Different — that's cross-sell. Attach = same order.