Ghost Setter · Control · Runbook

Onboarding a coach

Every step, in order, with the exact commands and links. Tick things off as you go — progress is saved in this browser, per coach.

Set the coach up

Fill these in and every command and URL below fills itself in with the right values. Nothing is sent anywhere; this all happens in your browser.

0 of 0 done

Which path, and can you make the date

The two long poles are the Instagram export and the shadow week, and only one of them is optional. Pick a path and a go-live date and this works backwards from it.

    Phase 01

    Prepare

    Before anything is built. The export is the long pole — Instagram can take up to 48 hours to produce it, so ask for it on the first call.

    Coach requests their Instagram data export
    Coach 5 min + up to 48h wait

    Settings → Accounts Centre → Your information and permissions → Download your information. Format: HTML. Date range: all time. Messages only is enough and downloads far faster than everything.

    Get their current client list
    Coach 5 min

    Just names, one per line. This is what stops the agent pitching a coaching package to somebody who already pays them every month — which is the single most embarrassing thing it could do.

    Ask the five questions that shape the profile
    By hand 15 min on a call

    When do they want consults? When must nothing be booked? How do they handle "how much is it"? Do they want to be asked before anything sends? Which of their clients would they never want pitched?

    1. Consult windows      -> booking_windows   (e.g. Tue and Thu, 1-4pm)
    2. Blackouts            -> blackout_dates   (shows, holidays, peak week)
    3. Price question       -> price_policy      halt | script_then_halt | script_then_disqualify
    4. Quiet hours          -> quiet_start_hour / quiet_end_hour
    5. Existing clients     -> client_names_file
    Phase 02

    Build

    One command does the parsing, classifying, mining, profile and seeding. The two things it cannot do are ManyChat and the coach's own Google click.

    Run the onboarding script
    Automated 2 min + mining time

    Parses the export, separates real leads from friends and clients, mines their voice, writes the profile and seeds the database. Stops on the first failure rather than seeding a half-built coach.

    Read the generated profile and fix the script
    By hand 20 min

    The generated script_text is a placeholder telling you to copy Nick's and adapt it. Leave the [[ASK_CALL]] and [[OFFER_TIMES: ...]] tokens exactly as they are — they are what stop the model inventing times off a calendar it cannot see.

    Coach connects Google Calendar
    Coach 1 min Do this first

    One click for the coach. Their refresh token is encrypted before it is stored. Today the consent screen is Internal, so only @thenickl.com accounts can connect — which means no coach but Nick can book a call. This is the one thing that has to change before a second coach exists, and the booking is the product, so it is not optional.

    It is a button, not a queue. Do not confuse the two.

    Internal → External, published to production. Takes a minute and works immediately. The coach sees a "Google hasn't verified this app" screen and clicks through Advanced. Unverified production apps are capped at 100 users, which is not a constraint we will feel this year.

    Verification is the separate, weeks-long thing, and all it buys is removing that warning screen. Worth starting now; nothing waits on it. The calendar scopes are sensitive, not restricted, so there is no CASA security audit.

    Do not leave it in Testing publishing status to avoid the warning screen. Testing expires every refresh token after seven days, so a coach's calendar silently stops working the following week and it looks like our bug.

    Consent screen ↗
    Build the ManyChat flow
    By hand 20 min

    Six steps: trigger → Smart Delay 2 min → reply block → Smart Delay 8h → follow-up block → Smart Delay 12h → follow-up block. All delays send within 08:00–23:00. Dynamic Block, not External Request — Response Mapping is greyed out on a Dynamic Block by design, and that is correct.

    ManyChat ↗

    The two mistakes that cost an evening each.

    The request body must be the Full Contact Data chip on its own. Hand typing JSON around it turns fragments into variable chips and produces invalid JSON that only fails at send time, with no useful error.

    Rung two is 12 hours, not 24. Instagram will not deliver outside a 24-hour window from the lead's own last message, so a politer 24-hour wait means the message silently never arrives.

    Phase 03

    Prove

    The part that earns their trust, and the part worth charging for. Nothing reaches a real person during this phase.

    Coach does practice mode
    Coach 30–45 min

    They reply to simulated leads across twelve scenarios. Anything in (parentheses) is read as a correction rather than a reply. Forty replies is roughly where the voice stops sounding generic — that is measured, not a guess; Nick's forty visibly changed it.

    On this path there is no export, so these forty replies are the entire voice pack. Until they are folded in the agent has nothing to speak with and every thread halts. Do not let the coach leave the first session without finishing them.

    Still worth doing even with a mined pack. An export is always thin exactly where it matters — Nick's 616 real messages contained ten price moments — and practice mode is the only place to get more of them.

    Fold the practice replies into the voice pack
    Automated 1 min

    Practice replies do nothing until this runs — they sit in a table nobody reads. Run it after every training session.

    A week in draft mode
    By hand 7 days

    The agent runs on their real DMs and sends nothing. Every reply is stored and posted to Discord. They read a week of what it would have said before it says anything to a real person. Do not shorten this because the replay looked good.

    Review the week together
    By hand 30 min

    Go through the drafts. Anything they would not have sent becomes a correction, and corrections go straight into the prompt. This is also where you find out whether the triage gate has their inbox right.

    Phase 04

    Launch

    Thirty seconds to turn on, thirty seconds to turn off.

    Their Discord channel and mention id
    By hand 5 min

    A webhook for briefs and halts, and their numeric Discord user id so the pings actually notify them. A username will not work — Discord resolves mentions by id only, and a username posts as plain text that notifies nobody.

    In Discord, send:  \@theirusername
    The raw form that appears — <@1035195883010129970> — is the id.
    Flip to live
    By hand 30 sec

    Change send_mode to live in the profile and reseed. Do it deliberately, with them on the phone, not at the end of a long night.

    Show them the three off switches
    Coach 5 min

    This is the conversation that makes them comfortable, so do not skip it. Reply in Instagram yourself — pauses automations for that person, up to a day. Pause in ManyChat — one click, until unpaused. Tag them AI Off — durable, and pings them whenever a tagged person messages.

    Watch the first three conversations
    By hand first day

    Not the first week — the first three. Almost everything that goes wrong goes wrong immediately: a triage miss, a phrasing that is not theirs, a booking window that was wrong on the call.

    What is honestly not automated yet, and why.

    The ManyChat flow. Their API does not expose flow building, so it is twenty minutes of clicking per coach. This is the first thing to templatise — ManyChat supports shareable flow templates, which would cut it to a few minutes.

    The script text. How a coach sells is genuinely theirs, and a generated one would sound like everyone else. Worth keeping human.

    The Google click. Has to be the coach, by design — it is their calendar.