customer-accounts

Let shoppers register, manage their profile, save multiple addresses, and view their full order history using your platform's built-in customer account system

11 stars

Best use case

customer-accounts is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

Let shoppers register, manage their profile, save multiple addresses, and view their full order history using your platform's built-in customer account system

Teams using customer-accounts should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/customer-accounts/SKILL.md --create-dirs "https://raw.githubusercontent.com/finsilabs/awesome-ecommerce-skills/main/skills/customer-crm/customer-accounts/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/customer-accounts/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How customer-accounts Compares

Feature / Agentcustomer-accountsStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

Let shoppers register, manage their profile, save multiple addresses, and view their full order history using your platform's built-in customer account system

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

SKILL.md Source

# Customer Accounts

## Overview

Customer accounts let shoppers save addresses for faster checkout, view order history, track shipments, and manage their profile. Every major e-commerce platform has this built in — Shopify, WooCommerce, and BigCommerce all provide account registration, login, address books, and order history without any custom development. The main decisions are: whether to make accounts optional or required, and whether to extend the platform's default account pages with additional functionality.

## When to Use This Skill

- When enabling customer registration and login on a new storefront
- When customizing the account dashboard with order history and tracking
- When adding an address book to speed up returning customer checkout
- When converting guest checkout users into registered customers
- When adding wishlist or saved-for-later functionality

## Core Instructions

### Step 1: Determine platform and enable customer accounts

| Platform | Account System | Recommended Extension |
|----------|---------------|----------------------|
| **Shopify** | Native customer accounts (classic or new) | Customer Accounts Concierge or Flits for enhanced account pages |
| **WooCommerce** | My Account page (built-in, customizable) | YITH WooCommerce Wishlist; WooCommerce Memberships for gated content |
| **BigCommerce** | Customer account portal (built-in) | Customer Groups for tiered access; LoyaltyLion for loyalty integration |
| **Custom / Headless** | Build with JWT sessions and bcrypt password hashing | Required for complete control over authentication and account UX |

---

### Step 2: Platform-specific setup

---

#### Shopify

Shopify offers two account experiences: **Classic accounts** and the newer **New customer accounts** (available on all plans).

**Enable accounts and choose the experience:**

1. Go to **Settings → Customer accounts**
2. Choose between:
   - **Classic accounts**: traditional email + password login with customizable account pages via Liquid theme
   - **New customer accounts**: passwordless login via email link; Shopify-hosted pages that Shopify controls (faster to set up, less customizable)
3. Set accounts as **Optional** (recommended) or **Required**

**Classic accounts setup:**

1. Enable **Classic accounts** in Settings → Customer accounts
2. The account page appears at `/account` — your theme controls the layout
3. Customize the account page in **Online Store → Themes → Customize → Customer account pages**
4. Key pages: Login, Register, Account overview, Order detail, Addresses

**Making accounts optional (strongly recommended):**
- Always allow guest checkout — never force registration before purchase
- After checkout, show a "Create account to save your details" prompt
- Shopify handles the "convert guest to account" flow automatically when a customer registers with the same email used for a past order

**Extending account pages:**

For enhanced account functionality (wishlist, loyalty points, social login, recent orders with tracking):
- Install **Flits** from the App Store — comprehensive account page customization
- Or install **Customer Accounts Concierge** — adds wishlist, recently viewed, reorder functionality

---

#### WooCommerce

WooCommerce has a built-in **My Account** page that includes order history, addresses, and profile management.

**Set up My Account:**

1. Go to **WooCommerce → Settings → Accounts & Privacy**
2. Configure:
   - **Guest checkout**: check "Allow customers to place orders without an account"
   - **Account creation**: optionally auto-create accounts during checkout
   - **Account erasure**: enable "Allow customers to request account deletion"
3. The My Account page is created automatically at `/my-account/`

**Customize My Account tabs:**

The default tabs are: Dashboard, Orders, Downloads, Addresses, Account details, Logout. Add or remove tabs:
1. Add custom tabs by using the `woocommerce_account_menu_items` filter in your child theme's functions.php, or install a plugin like **YITH WooCommerce Customize My Account Page**
2. Reorder tabs by modifying the array in the filter

**Address book:**

1. Go to **WooCommerce → Settings → Accounts → Allow customers to store multiple addresses**
2. Customers can add/edit multiple addresses in **My Account → Addresses**
3. WooCommerce pre-fills checkout with the default address automatically

