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

# Validate, test with AI and activate

> Read the validation panel, preview what the AI would write, and turn the flow on.

export const UiPath = ({children}) => {
  const parts = String(children).split(/\s*(?:→|>)\s*/).filter(Boolean);
  return <span className="pl-path">
      {parts.map((part, index) => <span key={`${index}-${part}`}>
          {index > 0 && <span className="pl-path__sep">→</span>}
          {part}
        </span>)}
    </span>;
};

export const Screenshot = ({id, alt, caption, frame = 'browser', url, marks = [], lang = 'en', workspace = 'northwind-outbound'}) => {
  const src = `/images/screenshots/${lang}/${id}.png`;
  const chrome = url ? `app.pipelime.ai/${workspace}${url}` : 'app.pipelime.ai';
  return <figure className={`pl-shot pl-shot--${frame} not-prose`}>
      <div className="pl-shot__frame">
        {frame !== 'bare' && <div className="pl-shot__bar">
            <span className="pl-shot__dots">
              <span className="pl-shot__dot" />
              <span className="pl-shot__dot" />
              <span className="pl-shot__dot" />
            </span>
            <span className="pl-shot__url">{chrome}</span>
          </div>}
        <div className="pl-shot__media">
          <img src={src} alt={alt} loading="lazy" />
          {marks.map(mark => <span key={mark.n} className="pl-shot__mark" style={{
    left: `${mark.x}%`,
    top: `${mark.y}%`
  }} aria-hidden="true">
              {mark.n}
            </span>)}
        </div>
      </div>
      {caption && <figcaption className="pl-shot__caption">{caption}</figcaption>}
    </figure>;
};

By the end you'll read what the validation panel is telling you, preview what an AI block will write before it's live, and turn a workflow on knowing exactly what Activate checks.

<div className="pl-availability">
  <div className="pl-availability__row">
    <div className="pl-availability__label">Where</div>
    <div className="pl-availability__value"><span className="pl-path">Outreach<span className="pl-path__sep">→</span>Workflow Builder</span></div>
  </div>

  <div className="pl-availability__row">
    <div className="pl-availability__label">Your role needs</div>
    <div className="pl-availability__value">Create access to Workflow Builder <code>create-workflows</code>. Admin and Member have it by default.</div>
  </div>

  <div className="pl-availability__row">
    <div className="pl-availability__label">To create or change</div>
    <div className="pl-availability__value"><code>create-workflows</code> to add one, <code>update-workflows</code> to change one, on top of the permission above.</div>
  </div>

  <div className="pl-availability__note">Not listed in the sidebar today; reachable from the surfaces that link to it, and by URL. If you cannot find this in your sidebar, your workspace may have a custom menu configuration. Contact support and we will check it for you.</div>
</div>

## Before you begin

* You need the `update-workflows` permission to save or activate anything here. Without it, **Save** and **Activate** stay disabled, and a tooltip says why.
* This assumes a workflow is already open, new or existing, from <UiPath>Outreach → Workflows</UiPath>.

## Steps

