skills/sales-sendgrid/SKILL.md
SendGrid platform help — transactional email via Email API (REST + SMTP), Marketing Campaigns (drag-and-drop editor, automations, A/B testing, signup forms, segmentation), Email Validation API, Dynamic Templates (Handlebars), Event Webhooks, Inbound Parse, domain authentication (SPF/DKIM/DMARC), dedicated IPs, suppressions, Design Library, email testing, statistics. Use when SendGrid emails are landing in spam, transactional emails aren't sending, domain authentication is failing, Event Webhooks aren't firing, Dynamic Templates aren't rendering correctly, Marketing Campaigns have low open rates, or SendGrid bounce rates are spiking. Do NOT use for general email marketing strategy (use /sales-email-marketing), cross-platform email deliverability (use /sales-deliverability), or email open/click tracking strategy (use /sales-email-tracking).
npx skillsauth add sales-skills/sales sales-sendgridInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Help the user with SendGrid (Twilio) platform questions — from transactional email via the Email API and SMTP relay through Marketing Campaigns, Dynamic Templates, Event Webhooks, Inbound Parse, domain authentication, dedicated IPs, suppressions, email testing, and integrations.
If references/learnings.md exists, read it first for accumulated knowledge.
Ask the user:
What area of SendGrid do you need help with?
What's your role?
What are you trying to accomplish? (describe your specific goal or question)
If the user's request already provides most of this context, skip directly to the relevant step. Lead with your best-effort answer using reasonable assumptions (stated explicitly), then ask only the most critical 1-2 clarifying questions at the end — don't gate your response behind gathering complete context.
Note: If the user needs a specialized skill, route them there with a brief explanation of why that skill is a better fit.
If the request maps to a specialized skill, route:
/sales-email-marketing/sales-deliverability/sales-email-tracking/sales-integration/sales-funnelOtherwise, answer directly from platform knowledge using the reference below.
Read references/platform-guide.md for detailed module documentation, pricing, integrations, and data model.
You no longer need the platform guide details — focus on the user's specific situation.
Based on the user's specific question:
Sending transactional email via the API:
npm install @sendgrid/mail for Node.js)sgMail.setApiKey(process.env.SENDGRID_API_KEY)to, from, subject, text/html (or templateId + dynamicTemplateData)Setting up Marketing Campaigns automation:
Configuring domain authentication:
v=DMARC1; p=quarantine; rua=mailto:[email protected])Setting up Event Webhooks:
event, email, timestamp, and custom argsSetting up Inbound Parse:
mx.sendgrid.netBest-effort from research — verify details against current SendGrid documentation.
sg_event_id changes on retries — do NOT use it for deduplication. Despite the docs saying sg_event_id is "a unique ID to this event that you can use for deduplication purposes," the ID changes on every retry attempt. Same email, same event, same timestamp — but a different sg_event_id. Build a composite dedup key instead: ${sg_message_id}:${event}:${email}. Store processed keys in Redis (with 48-hour TTL to cover SendGrid's 24-hour retry window) or a database, and check before processing each event.sgMail.send() calls concurrently, you'll hit EMFILE errors (file descriptor limit). The SDK creates a new connection per request. Use sequential sending (for...of with await), a concurrency limiter (p-limit set to 2-10), or personalizations (up to 1000 recipients per single request) to reduce connection count.sgMail.send(), SendGrid queues them server-side. For time-sensitive sends, use personalizations (same content, different recipients in one request) or send individual calls with concurrency control rather than one massive batch.references/learnings.md with today's date./sales-email-marketing — Email marketing strategy and best practices (platform-agnostic)/sales-deliverability — Cross-platform email deliverability — SPF/DKIM/DMARC, warmup, inbox placement/sales-email-tracking — Email open and click tracking strategy/sales-integration — Connect SendGrid to other tools via Zapier, Make, or API/sales-funnel — Funnel strategy and conversion optimization/sales-do — Not sure which skill to use? The router matches any sales objective to the right skill. Install: npx skills add sales-skills/sales --skill sales-doUser says: "I need to send password reset and welcome emails from my Node.js app using SendGrid." Skill does:
@sendgrid/mail and configure the API key via environment variable{{reset_link}}) and one for welcome (with {{first_name}}, {{login_url}})sgMail.send() with templateId and dynamicTemplateData, and recommends Event Webhooks to track delivery failures and alert on bounces
Result: User has production-ready transactional email with templates, proper authentication, and delivery monitoringUser says: "We're moving our newsletter from Mailchimp to SendGrid Marketing Campaigns. What's the process?" Skill does:
User says: "I want to track which emails bounce and get delivered so I can update our CRM." Skill does:
sg_message_id as a dedup key; also subscribe to open/click events for engagement tracking
Result: User has a webhook pipeline that keeps their CRM in sync with SendGrid delivery and engagement eventsSymptom: Deliverability drops and emails start landing in spam shortly after upgrading to a Pro or Advanced plan with a dedicated IP
Cause: The dedicated IP is new and has no sending reputation. Mailbox providers (Gmail, Yahoo, Outlook) are cautious about unknown IPs and will throttle or spam-folder email from them.
Solution: Enable automated IP warmup in Settings > IP Addresses (it should be on by default for new IPs). If you turned it off, re-enable it. During warmup, SendGrid splits your traffic between the new dedicated IP and the shared IP pool, gradually shifting volume to the dedicated IP over weeks. Do not send your full volume on a cold IP. If deliverability is already damaged, pause high-volume sends, re-enable warmup, and start with your most engaged recipients. Monitor mailbox-provider stats to see which providers are rejecting. See /sales-deliverability for a comprehensive warmup guide.
Symptom: You configured an Event Webhook URL but your endpoint is not receiving any event data Cause: The webhook URL is not publicly accessible, HTTPS certificate is invalid, the endpoint is returning non-2xx status codes, or the webhook is not enabled. Solution: Verify the webhook is enabled in Settings > Mail Settings > Event Webhook. Ensure your URL is publicly reachable (not localhost or behind a firewall). Check that your HTTPS certificate is valid and not self-signed. Test the endpoint manually with a POST of sample JSON. Check that your endpoint returns 2xx status codes within 3 seconds — SendGrid treats timeouts and errors as failures and will retry, but eventually stops after 24 hours. Use a tool like ngrok for local development testing. Check SendGrid's Event Webhook activity log for delivery attempts and error codes.
Symptom: Emails deferred or rejected with 421 4.7.32 From: header isn't aligned with either the authenticated SPF or DKIM organizational domain — especially common with scheduled emails
Cause: The From address domain doesn't match the domain you authenticated in SendGrid. For example, sending from a gmail.com address through SendGrid, or sending from [email protected] when only notifications.example.com is authenticated. Gmail and Yahoo enforce DMARC alignment strictly since Feb 2024.
Solution: Go to Settings > Sender Authentication > Authenticate Your Domain and authenticate the exact domain you send from. Add the CNAME records SendGrid generates to your DNS. Make sure your From address matches — if you authenticated example.com, send from [email protected]. Add a DMARC record to your DNS: v=DMARC1; p=none; rua=mailto:[email protected] (start with p=none to monitor). If you're on a shared IP plan and still seeing throttling after fixing authentication, the shared IP may have poor reputation — check it at mxtoolbox.com and consider a dedicated IP (Pro plan).
Symptom: Duplicate webhook events processed despite checking sg_event_id — same email, same event type, same timestamp, but different sg_event_id values
Cause: sg_event_id changes on every retry attempt. Despite the docs calling it a deduplication key, it is unique per delivery attempt, not per logical event.
Solution: Build a composite dedup key from fields that ARE stable across retries: ${sg_message_id}:${event}:${email}. Store processed keys in Redis with a 48-hour TTL (covers SendGrid's 24-hour retry window with margin) or a database table with a unique constraint. Check before processing each event. For high-volume systems, use a Bloom filter or Redis SET with EXPIRE for fast lookups.
Symptom: Error: connect EMFILE when sending hundreds or thousands of emails — typically the first few batches succeed and then later ones fail
Cause: Each sgMail.send() call opens a new HTTP connection. Node.js has a default file descriptor limit (~1024). Concurrent requests exhaust available sockets before earlier connections close. The SendGrid Node SDK does not pool connections.
Solution: Three approaches (pick one): (1) Send sequentially: for (const msg of messages) { await sgMail.send(msg); } — slowest but simplest. (2) Limit concurrency: use p-limit set to 2-10 concurrent requests: const limit = pLimit(5); await Promise.all(msgs.map(m => limit(() => sgMail.send(m))));. (3) Use personalizations: if recipients get the same content with different substitution data, send up to 1000 recipients in a single API call using the personalizations array — this is the most efficient approach and uses just one HTTP connection.
Symptom: Contacts were imported or added via the API but do not appear in segments or lists as expected
Cause: Contact ingestion in Marketing Campaigns is asynchronous — it can take minutes to hours for contacts to be fully indexed and available in segments. Alternatively, the import may have partially failed due to invalid fields or duplicate handling.
Solution: Check the import status in Marketing > Contacts > Imports for errors or warnings. Allow up to 2 hours for large imports to fully index. Verify that custom field names in the import match the custom fields defined in your SendGrid account (mismatches cause fields to be silently dropped). Check that contacts have the expected field values by searching for a specific contact in the UI. For API-added contacts (PUT /v3/marketing/contacts), check the response for the job_id and poll GET /v3/marketing/contacts/imports/{id} for status. If contacts appear in the list but not the segment, review the segment query conditions — ensure the field names and operators match the actual contact data.
tools
Wizlogo (wizlogo.com) platform help — a budget online logo maker (template/style-variation, marketed as "AI") plus a hub of FREE branding tools (business-name, blog-name and slogan generators, business-card maker, invoice generator, color converter, domain search). The pricing traps: the FREE logo is PERSONAL-USE-ONLY; the two cheap paid tiers are RASTER PNG/JPG only — Single (~€39.99 one-time) and Unlimited (~€3.99 per WEEK, recurring) — and VECTOR (SVG/PDF/EPS) is gated to the ~€299.99 Enterprise tier, which also bundles human designer edits and a social kit. Transparent PNG is on all paid plans. Use when making a Wizlogo logo, understanding free-vs-paid or personal-vs-commercial use, which tier unlocks vector/SVG for print, the weekly-subscription billing trap, its free name/slogan generators, or whether it has an API (UI-only — no public API, webhooks, Zapier or MCP). Do NOT use to just generate the business name (use /sales-namelix) or to compare/validate branding tools (use /sales-idea-validation).
tools
VistaPrint platform help (vistaprint.com, a Cimpress company) — the small-business design + print + digital-marketing platform: a free AI Logomaker (4 generations, 60 more after free sign-up) exporting SVG/PNG/PDF at 4000x4000 with no watermark, a free Brand Kit, business cards/flyers/signage/apparel/promo print, and a website builder. THE RIGHTS TRAP: VistaPrint states NO intellectual-property rights transfer on an AI-generated logo — you get usage rights but CANNOT register it for trademark or copyright; only its human designer service transfers full IP. Use when making a VistaPrint logo, asking if you own or can trademark it, running out of AI logo credits, printed colors not matching the screen, bleed/DPI/font file-prep rejections, or asking whether VistaPrint has an API (the consumer site does not — automation runs through the parent Cimpress Open partner-fulfilment API). Do NOT use for Vista Social scheduling (use /sales-vistasocial) or comparing logo tools market-wide (use /sales-idea-validation).
tools
Turbologo (turbologo.com) platform help — a budget AI/DIY logo maker: enter a business name + industry, pick icons and colors, and it proposes logo concepts you refine in an in-browser editor, then pay a one-time fee to download (designing is free, previews are watermarked, downloading is the paywall). Vector SVG/PDF is gated to the mid tier and up; the top tier adds a brand kit (business cards, letterheads, email signatures, social assets). Use when generating a logo in Turbologo, choosing which download tier to buy, vector SVG vs raster PNG, removing the free watermark, the time-limited edit-after-purchase window, pay-to-download pricing questions, whether an AI logo is yours to trademark, or whether Turbologo has an API to bulk-generate logos (it is UI-only — no public API, webhooks, Zapier, or MCP). Do NOT use to generate the business name (use /sales-namelix), compare or validate branding tools across the market (use /sales-idea-validation), or build wider marketing creative (use /sales-canva).
tools
Online Logo Maker (onlinelogomaker.com) platform help — a long-standing free/freemium DIY logo maker: build the mark yourself from icons, shapes, text, and fonts — MANUAL/template-based, NOT enter-a-name-get-AI-concepts. The free pack downloads a LOW-RES 300px PNG with a background; vector SVG, transparent PNG, and 2000px high-res are gated to a one-time lifetime Premium pack (not a subscription). The free tier's commercial-use rights are disputed by reviewers — clean ownership effectively needs Premium, and a shared-icon mark can be non-distinctive. Use for building/editing a logo here, free download vs Premium, vector SVG or transparent PNG, one-time pricing, commercial-use/trademark terms, near-namesake confusion (NOT LogoMaker.com / LogoMakr / Logomakerr.ai), or whether it has an API (UI-only — no API, webhooks, Zapier, MCP). Do NOT use to generate the business name (use /sales-namelix), compare branding tools across the market (use /sales-idea-validation), or build wider creative (use /sales-canva).