# Client Operations (Pro)

Client Operations is CoreReflex's native, white-label client-management suite — CRM, booking, tasks, and automations that run the whole production-to-delivery loop inside your own workspace, on your own brand. No HubSpot tab, no Calendly account, no Zapier subscription. Just the pieces an agency actually needs, wired straight into the films and meetings you already make in CoreReflex.

This page is for **Pro** account owners. If you run an agency on CoreReflex, this is the layer that turns "I made a great video" into "I ran a great engagement."

**On this page**

- [What's in the suite](#whats-in-the-suite)
- [Turning it on](#turning-it-on) · [Where it lives](#where-it-lives)
- [Contacts (CRM)](#contacts-crm)
- [Tasks & approvals](#tasks--approvals)
- [Booking](#booking)
- [Automation](#automation) — triggers, actions, schedules, Autopilot, and the AI planner
- [How it all fits together](#how-it-all-fits-together)
- [Quick reference](#quick-reference)

---

## What's in the suite

| Module | What it does |
|--------|--------------|
| **Contacts (CRM)** | A native address book of leads and clients, each with an append-only activity timeline, tags, and one-click GDPR export or delete. |
| **Tasks & approvals** | The accountability layer — to-dos tied to a contact, a campaign, and an owner, with due dates and statuses. Can be seeded automatically from a meeting brief's action items. |
| **Booking** | Your own branded scheduling page on your domain. Set availability, share a link, and let clients pick a slot — timezone-correct and never double-booked. |
| **Voice intake** | An AI voice line that can book appointments, qualify leads, answer from your knowledge base, and log handoffs into the CRM. |
| **Automation** | Connect events that happen in CoreReflex (a booking comes in, a render finishes) — or a schedule — to actions you'd otherwise do by hand: create a task, log activity, advance a campaign, run a creative workflow, publish a finished render to your social platforms, or call a webhook. |

Everything is **scoped to your workspace** — your team shares one client book, and nothing leaks across workspaces.

---

## Turning it on

Client Operations is **off by default** and reserved for **Pro**. The free tier gives you the full creative pipeline — directing, producing, voicing, editing, meeting briefs — but contacts, tasks, calendars, and automations stay locked until you upgrade.

To enable the suite, upgrade your workspace to Pro from the **Plan** section of your dashboard (under the **Account** menu), or see [Plans & billing](plans-and-billing.md) to compare tiers. The moment your workspace is on Pro, every Client Operations feature unlocks. If you try to use a module on the free tier, CoreReflex returns a clear prompt to upgrade rather than failing silently.

### Where it lives

Client Operations is built into your **dashboard** (at [corereflex.com](https://corereflex.com) → your account). In the top navigation, open the **Distribute** menu — **Client ops** sits there alongside **Publishing** (push finished renders to your connected social platforms) and **Analytics**. That's deliberate: client operations is part of how work leaves the studio, and the automation engine below can hand finished renders straight to Publishing.

The **Client ops** menu item only appears once your workspace is on Pro. Open it and you get seven live panels:

- **Contacts** — your most-active leads and clients, with a quick "add a lead" form. Click any contact to open their full record.
- **Tasks** — your task board: change a status inline, edit details, add new tasks.
- **Automations** — your automations with a one-click activate/pause toggle and a **+ New automation** builder.
- **Meeting briefs** — the AI meeting summaries filed in your workspace.
- **Booking links** — each booking calendar with its public link, an AI **Voice line** link, pause/resume and delete controls, a create form, your upcoming bookings, and your weekly availability editor.
- **Calendar events** — the confirmed appointments on your calendar.
- **Knowledge base** — the documents your voice agents ground their answers on. Paste your FAQ, pricing, or policies once; the agent answers from facts instead of guessing.

---

## Contacts (CRM)

Your contacts are the spine the rest of the suite hangs off. Each contact is a person or company you're working with, and every other module — tasks, bookings, briefs, automations — can point back at one.

### What a contact holds

- **Identity** — name (required), email, phone, and company.
- **Status** — where they are in your pipeline: **lead**, **prospect**, **active**, or **inactive**. New contacts start as a lead.
- **Owner** — the team member responsible. Defaults to whoever created the contact.
- **Lifetime value** — an optional figure you can record per contact.
- **Source** — a free-text note of where they came from (a referral, a campaign, a booking).
- **Last activity** — automatically stamped whenever anything touches the contact, so your list naturally sorts the most-active clients to the top.

Email is treated as the unique key **within your workspace**: you can't create two contacts with the same email, and the check is case-insensitive (so `Jane@acme.com` and `jane@acme.com` are the same person). The same email can, of course, exist in a different workspace — your client book is yours alone.

### Finding contacts

Your contact list sorts by most-recently-active first. You can narrow it by **status** (just your active clients, say) or **search** across name, email, and company at once. The list returns your 50 most relevant contacts by default; the dashboard panel shows your eight most active.

### Opening a contact

Click a contact in the **Contacts** panel and their full record opens:

1. **Identity and tags** at the top — name, email, phone, company, and any tags attached.
2. **Status** — change it from the dropdown and click **Save**.
3. **Linked tasks** and **meeting briefs** — the work and summaries filed against this person.
4. **Activity** — the full timeline, newest first.
5. **Add a note** — type into the note field and click **Log** to stamp it onto the timeline.
6. **Export (GDPR)** and **Delete** — the privacy tools, one click each (see below).

### The activity timeline

Every contact carries their full story in reverse-chronological order — the **activity timeline**. It's **append-only**: entries are added, never edited away, so you always have an honest record of the engagement. Timeline entries come in a few flavors:

- **note** — something you jotted down.
- **meeting_brief** — an AI meeting summary that got filed against this contact (see [Meetings & AI briefs](meetings-and-briefs.md)).
- **task** — work logged against the contact.
- **booking** — a slot they grabbed on your scheduling page.
- **voice** — a lead captured or handled by the voice agent.
- **review** — an approval or revision event.

Many of these are written for you automatically. When a client books a call, a booking entry appears. When a meeting that's linked to a contact gets briefed, the summary lands on their timeline. When the real-time voice agent captures a lead, the capture is logged too. You can also add a note by hand at any time. Every timeline write refreshes the contact's **last activity** stamp.

### Tags

Tags are your own workspace-wide labels — "VIP," "retainer," "needs follow-up," whatever fits how you work. Create a tag once and give it a color (a default is applied if you skip it), then attach or detach it from any contact. Tag names are unique per workspace, so you won't end up with three slightly different "Retainer" tags.

### GDPR: export and delete, built in

Because this is a client book holding real people's data, the privacy tools aren't an afterthought — both are one click inside the contact record:

- **Export** a contact and you get a single JSON file of everything CoreReflex holds about them — their record plus every meeting brief filed against them, stamped with the export time. That's your data-subject-access-request answer in one click.
- **Delete** a contact and it's a true hard delete. The contact, their entire activity timeline, their tag links, and their meeting briefs are all removed. There's no hidden "soft-deleted" copy lingering in the background — gone means gone.

---

## Tasks & approvals

Tasks are the accountability layer. They keep "we said we'd send the revised cut by Friday" from evaporating.

### What a task holds

- **Title** (required) and optional **notes**.
- **Status** — **open**, **doing**, **done**, or **cancelled**.
- **Assignee** — the team member on the hook.
- **Links** — a task can point at a **contact** and a **campaign**, so the same to-do shows up in the client's context and the project's.
- **Due date** — when it's owed.
- **Source** — how the task was born: created by hand (**manual**), spun out of a meeting brief, or fired by an automation.

### How the list is ordered

The task list is built so nothing important hides. **Done tasks always sink to the bottom**, and active work sorts by due date (soonest first, undated last), then by newest. You can filter the list by status, assignee, contact, or campaign — for example, "everything open and assigned to me," or "all tasks for this client."

### Working the board

The **Tasks** panel in Client ops shows your list with the open count up top. Each row has a status dropdown — flip a task from **open** to **doing** to **done** right in the list — plus an **Edit** button for the details, and a create form at the bottom for adding new work. Open a contact and their linked tasks appear inside the contact record too.

### Tasks from meeting briefs

This is where Tasks earns its keep. When CoreReflex summarizes a meeting, the brief includes **action items**. Those action items can be **seeded straight into your task list** as open tasks — already linked to the right contact and campaign, marked with a `meeting_brief` source so you know where they came from. You walk out of a client call and the follow-ups are already on the board. See [Meetings & AI briefs](meetings-and-briefs.md) for how briefs are made.

---

## Booking

Booking is your own branded scheduling page — a Calendly-style experience, but it lives on your domain and your brand, and it's wired into your CRM.

### How it's built

You create one or more **booking calendars** (think "meeting types" — "30-min discovery," "60-min strategy session"). Each calendar carries:

- A **name** and optional description.
- A **duration** (from 5 minutes up to 8 hours).
- **Buffers** before and after, so back-to-back calls don't crowd you.
- A **timezone** (IANA, e.g. `America/New_York`) — this is what makes slot math correct.
- A **location type** — **video**, **phone**, **in person**, or **custom** — plus a location detail (a meeting link, an address, a phone note).
- A **minimum notice** (how soon someone can book — defaults to two hours) and a **maximum days out** (how far ahead the calendar opens — defaults to 60 days).
- A **default assignee** — the team member whose availability and calendar the page books against.

Each calendar gets a **public link slug**, and the page is served at `/book/<slug>` (e.g. `corereflex.com/book/discovery-call`, which you'd front with your own white-label domain). Slugs are unique across all of CoreReflex so the public page can route cleanly — if a slug is already taken, you'll be asked to pick another.

### The Booking links panel

From the dashboard's **Booking links** panel you can:

- **Copy link** or **Open** a calendar's public page.
- Open its **Voice line** — the AI appointment-setter bound to that calendar (see [Booking by voice](#booking-by-voice)).
- **Pause** or **Resume** a link — a paused link's public page and voice routing stop working until you resume it.
- **Delete** a link outright.
- **Create link** — name it, set the duration, done. A new calendar inherits your browser's timezone and a 30-minute duration by default; both are configurable.
- See your **Upcoming bookings** — every confirmed appointment from now forward, across all your calendars.
- Set **Your weekly availability** — right in the panel (next section).

### Setting availability

Availability is per team member, set as weekly working-hour windows. In the **Booking links** panel, under **Your weekly availability**:

1. Tick the checkbox for each day you take bookings.
2. Set the start and end times for that day (e.g. `09:00` to `17:00`).
3. Click **Save availability**.

The booking page only ever offers slots that fall inside the default assignee's availability.

### What your client sees

A client opens your public booking page, picks a date, and sees the open slots. The slots they're offered have already been filtered through:

- the assignee's **availability** windows,
- their **existing bookings** (busy times are excluded),
- the calendar's **buffers** before and after each meeting,
- the **minimum notice** and **maximum days out** rules, and
- **timezone correctness** — including daylight-saving transitions, so a 10am slot is genuinely 10am.

Importantly, the public page **never reveals which team member** the booking is going to. Your client sees your brand and the available times, not your internal roster.

### Booking a slot — and what happens next

When a client confirms a slot, CoreReflex does several things in one atomic step:

1. **Locks the slot.** Bookings for a given team member are serialized, and the slot is re-checked at the moment of booking. If two people race for the same time, only one wins — the other is told the slot was just taken. **No double-booking, ever.**
2. **Creates or updates a contact.** The booker becomes a CRM contact automatically (a new lead, sourced as `booking`), or matches an existing contact by email.
3. **Logs a calendar event and a booking record.**
4. **Writes a booking entry** on that contact's activity timeline.
5. **Fires any matching automations** (see below) — best-effort, so a downstream hiccup never costs the client their booking.

The booker gets a **confirmation with a downloadable `.ics` file**, so the meeting drops straight into their own calendar (Google, Outlook, Apple — anything that reads standard calendar files).

The public booking and slot pages are rate-limited to keep them abuse-resistant, and they require no login from your client — they just pick a time.

### Booking by voice

The real-time voice agent uses these same calendars. Click **Voice line** on any booking link to open its browser voice widget (it lives at `/voice?calendar=<slug>`), or connect a Twilio number to `/api/voice/twilio?calendar=<slug>&persona=<persona>` for phone intake. The **Appointment Setter** and **Sales Assistant** personas call the same availability and booking tools the public page uses, so they cannot invent a slot, double-book a teammate, or create a booking outside the calendar rules.

For non-booking calls, the **Lead Qualifier** and **Support Agent** personas still use the calendar slug to find the right workspace. They can create or update a CRM lead, search the workspace knowledge base for grounded answers, and record a human handoff note so the call has a place to land. See [Recording, Meetings & Podcasts](recording-and-podcasts.md#the-real-time-voice-agent) for the caller-facing voice flow.

---

## Automation

Automation connects **events** that happen inside CoreReflex — or a **schedule** — to **actions** you'd otherwise do by hand. It's how "a client booked a call" becomes "a follow-up task appeared and the campaign moved forward," and how "a render finished" becomes "it's already posted to Instagram" — without anyone lifting a finger.

### Events you can trigger on

An automation listens for one **trigger**. The available triggers are:

| Trigger | Fires when… |
|---------|-------------|
| **On new booking** (`booking_created`) | A client books a slot on one of your calendars. |
| **On meeting brief** (`meeting_briefed`) | A meeting is summarized into a brief (linked to a contact and/or campaign). |
| **On payment** (`payment_completed`) | A subscription payment succeeds — fired for every workspace under the account. |
| **On render done** (`render_succeeded`) | A render job finishes successfully — the event carries a link to the finished file. |
| **On campaign approved** (`campaign_approved`) | A reviewer or owner approves a campaign. |
| **On new contact** (`contact_created`) | A contact is added — by hand in the Contacts panel or through the contacts API. |
| **On a schedule** (`schedule`) | A clock, not an event: run every N minutes, or daily at a set UTC time. |

All seven triggers are live. One nuance on **On new contact**: it fires when a contact is *created directly* (the add-lead form, or the API). Contacts created as a side effect of a public booking fire **On new booking** instead, and voice-agent lead captures log timeline activity without firing it — so a booking never sets off both.

You can also **run any automation manually** with test data while you're building it — handy for confirming an automation does what you expect before it goes live.

### Actions you can take

When a trigger fires, your automation runs a list of actions in order. The available actions are:

| Action | What it does |
|--------|--------------|
| **Create task** | Adds an open task to your board — linked to the contact and campaign from the event. |
| **Log contact activity** | Writes a note (or other entry) onto a contact's timeline. |
| **Advance campaign** | Moves a campaign to a new status (e.g. into review). |
| **Call a webhook** | Sends the event data as a POST to an HTTPS URL you specify — to reach any outside tool. |
| **Run a workflow recipe** | Fires one of your saved Autopilot recipes — a full creative workflow (images, copy, video) run unattended. |
| **Publish to social** | Posts a caption and media link to your connected social platforms via your Publishing connection. |

A few notes on the newer actions:

- **Run a workflow recipe** is what powers Autopilot (below). The recipe runs in the background with your approval checkpoints set to auto, so a scheduled pipeline never stalls waiting for a click.
- **Publish to social** relays through the same **Publishing** connection you set up in the dashboard's Publishing section (a GoHighLevel account reaching Facebook, Instagram, LinkedIn, X, Google Business, and TikTok). You pick which connected accounts to post to when you build the automation; the caption and media link fill in from the event. Paired with the **On render done** trigger it becomes render-to-published: the event carries a secure link to the finished file, and the media link defaults to exactly that (`{{assetUrl}}`), so a finished render posts itself. You can post immediately or give the post a scheduled publish time, choose post/story/reel, and every relay counts against your publishing usage and shows up in your Publishing history just like a manual post.

### Fill-in-the-blank fields

Action text supports simple **fill-in-the-blank fields**: write `{{calendarName}}` (or any value the event carries) into a task title, activity note, caption, or media link, and CoreReflex substitutes the real value at run time. A field the event doesn't carry simply fills in blank. What each trigger carries:

| Trigger | Fields you can use in `{{…}}` |
|---------|-------------------------------|
| On new booking | `contactId`, `bookingId`, `calendarName`, `startsAt` |
| On meeting brief | `contactId`, `campaignId`, `briefId`, `summary` |
| On payment | `accountId`, `plan` |
| On render done | `jobId`, `compositionId`, `assetId`, `assetUrl`, `qaScore`, `qaMax`, `qaBand`, `qaPublishable` |
| On campaign approved | `campaignId`, `name`, `approvedBy` |
| On new contact | `contactId`, `name`, `email` |
| On a schedule | `firedAt`, `automationId` |

So an **On new booking** automation can create a task titled "Prep for {{calendarName}} call," and an **On new contact** automation can log "Welcome note sent to {{name}}."

### Running on a schedule

Pick **On a schedule** as the trigger and the automation fires on a clock instead of an event:

- **Every N minutes** — set the interval (minimum one minute). The dashboard builder has a "Run every (minutes)" field for this.
- **Daily at a UTC hour** — fire once a day at a set time (e.g. 09:00 UTC). The Autopilot cadence presets use this; it's also available when creating automations through the API.

A schedule needs one of those cadences — CoreReflex refuses to save a scheduled automation with no cadence, because it would sit "active" and never fire. The engine checks for due schedules about once a minute, so treat the timing as minute-accurate, not to-the-second. If a scheduled run fails, the failure is recorded and the clock still advances to the next slot — it never machine-guns retries at you. **Pause** a scheduled automation and it stops firing until you resume it.

### Autopilot: schedule a creative workflow

The most powerful scheduled automation is packaged for you as **Autopilot** — no builder required. In the dashboard's **Workflows** view, under **Autopilot recipes**:

1. Pick a recipe starter (campaign, video, image, writing, or audio) and fill in its fields. Script-like fields have a **Generate** button that drafts the copy for you.
2. Choose a cadence from the dropdown: **Hourly**, **Every 6h**, or **Daily 09:00 UTC**.
3. Click **Schedule**. That's it — CoreReflex saves the recipe and creates an active scheduled automation that runs it unattended (approval checkpoints auto-approve so nothing stalls overnight).

You can also put any **saved recipe** on autopilot: click **Schedule** on its row, pick a cadence, and confirm.

Everything on autopilot appears in the **On autopilot** list in the same view, showing the cadence, the next run time, and the total runs so far. From there you can open a schedule's **Runs** (each with a link straight to its output in the studio), **Pause**/**Resume** it, or **Remove** it — past runs are kept.

### Draft an automation with AI

You can also start from a plain-English goal — "when a render finishes, post it to our socials and open a review task" — and have CoreReflex draft the automation for you: a name, the right trigger, and an ordered action list, constrained to the real triggers and actions above so the draft is always runnable. You review the draft and activate it; nothing goes live on its own. If the AI is briefly unavailable, you still get a sensible default draft, clearly flagged so you know it wasn't tailored.

Today the planner is part of the CoreReflex platform API rather than a button in the dashboard builder — if you or your developer work with the API, it's ready to wire into anything (see the [developer documentation](../dev/client-ops.md)).

### How runs behave

- **Only active automations fire.** Automations created through the API start as a **draft**; the dashboard builder creates them **active**. Flip any automation between active and paused with the toggle — pausing never deletes it.
- **Best-effort, never blocking.** Automations run after the event that triggered them is already safely committed. If an action fails — a webhook times out, say — it never undoes the booking, render, or brief that kicked it off.
- **Every run is recorded.** Each automation keeps a run history (the 20 most recent runs): what triggered it, which steps ran, and any error. If an action in the sequence errors, the run stops there and records the failure, so you can see exactly where it stopped.
- **Webhooks are held to a standard.** The URL must be a public HTTPS address — requests to private or internal networks are refused for your security. The call times out after 10 seconds, and any non-success response marks the step as failed in the run history rather than being silently swallowed.

### Building automations in the dashboard

You build an automation right in the Client ops **Automations** panel:

1. Click **+ New automation**.
2. **Trigger step** — give it a name (e.g. "New-lead follow-up") and pick the trigger from "When this happens." If you pick **On a schedule**, set "Run every (minutes)" under the advanced options.
3. **Actions step** — add one or more actions in order. Each row lets you choose its type and fill in its fields: a task title, an activity note, a target campaign status, or a webhook URL. The `{{field}}` placeholders work in any text field.
4. Click **Create automation**. It's created **active** and starts listening immediately; use the per-row toggle to pause it any time.

The dashboard wizard currently offers the four core actions (task, activity, campaign, webhook). The **Run a workflow recipe** action is created for you by the Autopilot flows above, and **Publish to social** is set up through the API today — both then show up and toggle in the same Automations panel as everything else.

Under the hood, an automation is a small graph of action nodes run top to bottom. A richer visual drag-and-drop graph builder is a separate track on the roadmap. There are also no time-delay or "wait for X" steps yet; automations run their actions straight through when the trigger fires. (That's deliberate — nothing waits in a queue that could silently drop your follow-up.) Built-in email and SMS sending aren't action types yet either; today you reach outside tools through the **webhook** action.

---

## How it all fits together

The point of Client Operations is that these modules aren't five separate apps — they're one loop:

1. A prospect lands on your **booking page** (`/book/<slug>`) — or calls your AI **voice line** — and grabs a discovery call.
2. They become a **contact** automatically, with the booking on their **timeline**, and an **On new booking** automation opens a prep **task** for the assigned producer.
3. You run the call, and CoreReflex turns the recording into a **meeting brief** filed on that contact — its **action items seeded as tasks** — which trips your **On meeting brief** automations.
4. You produce the work in the [studio](https://editor.corereflex.com); when the **campaign is approved** and the **render succeeds**, those automations fire too — and **Publish to social** can push the finished file straight to your platforms while a task logs the delivery.
5. Meanwhile, **Autopilot** keeps scheduled creative workflows producing in the background, and when the subscription renews, **On payment** can kick off a fresh round of work.

Every call, note, task, post, and decision lives in one workspace, on your brand, ready to **export or delete** on request.

---

## Quick reference

| If you want to… | Do this |
|-----------------|---------|
| Keep a client book | Create **contacts**; tag and status them; let the timeline fill itself in. |
| Schedule calls | Create a **booking calendar**, set **availability**, share the public link. |
| Never double-book | Nothing to do — booking serializes and re-checks every slot for you. |
| Take bookings by phone | Open a booking link's **Voice line**, or wire a Twilio number to it. |
| Track who owes what | Create **tasks**, assign them, set due dates; let briefs seed them. |
| Honor a data request | Open the contact and click **Export (GDPR)** or **Delete**. |
| Automate the busywork | Build an **automation** on a trigger, point it at actions, flip it **active**. |
| Auto-post finished renders | Connect **Publishing**, then pair a **Publish to social** action with **On render done**. |
| Run creative work on a clock | **Workflows → Autopilot recipes** — pick a recipe, pick a cadence, click **Schedule**. |

---

## Related pages

- [Meetings & AI briefs](meetings-and-briefs.md) — how recordings become briefs, action items, and timeline entries.
- [Recording, Meetings & Podcasts](recording-and-podcasts.md) — the caller-facing voice agent behind your voice lines.
- [Plans & billing](plans-and-billing.md) — what Pro unlocks, and how to upgrade.
- [Coming soon](coming-soon.md) — what's still on the runway.
- [User guide home](README.md) — the full table of contents.
