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

# Rollout timeline: Day 1, 14, 30

> How a Fini rollout runs: a knowledge agent live on day 1, agentic workflows by day 14, and full autonomy by day 30, with the product steps your team completes at each milestone.

export const StepExplorer = ({title, steps = [], hint = "Click a step, or use Next."}) => {
  const FV = {
    lime: "#C3EE5E",
    ink: "#131415",
    line: "rgba(127,127,127,0.28)",
    soft: "rgba(127,127,127,0.07)",
    softer: "rgba(127,127,127,0.04)",
    muted: "rgba(127,127,127,0.95)",
    pass: "#C3EE5E",
    warn: "#FFB020",
    fail: "#FF4D4D",
    radius: 14
  };
  const fvCard = {
    border: `1px solid ${FV.line}`,
    borderRadius: FV.radius,
    padding: 18,
    margin: "20px 0",
    background: FV.softer
  };
  const fvChip = active => ({
    border: `1px solid ${active ? FV.lime : FV.line}`,
    background: active ? FV.lime : "transparent",
    color: active ? FV.ink : "inherit",
    borderRadius: 999,
    padding: "6px 12px",
    fontSize: 13,
    fontWeight: 600,
    cursor: "pointer",
    lineHeight: 1.2
  });
  const fvBtn = primary => ({
    border: `1px solid ${primary ? FV.lime : FV.line}`,
    background: primary ? FV.lime : "transparent",
    color: primary ? FV.ink : "inherit",
    borderRadius: 10,
    padding: "7px 14px",
    fontSize: 13,
    fontWeight: 600,
    cursor: "pointer"
  });
  const fvLabel = {
    fontSize: 11,
    fontWeight: 700,
    letterSpacing: "0.08em",
    textTransform: "uppercase",
    opacity: 0.6,
    marginBottom: 8
  };
  const [i, setI] = useState(0);
  const s = steps[i] || ({});
  return <div style={fvCard}>
      {title && <div style={fvLabel}>{title}</div>}
      <div style={{
    display: "flex",
    alignItems: "center",
    gap: 0,
    overflowX: "auto",
    paddingBottom: 6
  }}>
        {steps.map((st, k) => <div key={k} style={{
    display: "flex",
    alignItems: "center",
    flex: k === steps.length - 1 ? "0 0 auto" : "1 0 auto"
  }}>
            <button onClick={() => setI(k)} title={st.title} style={{
    width: 34,
    height: 34,
    borderRadius: 999,
    flex: "0 0 auto",
    cursor: "pointer",
    fontWeight: 700,
    fontSize: 13,
    border: `2px solid ${k <= i ? FV.lime : FV.line}`,
    background: k === i ? FV.lime : k < i ? "rgba(195,238,94,0.25)" : "transparent",
    color: k === i ? FV.ink : "inherit"
  }}>{k + 1}</button>
            {k < steps.length - 1 && <div style={{
    height: 2,
    minWidth: 18,
    flex: 1,
    background: k < i ? FV.lime : FV.line,
    margin: "0 4px"
  }} />}
          </div>)}
      </div>
      <div style={{
    display: "flex",
    gap: 6,
    flexWrap: "wrap",
    margin: "6px 0 14px"
  }}>
        {steps.map((st, k) => <span key={k} onClick={() => setI(k)} style={{
    fontSize: 12,
    cursor: "pointer",
    opacity: k === i ? 1 : 0.55,
    fontWeight: k === i ? 700 : 500,
    marginRight: 8
  }}>{st.label}</span>)}
      </div>
      <div style={{
    border: `1px solid ${FV.line}`,
    borderRadius: 12,
    padding: 16,
    background: FV.soft,
    minHeight: 120
  }}>
        {s.meta && <div style={{
    ...fvLabel,
    opacity: 0.75
  }}>{s.meta}</div>}
        <div style={{
    fontSize: 17,
    fontWeight: 700,
    marginBottom: 6
  }}>{s.title}</div>
        {s.body && <div style={{
    fontSize: 14.5,
    lineHeight: 1.6,
    opacity: 0.9
  }}>{s.body}</div>}
        {s.points && <ul style={{
    margin: "10px 0 0",
    paddingLeft: 18,
    fontSize: 14,
    lineHeight: 1.6
  }}>
            {s.points.map((p, k) => <li key={k}>{p}</li>)}
          </ul>}
      </div>
      <div style={{
    display: "flex",
    justifyContent: "space-between",
    alignItems: "center",
    marginTop: 12,
    gap: 8
  }}>
        <span style={{
    fontSize: 12,
    opacity: 0.6
  }}>{hint}</span>
        <div style={{
    display: "flex",
    gap: 8
  }}>
          <button style={fvBtn(false)} disabled={i === 0} onClick={() => setI(v => Math.max(0, v - 1))}>Back</button>
          <button style={fvBtn(true)} onClick={() => setI(v => (v + 1) % Math.max(1, steps.length))}>{i === steps.length - 1 ? "Start over" : "Next"}</button>
        </div>
      </div>
    </div>;
};

