> ## Documentation Index
> Fetch the complete documentation index at: https://learn.actionist.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Onboarding a new client

> Invite a client by email, watch the invitation through to an active workspace, and run a handoff checklist that survives contact with a real business.

<div className="mxp-hero xc-border">
  <div className="exp-eyebrow mxp-rise">FROM INVITE TO LIVE</div>

  <h2 className="mxp-hero-title mxp-rise" style={{animationDelay:'0.06s'}}>
    One email starts it. <span style={{background:'linear-gradient(90deg,#24A4FF,#9000FF,#E3008E)',WebkitBackgroundClip:'text',backgroundClip:'text',color:'transparent'}}>A checklist finishes it.</span>
  </h2>

  <p className="mxp-hero-dek mxp-rise" style={{animationDelay:'0.13s'}}>
    Onboarding a client is one modal, one field, and a handful of statuses to watch. What actually takes the work is everything between "they signed up" and "they can act on their own account". This page walks the whole path: sending the invite, reading the lifecycle honestly, seeing what the client sees on their own first run, and knowing exactly which steps you can finish and which ones only the client can close.
  </p>
</div>

<div className="w-full py-10">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">The shape of it</span>
    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">Five moments, not one event.</h2>

    <p className="text-base text-gray-600 dark:text-gray-400 max-w-3xl">
      "Invite sent" and "client is live" are separated by a sign-up, an auto-attach, and a sync period the dashboard tracks for you. None of it needs you to refresh manually, but all of it is worth reading before your first invite.
    </p>
  </div>

  <div className="mxp-pipe">
    <div className="mxp-pipe-node">
      <strong>Send invite</strong>
      <span>One field: their email. Actionist emails the signup link from your business address through its own mail relay.</span>
    </div>

    <div className="mxp-pipe-link" />

    <div className="mxp-pipe-node">
      <strong>They sign up</strong>
      <span>The invitation moves to "Accepted — awaiting org" the instant they finish sign-up, before their workspace exists yet.</span>
    </div>

    <div className="mxp-pipe-link d2" />

    <div className="mxp-pipe-node">
      <strong>Workspace attaches</strong>
      <span>Their workspace links to your reseller account on its own. The relationship status flips to Active.</span>
    </div>

    <div className="mxp-pipe-link d3" />

    <div className="mxp-pipe-node">
      <strong>Setup finishes</strong>
      <span>Active does not always mean manageable yet. A short sync period can leave management access unavailable.</span>
    </div>

    <div className="mxp-pipe-link d4" />

    <div className="mxp-pipe-node">
      <strong>You can manage</strong>
      <span>Once setup clears, **View as client** works, and you can start building their agents.</span>
    </div>
  </div>

  <div className="exp-surface-grid" style={{marginTop:'22px'}}>
    <div className="exp-surface-tile">
      <strong>No day count anywhere.</strong> The invitation shows a real expiry date. Nothing in the product states a fixed number of days, so read the date rather than quoting one from memory.
    </div>

    <div className="exp-surface-tile">
      <strong>Active isn't always manageable.</strong> Watch the dashboard's attention rail. It names exactly which clients still need setup to finish before you can act on their workspace.
    </div>

    <div className="exp-surface-tile">
      <strong>An open tab can lag.</strong> The dashboard caches for three minutes, so a client who just signed up may not appear in an already-open tab until it refreshes.
    </div>
  </div>

  <Info>
    When a client needs setup attention, the dashboard collects them into one rail rather than scattering the warning across the page: "{'{{count}}'} clients need setup attention", followed by "Management access stays unavailable until setup finishes." That is your cue that Active does not yet mean manageable for that client.
  </Info>
</div>

<hr className="xc-divider" />

