# How ReacherX adapts its CRM to different use cases

Follow a workspace use case from shared definitions to profile stages, △ Agent prompts, and reporting.

By Salman · 2026-07-17 · engineering

Canonical: https://reacherx.com/blog/how-reacherx-adapts-to-use-cases

Open a candidate who has been marked Hired, then look at the stored status. You'll find `converted`, not `hired`. A customer can have that same value. The workspace tells the app what the value means to the person using it.

That is the first thing to understand before changing a use case in ReacherX. You don't need a new table for every kind of person the user wants to find. The shared definition changes the labels and gives △ Agent context about the job.

This walkthrough follows v4 beta at commit `8ea2662`.

## Start with the recruiting definition

In [shared/lib/workspaceUseCases.ts](https://github.com/VecterAI/reacher-x/blob/8ea266282d045c8d83764be86c561ef8010fa661/shared/lib/workspaceUseCases.ts), find `recruiting`. Here are its stage labels:

```ts
stageLabels: {
  new: "Sourced",
  contacted: "Contacted",
  in_progress: "Interviewing",
  converted: "Hired",
  archived: "Archived",
},
```

Suppose you want a different word for Interviewing. Change the label, then check the places that show it. Keep `in_progress` as the key. Replacing that stored value would involve the schema and the code that reads and writes it.

Look below the labels for `promptContext`. It includes `searchIntent`, `qualificationLens`, `outreachGoal`, and `successDefinition`. Those tell △ Agent what this use case is for. Finding someone to hire calls for different evidence from finding someone who might buy a product.

The same entry contains entity names, routes, and page labels. This command will help you find code that uses the labels and prompt context:

```sh
rg 'stageLabels|promptContext' shared features convex
```

## Follow the label onto the screen

[useActiveUseCaseLabels.ts](https://github.com/VecterAI/reacher-x/blob/8ea266282d045c8d83764be86c561ef8010fa661/shared/hooks/useActiveUseCaseLabels.ts) resolves the active definition. The loaded workspace takes priority. While it is loading, the hook can use a cached value, then the server-provided value or product default. Setup has its own draft choice.

If a hiring workspace shows customer labels, inspect that resolved key first. Don't fix it by hard-coding “Candidates” into a component. `PipelineTimeline.tsx`, profiles, and card menus need to agree about the active use case.

Now change a candidate's stage. The action reaches `updateProspectStatus` in `convex/prospects.ts`. That mutation checks ownership, writes `status` and `pipelineStage`, and records the stage timestamp. Archiving also schedules a pause of automated work. You must unarchive the person before moving them to a later stage.

## Follow the instructions into the agent

[convex/agents/prompts.ts](https://github.com/VecterAI/reacher-x/blob/8ea266282d045c8d83764be86c561ef8010fa661/convex/agents/prompts.ts) builds prompts from the definition. `convex/agents/internal.ts` and `convex/agents/outreach/index.ts` use it when preparing context too.

The audience supplies the user's particular requirements. Saved memories add instructions, and `convex/lib/learningCore.ts` includes the use case in learning context. Changing that context doesn't retrain the model. The [memory article](/blog/how-reacherx-memory-works) explains what is stored and retrieved.

After a change, read the resulting prompt. Does △ Agent still ask for buying intent in a recruiting workspace? Check a hiring workspace, then a partnership workspace, then a new setup draft. Check the list, profile, stage menu, success page, and Analytics.

The workspace-use-case and prospect-status tests cover nearby behavior. Include an older workspace with no use-case key and an archived person when those paths are affected. Read the [generated Convex guidelines](https://github.com/VecterAI/reacher-x/blob/main/convex/_generated/ai/guidelines.md) before changing the mutation. The [architecture overview](/blog/how-reacherx-agent-works) connects this path to the rest of the app.