export const ChecklistMeter = ({title = "Checklist", items = [], results = {}, disclaimer}) => {
  const FV = {
    lime: "#C3EE5E",
    ink: "#131415",
    line: "rgba(127,127,127,0.28)",
    soft: "rgba(127,127,127,0.07)",
    softer: "rgba(127,127,127,0.04)",
    muted: "rgba(127,127,127,0.95)",
    pass: "#C3EE5E",
    warn: "#FFB020",
    fail: "#FF4D4D",
    radius: 14
  };
  const fvCard = {
    border: `1px solid ${FV.line}`,
    borderRadius: FV.radius,
    padding: 18,
    margin: "20px 0",
    background: FV.softer
  };
  const fvChip = active => ({
    border: `1px solid ${active ? FV.lime : FV.line}`,
    background: active ? FV.lime : "transparent",
    color: active ? FV.ink : "inherit",
    borderRadius: 999,
    padding: "6px 12px",
    fontSize: 13,
    fontWeight: 600,
    cursor: "pointer",
    lineHeight: 1.2
  });
  const fvBtn = primary => ({
    border: `1px solid ${primary ? FV.lime : FV.line}`,
    background: primary ? FV.lime : "transparent",
    color: primary ? FV.ink : "inherit",
    borderRadius: 10,
    padding: "7px 14px",
    fontSize: 13,
    fontWeight: 600,
    cursor: "pointer"
  });
  const fvLabel = {
    fontSize: 11,
    fontWeight: 700,
    letterSpacing: "0.08em",
    textTransform: "uppercase",
    opacity: 0.6,
    marginBottom: 8
  };
  const [on, setOn] = useState(() => items.map(() => false));
  const n = on.filter(Boolean).length;
  const reqMissing = items.some((it, i) => it.required && !on[i]);
  const pct = items.length ? Math.round(n / items.length * 100) : 0;
  const msg = n === items.length ? results.complete : reqMissing && results.missingRequired ? results.missingRequired : results.partial;
  return <div style={fvCard}>
      <div style={{
    display: "flex",
    justifyContent: "space-between",
    alignItems: "baseline"
  }}>
        <div style={fvLabel}>{title}</div>
        <div style={{
    fontSize: 13,
    fontWeight: 700
  }}>{n} / {items.length}</div>
      </div>
      <div style={{
    height: 8,
    borderRadius: 999,
    background: FV.soft,
    overflow: "hidden",
    marginBottom: 12
  }}>
        <div style={{
    width: `${pct}%`,
    height: "100%",
    background: FV.lime,
    transition: "width .3s"
  }} />
      </div>
      {items.map((it, i) => <label key={i} style={{
    display: "flex",
    gap: 10,
    alignItems: "flex-start",
    padding: "8px 4px",
    borderTop: i ? `1px solid ${FV.line}` : "none",
    cursor: "pointer"
  }}>
          <input type="checkbox" checked={on[i]} onChange={() => setOn(o => o.map((v, j) => j === i ? !v : v))} style={{
    marginTop: 3,
    accentColor: FV.lime
  }} />
          <span style={{
    fontSize: 14,
    lineHeight: 1.5
  }}>
            {it.label}{it.required && <span style={{
    fontSize: 11,
    fontWeight: 700,
    marginLeft: 6,
    opacity: 0.6
  }}>REQUIRED</span>}
            {it.detail && <span style={{
    display: "block",
    fontSize: 12.5,
    opacity: 0.65
  }}>{it.detail}</span>}
          </span>
        </label>)}
      {msg && <div style={{
    marginTop: 12,
    fontSize: 13.5,
    padding: "10px 12px",
    borderRadius: 10,
    background: n === items.length ? "rgba(195,238,94,0.16)" : FV.soft
  }}>{msg}</div>}
      {disclaimer && <div style={{
    fontSize: 12,
    opacity: 0.6,
    marginTop: 8
  }}>{disclaimer}</div>}
    </div>;
};