<div className="w-full py-10 xc-rise">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">Step one</span>
    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">Sending the invite.</h2>

    <p className="text-base text-gray-600 dark:text-gray-400 max-w-3xl">
      The whole flow lives on Overview. There is exactly one action button and exactly one field to fill in.
    </p>
  </div>

  <Steps>
    <Step title="Open Invite client">
      **Invite client** is the only action button on the Overview page. Click it to open the invite modal, titled "Invite a client to Actionist".
    </Step>

    <Step title="Enter the client's email">
      Type their address into **Client email**. That is the only field the modal renders. Older material may describe a company name field too, but nothing like it appears in the app, and there is nothing else to fill in before sending.
    </Step>

    <Step title="Send it">
      Click **Send invitation email**. The button reads "Sending…" while the request is in flight, then the modal shows a confirmation screen titled "Invitation sent".
    </Step>

    <Step title="Watch it move">
      The confirmation shows Email, Status, and Expires. Track those same three values afterward from the Clients table as the invitation works its way to Active.
    </Step>
  </Steps>

  <div className="mxp-window">
    <div className="mxp-window-bar">
      <span className="mxp-window-dot" />

      <span className="mxp-window-dot" />

      <span className="mxp-window-dot" />

      <span className="mxp-window-title">Overview → Invite client</span>
    </div>

    <div className="mxp-window-body" style={{minHeight:'auto'}}>
      <div className="xrs-mock-label" style={{marginTop:0}}>Send invite</div>
      <div style={{fontSize:15, fontWeight:600, marginBottom:4}}>Invite a client to Actionist</div>

      <div style={{fontSize:12, opacity:0.65, marginBottom:16, lineHeight:1.5}}>
        We'll email them a signup link that auto-attaches their workspace to your reseller account after successful sign-up.
      </div>

      <div className="xrs-mock-label">Client email</div>

      <input className="xrs-mock-input" placeholder="founder@acme.co" readOnly />

      <div className="xrs-mock-hint">We'll send the invite from [hello@halo.studio](mailto:hello@halo.studio) via Actionist's mail relay.</div>

      <div style={{marginTop:16, padding:'11px 14px', borderRadius:10, fontSize:12, lineHeight:1.55, border:'1px solid rgb(var(--actionist-purple) / 0.3)', background:'rgb(var(--actionist-purple) / 0.05)'}}>
        When they sign up through this link, they're auto-attached to your reseller account. You'll see them appear in <strong>Clients</strong> the moment they activate.
      </div>

      <div style={{display:'flex', alignItems:'center', gap:18, marginTop:20}}>
        <span style={{fontSize:13, opacity:0.55}}>Cancel</span>
        <span className="xrs-mock-cta" style={{marginTop:0}}>Send invitation email</span>
      </div>
    </div>
  </div>

  <Note>
    The modal renders exactly one field. There is no company name input to fill in, and nothing is sent to the backend beyond the client's email address.
  </Note>

  <Tip>
    If you're not sure whether you already invited someone, check the Clients table before sending again. Sending twice for the same address is what produces "A pending invitation already exists for this email." below, not a bug worth chasing.
  </Tip>
</div>

<div className="w-full py-10 xc-rise">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">Reading the lifecycle</span>
    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">Invitation states.</h2>

    <p className="text-base text-gray-600 dark:text-gray-400 max-w-3xl">
      Five statuses cover the whole life of an invitation, from the moment you send it to the moment it either lands or lapses.
    </p>
  </div>

  <div>
    | Status                    | What it means                                                      | What you do                                                                                           |
    | ------------------------- | ------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------- |
    | "Pending"                 | Sent, not yet opened or acted on.                                  | Nothing required. Resend only if the client says it never arrived.                                    |
    | "Accepted — awaiting org" | They finished sign-up, but their workspace has not attached yet.   | Nothing required. This clears on its own once their organization finishes provisioning.               |
    | "Active"                  | The relationship is live and the client appears in Clients.        | Check whether **View as client** is enabled yet. See the pipeline above. It may still be syncing.     |
    | "Expired"                 | The expiry date shown on the invitation passed before it was used. | Send a fresh invite. If it happens repeatedly for the same address, confirm you have the right email. |
    | "Failed"                  | The invitation could not be sent or processed.                     | Send a fresh invite. If it keeps failing, contact Actionist support.                                  |
  </div>

  <Warning>
    Never tell a client "you have N days to accept this." No fixed number of days is defined anywhere in the product. Read the expiry date shown on the invitation itself, in the confirmation screen or in the Clients table, and go by that.
  </Warning>

  <p className="text-base text-gray-600 dark:text-gray-400 max-w-3xl" style={{marginTop:'16px'}}>
    Most invitations move through these states without you doing anything. Where you actually intervene is at the ends of the path: resending after "Expired" or "Failed", and checking in on an "Active" client whose management access has not cleared yet.
  </p>
</div>

