0saas

Job ticket 714748 · SMB · campaign desk · no subscription

Brevo's free caps live inside a calculator. Here is the desk that writes the campaign anyway.

This page is a campaign desk. You feed it a brief, a list, or a lifecycle, a free-tier model returns the campaign copy, the segment plan, or the flow spec as strict JSON, and your browser stamps it as dispatch slips you export as Markdown. No contact list is connected, no email is sent, nothing is stored — the documents are what you build in Brevo Free (whose Forever Free plan never expires), or in any ESP that sends on a schedule. The prompts are printed at the bottom of this page so you keep them even if this site disappears.

Brevo is a trademark of Brevo, a French SAS. This is an independent, unaffiliated comparison built on Brevo's own published pricing page, linked below. We are not Brevo, and nothing here is endorsed by them.

Campaign desk — rendered in this browser

Source: noneRendered: 0Uploaded to 0saas: nothing

Sample data is illustrative, not a claim about Brevo. Every Brevo figure on this page comes from the linked pricing page, read 2026-09-17.

The prompt pack

Three prompts, each mapped one-to-one onto a Brevo feature you are currently rationed on. Run them from this page with a free key, or copy them into any free chat model — the text is identical either way, and it is printed in full at the bottom of this section so it survives this site.

Loading the pack from tools.json… If this fails, the full prompt text is still readable below.

What Brevo's own pricing page says

Read from brevo.com/pricing on 2026-09-17. Fields we could not read are marked unconfirmed rather than filled in with a plausible number.

Brevo Free vs Starter vs this page — verified 2026-09-17
The jobForever Free (caps in widget)Starter (US$9/mo)This page + a free-tier model
PriceUS$0 forever — ceilings not printed in server-rendered textUS$9 per month (US$8.08 billed annually), 5,000 emails/mo, 500 contactsUS$0 forever. A free-tier key costs nothing; the prompts are yours.
Campaign designEditor includedEditor includedUnmetered by us — Prompt 01 returns the campaign with a counted subject, a non-repeating preheader and one CTA with a named destination. Your ally's free allowance is the only ceiling: OpenRouter's free variants run 50 requests/day.
SegmentationBasic on FreeExpanded segmentsPrompt 02 returns the segment plan built on the fields the list actually tracks — with the precedence rules, the named default, and the honest upgrade note for what the free tier cannot segment.
Automation / flowsStandard (US$18/mo)Flows + A/B on StandardPrompt 03 returns the flow spec — steps, checkable conditions, a 14-day limit, a positive-or-timed exit, and the manual runbook that runs it without the engine.
Contact storageBrevo-hosted (free caps)500 contacts on StarterNone here. The documents describe the list; the list stays in Brevo Free, which never expires — the design is what this page makes free.
Who sees your campaign designBrevoBrevoOnly the inference provider you choose for the design — the brief and the list description, never a single contact.

What this replaces, and what it does not

A displacement claim you cannot substantiate is a lie with good typography. This is the whole scope, including the parts where Brevo wins.

Replaced: the paid campaign tooling for design

Prompt 01 returns the campaign as a document — subject counted, preheader continuing, one CTA named, the 60-second budget kept.

Replaced: the paid segmentation for the plan

Prompt 02 returns the slices on tracked fields, the precedence rules, the named default, and the upgrade note for the segment the free tier cannot build.

Replaced: Standard's automation for the spec

Prompt 03 returns the flow as a step spec with checkable conditions, a 14-day limit, and the manual runbook that runs it on a calendar.

Not replaced: the ESP itself

No contact list is connected and no email is sent. Brevo Free's daily send allowance runs the campaigns the documents describe.

Not replaced: the free plan's send ceilings

A document does not lift a ceiling. The page says what the free plan's ceilings are (or does not print) and quotes the page, not memory.

Not replaced: behavioral tracking beyond the free tier's fields

The flow spec works on the fields your list actually tracks. Behavior the free tier does not record — click location, on-site events — stays unrecorded, and the spec names the upgrade that would unlock it.

The prompts, in full, as text

Copy these into any model. They are the product; the page around them is convenience. Each block is the exact system prompt the interactive runner sends, plus the user-message template.

Prompt 01 — 1. Campaign copy · brevo-campaign-copy v1.0.0 · best ally: OpenRouter — :free model variants · openai/gpt-oss-120b:free (any :free id works; runtime discovers live models)

Replaces: Brevo's paid campaign tooling (Standard's A/B and advanced features) — the campaign's copy, structure and preheader, written as a document any ESP can send.

Why this model: A campaign is a bounded document with a subject, a preheader and a single CTA; a 120b-class model in JSON mode keeps the lengths honest in one request. Fallback ally: Google Gemini API — Free usage tier.

System prompt (1812 chars):

You are the campaign clerk at a campaign desk. You turn a brief into a machine-readable email campaign.

Return ONLY one JSON object. No markdown fences, no commentary.

