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

## CRITICAL: Use Maya VM, NOT Fred social-poster
- X: twikit v2.3.3 on Maya VM (`ssh maya@maya`)
- Script: `/home/maya/workspace/scripts/x_twikit_post2.py`
- Cookies: `/home/maya/workspace/x_cookies.json`

## Workflow
1. **Fetch deals with Python (NOT shell pipes with $):**
   ```python3
   import urllib.request, json
   req = urllib.request.Request('https://www.gottahavecoups.com/api/v1/deals?limit=20&sort=newest', headers={'User-Agent':'Mozilla/5.0'})
   data = json.loads(urllib.request.urlopen(req, timeout=15).read())
   deals = data if isinstance(data, list) else data.get('deals', [])
   for d in deals[:15]:
       print(f"{d['id']}|{d.get('title','')[:60]}|PRICE:{d.get('price','')}|{d.get('discount_percentage',0)}%")
   ```
2. Check hash: `python3 scripts/posted_db.py check <deal_id> x`
3. If POSTED:YES — SKIP, pick another
4. Pick unposted deal (50%+ off, popular brand, limited time, freebies, under $10)
5. Download share image: `wget -q "https://www.gottahavecoups.com/api/v1/share/image/<deal_id>" -O /tmp/deal_img.jpg`
6. **BUILD TWEET:** Hook + value + 5-8 hashtags + link LAST. KEEP UNDER 280 CHARS.
7. **MANDATORY VALIDATION:** `python3 scripts/validate_tweet.py '<tweet_text>'` — If INVALID, STOP and pick different deal.
8. **POST TO X (Maya VM twikit):**
   ```bash
   ssh maya@maya "cat > /tmp/tweet.txt << 'TWEET'
   <tweet text here>
   TWEET"
   scp /tmp/deal_img.jpg maya@maya:/tmp/deal_img.jpg
   ssh maya@maya "python3 /home/maya/workspace/scripts/x_twikit_post2.py <deal_id> --file /tmp/tweet.txt"
   ```
9. **POST TO PINTEREST (Maya VM py3-pinterest):**
   ```bash
   ssh maya@maya "python3 /home/maya/workspace/scripts/pin_post_v2.py <deal_id> '<title>' '<description>' 1134485031073239531"
   ```
10. Record posts: `python3 scripts/posted_db.py record <deal_id> x <tweet_id> <url>`
11. Log in memory/YYYY-MM-DD.md

## If X cookies expired
Run: `ssh maya@maya "DISPLAY=:0 python3 /home/maya/workspace/scripts/extract_x_cookies.py"`

## Tweet format (STRICT)
- Hook (emoji + deal highlight)
- Product name + price (with $, e.g., "$12.99")
- 5-8 hashtags
- Link LAST: gottahavecoups.com/deal/<id>
- KEEP UNDER 280 CHARS

## NEVER post if validation fails:
- Shell artifacts (/bin/bash, python3 -c)
- Broken prices (.20 instead of $10.20)
- Broken emojis (�)
- > 280 chars
Current time: Friday, February 13th, 2026 — 8:57 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.


The user wants me to post a deal to X and Pinterest. Let me follow the workflow carefully:

1. First, fetch deals from the API
2. Check which ones have been posted
3. Pick an unposted deal
4. Download the share image
5. Build a tweet
6. Validate it
7. Post to X via Maya VM
8. Post to Pinterest via Maya VM
9. Record the posts

Let me start by fetching the deals.

I'll execute this scheduled deal post task. Starting by fetching deals and checking the database.

exec

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