**Wishlist:**
- Install **YITH WooCommerce Wishlist** (free/premium)
- Adds a "Add to Wishlist" button on product pages and a wishlist page in My Account

**Converting guest to registered after purchase:**

WooCommerce shows a "Create account" prompt in order confirmation emails automatically when accounts are enabled but optional.

---

#### BigCommerce

BigCommerce has a built-in customer portal.

**Enable and configure:**

1. Go to **Store Setup → Store Settings → Display → Customer Account Access**
2. Set to "Optional" to allow guest checkout
3. Account pages are managed by your theme — customize in the Stencil theme editor

**Customer groups:**

Use customer groups for tiered access, B2B pricing, or member-only categories:
1. Go to **Customers → Customer Groups → Add Group**
2. Set group-specific pricing, category visibility, or shipping rules
3. Assign customers to groups manually or auto-assign based on purchase history

**Address book:**
- Built-in under the customer account portal
- Customers can save multiple addresses and select them at checkout

---

#### Custom / Headless

For headless storefronts, build a complete account system with secure authentication:

```typescript
// lib/auth.ts
import bcrypt from 'bcrypt';
import jwt from 'jsonwebtoken';
import { z } from 'zod';

const registerSchema = z.object({
  email: z.string().email(),
  password: z.string().min(8).max(128),
  firstName: z.string().min(1).max(100),
  lastName: z.string().min(1).max(100),
  acceptsMarketing: z.boolean().default(false),
});

// POST /api/customers/register
export async function register(req: Request, res: Response) {
  const input = registerSchema.parse(req.body);

  const existing = await db.customers.findByEmail(input.email.toLowerCase());
  if (existing) return res.status(409).json({ error: 'An account with this email already exists' });

  const passwordHash = await bcrypt.hash(input.password, 12);  // Cost factor 12 minimum
  const customer = await db.customers.create({ ...input, email: input.email.toLowerCase(), passwordHash });

  await sendVerificationEmail(customer);
  const token = jwt.sign({ sub: customer.id, type: 'customer' }, process.env.JWT_SECRET!, { expiresIn: '7d' });

  res.status(201).json({ customer: omit(customer, ['passwordHash']), token });
}

// POST /api/customers/login
export async function login(req: Request, res: Response) {
  const { email, password } = req.body;
  const customer = await db.customers.findByEmail(email.toLowerCase());

  // Use the same error for both "not found" and "wrong password" to prevent email enumeration
  if (!customer || !customer.passwordHash) return res.status(401).json({ error: 'Invalid email or password' });
  if (customer.status === 'disabled') return res.status(403).json({ error: 'This account has been disabled' });

  const valid = await bcrypt.compare(password, customer.passwordHash);
  if (!valid) return res.status(401).json({ error: 'Invalid email or password' });

  const token = jwt.sign({ sub: customer.id, type: 'customer' }, process.env.JWT_SECRET!, { expiresIn: '7d' });
  res.json({ customer: omit(customer, ['passwordHash']), token });
}

// Address book CRUD — GET /api/customers/me/addresses
export async function listAddresses(req: AuthRequest, res: Response) {
  const addresses = await db.customerAddresses.findMany({ where: { customerId: req.customerId } });
  res.json({ addresses });
}

// POST /api/customers/me/addresses
export async function addAddress(req: AuthRequest, res: Response) {
  const existing = await db.customerAddresses.findMany({ where: { customerId: req.customerId } });
  const input = { ...addressSchema.parse(req.body), customerId: req.customerId };

  if (input.isDefault || existing.length === 0) {
    await db.customerAddresses.updateMany({ where: { customerId: req.customerId }, data: { isDefault: false } });
    input.isDefault = true;
  }

  const address = await db.customerAddresses.create({ data: input });
  res.status(201).json({ address });
}

// GET /api/customers/me/orders — paginated order history with tracking
export async function listOrders(req: AuthRequest, res: Response) {
  const page = parseInt(req.query.page as string) || 1;
  const limit = Math.min(parseInt(req.query.limit as string) || 10, 50);

  const [orders, total] = await Promise.all([
    db.orders.findMany({ where: { customerId: req.customerId }, skip: (page - 1) * limit, take: limit, orderBy: { createdAt: 'desc' }, include: { lineItems: true, shipments: true } }),
    db.orders.count({ where: { customerId: req.customerId } }),
  ]);

  res.json({ orders, pagination: { page, limit, total, totalPages: Math.ceil(total / limit) } });
}
```