Fini (usefini.com) rolls out in three milestones: a knowledge agent live on **day 1**, agentic workflows by **day 14**, and full autonomy by **day 30**. Fini connects to the helpdesk you already use, so there is no migration project: each milestone adds a layer (knowledge, then actions, then self-improvement at full volume) on top of what the previous one shipped.

This page explains what is live at each milestone and the product steps your team completes to get there. Every step links to the page that covers it in detail.

## The three milestones

| Milestone | What is live | What your team does |
| - | - | - |
| **Day 1: Knowledge agent live** | An agent that answers FAQ-level questions from your approved knowledge, connected to your helpdesk or widget, usually in shadow mode first. | Create the agent, connect Sources, generate and approve Articles, deploy, test in Inbox. |
| **Day 14: Agentic workflows** | The agent takes real actions in your systems (refunds, account updates, lookups) through deterministic Rulebook workflows, and replies to customers directly. | Connect Attributes and Actions, build Intent Rules, set Reply Rules and Guardrails, build a Test Suite, flip to direct reply. |
| **Day 30: Full autonomy** | Self-learning is active: knowledge gaps and conflicts are detected automatically, and voice, chat and email run on the same agent. | Work the Review queue, expand channels, run Test Suite on every change, track resolution rate in Analytics. |

```mermaid theme={null}
---
title: Fini rollout
---
flowchart LR
    D1["Day 1<br/>Knowledge agent live"] --> D14["Day 14<br/>Agentic workflows"]
    D14 --> D30["Day 30<br/>Full autonomy"]
    D30 --> LOOP["Ongoing<br/>Review · Test Suite · Analytics"]

    classDef milestone fill:#131415,color:#FFFFFF,stroke:#131415,stroke-width:3px
    classDef ongoing fill:#C3EE5E,color:#131415,stroke:#131415,stroke-width:2px
    class D1,D14,D30 milestone
    class LOOP ongoing
```

Click through the milestones to see what is live, what your team does, and the exit check for each.