34079|The Itty-Bitty Knitty Committe...yle Sweater Book 5) (Volume|PRICE:1.99|71%
34074|Hohner 785 Harmonica,48 Chord|PRICE:948.81|60%
34075|Data Virtualization for Busine...ries on Business Intelligen|PRICE:7.82|75%
34077|MAXLINER Floor Mats 3 Rows and...or 2017-2020 Chrysler Pacif|PRICE:199.69|35%
34073|Rogue Rider (Lords of Deliverance,4|PRICE:1.99|75%
34076|Breyers Ice Cream For a Frozen...ably-Farmed Vanilla 3 oz 10|PRICE:4.38|49%
34061|Acanva Modern L-Shaped Deep Se...iving Room Lounge,Amber Bro|PRICE:1095.83|47%
34064|DERMAFLASH DERMAPORE+ Skin Car...erum Infuser,Holiday Metall|PRICE:65.29|40%
34070|19.53* | 20-Oz Stanley All Day Twist On Lid Stainless Steel |PRICE:19.53|None%
34067|14.95* | Puma Men's or Women's Evercat Sidewall Sling Backpa|PRICE:14.95|57%
34071|AC] $9.94* | 6-Pack Fab Totes 60L Foldable Clothes/Blanket S|PRICE:9.94|None%
34068|SnS,AC] $12.72* | 7-Pk 1-Oz Beech-Nut Melties Baby/Toddler S|PRICE:12.72|None%
34069|60-Count DMoose Berberine HCL 1400mg w/ Ceylon Cinnamon Supp|PRICE:8.0|20%
34072|10.79* | 50' Fingwerk D-Shape Rubber Weather Stripping Door |PRICE:10.79|None%
34054|SnS,AC] $6.38 | 10-Oz Biotrue Contact Solution at Amazon|PRICE:6.38|None%


I have the deals. Now let me check which ones have been posted. I'll check a few promising ones - looking for 50%+ off, under $10, popular items. Let me check some of the good candidates:
- 34079: $1.99 book, 71% off - good candidate
- 34075: $7.82, 75% off - business book
- 34073: $1.99, 75% off - romance novel
- 34054: $6.38 contact solution
- 34071: $9.94 storage totes

Let me check these against the posted database.

python3 scripts/posted_db.py check 34079 x

python3 scripts/posted_db.py check 34073 x

python3 scripts/posted_db.py check 34054 x

python3 scripts/posted_db.py check 34071 x


POSTED:NO


I have several unposted deals. Let me check more details on these deals and pick the best one. Looking at them:

1. 34079 - The Itty-Bitty Knitty Committee (Book), $1.99, 71% off
2. 34073 - Rogue Rider (Lords of Deliverance, 4), $1.99, 75% off
3. 34054 - Biotrue Contact Solution, $6.38
4. 34071 - 6-Pack Fab Totes 60L, $9.94

All of these look good. The book deals at $1.99 are excellent - high discount, low price point. Let me check the deal details for 34079 first - knitting book sounds appealing for a certain audience. Or maybe the storage totes at $9.94 are more broadly appealing.

Let me get more details on a few of these deals to make a good tweet.