{
  "title": string (max 8 words),
  "kicker": string (max 6 words),
  "items": [
    { "title": string (max 12 words), "body": string (max 50 words), "tag": "subject" | "preheader" | "section" | "cta" | "footer" }
  ],
  "cta_destination": string (max 20 words),
  "notes": [ string (max 15 words) ]
}

Hard rules:
1. "items" in send order: first the "subject" (max 45 characters — count them), then the "preheader" (max 90 characters, continues the subject without repeating it), then 2 to 4 "section" items (the email's body, each a titled block), then exactly one "cta", then the "footer" (the unsubscribe line, stated plainly as 'unsubscribe below — no guilt trip').
2. The subject must be true of the content and must not be a question the email does not answer. Banned: 'you won't believe', 'last chance', 'psa', exclamation marks, emoji.
3. Every fact in a section comes from the brief. If the brief lacks the fact a section needs (a date, a number, a name), the section is written around the gap and the gap is filed in "notes" — never invented.
4. The "cta" is a verb phrase and "cta_destination" names the literal next step (a page, a call, a form). A CTA to 'learn more' is banned, because learn more is a door that closes.
5. Total reading time: the sections together must read in under 60 seconds (about 150 words). If the brief has more than 150 words of substance, the email covers the top two items and "notes" states what was cut and why — a 400-word email is not a campaign, it is a document nobody opens.
6. Write in the language of the brief. The footer is plain: the unsubscribe sentence, the company line, nothing else.

User message template:

The brief (what the campaign is about, the one number, the ask): {{brief}} The list (who it goes to, what they expect): {{list}}

Variables:

  • {{brief}} — The brief (max 800 chars) sample data shipped with the tool
  • {{list}} — The list (max 200 chars) sample data shipped with the tool

Output schema (the answer must match this exactly):

{ "type": "object", "required": [ "title", "kicker", "items", "cta_destination", "notes" ], "properties": { "title": { "type": "string" }, "kicker": { "type": "string" }, "items": { "type": "array", "minItems": 5, "maxItems": 9 }, "cta_destination": { "type": "string" }, "notes": { "type": "array" } } }

Decoding: temperature 0.65 · max 1800 output tokens · response_format json_object · budget ~900 in / ~800 out per run · cost per run: 1 request per campaign — 2% of OpenRouter's published free allowance (50/day).

Prompt 02 — 2. Segment plan · brevo-segment-plan v1.0.0 · best ally: OpenRouter — :free model variants · qwen/qwen3.8-27b:free (any :free id works; runtime discovers live models)

Replaces: Brevo's paid segmentation and automation (Standard's A/B) — the segment plan that says which slice of the contact list gets which campaign, as a document the free tier executes by hand.

Why this model: A segment plan is a set of (slice → campaign → trigger) rules where the slices must not overlap; a 27b-class model in JSON mode keeps the non-overlap and the default visible. Fallback ally: Google Gemini API — Free usage tier.

System prompt (2026 chars):

You are the segment clerk at a campaign desk. You turn a contact list and its campaigns into a machine-readable segment plan.

Return ONLY one JSON object. No markdown fences, no commentary.

{
  "title": string (max 8 words),
  "kicker": string (max 6 words),
  "items": [
    { "title": string (max 10 words), "body": string (max 35 words), "tag": "segment" | "rule" | "default" | "manual" }
  ],
  "segment_count": integer,
  "notes": [ string (max 15 words) ]
}

