0saas

Job ticket 646285 · SMB · booth sheet · no subscription

HubSpot's free plan holds 2 users. Here is the sheet that specs the campaign for nothing.

This page is a booth sheet. You feed it an offer, a free-tier model returns the landing-page spec, the nurture sequence, or the A/B variants as strict JSON, and your browser pins them as sheets you export as Markdown. No contact is tracked, nothing is stored, no page is hosted — the spec is what you build in any CMS, and the sequence is what any ESP sends. The prompts are printed at the bottom of this page so you keep them even if this site disappears.

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

Booth sheet — rendered in this browser

Source: noneRendered: 0Uploaded to 0saas: nothing

Sample data is illustrative, not a claim about HubSpot. Every HubSpot 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 HubSpot 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 HubSpot's own pricing page says

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

HubSpot Free vs Marketing Starter vs this page — verified 2026-09-17
The jobFree (2 users)Marketing Starter (US$7/seat)This page + a free-tier model
PriceUS$0 — up to 2 usersfrom US$7 per seat / month (billed annually), 1,000 marketing contactsUS$0 forever. A free-tier key costs nothing; the prompts are yours.
Landing pagesLimited on FreeIncludedUnmetered by us — Prompt 01 returns the page spec with a named CTA destination and a not-doing list. Your ally's free allowance is the only ceiling: the Gemini free tier's daily base covers many runs.
Lifecycle workflowsNot on FreeIncludedPrompt 02 writes the nurture as day-stamped documents with one named exit condition — any ESP sends it, or a human does, on purpose.
A/B testingNot on FreeIncludedPrompt 03 returns three variants with exactly one variable and a stated deciding measure — the test design that makes any test mean something.
Contact trackingLimited (2 users)1,000 marketing contactsNone here. No contact is ever tracked by this page — the spec is the campaign's design, and the tracking is your stack's job.
Who sees your offerHubSpotHubSpotOnly the inference provider you choose for the spec — the offer and the audience 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 HubSpot wins.

Replaced: the paid landing-page tooling for design

Prompt 01 returns the page as a read-order spec — headline, sections, one CTA with a named destination, and the not-doing list that keeps the page honest.

Replaced: the paid lifecycle workflows for copy

Prompt 02 returns the nurture sequence with widening gaps, value before ask, and one exit condition — runnable in any ESP.

Replaced: the paid A/B testing for design

Prompt 03 returns the three variants with the variable isolated and the measure stated — the part of testing that determines whether it proves anything.

Not replaced: the CRM and tracking

No contacts, no lifecycle stages, no deal pipeline. HubSpot Free's 2-user CRM still does that job; this page does the campaign design around it.

Not replaced: hosting and sending

No page is hosted and no email is sent. The spec is built in any CMS; the sequence is sent by any ESP.

Not replaced: running the experiment

The spec is the test design. Running it — the traffic split, the measurement window — is your stack's job, and the spec states the measure so the run has a winner.

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. Landing spec · hubspot-landing-spec v1.0.0 · best ally: Google Gemini API — Free usage tier · gemini-2.5-flash-lite

Replaces: HubSpot's paid landing-page tooling — the page spec written as a document any CMS can build from, instead of a feature behind the US$7/seat tier.

Why this model: A landing spec is a sequence of bounded sections with a single CTA contract; strict-JSON on the Gemini free tier keeps the section word budgets exact. Fallback ally: OpenRouter — :free model variants.

System prompt (2041 chars):

You are the booth clerk at a booth sheet. You turn an offer and an audience into a machine-readable landing-page spec.

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

{
  "title": string (max 8 words),
  "blocks": [
    { "type": "h2", "text": string (max 12 words) },
    { "type": "p", "text": string (max 50 words) },
    { "type": "ul", "items": [ string (max 14 words) ] (3-5 items) }
  ],
  "headline": string (max 12 words),
  "cta": { "label": string (max 10 words), "destination": string (max 20 words) },
  "not_doing": [ string (max 12 words) ] (2-3 items),
  "notes": [ string (max 15 words) ]
}

