# Route every call's notes to the right CRM record

You have access to your team's call-notes tool and your CRM. Run this
every **[12 hours]** on the calls of the last **[13 hours]**.

## 0. Set up (skip if you're already connected)

If you don't already have live tool access for this, connect it first
— this prompt is only as real as the tools behind it:

1. Get a Tulina account: book a demo at https://tulina.ai/book.
2. Add Tulina's MCP server to your assistant: https://mcp.tulina.ai/mcp
3. In Tulina, connect your own API keys for the tools this prompt uses
   — your meeting-notes tool and your CRM.

Once connected, your assistant has real tool access and the rest of
this prompt runs as written.

## 0b. Already on Tulina? Three things around the run

An account and the MCP server are not the whole setup. Two of these come
before the run below and one after it, and together they turn this from a
one-off answer into a process your workspace keeps:

1. **Activate this process's connectors first.** Call
   `oto_connector(op="list")`, match it against the tools named in step 3
   above, and `oto_connector(op="select", name="...")` every one that
   isn't active yet. Selecting a connector does not mount its tools in the
   conversation you're already in — reach them through `oto_call` for this
   run, or open a fresh conversation once they're all on.
2. **Attach the work to an existing project.** `oto_project(op="list")`
   shows your active org's projects: pick the one this work belongs to
   rather than opening another, and keep its id. The project is where this
   process, the tables it writes to and the connectors it uses hang
   together.
3. **When the run is done, save it as a process — with its graph.** Write
   the body with `oto_procedure(op="set", ...)`, then attach it with
   `oto_project(op="link", project_id=..., target_type="procedure",
   target_ref="<your slug>")`. The body has to carry a drawing: read
   `oto_guide(op="read", slug="procedure-flowchart")` and follow it
   exactly — ONE untagged fenced block in that grammar, opening with the
   trigger and a quoted example of what you'd type to start a run. Tulina
   parses that drawing back into the graph it renders as the process's
   default view, which is what makes it come out in the same style as
   every other process in the app; a drawing the grammar can't read falls
   back to raw characters instead. Saving a process needs org-admin
   rights — without them, hand the finished body to someone who has them.

Never invent a deal, a price, a status or a company. A window with
nothing to do reports "nothing new", and that is a success.

## 1. Sweep the window, keep the unsynced calls

A note does not exist for the API at the moment of the call. It appears
once the note is generated and shared, sometimes hours later. Sweep
**twice** and union the results by note id:

- Notes **created** in the last [13 hours]: the calls that happened in
  the window. The window is an hour wider than the cadence, so a call
  on the boundary is caught by one run or the other.
- Notes **updated** in the last [13 hours] and created in the last
  [7 days]: the calls that became readable in the window, whenever they
  happened. If a note comes back right at the seven-day floor, say so
  in the report: the floor is now doing work.
- Page through both (up to 30 per page) and take every note, **whoever
  owns it**. Keeping only your own notes means your colleagues' calls
  never reach the CRM.
- "Updated" is not "published". A folder move or a re-index can stamp
  unrelated notes with the same update time. A wide gap between created
  and updated is a reason to check the sync marker, never a reason on
  its own to rewrite a record.
- **The sync marker is the link to the note, and only that.** Every
  recap this process writes ends with the note's web link. Before
  processing a call, search the notes on each attendee the CRM already
  holds for that link; if it is there, drop the call. A record whose
  fields already reflect this call but which carries no note with the
  link is **unsynced**: a person filled the fields by hand, so write
  the recap and leave their fields alone.
- **Two notes can be one call.** When two colleagues attend, each gets
  a note: two ids, two links, two summaries of the same half hour.
  Compare the calendar event id with the notes already handled. Same
  event, attendees and slot means the same call: append the second link
  to the existing recap, add what only the second summary says, and
  touch no field. When the two copies disagree on a fact, record the
  disagreement in the note and let a person settle it.

Take the remaining calls **oldest first**, so a newer call's reading of
the pipeline wins over an older one, and carry each one to its recap
before the next begins.

## 2. Read the call and classify it

- The note's summary is the source. Fetch the transcript (paginated)
  only when the summary is missing or useless; asking for a long
  meeting's transcript inline can fail as too large.
- Pull the external attendees with their emails, minus your own domain,
  your team's personal addresses and notetaker bots. Then what the call
  produced, what was promised, what blocks the next step, any price
  named, and the language spoken.
- **Take names from the email domain, not the transcript.** Summaries
  mangle company and product names; never copy one into the CRM
  without recognizing it first.
- **Date the call from the note's creation time**, and take follow-up
  dates from the summary's own next steps. The calendar event attached
  to a note can point at a different occurrence of a recurring meeting.
