CRM Snail Mail via PostGrid
name: crm-snail-mail-postgrid
by danielfoch · published 2026-03-22
$ claw add gh:danielfoch/danielfoch-crm-snail-mail-postgrid---
name: crm-snail-mail-postgrid
description: Send physical mail from CRM contacts using PostGrid. Use when pulling contacts from GoHighLevel (GHL) or Follow Up Boss (FUB), mapping contact/address fields, generating personalized mail payloads, and submitting letters or postcards through PostGrid API. Also use when another skill already produced GHL/FUB contact JSON and mail should be sent from that dataset.
---
# CRM Snail Mail via PostGrid
Use this skill to run targeted direct-mail outreach from CRM contacts.
Workflow
1. Pick source: `ghl`, `fub`, or pre-exported contact JSON.
2. Pull and normalize contacts into a common schema.
3. Filter to records with mailable addresses.
4. Build personalized message content.
5. Submit jobs to PostGrid (`letters` or `postcards`) with dry-run available.
6. Return send summary with success/failure per contact.
Script
Purpose: Pull contacts from GHL/FUB (or load from JSON), normalize fields, render templates, and send to PostGrid.
Purpose: Full PostGrid API utility with broad endpoint catalog and `call-raw` fallback for any documented endpoint.
Environment Variables
Typical Commands
List full PostGrid endpoint catalog included in this skill:
python3 scripts/postgrid_api.py list-endpointsCall a cataloged PostGrid endpoint:
python3 scripts/postgrid_api.py call contacts.listCall any PostGrid endpoint directly (full docs coverage fallback):
python3 scripts/postgrid_api.py call-raw GET /letters \
--base-url https://api.postgrid.com/print-mail/v1Normalize contacts from FUB to JSON:
python3 scripts/crm_postgrid_mailer.py fetch \
--provider fub \
--limit 200 \
--output /tmp/fub_contacts_normalized.jsonNormalize contacts from GHL to JSON:
python3 scripts/crm_postgrid_mailer.py fetch \
--provider ghl \
--location-id "$GHL_LOCATION_ID" \
--limit 200 \
--output /tmp/ghl_contacts_normalized.jsonDry-run PostGrid payload generation:
python3 scripts/crm_postgrid_mailer.py send \
--contacts-file /tmp/ghl_contacts_normalized.json \
--from-json-file references/example_sender_us.json \
--html-template-file references/example_letter_template.html \
--mail-route letters \
--dry-runFetch + send in one command:
python3 scripts/crm_postgrid_mailer.py run \
--provider fub \
--limit 100 \
--from-json-file references/example_sender_us.json \
--html-template-file references/example_letter_template.html \
--mail-route letters \
--output /tmp/mail_send_summary.jsonSend one ad-hoc mailer from raw address + content:
python3 scripts/crm_postgrid_mailer.py one-off \
--to-name "Jane Seller" \
--to-address1 "742 Evergreen Terrace" \
--to-city "Springfield" \
--to-state "IL" \
--to-postal-code "62704" \
--from-json-file references/example_sender_us.json \
--content-text "Hi Jane,\n\nI'd love to send you a fresh home valuation this week.\n\nBest,\nDaniel" \
--mail-route letters \
--dry-runUse JSON exported by another GHL/FUB skill:
python3 scripts/crm_postgrid_mailer.py run \
--contacts-file /tmp/contacts_from_other_skill.json \
--from-json-file references/example_sender_us.json \
--html-template-file references/example_letter_template.html \
--mail-route lettersData Contract
Normalized contact shape:
Contacts missing `address1`, `city`, `state`, or `postal_code` are skipped by default.
Integration Notes
PostGrid Safety
See `references/postgrid-notes.md` for route/header assumptions and override strategy.
More tools from the same signal band
Order food/drinks (点餐) on an Android device paired as an OpenClaw node. Uses in-app menu and cart; add goods, view cart, submit order (demo, no real payment).
Sign plugins, rotate agent credentials without losing identity, and publicly attest to plugin behavior with verifiable claims and authenticated transfers.
The philosophical layer for AI agents. Maps behavior to Spinoza's 48 affects, calculates persistence scores, and generates geometric self-reports. Give your...