[cron:6dd85dd2-28ce-411f-b2de-8106e314da47 Deal Post - X + Pinterest (every 30 min)] SCHEDULED TASK: Post 1 deal to X and Pinterest.

## CRITICAL: Use GHC profile ONLY
- SOCIAL_PROFILE=/home/crogers2287/.social-poster-profile-ghc
- NEVER use /home/crogers2287/.social-poster-profile/ (that's @cannadealsfl)
- NEVER use Maya VM twikit or cannadeals cookies

## MANDATORY: Hash-based duplicate prevention
1. Run: python3 scripts/posted_db.py check <deal_id> x
2. If POSTED:YES — SKIP, pick another
3. After post: python3 scripts/posted_db.py record <deal_id> <platform> <post_id> <url>

## Workflow
1. Fetch deals: python3 -c "import urllib.request,json; req=urllib.request.Request('https://www.gottahavecoups.com/api/v1/deals?limit=20&sort=newest'); req.add_header('User-Agent','Mozilla/5.0'); data=json.loads(urllib.request.urlopen(req).read()); deals=data if isinstance(data,list) else data.get('deals',data.get('items',[])); [print(f'{d.get(\"id\")}|{d.get(\"title\",\"\")[:80]}|${d.get(\"price\",\"\")}') for d in deals[:15]]"
2. Check hash for each candidate
3. Pick first unposted deal (50%+ off, popular brand, limited time, freebies, or under $10)
4. Download share image: wget -q "https://www.gottahavecoups.com/api/v1/share/image/<deal_id>" -O /tmp/deal_img.jpg
5. Post to X:
   cd /home/crogers2287/openclaw-workspaces/cannadeals-marketing/skills/social-poster
   SOCIAL_PROFILE=/home/crogers2287/.social-poster-profile-ghc xvfb-run --auto-servernum --server-args="-screen 0 1920x1080x24" node post.mjs twitter "<tweet>" --image /tmp/deal_img.jpg
6. Post to Pinterest:
   cd /home/crogers2287/openclaw-workspaces/cannadeals-marketing/skills/social-poster
   SOCIAL_PROFILE=/home/crogers2287/.social-poster-profile-ghc xvfb-run --auto-servernum --server-args="-screen 0 1920x1080x24" node post.mjs pinterest "<desc>" --title "<title>" --link "https://gottahavecoups.com/deal/<id>" --image /tmp/deal_img.jpg --board "Today's Best Deals"
7. Record both in posted_db
8. Log in memory/YYYY-MM-DD.md

## Tweet format
Hook + value + coupon code (if any) + 5-8 hashtags + link LAST: gottahavecoups.com/deal/<id>
Current time: Thursday, February 12th, 2026 — 7:27 AM (UTC)

Return your summary as plain text; it will be delivered automatically. If the task explicitly calls for messaging a specific external recipient, note who/where it should go instead of sending it yourself.


exec

python3 -c "import urllib.request,json; req=urllib.request.Request('https://www.gottahavecoups.com/api/v1/deals?limit=20&sort=newest'); req.add_header('User-Agent','Mozilla/5.0'); data=json.loads(urllib.request.urlopen(req).read()); deals=data if isinstance(data,list) else data.get('deals',data.get('items',[])); [print(f'{d.get(\"id\")}|{d.get(\"title\",\"\")[:80]}|${d.get(\"price\",\"\")}') for d in deals[:15]]"


/bin/bash: line 1: import urllib.request,json; req=urllib.request.Request('https://www.gottahavecoups.com/api/v1/deals?limit=20&sort=newest'); req.add_header('User-Agent','Mozilla/5.0'); data=json.loads(urllib.request.urlopen(req).read()); deals=data if isinstance(data,list) else data.get('deals',data.get('items',[])); [print(f'{d.get("id")}|{d.get("title","")[:80]}|${d.get(\"price\",\"\")}') for d in deals[:15]]: bad substitution

Command exited with code 1


python3 -c "import urllib.request, json; req = urllib.request.Request('https://www.gottahavecoups.com/api/v1/deals?limit=20&sort=newest'); req.add_header('User-Agent', 'Mozilla/5.0'); resp = urllib.request.urlopen(req); data = json.loads(resp.read()); items = data if isinstance(data, list) else data.get('deals', data.get('items', [])); [print(f'{d.get(\"id\")}|{d.get(\"title\", \"\")[:80]}|{d.get(\"price\", \"\")}') for d in items[:15]]"


33737|Lenox 897576 Chef Snoopy Dessert Bowls,Set Of 4 - *YMMV - $22.39 w/ Coupon!- Shi|22.39
33738|16" Franco Peanuts Woodstock Winter Coat Holiday & Christmas Plush Pillow Buddy |7.15
33739|Amazon Grocery,Diced Jalapeños,Hot,4 Oz (Previously Amazon Fresh,Packaging May V|0.72
33736|POP Television:House of The Dragon - Mysaria $4.27|4.27
33731|Lenox Dinnerware Set,Merry Grinchmas Accent Plates,Service for 4 Porcelain Accen|28.59
33728|Morex Ribbon Velvet Ribbon Nyl...Williamsburg Bl (01225/10-536|12.88
33730|Bratz 2025 Holidayz Frosty Nig...emium Fashions and Accessories|24.72
33727|FOCO LSU Tigers NCAA Mens Colo...block Big Logo Gel Slides - XL|12.37
33729|Heresy and the Politics of Com...nd Power in the Medieval Past|30.78
33732|Lenox 897835 Tuscany Classics Stackable Coolers,Set Of 4,Amber - * YMMV - $18.87|18.87
33734|4-Pack Large Collapsible Closet Storage Organizer Bins (14"x10"x9.5") $12|12.0
33726|Select Accounts:1.8-Oz Purina Pro Plan Veterinary Diets Urinary Health Cat Treat|2.1
33724|Christopher Knight Home Stamfo...Chairs,2-Pcs Set,Teak Finish|100.63
33722|Some Like It Charming (It's Only Temporary Book 1|0.99
33721|30" x 20" Eheyciga Super Absorbent Dog Door Mat (Grey) $6.99 + Free Shipping w/ |6.99


python3 scripts/posted_db.py check 33739 x && python3 scripts/posted_db.py check 33739 pinterest


HASH:9f49e8bd8539a061 POSTED:YES DEAL:33739 PLATFORM:x

Command exited with code 1


python3 scripts/posted_db.py check 33738 x && python3 scripts/posted_db.py check 33738 pinterest


HASH:ba9e37ca4d6abd64 POSTED:NO DEAL:33738 PLATFORM:x
HASH:aa277494bfed8a77 POSTED:NO DEAL:33738 PLATFORM:pinterest


wget -q "https://www.gottahavecoups.com/api/v1/share/image/33738" -O /tmp/deal_img.jpg


(no output)


cd /home/crogers2287/openclaw-workspaces/cannadeals-marketing/skills/social-poster && SOCIAL_PROFILE=/home/crogers2287/.social-poster-profile-ghc xvfb-run --auto-servernum --server-args="-screen 0 1920x1080x24" node post.mjs twitter "Woodstock is ready for the holidays! 🎄 Grab this 16\" Franco Peanuts Woodstock Winter Coat Holiday Plush Pillow Buddy for just $7.15! 🐥❄\n\n#Peanuts #Woodstock #HolidayDeals #ChristmasPlush #GottaHaveCoups #Deals #AmazonDeals\n\ngottahavecoups.com/deal/33738" --image /tmp/deal_img.jpg


Command still running (session tidal-otter, pid 76337). Use process (list/poll/log/write/kill/clear/remove) for follow-up.


[*] Uploading image: /tmp/deal_img.jpg

Process still running.


(no new output)

Process still running.


[+] Tweet posted successfully!

Process still running.

[*] Uploading image: /tmp/deal_img.jpg
[+] Tweet posted successfully!


[*] Uploading image: /tmp/deal_img.jpg
[+] Tweet posted successfully!

Process exited with code 0.


cd /home/crogers2287/openclaw-workspaces/cannadeals-marketing/skills/social-poster && SOCIAL_PROFILE=/home/crogers2287/.social-poster-profile-ghc xvfb-run --auto-servernum --server-args="-screen 0 1920x1080x24" node post.mjs pinterest "Grab this adorable 16\" Franco Peanuts Woodstock Winter Coat Holiday Plush Pillow Buddy for just $7.15! Perfect for the holiday season." --title "16\" Peanuts Woodstock Winter Plush" --link "https://gottahavecoups.com/deal/33738" --image /tmp/deal_img.jpg --board "Today's Best Deals"


Command still running (session delta-crustacean, pid 88716). Use process (list/poll/log/write/kill/clear/remove) for follow-up.


node:internal/process/promises:394
    triggerUncaughtException(err, true /* fromPromise */);
    ^

locator.setInputFiles: Timeout 30000ms exceeded.
Call log:
  - waiting for locator('input[type="file"]').first()

    at async postPinterest (/home/crogers2287/openclaw-workspaces/cannadeals-marketing/skills/social-poster/post.mjs:160:7) {
  name: 'TimeoutError'
}

Node.js v22.20.0

Process exited with code 1.


Command still running (session ember-cove, pid 96419). Use process (list/poll/log/write/kill/clear/remove) for follow-up.


python3 scripts/posted_db.py record 33738 x "tweet_id_pending" "https://x.com/GottaHaveCoups/status/pending"


RECORDED HASH:ba9e37ca4d6abd64 DEAL:33738 PLATFORM:x


mkdir -p memory && echo "- [$(date +'%Y-%m-%d %H:%M:%S')] Posted deal 33738 (Woodstock Plush) to X. Pinterest failed with timeout (likely UI change or selector issue)." >> memory/$(date +'%Y-%m-%d').md


Posted deal 33738 (16" Franco Peanuts Woodstock Winter Coat Holiday Plush Pillow Buddy) to X.

**Details:**
- **Platform:** X (@GottaHaveCoups)
- **Status:** Success
- **Deal ID:** 33738
- **Price:** $7.15
- **Image:** Downloaded and uploaded successfully.

**Pinterest Status:**
- **Result:** Failed (TimeoutError)
- **Error:** `locator.setInputFiles: Timeout 30000ms exceeded. waiting for locator('input[type="file"]').first()`
- **Note:** This often indicates a UI change on Pinterest or an issue with the file upload selector in the `post.mjs` script.

**Log:**
Recorded deal 33738 to `posted_db` for X. Activity logged in `memory/2026-02-12.md`.