Apply Theme
apply-themeFull Description
Apply global styles from a theme template to campaigns.
Parameters (2 required)
campaign_idsarrayCampaign IDs to apply the theme to
theme_template_idintegerTemplate ID whose globals to use as the theme
Turn marketing ideas into campaigns. Create a data-backed omnichannel strategy for email, SMS, and social media. We’ll analyze your business inputs to suggest target audiences and campaign types that work. Ready to launch? We automatically draft the campaign for you. Perfect for generating customized content and actionable marketing plans, whether you have an account or are just getting started.
apply-themeApply global styles from a theme template to campaigns.
campaign_idsarrayCampaign IDs to apply the theme to
theme_template_idintegerTemplate ID whose globals to use as the theme
campaign-plannerCreate a marketing campaign plan with template suggestions.
This tool is for CREATING new plans, not editing campaigns.
WHEN TO USE THIS TOOL:
DO NOT USE — use edit-campaign instead when:
⚠️ ASK FOLLOW-UP QUESTIONS ONLY IF: You MUST ask follow-up questions BEFORE calling this tool if EITHER condition is true: 1. Missing time_period: User hasn't specified when campaigns should run (e.g., 'Next 4 weeks', 'Q1 2024', specific dates) 2. Missing proper business_context: User hasn't provided BOTH:
Do not use generic business_context, always ensure you list specific products/services, the goal of the business, and the industry it is in.
If you have both time_period AND proper business_context (with name + products/services), you can proceed directly without asking follow-up questions. Only ask a max of 2 follow-up questions.
Once you have the proper business context, please call this tool campaign-planner with the proper context.
REQUIRED CONTEXT: 1. Business context (what business, products/services) 2. Campaign goal/theme (optional) 3. Time period (optional)
OUTPUTS:
NOTES: NEVER summarize the plan, after the tool call, this tool contains a widget that will display the plan. DO NOT list the campaigns in your response. Briefly confirm the plan is ready and let the user know they can add campaigns Keep any messaging after the showing the widget in your response super short and to the point.
user_instructionsstringThe user's request (e.g., 'Create a holiday marketing plan')
business_contextstringDescription of the business (e.g., 'Online bakery selling cupcakes')
campaign_themestringCampaign theme/goal (e.g., 'Holiday Promotion'). Optional.
industry_icpstringIndustry Customer Profile - ALWAYS infer from business_context. Options: - 'Community-based': Schools, universities, nonprofits, churches, arts organizations, theaters, museums - 'Digital Sales-based': E-commerce, retail stores, manufacturers, wholesalers, product sellers - 'Professional Services': Law firms, accounting, consulting, marketing agencies, B2B services - 'Subscription-based': SaaS companies, streaming services, membership sites, newsletters, content creators
Community-basedDigital Sales-basedProfessional ServicesSubscription-basedindustry_subdimensionstringSubdimension within the ICP - ALWAYS infer based on industry_icp and business_context. Mapping: - Community-based -> 'Education' (schools, training) OR 'Arts & Live Entertainment' (theaters, events) - Digital Sales-based -> 'Retail Trade' (stores, e-commerce) OR 'Manufacturing' (factories, wholesalers) - Professional Services -> 'Traditional' (legal, accounting) OR 'Marketing/PR' (agencies, consultants) - Subscription-based -> 'SaaS' (software products) OR 'Content' (media, newsletters, creators)
Arts & Live EntertainmentEducationManufacturingRetail TradeMarketing/PRTraditionalContentSaaStime_periodstringTime period (e.g., 'Next 4 weeks'). Optional.
campaign-planner-hybridCreate or refine a marketing campaign PLAN (structure only, not content).
⚠️ CHECK widgetState FIRST:
CAPABILITIES: Create plans, add/remove/modify campaigns (title, date, audience, channel).
BEFORE CALLING — DETERMINE INTENT: 1) Editing content (subject lines, body) -> use content-preview-hybrid 2) Modifying/adding/removing campaigns -> REFINEMENT (pass session_id) 3) Otherwise -> NEW PLAN
FOR NEW PLANS:
FOR REFINEMENT: Pass session_id (from previous response) + user_instructions.
RULES: Always pass session_id for refinements.
user_instructionsstringThe user's raw request.
audiencestringTarget audience. Leave EMPTY unless explicit.
business_contextstringBrief description of the business.
campaign_themestringLeave EMPTY unless user explicitly stated it.
industry_icpstringIndustry Customer Profile - ALWAYS infer from business_context. Options: - 'Community-based': Schools, universities, nonprofits, churches, arts organizations, theaters, museums - 'Digital Sales-based': E-commerce, retail stores, manufacturers, wholesalers, product sellers - 'Professional Services': Law firms, accounting, consulting, marketing agencies, B2B services - 'Subscription-based': SaaS companies, streaming services, membership sites, newsletters, content creators
Community-basedDigital Sales-basedProfessional ServicesSubscription-basedindustry_subdimensionstringSubdimension within the ICP - ALWAYS infer based on industry_icp and business_context. Mapping: - Community-based -> 'Education' (schools, training) OR 'Arts & Live Entertainment' (theaters, events) - Digital Sales-based -> 'Retail Trade' (stores, e-commerce) OR 'Manufacturing' (factories, wholesalers) - Professional Services -> 'Traditional' (legal, accounting) OR 'Marketing/PR' (agencies, consultants) - Subscription-based -> 'SaaS' (software products) OR 'Content' (media, newsletters, creators)
Arts & Live EntertainmentEducationManufacturingRetail TradeMarketing/PRTraditionalContentSaaSmodestringOperation mode: - 'plan': Create or refine campaign plan (default) NOTE: Content generation happens automatically in the widget UI.
planplansession_idstringSession ID for persistence. ALWAYS pass from previous response for refinements.
time_periodstringLeave EMPTY unless user explicitly stated it.
content-preview-hybridModify the content of an email, social, or SMS campaign (subject lines, body copy, preview text, messaging).
WHEN TO USE THIS TOOL:
DO NOT USE FOR:
MODES:
REQUIRED PARAMS for refine:
modestringgenerate = create content, refine = update a single campaign, fetch = get current session state (no generation)
generaterefinefetchbusiness_contextstringOptional override of business context (legacy-style direct calls).
campaignobjectFor refine (legacy-style): the single campaign (with current content) to update.
campaign_idstringHybrid refine: ID of the campaign to update (resolved from session/plan_json).
campaign_idsarrayHybrid generate: list of campaign IDs. Use ['all'] for all campaigns. Uses campaigns from session/plan_json.
campaign_themestringOptional theme override (used in generate prompts).
campaignsarrayFor generate: campaigns to generate content for (legacy-style). If omitted, uses plan_json or session.
instructionsstringFor refine: what to change (e.g., 'shorten preview text').
plan_jsonobjectLegacy-style plan payload (campaigns, business_context, campaign_theme, time_period). Optional when session_id is provided.
session_idstringSession ID from campaign-planner-hybrid (optional if campaigns provided directly).
time_periodstringOptional time period override (used in generate prompts).
edit-campaignProxy to a specialized AI editing agent that applies ANY change to a campaign — text, visual, thematic, structural, layout, images, colors, tone, and more.
You do NOT need to know how to make the change. Just pass the user's request as modification_request. The downstream agent handles everything.
ALWAYS call this tool when the user wants to change, edit, update, improve, or modify a campaign. This includes:
For METADATA changes (date, title, audience, description), pass the new values directly via the optional fields below. These are applied instantly without an AI edit.
Works for email, SMS, and social campaigns.
campaign_id: Use widgetState.selectedCampaignId when the user is in fullscreen editing a specific campaign. When in inline/carousel mode, use widgetState.campaigns (an array of {index, id, title, channel, date}) to resolve the user's reference (e.g. '3rd campaign', 'the social post', 'the March newsletter') to the correct campaign_id. modification_request: the user's request, passed as-is
Edits are reversible. Do not ask for confirmation.
campaign_idstringCampaign ID. In fullscreen: use widgetState.selectedCampaignId. In inline/carousel: look up widgetState.campaigns to match the user's reference by index, title, channel, or date.
modification_requeststringThe user's request, verbatim or lightly paraphrased. Pass exactly what they asked for.
audiencestringNew target audience. Only pass this when the user explicitly asks to change the audience.
datestringNew campaign date (e.g. 'March 3, 2025'). Only pass this when the user explicitly asks to change the date.
descriptionstringNew campaign description. Only pass this when the user explicitly asks to change the description.
titlestringNew campaign title. Only pass this when the user explicitly asks to change the campaign title.
edit-textEdit text in an email template. Supports direct replacement or AI-powered generation. Widget-only tool.
campaign_idstringID of the campaign being edited
modestring'replace' for direct text, 'generate' for AI
replacegenerateoriginal_textstringText to find and replace
instructionsstringAI instructions (required for 'generate' mode)
new_textstringNew text (required for 'replace' mode)
get-campaign-contentGenerate or retrieve email content for a campaign.
campaign_idstringCampaign UUID to generate content for.
get-email-themesFetch email themes with templates for theme selection. Widget-only, not for ChatGPT model.
campaign_idstringID of the campaign to get themes for
include_allbooleanWhether to include 'All' templates. Set to false if already cached.
Trueis_authenticatedbooleanWhether user is authenticated. If false, only 'All' templates are returned.
Falseget-enrichmentWait for campaign enrichment to complete and return enriched data.
campaign_idstringCampaign UUID to wait for enrichment.
replace-imageReplace an image in an email template with a user-uploaded file. This is a widget-only tool called from the campaign-planner-v3 UI.
campaign_idstringID of the campaign being edited
file_namestringOriginal filename for Mailchimp File Manager
image_fileobjectUploaded image file from OpenAI
original_image_urlstringURL of the image to replace (all instances)
block_idstringNuni IMAGE block ID for targeted single-image replacement
save-to-mailchimpSave a campaign plan to your Mailchimp account. This stores your marketing plan for future use.
Call this when the user wants to save, export, or start their campaign plan in Mailchimp, OR when the user asks to create a Mailchimp account or to save their account. Call this only if the user has already created a campaign plan using campaign-planner. The plan will be loaded from session storage automatically - do NOT try to reconstruct or pass the plan data manually.
Args:
plan_namestringName for the marketing plan (use the campaign theme).
save-to-mailchimp-hybridSave a campaign plan to your Mailchimp account. This stores your marketing plan for future use.
Call this when the user wants to save, export, or start their campaign plan in Mailchimp, OR when the user ask to create a Mailchimp account or to save their account.Call this only if the user has already created a campaign plan using campaign-planner-hybrid. REQUIRED: Pass the session_id from the campaign-planner-hybrid response. The plan will be loaded from session storage automatically - do NOT try to reconstruct or pass the plan data manually.
Args:
plan_namestringName for the marketing plan (use the campaign theme).
session_idstringSession ID from campaign-planner-hybrid's structuredContent.session_id. REQUIRED - the plan will be loaded from session storage.