Files
our-claude-skills/ourdigital-custom-skills/20-gtm-audit/code/docs/checkout_flow.md
Andrew Yim eea49f9f8c refactor(skills): Restructure skills to dual-platform architecture
Major refactoring of ourdigital-custom-skills with new numbering system:

## Structure Changes
- Each skill now has code/ (Claude Code) and desktop/ (Claude Desktop) versions
- New progressive numbering: 01-09 General, 10-19 SEO, 20-29 GTM, 30-39 OurDigital, 40-49 Jamie

## Skill Reorganization
- 01-notion-organizer (from 02)
- 10-18: SEO tools split into focused skills (technical, on-page, local, schema, vitals, gsc, gateway)
- 20-21: GTM audit and manager
- 30-32: OurDigital designer, research, presentation
- 40-41: Jamie brand editor and audit

## New Files
- .claude/commands/: Slash command definitions for all skills
- CLAUDE.md: Updated with new skill structure documentation
- REFACTORING_PLAN.md: Migration documentation
- COMPATIBILITY_REPORT.md, SKILLS_COMPARISON.md: Analysis docs

## Removed
- Old skill directories (02-05, 10-14, 20-21 old numbering)
- Consolidated into new structure with _archive/ for reference

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-22 01:58:24 +09:00

238 lines
5.5 KiB
Markdown

# E-commerce Checkout Flow Reference
## Complete Checkout Event Sequence
```
view_cart → begin_checkout → add_shipping_info → add_payment_info → purchase
```
Each step must fire in order with consistent item data.
## Event Details
### 1. view_cart
When user views cart page.
```javascript
dataLayer.push({ ecommerce: null });
dataLayer.push({
event: "view_cart",
ecommerce: {
currency: "KRW",
value: 125000,
items: [{
item_id: "SKU_001",
item_name: "Blue T-Shirt",
price: 45000,
quantity: 2,
item_brand: "Brand",
item_category: "Apparel"
}, {
item_id: "SKU_002",
item_name: "Black Jeans",
price: 35000,
quantity: 1
}]
}
});
```
### 2. begin_checkout
When user initiates checkout process.
```javascript
dataLayer.push({ ecommerce: null });
dataLayer.push({
event: "begin_checkout",
ecommerce: {
currency: "KRW",
value: 125000,
coupon: "SUMMER10",
items: [/* same items as view_cart */]
}
});
```
### 3. add_shipping_info
When user completes shipping step.
```javascript
dataLayer.push({ ecommerce: null });
dataLayer.push({
event: "add_shipping_info",
ecommerce: {
currency: "KRW",
value: 125000,
coupon: "SUMMER10",
shipping_tier: "Express", // Required
items: [/* same items */]
}
});
```
**shipping_tier values:**
- "Standard" / "일반배송"
- "Express" / "익일배송"
- "Same Day" / "당일배송"
- "Free" / "무료배송"
- "Store Pickup" / "매장픽업"
### 4. add_payment_info
When user enters payment details.
```javascript
dataLayer.push({ ecommerce: null });
dataLayer.push({
event: "add_payment_info",
ecommerce: {
currency: "KRW",
value: 125000,
coupon: "SUMMER10",
payment_type: "Credit Card", // Required
items: [/* same items */]
}
});
```
**payment_type values:**
- "Credit Card" / "신용카드"
- "Debit Card" / "체크카드"
- "Bank Transfer" / "계좌이체"
- "Virtual Account" / "가상계좌"
- "Mobile Payment" / "휴대폰결제"
- "Kakao Pay" / "카카오페이"
- "Naver Pay" / "네이버페이"
- "Toss" / "토스"
- "PayPal"
### 5. purchase
When transaction completes successfully.
```javascript
dataLayer.push({ ecommerce: null });
dataLayer.push({
event: "purchase",
ecommerce: {
transaction_id: "T_20250115_001234", // Required, unique
value: 130500, // Required (total)
tax: 11863,
shipping: 5000,
currency: "KRW", // Required
coupon: "SUMMER10",
items: [{
item_id: "SKU_001",
item_name: "Blue T-Shirt",
affiliation: "Online Store",
coupon: "SUMMER10",
discount: 4500,
price: 45000,
quantity: 2
}]
}
});
```
## Funnel Drop-off Analysis
### Tracking Drop-offs
Monitor completion rate at each step:
| Step | Event | Drop-off Indicator |
|------|-------|-------------------|
| Cart | view_cart | User leaves cart page |
| Checkout Start | begin_checkout | User doesn't proceed |
| Shipping | add_shipping_info | Address form abandoned |
| Payment | add_payment_info | Payment not completed |
| Complete | purchase | Transaction failed |
### Implementing Drop-off Tracking
```javascript
// Track checkout step viewed but not completed
let checkoutStep = 0;
function trackCheckoutProgress(step) {
if (step > checkoutStep) {
checkoutStep = step;
}
}
window.addEventListener('beforeunload', () => {
if (checkoutStep > 0 && checkoutStep < 5) {
dataLayer.push({
event: 'checkout_abandon',
last_step: checkoutStep,
step_name: ['cart', 'checkout', 'shipping', 'payment', 'complete'][checkoutStep - 1]
});
}
});
```
## Value Consistency Check
Ensure `value` matches across events:
```
view_cart.value = sum(items.price * items.quantity)
begin_checkout.value = view_cart.value
add_shipping_info.value = begin_checkout.value
add_payment_info.value = add_shipping_info.value
purchase.value = add_payment_info.value + shipping + tax - discount
```
## Common Issues
### Duplicate Purchase Events
**Problem**: Same order tracked multiple times
**Solution**:
```javascript
// Check if already tracked
const txId = "T_12345";
if (!sessionStorage.getItem('purchase_' + txId)) {
dataLayer.push({ event: 'purchase', ... });
sessionStorage.setItem('purchase_' + txId, 'true');
}
```
### Missing Items in Later Steps
**Problem**: Items present in view_cart but missing in purchase
**Solution**: Store cart data in session and reuse
### Inconsistent Currency
**Problem**: Some events use USD, others KRW
**Solution**: Standardize currency across all events
### Wrong Value Calculation
**Problem**: purchase.value doesn't include tax/shipping
**Solution**:
```
purchase.value = subtotal + tax + shipping - discount
```
## Korean E-commerce Platforms
### Cafe24
Custom dataLayer variable names - check documentation
### Shopify Korea
Standard GA4 format with `Shopify.checkout` object
### WooCommerce
Use official GA4 plugin or custom implementation
### Naver SmartStore
Separate Naver Analytics implementation required
## Checkout Flow Checklist
- [ ] view_cart fires on cart page load
- [ ] begin_checkout fires on checkout button click
- [ ] add_shipping_info includes shipping_tier
- [ ] add_payment_info includes payment_type
- [ ] purchase has unique transaction_id
- [ ] All events have consistent items array
- [ ] Currency is consistent across all events
- [ ] Value calculations are accurate
- [ ] ecommerce object cleared before each push
- [ ] Purchase event fires only once per order