newsletter-writer
Newsletter Writer
Plan and draft the bi-weekly Tiger Data developer newsletter. Surfaces recent content from Tiger Den, organizes it into the standard newsletter sections, and drafts each section in brand voice with UTM-tagged links. The user provides event details, external press mentions, and community content that isn't tracked in Tiger Den.
When to use this skill
- Drafting a new newsletter edition
- Planning what content to include in the next newsletter
- Writing newsletter copy for specific sections
- When someone says "it's newsletter time" or "let's do the newsletter"
When NOT to use this skill
- Writing standalone email sequences or drip campaigns (use email-nurture-planner)
- Writing social posts to promote the newsletter (use social-post-writer)
- Writing blog posts or long-form content (use brand-voice-writer)
Step 0: Pre-flight check
Read REFERENCES.md from the plugin root and run the pre-flight check described there. Call list_marketing_references() to verify Tiger Den is reachable. If it fails or the tool is not found, STOP — do not continue. Follow the error handling in REFERENCES.md.
Also fetch the No Fly List before doing any work:
get_marketing_reference(slug: "no-fly-list")
This is a list of customers who cannot be publicly referenced. Load these names as a hard constraint: never include any No Fly List customer in any output — not as named examples, proof points, customer quotes, case study references, or any other mention. If the user requests content featuring or referencing a No Fly List customer, stop and inform them that this customer cannot be publicly referenced. If a No Fly List name appears in source material you are working from, omit it from all outputs.
Instructions
1. Load context
This skill requires the Tiger Den MCP server. If Tiger Den tools are not available, tell the user: "This skill needs the Tiger Den MCP server to load brand context and find content. Please connect Tiger Den and try again." Do not proceed without it.
Fetch reference docs before starting:
- Always fetch:
product-marketing-contextandbrand-voice-guideusingget_marketing_context(slugs: ["product-marketing-context", "brand-voice-guide"]). - Read the newsletter template: Read the local reference file at
./references/newsletter-template.mdfor section order, formatting conventions, and CTA patterns. - Freshness check: After fetching, check the "Last updated" date on product-marketing-context. If it is more than 6 months old, flag it: "The product-marketing-context doc was last updated [date]. Some metrics or proof points may be outdated. Want me to proceed or verify first?"
2. Gather the brief
Use AskUserQuestion to collect the brief in two calls. Do not post questions as plain text in chat.
If the user has already provided a list of content upfront (URLs, titles, or descriptions), skip questions for those sections and proceed directly to Step 3.
First call — edition basics (up to 4 questions):
- "When is this edition going out?" — open (user types send date via Other; e.g., "March 20", "next Thursday")
- "Any must-include content for this edition?" — options: Yes (I'll list below), No — source everything from Tiger Den
- "Any product or open-source release to announce?" — options: Yes (I'll describe below), No product update this edition
- "Any upcoming events to feature?" — options: Yes (I'll add details below), No events this edition
Second call — optional sections:
- "Any external press mentions or industry coverage to include?" — options: Yes (I'll share links below), No press this edition
- "Any community-created content to feature?" — options: Yes (I'll share details below), No community content this edition
- "Any sections to skip entirely?" — options: Skip Product Update, Skip Tech Innovation, Skip Developer Events, Skip From the Community (multiSelect: true); or "Include all sections"
After both calls, review the answers. If the user indicated "Yes" to any section (must-include, product update, events, press, community), ask them to provide those details in a follow-up message before proceeding to Step 3.
3. Source content from Tiger Den
Search Tiger Den for recently published content to populate the core sections. Use the send date to calculate the content window: search for content published in the ~4 weeks before the send date.
Run these searches:
list_content(content_type: "blog_post", published_after: "[4 weeks before send date]", sort_by: "published", sort_order: "desc", limit: 10)for From the Blog and Developer Resourceslist_content(content_type: "youtube_video", published_after: "[4 weeks before send date]", sort_by: "published", sort_order: "desc", limit: 5)for From the Communitylist_content(content_type: "third_party", published_after: "[4 weeks before send date]", sort_by: "published", sort_order: "desc", limit: 5)for Tech Innovationlist_content(content_type: "case_study", published_after: "[4 weeks before send date]", sort_by: "published", sort_order: "desc", limit: 5)for Developer Resourceslist_content(content_type: "whitepaper", published_after: "[4 weeks before send date]", sort_by: "published", sort_order: "desc", limit: 5)for Developer Resources
Present the results as a table grouped by newsletter section:
| Section | Title | Published | Type |
|--------------------------|------------------------------------|------------|------------|
| 🐯 Product Update (user) | [Title] | YYYY-MM-DD | n/a |
| 📚 From the Blog | [Title] | YYYY-MM-DD | blog_post |
| ⚙️ Dev Resources | [Title] | YYYY-MM-DD | whitepaper |
| 🎬 Community | [Title] | YYYY-MM-DD | youtube |
Include the must-include items the user provided at the top of the relevant sections (marked as "user-selected").
Ask the user to confirm which items to include and which section each belongs to. Some content may fit multiple sections (e.g., a technical blog post could be "From the Blog" or "Developer Resources"). Let the user decide placement.
4. Draft each section
Once the user confirms the content selection, draft the newsletter.
For each Tiger Den content item:
- Fetch the full text with
get_content_text(id: "[content-id]"). - Read the full content to understand the piece thoroughly.
- Write a 2-4 sentence description following the patterns in the newsletter template reference. Lead with what the reader will learn or gain. Include one specific data point or result when the source material provides one.
- Generate a UTM-tagged link with
generate_utm_link(url: "[content-url]", source: "newsletter", medium: "email", campaign: "newsletter-[send-date]"). - Format the section following the template conventions (emoji, heading, image placeholder, description, CTA link with arrow).
For user-provided items (events, press, community):
- If the user provided a URL, fetch the page content to write a description. If they provided a description, use it.
- Generate UTM-tagged links for internal URLs. External URLs (press coverage, community content) do not need UTM tags.
- Format following the template conventions for that section type.
For boilerplate sections (Careers, Share Your Use Case):
- Use the standard text from the newsletter template reference.
- Generate a fresh UTM-tagged link for the Careers page:
generate_utm_link(url: "https://www.tigerdata.com/careers", source: "newsletter", medium: "email", campaign: "newsletter-[send-date]").
5. Write subject line, preview text, and intro
Draft these after the body sections are complete, since they need to reference the content.
Subject line: Provide 2-3 options. Each should:
- Reference the strongest content piece in the edition
- Be specific and intriguing (a concrete number, result, or question)
- Avoid generic phrases like "This week in Tiger Data" or "Your bi-weekly update"
Preview text: Provide 2-3 options. Each should:
- Complement the subject line (not repeat it)
- Tease 2-3 additional pieces from the edition
- Pattern: "Plus: [item], [item], and [item]"
Intro: Write one intro paragraph following the template format:
- Start with the personalized greeting:
👋 [First Name], - 2-3 sentences summarizing the key highlights with inline links
- Address the reader directly ("you'll discover", "you'll find")
- End with a brief transition like "Let's get into it."
6. Brand voice cross-check
Review the complete draft against the brand voice guide:
- No em dashes. Replace every em dash with a comma, period, colon, or separate sentence.
- Lead with value. Descriptions should open with what the reader gets, not "we published" or "Tiger Data released."
- Terminology. Product names and technical terms must match the glossary in product-marketing-context (e.g., "Tiger Data" not "Timescale", "Tiger Cloud" not "Timescale Cloud" unless quoting historical content).
- CTA consistency. All CTA links should follow the arrow format:
[👉 Descriptive text →](URL). - UTM links. Verify every internal link has UTM parameters.
- No AI slop. Scan for forced triples, sycophantic openers, vocabulary clusters, hallmark-card endings.
Fix issues inline. If no issues are found, state "No voice issues found."
7. Present the complete newsletter
Output the full newsletter as structured Markdown in chat. Use this order:
- Subject line options
- Preview text options
- Intro
- All body sections in template order
- Voice check results
Output format
Present everything directly in chat as structured Markdown. Do not create files unless the user requests one.
Label each section clearly with its emoji and heading. Separate sections with horizontal rules for readability.
Include this note at the end: "To edit any section, tell me what to change. I can also regenerate subject lines, rewrite descriptions, or adjust the content selection."
Tiger Den tools used
get_marketing_context-- fetch product-marketing-context and brand-voice-guide (Step 1)list_content-- browse recent content by type and date to populate sections (Step 3)search_content-- find content on specific topics if the user requests a themed newsletter (Step 3)get_content_text-- read full content items to write accurate descriptions (Step 4)generate_utm_link-- tag all internal links with newsletter UTM convention (Step 4)
Hand-off
After the draft is complete, offer to:
- Run de-slop if any sections read as AI-generated
- Refine individual sections with brand-voice-writer for deeper voice alignment
- Create social posts to promote the newsletter with social-post-writer
Do not auto-trigger other skills. Wait for the user to confirm the output looks good first.