이 글은 누구를 위한 것인가
- ESG 보고서에 이커머스 탄소 배출을 포함해야 하는 팀
- 친환경 소비자를 타겟으로 그린 마케팅을 하고 싶은 팀
- 친환경 포장으로 전환하고 싶은 운영팀
들어가며
2026년 MZ세대 소비자의 60%가 구매 결정 시 환경을 고려한다. 탄소 배출을 측정하고, 친환경 옵션을 제공하는 것은 마케팅 기회이자 규제 대응이다.
이 글은 bluefoxdev.kr의 그린 이커머스 설계 가이드 를 참고하여 작성했습니다.
1. 이커머스 탄소 배출 영역
[이커머스 탄소 배출 영역]
Scope 1 (직접 배출):
자체 배송 차량 연료
창고 냉난방 (직영 창고)
Scope 2 (간접 - 에너지):
서버 전력 소비
창고 전력 소비
Scope 3 (공급망):
상품 제조 (가장 큰 비중, 70-80%)
포장재 생산
택배사 배송 (5-15%)
반품 배송
고객 쇼핑 이동
[이커머스가 직접 줄일 수 있는 것]
1. 포장재: 과포장 → 적정 포장 (15-20% 감소)
2. 배송 통합: 분리 배송 → 합배송 (10-15% 감소)
3. 반품 감소: 사이즈 추천, 상세 정보 → 반품 30% 감소
4. 창고 에너지: 태양광, 조명 LED화
5. 라스트마일: 전기차, 자전거 배송
[탄소 환산 계수 (kg CO2e)]
국내 택배 1건: 0.5 ~ 1.2 kg
포장재 (골판지 1kg): 0.8 kg
반품 1건: 배송의 1.5배
2. 배송 탄소 측정
from dataclasses import dataclass
@dataclass
class CarbonEmission:
order_id: str
delivery_kg_co2: float
packaging_kg_co2: float
total_kg_co2: float
offset_credits: float = 0.0
CARBON_FACTORS = {
# 배송 방식별 탄소 계수 (kg CO2e / 패키지)
"standard_parcel": 0.8,
"same_day": 1.5, # 항공 포함 가능
"next_day": 1.2,
"economy": 0.5,
"electric_vehicle": 0.3,
"bicycle_cargo": 0.05,
}
PACKAGING_FACTORS = {
# 포장재별 탄소 계수 (kg CO2e / kg)
"virgin_cardboard": 0.94,
"recycled_cardboard": 0.47,
"plastic_bubble": 3.5,
"paper_padding": 0.83,
"biodegradable_filler": 0.6,
}
async def calculate_order_carbon(order_id: str) -> CarbonEmission:
"""주문별 탄소 발자국 계산"""
order = await get_order(order_id)
# 배송 탄소
shipping_method = order.get("shipping_method", "standard_parcel")
delivery_co2 = CARBON_FACTORS.get(shipping_method, 0.8)
# 포장재 탄소
packaging = await get_packaging_info(order_id)
packaging_co2 = 0.0
for material, weight_kg in packaging.items():
factor = PACKAGING_FACTORS.get(material, 0.8)
packaging_co2 += factor * weight_kg
total_co2 = delivery_co2 + packaging_co2
# DB 저장
await db.execute("""
INSERT INTO order_carbon_footprint
(order_id, delivery_kg_co2, packaging_kg_co2, total_kg_co2)
VALUES ($1, $2, $3, $4)
ON CONFLICT (order_id) DO UPDATE
SET total_kg_co2 = $4
""", order_id, delivery_co2, packaging_co2, total_co2)
return CarbonEmission(
order_id=order_id,
delivery_kg_co2=delivery_co2,
packaging_kg_co2=packaging_co2,
total_kg_co2=total_co2,
)
async def offer_carbon_offset_at_checkout(order: dict) -> dict:
"""결제 시 탄소 상쇄 옵션 제공"""
carbon = await calculate_order_carbon(order["id"])
# 탄소 상쇄 비용 (1kg CO2 = 약 500-1000원)
offset_cost = round(carbon.total_kg_co2 * 700)
return {
"carbon_kg": round(carbon.total_kg_co2, 2),
"offset_cost": offset_cost,
"equivalent": f"나무 {round(carbon.total_kg_co2 * 0.1, 1)}그루 심기",
"message": f"이 주문의 탄소 배출량은 {carbon.total_kg_co2:.1f}kg CO2입니다. "
f"{offset_cost:,}원으로 탄소 중립 배송을 선택하세요.",
}
async def generate_esg_report(year: int, month: int) -> dict:
"""월별 ESG 탄소 리포트"""
result = await db.fetchrow("""
SELECT
COUNT(*) AS order_count,
SUM(total_kg_co2) AS total_co2,
AVG(total_kg_co2) AS avg_co2_per_order,
SUM(CASE WHEN offset_credits > 0 THEN total_kg_co2 ELSE 0 END) AS offset_co2
FROM order_carbon_footprint ocf
JOIN orders o ON o.id = ocf.order_id
WHERE EXTRACT(YEAR FROM o.created_at) = $1
AND EXTRACT(MONTH FROM o.created_at) = $2
""", year, month)
return {
"period": f"{year}-{month:02d}",
"total_orders": result["order_count"],
"total_co2_kg": round(result["total_co2"], 1),
"avg_co2_per_order_kg": round(result["avg_co2_per_order"], 2),
"offset_co2_kg": round(result["offset_co2"], 1),
"net_co2_kg": round(result["total_co2"] - result["offset_co2"], 1),
}
마무리
그린 이커머스는 규제 대응(EU 공급망 실사법, 탄소국경조정세)과 마케팅의 교차점이다. 당장 할 수 있는 것은 포장재 재활용 전환(비용 절감 + 탄소 감소)과 결제 화면의 탄소 중립 옵션 제공이다. 탄소 발자국 데이터 수집부터 시작하면, ESG 보고서와 마케팅 소재를 동시에 얻을 수 있다.