---

### Step 3: Configure post-checkout account creation

The highest-converting moment to ask for account creation is immediately after a successful first purchase, not before.

**Shopify:** The order confirmation page includes a "Create account" button automatically when customer accounts are enabled but optional. Customize the message in **Online Store → Themes → Customize → Order status page**.

**WooCommerce:** Customize the "Thank you" page message in **WooCommerce → Settings → Accounts** or use the **Checkout Field Editor** plugin to add a post-checkout account creation prompt.

**What to say:** "Save your details for faster checkout next time" is more compelling than "Create an account" — focus on the benefit, not the action.

## Best Practices

- **Always make accounts optional** — never force registration before purchase; post-purchase conversion rates are much higher than pre-purchase
- **Offer social login** where possible (Google, Facebook) — reduces friction significantly for mobile users; use apps like **Single Sign-On (SSO)** for Shopify or **WooCommerce Social Login** for WooCommerce
- **Auto-populate checkout from saved addresses** — the primary value of accounts is faster checkout; ensure the default address pre-fills automatically
- **Send a re-engagement email 24 hours after checkout** to guest buyers inviting them to create an account — timing matters
- **Enable GDPR/CCPA account deletion** — every platform supports this; make sure the "delete my account" option is easy to find; see your platform's documentation for the data erasure workflow

## Common Pitfalls

| Problem | Solution |
|---------|----------|
| Customers can't see past orders after creating an account | On Shopify, past orders from guest checkout are linked when the customer registers with the same email; verify the account linking is enabled in Settings → Customer accounts |
| Address validation fails for international customers | Don't mark state/province as required — many countries don't have them; WooCommerce handles this with country-dependent field visibility |
| JWT tokens too long-lived | Use 15-minute access tokens with refresh tokens for better security, or use server-side sessions with a secure, HttpOnly cookie |
| No way to merge duplicate customer records | Shopify and WooCommerce both support customer merge in the admin; for custom builds, build a merge tool that consolidates orders and addresses |

## Related Skills

- @customer-segmentation
- @customer-lifetime-value
- @personalization-engine

Related Skills

accounts-receivable-automation

11
from finsilabs/awesome-ecommerce-skills

Automate B2B accounts receivable with invoice generation, payment tracking, dunning sequences for past-due invoices, and aging analysis dashboards

customer-retention-engine

11
from finsilabs/awesome-ecommerce-skills

Build automated retention campaigns targeting at-risk customers with behavioral triggers, personalized offers, and churn prevention workflows

customer-analytics

11
from finsilabs/awesome-ecommerce-skills

Analyze customer behavior with RFM scoring, purchase frequency tracking, churn prediction, and cohort analysis to improve retention strategy

customer-support-integration

11
from finsilabs/awesome-ecommerce-skills

Connect your helpdesk (Gorgias, Zendesk, Intercom) to your store so support agents see full order history and customer details without switching tools

customer-segmentation

11
from finsilabs/awesome-ecommerce-skills

Segment customers by purchase behavior, recency, and spend using Klaviyo, your platform's built-in tools, or a custom RFM analysis to power targeted marketing

customer-lifetime-value

11
from finsilabs/awesome-ecommerce-skills

Calculate and track the net profit value each customer generates, then automate retention strategies for your highest-value segments using platform tools

accounts-payable-management

11
from finsilabs/awesome-ecommerce-skills

Manage supplier invoices and vendor payments with automated receipt matching, payment scheduling, early discount optimization, and reconciliation workflows

wishlist-save-for-later

11
from finsilabs/awesome-ecommerce-skills

Let shoppers save products to a wishlist, share it with friends, and get notified when saved items come back in stock or drop in price

storefront-theming

11
from finsilabs/awesome-ecommerce-skills

Build a themeable storefront with design tokens and CSS custom properties that supports white-labeling, multi-brand variants, and dark mode

search-autocomplete

11
from finsilabs/awesome-ecommerce-skills

Speed up product discovery with instant search suggestions, fuzzy typo matching, and category-aware results powered by Algolia or Elasticsearch

responsive-storefront

11
from finsilabs/awesome-ecommerce-skills

Build a mobile-first storefront with thumb-friendly navigation, sticky add-to-cart buttons, and touch-optimized components for high mobile conversion

recently-viewed-products

11
from finsilabs/awesome-ecommerce-skills

Show shoppers the products they recently browsed using browser storage so they can easily pick up where they left off on your store