Shop

## Category Description Every PupTrace piece — necklace, ring, keychain or urn — starts the same way: you upload a photo, an artist hand-draws your pet's portrait from it, and we laser-engrave that artwork onto 316L surgical steel. Pendants come in rhodium, 18k gold, 18k rose gold and black plating. Pick by shape, by metal, by price — or browse everything below. This is the full catalog. If you already know your pet's species or the piece type you want, the category links in the main navigation will get you there faster. All orders ship with gift-ready packaging. Free US shipping on orders over $60. ## Internal Linking Plan | From Page | Anchor Text | Link To | |-----------|-------------|---------| | this page | Necklaces | /collections/personalized-necklace | | this page | Rings | /collections/personalized-ring | | this page | Keychains | /collections/personalized-keychain | | this page | Cremation Urn Necklaces | /collections/pet-cremation-necklace | | Footer "All Pet Memorial" | All Pet Memorial | this page | | `/shop` redirect | — | this page | ## Copy Rationale **Why this page exists (2026-05-23):** The main nav is category-first (Necklaces / Rings / Keychains / Cremation) for cold-traffic conversion — focused category landing beats generic shop-all per 2026 DTC best practice (ESW). But returning users want a "see everything" entry; footer "All Pet Memorial" + /shop redirect both point here. Mejuri's /collections/shop-all is the model — flat grid + filter rail across the whole catalog, ~30 SKUs is the comfort zone. **Pre-existing route bug (resolved this commit):** `/collections/all` previously rendered Hydrogen's starter `all.tsx` (165 lines, no FilterRail, no Sort, no Hero) because the file shadowed `$handle.tsx`. Storefront API doesn't auto-expose `collection(handle:"all")` (that's a Liquid-only convention), so the starter file did a top-level `products(first: N)` query that lacks the `filters[]` data FilterRail needs. Fix: create real Shopify collection `handle=all` via this SSOT, delete starter file, let `/collections/all` fall through to rich `$handle.tsx`. **Why manual product_slugs (not smart collection):** commerce-cli only supports manual collections today (`src/drivers/shopify/api/collections.ts` `createMinimalCollection` — no `ruleSet` support). When a new product ships, append its slug to this file and re-run `cli collection sync push`. If maintenance friction shows up (≥2 missed products), upgrade commerce-cli to support `product_slugs: ["*"]` sentinel or full smart-collection `ruleSet`. **Meta title / description:** - meta_title 60 chars: leads with "All Pet Memorial Jewelry" (matches footer label exactly) + "Hand-Drawn Portraits" (brand differentiator) + "| PupTrace" - meta_description 170 chars: enumerates 4 product types so SERP snippet covers all category-intent queries; reuses locked phrase "Free US shipping on orders over $60" verbatim (per CLAUDE.md content discipline — single-source phrase, no drift) **End-CTA H3 em phrase intentionally null:** $handle.tsx renders `EndGridCTA` with TEMPLATE fallback when `endCtaH3EmPhrase` is null. For the all-products page, a single em phrase like "the rest is handmade" (necklace) or "and goes everywhere you do" (keychain) doesn't fit cross-category — the END CTA stays minimal here.
Skip to results list

Active filters:

stock
Price
to
The highest price is $95.98
Clear
Plating swatches
48 items
Column grid
Column grid

Filter

Active filters:

stock
Price
to
The highest price is $95.98
Plating swatches