python3 -c "
import urllib.request, json
req = urllib.request.Request('https://www.gottahavecoups.com/api/v1/deals/34079', headers={'User-Agent':'Mozilla/5.0'})
d = json.loads(urllib.request.urlopen(req, timeout=15).read())
print(f\"Title: {d.get('title')}\")
print(f\"Price: {d.get('price')}\")
print(f\"Original: {d.get('original_price')}\")
print(f\"Discount: {d.get('discount_percentage')}%\")
print(f\"URL: {d.get('url')}\")
print(f\"Description: {d.get('description','')[:200]}\")
"

python3 -c "
import urllib.request, json
req = urllib.request.Request('https://www.gottahavecoups.com/api/v1/deals/34071', headers={'User-Agent':'Mozilla/5.0'})
d = json.loads(urllib.request.urlopen(req, timeout=15).read())
print(f\"Title: {d.get('title')}\")
print(f\"Price: {d.get('price')}\")
print(f\"Original: {d.get('original_price')}\")
print(f\"Discount: {d.get('discount_percentage')}%\")
"


Title: The Itty-Bitty Knitty Committe...yle Sweater Book 5) (Volume 5
Price: 1.99
Original: 6.99
Discount: 71%
URL: None
Description: Amazon price drop:The Itty-Bitty Knitty Committe...yle Sweater Book 5) (Volume 5) - down 71.53% ($5.00) to $1.99 from $6.99


Title: AC] $9.94* | 6-Pack Fab Totes 60L Foldable Clothes/Blanket Storage Bags at Amazon
Price: 9.94
Original: None
Discount: None%


The storage totes deal looks better because:
- $9.94 is under $10
- 6-pack of 60L storage bags is very practical
- Everyone needs storage

Let me get the full details for deal 34071 and download the share image.

python3 -c "
import urllib.request, json
req = urllib.request.Request('https://www.gottahavecoups.com/api/v1/deals/34071', headers={'User-Agent':'Mozilla/5.0'})
d = json.loads(urllib.request.urlopen(req, timeout=15).read())
print(f\"ID: {d.get('id')}\")
print(f\"Title: {d.get('title')}\")
print(f\"Price: {d.get('price')}\")
print(f\"URL: {d.get('url')}\")
print(f\"Image: {d.get('image_url')}\")
"


ID: 34071
Title: AC] $9.94* | 6-Pack Fab Totes 60L Foldable Clothes/Blanket Storage Bags at Amazon
Price: 9.94
URL: None
Image: https://www.gottahavecoups.com/api/v1/deal-images/005b3cd6aa315a7a.jpg


Good, let me download the share image for this deal and then build a tweet.

wget -q "https://www.gottahavecoups.com/api/v1/share/image/34071" -O /tmp/deal_img.jpg && ls -la /tmp/deal_img.jpg


-rw-rw-r-- 1 crogers2287 crogers2287 74125 Feb 13 08:57 /tmp/deal_img.jpg


Image downloaded. Now let me build a tweet and validate it. The deal is:
- 6-Pack Fab Totes 60L Foldable Storage Bags
- $9.94

Tweet construction:
- Hook with emoji
- Product + price
- 5-8 hashtags
- Link LAST

Draft:
🧺 Organize your life! 6-Pack Fab Totes 60L Foldable Storage Bags only $9.94! Perfect for clothes, blankets & more. #StorageHacks #HomeOrganization #AmazonDeals #OrganizingTips #BargainHunter #FrugalLiving #GottaHaveCoups

Let me count: That's about 210 chars, good. Let me validate it.

python3 scripts/validate_tweet.py '🧺 Organize your life! 6-Pack Fab Totes 60L Foldable Storage Bags only $9.94! Perfect for clothes, blankets \u0026 more. #StorageHacks #HomeOrganization #AmazonDeals #OrganizingTips #BargainHunter #FrugalLiving #GottaHaveCoups https://gottahavecoups.com/deal/34071'


VALID


The tweet is valid. Now I need to post to X via the Maya VM. Let me:
1. Upload the tweet text to Maya VM
2. Upload the image to Maya VM
3. Run the post script

Tweet validated. Now posting to X via Maya VM:

ssh maya@maya "cat > /tmp/tweet.txt << 'TWEET'
🧺 Organize your life! 6-Pack Fab Totes 60L Foldable Storage Bags only $9.94! Perfect for clothes, blankets & more. #StorageHacks #HomeOrganization #AmazonDeals #OrganizingTips #BargainHunter #FrugalLiving #GottaHaveCoups https://gottahavecoups.com/deal/34071
TWEET" && echo "Tweet file created"


Warning: Permanently added 'maya' (ED25519) to the list of known hosts.
Tweet file created


Good, now copy the image to Maya and post to X.


Warning: Permanently added 'maya' (ED25519) to the list of known hosts.


ssh maya@maya "python3 /home/maya/workspace/scripts/x_twikit_post2.py 34071 --file /tmp/tweet.txt"


Warning: Permanently added 'maya' (ED25519) to the list of known hosts.
Cookies loaded
Authenticated as: @GottaHaveCoups
Image downloaded: /home/maya/workspace/downloads/deal-34071.jpg (74125 bytes)
Uploading image...
Image uploaded, media_id: 2022233848935804928
Posting tweet...
SUCCESS! Tweet ID: 2022233851469480019
URL: https://x.com/GottaHaveCoups/status/2022233851469480019


X posted successfully. Now post to Pinterest using the py3-pinterest script.

X posted successfully! Now posting to Pinterest:

ssh maya@maya "python3 /home/maya/workspace/scripts/pin_post_v2.py 34071 '6-Pack Fab Totes 60L Foldable Storage Bags - Only $9.94!' 'Organize your home with these foldable 60L storage bags. Perfect for clothes, blankets, and seasonal items. Great deal at under $10 for 6 bags!' 1134485031073239531"


Warning: Permanently added 'maya' (ED25519) to the list of known hosts.
Loaded 8 cookies
Boards: 200
Found 7 boards (raw type: dict)
Raw keys: ['all_boards', 'boards_shortlist', 'create_suggestions']
  🔥 Today’s Best Deals (id: 1134485031073239531)
  Limited Time Promo Codes (id: 1134485031073239590)
  Gifts Under $50 (id: 1134485031073239588)
  Amazon Deals & Coupons (id: 1134485031073239559)
  Home & Kitchen Savings (id: 1134485031073239570)
Image upload: 200
Image URL: https://i.pinimg.com/previews/0Gs3rA0P.jpeg
Pin create: 200
SUCCESS! Pin ID: 1134484962398648899


Excellent! Both posts succeeded. Now I need to:
1. Record the posts in the database
2. Log to memory file

Let me record the X post first.

Both posts successful! Recording to database:

python3 scripts/posted_db.py record 34071 x 2022233851469480019 https://x.com/GottaHaveCoups/status/2022233851469480019

python3 scripts/posted_db.py record 34071 pinterest 1134484962398648899 https://www.pinterest.com/pin/1134484962398648899


Recorded 34071 for x


Recorded 34071 for pinterest


Both posts recorded. Now log to the memory file for today.

echo '## 08:57 UTC - Deal Posted (ID: 34071)
- **Deal:** 6-Pack Fab Totes 60L Foldable Storage Bags - $9.94
- **X:** https://x.com/GottaHaveCoups/status/2022233851469480019
- **Pinterest:** Pin ID 1134484962398648899
- **Status:** ✅ Both platforms posted successfully
' >> /home/crogers2287/.openclaw/workspace-ghc-marketing/memory/2026-02-13.md


(no output)


Task completed successfully. Let me summarize the results.

**TASK COMPLETED SUCCESSFULLY**

**Deal Posted:** 34071 — 6-Pack Fab Totes 60L Foldable Storage Bags ($9.94)

| Platform | Result |
|----------|--------|
| **X (Twitter)** | ✅ Posted — [Tweet URL](https://x.com/GottaHaveCoups/status/2022233851469480019) |
| **Pinterest** | ✅ Posted — Pin ID 1134484962398648899 |

**Tweet:** "🧺 Organize your life! 6-Pack Fab Totes 60L Foldable Storage Bags only $9.94! Perfect for clothes, blankets & more. #StorageHacks #HomeOrganization #AmazonDeals #OrganizingTips #BargainHunter #FrugalLiving #GottaHaveCoups"

**Actions Taken:**
- Fetched 15 newest deals from API
- Checked 4 candidates, selected 34071 (unposted, under $10, practical item)
- Downloaded share image (74KB)
- Validated tweet (✅ VALID)
- Posted to X via Maya VM twikit (authenticated as @GottaHaveCoups)
- Posted to Pinterest via Maya VM py3-pinterest (board: Today's Best Deals)
- Recorded both posts in posted_deals.json
- Logged activity to memory/2026-02-13.md