<StepExplorer
  title="Rollout milestones"
  steps={[
{ label: "Day 1", meta: "Knowledge agent live", title: "Answer FAQ-level questions from approved knowledge", body: "A working agent on a real channel, usually in shadow mode first, so your team sees every reply before customers rely on it. No code is required.", points: ["Create the agent on Home", "Connect Sources and set the Language training preference", "Generate Magic Articles and approve them in Review", "Deploy on your helpdesk or the Widget with an Internal Comment rule", "Test in Inbox and read the AI Steps trace", "Exit check: top questions answered correctly in shadow mode, the right articles retrieved, out-of-scope questions declined"] },
{ label: "Day 14", meta: "Agentic workflows", title: "Take real actions through deterministic Rulebook workflows", body: "The agent moves from answering questions to resolving them: it connects to billing, CRM and internal tools and replies to customers directly.", points: ["Connect User Attributes and enable Use in Rulebooks", "Connect Actions for the operations the agent should perform", "Build Intent Rules for your two or three highest-volume intents", "Set escalation triggers, Guardrails and Reply Rules for sensitive intents", "Build and run your first Test Suite cases", "Switch main traffic from Internal Comment to Direct Reply", "Exit check: top workflows complete end to end in AI Steps, Test Suite cases pass, the agent replies directly"] },
{ label: "Day 30", meta: "Full autonomy", title: "Run at full volume and maintain itself", body: "Self-learning is active, knowledge gaps are detected automatically, and voice, chat and email run on the same agent. Your team shifts from building to reviewing.", points: ["Work the Review queue of drafted gap and conflict fixes", "Add the remaining channels, including Voice", "Run Test Suite on every meaningful change", "Run the weekly health check in Analytics", "Exit check: escalations dominated by expected reasons, the Review queue worked on a regular cadence"] },
{ label: "Ongoing", meta: "After day 30", title: "Review, test and measure", body: "Approved changes flow into Articles, Prompts or the Rulebook, Test Suite gates each change, and Analytics tracks AI resolution rate, escalation reasons and CSAT." }
]}
/>

## Day 1: Knowledge agent live

The goal on day 1 is a working agent that answers common questions from your real content, running on a real channel, with your team able to see every reply before customers rely on it. No code is required.