<div className="w-full py-10 xc-rise">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">When it doesn't go through</span>
    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">When something goes wrong.</h2>

    <p className="text-base text-gray-600 dark:text-gray-400 max-w-3xl">
      Six messages cover every way Send invitation email can fail. Each one tells you where to look first.
    </p>
  </div>

  <div>
    | Message                                                                                      | Cause                                                                                  | Whose problem                                                                                                  |
    | -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- |
    | "This email already has an Actionist account and cannot be invited through reseller signup." | That address already owns an Actionist account outside the reseller flow.              | Client's. They should sign in directly, or reach out to you outside the invite flow to get linked another way. |
    | "A pending invitation already exists for this email."                                        | You already invited that address and it has not resolved yet.                          | Yours. Check Clients or your recent invites before sending a second one.                                       |
    | "Enter a valid email address."                                                               | The address you typed does not parse as a valid email.                                 | Yours. Fix the typo and resend.                                                                                |
    | "Invitation limit reached. Try again in a few minutes."                                      | Too many invitations went out in a short window.                                       | Yours. Wait a few minutes, then retry.                                                                         |
    | "Your reseller account isn't certified yet, or this feature is disabled."                    | Your reseller profile is not certified, or the feature is turned off for your account. | Yours. Confirm your certification status before trying again.                                                  |
    | "Something went wrong."                                                                      | Any other backend error not covered above.                                             | Actionist's. Retry once, and if it repeats, contact support.                                                   |
  </div>

  <Note>
    For a broader symptom index across the whole reseller programme, not just invitations, see <a href="/resellers/troubleshooting">Troubleshooting</a>.
  </Note>

  <p className="text-base text-gray-600 dark:text-gray-400 max-w-3xl" style={{marginTop:'16px'}}>
    Three of these six are yours to fix directly: a typo, a duplicate send, or sending faster than the rate limit allows. Two point back at the client's own account state. The last is the only one worth escalating rather than retrying repeatedly.
  </p>
</div>

<hr className="xc-divider" />

<div className="w-full py-10 xc-rise">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">Their side of it</span>
    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">What the client sees.</h2>

    <p className="text-base text-gray-600 dark:text-gray-400 max-w-3xl">
      Once a client is in, Actionist runs its own onboarding: the Agent Onboarding studio. Knowing this flow means you can talk them through it, or pick up from wherever they stopped. Some clients finish it before you ever touch their workspace. Others hand it to you half-answered and expect you to carry on from Company Overview.
    </p>
  </div>

  <AccordionGroup>
    <Accordion title="Before they even open it" icon="sparkles">
      A re-entry teaser greets them first: "Set up your agents", with the line "Answer a few questions about your business and Actionist proposes the agents to build." A single button, "Start", is all it takes to open the studio itself, titled "Agent onboarding" with the subtitle "Review the company memory every agent reads, then work through your agents one at a time."
    </Accordion>

    <Accordion title="Workspace provisioning" icon="server-cog">
      Their workspace comes online in the background while they answer setup questions. Three states cover it: **Preparing**, **Ready**, and **Needs attention**. The steps shown are "Creating your workspace", "Waiting for your workspace to report in", then "Your workspace is online". Timing is described softly: "Usually ready in two to three minutes. You can keep working while it starts." If it stalls, the copy is equally calm: "Agent setup carries on. Anything that needs the workspace waits until it is back."

      This mirrors the reseller side of the same syncing period. The client's workspace coming online and your management access clearing are two separate things happening at once, not one blocking the other.
    </Accordion>

    <Accordion title="Company Overview" icon="book-open">
      Before touching individual agents, the client lands on a "Company Overview": "The memory files written from your setup answers. Open any file to read exactly what your agents will know." This is the shared context every agent reads from, worth pointing new clients to directly if they ask "what does it actually know about us?"
    </Accordion>

    <Accordion title="Each agent, in five parts" icon="layers">
      Every agent the client works through breaks into the same five groups:

      * **Agent Instructions**. Identity, remit and team from the accepted proposal.
      * **Skills**. Manual tasks, schedules and triggers.
      * **Channels**. Where this agent talks to the client's team.
      * **Advanced**. Delegation, access control and approval mode.
      * **Apps**. Connecting the tools this agent uses.

      The Apps group tracks readiness explicitly: "{'{{done}}'} of {'{{total}}'} connected", with "Each app still needs connecting before {'{{agent}}'} can use it without you." until every one is linked, at which point it reads "Every app {'{{agent}}'} needs is connected."
    </Accordion>

    <Accordion title="Confirming an agent" icon="circle-check">
      Once the five groups are in shape, the client confirms the agent: "Confirm this agent", with the warning that "Confirming turns {'{{agent}}'} on and enables its schedules and triggers at the same moment." Progress across the whole roster shows as "{'{{done}}'} of {'{{total}}'} agents confirmed", ending in "Every agent is live" once the last one is on.
    </Accordion>
  </AccordionGroup>
</div>

<hr className="xc-divider" />

