{% extends "base.html" %} {% block title %}Playbook{% endblock %} {#- Settings > Playbook: MESSAGING.md as a form, one tab per approach. Each approach is complete on its own; "Duplicate" copies all of it. The examples beside the boxes are illustrations for any B2B approach, never defaults. -#} {% macro field(name, label, example='', span=12, rows=0, kind='text', error_key='') -%} {%- set err = errors.get(error_key or name) -%} {%- endmacro %} {% block content %}

Playbook

What you sell, to whom, and how you write: the drafts, routines and the outreach bot read it from MESSAGING.md. Selling more than one thing, or to more than one audience? Give each its own approach; the bot picks the approach a company fits. How it works · Back to Settings

{% if pb_error %}

The front matter of MESSAGING.md cannot be read: {{ pb_error }}. Fix it in the file (or ask your agent to); this page would overwrite it.

{% elif foreign %}

MESSAGING.md starts with a front matter of its own (no approaches:), so this page leaves it alone. See How it works for the format.

{% else %} {% if not set_up and exists %}

Your MESSAGING.md is from before the playbook had approaches. Saving the form below sets it up and keeps every line you wrote. To add only the empty parts first:

{% endif %}

{{ filled }} of {{ parts | length }} parts filled {{ filled }} of {{ parts | length }}

{% if gaps %}

The outreach bot will not use this approach yet. Missing: {{ gaps | join('; ') }}.

{% else %}

Ready for the outreach bot.

{% endif %}
{% if approaches | length > 1 %}
{% endif %}
{% if notice %}
{{ notice }}
{% endif %} {% if errors %}

Not saved: fix the boxes marked below.

{% endif %}
Draft it from my website or a document

Give your website, a sales deck or a document (PDF, Word or .txt), or paste text. Hermit CRM reads it, and your AI CLI (Settings > AI, run without tools) proposes each part of this approach from that alone. The proposal fills the boxes below; nothing is saved until you click Save. It never makes up a customer result.

{% if not ai.available %}

No AI CLI is set up: {{ ai.reason }}. Settings > AI

{% endif %} {% if draft_error %}

{{ draft_error }}

{% endif %}
Offer
{{ field('offer_line', 'Offer line: what you sell, in one sentence', 'For example "We build booking software for clinics." or "I run your bookkeeping so you never miss a filing."') }} {{ field('section_offer', 'More about the offer: the outcome, how it works, what you do not do', 'For example: the result a customer gets, the price model, how long it takes, who does what, and what you leave to others.', rows=4) }}
Ideal customer
{{ field('icp_industries', 'Industries', 'Short words, comma-separated: healthcare, b2b-saas, logistics. A company tagged with one counts as a match.', span=6) }} {{ field('icp_countries', 'Countries', 'Two-letter codes: NL, DE, GB', span=6) }} {%- set known = range_fields | map(attribute=0) | list %} {%- for i in range_rows %} {%- set chosen = values.get('range_%d_field' % i, '') %} {{ field('range_%d_min' % i, 'from', span=3, kind='number', error_key='ranges') }} {{ field('range_%d_max' % i, 'to', span=3, kind='number', error_key='ranges') }} {%- endfor %}

Any number your companies record: headcount, revenue, number of salespeople, locations. {% if range_fields %}Fill the empty row and Save to add another.{% else %}Add a field under Settings > Fields first.{% endif %} A text field counts by its first number, so "~13" is 13.

{{ field('icp_funding', 'Funding stage', 'bootstrapped, seed, series-a, private-equity', span=6) }} {{ field('icp_signals', 'Positive signals', 'What makes now a good moment: hiring-sales, new-location, new-ceo, just-raised', span=6) }}

A company outside a range or country here does not get this approach. An empty field cannot decide: the bot asks you.

Not a prospect
{{ field('section_disqualifiers', 'Reasons a company is not a prospect, one per line', 'For example "- They already have a Head of Sales", "- They work with an agency" or "- Public sector". The AI weighs these against what it finds and tells you why; you decide.', rows=3) }} {{ field('dq_tag_present', 'Always leave out companies tagged', 'customer, competitor, do-not-contact. Checked by the app itself, no AI.', span=6) }}
Personas: who buys
{{ field('personas', 'One per line, name: job titles', 'For example "owner: Owner, Managing Director, Founder" and "ops: Operations Manager, COO". A contact\'s title picks the persona.', rows=3) }} {{ field('section_personas', 'Per persona: their top problems, what they care about and ignore', 'For example "owner: no time for admin; cares about cost, ignores technical detail."', rows=4) }}
Proof
{{ field('section_proof', 'Customer results, one per line starting with "- "', 'For example "- A 40-person clinic cut no-shows by a third in three months." Drafts may cite only what is written here.', rows=4) }}
How you sell
{{ field('section_why', 'Why you', 'Why a customer picks you over doing it themselves, hiring someone, another provider or doing nothing.', rows=3) }} {% if sent_count %}
{% endif %} {% if voice_error %}

{{ voice_error }}

{% endif %} {{ field('section_channels', 'Channels', 'For example "- email: one short paragraph and one question" and "- LinkedIn: two sentences, no link".', rows=3) }} {{ field('section_donts', "Don'ts", 'For example "- No invented familiarity. - No claims without proof. - Never name competitors."', rows=3) }}
Lessons: what you tried
{{ field('lessons_worked', 'Worked', 'For example "- A question about how they hire got replies; a meeting ask did not."', span=4, rows=4) }} {{ field('lessons_failed', "Didn't work", 'For example "- Mentioning price in the first message."', span=4, rows=4) }} {{ field('lessons_open', 'Still testing', 'For example "- Whether email or LinkedIn works better in Germany."', span=4, rows=4) }}

Drafts follow what worked and avoid what did not.

One commit to MESSAGING.md; your other approaches and notes are kept.
{% endif %} {% endblock %}