<Steps>
  <Step title="Open the validation panel">
    Next to **Save**, the toolbar carries a pill. It reads **Valid** only when there is nothing at all to report; otherwise it counts what it found, errors and warnings, separated by a dot. Click it and a **Validation** card opens over the bottom right of the canvas, listing every issue: errors first with a red icon, then warnings in amber.

    Click an entry that belongs to one block and the canvas selects that block and opens its inspector. An issue that points at a field, a required box left empty or a message with no text, outlines that field in red there; every other issue sits as a coloured banner at the top of the inspector instead. An issue that isn't tied to a single block, a loop somewhere in the graph, for instance, isn't clickable at all. The same red or amber dot sits on the block itself on the canvas the whole time, panel open or not: hover it and the tooltip lists every issue on that block.

    <Screenshot id="workflows/validate-test-and-activate--validation-errors" url="/workflows/12" alt="The Validation card open over the bottom right of the canvas, listing one error in red about a Send Email block with nothing to send, above several warnings in amber" caption="Only the red row is holding this workflow back. The amber ones are worth a look, not a fix." />
  </Step>

  <Step title="Tell an error from a warning">
    Only errors hold **Activate** back; warnings never do, however many pile up. A required field left blank, a message block with nothing to send in its current mode, and a block whose integration isn't connected are all errors. So is a **LinkedIn: Message** or a **LinkedIn: Engage with post** placed before the invite is accepted, and even sending a **LinkedIn: Connect** invite without a **LinkedIn: View Profile** step first: a rule that reads like a nudge but is enforced like a wall. A loop with no wait step and no **Loop** block capping it is an error too, since nothing would stop it spinning forever.

    Warnings read softer: a block sitting disconnected from everything else, a branch with nowhere to go, and any loop at all, bounded or not, flagged on principle. An email block in a workspace with no email account connected only warns, whichever account it is set to send from, since one might get connected before the workflow ever runs. LinkedIn, WhatsApp and Instagram blocks skip that warning, because a missing integration is already an error for them.

    One warning comes with its own fix. A send block that could reach a lead missing the address or number it needs offers **Add a check first** in the inspector. That drops an **If / Else** already set to the missing field with the operator **is not empty**, and wires it in front of the block when the block has exactly one incoming connection. With none, or with more than one, the guard lands on the canvas unwired and you connect it yourself.
  </Step>

  <Step title="Preview what a block will write">
    A block that writes something itself can show a **Test generation** button under its prompt while it is in AI mode: **Send Email**, **Send Follow-up**, **Send Reply**, **LinkedIn: Message**, a **LinkedIn: Connect** invite once its personalized note is switched on, **Send WhatsApp**, **Send Instagram DM**, **Answer MercadoLibre Question**, **AI Conversation** and **AI Generate Content**. **Send WhatsApp** and **Send Instagram DM** start on **Custom template** instead, so the button only appears once you switch **Message** to **AI**. It stays disabled until the block's own prompt field has text in it, whether that field is **Prompt** on a send block, the goal on **AI Conversation** or the instruction on **AI Generate Content**. **Answer MercadoLibre Question** is the exception: it tests from an empty prompt, since the buyer's own question supplies the rest. **Instagram: Reply to Comment** never gets the button at all: nothing generates a sample for it yet.

    Click it and a dialog generates a live sample against a real lead from your workspace, picked at random, or a stand-in if you have none yet. On **Send Reply**, a toggle switches between **Interested**, **Objection** and **Not interested** and shows the message it's answering, so trying the same prompt against a different reply is one click away. **Regenerate** runs it again from the same settings. Nothing here sends or saves anything, and the dialog says so itself: the sample comes from a lighter, faster model than a live send uses.

    <Screenshot id="workflows/validate-test-and-activate--test-generation" url="/workflows/12" frame="bare" alt="The Test generation dialog open on a Send Email block, showing a generated subject and body inside a mock email window, with a Regenerate button at the bottom" caption="A dry run against a real lead. Read it for shape and tone, not word for word: a live send uses a stronger model." />
  </Step>

  <Step title="Turn it on">
    **Activate** (2) is enabled the moment there are no errors, warnings or not; while an error remains it stays disabled and a tooltip tells you to fix them first. The pill (1) reads **Valid** only when nothing at all is left, warnings included, so a workflow can be activatable and still not read **Valid**. Press **Activate** and it saves first, then asks the server to compile the graph and check it again on its own, a second pass that catches a few things the browser's copy of the rules doesn't. Once that passes, the button relabels to **Deactivate** with a small dot confirming it's live, and a toast confirms the change.

    <Screenshot id="workflows/validate-test-and-activate--valid" url="/workflows/12" alt="The workflow builder's toolbar reading Valid, with the Activate button enabled to the right of Save, above a canvas holding a single unconnected trigger block" caption="A lone trigger reads Valid, because nothing here breaks a rule the browser knows. The server still refuses to activate it, for the reason below." marks={[{ n: 1, x: 74, y: 10 }, { n: 2, x: 94, y: 10 }]} />
  </Step>
</Steps>

## What happens next

<Check>
  The workflow is live. From now on, every lead that reaches its trigger enters it on its own and starts down the blocks you built. Open [Workflows](/en/workflows/overview) any time to see it listed as **Active**.
</Check>

Follow one lead through what you just turned on: [Enrollments and the lead journey](/en/workflows/enrollments-and-lead-journey).

## Troubleshooting

<AccordionGroup>
  <Accordion title="Activate refused a workflow that read Valid">
    A **Valid** pill only reflects what the browser can check on its own. The server compiles the same graph again the moment you press **Activate**, and it looks for things the browser never does: a trigger with nothing wired after it, an empty canvas, a connection whose block has since been deleted, and a block type it can't run yet. The browser flags none of those, so a graph that is nothing but a trigger reads **Valid** and is still refused, because every trigger needs a real path out of it. Wire something after the trigger and try again.
  </Accordion>

  <Accordion title="The rejection doesn't say what's wrong">
    Where you pressed **Activate** changes what you're told. From the workflows list, toggling a workflow on names the specific problem right in its own toast. From inside the builder, a refusal only says the save couldn't go through; it never reads the reason the server sent back. Reopen the validation panel, and if it lists no errors, the problem is one only the server's compiled check catches, most likely an unwired trigger. Toggling the same workflow from the list will tell you which.
  </Accordion>

  <Accordion title="Test generation stays disabled">
    The button needs text in the block's own prompt field first, and hovering it says so. **Answer MercadoLibre Question** is the exception: it tests from an empty one. **Send WhatsApp** and **Send Instagram DM** start on **Custom template**, not AI, so the button isn't there at all until you switch **Message** to **AI**, and a **LinkedIn: Connect** invite only offers it once its personalized note is switched on. **Instagram: Reply to Comment** never gets one: nothing generates a sample for it yet.
  </Accordion>
</AccordionGroup>

## Related

<CardGroup cols={2}>
  <Card title="Workflow troubleshooting" icon="life-buoy" href="/en/workflows/troubleshooting">
    A missing block, a workflow that won't activate, a lead that hasn't moved: what each one actually means.
  </Card>

  <Card title="Logic, Timing and Finish blocks" icon="git-branch" href="/en/workflows/logic-timing-and-finish-blocks">
    Branch on what you know, wait for time or for a reply, and end a flow deliberately.
  </Card>

  <Card title="Outreach and AI blocks" icon="send" href="/en/workflows/outreach-and-ai-blocks">
    The blocks that send something (email, LinkedIn, WhatsApp, Instagram, MercadoLibre), and the AI blocks that decide what to say.
  </Card>

  <Card title="Enrollments and the lead journey" icon="route" href="/en/workflows/enrollments-and-lead-journey">
    Follow one lead through a flow: where it is now, which branch it took and why it stopped.
  </Card>
</CardGroup>
