[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 — 5: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')
with urllib.request.urlopen(req) as response:
    data = json.loads(response.read())
    deals = data if isinstance(data, list) else data.get('deals', data.get('items', []))
    for d in deals[:15]:
        print(f\"{d.get('id')}|{d.get('title', '')[:80]}|${d.get('price', '')}\")"


/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')
with urllib.request.urlopen(req) as response:
    data = json.loads(response.read())
    deals = data if isinstance(data, list) else data.get('deals', data.get('items', []))
    for d in deals[:15]:
        print(f"{d.get('id')}|{d.get('title', '')[:80]}|${d.get('price', '')}"): bad substitution

Command exited with code 1


curl -s -H "User-Agent: Mozilla/5.0" "https://www.gottahavecoups.com/api/v1/deals?limit=20&sort=newest" | jq -r '.[] | "\(.id)|\(.title)|\(.price)|\(.original_price)"' | head -n 15


(no output)


curl -s -H "User-Agent: Mozilla/5.0" "https://www.gottahavecoups.com/api/v1/deals?limit=20&sort=newest" | jq .


curl -v -H "User-Agent: Mozilla/5.0" "https://www.gottahavecoups.com/api/v1/deals?limit=20&sort=newest"


% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0* Host www.gottahavecoups.com:443 was resolved.
* IPv6: 2606:4700:3037::6815:441e, 2606:4700:3033::ac43:b9d7
* IPv4: 104.21.68.30, 172.67.185.215
*   Trying 104.21.68.30:443...
* Connected to www.gottahavecoups.com (104.21.68.30) port 443
* ALPN: curl offers h2,http/1.1
} [5 bytes data]
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
*  CAfile: /etc/ssl/certs/ca-certificates.crt
*  CApath: /etc/ssl/certs
{ [5 bytes data]
* TLSv1.3 (IN), TLS handshake, Server hello (2):
{ [122 bytes data]
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
{ [19 bytes data]
* TLSv1.3 (IN), TLS handshake, Certificate (11):
{ [2548 bytes data]
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
{ [80 bytes data]
* TLSv1.3 (IN), TLS handshake, Finished (20):
{ [52 bytes data]
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
} [1 bytes data]
* TLSv1.3 (OUT), TLS handshake, Finished (20):
} [52 bytes data]
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384 / X25519 / id-ecPublicKey
* ALPN: server accepted h2
* Server certificate:
*  subject: CN=gottahavecoups.com
*  start date: Jan 24 01:17:46 2026 GMT
*  expire date: Apr 24 02:16:10 2026 GMT
*  subjectAltName: host "www.gottahavecoups.com" matched cert's "*.gottahavecoups.com"
*  issuer: C=US; O=Google Trust Services; CN=WE1
*  SSL certificate verify ok.
*   Certificate level 0: Public key type EC/prime256v1 (256/128 Bits/secBits), signed using ecdsa-with-SHA256
*   Certificate level 1: Public key type EC/prime256v1 (256/128 Bits/secBits), signed using ecdsa-with-SHA384
*   Certificate level 2: Public key type EC/secp384r1 (384/192 Bits/secBits), signed using ecdsa-with-SHA384
} [5 bytes data]
* using HTTP/2
* [HTTP/2] [1] OPENED stream for https://www.gottahavecoups.com/api/v1/deals?limit=20&sort=newest
* [HTTP/2] [1] [:method: GET]
* [HTTP/2] [1] [:scheme: https]
* [HTTP/2] [1] [:authority: www.gottahavecoups.com]
* [HTTP/2] [1] [:path: /api/v1/deals?limit=20&sort=newest]
* [HTTP/2] [1] [accept: */*]
* [HTTP/2] [1] [user-agent: Mozilla/5.0]
} [5 bytes data]
> GET /api/v1/deals?limit=20&sort=newest HTTP/2
> Host: www.gottahavecoups.com
> Accept: */*
> User-Agent: Mozilla/5.0
>
{ [5 bytes data]
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
{ [230 bytes data]
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
{ [230 bytes data]
* old SSL session ID is stale, removing
{ [5 bytes data]
< HTTP/2 307
< date: Thu, 12 Feb 2026 05:27:30 GMT
< content-length: 0
< location: https://www.gottahavecoups.com/api/v1/deals/?limit=20&sort=newest
< server: cloudflare
< strict-transport-security: max-age=63072000; preload
< cf-cache-status: DYNAMIC
< nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
< report-to: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=Z%2BqpZmNCWWUf3aerq3rRYUhs9e7MjsRH4jXwQV3%2B1UILz%2BdGVGCmrdVzUiQCwj2VZRVO6uLrZyU7X2Jaw3toOfRhNO24nEH1xu8EkTxCQukrP00zyQA%3D"}]}
< cf-ray: 9cc9ad5cabf1a540-MIA
< alt-svc: h3=":443"; ma=86400
<

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
* Connection #0 to host www.gottahavecoups.com left intact


curl -s -L -H "User-Agent: Mozilla/5.0" "https://www.gottahavecoups.com/api/v1/deals/?limit=20&sort=newest" | jq -r '.items[] | "\(.id)|\(.title)|\(.price)|\(.original_price)"' | head -n 15


jq: error (at <stdin>:0): Cannot iterate over null (null)


curl -s -L -H "User-Agent: Mozilla/5.0" "https://www.gottahavecoups.com/api/v1/deals/?limit=20&sort=newest" | jq . | head -n 20


{
  "deals": [
    {
      "title": "Furinno Just 3-Tier Turn-N-Tube End Table,2-Pack,White/White - $18.93",
      "description": "https://www.amazon.com/dp/B0883BJ3SX/",
      "price": 18.93,
      "original_price": null,
      "discount_percentage": null,
      "deal_url": "https://www.amazon.com/dp/B0883BJ3SX/",
      "affiliate_link": "https://www.amazon.com/dp/B0883BJ3SX?tag=chelseaschn0b-20&linkCode=ur2&camp=1789&creative=9325",
      "coupon_code": null,
      "image_url": "https://static.slickdealscdn.com/attachment/2/3/8/5/4/6/4/0/300x300/19570273.thumb",
      "thumbnail_url": null,
      "category_id": 2,
      "store_name": "Amazon",
      "brand": null,
      "retailer_links": [
        {
          "retailer": "Amazon",
          "url": "https://www.amazon.com/dp/B0883BJ3SX/",


curl -s -L -H "User-Agent: Mozilla/5.0" "https://www.gottahavecoups.com/api/v1/deals/?limit=20&sort=newest" | jq -r '.deals[] | "\(.id)|\(.title)|\(.price)|\(.original_price)"' | head -n 15


33712|Furinno Just 3-Tier Turn-N-Tube End Table,2-Pack,White/White - $18.93|18.93|null
33711|Lenox Serveware,Nutcracker Ballet Hors Doeuvres Tray,Food Tray,13 x 6.75-Inch,Microwave Safe & Dishwasher Safe Porcelain,Christmas Serving Platter Tray - *YMMV - $17.47 w/ Cou|17.47|null
33713|Hello Kitty® and Friends Halloween Countdown Calendar - 9 Figures with Mix & Match Accessories - 13 Seasonal Surprises - Ages 6+ $9.71|9.71|null
33708|Gain Flings!"Wicked:Limited Edition Laundry Detergent Pacs,42 Count x 4 Canisters,,3 in 1 HE Detergent Pacs with Oxi Boost and Febreeze $26.66 shipped AMAZON|26.66|null
33705|Developing Apps with GPT-4 and...,Content Generators,and More|10.16|19.27
33707|Lenox Coffee Mugs,Vintage Haunted Halloween 12 Oz Mugs Set of 4,Porcelain,Assorted Drinkware Set,Spooky Fall Decor * YMMV - $17.32 w/ Coupon!- Ships FREE w/ Prime!|17.32|null
33710|Select Walmart Stores:2-Pack Sertapedic Extra Firm Standard/Queen Bed Pillow $10.45|10.45|null
33702|Lenox 812615 True Love Cake Knife & Server,Metallic - *YMMV - $17.20 w/ Coupon!- FREE Shipping w/ Prime!|17.2|null
33703|Valvoline MaxLife High Mileage or Advanced Full Synthetic 5 Qt $26.97 (various weights) FS Prime or $35 AMAZON|26.97|null
33699|Squish-a-longs Halloween Count...cludes 13 Mini-Squish (Wave 3|8.06|14.98
33698|Mattel Fisher-Price Thomas & F...ytelling Play for Preschoolers|10.79|18.23
33692|Rene Gonzalez Architects:Not...he Little House on the Prairie|6.13|11.83
33700|Jose’s Whole Bean Coffee ( Organic Mayan Blend,Vanilla Nut,Colombia Supremo) On Sale @ Costco.com from $44.99 after $15 Off|44.99|null
33701|Lenox Candy Dish,Nutcracker Ballet Treat Dish,Food Tray,Made from Porcelain,Handwash Only,Winter Tree Design Treat Dish - *YMMV - $7.84 - FREE Shipping w/ Prime!|7.84|null
33693|Lenox Candy Dish,The Great Pumpkin Figural Treat Dish,Handwash Only,Durable Porcelain Dish Tray,Halloween Decor Indoor,Snoopy Design *YMMV* $11.61 w/ Coupon|11.61|null


python3 scripts/posted_db.py check 33713 x
python3 scripts/posted_db.py check 33705 x
python3 scripts/posted_db.py check 33699 x
python3 scripts/posted_db.py check 33698 x
python3 scripts/posted_db.py check 33692 x
python3 scripts/posted_db.py check 33701 x
python3 scripts/posted_db.py check 33693 x


HASH:458ea047adcefc37 POSTED:NO DEAL:33713 PLATFORM:x
HASH:4f57f3cb1d4bd3f0 POSTED:NO DEAL:33705 PLATFORM:x
HASH:112e28d0880a4e0e POSTED:NO DEAL:33699 PLATFORM:x
HASH:52768a589b2f5b69 POSTED:NO DEAL:33698 PLATFORM:x
HASH:30f9d3b03c293bad POSTED:NO DEAL:33692 PLATFORM:x
HASH:0d27663e5db64c85 POSTED:YES DEAL:33701 PLATFORM:x
HASH:90bdbc421c710595 POSTED:NO DEAL:33693 PLATFORM:x


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


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 "🎃 SQUISH ALERT! 🎃

Get the Squish-a-longs Halloween Countdown with 13 Mini-Squish for just $8.06 (was $14.98)!

Perfect for spooky season collectors! 🕸✨

#Halloween #Squishmallows #SquishAlongs #ToyDeals #Halloween2026 #BargainHunter #GottaHaveCoups

gottahavecoups.com/deal/33699" --image /tmp/deal_img.jpg


Command still running (session sharp-tidepool, pid 2884363). 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.


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


[*] Uploading image: /tmp/deal_img.jpg
node:internal/process/promises:394
    triggerUncaughtException(err, true /* fromPromise */);
    ^

locator.click: Timeout 30000ms exceeded.
Call log:
  - waiting for locator('[data-testid="tweetButton"]')
    - locator resolved to <button disabled role="button" type="button" tabindex="-1" aria-disabled="true" data-testid="tweetButton" class="css-175oi2r r-sdzlij r-1phboty r-rs99b7 r-lrvibr r-1cwvpvk r-2yi16 r-1qi8awa r-3pj75a r-o7ynqc r-6416eg r-icoktb r-1ny4l3l">…</button>
  - attempting click action
    2 × waiting for element to be visible, enabled and stable
      - element is not enabled
    - retrying click action
    - waiting 20ms
    2 × waiting for element to be visible, enabled and stable
      - element is not enabled
    - retrying click action
      - waiting 100ms
    58 × waiting for element to be visible, enabled and stable
       - element is not enabled
     - retrying click action
       - waiting 500ms

    at postTwitter (/home/crogers2287/openclaw-workspaces/cannadeals-marketing/skills/social-poster/post.mjs:104:19) {
  name: 'TimeoutError'
}

Node.js v22.20.0


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


You exceeded your current quota, please check your plan and billing details. For more information on this error, head to: https://ai.google.dev/gemini-api/docs/rate-limits. To monitor your current usage, head to: https://ai.dev/rate-limit.
* Quota exceeded for metric: generativelanguage.googleapis.com/generate_content_paid_tier_input_token_count, limit: 1000000, model: gemini-3-flash
Please retry in 43.286246155s.

Learn more about Gemini API quotas


You exceeded your current quota, please check your plan and billing details. For more information on this error, head to: https://ai.google.dev/gemini-api/docs/rate-limits. To monitor your current usage, head to: https://ai.dev/rate-limit.
* Quota exceeded for metric: generativelanguage.googleapis.com/generate_content_paid_tier_input_token_count, limit: 1000000, model: gemini-3-flash
Please retry in 41.027917261s.

Learn more about Gemini API quotas


[openclaw] missing tool result in session history; inserted synthetic error result for transcript repair.