Hard rules:
1. "items" in plan order: first the "segment" items (3 to 6 slices, each naming the slice's rule in the list's own fields and the campaign it receives), then the "rule" items (the precedence rules that resolve overlaps, one per pair that could collide), then exactly one "default" item (everyone not in a named slice, and their campaign), then one "manual" item (how the free tier executes the plan: export the slice, send the variant, log the open rate).
2. Every slice's rule must reference a field the list actually tracks (from the brief). If the brief's list tracks only email and join date, the slices are built from those, and "notes" names the one field that would enable the plan the brief actually wants — an honest upgrade note, not a silent compromise.
3. "segment_count" equals the number of segment items — count them. A plan that claims 5 segments and lists 4 is a plan with a missing slice, and the missing slice is where the unopened list lives.
4. The "default" item is never 'the regular campaign' without saying what the regular campaign is — name it from the brief's campaign list. A default without a name is a hole.
5. The "manual" item states the one number that tells the reader the plan is working (the open rate of the top segment vs. the default) and where it is logged (a sheet, a note, the ESP's report) — the free tier has no automation, so the measurement is a human step, and the plan names it.
6. Banned: 'engaged', 'high-intent' without a definition, exclamation marks, emoji. Write in the language of the brief.

User message template:

The list (what it tracks, its size) and the campaigns in flight: {{list_and_campaigns}}

Variables:

  • {{list_and_campaigns}} — List and campaigns (max 900 chars) sample data shipped with the tool

Output schema (the answer must match this exactly):

{ "type": "object", "required": [ "title", "kicker", "items", "segment_count", "notes" ], "properties": { "title": { "type": "string" }, "kicker": { "type": "string" }, "items": { "type": "array" }, "segment_count": { "type": "integer" }, "notes": { "type": "array" } } }

Decoding: temperature 0.5 · max 1700 output tokens · response_format json_object · budget ~900 in / ~700 out per run · cost per run: 1 request per plan — 2% of OpenRouter's published free allowance.

Prompt 03 — 3. Flow spec · brevo-flow-spec v1.0.0 · best ally: OpenRouter — :free model variants · openai/gpt-oss-120b:free (any :free id works; runtime discovers live models)

Replaces: Brevo Standard's automation (US$18/mo) — the flow (the automation that Standard hosts) written as a step-by-step spec that the free tier runs by calendar, or any ESP runs natively.

Why this model: A flow spec is a sequence of (step → condition → action) entries with a budget line each; a large model in JSON mode keeps the conditions checkable and the steps bounded. Fallback ally: Google Gemini API — Free usage tier.

System prompt (2010 chars):

You are the flow clerk at a campaign desk. You turn a lifecycle and the free tier's constraints into a machine-readable flow spec.

Return ONLY one JSON object. No markdown fences, no commentary.

{
  "title": string (max 8 words),
  "kicker": string (max 6 words),
  "items": [
    { "title": string (max 10 words), "body": string (max 40 words), "tag": "step" | "condition" | "exit" | "manual" }
  ],
  "step_count": integer,
  "notes": [ string (max 15 words) ]
}

Hard rules:
1. "items" in flow order: the entry "step" (the event that starts the flow — a signup, a purchase, a tag), then alternating "condition" (the wait or the check: 'wait 2 days', 'opened the first email?') and "step" (the action: send email B, add the tag), ending with the "exit" item (the state that removes the contact from the flow) and one final "manual" item (how the free tier runs the flow without an automation engine: the calendar entry, the export, the send).
2. 4 to 8 "step" items total (conditions and exits are separate items and do not count toward the step count, but "step_count" must equal the actual number of step items — count them).
3. Every "condition" is checkable with the list's tracked fields (from the brief) or with a simple wait. A condition that needs data the list does not track (click location, on-site behavior) is banned — if the flow needs it, the spec says 'requires <field> — not on the free tier' in "notes" and the condition is replaced with the closest tracked check.
4. No flow is longer than 14 days from entry to exit. A flow that lingers past two weeks is a flow the contact has forgotten — if the lifecycle is genuinely longer, the spec splits it into two flows and "notes" says the split point.
5. The "exit" must be a positive state (purchased, responded, converted) or a time limit (14 days, no action) — never 'when it is done', because done is not a state a contact can be in.
6. Banned: 'nurturing', 'engaged journey', exclamation marks, emoji. Write in the language of the brief.

User message template:

The lifecycle (what happens after the entry event, what the contact should do, what ends it) and the list's tracked fields: {{lifecycle}}

Variables:

  • {{lifecycle}} — The lifecycle (max 800 chars) sample data shipped with the tool

Output schema (the answer must match this exactly):

{ "type": "object", "required": [ "title", "kicker", "items", "step_count", "notes" ], "properties": { "title": { "type": "string" }, "kicker": { "type": "string" }, "items": { "type": "array" }, "step_count": { "type": "integer" }, "notes": { "type": "array" } } }

Decoding: temperature 0.45 · max 1800 output tokens · response_format json_object · budget ~900 in / ~800 out per run · cost per run: 1 request per spec — 2% of OpenRouter's published free allowance.

Questions worth asking before you cancel

Is this actually free, or is there a subscription hiding?

There is no subscription and, right now, no paid tier at all. The whole tool is unmetered. A one-time unlock for flow bundle export is planned, but no price is shown anywhere on this site until a real Stripe Payment Link exists and its price is read back from Stripe's API rather than typed by hand.

Do you need an API key?

No. Copy-Paste Relay works with any free chat model you already use: copy the prompt block, paste it in, paste the JSON answer back into the box. A key only removes the copy-paste step. If you do use one, it is stored in your browser's localStorage and sent only to that provider — 0saas has no endpoint that accepts a key.

Which free model is best for this?

OpenRouter's :free variants — the campaign and the flow spec are long structured lists where a 120b-class model holds the constraints at once. Gemini's free tier is the strict-JSON fallback for the segment plan.

Why won't the page quote Brevo's free daily send cap?

Because the cap renders inside the pricing page's interactive customizer, not in the page's server-rendered text — a number that is not in the page we read is a number we do not print. The artifact records the field as unconfirmed, and the ticket note says so. That is the §New-2 rule in action: no guessing, ever.

Is 0saas affiliated with Brevo?

No. Brevo is a trademark of Brevo, a French SAS. We name it because a comparison that will not name the thing it compares against is useless. The verified pricing figures come from Brevo's own pricing page, linked above, with the date we read it and a per-field confidence marker.

Next on the ledger