<div className="w-full py-10 xc-rise xc-try">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">The one rule to plan around</span>
    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">The handoff checklist.</h2>

    <p className="text-base text-gray-600 dark:text-gray-400 max-w-3xl">
      Almost everything in a new client's workspace is yours to prepare. One category never is: whatever needs the client's own credentials or authorization. That control is disabled for any active delegated session, whatever scopes the client granted you, with the tooltip "Client action required": "This app requires the client's credentials or authorization to complete installation. Ask the client to install or connect this app directly." Build your onboarding around that boundary instead of running into it mid-setup.
    </p>
  </div>

  <div className="xrs-two">
    <div className="xrs-two-col can">
      <div className="xrs-two-tag">Prepare this yourself</div>
      <div className="xrs-two-item">Workspace goals and the roster of agents you're proposing.</div>
      <div className="xrs-two-item">Agent Instructions: identity, remit and team for each agent.</div>
      <div className="xrs-two-item">Skills: which task packs each agent loads.</div>
      <div className="xrs-two-item">Schedules and triggers for recurring or reactive work.</div>
      <div className="xrs-two-item">Channels: where each agent talks to the client's team.</div>
      <div className="xrs-two-item">Approval mode, under Advanced, for how much each agent runs unsupervised.</div>
    </div>

    <div className="xrs-two-col cant">
      <div className="xrs-two-tag">Only the client can do this</div>
      <div className="xrs-two-item">Every app connection and OAuth authorization, including the static API-key form.</div>
      <div className="xrs-two-item">Anything that touches an API key, token, or other credential.</div>
      <div className="xrs-two-item">Confirming an agent yourself, if you were never granted the scope to.</div>
    </div>
  </div>

  <div style={{marginTop:20}}>
    <div className="xrs-lock-ctl"><Icon icon="lock" size={12} /> Connect app</div>

    <div className="xrs-lock-tip">
      <strong>Client action required</strong>
      This app requires the client's credentials or authorization to complete installation. Ask the client to install or connect this app directly.
    </div>
  </div>

  <div className="actionist-tight flex flex-col gap-2 my-8">
    <span className="actionist-section-eyebrow">Run it in order</span>
    <h3 className="text-xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">A six-step onboarding checklist.</h3>
  </div>

  <Steps titleSize="h3">
    <Step title="Agree goals">
      Sit down with the client before opening the app. Get plain answers to what each agent is for and what "done" looks like, so the workspace you build matches a real business, not a template.
    </Step>

    <Step title="Prepare the workspace">
      Enter their delegated session once setup finishes. Draft the Agent Instructions, skills, channels and approval mode for each agent using what you agreed in step one.
    </Step>

    <Step title="Build the agents">
      Work through the five groups per agent. Leave Apps for last on any agent that needs a credentialed or OAuth connection, since that step waits on the client either way.
    </Step>

    <Step title="Request the connections">
      Hand the client the specific list of apps still needing their credentials or authorization. Point them at "Connect app" directly rather than describing it abstractly.
    </Step>

    <Step title="Test">
      Run each agent through its actual workflow once every app shows connected. Confirming turns on schedules and triggers immediately, so test before you confirm, not after.
    </Step>

    <Step title="Hand over and train">
      Walk the client through Company Overview and their own agents so they know what each one knows and does. Agree who checks in, and when.
    </Step>
  </Steps>

  <Check>
    Confirming an agent turns on its schedules and triggers immediately. Get through **Test** before you get to **Confirm this agent**, not after.
  </Check>

  <p className="text-base text-gray-600 dark:text-gray-400 max-w-3xl" style={{marginTop:'16px'}}>
    None of these six steps require anything you can't do inside a delegated session, except the one that was never yours to do in the first place. Plan the connection request early, not as an afterthought once everything else is built.
  </p>
</div>

<div className="w-full py-10 xc-rise">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">Between clients</span>
    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">Keeping clients separate.</h2>

    <p className="text-base text-gray-600 dark:text-gray-400 max-w-3xl">
      Onboarding rarely happens for one client at a time. The habit that keeps their data from bleeding into each other is small: leave sessions the right way.
    </p>
  </div>

  <p className="text-base text-gray-600 dark:text-gray-400 max-w-3xl">
    Exit a delegated session with the **Exit** button or the Escape key rather than navigating away or closing the tab. That is what clears the cached workspace data before you open the next client. Full detail on entering, reading the banner, and leaving cleanly lives on <a href="/resellers/view-as-client">View as client</a>.
  </p>

  <p className="text-base text-gray-600 dark:text-gray-400 max-w-3xl" style={{marginTop:'12px'}}>
    This matters most in the middle of an onboarding run, when you're moving between two or three new clients in the same afternoon. Skipping the exit step is how one client's workspace data ends up lingering in view while you're meant to be looking at the next one.
  </p>