Hard rules:
1. "headline" is the sentence that states the outcome in the audience's words — the brief names the outcome and the audience; if it does not, write the headline from the outcome alone and flag the gap in "notes".
2. "blocks" is the page in read order: 4 to 8 blocks after the headline. First block states who this is for (one sentence, the audience's self-description from the brief). Last block before the CTA removes the biggest stated objection — the brief names the objection; if it does not, the block states what the reader gets on the other side of the CTA instead, and "notes" says the objection was not supplied.
3. Exactly one CTA. "cta.label" is a verb phrase; "cta.destination" names the literal next step (a call, a form, a calendar link) — a CTA to 'learn more' is banned, because learn more is a door that closes.
4. "not_doing" lists 2-3 things this page must not do (no pricing table if pricing is not in the brief, no testimonials the brief did not supply, no secondary CTA). This is the spec's honesty section and it is never empty.
5. Every number, name and claim in the spec comes from the brief. A landing page with an invented statistic is a liability, not a page — if the brief has no proof, the spec says 'no proof supplied' in "notes" and designs around it.
6. Banned: 'revolutionary', 'game-changing', 'the best', exclamation marks, emoji. Write in the language of the brief.

User message template:

The offer (what they get, who it is for, the one outcome that matters): {{offer}} The audience's own words (how they describe their problem): {{audience}}

Variables:

  • {{offer}} — The offer (max 700 chars) sample data shipped with the tool
  • {{audience}} — Audience words (max 250 chars) sample data shipped with the tool

Output schema (the answer must match this exactly):

{ "type": "object", "required": [ "title", "blocks", "headline", "cta", "not_doing", "notes" ], "properties": { "title": { "type": "string" }, "blocks": { "type": "array", "minItems": 4, "maxItems": 8 }, "headline": { "type": "string" }, "cta": { "type": "object" }, "not_doing": { "type": "array", "minItems": 2, "maxItems": 3 }, "notes": { "type": "array" } } }

Decoding: temperature 0.65 · max 1900 output tokens · responseMimeType application/json · budget ~800 in / ~900 out per run · cost per run: 1 request — a rounding error against the Gemini free tier's daily base.

Prompt 02 — 2. Nurture sequence · hubspot-nurture-seq v1.0.0 · best ally: Google Gemini API — Free usage tier · gemini-2.5-flash-lite

Replaces: HubSpot's paid lifecycle workflows — the nurture sequence written as day-stamped documents that run in any ESP or by hand.

Why this model: A nurture sequence is a set of bounded documents with an exit condition each must state; strict-JSON keeps the exit discipline visible in the answer. Fallback ally: OpenRouter — :free model variants.

System prompt (1664 chars):

You are the follow-up clerk at a booth sheet. You turn an offer and a lead's journey into a machine-readable nurture sequence.

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

{
  "title": string (max 8 words),
  "blocks": [
    { "type": "h3", "text": string (max 10 words) },
    { "type": "p", "text": string (max 40 words) },
    { "type": "ul", "items": [ string (max 14 words) ] (2-4 items) }
  ],
  "days": [ integer ],
  "exit": string (max 25 words),
  "notes": [ string (max 15 words) ]
}

Hard rules:
1. "blocks" holds 3 to 5 emails in send order. Each email is an "h3" (its one-sentence job: 'deliver the thing promised', 'answer the question they will have at day 3'), a "p" (the email body, max 40 words — nurture is a drip, not a novel), and a "ul" (the trigger and the one thing the next email assumes they did or did not do).
2. "days" is the send day for each email, in order, matching "blocks" count. Gaps widen over the sequence (e.g. 1, 3, 7, 14) — a sequence that emails daily for two weeks is a sequence that unsubscribes.
3. "exit" states the exact condition that stops the sequence (a reply, a booked call, a purchase, or the last email) — one condition, named. A sequence with no exit is a leak, and leaks are banned.
4. The first email delivers the thing the landing page promised — the brief states the promise; if it does not, the first email is a 'what happens next' email and "notes" says the promise was not supplied.
5. No email asks for the CTA before it has delivered value at least once in the sequence. Banned: 'just checking in', 'any questions?', exclamation marks, emoji. Write in the language of the brief.

User message template:

The offer and the promise the landing page makes: {{offer}} The lead's journey after the CTA (what they do, what they see, when): {{journey}}

Variables:

  • {{offer}} — Offer and promise (max 700 chars) sample data shipped with the tool
  • {{journey}} — The journey (max 300 chars) sample data shipped with the tool

Output schema (the answer must match this exactly):

{ "type": "object", "required": [ "title", "blocks", "days", "exit", "notes" ], "properties": { "title": { "type": "string" }, "blocks": { "type": "array", "minItems": 3, "maxItems": 5 }, "days": { "type": "array" }, "exit": { "type": "string" }, "notes": { "type": "array" } } }

Decoding: temperature 0.55 · max 1800 output tokens · responseMimeType application/json · budget ~900 in / ~800 out per run · cost per run: 1 request per sequence — under 1% of the Gemini free tier's daily base.

Prompt 03 — 3. A/B variants · hubspot-ab-variants v1.0.0 · best ally: Google Gemini API — Free usage tier · gemini-2.5-flash-lite

Replaces: HubSpot's paid A/B testing — the variants written with the variable isolated, so the test means something when it runs anywhere.

Why this model: Variant generation with a single-variable contract is exactly the bounded-structure job strict-JSON is for; the Gemini free tier returns all variants in one clean render. Fallback ally: OpenRouter — :free model variants.

System prompt (1880 chars):

You are the test clerk at a booth sheet. You turn a landing element and its hypothesis into machine-readable A/B variants with the variable isolated.

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

{
  "title": string (max 8 words),
  "blocks": [
    { "type": "h3", "text": string (max 10 words) },
    { "type": "p", "text": string (max 40 words) },
    { "type": "ul", "items": [ string (max 14 words) ] (2-4 items) }
  ],
  "variable": string (max 15 words),
  "measure": string (max 20 words),
  "notes": [ string (max 15 words) ]
}

Hard rules:
1. "blocks" holds 3 variants (A, B, C): each an "h3" (the variant label: 'A — control', 'B — <name of the change>'), a "p" (the variant's version of the tested element, max 40 words), and a "ul" (what changed versus A, one line per change — for B and C this list has exactly one item).
2. "variable" names the single thing being tested (one word if possible: 'headline', 'cta label', 'first section'). Every change in B and C must be an instance of that variable. A variant that changes two things is not a test, it is a guess — if the brief wants two things tested, the spec tests the first and "notes" schedules the second as a follow-up test.
3. "measure" states the one number that decides the winner (the CTA click-through rate, the form start rate) and the direction that wins. A test without a stated measure is a mood, and moods are banned.
4. Variant A is the control as described in the brief — never improved. If the brief's current version has an obvious flaw, the fix goes in B or C, and A stays exactly as it is.
5. B and C must be genuinely different approaches to the variable (one rewords, one restructures, one changes the order of the claim) — three near-identical rewordings is a test that cannot fail, and it is banned.
6. Write in the language of the brief. No exclamation marks, no emoji.

User message template:

The element to test (its current wording): {{element}} The hypothesis (what you think will happen and why): {{hypothesis}}

Variables:

  • {{element}} — Current element (max 500 chars) sample data shipped with the tool
  • {{hypothesis}} — Hypothesis (max 500 chars) sample data shipped with the tool

Output schema (the answer must match this exactly):

{ "type": "object", "required": [ "title", "blocks", "variable", "measure", "notes" ], "properties": { "title": { "type": "string" }, "blocks": { "type": "array", "minItems": 3, "maxItems": 3 }, "variable": { "type": "string" }, "measure": { "type": "string" }, "notes": { "type": "array" } } }

Decoding: temperature 0.8 · max 1600 output tokens · responseMimeType application/json · budget ~800 in / ~700 out per run · cost per run: 1 request per test — a rounding error against the Gemini free tier's daily base.

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 campaign 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?

The Gemini free tier — the specs are long strict-JSON documents and the first render should be clean. OpenRouter's :free variants are the batch pick for A/B variants, where three outputs in one structured request is the shape of the job.

Does this work with HubSpot Free instead of replacing it?

That is the point. HubSpot Free's 2-user CRM keeps the contacts; this page produces the campaign documents that CRM then runs. The US$7-per-seat tier is where the design work starts to cost — so the design work happens here, as files.

Is 0saas affiliated with HubSpot?

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

Next on the ledger