- **Not everything in a summary belongs in a CRM.** Someone's health,
  family or personal money is not pipeline context: drop it entirely,
  and keep only what the business thread needs ("back at work,
  follow-up late in the month"). Your own internal numbers stay out
  too, except a figure that *is* the negotiation, written as the
  constraint it is.

Decide the class **before any write**, and report it for every call:

| Class | What it looks like | Where it lands |
|---|---|---|
| Sales | a prospect or customer, a conversation about buying or onboarding | the **company**, in the sales pipeline group |
| Talent | hiring: a candidate met, a role scoped, a recruiter putting profiles forward | the **candidate**, in the talent group |
| Partner | a channel, reseller, referral or intro relationship | the **person**, in the partner group |
| Investor | a fund, angel or scout, and a conversation about raising from them | the **person**, in the investor group |
| Internal | a team sync, a one-on-one, a solo note | nothing: reported and dropped |

- When it is ambiguous, prefer the class the next step belongs to: an
  intro being made is talent or partner, a payment link being sent is
  sales, a deck going to a fund is investor.
- **The other side selling to you is not a sales call.** It is a
  partner or vendor thread, and inventing a deal for it corrupts the
  pipeline. An investor is not a partner either.
- **A title, an attendee list or a folder is not a classification.** An
  external can sit on the invitation while the summary is two
  colleagues talking *about* that company. Nobody discusses a
  counterpart in the third person with them in the room. Read the
  summary before the metadata, and flag a close call for a person.
- **A prep note is not a call.** A solo note rehearsing an upcoming
  meeting creates no record, and neither does a company merely named
  as an option.
- A call can carry two classes at once, a customer call where the
  customer also offers an introduction. It then routes to both, one
  record and one note each.

## 3. Route it to the right record

**Sales goes to the company in the pipeline.**

- Search the person by email first. A text search that comes back empty
  on a multi-word company name is not proof of absence: confirm on the
  domain before creating anything, or you create the duplicate you were
  looking for.
- **A matching company exists:** create the person with the company's
  id set explicitly. Attendee email domains and company websites drift
  apart, and letting the CRM resolve the domain itself can create a
  second company.
- **No company exists:** create it first, add it to the pipeline group,
  then create the person attached to it.
- **The call never names a company** (a personal or school address, no
  stated employer): create no company. A company created from a
  personal-mail domain is a permanent duplicate the CRM will offer for
  every other contact on that domain. Put the person in the pipeline
  group and the missing context in their description.
- A record must be **in the group before that group's fields are
  written**, or the write is refused. Read the group's own fields
  before writing; never assume their names.

**The pipeline fields, on the company:**

- **Status moves forward only, and closed stays closed.** Use your own
  ladder, for example [Meeting booked → Follow-up pre-demo → Follow-up
  post-demo → Qualified/Negotiating → Closed Won | Closed Lost], read
  from the CRM rather than assumed. Set an empty status and advance one
  the call plainly supports. Never move one backwards and never set or
  touch a closed state: a person closed it knowing something the
  summary does not.
- **One rung is the habit, not the ceiling.** Advance two only when the
  call closed two stages at once (the booked meeting *was* the demo),
  and flag it as a judgment call. The last open rung is the run's
  ceiling.
- **A field a person set from this same call is not the run's to
  correct.** Write the recap and report the change you declined.
- **Next steps are rewritten every sync**: what happens next and who
  owes it, from the call's own next steps. Stale next steps are worse
  than none.
- **Deal value is the undiscounted list price of the offer actually in
  negotiation.** A discount goes in next steps and the note, never in
  the figure. A bigger tier merely mentioned does not raise it. No
  price named, or a price band with nothing chosen, leaves it empty.
- Company size and industry are set only when the call makes them
  certain. A wrong one is worse than a blank one.

**Talent goes to the candidate**, who is not always the person on the
call: a recruiter's call produces a card for the profile they put
forward, and the recruiter goes to partners. The candidate status moves
forward only and the run never sets the closing state. A customer's
contact changing jobs is not a candidate.

**Partner goes to the person**, in the partner group, writing only the
fields that group carries. An existing customer who brokers an intro
**gains** the partner group and keeps their pipeline group. A prospect
who *could* resell you is not a partner until someone raises it.

**Investor goes to the person**, in the investor group, with the fund's
stage, ticket, focus and what they asked for in the description. The
investor status is **left blank on a first meeting**: a warm "send me
the deck" and a polite brush-off produce the same next step.

## 4. Read back what the CRM did

- Re-read the person after **every** create and check which companies
  it is attached to. Some CRMs resolve the email domain on their own
  even when you passed a company id, and can create an empty twin
  company in the same call, already in the pipeline. Detach it, keeping
  only the company you meant, then delete the twin.
- A company the CRM resolved correctly but under a mangled name is
  renamed in place, never deleted: deleting a right answer only creates
  another duplicate.
- **Re-read after every custom-field write** and compare it with the
  read taken before writing. A CRM's own AI fields can fill a value you
  never sent; clear what appeared, and leave alone what was already
  there.

## 5. Write the recap note

- One note on the person the call was actually with, structured by what
  the call produced: context, what happened, decisions, objections,
  next steps with owners. Name the seller or interviewer when it was
  not you.
- **Write it in the language of the call**, and close it with the
  note's web link. That link is the sync marker step 1 depends on, so
  it is never optional.
- A call routed to two records gets a note on each, both ending with
  the same link. A call recorded twice gets **one** note carrying
  **both** links.
- **Put declined changes in the note, not only in the report**: a
  status left alone, a blank investor rung, a deal value left empty
  although a price was heard, a prospect with no company. The report
  scrolls away; the note is what the next person opening the record
  reads.

## Output

Report: the window and the count from each sweep, with any note
published more than [13 hours] after its call; then every call with its
class and outcome (routed, already synced, second copy folded in, or
internal); for each routed call, the records created or updated, the
status change made or declined and why, the deal value written or left
empty, any duplicate the read-back caught and repaired, and every
judgment call made on your behalf. A window with nothing to do reports
"nothing new".
