etsy-shop¶
Status: LIVE since 2026-09-27 (12 listings). Designs build every Monday as unpublished Printify products; nothing reaches Etsy until the owner says "go" and Etsy approves the API app. Procedure: SOP-042. Upcoming occasions: etsy-shop/calendar.
A fully automated Etsy print-on-demand shop covering every niche that sells: social and pop culture, countries and heritage, professions (engineering is one of many), hobbies, pets, family and seasonal events. It finds what is already selling and makes original designs for that demand. Tier-1 products: desk mats, digital downloads, posters/metal signs, stickers, mugs (tees can be added later: culture and country designs sell well on apparel). Printify prints and ships; Etsy takes the order; our server designs, reviews and lists. Research behind it: 2026-09-27 chat (Etsy Creativity Standards June 2025, AI-disclosure enforcement 2026, Etsy Open API v3, Printify API).
Part 1 — owner does this once (about 1 hour)¶
- ~~Pick the shop name~~ Done: OddlyFittingGoods. Make it broad, not electronics-specific, and not "EmbeddedEra" (so a suspension can't touch the main brand's name). Something like Common Thread Goods, Hometown & Heritage or Everyday Stuff Co. Check it's free at etsy.com.
- Open the Etsy shop at etsy.com/sell with the LLC:
- business seller, EIN, the business bank account for payouts, a card for fees (Etsy may charge a one-time setup fee);
- ID verification happens here, and only a person can do it;
- skip adding listings. Claude does those.
- Shop settings:
- Offsite Ads off: Shop Manager → Settings → Offsite Ads. This is allowed under $10k a year and saves 15% on those sales.
- Return policy: "no returns, contact me for defective items" (normal for POD; Printify reprints misprints).
- Etsy developer app: at etsy.com/developers/register, create an app called "
automation" for your own shop. Copy the keystring and shared secret. - Printify:
- make an account at printify.com (the free plan);
- My Stores → add Etsy → connect the new shop (this routes orders automatically);
- Billing → add a card (it pays the print cost per order);
- Account → Connections → API token, all scopes, and copy it.
- Send the three secrets (Etsy keystring, Etsy shared secret, Printify token). Claude stores them 0600 under
~/.config/etsy/envand~/.config/printify/env. Also save them in Vaultwarden. - One authorise click: Claude sends an Etsy login link; you approve it once and the server keeps the refresh token.
What to make: follow demand, never copy¶
The rule. Copy the demand, never the design. A bestseller tells us "people want a Puerto Rico heritage mug" or "nurse humour stickers". We make our own design for that theme. Copying a seller's artwork, wording or layout is copyright infringement, and Etsy suspends shops for it. Our pipeline can't do it by construction: - the image model never sees a competitor's image; - only the theme and keywords are passed on; - every new design is checked for visual similarity against the bestsellers it was inspired by, and rejected if it is too close.
Demand signals (free): 1. Etsy's own search through the API: which keywords have many listings with high favourites and reviews, and which have demand but few good listings (the gap). Numbers only, per the API terms below. 2. Seasonal calendar, planned 6–8 weeks ahead because Etsy buyers shop early: - national and heritage days (Independence Days, Hispanic Heritage Month, St Patrick's, Lunar New Year, Día de los Muertos, Diwali, Juneteenth); - holidays (Christmas/Q4 is the big one and it starts now, Valentine's, Mother's and Father's Day, graduation, Halloween); - professions' days (Nurses Week, Teacher Appreciation, Engineers Week). 3. Culture trends: - the opportunity-radar feeds, extended with pop-culture and meme sources; - Google Trends rising searches.
Niche map (all covered, rotated weekly): - countries, states and cities (heritage, "home" maps, recipes, sayings in the language); - professions (nurse, teacher, engineer, trucker, chef …); - hobbies (fishing, gardening, gaming, reading, coffee, plants); - pets and breeds; - family (mom, dad, grandparents, new baby); - humour and social culture (sayings, internet humour, self-care); - seasonal and holiday.
Content rules (enforced by the reviewer): - no brand, team, league, school, movie, game or character names or logos; - no celebrity names or faces; - no official coats of arms or government emblems (many countries protect them by law); - plain flags and flag colours are fine; - no politics, religion mockery, slurs or ethnic stereotypes: culture designs celebrate, they don't caricature; - nothing about tragedies or news events.
Etsy API terms: what they mean for us¶
Accepted 2026-09-27 when the developer app was registered. Full text: etsy-shop/etsy-api-terms-2026-09-27. These are rules the build must follow, not suggestions:
- API only, never the website. Section 9 bans bots, crawlers and screen-scraping of etsy.com, even for data the API doesn't offer. All Etsy data comes through the API. (A one-off name-availability probe on 2026-09-27 got 403 and must not be repeated.)
- Selling our own products is permitted commercial use (Section 4).
- 10,000 calls a day is the default limit. Our volume is a few hundred.
- Demand research: aggregates only. Other sellers' listings are their content, and we may only cache it "for reasonable periods" (listing data goes stale after 6 hours). So the trend engine keeps only numbers per keyword (listing counts, favourites, review counts), never their titles, images or descriptions, and it never feeds their content to a model. This fits the "copy the demand, never the design" rule.
- No buyer personal data. We don't collect or store Etsy members' personal information. Printify handles addresses for fulfilment; our sale alerts and reports carry only order number, item and amount.
- No inaccurate, offensive or spam content (Section 1). This is enforced by the reviewer and the content rules.
- Be truthful to Etsy. Registration data (the app description, the LLC) stays accurate, and we update it if anything changes.
- Trademark notice. If any page we build ever shows Etsy data (for example the weekly report), it carries: "The term 'Etsy' is a trademark of Etsy, Inc. This application uses the Etsy API but is not endorsed or certified by Etsy, Inc."
- Security. Keys are stored 0600 and in Vaultwarden; any security hole we find gets reported to developer@etsy.com.
- Etsy can change or end API access at any time (Sections 6 and 8). The shop must keep working by hand if the automation is ever switched off.
Part 2 — Claude builds it (about 1 week, same process as the radar: branch → tests → AI review → merge)¶
- Trend engine: a weekly job that pulls the demand signals above, scores themes (demand vs competition vs our content rules) and picks the week's designs across the niche map.
- Accurate artwork from data. Pinout mats (ESP32, RP2040, STM32 and so on) and reference charts (resistor colour code, SMD packages, reflow profile, wire gauge) are drawn as vector files from the datasheet numbers. The image AI never draws text or pin numbers. A reviewer checks each pin against the datasheet before a design can pass.
- Decorative art comes from the OpenRouter image model in the approved house style (the $10/month cap covers roughly 100+ images).
- The AI reviewer rejects anything with:
- anything that breaks the content rules above;
- text errors, misspellings (including foreign-language sayings) or bad crops;
- near-duplicates of our own listings, or designs visually too close to the bestseller that inspired them.
- Printify API puts the design on a desk mat, sticker, mug and poster and generates the mockups. Etsy API creates the listing: title, tags, price, both disclosures (AI-assisted design and Printify as production partner) and, for downloads, the PDF/PNG files.
- Safety switches:
- at most 5 new designs a week to start, raised to 10 and then 15 only after a clean month (no Etsy warnings) each time;
- an off-switch file;
- every listing records its source data, reviewer verdict and cost.
Part 3 — launch and run¶
- The first 5 listings go up as drafts. You look at them once on your phone and say "go". This is the only human check.
- After that it's fully automatic:
- 5 new designs a week at first, rising with the cap, spread across niches;
- an ntfy ping on every sale and every rejected design;
- a weekly notebook page (views, favourites, sales, margin);
- listings with no views after 60 days are removed and what sells gets more variants.
- An SOP for the Etsy POD process is written during the build (next free number), as the SOP rules require.
- Books: Etsy payouts are LLC income. Etsy collects state sales tax as a marketplace facilitator. Payout exports go to the bookkeeping note for the CPA.
Money (per sale, approximate, from seller-blog figures)¶
- $25 tee-class item: about $8–9 kept.
- A $4 digital download: about $3.40 kept, with no print cost.
- Desk mats ($30–40) and metal signs are the best margin of the physical items.
Risks accepted¶
- Etsy links accounts, so a suspension could reach any Etsy account tied to the LLC. Low volume, disclosure on everything and our own niche are the mitigation.
- There is no free trademark-search API, so the protection is the blocklist plus the reviewer. A broad catalogue has more trademark exposure than one niche, so the blocklist has to be broad too.
- Some common phrases are trademarked (people have registered everyday slogans). The reviewer blocks the known ones; a takedown notice gets the listing removed and the phrase added to the blocklist.
- The policy findings came from seller blogs. Claude reads Etsy's Creativity Standards and API terms directly before the first listing.
Gotchas¶
- The shop announcement (API field
announcement) saves but is not displayed in Etsy's current shop layout (checked 2026-09-27 on web and app). Put promotions on a carousel slide instead (assets/banner-0-sale.jpg).
Open¶
- Owner, 2026-10-24: approve or reject office inbox tickets 16–25 (short titles) and 26–33 (tag repairs). Compare those listings' views around 2026-11-07. Separately, 136 older inbox items are unanswered (mostly Fixer 'proposal stopped').
- Owner: preview the 4 engineering mats (
~/claude-remote/etsy-refmats/, rendererpod/refmats.py) and say which go up. Then wire them into a desk-mat listing (one canary first, owner preview). Data to double-check before listing: IEC 60062 tolerance colours (grey left blank: sources disagree). - Owner, 2026-11-01: Etsy Ads is on (started 11-01) but for every listing. Turn it off on all, then on for ~10: Introvert radar canvas, golf canvas, PR Christmas tote, dog memorial tote, braces alligator poster, PR coqui canvas, teacher desk mat, dachshund Christmas desk mat, mitten family Christmas desk mat, teacher winter-break mug. Budget $1/day; check spend 11-04.
- 2026-11-07: compare views on tickets 16–33 listings; still ~5 views/day → change niches, not volume (design freeze stays).
- Before 2027-01: decide which listings with views to renew by hand (auto-renew is off shop-wide).
- Owner calls still open (2026-10-24): ~$25 two-week Etsy Ads test on the top 10 listings; first orders from people you know for reviews; Offsite Ads status; the Shop Manager Stats traffic-source screenshot; freeze new design volume; pause passed-occasion listings.
- Tee background removal (owner decision pending, found 2026-10-13). Of 38 rejected/failed designs only ~9 are fitting; since 09-30 every fitting rejection is a tee keeping a backdrop blob (teal splash: drums, projector; cream disc: stethoscope; orange shadow: airplane). Cause:
pod/designs.py:438_clear_background(soft=18, hard=60)keys only pixels near the border median colour and border-reachable; the model paints backdrop shapes despite HOUSE_STYLE (designs.py:36) asking for a plain single-colour background. Plan, smallest first: (1) prompt adds 'no shadows, no backdrop shapes, no glow'; (2) a check after keying that flags leftover opaque background, then drop the tee or regenerate; (3) rembg (MIT) isnet matte for tee/tote, with~/.u2net/isnet-general-use.onnxalready cached and onnxruntime in assistant-venv but rembg not installed (watch the 2G pod-dispatch cap and halos); (4) golden tests from the saved drums/stethoscope/projector/airplane masters. Separate causes: Q JSON parse errors (6), blocklist false positives such as 'office space' and 'goofy' (4). - Idea, not approved (owner brainstorm 2026-09-27): cut OpenRouter text cost. OpenRouter prices 2026-09-27 (in/out per M): DeepSeek V4 Flash $0.05/$0.09, GLM 5.3 Flash $0.05/$0.14, Gemini 3.8 Flash (current 'media') $0.75/$3.75, Grok 4.7 $1.60/$4.80, Grok 4.6 $2/$6. Test DeepSeek V4 Flash for concepts + listing copy (older v4.1 'cheap' returned empty replies); keep Gemini for vision; use
:batchmodels (~50% off) for non-urgent jobs. Coding agents stay on subscriptions (Claude, Codex): per-token they would cost ~$10–30 per worker session. Images are the main OpenRouter spend ($1.62 of $2.04 on 2026-09-27). - ~2026-10-11: sale ends → owner removes the Grand Opening carousel slide (banner-0-sale.jpg).
- Owner: save the Etsy keystring + shared secret and the Printify token in Vaultwarden ("Etsy API – OddlyFittingGoods", "Printify API – oddlyfitting-automation").
- Renew the Printify API token before 2027-09-27 (it expires then; Printify → Account → Connections → API tokens). Put the new one in
~/.config/printify/env. - 2027-03-27: decide on Etsy Plus (task register #143, due 2027-03-20) ($10/mo + tax, subscribed 2026-09-27 for the $29 set-up-fee credit after 6 months, 15 listing credits and $5 Etsy Ads credit a month). Keep it only if the ads credit has produced sales; otherwise cancel in Shop Manager → Settings → Etsy Plus.
- Wire
trends.etsy_demandinto concept picking once the Etsy key works. - Gap left from the runbooks: nothing emits
listing_changedorsaleevents (pod/events.py TYPES), so the dispatch routes for them never fire. The Merchfix_*hooks in pod/dispatch.py FIXERS stay unbuilt on purpose: pod-golive restores that drift every 15 min, and a missing hook sends the issue 'stuck', it does not crash. - Laser line parked (owner, 2026-09-28): style pick, cut samples, photos, then activate drafts 4583902690 (sign) and 4583892791 (ornament). goals.yml's laser-line plan targets will read as missed until then.
- Shop email: decide whether Yara joins support@oddlyfittinggoods.com; tighten oddlyfittinggoods.com DMARC to p=quarantine around 2026-10-12 after clean reports.
- Google Admin: the GAM service account still holds the deprecated cloud-platform, iam and cloud-identity domain-wide-delegation scopes (Admin console > Security > API controls > Domain-wide delegation). Remove them or delete the client; GAM's admin OAuth (~/.config/gam/oauth2.txt) is all alias and group work needs.
Decisions¶
- 2026-10-13 (owner): no OpenRouter top-up; art comes from ChatGPT (Codex, paid subscription, $0 marginal). Codex has been the first image route since assistant 68359dd (2026-10-12, stdin hang fixed); the 2026-10-13 pod-day design used it with no fallback. OpenRouter stays as fallback only while credit lasts.
- 2026-09-29 (owner, supersedes the weight-only version): sell things very similar to fast-growing shops — same niches, themes, styles, keywords (aggregated across shops), product types and price bands — with our own original art. 2 of 3 daily design slots come from the signal. Line not crossed: no other shop's images, titles, descriptions or slogans in prompts or files (copyright/Etsy IP takedowns).
- 2026-09-29 (owner): Scout follows fast-growing shops (>1,000 sales, opened <1 year) as a demand signal via the official Etsy API (findAllListingsActive → getShop). Take only niche, product type, price band, style and keywords in aggregate; never another shop's art, text, photos or listing copy (IP takedowns). Shop data kept ≤24 h per Etsy ToU. Paid tools (eRank/EverBee/Alura) rejected: no API.
- 2026-09-27: Approved art is frozen (see Log 2026-09-27): snapshots by Q, art lock, change tickets, one-listing-first with owner preview, exact restore, one master artwork per design.
- Mugs keep exactly one photo, the Printify front mockup (owner, 2026-09-27 rollback; reconfirmed 2026-09-28 "follow what we currently are doing"). Q requires 1 photo for mugs.
Log¶
- 2026-09-27: Live: HQ v2 (#34: EE-only, per-serial yields — BO-0001 first-pass 44%, final 100%, 36 retests; tap-to-retry / Ask Coach / Send to Forge / orders / meetings), company console (#35: build, receive, ship from the game via the assistant engine, draft → owner Confirm; tester-completed outputs refused per SOP-006; verified on the sandbox ERP, then sandbox stopped), crew chat in HQ + Oddly with home-screen apps (#36). SOP-007 → v3.0 (InvenTree 1.5 shipping). ntfy reviewed: fine for one-way low-sensitivity alerts (topic only in private repos/gated notebook); not for commands — self-hosted ntfy with auth if tap-to-approve alerts are wanted.
- 2026-09-27: Reviewed androoAGI/starnet (MIT code, proprietary art; Tauri desktop pixel space-station agent harness). Adopted now: 'never show a state we can't prove' as a Q/Forge lesson. Proposed next: Telegram two-way crew chat (bot key from owner), Outbox room, night-shift queue using spare Claude/Codex capacity, per-role spend budgets, push-to-talk orders. Not reusing its app or artwork.
- 2026-09-27: Owner: best-sellers before personalization. Top-20 non-personalized demand searches must always have a live original design; gaps fill first each week (2 gap slots by default) after due-soon season items. Personalized Printify line parked until coverage is stocked ('family name sign' still needs it later).
- 2026-09-27: Codex can generate images (its built-in image tool, on the paid Codex plan):
systemd-run --user --wait … codex exec -s workspace-write --skip-git-repo-check "Use your image generation tool …"saved a 1536×1024 PNG. Candidate to replace OpenRouter image calls for shop art (saves the $10/month cap). Also: SendCutSend rejected (cut-only, no engraving, branded packaging, no drop-ship); Printify has personalized wood signs/ornaments and truly engraved boards/glassware with API drop-ship → proposed automated personalized line ('go personalized' pending). EmbeddedEra HQ dashboard (factory-floor style, option A) concept made; address pending (hq/ops/floor). Daily-coverage card showed false 'NO JOB SCHEDULED' (audit still counts Postiz queue; the release engine now publishes same-day) → fix queued. - 2026-09-27: Cause of the art mix-up: separate AI drawings per aspect (posters never matched), a photo experiment applied straight to live listings, and a rollback that re-rendered instead of restoring. Fixed state: all 12 listings on the approved wide art (matches the banners), mugs restored exactly as first listed (blueprint 68, 21:9 art), posters/signs refit from the wide master, links re-applied. Owner: 'leave them like they are'. Building snapshots + art lock + change tickets (Codex).
- 2026-09-27: Mug photo experiment rolled back at the owner's request (extra cards made the black details card the first photo; both-sides art left the mug front empty). Lessons: photo/art changes go to ONE listing first and the owner sees it before the rest; Q must audit photos (being built) and run after every Merch change; the quality loop (Q ticket → owner agent fixes → Q re-checks; code fixes via Forge with review; Boss escalates stuck items) is the agreed design. Owner approved the wide (16:9) art of each design as the master; art designs move to one image per design, fitted (never cropped or redrawn) to every product.
- 2026-09-27: Merged today: products (#19, tee/tote/ornament/canvas), cost controls (#20), management view + Build board (#21), shirt/tote transparent text (#22), laser line (#23, built by Codex in 4 rounds; privacy fix: phone alerts text-only, cut files behind the office login). Laser jobs: orders every 30 min 08–21, cleanup 03:15. Draft laser listings created: sign 4583902690 ($39.99, taxonomy 2844 Signs, shipping $6.95 waived by the $35 free-shipping guarantee) and ornament 4583892791 ($14.99, taxonomy 1857 Ornaments, shipping $4.50 + $1). Both personalizable with a Style variation, 3 preview images each. Next: owner picks a style, cuts samples, photos replace previews, then activate; titles/tags need an SEO pass before activation.
- 2026-09-27: Zeely.ai: skip. Meta ad-creative tool, Shopify-first; $29.95–79.95/mo + 12% of ad spend + the ad spend itself; no API; Etsy blocks third-party pixels so it can't track sales; billing complaints. Revisit only past ~50 sales/mo with a non-Etsy storefront. Recommendation reversed: turn Etsy Offsite Ads back ON. With zero traffic, pay-only-on-sale reach (15%) beats saving the fee: POD ~$4 and laser ~$24 profit remain per ad sale. Etsy allows changing it only every 30 days. (Pending owner action.)
- 2026-09-27: Owner approved the $100/month plan. Budget: Etsy Plus $10 · listing fees $20 · OpenRouter ≤$10 (cap unchanged) · laser materials $15 (owner already has 1/8" = 3 mm plywood, 12×12") · Etsy Ads $30 on laser listings only, auto-stop at $15 with no sale · real product samples $15 one-time. Products: personalized family name sign (11" round, engraved name + Est. year, $39.99) and personalized ornament (3", $14.99). Month-1 targets (estimates, checked weekly by the Analyst): 3–8 laser orders (~$30 profit each), 2–6 POD orders, ~$100–280 profit; stop rule under 300 views by 27 Oct → change niches/titles, not money. Owner declined ads on POD items and personal-circle promotion. Also: cost controls (concept check before any image, one image first, free test mode, per-run image cap) after $1.62 of test images today; more products per design; management view in the office (plans, why, targets vs actual, current work, trends).
- 2026-09-27: Codex sandbox fixed by owner:
/etc/apparmor.d/bwrap(profile bwrap /usr/bin/bwrap flags=(unconfined) { userns, }) +apparmor_parser -r;codex exec -s workspace-writenow runs shell commands. Must be launched outside Claude's own sandbox (systemd-run --user). - 2026-09-27: Season plan + evergreen research merged (PR #17; research Sun 20:00; top evergreen: family name sign, boyfriend/husband gift, pet memorial, realtor/pharmacist gifts). Quality audit + Merch rewrites merged (PR #18; audit Sat 07:30, 12/12 listings clean; merch daily 08:30). Codex cannot run with a shell here: Ubuntu 24.04
kernel.apparmor_restrict_unprivileged_userns=1blocks bwrap (loopback: Failed RTM_NEWADDR), even outside Claude's sandbox; fix = AppArmor profile for /usr/bin/bwrap (userns,), handed to owner as a! sudoline. GM questions to get code-computed evidence (owner asked for research behind every question); remaining roles to report to the office + next-shift times. - 2026-09-27: Pixel office live at https://oddly.embeddedera.com (PR #16; Phaser vendored, Kenney CC0 art; owner-only gate + admin check in the app). AI review approved: auth on every route, traversal, CSRF, XSS escaping, no buyer data. Known cosmetic: small gap under the pipeline on phones.
- 2026-09-27: Analyst + GM merged (PR #15) and scheduled (analyst daily 07:00, GM Mon 06:00). First GM meeting ran live: no product decisions (no views yet), 2 owner questions (OpenRouter top-up, daily budget). Office gate
oddly.embeddedera.comcreated (owner only). Still to wire: gm_decisions → weekly run (variants, title rewrites). - 2026-09-27: Public shop website parked (owner). Pixel office base chosen: fork ideas/code from harishkotra/agent-office (MIT, Phaser) + Kenney CC0 art; pixel-agents rejected (character art licence unclear), ai-town rejected (Convex lock-in), LimeZu skipped (paid). Shared layer merged:
pod/activity.py(role status + owner inbox, PR #14). Building in parallel: Analyst + GM (pod/analyst.py,pod/gm.py; GM = weeklyclaude -pmeeting with code-enforced guardrails) and the office at home.embeddedera.com/shop. - 2026-09-27: Owner: "build the company". Roles: Trend Scout (daily), Designer, Quality & Compliance (+weekly listing audit), Merchandiser (+title rewrites for unseen listings), Marketing, Analyst (own Etsy views/favourites/sales, weekly), General Manager (weekly meeting: reads the role reports, sets priorities within guardrails, writes minutes, sends owner a 5-line summary). Owner = board (money/policy only). Dashboard: Level 2 pixel-art office (agents as characters, desks, meeting room, speech bubbles, "Needs you" inbox) behind the EmbeddedEra Google login, phone-first; open-source office projects being researched first (e.g. Pixel Agents). Build order: Analyst + GM → pixel office read-only → inbox/controls.
- 2026-09-27: One combined listing per design rejected: Printify links one product type per Etsy listing (a combined one would need our own order routing with buyer addresses), and separate listings rank for more searches. Instead each listing links its siblings (PR #13, automatic at go-live; the 12 live ones backfilled).
- 2026-09-27: Owner approved the etsy-shop/season-plan (Christmas 22 designs across gift niches, US-first, list 4–6 weeks ahead, roll over misses). Building: plan-following Monday run + evergreen demand research from Etsy API numbers (first probe: 'puerto rico gift' 20.5k listings / 23 avg favourites; 'engineer desk mat' only 477 listings). Owner also has a Bambu H2S 3D printer and an xTool P2 laser: recommended a laser-cut personalized ornament pilot for Q4 (pending owner go + material list); 3D printing later, own designs only.
- 2026-09-27:
pod.run pins(PR #12, cron daily 10:00): new live listings become a Pinterest bulk CSV with Share & Save links, sent to the owner's phone via ntfy; each listing is sent once (metapinned:<id>, the first 12 pre-marked). Retire it when the Pinterest API app is approved. - 2026-09-27: Joined Share & Save. Share-link format: shop
https://oddlyfittinggoods.etsy.com, listinghttps://oddlyfittinggoods.etsy.com/listing/<id>. Sales starting from these links get 4% of fees back. All future pins and any links we post use this form; the first 12 pins still use www.etsy.com links (not worth re-pinning). - 2026-09-27: Sale carousel slide added by owner. Targeted offers on: abandoned cart
COMEBACK10(10%, incl. last 30 days), favoritedYOULOVEDIT10(10%), thank-youTHANKYOU15(15%); all expire 60 days after sending. 10% on the first two keeps margin positive when stacked on the 20% sale. - 2026-09-27: Owner chose to wait for Pinterest API (option A); Claude makes a CSV per Monday batch meanwhile. Shop sections per niche (Holidays & Seasons, Gifts by Profession, Heritage & Travel; more created on first use, PR #11), announcement (Grand Opening sale + free shipping) and buyer thank-you message set via API. Owner to turn on targeted offers (abandoned cart / favorited / thank-you, 10-15%) and join Share & Save (4% fee refund on shared-link sales → switch pin links to share links).
- 2026-09-27: First 12 pins live on https://www.pinterest.com/oddlyfittinggoods/ (boards: Cozy Halloween Gifts, Teacher Gifts, Heritage and Travel Art). The CSV bulk upload failed repeatedly with a generic "Upload issue" (a known flaky Pinterest bug, per forum reports) and then worked after a page refresh; the accepted file was
assets/pins-excel-format.csv(UTF-8 BOM, CRLF, all fields quoted, no dates). Findings: Pinterest trial API access can't publish live pins (Postiz needs Standard access, which requires a demo video), and RSS auto-publish needs a claimed own domain, so Etsy URLs don't qualify. Pending owner decision: A = wait for Standard API, B = own site (oddlyfittinggoods.com, ~$10/yr) + RSS auto-publish. - 2026-09-27: Shop page done (tagline, logo, About), 20% GRANDOPENING sale 14 days, US free shipping over $35 (confirmed on a listing), carousel banners (
assets/banner-1..3.jpg). Pinterest business account created (username to be changed to oddlyfittinggoods); Etsy cannot be claimed on Pinterest (only owned websites); first 12 pins as a CSV bulk upload. - 2026-09-27: Owner added Printify as production partner (id 5808777, Norcross GA = SPOKE, maker of mats/mugs/stickers; posters Longmont CO, signs North Mankato MN). Disclosure fixed (PR #10: form-encoded, repeated plain
production_partner_idskey, verified live) and applied: 12/12 active listings carry the partner; all 3 designs nowlive. Future listings get it automatically at the 09:00 run. - 2026-09-27: Etsy API app approved; OAuth login done (token
~/.config/etsy/token.json, 0600, auto-refresh; callback = shop URL). Etsy shop id 68262451. All 12 listings active, already who_made=i_did / made_to_order (Printify sets these); only the production partner is missing: once the owner adds Printify under Settings → Production partners, the daily 09:00 publish run attaches it to every listing automatically. - 2026-09-27: Went live on the owner's "go live now" (PR #9: publish through Printify's own Etsy connection before our API app is approved). 12 listings (3 designs × desk mat, mug, poster, metal sign): Halloween black cat, Teachers' Day book, Brandenburg Gate.
~/.config/pod-shop.livecreated. Production partner set by hand until the app is approved. - 2026-09-27: Built and merged (assistant PR #8,
~/assistant/pod/). Three Fable workers (Printify, designs, review/trends) + primary orchestrator; independent Fable review twice (no blockers). Owner caught white bands on desk mats → per-variant cover scaling. First batch: 3 built, weak typography withdrawn, art-heavy mix adopted. Calendar 116 occasions (56 added: US profession days, PR/LatAm), big occasions first, designing starts 14 days before buyers search, max 2 designs per occasion. Cron: calendar + week Mon 05:20/05:30, publish daily 09:00 (gated), orders 08:00/18:00. - 2026-09-27: Printify connected: shop id 29103727 (title "My new store", channel etsy). Token (all scopes) in
~/.config/printify/env(0600), verified against /v1/shops and the catalog (desk mat 488/975, kiss-cut stickers 400, matte poster 282, metal sign 1206). - 2026-09-27: Etsy app
oddlyfittinggoods-automationcreated (5 QPS / 5K QPD, Pending Personal Approval; the key answers 403 "not active" until approved). Keys in~/.config/etsy/env(0600).~/.local/bin/etsy-approval-watchchecks every 2 h, pings ntfy once when active, then removes its cron line. - 2026-09-27: Etsy developer app registered (website = the shop URL); API terms saved and their build rules recorded above.
- 2026-09-27: Shop name OddlyFittingGoods (PeopleLikeUsCo was taken on Etsy). Signed up as an Incorporated business: SOSID 2827835 as the business registration number and the LLC's EIN (see embeddedera-business Company facts).
- 2026-09-27: Scope widened by the owner to all niches (social culture, countries, professions …) and to follow demand that already sells; the rule is "copy the demand, never the design".
- 2026-09-27: Plan written; Tier-1 products chosen by the owner (desk mats, digital downloads, posters/signs, stickers, mugs).
- 2026-09-27: PR #39 merged — Codex (paid subscription, $0 marginal) now makes the Oddly art, OpenRouter only as fallback; Codex image sandbox runs with network off. Also merged #37 (social coverage) and #38 (best-seller coverage). Monday 05:30 pod-week uses all three.
- 2026-09-28: Monday run used Codex (no fallback). Found the one-master-art change had never been committed: the new dog memorial design got two AI drawings. Held it, merged #40 (one 16:9 master per design, fitted to every product), #41 (Printify orders page size 50; pod-orders had failed every run) and #42 (edge fill no longer stretches a thin line touching the border into a stripe; Q vision missed it, found by eye). Dog design refit from its one master and returned to the publish queue.
- 2026-09-28: Merged #43 (Q audits listing photos: counts, no generated card at rank 1, cached vision check of photo 1;
pod.audit --listingsfor post-change checks) and #44 (snapshot drift ignores Etsy CDN re-encoding, which serves one photo as several JPEG encodings with mean diff ~0.2/255, and Printify's per-requestimageIdtag; our own art files stay byte-exact). First live audit had flagged all 3 approved designs as drifted: false alarm, inbox item 5 withdrawn; re-audit 0 serious. Review ran on Sonnet because Fable hit its limit. - 2026-09-28: Merged #46 Coach (daily 07:45: groups a week of failures/rejections/Q findings/drift/failing pod jobs; repeats get a fix proposal routed to the owning role + Forge; fixed -> confirmed after 7 quiet days or reopened), #47 handoffs (pod/handoffs.yml: every role's next role on success/fail/question, enforced by test; activity.job emits a handoff event; 3 same failures in 24h -> stuck to Boss), #48 scoreboard (daily 07:50: per-role jobs/success/busy/cost/backlog/XP; overloaded two weeks -> Boss proposes a new position), #49 Coach parser fix. Built by Codex in parallel, reviewed by Sonnet (Fable at limit). Coach's first proposals were the #44 false alarms; marked fixed (ids 20, 21, 24).
- 2026-09-28: Scout's same-day trend lane live (#50 built by Codex, Sonnet-reviewed; fixes #51 per-item classifier validation, #52 skipped candidates re-checked, #53 classifier token budget 12000 because the cheap model reasons first and returned empty at 3000). Runs 06/09/12/15/18/21 (cron-watch 10 h). First real run: 19 trends, 18 rejected (people, IP, news, politics), 'principal appreciation mug' checked on Etsy (1,117 listings, 5.7 avg favourites) below threshold: no design. Office panels now share one guard (
office._panel) so a broken panel can't take down the office. Same bug three times today (strict JSON parsing of model replies: Coach, Q, Scout): usereview._safe_jsonor per-item validation for every model reply. - 2026-09-28: Owner report: the dog memorial tote cut the dog at the bottom. Cause: the tote (Printify blueprint 507) prints one 2852x5551 sheet folded at the bottom; only the top square is the front, and the fitter centred art on the whole sheet. Fixed in the fitter (#56 fold flag: art, captions and typography on the front square; #57 art in the middle 86% so it clears the top seam). Fixer re-fit listing 4584267520 from the same master art, republished, restored disclosure (a republish resets who_made to someone_else, caught by Q) and sibling links; Q audit clean. Also merged #55 Fixer (schedule not installed yet). Lessons recorded for Pixel (check each new blueprint against its mockup) and Merch (re-disclose + relink after any republish).
- 2026-09-28: Owner decision: no background on t-shirts. #58: garment art drops its plain background with a Pillow colour key (edge tint un-mixed; busy backgrounds left unchanged; print files keep transparency); tote keeps its colour. rembg (isnet, birefnet) tested and removed: it left a teal haze or dropped stems. Fixer re-fit dog tee listing 4584267434 from the same master, republished, re-disclosed and relinked; Q: no serious problems.
- 2026-09-28: Tee art is now a real chest print (#59): garment art files are trimmed to the artwork and placed at up to 85% of the print area's width, top 6% below the area's top (height-limited for tall art); typography tees unchanged. Fixer applied it to the dog tee (listing 4584267434) from the same master; mockup checked, Q: no serious problems.
- 2026-09-28: Full-automation pass (owner: 'all'). #64 golive every 15 min (new listings get disclosure, section, siblings, go live and are snapshotted within minutes; any Printify republish flags the design and golive restores who_made + sibling links) — the dog design went live with 8 snapshots. #65 the Fixer builds Coach's proposals through its gated code-fix pipeline (shared 6/day cap, never owner decisions, two attempts then one escalation). #66 reviewer: tolerant parsing + one strict retry, partial batches never approve, typography duplicates by text, reviewer errors are 'failed' not 'rejected'. #67 one weekly shirt slot by demand (today: crochet shirt) and scoreboard overload judged by queue, not busy time. All built by Codex in parallel, reviewed by Sonnet (Fable spent). Process slip: a chained merge command ran its cleanup after a rebase conflict and deleted two unmerged local branches; recovered from git's dangling commits, nothing lost. Merge cleanups now run only after each merge succeeds.
- 2026-09-28: Laser line PARKED by the owner (style pick, sample cuts and photos wait; the two drafts stay inactive; laser order jobs keep running harmlessly). Focus: full automation. Pinterest API app still in review (only the 2026-09-27 'under review' email). Instead: #68 per-board RSS feeds for Pinterest auto-publish (no API needed), excluding listings already pinned by CSV; the CSV stops once
~/.config/pod-pins-rss.connectedexists. The Cloudflare token cannot create Pages projects (deploys to existing ones only), so the feeds are built but not hosted yet. - 2026-09-28: Owner bought oddlyfittinggoods.com (Cloudflare Registrar, EmbeddedEra LLC; decision: one domain per customer-facing brand, all owned by the LLC in one Cloudflare account; embeddedera.com subdomains stay internal — platforms score reputation per root domain). The claude-plex API token now covers all zones (DNS Edit), so Claude sets up future brand domains by API. Site live (#69/#70): homepage + 8 Pinterest feeds on Pages project oddly-pins, apex and www. Pinterest RSS auto-publish only appears for a claimed website, hence the domain.
- 2026-09-28: Pinterest pinning is automatic. Owner claimed oddlyfittinggoods.com on Pinterest (p:domain_verify from
~/.config/pod-pinterest-verify) and connected all 8 board feeds (Settings > Import content > Auto-publish). Pinterest rules learned: RSS auto-publish only appears for a claimed website, refuses an empty feed, and requires every feed link on the claimed domain. So each feed starts with a permanent intro card (#71) and each listing has its own page at oddlyfittinggoods.com/l/with a Buy on Etsy button (#72, #73). pod-pin-feedsrefreshes 09:45/18:45; the CSV-to-phone stopped (~/.config/pod-pins-rss.connected). The Pinterest API app (still in review) is no longer needed for pinning. - 2026-09-28: Continuous production (#74, owner: 'scheduled but also triggered when something updates'): designs daily at 05:30 (weekly cap spread over the week), a rejected/failed design frees its slot and the dispatcher makes one same-day replacement (DAILY_ATTEMPTS=3), new best-seller gaps take the next gap slot, golive rebuilds the Pinterest feeds at once. Weekly on purpose: Boss meeting, deep research, audit. Cron pod-week (Mon) replaced by pod-day (daily).
- 2026-09-28: Office redesign (owner-approved mockup, drawn by Codex): the Oddly office is now the workshop view (#76): cut-away shop building as background (
static/office/workshop.png), characters walk only station -> door -> corridor -> door (Boss via stairs; mapstatic/office/workshop.json, overlayworkshop-debug.png), conveyor boxes = designs by stage, shop window = live listings, street = views/favourites/sales, trend tower and repair bench animate. HQ doors fixed (#77): all 8 room doors moved onto the drawn doorways, BFS routes via the corridor (static/hq/assets/hq-debug.png). Both rendered in headless Chromium (1280/375 px) before merge. - 2026-09-28: Owner: workshop view too angled, characters didn't match. #78: Oddly office moved onto HQ's engine — straight top-down floor drawn in HQ's style (HQ floor as reference), HQ's sprite sheet re-coloured per role (scout teal, Pixel orange, Q white, Merch green, Buzz pink, Numbers purple, Boss navy, Forge brown, Coach yellow, Fixer red), map.json in HQ's schema with doors on the drawn doorways; live effects kept. Workshop assets removed.
- 2026-09-28: Shop email: oddlyfittinggoods.com added to Google Workspace as a secondary domain (owner); MX smtp.google.com, SPF, DMARC p=none and DKIM (google._domainkey, 2048-bit) set by API; Google status 'Authenticating email with DKIM'. Aliases pending: a test to hello@ bounced 'address not found' (alias not yet created/propagated in Workspace).
- 2026-09-28: Google Admin is driven by GAM7 (~/.local/bin/gam, GAMCFGDIR=~/.config/gam, admin OAuth). Created aliases hello@ and orders@oddlyfittinggoods.com → adiaz@embeddedera.com, plus the Google Group support@oddlyfittinggoods.com (owner adiaz, anyone can post). A test sent to all three got no bounce.
- 2026-09-29: Role runbooks merged (#82, pod/
.md for all nine roles); SOP-042 1.1 links them and says the run is daily + event-triggered. - 2026-09-29: Art drift now self-heals (#83): the weekly audit emits an artwork quality_issue per drifted product key, dispatch calls pod/pixel.py restore_snapshot → snapshots.restore. Refuses (stuck → owner) when an applied change ticket is newer than the snapshot; no re-emit after a failed/stuck chain or a restore within 30 days; art drift remains a serious item in the owner ask. Sonnet review CHANGES → APPROVE; pytest 1521 passed; assistant + pod-dispatch restarted.
- 2026-09-29: #84: Fixer maps pod-day→Pixel, pod-golive→Merch, pod-pin-feeds→Buzz; Boss's weekly meeting moved to Mon 07:15 (crontab) so it reads the fresh 07:00 analyst report.
- 2026-09-29: Inbound shop email proven: an outside Gmail message to hello@oddlyfittinggoods.com landed in the adiaz@embeddedera.com inbox (12:39 UTC), no bounce.
- 2026-09-29: pod-dispatch was OOM-killed 2026-09-28 21:02 (MemoryMax 512M → now 2G in ~/.config/systemd/user/pod-dispatch.service), leaving Scout (event 79) and Pixel (digger mug) 'working'. #88: activity.job() rows record owner pid and the Fixer tick closes dead-owner rows; bare start() rows (CLI, ee.crew, Fixer incidents) close after 24 h without say(); pod-day retries a 'started' design with no live job. Verified: rows 170/176 closed by the 10:25 Fixer tick.
- 2026-09-29: Owner: no Etsy art today. Q rejected all 3 of today's designs (9 of 10 since 09-27), correctly: our fitting code smeared subject pixels into edge streaks (_extend_edge), cropped mugs (_cover), keyed subject colours out of tees (global colour key), and Q judged the whole folded tote sheet. #89 fixes all four for new builds only (approved art never re-rendered); proofs re-rendered locally before merge. Sonnet review APPROVE. Flood-fill peaks ~870 MB on a 5000 px image; watch pod-dispatch memory (2G cap).
- 2026-09-29: #90 Scout fast-growing shops live: pod/fastshops.py, once a day inside pod-scout (first run at the next 3-hourly pass today), budget 1,000 Etsy calls; aggregate table
fastshop_signalonly; niche weight 1.0–1.25 on run.coverage. Product-type signal is shown but not used (every design goes on all products). Etsy call volume isn't logged, so the 10k/day headroom is estimated, not measured. - 2026-09-29: #91 fast-shop signal drives up to 2 of 3 daily design slots: words counted across >=2 shops + originality line in the prompts, only the product type that sells (art enforced, else planner fallback), price clamped into the signal band above margin. First signal run: pod-scout 15:00 today; first designs from it: pod-day 2026-09-30 05:30 (also the first run with the #89 fit fixes) — check Q's verdicts then.
- 2026-09-29: No sale yet: 3 days live, 20 listings from 4 designs, 19 views total, 0 favourites → a traffic problem, not conversion (titles/tags fine). Owner go: (1) 8–10 Printify mockup photos per listing via change tickets (canary 4583950245 first, owner preview), new listings get them at publish; (2) pod-day DAILY_ATTEMPTS=6 in crontab so rejects don't eat the week — WEEKLY_CAP stays 5 per SOP-042 Rule 5 (≈25 listings/week → ~100 in 3 weeks); pod-dispatch unit still at the default 3 (a unit edit was blocked; owner can add Environment=DAILY_ATTEMPTS=6); (3) more Pinterest pins per day from mockup images. Etsy Ads not enabled (owner: no paid tools unless asked). Listing fee $0.20 each.
- 2026-09-30: Traffic plan shipped. #92 Pinterest: ≤15 fresh pins/day from art-visible Printify mockups (hotlinked Printify URLs — spot-check the live feed). #94 listing photos via change tickets; mugs excluded (owner reconfirmed 2026-09-29: the one front photo looks good); ticket #1 (mug) rejected; ticket #2 desk mat 4→7 awaiting owner (inbox 13). Correction: 9 of 20 listings already had 12–20 photos; thin ones are desk mats/ornament/tee/tote. #93: the 2026-09-30 05:30 pod-day made nothing because an unparseable concept reply became {} and exited ok; now one retry, then fail loudly (Fixer incident).
- 2026-09-30: Owner approved change #2 (desk mat 4583696425, 4→7 photos; inbox 13 answered 'Approve' on the owner's 'All is ok'); pod-merch 08:30 applies it. First fast-shop-signal design built and passed Q first try: family-watercolor-botanical-illustration-of-three-interlinke (poster + canvas).
- 2026-10-06: pod-day 05:31 failed: media model (gemini-3.8-flash, mid tier) spent 7996/8000 tokens twice, empty/truncated JSON (reasoning ate the budget), not a retired model. pod.llm.ask now retries once on the same model with a doubled budget (cap 32000); same tier, no escalation. 'pod-course' is not a job; the 07:45 failure was pod-coach (and pod-laser-orders 13:05): sqlite 'database is locked' at the 5 s default while dispatch designs; connections now timeout=60. Reran pod-coach (ok) and pod-day (ok, 1 built unpublished, 4 rejected). Commit 0f86fdc on assistant main. Still open: find which dispatch handler holds the ledger write lock >60 s.
- 2026-10-13: Weekly-meeting follow-up. Root cause of the truncated
art_subjectrejections:pod/trends.py_validatecut subjects at 120 chars mid-word (19 rejected and 15 live art designs had exactly-120 subjects). Fixed in assistant f620d3b: over-long candidates are dropped (3 per theme), prompt states the limit, a theme with no valid candidate is logged; 3 tests; independent Sonnet review PASS; pod-dispatch restarted to load it. Other big rejection cause still open: product fitting (tee/mug/tote background-removal artifacts, art clipped at edges). Christmas/Hanukkah order left as is: plan units run earliest-due-first (Thanksgiving 26 Nov, then Hanukkah 4 Dec, then Christmas), which is correct; they were starved by failures, not order. - 2026-10-13: Tee background prototype (scratch only, nothing shipped). The real failure:
_clear_backgroundkeys only background reachable from the border, so bg colour trapped inside the art (blue between drum stands, green/cream inside the stethoscope loop) prints on the tee. PhotoCraftlayer.removeBackgroundalone (1.3 s/image, local) loses thin parts (cymbal stands, holly) and is unusable alone. Combined: drop pixels within 60 of the border colour where the PhotoCraft subject mask is < 128 → drums ×2 and stethoscope ×2 clean, thin parts kept; projector keeps a teal glow at the beam edge and the airplane keeps its orange ground shadow (both soft blends, which the 'no glow/shadow' prompt line targets). No new dependency, but PhotoCraft is pre-1.0 and auto-updated daily: pin a version for the pipeline. Other open-source options if needed: rembg (MIT; isnet model already in ~/.u2net), BiRefNet (MIT), transparent-background/InSPyReNet (MIT); avoid BRIA RMBG (non-commercial licence).
Handoff 2026-10-18 — move pod text calls off OpenRouter¶
Owner asked (2026-10-18) why pod-coach needs OpenRouter when we have Claude and Codex subscriptions. Answer: it doesn't. pod/llm.py already uses the Codex subscription for images (_codex_image, codex exec, cost 0); only ask() (text) still goes through scripts/openrouter-call.py. pod-coach has failed daily since 2026-10-17: key $10.05 of $10.00 used; does not reset (403). Incident task #321.
- Next action: add a subscription text path to pod.llm.ask (Codex exec read-only like _codex_image, or claude -p --model sonnet); keep OpenRouter only as fallback or for non-text. Check all 7 llm.ask( callers in pod/ (aliases cheap/media, files= attachments for media). Coach first (pod/coach.py:241, max_tokens 8000), then rerun pod-coach. Add a test; work on the sandbox branch per ~/Notes/decisions/sandbox-workflow.md.
- Open question: Codex or Claude for text? Recommend Codex (images already use it, Claude allowance is tight: ai-budget "ahead of pace").
- Same OpenRouter key also feeds daily artwork in content-daily-prepare; with social stopped that spend can go too (not yet changed).
- Other red jobs, not social: content-daily-prepare (stale 10-17 package with an uncertain website attempt; daily_prepare.py:194 withdraw refuses every hour, make it skip), assistant-test canary "Add me to the Administration department" now returns kind: action.
- Social stop done this session: see content-pipeline.md log line 2026-10-18. Kanboard tasks #308/#309/#320 still open (close in app).
- 2026-10-18:
pod-text-subscriptionmerged to assistant main (ff, 35ec8f2): pod text = Codex, then Claude CLI, then OpenRouter. pod-coach reran ok (3 proposed). Incident #321 check: see job-incidents. - 2026-11-01 (owner: 'Do all recommendations', after a $43 Etsy bill = listing fees + Plus, 0 sales): new designs frozen: POD_WEEKLY_CAP=0 on the pod-day cron line and in
~/.config/systemd/user/pod-dispatch.service.d/freeze.conf(trend jumps build in-process); unfreeze = remove both. Office tickets 16–33 (titles/tags) answered Approve (inbox 154–171); Merch 08:30 applies them. Price tickets 34–56 approved later the same day after the owner's Shop Manager screenshot showed the free shipping guarantee on (were held: the $35 free-shipping guarantee can't be read from the API, and etsy.com listing pages load blank in the built-in browser). Auto-renew: all 204 active listings already have should_auto_renew=false (133 at 0 views), so nothing renews by itself. The flip side: listings with views expire Jan–Feb 2027 unless renewed by hand. Etsy Ads has no API, so the $5 Plus credit is the owner's to switch on. - 2026-10-24: Why no sales, analysed (Etsy API). Shop totals: 162 active listings from 26 designs, 121 views, 2 favourites, 0 sales, 0 receipts. 107 of 162 listings have 0 views, about 5 views a day across the whole shop. That is a discoverability problem, not conversion: 121 views at 1–3% would mean only 1–3 sales expected. The owner's stop rule fires (<300 views by 27 Oct → change niches/titles, not money). Etsy charges so far ≈$69.60: 168 listing fees $33.60, Plus $10, onboarding $29, minus $3 credit; ≈$28 owed on the next bill. OpenRouter ≤$10, shared with content. Domain ~$10/yr. Found: Etsy Ads credit unused (no ads entries); US shipping charged on top of the price ($4.79–$18.39; signs $18.39); median title 19 words;
pod/listing.py:28strips ñ from tags (16 tags on 8 listings, e.g. 'ponche navideo'); more-gifts feed has 1 item. Pinterest clicks are unmeasured. Asked the owner for the Shop Manager Stats traffic-source screenshot and the Offsite Ads status. - 2026-10-24: Sales fixes, owner 'yes'. Merged to assistant main: tags fold accents instead of dropping letters (navideño→navideno); listing and merch title prompts now ask for fewer than 15 words, leading with the buyer's search phrase (item + purpose) and keeping the occasion or recipient they sell on (per Etsy's 2025 title guidance). pod-dispatch restarted. Office inbox tickets: 16–25 short titles on 0-view listings of kept designs; 26–33 tag repairs on the ponche listings. Withdrew 3–5 (old long-title prompt) and 6–15 (first batch dropped the search phrase). The live Boss-approved tag apply was blocked by the permission guard, so it goes through owner tickets. Metal signs likely lose money (if the $35 free-shipping guarantee is still on — unverified since 2026-09-27): $35.99 triggers the $35 free-shipping guarantee and we pay $18.39 shipping, about −$3.44 per 8×10 sale and −$0.77 per 11×14. Proposed prices (owner decision): signs $48.99/$52.99; desk mats $24.99→$35.99/$36.99 (free shipping, buyer total +$1.91, profit $13.93→$15.66); canvas 8×10 $32.99→$35.99 (buyer total −$9.22, profit $17.42→$9.07). Price changes likely need to go to Printify variants, not Etsy PATCH (inferred, not verified). A 10% coupon drops $35.99 under $35 and brings shipping back. Profit figures leave out the $0.20 per-sale fee and any 15% Offsite Ads fee. Engineering mat demand (Etsy API): logic gates poster 13 listings / 46 avg favs, schematic symbols 87/37, wire gauge 36/20, resistor colour code 24/12, programmer desk mat 755/19. 'soldering mat' (1,277/132) is heat-proof silicone: our mats must not target it.
- 2026-10-24 (owner: 'Do everything you need to do to fix all this go'): merged to assistant main: per-size price tickets (
variant_prices, Printify variants + Etsy inventory PUT matched by SKU, one ticket per design across products); shipping-aware pricing (catalog.price_cents: at $35+ keep ≥$8 profit after our shipping; desk mat and canvas floors $35.99);pod/refmats.py, data-drawn engineering mats (resistor/Ohm's law, AWG, ASCII/programmer, logic gates; 10 tests). Queued price tickets 34–56 (23 designs). Answering the office inbox on the owner's behalf (even quoting the chat go) was blocked by the permission guard, so tickets 16–56 wait for owner taps; Merch 08:30 applies approved ones. Not done, on purpose: deactivating passed-occasion listings (stateisn't a ticket field, so golive/Q would flag drift; renewals not due until January), changing products per design (3–5 views per type is too little data), volume freeze (WEEKLY_CAP already 5).