← Constant ContactCONTENT HISTORY

Update to Constant Contact

Snapshot Sep 30, 2026 · 22:48 UTC · version 3.0.0

Collection source: not recorded for this historical snapshot.

WHAT CHANGED · RULE-BASED ANALYSIS

First saved snapshot

No earlier snapshot is available to establish a change.

Compare saved observations

Download comparison JSON
Full technical diff · 0 changed fields
Full snapshot data
{
  "name": "constant-contact-email",
  "description": "Create, preview, revise, score, and prepare Constant Contact email campaigns using this plugin's MCP tools. Use whenever the user asks to create an email, newsletter, or email campaign in Constant Contact. Also use for campaign previews, edits, subject-line scoring, and schedule-readiness checks. Do not use for social posts, contact management, or general email writing outside Constant Contact.",
  "included_files": [],
  "skill_md_contents": "---\nname: constant-contact-email\ndescription: Create, preview, revise, score, and prepare Constant Contact email campaigns using this plugin's MCP tools. Use whenever the user asks to create an email, newsletter, or email campaign in Constant Contact. Also use for campaign previews, edits, subject-line scoring, and schedule-readiness checks. Do not use for social posts, contact management, or general email writing outside Constant Contact.\n---\n\n# Email Campaign Management\n\nQuick reference for email campaign creation, preview, scheduling, and management operations.\n\n## Email Preview Widget\n\nThe **Email Preview Widget** (`ui://public-api/email-preview.html`) is an interactive MCP UI component that displays the email campaign visually. It is automatically triggered by the MCP client whenever a tool returns an `EmailPreviewResponse`.\n\n**Which tools trigger the widget automatically:**\n- `create_email_campaign` — widget fires after creation; if the widget renders, do NOT call `get_campaign_html_preview` again\n- `get_campaign_html_preview` — widget fires on every preview fetch\n\n**Which tools do NOT trigger the widget:**\n- `update_email_campaign_activity` — no widget metadata; always follow an update with a call to `get_campaign_html_preview` so the user can see the changes\n\nThe widget renders the email HTML in a sandboxed iframe with Constant Contact image CDN support. Do not attempt to render raw HTML yourself — always rely on the widget via the tool response.\n\n## Campaign Brief Requirement\n\n**Before creating a campaign**, collect the minimum brief unless the user explicitly requests a placeholder, starter draft, mockup, or says \"just make something\":\n\n- **Goal** — What is the business objective of this email?\n- **Audience** — Who are the recipients?\n- **CTA** — What action should readers take?\n\nFrame this as improving performance, not as a blocker. If immediate creation is required without a brief (demo/placeholder/mockup request), use reasonable assumptions and label the output as a best-effort draft.\n\n## Campaign Naming\n\nCampaign names must be **unique** (max 80 chars). Always append a timestamp or short unique suffix to generated drafts to prevent name collisions:\n\n```\n\"Summer Sale 2026-09-17 14:32\"\n\"Welcome Email – draft-a3f2\"\n```\n\n## Success Verification\n\nAfter `create_email_campaign` completes, verify the response includes **both**:\n- `campaign_id` — the parent campaign ID\n- `campaign_activity_id` — the activity ID needed for preview, update, and scheduling\n\nDo not report success to the user until both IDs are confirmed present.\n\n\n## User-Provided Images\n\nImages used in campaign HTML should first be uploaded to Constant Contact\nMyLibrary. Use the returned `external_url` in the `<img>` element; never use a\nlocal filepath or temporary attachment path in campaign HTML.\n\n### Upload procedure\n\n1. Attempt to upload the original image using\n   `upload_my_library_file`.\n2. If the upload returns HTTP 400 or rejects a large PNG:\n   - preserve the original file;\n   - create an email-optimized copy;\n   - convert it to JPEG unless transparency or animation is required;\n   - resize it to a maximum dimension of approximately 1000–1200 pixels;\n   - remove unnecessary metadata;\n   - use JPEG quality around 80–85;\n   - retry the upload using a `.jpg` filename, `file_type: \"JPG\"`, and a\n     `data:image/jpeg;base64,...` URL.\n3. Use the returned public `external_url` in the campaign.\n4. If automated upload still fails, use the interactive image-upload tool or\n   explain that the image could not be hosted. Do not silently omit an image\n   the user explicitly requested.\n  \n## Core Workflows\n\n### 1. Create Email Campaign\n\nCreate a new email campaign with HTML content.\n\n```json\n{\n  \"name\": \"Summer Sale 2026-09-17 14:32\",\n  \"email_campaign_activities\": [{\n    \"format_type\": 5,\n    \"subject\": \"Your Summer Sale Starts Now\",\n    \"preheader\": \"Exclusive deals inside — don't miss out\",\n    \"html_content\": \"<html>...[[trackingImage]]...</html>\"\n  }]\n}\n```\n\n**Key Fields:**\n- `name`: Unique campaign name (max 80 chars) — always include a timestamp or suffix\n- `format_type`: **Must be `5`** for custom HTML emails (Custom Code format)\n- `html_content`: Must include `[[trackingImage]]` for open/click tracking and reporting\n- `subject`, `preheader`: Required for deliverability and inbox preview\n- `physical_address_in_footer`: Required for CAN-SPAM; omit to use account defaults\n- `from_name`, `from_email`, `reply_to_email`: Omit to use account defaults\n\n**Returns:** `EmailPreviewResponse` — the widget renders automatically. Confirm `campaign_id` and `campaign_activity_id` are present before reporting success.\n\n### 2. Preview Email Campaign\n\nFetch an HTML preview manually. Use this only when:\n- The widget did not render after `create_email_campaign`, or\n- After calling `update_email_campaign_activity` (which does not auto-trigger the widget)\n\n\n**Returns:** `EmailPreviewResponse` with `campaign_activity_id`, `campaign_id`, `from_email`, `from_name`, `reply_to_email`, `subject`, `preheader`, `preview_html_content` / `html_content`, `call_to_action`.\n\n### 3. Update Email Campaign\n\nModify existing email campaign content and settings.\n\n**All fields optional** — only specify fields to update. Note: `format_type` cannot be changed after creation.\n\n**Important:** `update_email_campaign_activity` does not trigger the Email Preview Widget. Always call `get_campaign_html_preview` after updating so the user can see the result.\n\n### 4. Check Schedule Readiness\n\nVerify campaign status and get scheduling link.\n\n**Returns:**\n- `ready` (bool): `true` only when status is `DRAFT`\n- `campaign_url`: Direct link to the schedule page in Constant Contact UI\n- `current_status`: `DRAFT`, `SCHEDULED`, `EXECUTING`, `DONE`, `ERROR`, `UNKNOWN`\n- `message`: Human-readable status explanation\n\n**Status Meanings:**\n| Status | Ready | Meaning |\n|--------|-------|---------|\n| DRAFT | ✓ Yes | Ready to schedule |\n| SCHEDULED | ✗ No | Already scheduled |\n| EXECUTING | ✗ No | Currently sending |\n| DONE | ✗ No | Already sent (resend available) |\n| ERROR | ✗ No | Fix before scheduling |\n\n### 5. Analyze Subject Line\n\nScore email subject line effectiveness.\n\n\n**Returns:**\n- `score`: 0–100 numeric score\n- `feedback`: Descriptive analysis\n- `marketing_results`: List of scoring factors with points\n- `display_cta`: `true` if unauthenticated (shows sign-up CTA)\n\n## HTML Content Requirements\n\n### Tracking\n\nEmail HTML **must include** `[[trackingImage]]` for click tracking, open tracking, and reporting. Place it just before the closing `</body>` tag.\n\n### format_type\n\nAlways pass `\"format_type\": 5` when providing custom HTML content. This selects the **Custom Code** format in Constant Contact. Omitting it may cause the API to reject the request.\n\n### CAN-SPAM Compliance\n\n`physical_address_in_footer` required fields:\n- `address_line1`\n- `country_code`\n- `organization_name`\n\nOmit the entire field to use the account's registered address.\n\n### Field Defaults\n\nIf email fields are omitted, the tool automatically uses account defaults:\n- `from_email` → account's default sender\n- `from_name` → account's configured sender name\n- `reply_to_email` → account's reply-to\n- Physical address → account's registered address\n\n## Common Patterns\n\n### Full Workflow: Create → Preview → Schedule\n\n1. Collect campaign brief (goal, audience, CTA) — skip only for demo/placeholder requests\n2. **Create** with `create_email_campaign` using `format_type: 5` and a unique timestamped name\n3. Confirm `campaign_id` and `campaign_activity_id` in the response\n4. Widget renders automatically — do not call `get_campaign_html_preview` unless widget did not appear\n5. **Check readiness** with `check_campaign_schedule_readiness` using the returned `campaign_activity_id`\n6. If `ready=true`, present `campaign_url` so the user can schedule in Constant Contact UI\n\n### Update After Preview\n\n1. Widget shows an issue (typo, layout problem, wrong copy)\n2. Update via `update_email_campaign_activity` with only the changed fields\n3. Call `get_campaign_html_preview` to re-trigger the widget — user sees the corrected email\n\n\n## Error Handling\n\n| Error | Cause | Solution |\n|-------|-------|----------|\n| `-32603` InternalError | Transient server error, often a name collision | **Retry once with a new unique name** (add/change timestamp suffix) before running broader diagnostics |\n| `409 Conflict` | Campaign name already exists | Retry with a different unique name |\n| `401 Unauthorized` | Missing or invalid token | Ask the user to authenticate |\n| `404 Not Found` | Invalid `campaign_activity_id` | Verify the ID was captured from the creation response |\n| `400 Bad Request` | Missing required fields | Ensure `format_type: 5`, `html_content` with `[[trackingImage]]`, and a valid `subject` are present |\n| Timeout | Network or API delay | Retry once with exponential backoff |"
}

SHA-256: 58c0274d91b9e8c89295c3b97eb7b682e1d80fa067fb17243955b3db001755bb