</div>

<div className="w-full py-10 xc-rise">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">What it actually looks like</span>
    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">A realistic first week.</h2>

    <p className="text-base text-gray-600 dark:text-gray-400 max-w-3xl">
      Three shapes an onboarding tends to take, depending on how ready the client is to hand over their own logins. None of these are guarantees, just patterns worth recognizing early so you can plan the week around them.
    </p>
  </div>

  <div className="xc-recipes">
    <div className="xc-recipe">
      <div className="xc-recipe-who"><i style={{background:'linear-gradient(135deg,#9000FF,#00DBFF)'}} />Omar · Agency owner</div>

      <div className="xc-recipe-flow">
        Sends the invite the same afternoon he closes the deal. By the next morning the client is "Active" and setup has cleared, so he spends most of the first week building agents in their workspace before asking for a single connection.
      </div>

      <span className="xc-recipe-save">a straightforward week, once setup clears</span>
    </div>

    <div className="xc-recipe">
      <div className="xc-recipe-who"><i style={{background:'linear-gradient(135deg,#24A4FF,#9000FF)'}} />Priya · Ops consultant</div>

      <div className="xc-recipe-flow">
        Gets three clients through certification and invites all three the same day, then works one <em>Prepare the workspace</em> at a time. Two clients connect their own apps within days; the third takes longer to get to it, so that agent stays on <strong>Needs attention</strong> until they do.
      </div>

      <span className="xc-recipe-save">pace set by the client, not the dashboard</span>
    </div>

    <div className="xc-recipe">
      <div className="xc-recipe-who"><i style={{background:'linear-gradient(135deg,#FF0068,#9000FF)'}} />Declan · Small agency, solo</div>

      <div className="xc-recipe-flow">
        Prepares the whole workspace first, agents, skills, channels and approval mode, before ever asking the client for anything. When he finally requests the app connections, it is a short, specific list rather than an open-ended conversation.
      </div>

      <span className="xc-recipe-save">one focused ask instead of several</span>
    </div>
  </div>
</div>

<hr className="xc-divider" />

<div className="w-full py-10">
  <div className="actionist-cta-panel xc-border">
    <div className="relative z-10 flex flex-col items-center gap-5 max-w-2xl mx-auto">
      <span className="actionist-eyebrow">Onboarding a client</span>

      <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-white leading-tight">
        Send the invite, run the checklist.
      </h2>

      <p className="text-base md:text-lg text-white/85">
        Everything up to the credentials boundary is yours to prepare. Everything past it is one clear ask.
      </p>

      <div className="flex flex-wrap items-center justify-center gap-3 pt-2">
        <a className="actionist-cta-btn-primary" href="https://app.actionist.ai" target="_blank" rel="noreferrer">
          Open the Dashboard

          <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.2" strokeLinecap="round" strokeLinejoin="round">
            <path d="M5 12h14" />

            <path d="m12 5 7 7-7 7" />
          </svg>
        </a>

        <a className="actionist-cta-btn-secondary" href="https://actionist.ai/partners/" target="_blank" rel="noreferrer">
          Signup as a Partner
        </a>
      </div>
    </div>
  </div>
</div>

<div className="w-full pt-2 pb-6">
  <p className="actionist-trust-line">
    One field to invite a client. No day count to promise, no credential you can ever see.<br />
    Read the status · watch the attention rail · hand the connection back when it's the client's to finish.
  </p>
</div>

<div className="w-full pb-16 xc-rise">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">Keep going</span>
    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">Next steps.</h2>
  </div>

  <Columns cols={4}>
    <Card title="View as client" icon="log-in" href="/resellers/view-as-client">
      Enter a delegated session, read the banner, and leave it cleanly.
    </Card>

    <Card title="Client permissions" icon="shield-check" href="/resellers/permissions">
      The eight toggles a client controls, and the one restriction none of them can lift.
    </Card>

    <Card title="Best practices" icon="badge-check" href="/resellers/best-practices">
      Discovery, setup, testing, handoff, training and check-ins, in more depth.
    </Card>

    <Card title="Onboarding" icon="rocket" href="/Folders/onboarding">
      The full product reference for the Agent Onboarding studio your client runs through.
    </Card>
  </Columns>
</div>