<Steps>
  <Step title="Create the agent">
    On **Home**, select or create the agent under **Your bots** and name it by function (`Support-AI`, `Billing-Agent`). See [Quickstart, Step 1](/en/quickstart#step-1-create-your-agent) and [Home](/en/configuration/agent-home).
  </Step>

  <Step title="Connect your knowledge">
    In [Knowledge → Sources](/en/knowledge/sources), add your help center sitemap, individual URLs, files, or a connected store (Notion, Google Drive, Confluence, Zendesk Help Center). Set the **Language** training preference to match your content; use **Auto-detect** for multilingual knowledge bases.
  </Step>

  <Step title="Generate and approve Articles">
    Run bulk [Magic Articles](/en/knowledge/magic-articles#bulk-generation-from-existing-sources) generation over your Sources, then work through the drafts, duplicates and conflicts in [Review](/en/knowledge/review). Organize approved content into folders in [Articles](/en/knowledge/articles) and assign folders to the agent. This is the standard first-day workflow described in the [Knowledge overview](/en/knowledge/overview#first-day-setup).
  </Step>

  <Step title="Deploy in shadow mode">
    Connect the surface your customers already use: a [helpdesk integration](/en/deploy/on-top-of-your-helpdesk) such as Zendesk or Intercom, or the [Widget](/en/deploy/widget). For regulated industries, start with an **Internal Comment** rule in [Reply Rules](/en/automations/reply-behavior) so the agent posts internal notes your team can read before anything reaches a customer.
  </Step>

  <Step title="Test in Inbox">
    Send a direct question, a paraphrased question and an out-of-scope question through the channel. Open each reply in [Inbox](/en/testing/inbox) and read the **AI Steps** trace. Fix gaps in knowledge, tone in [Main Guidelines](/en/configuration/prompts), and missing context with [Attributes](/en/api-reference/attributes).
  </Step>
</Steps>

**Exit check for day 1:** the agent answers your top questions correctly in shadow mode, the retrieved articles pinned under each reply are the right ones, and out-of-scope questions are declined rather than guessed.

## Day 14: Agentic workflows

Between day 1 and day 14 the agent moves from answering questions to resolving them: it connects to your backend systems (billing, CRM, internal tools) and starts taking real actions, such as processing refunds, updating accounts and pulling customer data.

<Steps>
  <Step title="Connect customer context">
    Define [User Attributes](/en/api-reference/attributes) under API Setup to load each customer's plan, status, billing date or orders. Enable **Use in Rulebooks** on the attributes your workflows branch on.
  </Step>

  <Step title="Connect Actions">
    Define [Actions](/en/api-reference/actions) (shown as **External Actions**) for the operations the agent should perform: cancel a subscription, issue a refund, look up a transaction, update an address. An Action only runs when a Rulebook Tool node invokes it.
  </Step>

  <Step title="Build Intent Rules for your top workflows">
    In **Rulebook → Intent Rules**, use **Generate with AI** to describe a workflow or upload a workflow diagram, then refine the tree. Start with the two or three intents with the most volume. See [Intent Rules](/en/automations/rulebook) and the [Cancellation flow walkthrough](/en/walkthroughs/cancellation-flow), or the [Use cases](/en/use-cases/refunds) tab for refunds, disputes and account changes.
  </Step>

  <Step title="Set escalation and safety controls">
    Add business-specific escalation triggers to the Planning Prompt ([Controlling when the agent escalates](/en/configuration/prompts#controlling-when-the-agent-escalates)), configure [Guardrails](/en/configuration/guardrails) such as **Banned terms**, **Confidential attributes** and **URL allowlist**, and keep sensitive intents on **Internal Comment** or **No Reply** in Reply Rules. If you use the widget with a helpdesk, create the widget escalation [Business Rule](/en/automations/business-rules).
  </Step>

  <Step title="Build your first Test Suite cases">
    Open **Test Suite** and click **Create test case** to turn real conversations (or new ones you create in Inbox) into test cases, each with criteria for what should pass. Use **Criteria groups** for checks that many cases share, such as escalation behavior, and run them. Runs use recorded or mock Action responses, so check live end-to-end Actions in a sandbox environment or a controlled pilot. See [Test Suite](/en/testing/test-suite).
  </Step>

  <Step title="Switch to direct reply">
    When your Test Suite cases pass and Inbox spot checks meet your bar, move the agent's main traffic from **Internal Comment** to **Direct Reply** in [Reply Rules](/en/automations/reply-behavior). Keep the stricter rules for sensitive intents in place.
  </Step>
</Steps>

**Exit check for day 14:** your highest-volume workflows complete end to end in the AI Steps trace (green nodes through to the Reply), your Test Suite cases pass, and the agent is replying directly to customers on its main channel.

Before you switch the main traffic to **Direct Reply**, tick off what your team has done. The list is built from the day 1 and day 14 steps on this page.

<ChecklistMeter
  title="Ready to switch to Direct Reply?"
  items={[
{ label: "Top questions answered correctly in shadow mode", detail: "Day 1 exit check, verified in Inbox with the AI Steps trace.", required: true },
{ label: "User Attributes connected", detail: "Use in Rulebooks enabled on the attributes your workflows branch on." },
{ label: "Actions connected for the operations the agent performs", detail: "An Action only runs when a Rulebook Tool node invokes it." },
{ label: "Intent Rules built for your highest-volume workflows", detail: "They complete end to end in the AI Steps trace, green nodes through to the Reply.", required: true },
{ label: "Escalation triggers added to the Planning Prompt" },
{ label: "Guardrails configured", detail: "For example Banned terms, Confidential attributes and URL allowlist." },
{ label: "Sensitive intents kept on Internal Comment or No Reply in Reply Rules", required: true },
{ label: "Widget escalation Business Rule created", detail: "Only needed if you use the widget with a helpdesk." },
{ label: "Test Suite cases created and passing", required: true },
{ label: "Inbox spot checks meet your bar", required: true }
]}
  results={{ complete: "Every step is done. Move the main traffic to Direct Reply and keep the stricter rules for sensitive intents in place.", partial: "Required steps are done. Finish the rest that apply to your setup before widening traffic.", missingRequired: "Keep the agent on Internal Comment until every required step is done." }}
  disclaimer="A planning aid built from the steps on this page, not a Fini sign-off."
/>

## Day 30: Full autonomy

By day 30 the agent runs at full volume and maintains itself: self-learning is active, knowledge gaps are detected automatically, and voice, chat and email are unified on the same agent. Your team's job shifts from building to reviewing.

<Steps>
  <Step title="Work the Review queue">
    Fini's background AI drafts fixes for knowledge **gaps** and **conflicts** it finds in live conversations. Approve, edit or reject them in [Review](/en/knowledge/review). These drafts never publish without a human.
  </Step>

  <Step title="Expand to every channel">
    Add the remaining surfaces on the same agent: native [Email](/en/deploy/email), [Voice](/en/deploy/voice) from **Voice** in the agent sidebar, the [Help Center](/en/deploy/helpcenter), or more helpdesk channels. Use Channel Prompts for per-channel differences. For voice, you can port an existing number, forward calls, or connect over SIP.
  </Step>

  <Step title="Gate every change with Test Suite">
    Run your test cases or collections on every meaningful change (a prompt edit, a knowledge update, a rule change) and before each release. Turn new failures into test cases from Inbox (the flask icon) as you find them.
  </Step>

  <Step title="Track resolution in Analytics">
    Run the [weekly health check](/en/analytics#weekly-health-check) in Analytics: the KPI cards, the Resolution rate trend, and the Knowledge performance and Intent rule breakdowns. Read [Escalation reasons](/en/analytics#escalation-reasons) to see what to fix, and use [Knowledge performance](/en/analytics#knowledge-performance) to find high-volume, low-resolution slices and fix them. See [How to measure resolution rate](/en/how-to/measure-resolution-rate).
  </Step>
</Steps>

**Exit check for day 30:** escalations are dominated by reasons you expect (policy constraints, customers asking for a person) rather than **Missing Knowledge** or **API or System Failure**, and the Review queue is being worked on a regular cadence.

## What can move the dates

The milestones assume your content and systems are ready to connect. In practice these are the things that most often shift a date:

* **Knowledge quality.** A help center with outdated or contradictory pages produces more Review work on day 1. See [How Fini handles messy or conflicting docs](/en/knowledge/messy-or-conflicting-docs).
* **API access.** Actions need a reachable endpoint and credentials for each system. If an API isn't available yet, the workflow can run as an escalation with full context until it is.
* **Approval cycles.** Security and compliance review on your side (DPA, BAA, questionnaires) usually runs in parallel. Start it early with the [Security overview](/en/security/overview).
* **Voice setup.** Voice needs a phone number connected to Fini: you can port an existing number, forward calls, or connect over SIP. Plan the routing change with your telephony team.

<Note>
  The 90-Day Money-Back Guarantee measures performance over the first 90 days of a deployment, so the day 30 milestone sits well inside that window. Eligibility applies; see [Money-back guarantee](/en/billing/money-back-guarantee) and the [terms](https://www.usefini.com/security/fini-guarantee-terms).
</Note>

## Related

<CardGroup cols={2}>
  <Card title="Quickstart" icon="rocket" href="/en/quickstart">
    The day 1 steps in detail, from a fresh workspace to a deployed agent.
  </Card>

  <Card title="How Fini works" icon="gears" href="/en/how-fini-works">
    What happens to each conversation once the agent is live.
  </Card>

  <Card title="Fini on top of your helpdesk" icon="layer-group" href="/en/deploy/on-top-of-your-helpdesk">
    How Fini connects without a migration.
  </Card>

  <Card title="Test Suite" icon="vial" href="/en/testing/test-suite">
    Regression checks that gate every change after go-live.
  </Card>
</CardGroup>


## Related topics

- [Questions to ask an AI support vendor, with Fini's answers](/en/evaluate/questions-to-ask.md)
- [RFP fact sheet](/en/evaluate/rfp-fact-sheet.md)
- [Fini FAQ](/en/faq.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.