Portfolio/Loved Already ClubMonday, June 29 at 8:13 AM EST
⌘KNotifications
Cy
LA
Brand· started 2026-04-17

Loved Already ClubACTIVE

Alexis Ren (brand face), Ricki (operates back-end / growth) · Last touched 2mo ago
North starRevenue + repeat-rate from the pre-loved athletic wear catalog.

Timeline

18 events · newest first
Jun 2026
Jun 14EVENT
Footer SMS signup broken — revived dead service + iti padding

Ricki reported "network error" typing a phone in the footer + "a box behind it." ROOT CAUSE: footer form (#lac-footer-signup) POSTs to https://app.cynthiaconcierge.com/alc-flows/subscribe → nginx 502 because the backing service alc-email-flows (~/projects/alc-email-flows, port 3221) was DEAD (silent casualty of the 2026-06-06 PM2 crash — drop-list signups bouncing since). FIX: pm2 start dist/server.js --name alc-email-flows + pm2 save (persisted, port 3221 bound, /health 200, public POST now reaches Shopify w/ correct CORS — verified). VISUAL: field uses intl-tel-input separateDialCode:true; the "+1" box sat at the input's left edge and typed digits overlapped it. FIX: scoped CSS in sections/lac-footer.liquid.iti--separate-dial-code .lac-footer-email { padding-left:64px } + dropdown z-index:200. Pushed live (theme 150305112233). Backup: backups/lac-footer.liquid.*pre-iti-padding-fix.bak. NOTE: couldn't render-verify the visual (storefront's infinite-scroll JS hangs headless Playwright) — Ricki to confirm. Drop popup modal (#lac-drop-modal in sections/lac-header.liquid) ALSO fixed: it already had padding-left:100px !important (ugly gap, not overlap) — tightened to 68px + added dropdown z-index:200. Its submit shares the same data-alc-subscribe→alc-flows endpoint, so the service restart fixed its network error too. Backup: backups/lac-header.liquid.*pre-iti-modal-fix.bak.

Jun 14EVENT
Pickleball/vintage-sportswear ad + market research (deep-research workflow)

103-agent deep-research run on best-performing ads + highest-revenue stores in pickleball/tennis apparel + vintage athletic resale, to mimic the winning playbook. VALIDATED: market big+fast-growing (women's apparel fastest segment 16.2% CAGR); branding>product is the lever; LAC's curated head-to-toe SET wedge is genuinely uncontested (all verified comps sell single pieces $4-57); winning creative = creator-led UGC not studio, hooks <3s; TikTok winners = home-catwalk try-ons + price hooks + sound-off lookbooks + silent <10s; avoid the discount treadmill (lean scarcity+authenticity). GAP (be honest w/ client): no verified live competitor ad URLs or per-brand revenue — those need live Meta Ad Library + TikTok Creative Center lookups (free; spy-kit URLs in doc). 5 plausible stats KILLED in verify (GRWM-top5, 78%-discover, UGC+22%CTR, etc.). Full report + 8-concept LAC ad playbook + spy kit: analyses/2026-06-14-pickleball-vintage-ad-research.md.

Jun 14EVENT
Phase 0 ad stills — AI house model locked (~6 Higgsfield credits)

First ad batch (4 ads: scarcity/value/versatility/empowerment, anchored on white Adidas set). Decisions: AI house model (new individual), real inventory as garment ref, reference-only consistency. Built house model in Higgsfield (nano_banana_pro) using REAL product photos as garment ref; Ricki picked v2-B (on-court, curvier/fuller-bust, tasteful for Meta/TikTok ad policy) — LOCKED, ref job_id a8d3c4f2-.... Generated 4 ad-look stills (consistent model, faithful set) → data/ad-stills-phase0/. Plan + scripts + Checkpoint-1 gate: analyses/2026-06-14-first-ad-batch-production-plan.md. NEXT: Ricki go → Phase 1 paid video (will get_cost preflight first).

Jun 14EVENT
Adidas Classic White Active Skirt Set (handle `c`) — new hero image

Uploaded a Higgsfield-generated lifestyle shot (model in the white Adidas racerback tank + three-stripe skirt) as position 1 on product 8949281554601, pushing the 7 original photos to positions 2–8 (none removed). Source: ~/already loved clubed higgsfiedl/hf_20260614_...png (1744×2336). Gotcha: the file was still downloading when first copied (caught it truncated at 5MB w/ black bar) — waited for the full 9.8MB valid PNG before uploading. CDN: adidas-white-skirt-set-hero.png.

Jun 14EVENT
Masonry feed → clamped-natural aspect ratios (no more cropped grid tiles)

The homepage Pinterest feed (lac_feed custom-liquid section in templates/index.json) was faking variety: each .lac-pin got one of 10 preset data-ratio boxes + object-fit:cover, so tall images got cropped. Replaced with each product's REAL featured_image.aspect_ratio, clamped via | at_least: 0.5625 | at_most: 1.25 (9:16 tallest, 5:4 widest), emitted as inline style="aspect-ratio:…" on .lac-pin-media. Inline beats the CSS data-ratio specificity AND cloneNode(true) carries it to infinite-scroll clones — so Liquid-only change, no CSS/JS edits. Verified live: 50 tiles render true ratios (0.747–1.0 currently, all uncropped). Backup: backups/index.json.20260614-143416.pre-masonry-natural.bak. Theme id 150305112233 (main). Reusable pull/push helper pattern via Admin Asset API in /tmp/lactheme/.

May 2026
May 7EVENT
FAQ page — full rewrite + nav exposure (issue #2)

Page already existed at /pages/faq (id=114703630505) with generic placeholder copy. Rewrote body in brand voice — sentence-case Q&A, native <details> accordion, 18 questions across 6 sections (The Club / Sizing & Fit / Condition / Shipping / Returns / Other). Sourced facts from existing shipping page (Encino CA origin, 1-2 day processing, free $75+, USPS/UPS, 3-5 day continental US) and refund policy (one-of-one → all sales final, 48hr damaged-on-arrival window). Hooks into existing assets: WELCOME10 code, FREESHIP code, drop-list signup [data-open-drop] attribute, contact + TikTok + Instagram. Inline <style> block uses brand red #c8322a for accents to match footer eyebrow + drop CTA. Header patched (sections/lac-header.liquid): added FAQ pill in desktop nav (between Saved and Search) and FAQ link under Returns in the More dropdown for mobile/overflow. Footer already linked /pages/faq in HELP column — no change. Marked for Alexis tweak. Backups: data/page-faq-body-backup-2026-05-07.html, data/sections-lac-header.liquid-backup-2026-05-07.txt. Push script: ~/ARK Workspace/lac-tiktok-test-1/push-faq.mjs.

May 7EVENT
PDP variant chips — per-variant OOS visibility (issues #3 + #4)

Alexis flagged: a Nike set (vintage-nike-grey-yellow-racerback-tank-shorts-set) had S+M variants with S sold out, M available — but customers could still click the "S" chip and only saw "Could not add" after hitting Add to Bag. Diagnosed: per-variant availability wasn't reflected anywhere in the UI. Hypothesis from Alexis ("top is small, bottom is M") was wrong about THIS product — it actually has two real Shopify variants S (qty 0) and M (qty 1), not metafield top/bottom. Same root cause as issue #3 generally though. Fix in two files: (1) templates/product.json custom_liquid — each chip now renders with data-variant-id, data-available, data-price; sold-out chips get class is-oos + · sold micro-label; CSS adds strike-through on .is-oos and muted state on .lac-buy-btn[disabled]; (2) assets/lac-polish.jsupdateVariant() now caches the original buy-button HTML and toggles between "Sold out" disabled and the original "Add to bag · $price" based on match.available. Verified live on the Nike PDP — S chip renders struck-through with sold label, M selected with active button. Tapping S now disables the button instantly. Backups: data/templates-product.json-backup-2026-05-07.txt, data/assets-lac-polish.js-backup-2026-05-07.txt. Rollback ready at ~/ARK Workspace/lac-tiktok-test-1/rollback-pdp-oos.mjs.

May 7EVENT
Size filter — sets with mixed top/bottom sizes now appear in correct pills

Alexis flagged: sets with different top/bottom sizes (e.g. Top: S, Bottom: XS) didn't show up under any size filter on collection pages. Root cause: filter Liquid in templates/collection.json only read product.options.Size variants — sets store sizes as metafields (custom.top_size, custom.bottom_size) so their data-sizes attr was empty. Patched the custom_liquid in two spots: (1) the collection-wide loop that builds the filter pill bar — now unions metafield top/bottom sizes into the pill set; (2) the per-pin loop — now appends metafield sizes to data-sizes. Verified live: pill bar now correctly shows XS (was missing before, no variant has Size=XS). Per-pin attrs now look like data-sizes="S,XS," for sets, so they match filters for both their top AND bottom size. Backup: data/collection-template-backup-2026-05-07.json. Patch script: ~/ARK Workspace/lac-tiktok-test-1/patch-collection-filter.mjs. Liquid gotcha encountered: for raw in _ts | split: ',' is rejected by Shopify Liquid — must assign to var first then iterate (assign _ts_arr = _ts | split: ',' then for raw in _ts_arr).

May 7EVENT
Created WELCOME10 discount code in Shopify

10% off, percentage across all line items, once_per_customer=true, no usage cap, no expiry, starts 2026-05-07. Mirrors WELCOME15's structure. Price rule 1330299797673, discount code 19983959392425. Stacks with FREESHIP. Wired into the welcome email HTML at services/lac-tiktok/welcome-email.html.

May 7EVENT
Welcome email HTML template — production-ready

Built email-client-safe HTML version of approved Variant A welcome (proper capitalization, table layout, inlined styles, web-safe fonts, hidden preheader, {% unsubscribe_url %} placeholder). Cream/black palette matches site. Saved at services/lac-tiktok/welcome-email.html and live preview at https://app.cynthiaconcierge.com/lac-tiktok/welcome-email.html (basic auth ricki/cynthia2026). Ready to paste into Shopify Email / Klaviyo / whichever channel Ricki picks. NEXT: identify which app he'll use + send catchup blast to 5 cold subs.

May 7EVENT
Welcome email — newsletter signup trigger

Audit: 6 newsletter subs (5 real + Ricki's test). All single_opt_in, none have first names captured, none have placed an order. Earliest sub (Lauren, Apr 24) has been silent for 13 days — no welcome, no nurture, no automation app installed (no marketing webhooks, no marketing_events, no Klaviyo/Shopify Email/Inbox detected via API). Existing discount codes: WELCOME15 (15% off, active since Apr 17) + FREESHIP (active). Ricki asked for a 10% welcome email on subscribe; voice locked from live site ("one of one. gone fast.", lowercase, "the drop", "the club", ✿). Drafted 3 variants (A short = recommended, B longer brand-story, C text-msg style) + HTML preview. Saved: notes/welcome-email-2026-05-07.md. Live preview at https://app.cynthiaconcierge.com/lac-tiktok/welcome-preview.html (basic auth: ricki/agent-creds). NEXT: Ricki picks variant + code (existing WELCOME15 vs new WELCOME10), confirms which app to wire (Shopify Email vs Shopify Inbox vs ManyChat), then I render to that channel + tee up a manual catchup blast for the 5 cold subs.

May 7EVENT
TikTok carousel automation — Pinterest harvest MVP

TikTok carousels (90s/Y2K vintage workout aesthetic) are working organically on @alreadylovedclub — Ricki wants to automate the sourcing→stitching→post pipeline. First step: validate Pinterest as the source of imagery. Built a single-file Node harvester (/home/cynthia/ARK Workspace/lac-tiktok-test-1/harvest.mjs) hitting Apify actor thirdwatch/pinterest-scraper via run-sync endpoint with IP pinning (Hetzner→AWS routing flap, same pattern as Nango/Supabase). Input: 5 keywords (vintage activewear, Y2K workout, 2000s athletic wear, vintage Nike, vintage adidas), maxResults: 150. Output: 147 usable image pins in 27s for $0.45. Domain mix: ~73% Pinterest user uploads (aesthetic stash), rest = depop/ebay/poshmark/freepeople (product refs). Bundled an index.html contact-sheet UI for human eyeballing — click + on each pin to mark, "copy URLs" dumps clipboard. Awaiting Ricki's selections to seed the vision-filter rubric next. Notes: actor input field is maxResults (global cap, NOT resultsPerQuery); response shape uses image_url / pin_url / pinner_username / board_name / alt_text (not images.orig.url like docs page suggests). Title field is sometimes {format, args} object — flatten before use.

Apr 2026
Apr 28MILESTONE
Folder created in clients/ structure

Backfilled from loved-already-club.md memory file.

Apr 17MILESTONE
Store launched

alreadyloved.club / 0xqrvw-jf.myshopify.com live. Shopify Payments activated (US, USD). Meta Pixel 954002844034429 live. Plan: Basic.

May 2026
May 5EVENT
Killed mailto scrape vector on /pages/contact

User flagged spam ("I added items to cart, do you ship to America/Europe?") hitting cynthia@cynthiaconcierge.com (the Shopify shop owner email). Audit: only leak surface was mailto:hi@alreadyloved.club in the page body — theme/footer/header all clean. Pulled the mailto button, kept intro copy, added contact-form block to templates/page.contact.json (Horizon block-based; submit button auto-injected via content_for 'block', no nested JSON). Live page now renders Shopify's native form (name/email/note → action="/contact"). Note: shop.email and shop.customer_email are READ-ONLY via Admin REST (PUT returns 406) — handed user the admin-UI path to flip both to alreadylovedclub@gmail.com manually.

May 5EVENT
Added size filter to collection pages

TikTok feedback: "why can't I shop by size". Patched templates/collection.json custom_liquid to render a horizontal pill bar (All / XS / S / M / L / …) above the masonry feed and filter pins client-side. Backup: data/collection-template-backup-2026-05-05.json. Bug fix: changed unless size_set contains val (substring match) to delimited needle so 'S' doesn't false-match against 'XS'. See notes/2026-05-05-tiktok-feedback-fixes.md.

May 5EVENT
USD currency — not yet fixed

Same TikTok comment: "can't see USD as a price option". Cause: ROW market has localCurrencies=true and custom lac-header has no country/currency selector. marketCurrencySettingsUpdate blocked under unified markets — needs marketUpdate instead, AND user choice between (A) disable local conversion, (B) add selector, (C) both. Awaiting decision.

May 5EVENT
Disabled local currency conversion on Rest of World market

TikTok commenter said "can't see USD as a price option" — diagnosed as: ROW market had localCurrencies: true so non-US shoppers were getting auto-converted to GBP/EUR/CAD/etc, with no currency selector in the custom lac-header to switch back. Fix: marketUpdate(id:..., input:{ currencySettings:{ localCurrencies: false }}). Now ALL shoppers worldwide see USD prices. Required marketUpdate (not deprecated marketCurrencySettingsUpdate) because unified markets is enabled.