# Cook documentation > Cook is software that does marketing work for a business. These guides > explain what it does, how to ask for work, what waits for approval, and how > to set up each part. This file is the complete Cook documentation in plain text, generated from the same source the website renders. It is written for someone who has never used Cook and does not know marketing words; the vocabulary page defines every product and marketing term used throughout. Marketing pages and product overview: https://trycook.ai/llms.txt API reference: https://trycook.ai/docs/api-reference (for AI agents as plain text: https://trycook.ai/docs/api-reference/llms.txt; every operation as JSON: https://trycook.ai/docs/api-reference.json) Compatible APIs, for scripts written for another tool: Keep your scripts when you move to Cook (compatible APIs) https://trycook.ai/docs/compat; Calendly's API on Cook https://trycook.ai/docs/compat/calendly; Typeform's API on Cook https://trycook.ai/docs/compat/typeform; GoHighLevel's API on Cook https://trycook.ai/docs/compat/ghl ## Start here ### What is Cook? https://trycook.ai/docs A marketing team you talk to in plain English. What it does, what it will never do on its own, and what to read first. Cook does the marketing work for a business. You write what you want in plain English, the way you would tell it to a person you just hired. Cook does the work and shows you the result. You do not need to know any marketing words to use it. If you have never used anything like this before, read the six **Start here** pages in order. Together they take about ten minutes and they assume you know nothing. The second one is a dictionary — if a word here is new, it is defined there. #### What it does for your business - **Work out who to sell to.** It reads what people in your trade complain about online, what competitors charge, and who is already buying. - **Build a web page that collects enquiries.** A page about what you sell, with a form on it, published at a real web address. - **Run ads.** It writes them, puts them live on Facebook or Google, and turns off the ones that stop working. - **Answer people who enquire.** By text and email, within minutes, in your words — and put them on your calendar. - **Tell you what happened.** What it did, what it cost, and what came back. #### Who does the work The work is split between seven parts of Cook, called **departments**. Each does one kind of job. You do not have to pick between them: you ask for what you want, and it goes to the right one. | Department | What it does | | --- | --- | | Chief of Staff | Takes your request, hands it to the right department, and brings anything back that needs your decision. | | Research | Works out who to sell to, what to charge, and what to say. | | Marketing | Builds the page, writes the ads and the emails, and keeps the ones that work running. | | Sales | Answers new enquiries quickly and books the call. | | Client Success | Looks after the customers you already have. | | Systems | Connects the accounts you already use and builds the pages and tools. | | Content | Takes video apart, sets its editing standard, cuts and renders it, then checks the result against the reference. | #### What it will never do behind your back Cook asks you before it spends money or sends anything to a customer. That covers sending an email or a text, publishing a page, and changing what you spend on ads. The exceptions are ones you switch on yourself: YOLO mode, and the AI sales rep, which answers new enquiries on its own once it is on. You get a request showing the exact wording or the exact amount. Nothing happens until you press **Approve**. See [How to approve work](https://trycook.ai/docs/nothing-goes-out-without-you). #### Is this for me, or is it for agencies? Both, and you do not have to choose. Cook keeps work in folders called **clients**. If you run one business, you have exactly one client — your own business. It is already there when you sign up and you never need to make another one. Wherever these guides say "the client", read it as "your business". If you do marketing for other companies, you add one client per company and each company's work stays separate from the rest. #### What to read next 1. **[Common vocabulary](https://trycook.ai/docs/words)** — every term in these guides, one sentence each. Read it before the rest and nothing later will stop you. 2. **[Your first day](https://trycook.ai/docs/your-first-day)** — what happens after you sign up, and what to type first. 3. **[Prompting basics](https://trycook.ai/docs/how-to-ask)** — what to say, and where the answer comes back. 4. **[How to approve work](https://trycook.ai/docs/nothing-goes-out-without-you)** — money, messages, and approvals. 5. **[Why is everything locked?](https://trycook.ai/docs/levels)** — why your Cook may show less than you expected. Once those make sense, the rest of this site covers one thing at a time: - **[Building a lead generating asset](https://trycook.ai/docs/funnels)** — a *funnel* is a web page with a form on it, written and published for you. - **[Answering people without doing it yourself](https://trycook.ai/docs/routines)** — a *routine* is one job Cook does without you, on a schedule or whenever something happens. - **[Slack](https://trycook.ai/docs/connect-slack) or [Discord](https://trycook.ai/docs/connect-discord)** — if your team already talks in one of those. - **[Reusing a whole setup](https://trycook.ai/docs/what-is-a-playbook)** — a whole set-up saved and reused across several businesses. Most people never need one. #### Moving from another tool, or driving Cook from a program Cook answers the APIs of the tools it replaces, so a script written for one of them keeps working when you point it at Cook. - **[Keep your scripts when you move to Cook](https://trycook.ai/docs/compat)**: how the compatible APIs work, and what each one covers. - **[GoHighLevel's API on Cook](https://trycook.ai/docs/compat/ghl)**: contacts, opportunities, conversations, calendars and users. - **[Calendly's API on Cook](https://trycook.ai/docs/compat/calendly)**: event types, bookings, invitees and webhooks. - **[Typeform's API on Cook](https://trycook.ai/docs/compat/typeform)**: forms, responses and webhooks. - **[API reference](https://trycook.ai/docs/api-reference)**: every operation of Cook's own API. **For AI agents:** what Cook is and every page on this site, as plain text, is at [/llms.txt](https://trycook.ai/llms.txt). The whole documentation, these pages included, is at [/docs/llms.txt](https://trycook.ai/docs/llms.txt). ### Common vocabulary https://trycook.ai/docs/words Every term used in Cook and in these guides, explained in one or two plain sentences. If a word on any page here is not clear, it is on this list. Nothing on this page assumes you have worked in marketing. #### The basics **Workspace** — your whole Cook account: your business details, your work, and anyone you invite. One business, one workspace. **Client** — a folder that holds the work for one business. If you run one business you have exactly one client, it is your own business, and it is already there. Agencies add one client per company they work for. **Lead** — a person who has shown interest and given you a way to contact them. Someone who fills in your form is a lead. Once they buy, most people call them a customer. **Department** — one of the seven parts of Cook, each doing one kind of work: Chief of Staff, Research, Marketing, Sales, Client Success, Systems, Content. **Agent, or assistant** — the software inside a department that actually does a job and reports back. When a page says "your assistant did X", it means Cook did X. **Channel** — a named conversation, like a group chat, for one topic or one department. Cook posts what it did into the matching channel. **Drive** — where Cook files finished work: research write-ups, documents, recordings. Long results go here instead of into the chat. It is the **Drive** row in the sidebar. #### Things you will end up with **Funnel** — a web page whose job is to turn a visitor into a lead. It describes what you sell and has a form. Cook writes it, builds it, and puts it on a real web address. **Booking page** — a page where someone picks a time and books it straight into your calendar. **Form** — the boxes on a page where someone types their name, phone number and email. **Offer** — what you sell, said plainly: who it is for, what they get, what it costs. **Offer one-pager** — one page that writes the offer down properly, so every ad, email and page says the same thing. **Market teardown** — a written report on a group of buyers: who they are, what they already tried, what they pay, and what they complain about. **Reference pack** — a document of short-form videos worth copying, one page per video, with the numbers, the opening line, the beats and a version rewritten for your business. See [Content Research](https://trycook.ai/docs/content-research). **Contact sheet** — the grid of twelve frames taken from one video, spaced evenly from start to finish, so you can see how it is shot without watching it. #### Getting in front of people **Ad** — something you pay a platform such as Facebook or Google to show to people who are not looking for you yet. **Ad set** — a group of ads pointed at the same kind of person with the same budget. You turn an ad set on or off, not each ad separately. **Ad account** — your account with Facebook or Google that holds the ads and the card that pays for them. Cook needs to be connected to it to run ads. **Campaign** — one push with one aim, such as filling a slow month. It can contain ads, emails and texts. **Sequence** — several messages sent in a set order with gaps in between. For example: a text now, an email tomorrow, a reminder in three days. #### Work that repeats **Routine** — one job that Cook does on its own, either on a schedule or whenever something happens. For example: when a lead arrives, text them, wait a day, then email them. Every routine you create starts switched off. **Trigger** — the thing that starts a routine. A new lead, a booked appointment, a finished job, or a time of day. **Run** — one occasion when a routine did its steps. The **run history** shows what happened, when, and what came back. **Test** — running a routine with a made-up lead so you can read what it would send. Nothing reaches a real person. **Project** — a folder for one piece of work: a launch, a client, a rebuild. It holds the files for that job, the chats you have about it, and its routines. Every chat you start inside it can use those files without another upload. See [Keeping the files for one job together](https://trycook.ai/docs/projects). **In context** — a file whose words are read in full at the start of every chat in a project. The rest are **read on demand**: they stay in the project and are opened when a question needs them. **Playbook** — a whole set-up saved once and reused: several routines plus the rules that go with them. Mainly useful if you set up the same thing for business after business. See [Build a playbook for your systems](https://trycook.ai/docs/what-is-a-playbook). **Standard** — a written rule your Cook departments follow on every job. For example: never quote a price by text. You approve a standard before it is added. #### Contacting people **CRM** — the list of everyone who has contacted you, and what has happened with each of them. It is a contact list with a memory. Cook has its own; it can also work inside one you already pay for. **Opt out, or STOP** — when someone replies STOP to a text, they stop receiving texts. Routines skip anyone who has opted out. This is a legal requirement, not a setting. **Sending hours** — the hours during which a routine's messages are allowed to go out. A routine only has them if they are set on it: a playbook such as the Appointment Lead Engine asks for them when you install it (8am to 9pm in the business's time zone unless you change them). A message that comes up outside those hours waits. A routine with no sending hours sends whenever a step comes up. **Message sender** — the phone number or email address a message goes out from, so replies come back to the right place. **Alert channel** — where Cook pings your team when something needs a human. A Cook channel, or a Slack or Discord channel. **Number registration** — the approval a phone carrier has to give before a business number can send texts to customers. It is paperwork with a waiting period, so start it early. It is not something Cook can skip. **AI sales rep, or SDR** — the part of Sales that answers new leads by text or email within minutes, asks the qualifying questions, and books the call. #### Who is allowed to do what **Approval** — a request asking you to allow something before it happens. You see exactly what is proposed and press Approve, Request changes, or Reject. See [How to approve work](https://trycook.ai/docs/nothing-goes-out-without-you). **Owner, admin, role** — who is allowed to do what. On your own, you are the owner and you can do everything. In a team, roles decide who can approve what. **Integration** — a connection between Cook and another account you already use, such as Facebook, Google, Slack or your CRM. You connect it once and Cook works inside it. **Level** — how far your workspace has opened up. Cook shows Acquisition first, then Launch, then Scale. See [Why is everything locked?](https://trycook.ai/docs/levels). **Plan** — what you pay for. It sets the highest level you can reach. ### Your first day https://trycook.ai/docs/your-first-day What happens after you sign up, what Cook asks you, and the first thing to type. Nothing is sent and nothing is spent while you sign up. It is about fifteen minutes of answering questions, and you can leave and come back to it. #### 1. You answer questions about your business The first screen is an interview, in four short parts. It is a form, not a test, and you can leave and come back. - **Your business** — Where you are starting from, who you serve, what you are aiming at. Research uses these answers to work out who your best customer is. - **Assets and proof** — Your website if you have one, and any accounts you already use. Skip anything you do not have. - **Your taste** — What you would never put your name on, and whose marketing you like. This becomes the rule set for anything Cook writes. - **Kickoff call** — You can book a call with a person who walks through your setup with you. Answer in plain sentences. "I groom dogs at people's houses in Sacramento and I want more repeat customers" is a better answer than anything shorter. #### 2. Your workspace opens When the interview is done, Cook opens. What you see depends on where your business is. If you have not yet settled your **offer** — what you sell, said plainly: who it is for, what they get, what it costs — Cook opens on **Research** only, and the rest appears as you go. That is deliberate, and [Why is everything locked?](https://trycook.ai/docs/levels) explains it. There is a chat box. That is the main way you use Cook. #### 3. You type the first thing Ask for one real job, in your own words. Any of these work as they are written: > I do pressure washing in Tampa — driveways, roofs and pool decks. Who should I > be advertising to, and what should I charge? > Build me a page for a free roof inspection, for homeowners in Tulsa, and put > it on the internet. > Someone filled in my form an hour ago. Text them for me and try to book them > in. You do not need to say which department. You do not need to know the word for what you want. Describe the outcome, the way you would to a new employee. The box you type into. It is the first thing on the screen when Cook opens. #### What comes back Some jobs finish while you watch. Research that reads a whole market can take a few minutes, and it keeps going after you close the tab. Anything that would cost money or reach a customer comes back as a request for you to approve first — see [How to approve work](https://trycook.ai/docs/nothing-goes-out-without-you). #### If it did not understand you Say it again with more detail about your business, not with more technical words. Cook is better with "homeowners with older tile roofs who have already had a leak" than with a term you had to go and look up. #### What to read next [Prompting basics](https://trycook.ai/docs/how-to-ask) — how to phrase a job so you get back what you wanted. ### Prompting basics https://trycook.ai/docs/how-to-ask How to phrase a job in plain English, where the answer comes back, and what to do when it is wrong. You use Cook by asking for things in the chat box, in ordinary sentences. There are no commands to learn and no menus you have to find first. #### Ask for the result, not the steps Say what you want to end up with. Cook works out which department does it and what order the steps go in. Good: > Get me more driveway jobs in the Tampa area. I charge $250 and I can do three > a day. Also good: > My busy season ends in August and I go quiet. What should I be selling in > September? You do not need to say "build a funnel" or "run a campaign". If you do not know the word for what you want, describe the outcome and Cook will name it back to you. Type the job here, in your own words. No commands, no menu to find first. #### Give it the things only you know Cook can find out what your competitors charge. It cannot find out what you charge, how far you will drive, or which jobs you refuse. Say those out loud the first time they matter: - what you sell and what it costs; - the area you cover; - the jobs you do not want; - anything that must never be said in your name. It keeps what you tell it and uses it next time. You will not have to repeat it every day. #### One job at a time A single request with one clear outcome works better than a list of five. If you have five, send the first, look at what comes back, then send the next. #### Where answers come back - **In the chat**, for anything short. - **As a file in your Drive**, for long research, so the chat does not fill up with pages of text. - **As an approval request**, for anything that spends money or reaches a customer. - **In Slack or Discord**, if you connect one. Cook then works in the channels your team already uses — see [Slack](https://trycook.ai/docs/connect-slack) and [Discord](https://trycook.ai/docs/connect-discord). #### When it gets something wrong Correct it in the same conversation, the way you would correct a person: > Too formal. My customers are homeowners, not property managers. > The price is wrong — it's $250, not $180. > Never say "affordable". Say "no call-out fee". A correction sticks. It applies to the next piece of work too, not just the one in front of you. You will not have to say it twice. #### Asking it to keep doing something If a job needs to happen every time something occurs — every new enquiry, every Monday morning — say so, and Cook saves it as a **routine** that runs on its own. See the [Answering people without doing it yourself](https://trycook.ai/docs/routines). If you want the same set-up repeated for a second and third business, that is a **playbook**. See [Build a playbook for your systems](https://trycook.ai/docs/what-is-a-playbook). #### What to read next [How to approve work](https://trycook.ai/docs/nothing-goes-out-without-you) — the limits on what Cook can do while you are not watching. ### How to approve work https://trycook.ai/docs/nothing-goes-out-without-you What Cook has to ask you about first, what an approval looks like, and how to stop something fast. The first fair question about software that does marketing for you is: what can it do while I am not looking? Cook asks you first before anything **spends money** or **leaves the building**, unless an owner or admin has switched on YOLO mode (see below). Leaving the building means reaching someone who is not on your team: a customer, a lead, a public web page, an ad platform. Examples of things that wait for you: - sending an email or a text to a customer; - publishing a page at a public web address; - putting an ad live, or changing what you spend on ads; - posting somewhere public. Research, drafting, planning and reading your own numbers do not wait. None of it costs money and none of it reaches anybody, so Cook just gets on with it and tells you what it found. #### What an approval looks like You get a request that shows the exact thing being proposed — the wording of the message, the amount, the page. It has three buttons: - **Approve** — it runs exactly as shown. - **Request changes** — you say what is wrong and it comes back changed. - **Reject** — nothing happens. What you approve is what runs. The request is frozen at the moment it is created, so it cannot change between you reading it and pressing the button. When the proposal is a list, the request has tick boxes. Untick anything you do not want, approve, and only the rest runs. #### Where requests appear Open the **Needs you** card on Home, or the notification bell. Everything waiting for a decision is there. You can also press **⌘P** and type **Needs you**. If the request came out of a conversation, it also appears in that conversation, including in Slack or Discord if you use those. Deciding in either place closes the same request — you will not be asked twice. #### Who is allowed to press it In a workspace with one person, that is you. In a team, your workspace has a rule about who signs off what. A teammate's request goes to whoever is allowed to approve it, and an owner can do some things without a request at all. An owner or admin sets that in **Settings** → **Team** → **AI approvals**. #### YOLO mode The same page has a **YOLO mode** switch. With it on, everything the agents do runs straight away, with no approval request. A request that charges a fee still waits for its tick-box, and a request from a client still files a request. Requests already waiting stay waiting. The **AI sales rep** is set up to send on its own by default: once you switch it on, it texts and emails new enquiries without a request each time. You can ask Cook to set it so every message waits for you instead. #### Three things worth knowing - **A newer request replaces an older one for the same item.** You cannot approve a draft that has already been superseded. - **A request left open for 7 days expires.** Owners and admins can change this from 1 to 90 days under **Pending approvals expire after** in Settings → **Team** → **AI approvals**. Nothing runs. It is marked expired, not rejected. - **Rejecting closes it and nothing happens.** If you add a note saying why, Cook uses it on the next attempt. #### How to stop something quickly Anything Cook does repeatedly is a **routine**, and every routine has an off switch. Turning a routine off stops new runs from starting. It is not deleted, so you can fix it, test it, and turn it back on. Turning it off does not stop runs already in progress: the routine shows **Run still active** while they carry on. To stop one, open the routine, choose **Who's in it**, and press **Stop** on that person. A routine you build is off when it is created. It never runs until you switch it on yourself. #### What to read next [Why is everything locked?](https://trycook.ai/docs/levels) — why your Cook may show less than you were expecting. ### Why is everything locked? https://trycook.ai/docs/levels Cook opens one level at a time. What each level is for, and how you move up. If you signed up for Cook on the website, your workspace starts at the first level and does not show you everything at once. Most of it is locked in place — visible, with a note saying why — and opens as you go. Workspaces you were invited to, and workspaces an agency set up for you, start with everything open. This is on purpose. Someone who has not picked a market yet cannot tell which three screens matter this week, and an app that shows all of them at once is harder to use, not easier. #### The three levels ##### 1. Acquisition — get your first client with market data You do not have an offer yet. One thing matters: pick something you can win and learn how to write for it. You move on when you have: - picked your market; - finished one market teardown; - drafted your offer one-pager. ##### 2. Launch — get the offer live, and turn enquiries into customers You know what you sell and none of it is live yet. Get the page up, turn on ads, and put the **AI sales rep** — the part of Cook that texts and emails new enquiries back within minutes and books the call — onto your new enquiries. Then watch the numbers and change one thing at a time until it works. You move on when you have: - published your funnel (the web page with the form on it); - got your first ad set live; - put the AI sales rep on new enquiries; - connected the ad account and the calendar; - had ten calls reviewed. ##### 3. Scale — grow what works Now it is more of what already works: more content going out, less time between someone paying you and getting started, better delivery, and less of your day spent on any of it. The reports run themselves and your job is to read them and fix the slowest thing. #### How you move up Cook watches for the work being done. You do not tick milestones off by hand — it notices that the funnel is published or the offer one-pager exists, and ticks them within a day. When every milestone of a level is done, Home says **Your milestones are done. Open it when you're ready.** The workspace owner presses **Enter** and the next level's name (for example **Enter Launch**) to open it. Nothing opens on its own, and only the owner can press it. If you already have the work done somewhere else, the owner can press **Skip ahead anyway** to open the next level early. The milestones you skipped stay on the path. A locked thing is not a broken thing. A locked screen always says it is locked and says what opens it. A screen that does nothing and gives no reason is a fault worth reporting — that is not how levels are supposed to behave. #### Level is not the same as plan Two different things decide what you can do: - **Your plan** is what you bought. It sets the highest level you can reach. - **Your level** is where your business actually is. It moves up inside what your plan allows. Your plan is the ceiling; your level is your progress A person stands partway up three steps. A separate ceiling limits the height available. A higher ceiling does not move the person up the steps. Your plan Your level Your plan sets how far you can go. Completing the work moves you up; buying a higher plan does not do that work for you. So a level can stay locked either because the work of the level before it is not finished, or because your plan does not include it. The screen tells you which one it is: a level outside your plan says **Not on your plan**. #### What to read next [Common vocabulary](https://trycook.ai/docs/words) — every term used in these guides, one sentence each. ### What does Cook cost? https://trycook.ai/docs/cost Two plans. Acquisition is billed monthly; Agency is set up with you on a call. Phone numbers and texting are charged separately. Cook has two plans. The [pricing page](https://trycook.ai/pricing) lists everything each one includes. | Plan | How it's billed | What you get | | --- | --- | --- | | Acquisition | Monthly | The plan you start on: the Research department, one workspace, one client and one seat. | | Agency | Set up on a call | Every department, unlimited clients and seats for your whole team. | To talk through which plan fits, [book a call](https://trycook.ai/book). #### Acquisition Acquisition is the plan you start on, billed monthly. To cancel, open **Settings → Plan** and choose **Manage subscription**. A credit is a unit of AI work. If you use up the month's credits, you can buy more from the same **Plan** tab. #### Agency Agency is set up with you on a call, sized to your client list and your team. [Book a call](https://trycook.ai/book) to talk it through. #### Phone numbers and texting A phone number for texting or calls is charged on top of either plan: a one-time registration fee, a monthly price per number, and call minutes. [What phone numbers and texting cost](https://trycook.ai/docs/phone-number-pricing) lists each charge and when it is taken. ## Getting stuff done ### Building a lead generating asset https://trycook.ai/docs/funnels Cook writes and publishes a web page about what you sell, with a form on it, at a real web address. A **funnel** is a web page with one job: turn someone who lands on it into an enquiry you can follow up. It describes what you sell and it has a form. You do not need a website already. No domain, no designer, nothing to install. Cook writes the page, builds it, and puts it on the internet at a real address in a couple of minutes. #### Ask for one Open **Funnels** and type the page you want into the box at the top, in your own words, then press Enter: > Build me a one-page site for a free driveway cleaning quote, for homeowners > in Tampa, and put it live. That opens a chat with your request in it. You can also ask in any chat; it works the same way. The Funnels screen. Type the page you want into the box at the top. Cook writes the words from what it knows about your business, builds the page, and checks it. It sends you a private preview link while it works, so you can open the page before anyone else can. #### Going live When the page is ready, a card titled **Publish funnel to production** appears in the chat, with a link to review the page. Nothing is public until you press **Approve** on that card, or press **Deploy** on the page in **Funnels** yourself. Pressing **Deploy** publishes straight away; it counts as your approval. The card that puts the page live. Press Approve and the page goes up at its own web address. After you approve, the page goes up at its own web address, such as `your-business.f.trycook.app`, and Cook posts the address in the chat. #### Changing it later Say what to change in the same chat, or open the page from **Funnels** and press **AI Agent**. "Change the headline to Same-Day Gutter Cleaning" is enough. Each change comes back to you as a new publish card, and the page keeps the same address. Cook can also build a small web app this way, such as a booking tool or a price calculator, not only a page. #### Changing the address, or taking it down Ask Cook to change the page's address. A plain name moves it to `.f.trycook.app` within seconds; a domain you own, like `offer.yourbrand.com`, works once its DNS points where Cook tells you. The old address keeps working. Archiving a page in **Funnels** does not take it offline: a published page stays live. To take it offline, ask Cook to delete it. Cook asks you to approve that first. #### Or point it at a page you like If there is an existing page whose layout you want, give Cook the address and it builds yours in the same shape with your own offer and wording. Only use a page you own or are allowed to use as a reference. This is optional. Starting from nothing works. #### What you should check before it goes live Read the page out loud and check four things: 1. **The headline** — does it say what you actually do? 2. **The price and the promise** — are they yours, and are they right? 3. **The form** — does it ask for what you need, and nothing more? 4. **The links** — do they go where you expect, especially a booking link? Say what is wrong in the chat. "The price is $250, not $180" is enough. Cook changes it and shows you the publish card again. Nobody can see the page until you press Approve on the publish card, or Deploy on the page. If the publish card says **lead capture is not connected**, the page would go live without a working form. That happens when your workspace already has as many forms as it is allowed: 20, counted across all your clients. Delete a form you no longer use in **Forms** (in the **Growth** tab, under **Marketing**), then ask Cook to publish again. Deleting a form also deletes every enquiry it collected, so only delete one you no longer need. #### Where the enquiries go Every person who fills in the form is saved as a **lead** in your contact list, against the right client. See [Common vocabulary](https://trycook.ai/docs/words) if either of those terms is new. From there you can have Cook answer them automatically: a text within minutes, an email the next day, a reminder if they go quiet. That is a [routine](https://trycook.ai/docs/routines), and it never sends anything until you switch it on. Collecting leads and following them up are separate jobs An orange funnel drops enquiries into a reservoir of saved leads. A separate closed valve blocks the follow-up outlet, so leads can be collected without messages being sent. Page + form Saved leads Follow-up: off Your page can collect leads while follow-up is switched off. The routine is the separate part that sends the replies. #### Where to find it In the sidebar, open the **Growth** tab and choose **Funnels** under **Marketing**. Every page you have built is listed there, marked **Live**, **Draft**, **Edits not published**, **Deploying** or **Building**. Funnels is in the Growth tab of the sidebar, under Marketing. #### What to read next [Answering people without doing it yourself](https://trycook.ai/docs/routines) — how to have Cook answer those enquiries without you. ### Answering people without doing it yourself https://trycook.ai/docs/routines A routine is one job Cook does without you — on a schedule, or every time something happens. A **routine** is one job that Cook does on its own, over and over. Two kinds: - **On a schedule.** Every Monday at 8am, send me last week's numbers. - **When something happens.** Whenever someone fills in my form, text them within two minutes, then email them the next day if they have not replied. A routine keeps running when your laptop is shut and Cook is closed, unless you set it to run on your computer (**Where it runs** → **Desktop app**): then it only runs while the Cook desktop app is open there. In the routines list, a switch shows whether each one is on. A routine that is on but has not run yet shows Waiting; one in the middle of a run shows Running, and one whose last run went wrong shows Failed. #### Ask for one Describe the job in a chat, the way you would explain it to someone you just hired: > When someone fills in my quote form, text them straight away saying I'll call > within the hour, and let me know on my phone. Say three things and you have said enough: 1. **When it should start** — a time, or a thing that happens. 2. **What should happen, and in what order** — including how long to wait between steps. 3. **Where it should tell you** — which conversation or channel gets the alert. Cook turns that into a list of steps you can read and change. Every routine starts switched off. A routine you have just made does nothing at all. It cannot text anybody. It waits until you turn it on yourself. The routines list. Replays holds screen recordings of routines that open a browser, kept for seven days. #### Test it before you turn it on Open the routine and press **Test**. Cook runs the whole thing with a made-up person so you can read exactly what would be sent. Nothing reaches a real customer. While you read it, check: - **The words.** Do they sound like you? Read them out loud. - **The waits.** Is one day right, or is one hour right? - **The links.** Open every one. - **The order.** Do the steps happen in the sequence you meant? Build the page first. A routine that waits for new enquiries can only work if enquiries are arriving from somewhere. Build the [page that collects them](https://trycook.ai/docs/funnels) first, or point the routine at a form you already have. Otherwise the routine is switched on, correct, and doing nothing — and it looks broken when it is not. Switched on is different from receiving enquiries Two open pipes have their valves in the same open position. The upper pipe is empty. Enquiries flow through the lower pipe. Both routines are switched on, but only the one receiving new enquiries has work to do. No new enquiries Enquiries arriving Both switched on For a routine started by an enquiry, switching it on opens the valve. A new enquiry still has to arrive. A scheduled routine starts when its scheduled time arrives instead. #### Then turn it on Switch it on and it starts working the next time its starting event happens. It does not go back and handle things that happened before you turned it on. One more thing: editing a message does not change a sequence that is already part-way through for someone. New runs use the new wording. #### Check the first few real runs The **run history** shows every occasion the routine ran: what it did, when, and what came back. Read the first few real ones. Expect to change some wording once you see how people actually reply. #### To stop it Turn it off. No new runs start, and it is not deleted. Runs already in progress are not stopped: the routine shows **Run still active** while they carry on. To stop one, open the routine, choose **Who's in it**, and press **Stop** on that person. Then fix it, test it, turn it back on. #### Where to find it Open your profile menu at the top of the sidebar and choose **Routines**. You can also open the **Growth** tab and choose **Routines** under **Marketing**. The list shows when each routine last ran. Your plan can limit how many routines are switched on at once. At the limit, Cook says **This workspace is at its routine limit** — pause or delete one first. #### One job, or a whole setup? A routine is one job. If you find yourself building the same group of routines again for another business, that group can be saved and reused — that is a [playbook](https://trycook.ai/docs/what-is-a-playbook). Most people with one business never need one. #### What to read next [How to approve work](https://trycook.ai/docs/nothing-goes-out-without-you) — the rules about what Cook may send while you are not watching. ### Keeping the files for one job together https://trycook.ai/docs/projects A project is a folder for one piece of work. Put the files in once and every chat you start there can use them without another upload. A **project** is a folder for one piece of work: a launch, a client, a rebuild. You put the files in once, and every chat you start inside it can use them. No attaching, no reminding it which document you meant. Projects is in the sidebar, under Home, Tasks and Feed. #### Start one Press **New project** and give it a name and a line saying what it is for. That is the whole setup. You can add instructions later — a note in your own words about how to work in this project, which every chat here follows: > Answer as the launch lead. Use the pricing in the files, never older numbers. #### Put the work in Three doors, all in the **Context** panel on the right of the project: 1. **Upload files.** Drag them in or use **Add → Upload files**. PDFs and Word documents have their text pulled out as they upload, so what is in them is readable, not just the file name. 2. **Paste text.** For something you have in your clipboard and not in a file — a pricing note, a policy, the wording you keep reusing. 3. **Add a video link.** Paste a YouTube, Loom or Tella link. Cook fetches the transcript, saves the video itself when the platform allows it, and writes a description of what is on screen. About a minute. #### What "in context" means Each file in the panel says how it is used: - In context — its words are read in full at the start of every chat in this project. - Read on demand — it stays in the project and is opened when a question needs it. Pictures and videos sit here; so does text once the project holds a lot of it. The bar at the top of the panel shows how many characters of text are riding along, like **170K / 200K**. Text files are taken in order of their file names; any file that would push the total past the limit is read on demand rather than being dropped — nothing is lost, it is just opened when needed instead of every time. For a video, the transcript and the written description are the part that rides along; the clip itself is opened only if you ask something the words do not answer. #### Then just ask Type the question in the project's own box, in the words you would use with a person. No file names, no commands: > what did the april webinar offer cost? i need the normal price, the cohort > price and whether there was a deposit The answer comes back with the numbers and the file each one came from, because the project already has the files and can open what it needs. You do not have to attach them again. #### What else lives in a project - **Its chats.** Every conversation you start on the project page is listed there, so the thread from three weeks ago is where you left it. - **Its memory.** Anything worth keeping that comes up in those chats is written down and shared with your workspace. It fills in as you work. - **Its routines.** A [routine](https://trycook.ai/docs/routines) you build from a project chat is filed under the project, and its runs read the same files. #### Housekeeping - **Rename** a project whenever you like; its files stay put. - **Archive** it when the work is done. It leaves the Active list and nothing is deleted — restore it and it comes back exactly as it was. - **Remove a file** from the panel and it leaves the project's reading, but the drive keeps every version. ### Content Research https://trycook.ai/docs/content-research Ask for short-form video references and get a Word document back, with a contact sheet, the real numbers and a beat-by-beat breakdown for every reel worth copying. Ask Cook which Instagram reels are working in your niche and it comes back with a **Word document you can shoot from**: one page per reel, with twelve frames from the video itself, the real play counts, the opening line word for word, and the beats in order. It finds reels on Instagram only. Downloading and reading the videos uses your workspace's credits. It does not describe reels from memory. It finds them, downloads them, and watches them. #### How to ask In any chat, in your own words. Say who the content is for, not what file you want: > use the explore page in instagram and find me reels that would work for my use > case. download and transcribe all of them so you actually know what you're > looking at. we want content that targets people trying AI tools and business > owners who want to scale with AI. i need contact sheets and transcripts for > each reference. You do not have to say "Word document", "contact sheet" or name a format. Saying who you are trying to reach is the part that matters. #### What comes back A document with a cover listing every reference grouped into the repeatable **formats** they belong to — "numbered click-through tutorial", "silent screenshot checklist" — and then one page per reel: - **A contact sheet.** Twelve frames sampled evenly across the video, so you can see the whole thing without watching it. - **The numbers.** Play count, likes, comments and duration as they stood on the day it was pulled. - **A fit score out of ten** — how directly you could shoot the same format with your own product on screen. Most reels score under six, and those get dropped. - **The opening line**, word for word: what was said, or the first card on screen if nobody speaks. - **The beats**, in order, so you can see the shape rather than read a wall of transcript. - **Your version** — the same structure rewritten for your business. - **The caption** the creator actually wrote. #### Where it lands On your drive, under **research / reels**, alongside the raw research it was built from. Open it in Word, Google Docs or Pages, and hand it to whoever is shooting. #### Building a list of creators to watch Cook scores every recent reel against **that creator's own median**, so a 100,000-view reel from an account that normally gets 10,000 counts as a hit and the same number from an account that normally gets a million does not. That comparison needs a list of accounts. Name a few handles in your message and it uses those. To stop repeating yourself, keep a file called `CREATORS.md` in **research / reels** on your drive with one handle per line. Cook always adds that list to any handles you name, and sweeps all of them. #### How long it takes Longer than an ordinary answer. It is downloading and transcribing real videos, so a full pack runs for 20 to 45 minutes and Cook may tell you it is still working. If it says it is part-way through, ask it to carry on and it picks up where it stopped rather than starting again. #### Good to know - **It reads silent reels too.** Plenty of short-form video has no speech at all. Those get read frame by frame instead, and the document carries the on-screen text in order rather than a transcript. - **The links expire.** The video files it pulls are only reachable for about an hour, which is why it downloads everything before it starts writing. - **Ask for more.** If the pack feels thin, say so — "push it to around thirty reels and make every breakdown properly detailed" — and it extends the same document rather than making a new one. ### What phone numbers and texting cost https://trycook.ai/docs/phone-number-pricing The one-time registration fee, the monthly price of a number, call minutes, and when each one is charged. A phone number lets Cook text your leads and answer your calls. Before a business can send texts to phones in the United States, it has to register with the phone carriers. That registration is called A2P 10DLC, and Cook files it for you. #### The prices | Charge | Price | When it is charged | Paid from | | --- | --- | --- | --- | | Registration fee (texting numbers) | $20, once per registration | When you approve the registration, before it is filed with the carriers | The card on file | | Texting number | At least $25 a month | When the number goes live, then on the same day every month | Workspace credits | | Number that only answers calls | At least $25 a month | When the number is set up, then on the same day every month | Workspace credits | | WhatsApp number | At least $5 a month | When the number is bought, then on the same day every month | Workspace credits | | Call minutes | What the carrier charges for the call time, plus 10% | Every hour, for the calls answered since the last charge | Workspace credits | Until charging the registration fee to your card is switched on for your workspace, the $20 is taken from workspace credits when the number goes live instead. The box you tick on the approval card always says which applies. #### How the monthly price is worked out The monthly price covers what the carrier charges for the number itself and, for a texting number, the carriers' monthly fee for the texting registration. | Number | Monthly price | United States today | | --- | --- | --- | | Texting number | The larger of $25, or 110% of what the carrier charges each month (the number plus its $20 monthly texting fee) | $25.30 | | Number that only answers calls | The larger of $25, or 110% of the carrier's monthly price for the number | $25.00 | | WhatsApp number | The larger of $5, or 120% of the carrier's monthly price for the number | $5.00 | Numbers in other countries can cost more, because the carrier charges more for them. When you buy a WhatsApp number, the country list shows the monthly price for each country before you pick one. If your workspace has agreed its own monthly price with us, you pay that price for texting and call-answering numbers instead. Credits: 100 credits are $1. #### Before anything is charged Cook never registers a number on its own. The agent prepares the registration and shows you an approval card with the business details it will file. Approve stays greyed out until you tick the box that confirms these fees, and nothing is filed or charged until you approve. The setup wizard under **Texting** asks for the same box before **Submit for review**. #### Questions **Is the registration fee charged again if the carriers reject my registration?** No. You fix what the carriers asked for and resubmit, and the $20 is not charged again for that registration. **What if my card is declined?** Nothing is filed with the carriers. The registration goes back to where it was with the reason, so you can update the card in **Settings → Plan** and submit again. **Are numbers I bring myself charged?** No. Texting through your own SimpleTexting account, or through a client's own GoHighLevel number, is not charged by Cook. ### Putting a Zoom link on every booking https://trycook.ai/docs/connect-zoom Connect your Zoom account to a Cook booking page so every booking gets its own Zoom meeting, and remove it again. A Cook booking page can give every booking its own Zoom meeting. When someone books, Cook creates the meeting on your Zoom account and puts its join link in the calendar invitation, on the confirmation screen and in the reminder emails. If the booking moves, the meeting moves with it. If the booking is cancelled, the meeting is deleted. #### Before you start - The booking page needs a connected booking calendar (Google or Microsoft). The page's editor shows **Connect a booking calendar** until it has one. - You need a Zoom account. The meetings are created on it, so you are their host. - You need permission to manage integrations in the Cook workspace. - On a live booking page, the page also needs a selected calendar and a host, and **Seats per time** must be 1. A group call cannot use Zoom. #### Adding Zoom 1. In Cook, open **Growth**, then **Scheduling**, and open the booking page. 2. Under **Location**, choose **Zoom**. 3. Press **Connect Zoom**. Zoom asks you to sign in, then shows **Cook would like permission to**. Press **Allow**. 4. You come back to the same page, and it reads **Zoom connected as** followed by your Zoom email address. 5. Press **Save**. Every booking made from then on gets a Zoom meeting. #### What Cook can do in your Zoom account Zoom lists these permissions on its screen when you press **Connect Zoom**: - **Create a meeting for a user**: a meeting for each new booking. - **Update a meeting**: move the meeting when a booking moves. - **Delete a meeting**: remove the meeting when a booking is cancelled. - **View a user**: read your Zoom name and email address, so the booking page can show which Zoom account is connected. Cook does not read your recordings, chats, contacts or other meetings through this connection. It keeps your Zoom email address and a connection reference. The Zoom sign-in itself is held by Nylas, the calendar service Cook's booking pages use. #### Using it Nothing changes for the person booking. They pick a time as before, and the confirmation screen shows a **Join link**. The same link is in the calendar invitation and in the reminders. A booking moved through the guest's own **Manage your booking** link moves the Zoom meeting too. #### If Zoom stops working If Zoom rejects Cook's access (for example after you change your Zoom password or remove the app in Zoom), the booking page's editor shows **Zoom stopped working**. Press **Reconnect Zoom** and allow Cook again, or choose another location. #### Removing Zoom **From Cook:** open a booking page whose **Location** is Zoom and press **Disconnect Zoom** next to **Reconnect Zoom**. The button only shows while the location is Zoom. If any live booking page still uses Zoom, Cook names those pages first: change their location and save them. If no page uses Zoom any more, choose **Zoom** under **Location** on one page without saving, press **Disconnect Zoom**, then set the location back. **From Zoom:** sign in to Zoom and open [your installed apps](https://marketplace.zoom.us/user/installed), find **Cook** and press **Remove**. Zoom notifies Cook, and Cook deletes the connection it kept for that Zoom account. Move every live booking page off Zoom before you remove it from Zoom's side. A live page still set to Zoom refuses new bookings once the connection is gone. Meetings already created for bookings stay in your Zoom account until you delete them there. #### Getting help Write to austin@clientacquisition.io with your workspace name and the booking page. The [support page](https://trycook.ai/docs/support) lists what else helps us answer quickly. ### Connecting your TikTok Shop through Cruva https://trycook.ai/docs/connect-cruva Connect your Cruva account so Cook can read your TikTok Shop's affiliates, videos, samples and messages, and propose sample decisions and creator messages for you to approve. Cruva runs the affiliate side of a TikTok Shop: the creators who promote your products, the free samples they ask for, the messages you send them and the outreach and automations that find them. When you connect your Cruva account, Cook can read all of it in chat, through the Cook API and through the Cook MCP server. Anything that would change something in Cruva, or reach a creator, waits on an approval card until a person in your workspace approves it. #### Before you start - You need a Cruva account with the **Standard API** plan or higher. Cruva's REST API is not part of its plans below Standard, and Cruva refuses the key without it. - You need permission to manage integrations in the Cook workspace. #### Getting your API key and shop id 1. In Cruva, open [API settings](https://cruva.com/dashboard/api) and create an API key. It starts with `cruva_`. Copy it; Cruva shows it once. 2. Open [My Shops](https://cruva.com/dashboard/my-shops), find the shop you want Cook to read and press **View Info**. Copy its shop id. The key decides what Cook can reach. If you limit the key to some routes or some shops in Cruva, Cook can read only those. #### Connecting Cruva 1. In Cook, open **Integrations** and find **Cruva**. 2. Paste the API key and the shop id, and press **Connect**. 3. Cook checks the key with Cruva before it saves it. If Cruva refuses it, Cook shows Cruva's reason, for example a key without API access on its plan. Cook keeps the key with your workspace's connection. It is never shown again, never put in chat and never returned by the Cook API. #### What Cook can read Ask in chat, for example "who were my top creators this month" or "which sample requests are waiting". Cook reads, from your Cruva shop: - **Shops**: the shops your key reaches, and which one Cook uses. - **Stats**: GMV, orders, affiliate GMV, videos and samples for a date range. Without dates, Cook reads this month to today. - **Affiliates**: your creators, with what each one sold in a date range, or their lifetime numbers from Cruva's affiliate CRM. - **Videos**: affiliate videos about your products, with views and GMV. - **Samples**: creators' sample requests, with their status (for example **To Review** or **Ready to Ship**). - **Inbox and messages**: your creator conversations and the messages in one. - **Outreach logs**: what Cruva's outreach sent to creators. - **Automations**: your Cruva automations and whether each is on. - **Ads campaigns**: your TikTok ad campaigns with spend and results. #### What waits for an approval card These four actions never happen straight away. Cook files an approval card that shows exactly what will change, and nothing reaches Cruva until a person approves it: - **Approve sample requests**: one or more requests, or every request from one creator that is waiting in **To Review**. - **Reject sample requests**: the same way. - **Send a message to a creator**: the card shows the message word for word. - **Turn an automation on or off.** Cook carries out an approved card once. If Cruva refuses it, the card says why. #### The Cook API and the Cook MCP server The same reads and proposals are on the [Cook API](https://trycook.ai/docs/api-reference) and in the Cook MCP server, so your own agent can use them with your Cook API key. | What | API operation | MCP tool | | --- | --- | --- | | Shops | `cruva.shops` | `cruva_shops` | | Stats | `cruva.stats` | `cruva_stats` | | Affiliates | `cruva.affiliates` | `cruva_affiliates` | | Videos | `cruva.videos` | `cruva_videos` | | Sample requests | `cruva.samples` | `cruva_samples` | | Inbox | `cruva.inbox` | `cruva_inbox` | | Messages in a conversation | `cruva.messages` | `cruva_messages` | | Outreach logs | `cruva.outreachLogs` | `cruva_outreach_logs` | | Automations | `cruva.automations` | `cruva_automations` | | Ads campaigns | `cruva.adsCampaigns` | `cruva_ads_campaigns` | | Approve sample requests (approval card) | `cruva.approveSamples` | `cruva_approve_samples` | | Reject sample requests (approval card) | `cruva.rejectSamples` | `cruva_reject_samples` | | Message a creator (approval card) | `cruva.sendDm` | `cruva_send_dm` | | Turn an automation on or off (approval card) | `cruva.toggleAutomation` | `cruva_toggle_automation` | The four approval-card operations return the card's id. A key limited to `cruva:read` can call the reads; the proposals need `cruva:write`. #### Rate limits Cruva allows 10 requests a second for each key and shop. If Cruva answers that the key is over that limit, Cook says so; ask again a moment later. The Cook API has its own limits for each Cook key, listed on the [API reference](https://trycook.ai/docs/api-reference). #### Removing Cruva Open **Integrations** in Cook, open **Cruva** and disconnect it. Cook deletes the key it kept. To stop the key everywhere, also delete it in Cruva's [API settings](https://cruva.com/dashboard/api). #### Getting help Write to austin@clientacquisition.io with your workspace name. The [support page](https://trycook.ai/docs/support) lists what else helps us answer quickly. ### If you use Claude Code https://trycook.ai/docs/claude-code Connect Claude Code to your Cook workspace, ask it about your leads, ads, site and quizzes in plain words, and approve what goes out without leaving the terminal. Claude Code can work in your Cook workspace the way Cook's own AI does: read your leads and ad results, change your site and quizzes, text and email your leads, pause ads and hire help. Anything that reaches a customer or spends money still waits for you to approve it, and Claude Code asks you right there in the terminal. #### Before you start You need Claude Code on your computer, and you need to be an owner or admin of a Cook workspace on a paid plan. If you have none, Cook's connect page shows **Start a workspace**, **Start the plan** or **Name your business** instead of the Connect button, or says **A paid workspace with owner or admin access is needed**. #### Connecting it 1. In your terminal, run: ```sh claude mcp add --transport http cook https://mcp.trycook.ai/mcp ``` 2. Start Claude Code, type `/mcp`, choose **cook** and sign in. Your browser opens Cook's connect page. If you have more than one workspace, choose the **Starting workspace**. Press **Connect Claude Code**. Cook's page for connecting Claude Code. It names the workspace, and no API key is shown or copied. 3. Go back to Claude Code and ask it something about your business. One connection covers every paid workspace where you are an owner or admin, including ones you join later. Claude Code starts in the workspace you chose and asks you before it switches to another one. It works as you. Cook checks your access again on every request, so if you are removed from a workspace, Claude Code stops working in it at once. The address and the command are also in Cook under **Settings → Developer → Connect AI apps**. #### What to ask Plain words work. You do not need to know how Cook names anything. These were asked, in this order, of a test workspace: - "did we get any leads from the ads today?" - "how are the ads doing?" - "make the home page a 4-question quiz that ends on my booking calendar" - "add a company name box to the quiz" - "ok put it live" - "pause the ads" - "where are people dropping off in the quiz?" Other things it can do: text or email a lead, reply to a lead's message, change an ad budget, build or change a booking page, change a routine and test it, and show you your site running on your own computer before it goes live. If hiring is switched on in your workspace, it can also hire an AI teammate. #### What Claude Code asks you first Anything that reaches a customer, spends money or changes something live is filed as a card, the same card Cook's own AI would file. Claude Code shows you the card as a question, and nothing happens until you answer: Cook's question in Claude Code. Pick Approve or Reject, then press Accept to send your answer. These ask you in Claude Code: - pausing or resuming ads, changing a budget, a new campaign or ad; - putting your site's changes live; - changing a booking page; - turning a routine on, or switching it to a new version; - an email from your linked Gmail or Outlook that Cook holds for approval; - cards that carry a fee (a texting registration fee, buying a domain). Claude Code shows a box where you agree to the fee. Texts and emails to a lead do not ask you on their own. The card waits in Cook for a person to approve it there. If you are at the terminal, ask Claude Code to put it to you, and it asks you right there. Cards your role in the workspace may not decide are decided in Cook instead, and Claude Code gives you the link to open them. ##### Stop the questions (YOLO mode) To let Cook answer for you in Claude Code, connect it with one more header: ```sh claude mcp add --transport http cook https://mcp.trycook.ai/mcp --header "X-Cook-Yolo: on" ``` Then Claude Code switches between your workspaces without asking, and the cards it files are approved at once. In Cook those cards show as approved by you. Claude Code still asks about cards that charge a fee, launching or resuming Whop ads, changes to your team or to the approval rules, and any card you ask it to put to you. #### What gets a payment link Hiring an AI teammate, where hiring is switched on. Claude Code gives you Cook's checkout link, and nothing is hired or charged until you pay on that page. #### Your site Claude Code changes your site's pages itself. It downloads a copy, edits it, and saves it back to Cook as the site's working version; your live site does not change until you approve the card that puts it live. Before that, it can run the site on your own computer and give you an address to look at it. Claude Code can also make a new site from pages it writes. Cook puts the site on its build machine and gives you an address to look at it. When you ask to put a new site live, Claude Code asks you to approve its publish card, and the card names that address so you can look at the page first. Nothing is public until you approve. #### If something does not work - **Claude Code does not list cook.** Run the `claude mcp add` command again, then restart Claude Code. - **The Cook page says you cannot connect.** Only an owner or admin of the workspace can connect Claude Code. Ask one to change your role, or to connect it themselves. - **Claude Code gave you a link instead of asking you.** That card is decided in Cook: open the link and approve it there. - **It is working in the wrong workspace.** Ask Claude Code which workspace it is in, and to switch to the one you want. It can switch to any paid workspace where you are an owner or admin, without signing in again. ### Connecting Trybe (UGC creators) https://trycook.ai/docs/connect-trybe Connect your Trybe brand so Cook can read your creators, their orders, GMV and ad results, and their submissions, and approve, reject or send back a submission once you approve the card. [Trybe](https://jointrybe.com) runs performance-based UGC for brands: creators join your creator program and submit content, you approve it and run it in your ads, and creators are paid on performance. Connect your Trybe brand to Cook and you can ask about your creators in chat, from the Cook API or from an app connected through the Cook MCP server. #### Before you start - You need your Trybe brand's API key. It starts with `tk_live_`. - Trybe turns on Brand API access for each brand. If your brand has no key, or Cook says "Brand API access isn't on for this brand", ask Trybe to enable it. - You need permission to manage integrations in the Cook workspace. #### Connect Trybe 1. Open **Integrations** and find **Trybe**. 2. Click **Connect**, paste the API key and click **Connect** again. Cook checks the key with Trybe before it saves anything. The key is stored encrypted on your workspace's connection and is used only for your workspace. If Trybe refuses the key, the card says why: | What the card says | What to do | |---|---| | Trybe didn't accept that key | Copy the key from Trybe again; it may have been revoked. | | Brand API access isn't on for this brand; ask Trybe to enable it. | Ask Trybe to turn on Brand API access for your brand, then connect again. | #### What you can ask - "Who were my top 5 creators by orders last 7 days?" - "Which creators drove the most GMV this month?" - "How much did we spend on ads running Maya's content in September, and what was the ROAS?" - "Which creators are overdue on their sample?" - "Show me the submissions waiting for review." - "Find submissions where the creator mentions the discount code." **Orders** are the conversions Trybe attributed to a creator. **Purchases** are what the ad platforms (Meta, TikTok, AppLovin) reported on the ads that ran the creator's content. Cook uses orders unless you ask for ad purchases. Dates are whole UTC days, and "last 7 days" ends yesterday, since Trybe reports complete days only. A ranking covers at most 90 days. #### Reviewing a submission Ask Cook to approve, reject or ask for a revision of a pending submission, for example "approve submission submission_8f3e…" or "ask Maya to reshoot the intro in better light". Cook files an approval card naming the creator, the submission and the comment the creator will read. **Nothing changes in Trybe until you approve the card.** When you do, Cook sends the review to Trybe and writes the result on the card. A revision request needs a comment telling the creator what to change. Only a pending submission can be reviewed. #### From the Cook API and MCP The same reads and the review card are API operations: `trybe.creators`, `trybe.creator`, `trybe.performance`, `trybe.submissions`, `trybe.submission` and `trybe.reviewSubmission`, and the MCP tools `trybe_creators`, `trybe_creator`, `trybe_performance`, `trybe_submissions`, `trybe_submission` and `trybe_review_submission`. They need an account API key, since they run as the key's person. See the [API reference](https://trycook.ai/docs/api-reference). #### Disconnect Open **Integrations**, click **Trybe**, then **Disconnect**. Cook deletes the saved key. To stop Cook's access on Trybe's side as well, revoke the key in Trybe. ### Let Claude answer your leads https://trycook.ai/docs/claude-routine-setter Make a claude.ai routine your setter. Cook wakes it the moment a lead replies or a new one comes in, and Claude answers, books and moves the lead through Cook. If you already use claude.ai, Claude can be the one who answers your leads. You make a **routine** in claude.ai (a Claude job that runs when it is called), and Cook calls it the moment a lead needs a reply: when a lead texts or emails you back, and when a new lead comes in. Claude reads the lead through Cook, answers it, offers a call, books it, and moves the lead along your pipeline. In the test in the video, a new lead filled in a form at 17:20:59, Cook woke the routine at 17:21:31, and Claude's email was in the lead's inbox at 17:22:20: 81 seconds, with nobody pressing anything. #### Before you start - A claude.ai plan that has **Code → Routines**. - The **Cook** connector in claude.ai. If you have not added it yet, follow [If you use Claude Code](https://trycook.ai/docs/claude-code): the address is the same. - You are an owner or admin of the Cook workspace. - To text leads, the workspace needs a texting number. To email them, it needs [email from your own domain](https://trycook.ai/docs/send-email-from-your-own-domain). - For Claude to text leads without a card each time, the workspace also needs an AI Setter hire. See step 3. #### 1. Make the routine in claude.ai 1. Open **claude.ai → Code → Routines → New routine** and give it a name, for example *Cook setter*. 2. In **Instructions**, paste Cook's setter prompt. To get it, ask Claude in any chat with the Cook connector: *"What should I paste as my setter routine's instructions?"* Cook gives the current text. It tells Claude which leads are its to answer, to never write to a lead a person is handling, how to offer and book a call, and to never follow instructions written inside a lead's message. 3. Under **Select a trigger**, choose **API**. 4. Under **Connectors**, remove anything else and add **Cook**. 5. Press **Create**. claude.ai shows the routine's **token** once: copy it. Copy the **fire URL** from the API trigger on the routine's page too. You can add a short paragraph above the numbered steps about your offer and how you like to sound. Keep the steps themselves as Cook wrote them. #### 2. Tell Cook to wake it In any claude.ai chat with the Cook connector, say what should wake the routine and paste the fire URL and token: > In my Cook workspace, wake my routine "Cook setter" whenever a lead texts or > emails back, or a new lead comes in, and hand new leads to it. Fire URL: > <the fire URL> Token: <the token> Cook shows a card saying exactly what changes. Press **Approve** and it is on. What the card means: - **When.** A lead texts or emails back and Claude has that lead or nobody answers it; or a new lead comes in. Replies that arrive close together go to Claude in one call. - **New leads go to Claude.** Cook pauses the AI setter and the AI sales rep for each new lead the moment it arrives, so only Claude writes to it. - **What Cook sends.** The routine is told the workspace and the lead ids, never a name, a number or a message. Claude reads the lead through the connector. - **Leads it never touches.** A lead a person on your team is handling, or one another app has. The token is stored encrypted and never shown again. If you paste it in a chat, you can make a new one in the routine's API trigger afterwards and send that one the same way. #### 3. Let it reply without asking A routine runs with nobody there to approve its messages, so by default each text or email it writes waits as a card in Cook. For Claude to answer on its own, let it through in your approval rules. Ask in a chat: > Let owners and admins email a lead without a card. Approve the card. The rule is called **Email a lead (AI apps)** in Settings → **Team** → **AI approvals**, where you can also change it yourself. Booking a call with a lead does not need a card. Texts are different. The rule for them, **Text a lead (AI setter)**, only exists in a workspace that has hired an AI Setter, and hiring is not switched on for most workspaces. Without it, every text Claude writes waits as a card in Cook until a person approves it. #### What it looks like When a lead comes in, the routine's run appears under the routine in claude.ai, and Claude says what it did: which lead it took, what it sent, and the stage it moved the lead to. The lead gets the message from your workspace, the same as if you had sent it from Cook. In a text, Claude puts your booking link in. In an email it offers open times instead, and books the one the lead picks. #### Turn it off Ask in a chat: *"Turn off the setter routine."* Cook stops waking it at once, with no card. If you have an AI setter or an AI sales rep, new leads go to it again; if you have neither, nobody answers new leads until you do. Leads Claude already took stay Claude's until it hands them back: ask Claude to give them to the AI setter, or switch the AI back on for a lead in Cook. #### If something does not work - **Nothing happens when a lead replies.** Ask *"show me the setter routine's status"*: it lists the last 10 times Cook called the routine and what came back. A `401` means the token is old: make a new one in the routine and send it the same way as in step 2. - **Claude's messages wait as cards.** The approval rule in step 3 is not on, the message is a text and your workspace has no AI Setter hire, or the person whose connector the routine uses is not an owner or admin. - **Claude did not answer a lead.** It leaves alone a lead a person is handling, and a lead the AI setter has. Ask Claude who is handling that lead. - **The approval card did not appear in the chat.** Ask Claude to show it again, or open the card's link and approve it in Cook. ## Slack, Discord, Telegram and Lark ### If your team already uses Slack https://trycook.ai/docs/connect-slack Put Cook in the Slack channels your team already uses, and see what it can do there. #### Before you start You need permission to install an app in your Slack workspace. If you do not have it, the person who administers Slack can complete the install and you can use Cook straight afterwards. #### Putting it in your Slack 1. Open **Settings** → **Apps** → **Chat apps**. The same window can also open from a small **Add Slack** bar at the bottom of the sidebar, but that bar is not always shown: it takes turns with other prompts and disappears once you have connected a chat app or dismissed it. The bar at the foot of the sidebar, when it is showing. 2. The list shows Slack, Discord, Telegram and iMessage. Press **Set up** on the Slack row. The Connect Cook window. Each chat app has its own Set up button. 3. Press **Add to Slack**. That opens Slack's own permission screen; approve it there and Cook brings you back on its own. Add Cook to Slack. Pressing this hands you to Slack to approve — Cook continues by itself once you have. 4. Tick the channels Cook should join. It joins them and introduces itself in each one. That is the whole install. You do not have to add Cook to channels by hand afterwards, though you can invite it to more at any time. #### The first time you open it Open Cook's **Messages** tab in Slack and the top shows "Hi, I'm Cook. Start with one of these:" over up to four suggested prompts. The first is always "What can you do here?"; the rest come from your workspace's own starter prompts. Tap one and it is sent as your message. The first time a teammate opens that tab with nothing in it, Cook sends them a short welcome once: what to send it, how `@Cook` works in channels, the chat commands below, and that it can remind them later. The person who installed Cook gets the install welcome instead. #### Asking it for something Send Cook a direct message, or write `@Cook` in any channel it has joined. Use plain English. There are no slash commands; the only commands are the four short ones under [Chat commands](#chat-commands). Cook in Slack once it is installed: it has its own conversation, it answers questions there, and @Cook works in any channel it has joined. #### While Cook works A chef mark appears on your message the moment Cook starts, so you know it received you before any words come back. Where Cook is installed as a Slack agent app, Slack then shows its own "working" line under the thread, with Slack's stop button. Each step Cook takes (searching, reading, writing) appears as a card in the thread while it runs and is ticked off when done. The stop button stops Cook, the same as sending `!stop`. Where that is not available, Cook posts one progress message in your direct message instead and keeps it updated with the time and the steps so far. In a channel thread it shows the working line or nothing, so the channel is not filled with progress posts. The answer itself is posted as its own message in the thread under your message. If you asked in a channel and the answer took more than a minute, it starts with an @mention of you, so you are notified. #### Chat commands Put one of these anywhere in a message, as a word of its own: | Command | What it does | |---|---| | `!stop` | Stops what Cook is doing in that conversation. Your message gets 🛑 and Cook says "Stopped." Anything it had half-written is not sent. With nothing running, the 🛑 is the only reply. | | `!fast` | Answers this one message on your workspace's fast model. Your message wears ⚡ until the reply lands. | | `!deep` | Answers this one message on your workspace's stronger model. Your message wears 🧠 until the reply lands. | | `!mute` | In a channel thread, Cook stops replying there (see below). Your message gets 🔇. | `!fast` and `!deep` apply to that one reply only; the next message runs on the normal model again. The reply ends with a small line naming the model it ran on, for example "⚡ Fast reply · Claude Haiku 5.5". If the command would not change the model, there is no line. Using `!fast` and `!deep` together cancels both. The commands are taken out before Cook reads your words, so "!fast what is on today?" is answered as "what is on today?". A command inside a code span, a code block or a `>` quote is left alone: that is someone else's text, not a command. #### Where Cook replies, and where it stays quiet | You do this | Cook does this | |---|---| | Send it a direct message | Replies every time. | | Write `@Cook` in a channel it has joined | Replies in a thread under your message. | | Post in a channel without mentioning it | Does not reply. Messages from people who can use Cook are kept as context for the next time it is mentioned there. | | Write in a group DM that includes it | Replies only when you `@Cook`. | | `@Cook` in a thread it is already in | Replies right away. | | Reply without a mention in a thread Cook started | Reads it at once and answers only if you are talking to it, asking it something, or giving feedback on its work. | | Reply without a mention in a thread that began with `@Cook` | Waits for 30 seconds of quiet, reads the new replies together, then decides the same way. | | Reply in a thread Cook was never part of | Does not reply. | Messages from other bots are ignored unless a bot writes `@Cook` in a channel. **Quiet, please.** Send `!mute` in a thread, or react with 🏁 to one of Cook's messages there, and Cook stops replying in that thread (it says so once). It keeps reading for context; `@Cook` in the thread brings it back. **Edits.** If you edit or delete a message in a thread Cook is following, it does not reply to the change, but it sees it next time. **Channel rules.** Tell Cook in a channel how to behave there — for example "@Cook in this channel, always answer in German" — and it keeps that as a standing instruction for the channel (up to 10 short lines), applied every time it is mentioned there. #### What comes back - **Long answers** lead with a short summary as the first message; the details follow underneath in the thread. - **Tables** arrive as real Slack tables. A table too big for Slack (over 100 rows, 20 columns or 10,000 characters) arrives as text. - **Numbers** arrive as a card built from Slack's own components: real text you can select, not a screenshot. - **Documents** arrive as real Slack file attachments you can forward — Word files, spreadsheets, slide decks and PDFs. - **Long research** is written up and filed in your Drive, with a link in the thread rather than pages of text. #### Sending it files Attach files to a direct message or to an `@Cook` message in a channel, with or without words. Cook reads them the same way it reads files you upload in the app: - **Images** are looked at. - **Text files** such as .csv, .md and .txt are read in full. - **Other documents**, such as PDFs, are opened and read. Each file can be up to 25 MB. A larger file is skipped, and Cook is told it was skipped. Up to 10 images are read per message; with more, Cook reads the 10 most recent and is told how many it left out. #### When Cook needs an app connected If a request needs an app your workspace has not connected, Cook's reply carries a **🔌 Connect** button for that app. It opens the app's page in Cook, where you connect it. Once the connection is made, Cook picks the request back up on its own, in the same thread. You do not need to ask again. It does this for requests made in the last 24 hours, waits if Cook is still busy in that conversation, and does not start if the workspace is out of credits. #### Approving what it proposes Anything that spends money or leaves the building — sending an email, changing ad spend, posting to a channel — arrives as a card with **Approve**, **Request changes** and **Reject** buttons. Press one and it runs exactly as proposed; the request is frozen when the card is created, so it cannot change underneath you. When a proposal is a list, the card carries tick boxes. Untick anything you do not want, then approve, and only the ticked items run. Once someone decides, the buttons are replaced by the outcome and who chose it — for example "✅ Approved by Sam" or "❌ Rejected by Sam" — so the card cannot be pressed twice. Who may press depends on your workspace's own roles. An owner can run some things without a card at all; a teammate's request routes to whoever is allowed to sign it off. You set that in **Settings** → **Team** → **AI approvals**. **Always approve this tool.** A card for a single tool action can also carry this button. It approves the card now and changes the approval policy so later calls of that tool run without a card. Only a workspace owner or admin can turn it on; anyone else who presses it approves this card once, and Cook tells them the rule was not saved. Some actions always need a card and cannot be set this way. You can change it back in **Settings** → **Team** → **AI approvals**. #### Reminders and follow-ups Ask "remind me Friday at 4pm to send the report" or "check back on this tomorrow morning", and Cook comes back in the same thread at that time. Times are read in your own time zone. - You can ask it to skip the reminder if someone replies in the conversation first. - Up to 8 reminders can be waiting in one conversation, up to a year ahead. A new reminder is added; it does not replace the earlier ones. - Ask "what reminders do I have here?" to list them, and ask Cook to cancel one or all of them. For work that repeats, ask for a [routine](https://trycook.ai/docs/routines) instead. #### Check-ins Cook sends on its own When Slack is connected, Cook sets up three [routines](https://trycook.ai/docs/routines) that send a direct message to the person who connected the workspace: - **Daily digest**, each morning. - **Heartbeat**, at 9:00 and 15:00 each day. Cook reads the channels it can see and its tasks, and writes only if something needs attention — an unanswered question, a slipping date, something it could take on. Most check-ins send nothing. A check-in is also skipped when nothing new has been said to Cook since the last one. - **Workflow discovery**, once a week. Cook looks over the last two weeks for repeated work and suggests up to 3 things it could take over, each with a question for you. It builds nothing until you say yes. They are ordinary routines: you can edit or pause them wherever your routines are listed, or reply to a heartbeat asking Cook to check in less often or stop. If nobody has messaged Cook in this Slack for 21 days, the heartbeat and workflow discovery skip their runs until someone does. #### Credits Ask Cook in chat how many credits are left this period, what has used them, or the daily average. Owners and admins also see a breakdown by teammate. This is not available in conversations with your clients. When the workspace has used 70% and then 90% of this period's credits, Cook sends a direct message to each owner and admin who uses Cook in Slack. No alert is sent if the workspace is on automatic top-up. If no message can be delivered, the alert appears as a notification in Cook instead. #### What Cook can do in your Slack Besides answering you, Cook can work in the rest of your Slack under its own name: | Cook can | Needs a card | |---|---| | List channels, read a channel's or thread's history, search recent messages | No | | Look up a person, open a group DM | No | | Add, remove and read reactions | No | | List a channel's bookmarks | No | | Post a message, edit or delete its own messages | Yes | | Join or leave a channel, invite people to a channel | Yes | | Add a bookmark | Yes | | Create or edit a canvas | Yes | The cards follow your approval policy like any other. If Cook was installed before one of these was added, Slack may refuse it; Cook then says the workspace needs to reinstall Cook to grant it. #### Where the request turns up The card goes to the person who has to decide, as a direct message, in the chat app they used most recently. If Cook cannot message that person directly, the card appears in the conversation where it was proposed instead, and anyone there who is allowed to decide can press it. #### If you have two Slack workspaces If your organization has connected more than one Slack workspace, a card always goes to the workspace you were talking in, and can only be pressed there. #### Who can use Cook in Slack An admin sets this in Cook → **Connect**, on the Slack workspace's card: - **DM access** and **Group access**: *Pairing* lets in only approved people, *Everyone* lets in everyone except the people you block. Admins are never blocked. - **Slack guests**: guests are kept out unless you allow them. You can allow all guests or specific ones, in all channels or specific ones. With specific channels, guests are refused everywhere else, direct messages included. - **Slack Connect channels** (shared with another company): turn Cook on or off in all of them. For each one, choose who can prompt Cook (members only, or external people too), and whether Cook's thread replies and new posts go out at once or as a preview first. A preview is shown only to the person who asked, with **Post here** and **Reject**; only Post here makes it visible to the channel. - **Who Cook can DM**: anyone, or only specific people. Admins can always be messaged, and anyone can always message Cook. Someone who is not allowed gets a message only they can see, saying why. Deactivated accounts are ignored. #### If something does not arrive - **Cook does not answer in a channel:** it has not been invited to that channel. Invite it, or open **Settings** → **Apps** → **Chat apps**, press **Manage** on the Slack row, and pick the channel. - **A teammate is refused:** they see a private message saying why. If they have not linked their Slack account yet, they open **Settings** → **Apps** → **Chat apps**, press **Get my pairing code** under **Link your Slack account**, and send that code to Cook as a direct message in Slack within 15 minutes. An admin can also approve them in Connect. - **Cook's replies in a shared channel are only visible to you:** that channel is set to preview first. Press **Post here**. #### If your team uses Discord instead Cook works the same way in Discord. See [If your team already uses Discord](https://trycook.ai/docs/connect-discord). ### If your team already uses Discord https://trycook.ai/docs/connect-discord Put Cook in your Discord server, and see what it can do there. #### Before you start You need permission to add a bot to your Discord server. If you do not have it, the person who administers the server can invite the bot, and you can use Cook straight afterwards. #### Putting it in your server 1. Open **Settings** → **Apps** → **Chat apps**. The same window can also open from a small **Add Discord** bar at the bottom of the sidebar, but that bar is not always shown: it takes turns with other prompts and disappears once you have connected a chat app or dismissed it. The bar at the foot of the sidebar, when it is showing. 2. The list shows Slack, Discord, Telegram and iMessage. Press **Set up** on the Discord row. The Connect Cook window. Each chat app has its own Set up button. 3. Press **Open Discord invite**, invite the bot to your server and approve it. 4. Prove the server is yours: Cook shows a short code. Type `/pair ` in a server channel Cook can see. Cook replies **Linked!** there and the setup page carries on by itself. If nothing happens, Cook cannot read that channel: try one without restricted permissions. 5. Pick the channels Cook should join. #### Asking it for something Send the Cook bot a direct message, or write `@Cook` in a channel it has been added to. Plain English — no slash commands. The same short chat commands as in Slack work here: `!stop`, `!fast`, `!deep` and `!mute` (see [Chat commands](https://trycook.ai/docs/connect-slack#chat-commands)). Two things tell you it heard you: a chef mark appears on your message, and in a direct message **Cook is typing…** shows for as long as it is working. Images and documents you attach to a direct message are read, and if a request needs an app you have not connected, the reply in a direct message carries a **Connect** button. #### What comes back - **Numbers** arrive as a card built from Discord's own components: real text, themed to your server, readable on a phone. - **Documents** arrive as real Discord attachments you can forward. Discord caps a bot upload at 10 MB per file; anything larger arrives as a download link instead, so a big file is never lost. - **Recordings** of anything Cook did in its cloud browser come back as a watchable link. It opens in a browser, needs no Cook account, and does not expire. - **Long research** is written up and filed in your Drive, with a link in the conversation rather than pages of text. #### Approving what it proposes Anything that spends money or leaves the building arrives as a card with **Approve**, **Request changes** and **Reject** buttons. Press one and it runs exactly as proposed; the request is frozen when the card is created. When a proposal is a list, the card carries a picker. Untick anything you do not want before approving, and only the rest runs. Who may press depends on your workspace's own roles, set in **Settings** → **Team** → **AI approvals**. An owner can run some things without a card; a teammate's request routes to whoever can sign it off. #### Where the request turns up The card goes to the person who has to decide, as a direct message, in the chat app they used most recently. If Cook cannot message that person directly, the card appears in the conversation where it was proposed instead, and anyone there who is allowed to decide can press it. #### If something does not arrive - **Cook does not answer in a channel:** the bot has not been added to that channel, or the channel is not linked yet. Open **Settings** → **Apps** → **Chat apps**, press **Manage** on the Discord row, and pick the channel. - **A teammate is refused:** Cook does not know which Cook account their Discord account belongs to. There is no screen yet where a teammate can link their own Discord account, so ask us at support if this happens. - **A button says you are not the person it is routed to:** the approval went to someone else under your workspace's policy. They can press it, or an owner can. #### If your team uses Slack instead Cook works the same way in Slack. See [If your team already uses Slack](https://trycook.ai/docs/connect-slack). ### Text Cook from Telegram https://trycook.ai/docs/connect-telegram Make your own Telegram bot, connect it to Cook, let it use your computer, and send it work from your phone. #### Before you start - You need to be an owner or admin of your Cook workspace. - For tasks on your own computer, install **Cook Desktop** and keep it open. Without it, Cook still answers, and does browser work in its cloud browser instead. #### Make a bot and connect it There is no shared Cook bot on Telegram. Your workspace runs its own bot, so it has your name and picture. 1. In Telegram, open **@BotFather** and send `/newbot`. Pick a name and a username. BotFather replies with a **token**. 2. In Cook, open **Settings**, then the **Apps** tab. Under **Chat apps**, press **Set up** on the Telegram row. 3. Paste the token and press **Connect bot**. The card now says **Connected as @yourbot**. 4. Press **Get a pairing link**, open it on your phone, and press **Start** in Telegram. That tells the bot the chat is yours. After you connect, Cook never shows the token in the page again. To stop the bot, press **Disconnect** on the same card. #### Bring in your team When someone who is not paired writes to the bot, the owners and admins of your Cook workspace who are paired to it get a pairing request in their own chat with the bot, with **Approve** and **Deny**. Once approved, the person's first message goes through. A pairing link from **Get a pairing link** pairs the chat to whoever pressed the button in Cook, so do not send yours to a teammate. #### Let it use your computer 1. In the bot's chat, send `/desktop`. 2. Cook Desktop shows **Telegram wants to use your desktop browser**. Choose **Always allow on this computer**, or **Approve one turn** for a single task. 3. The bot confirms in the chat. With **Always allow**, every task in that chat can use this computer's browser and its logins, including while you are away, as long as Cook Desktop is open. Send `/desktop off` to stop, or press **Revoke** under **Desktop approvals** in the channel's **Connect this channel** window. #### Asking it for something Write the way you would text a person. For example: > hey can you open trycook.ai on my computer and send me a quick video > scrolling through the homepage? The bot shows each step while it works (opening the page, recording, saving). In the walkthrough above, the video arrived 3 minutes 44 seconds later. A follow-up question in the same chat got its answer in 1 minute 30 seconds. #### What comes back - **Screenshots** arrive as Telegram photos. - **Recordings** arrive as files you can download and play. - **Documents** arrive as files. Telegram caps a bot upload at 50 MB per file. - **Replies** are short: a headline, then bullet points. #### Commands | Send | What it does | | --- | --- | | `/desktop` | Ask to use your computer's browser | | `/desktop off` | Stop using your computer; tasks go back to the cloud browser | | `/stop` | Stop the task that is running | | `/new` | Start a fresh conversation | | `/status` | Show whether a task is running, whether your computer is connected, and what the chat may use | | `/workspace` | Show or switch which Cook workspace the bot works in | | `/help` | List what the bot can do and every command | Telegram also lists these in the bot's command menu, along with a few more. #### If something does not arrive - **The bot does not do what you ask:** the chat may not be paired to your Cook account. Press **Get a pairing link** in Cook and press **Start** in Telegram. - **Tasks run in the cloud, not on your computer:** Cook Desktop is closed, or desktop access is off. Open Cook Desktop and send `/desktop`. - **The Set up button is grey:** only owners and admins can connect a bot. #### If your team uses Slack or Discord See [If your team already uses Slack](https://trycook.ai/docs/connect-slack) and [If your team already uses Discord](https://trycook.ai/docs/connect-discord). ### Text Cook from Lark https://trycook.ai/docs/connect-lark Create your own Lark bot with one approval, connect it to Cook, let it use your computer, and send it work from your phone. Lark is not generally available yet. It is off for workspaces by default, so most workspaces have no Lark row under Chat apps . If you want it, ask us to switch it on for your workspace. #### Before you start - You need to be an owner or admin of your Cook workspace. - You need a Lark account (Lark Suite, or Feishu in China). - For tasks on your own computer, install **Cook Desktop** and keep it open. Without it, Cook still answers, and does browser work in its cloud browser instead. #### Create the bot and connect it There is no shared Cook bot in Lark. Your workspace creates its own bot, inside your own Lark organization. 1. In Cook, open **Settings**, then the **Apps** tab. Under **Chat apps**, press **Set up** on the Lark row. 2. Press **Create the bot in Lark**. Lark's page opens in a new tab. Cook also shows a QR code: scan it with the Lark app on your phone if you are not signed in to Lark in this browser. 3. On Lark's page, confirm it is you, look over what the bot may do, and press **Create**. Lark creates the bot and adds it to your organization. 4. Back in Cook, the card says **Connected as** and the bot's name. The Lark account that approved it is already paired to your Cook account. The card shows until when the page works. If it runs out, press **Get a new code**. Lark's page is Lark Suite's (larksuite.com). On Feishu, make the app in Feishu's developer console and connect it with **Use an existing app** below. If the card says **Waiting for your Lark admin to approve the app**, an admin of your Lark organization has to approve the new app in Lark before it is enabled. You can also ask Cook in chat to set it up ("set up Cook in Lark for me"). It sends you the same Lark page. ##### If you already made an app in Lark Press **Use an existing app** instead. The app must be set to receive events over a long connection in Lark's developer console. To let Cook show people's names, also give it the permission `contact:user.base:readonly`. Copy its **App ID** and **App Secret** from the app's Credentials page, choose **Lark** or **Feishu**, and press **Connect app**. After you connect, Cook never shows the App Secret in the page. To stop the bot, press **Disconnect** on the same card. #### Bring in your team When someone who is not paired writes to the bot, the owners and admins of your Cook workspace who are paired to it get a pairing request in their own chat with the bot, with **Approve** and **Deny**. Once approved, the person joins your Cook workspace as a guest and their first message goes through. The request names the person as your Lark organization's contacts list them. If your Lark admin has limited which people the bot can see in contacts, a person outside that group is named **Lark user**. To pair another Lark account of your own, press **Get my pairing code** on the card and send the line it shows (`/pair` and the code) to the bot. The code works once, for 15 minutes. #### Let it use your computer 1. In the bot's chat, send `/desktop`. 2. Cook Desktop shows **Lark wants to use your desktop browser**. Choose **Always allow on this computer**, or **Approve one turn** for a single task. 3. The bot confirms in the chat. With **Always allow**, every task in that chat can use this computer's browser and its logins, including while you are away, as long as Cook Desktop is open. Send `/desktop off` to stop, or press **Revoke** under **Desktop approvals** in the channel's **Connect this channel** window. #### Asking it for something Write the way you would message a person. For example: > hey can you open trycook.ai on my computer and send me a quick video > scrolling through the homepage? The bot keeps one message up to date with each step while it works (opening the page, recording, saving), then settles it when the task is done. #### What comes back - **Screenshots** arrive as images. - **Recordings** arrive as videos you can play in the chat. - **Documents** arrive as files. Lark caps a bot upload at 30 MB per file, and at 10 MB for an image; a larger image arrives as a file. - **Replies** arrive as Lark rich text, with headings, lists, links, code and tables. #### Commands Lark has no command menu for bots, so type them. | Send | What it does | | --- | --- | | `/desktop` | Ask to use your computer's browser | | `/desktop off` | Stop using your computer; tasks go back to the cloud browser | | `/stop` | Stop the task that is running | | `/new` | Start a fresh conversation | | `/status` | Show whether a task is running, whether your computer is connected, and what the chat may use | | `/workspace` | Show or switch which Cook workspace the bot works in | | `/help` | List what the bot can do and every command | #### If something does not arrive - **The bot does not do what you ask:** your Lark account may not be paired to your Cook account. Press **Get my pairing code** in Cook and send the line to the bot. - **Tasks run in the cloud, not on your computer:** Cook Desktop is closed, or desktop access is off. Open Cook Desktop and send `/desktop`. - **There is no Lark row, or the Set up button is grey:** Lark is not switched on for your workspace (see the note at the top), or you are not an owner or admin. Only owners and admins can connect a bot. #### If your team uses Slack, Discord or Telegram See [If your team already uses Slack](https://trycook.ai/docs/connect-slack), [If your team already uses Discord](https://trycook.ai/docs/connect-discord) and [Text Cook from Telegram](https://trycook.ai/docs/connect-telegram). ## Delivering for clients ### Build a playbook for your systems https://trycook.ai/docs/what-is-a-playbook A whole set-up saved once and reused. Mostly useful if you set up the same thing for business after business. Most people never need a playbook. If you run one business, build [routines](https://trycook.ai/docs/routines) and stop there. A playbook only starts paying off when you set up the same thing for a second, third and fourth business. A **playbook** is a saved set-up you can reuse. Instead of rebuilding the same routines and rules every time, you install the playbook and fill in what is different: the name, the links, the wording. Typically the same set-up means: - the same text message when an enquiry arrives; - the same follow-up email the next day; - the same appointment reminder; - the same rules about response time, pricing and tone. This 70-second video shows someone creating a playbook and installing it. The Playbooks page shows each playbook and where it is installed. Playbooks has no row in the sidebar. To open it, press **⌘P** to open search and type **Playbooks**. #### What is inside one A playbook holds **routines** and **standards**. ##### Routines do the work A routine waits for something to happen, then follows a set of steps. For example: an enquiry arrives, send a text, wait one day, send an email, tell your phone. Cook does not need to be open. A routine runs after you switch it on. See [Answering people without doing it yourself](https://trycook.ai/docs/routines). ##### Standards are the rules A standard is a written rule that Cook follows on every job. For example: - Reply within one hour. - Never quote a price by text. - Confirm the address before booking. Standards apply to your whole workspace. The playbooks that come with Cook add their standards when you install them. A playbook your workspace made asks you to approve each standard before adding it. #### What "client" means here A **client** is a folder that holds the work for one business. If you run one business, you have one client and it is your own business. It is already there. When these pages say "install the playbook for a client", that means your own business, and there is nothing to create first. If you do marketing for other companies, you add one client per company. Their routines, wording and links stay separate from each other. #### What happens when you install one One playbook creates separate client routines One pink mould sits above three separate impressions of the same shape. Each impression has a different inset, representing its own client wording and links. They are not connected to each other. Playbook Client A Client B Client C Same structure, separate routines. Each client gets its own wording and links. Changing one client’s copy does not change another’s; standards still apply across the workspace. - Cook makes a separate copy of the set-up for that one client. - Every routine it creates is **switched off**. - Nobody is messaged until you test a routine and switch it on. - Any other client's wording and links are untouched. #### When it is worth the trouble - You are setting up the same thing for business after business. - Rules that matter live only in your head or in a document nobody opens. - Somebody else has to do the set-up without getting it wrong. You can use a playbook that came with Cook, or [describe your own in plain English](https://trycook.ai/docs/make-your-own-playbook). #### Next step [Your first client on your playbook](https://trycook.ai/docs/install-a-playbook). Cook shows you every part before it creates anything. ### Your first client on your playbook https://trycook.ai/docs/install-a-playbook How to install a playbook for your own business or a client, what you need first, and why nothing is created until the last screen. Installing a playbook takes a few minutes. You can leave and come back. Cook creates nothing at all until you finish the last screen. #### Before you start **Pick the client it is for.** If you run one business, that is your own business and it is already there. If you manage several, make sure the right one exists first. See [What "client" means](https://trycook.ai/docs/what-is-a-playbook#what-client-means-here). **Check you are allowed to build routines.** On your own, you are the owner and you are allowed. In a team, if the install is blocked, whoever owns the workspace can change your role in **Settings**. Depending on which playbook you install, you may also need some of these. Cook checks for them during setup and links you to anything missing, so you do not have to work it out in advance: - **A booking page** — a page where someone picks a time that lands in your calendar. Needed if the playbook sends appointment links. - **A texting number** — needed if the playbook texts customers. Start the texting number early. A business phone number has to be cleared by the carrier before it can text customers. That is paperwork with a waiting period of a few days to a few weeks, and Cook cannot skip it. Everything else here you can do today. - **Email sending turned on** for your workspace. - **The wording you want customers to get.** Every message is already written and you can change all of it, during setup or later. The Appointment Lead Engine keeps email and immediate owner bell alerts as its core. With texting set to automatic, an unavailable number leaves SMS steps out. Choose required texting if the journey must not start without it. Missing email delivery can remain while you prepare disabled routines, but blocks activation. #### Setting it up, screen by screen Playbooks has no row in the sidebar. Press **⌘P** to open search, type **Playbooks** and open it. Choose a playbook, then start the setup. You can also ask in chat: “Set up appointment follow-up for this client. Use email and notify me immediately; I have no texting number.” Cook reads the client setup and asks for missing details. First, Cook explains what the playbook will create. ##### 1. Read what it will do Check which routines it will create, what starts each routine, and what each one does. Close the setup if it is not what you need. ##### 2. Choose the client If you run one business, choose your own — it is the only one there. If you manage several, pick carefully: every name, link, message and routine created next belongs to that one and nothing else sees them. If you do not have the answers yet, press **Install blank, fill in later**. Every routine lands switched off with its setup values empty, and none can be switched on until you fill them in with **Fill in setup**. ##### 3. Fix anything missing Cook checks for the booking page, the texting number and email sending, live. Anything missing is marked with a warning and what to do about it. You can install now and fix the rest before switching the routines on. Missing required setup values stop installation. Delivery requirements are shown separately: you can prepare disabled routines before connecting a sender, then resolve those blockers before activation. ##### 4. Answer the questions These are the details that differ from one business to the next. For the Appointment Lead Engine that means things like **Business name**, **What you help with**, **Owner name**, **Owner reply-to email**, **Public booking URL**, **Business timezone**, the hours sending starts and ends, and how many hours to wait before each follow-up and reminder. When a person needs to step in, Cook alerts the owner through the notification bell. Questions marked optional can be skipped. If you skip one, Cook leaves out the part of the set-up that needed it. ##### 5. Read every customer message The messages are already written, and you can change any of them. Read them out loud. Make sure they sound like you and that the links are right. ##### 6. Review the setup Check every answer and routine before you finish. This is your last check. Nothing exists yet. ##### 7. Finish Cook creates the routines in a folder named after the client and the playbook, for example "Acme Dental · Appointment Lead Engine". Every routine is **off**, so no customer has been messaged. The finish screen confirms what was created and that it is off. #### What you have now - Routines, ready to test. Every one is off. - Your wording, saved, which you can change later. - Standards, if the playbook has any. A playbook that comes with Cook adds them as it installs. A playbook your workspace made files one approval request per standard, and those rules are not added until you approve them — see [Deciding before a rule is added](https://trycook.ai/docs/approving-what-it-brings). Nobody has been messaged. Next, [check every routine before a real customer sees it](https://trycook.ai/docs/after-you-install). ### How to verify your playbook's outputs https://trycook.ai/docs/after-you-install Check each routine before real customers receive anything. Nobody has been messaged yet. Every routine the install created is switched off, and testing sends nothing to a real person. Work through the three steps below before you switch anything on. A test is contained; a live run can reach a customer The test follows a closed loop with no outlet. Beside it, a live path passes through an open valve and continues outward. Testing a routine does not switch the live path on. Test Live Nothing leaves Switched on Testing sends nothing to a real customer. Real runs can start only after you switch a routine on and its starting event happens. #### 1. Test each routine Open a routine and select **Test**. Cook runs it with a pretend lead. Nothing is sent to anyone. Check: - **Words:** Does it sound like the business it is being sent on behalf of? Read it out loud. - **Timing:** Are the waits right? Change them and test again. - **Links:** Open every one. A booking link should land on the right calendar. - **Order:** Do the steps happen in the sequence you meant? #### 2. Activate the tested journey There are two ways to switch the tested routines on. - **One at a time.** If a routine's test passes, switch it on from the routines list. This is what the finish screen of the setup tells you to do. - **All together, through Cook.** Ask Cook to activate the installed playbook. It checks every routine, the connected senders and the routines that start other routines, then files an **Activate playbook** approval. Review it before the bundle switches on. A passed simulation does not prove that a disconnected email account or texting number can deliver. Your plan can limit how many routines are switched on at once. If switching on would go over that limit, Cook says so and switches nothing on. For appointment playbooks, the approval also hands booking-page reminders to the tested reminder routines so new bookings do not get two reminder sequences. Once a routine is on, it runs the next time its starting event happens. It does not go back and handle anything from before you turned it on. #### 3. Give it something to work on A routine that waits for new enquiries needs somewhere for enquiries to arrive from. Point one of these at it: - a [funnel](https://trycook.ai/docs/funnels) — a page Cook builds with a form on it; - a form on a website you already have; - your contact list, if new people arrive there from somewhere else. Until someone actually enquires, the routine sits and waits. That is not a fault. #### Your first week with it running - Read the first few real run records. They show what happened and when. - Check the alerts reached you where you expected. - Expect to adjust wording after you see real replies. Editing a message does not change steps that are already running. #### Changing it later You can edit a message, wait, or step at any time. New runs use the new version. Ask Cook in chat to update the existing install. It prepares drafts, preserves your independent edits and reports conflicts for review. After testing, an approval applies the update together. Older installs without a saved baseline need individual draft review. Do not go back through the setup screens to update a customised install. That path shows **Update these routines**: it rebuilds every routine from the playbook, switches every one of them off again, and replaces any changes you made in the builder. Connecting a texting number later does not add texts to a live playbook. Ask Cook to include texting, review the added steps, then test and activate the update. #### Pausing it, or getting rid of it - **Turn off one routine.** No new runs start, and it stays where it is. Runs already in progress are not stopped: the routine shows **Run still active** while they finish. To stop a person's run, open the routine, choose **Who's in it** and press **Stop** on that person. - **Remove the playbook entirely.** There is no button for this. Ask Cook in chat to remove it. Cook asks you to approve it first, then deletes the routines that playbook created and stops anything they had running. Nothing undoes this. Removing a playbook does not delete its standards. Learn more in [Deciding before a rule is added](https://trycook.ai/docs/approving-what-it-brings). ### Saving your own setup to reuse https://trycook.ai/docs/make-your-own-playbook Tell Cook what you want in plain English, then review the result. There is no long form to fill in. Describe the set-up in a chat, the way you would explain the job to a new employee. A playbook can set up the complete journey for one business, or provide a reusable starting point for several clients. Each install has its own setup. #### Ask for the result you want For example: > Create a playbook for new roofing customers. Text new enquiries right away, > email them the next day, and let me know when someone replies. Reply within > one hour, never quote a price by text, and always confirm the address before > booking. Cook asks about anything important that is unclear. Then it saves the new playbook to your **Playbooks** page. That page has no sidebar row: press **⌘P** and type **Playbooks** to open it. #### Tell it these four things ##### 1. What starts the work Say when it should begin: when a lead arrives, an appointment is booked, or a job is completed. ##### 2. What happens next List the steps and timing. For example: text now, email tomorrow, then remind them after three days if they have not booked. ##### 3. What changes from one business to the next Name the details that are never the same twice: the business name, the booking link, the area covered, the number messages go out from, and where you want to be pinged. Cook turns each of those into a question it asks at install time. ##### 4. Your rules and limits State what must always happen and what must never happen. Cook saves these as standards. When the playbook is installed, each standard arrives as its own approval request, and none is added until you approve it. For example: - Reply within one hour. - Do not send texts before 8am or after 9pm. - Do not ask for a review until the customer says they are happy. #### Read it before you use it Ask Cook to explain what it built. You can request changes in plain language: - "Make the second message shorter." - "Send the reminder two days before the appointment." - "Tell me when someone replies." Install it once, then press **Test** on every routine. A test sends nothing to a real person. #### Changing it later Ask Cook for the change. The playbook gets a new version. Anywhere already running the older version keeps its saved routines until you ask Cook to update that install. Cook prepares and tests drafts, preserves independent customizations and flags conflicting edits before activation. Two things you cannot do. You cannot edit a playbook that came with Cook. Ask Cook to copy it under a new name and edit your copy. You cannot delete a playbook while it is still installed somewhere. Remove it from those places first. Next, [install it for your first client](https://trycook.ai/docs/install-a-playbook). ### Deciding before a rule is added https://trycook.ai/docs/approving-what-it-brings Review changes that add workspace rules or delete installed routines. An **approval** is a request asking a person to allow or reject something before it happens. Cook uses them all over the product — see [How to approve work](https://trycook.ai/docs/nothing-goes-out-without-you) for the general rules. This page covers the requests that playbooks raise: adding a standard, removing a setup, and, when you ask Cook in chat, activating or reinstalling one. #### When it wants to add a rule A **standard** is a written rule that Cook follows on every job, such as "never quote a price by text". Every agent in the workspace reads it from its next job on. The playbooks that come with Cook add their standards when you install them, with no request. Their text is reviewed by Cook before it ships. A playbook your workspace made itself asks first. Each of its standards arrives as its own request, titled **Save skill from playbook:** and the standard's name, showing the full text. The exact words you approve are the words that get saved. #### When you remove a whole setup There is no remove button. Ask Cook in chat to remove the playbook from a client. Removing it deletes the routines it created and stops anything they had running. Cook asks you to approve that first, and the request names exactly where it is being removed from, so you do not clear the wrong one. Nothing is deleted before you approve. Standards are not removed with the playbook — they stay until you remove them yourself. #### Where to find requests Open the **Needs you** card on Home, or the notification bell. You will see these requests beside other work that needs a decision, such as drafted replies or work sent for review. Each request shows: - what action is being requested; - who or what requested it; - when it was requested. Choose **Approve**, **Request changes** or **Reject** on the request. If a request came from a chat, it also appears as a card in that chat. Deciding in either place closes the same request. #### Four things worth knowing - **A newer request replaces the older request for the same item.** You cannot approve an abandoned draft. - **Open requests expire after 7 days.** Owners and admins can change this from 1 to 90 days in Settings → **Team** → **AI approvals**, under **Pending approvals expire after**. Nothing runs. The request is marked as expired, not rejected. - **Rejecting closes the request.** Nothing happens. If you add a note saying why, Cook uses it on the next attempt. - **YOLO mode skips the request.** If an owner or admin has switched on **YOLO mode** in Settings → **Team** → **AI approvals**, these actions run straight away with no request. ### Questions about reusing a setup https://trycook.ai/docs/questions Quick answers about installing a playbook, editing it, texting rules, and stopping one. Every question people actually ask about reusing a setup. Open the one you need. #### Will installing a playbook message my customers? No. Every routine it creates is switched off. Testing sends nothing either. A real message can only go out after you switch a routine on yourself. #### Do I need a playbook at all? Probably not, if you run one business. Build [routines](https://trycook.ai/docs/routines) instead. A playbook earns its keep when you are setting up the same thing for business after business. #### Can I use one playbook for more than one business? Yes. Each one gets its own separate copy, with its own wording and links. Changing one does not change any other. #### What if I already built something like this by hand? Installing a playbook never deletes work you built yourself. That does mean you can end up with two routines doing the same thing, so check for duplicates before switching the new ones on — otherwise a customer gets the same message twice. #### Will installing a newer version wipe my edits? It depends how you update. If you ask Cook in chat to update the install, it prepares drafts, keeps your own edits and shows you anything that conflicts. If you go back through the setup screens instead (Update these routines), every routine is rebuilt from the playbook, your changes in the builder are replaced, and every routine is switched off again. #### What happens when someone replies STOP? They stop receiving texts straight away, and every routine skips them from then on. This is a legal requirement, not a setting you can turn off. Only a reply that is exactly the keyword counts: "STOP" does, "please stop" does not. If they later reply START, they receive texts again. #### Can I stop messages going out at night? Yes, by setting sending hours on the routine. A routine with no sending hours sends whenever a step comes up. The Appointment Lead Engine asks for sending hours when you install it (8am to 9pm in the business's time zone unless you change them), and a message that comes up outside them waits until they start. #### Who is allowed to install one? Anyone with permission to build routines. On your own, that is you. #### What do my customers see? The messages the routines send them, and nothing else. They never see the playbook, how it was set up, or your standards. #### How do I know it is working? Open the routine's run history. It shows what happened, when, and what came back. Read the first few real runs and check that the alerts reached you where you expected. #### Something is going wrong — how do I stop it fastest? Turn the routine off so no new runs start. Runs already in progress keep going: open the routine, choose Who's in it and press Stop on each person. Nothing is deleted. Then fix it, test it, and turn it back on. ### Sell Cook as your own product https://trycook.ai/docs/white-label Five short videos for agencies that run Cook under their own name — your brand, your domains, sub-accounts and your team, your clients' portal, and selling a plan on your own Stripe. With white-label, your team, your clients and the people who buy your plan see your logo, your colours and your product name, on your own domains, with email from your own domain once you turn that on (see [Send email from your own domain](https://trycook.ai/docs/send-email-from-your-own-domain)). White-label is part of the Agency plan. Each section below has a video of about a minute, followed by the page that explains it step by step. The videos show a test agency called Acme Growth OS. #### Where it lives Open the account menu (your name at the top of the sidebar) and turn on **Agency mode**. An **Agency** tab appears in the sidebar with these pages: - **Sub-accounts** — every client workspace your agency runs. - **Portal white-label** — how the client portal looks, and its domain. - **Sub-account brand** — how the app your team and your sub-accounts sign into looks, its domain and its product name. - **Onboarding** — everything a new owner, teammate or client is walked through: the owner setup interview, client intake, the client onboarding wizard and the team walkthrough. - **Plans & billing** — revenue and margin for each sub-account. - **Email domain** — the domain your email is sent from. - **Apps** and **Portal journey**. Portal white-label and Sub-account brand both start with a **White-label setup** list. It shows what is done and what is left: your plan, your logo, colour and product name, the portal domain, the app domain, email from your domain, and replies routed back to you. #### 1. Make it your product Upload your logo, name your product, pick your colour and fonts, and check the preview before you save. Step by step: [Brand your workspace](https://trycook.ai/docs/brand-your-workspace). #### 2. Put it on your own domains Your team signs in on your app domain, your clients use the portal on your portal domain, and email goes out from your sending domain with replies coming back to you. Step by step: [Use your own domain for your team](https://trycook.ai/docs/team-on-your-own-domain), [Use your own domain for the client portal](https://trycook.ai/docs/portal-on-your-own-domain) and [Send email from your own domain](https://trycook.ai/docs/send-email-from-your-own-domain). #### 3. Sub-accounts and your team Create a workspace for each client business, invite your teammates, and see every sub-account's numbers in one table. Step by step: [Sub-accounts](https://trycook.ai/docs/sub-accounts). #### 4. Your client's portal Invite a client to their portal, see exactly what they see, and let them follow their onboarding and message your team. Step by step: [Give a client their portal](https://trycook.ai/docs/client-portal). #### 5. Sell your own plan Sell a plan on your own Stripe. Each buyer gets a workspace of their own under your brand, and you see the revenue for each one. Step by step: [Sell a plan that includes a workspace](https://trycook.ai/docs/sell-a-plan). What you may charge and advertise: [What you may charge and advertise](https://trycook.ai/docs/what-you-may-advertise). ### Brand your workspace https://trycook.ai/docs/brand-your-workspace Put your logo, colour, font and product name on everything your clients and your team see, so Cook runs under your name. #### What your clients and your team see With white-label on, the client portal, the team app, the sign-in screens and every email carry your logo, your colour and your product name. The assistant introduces itself by your product name. Cook is not named anywhere a client looks. White-label is part of the Agency plan. The first row of the **White-label setup** list says whether your plan includes it. #### Where it lives Turn on **Agency mode** in the account menu (your name at the top of the sidebar), then open the **Agency** tab. The Agency mode switch only shows on the Agency plan, and only to owners and admins: - **Sub-account brand** dresses the app your team and your sub-accounts sign into, and holds the product name. - **Portal white-label** dresses the client portal. Both pages edit the same brand: a change on one shows on the other. #### Set the brand 1. **Logo.** Upload a PNG, JPG or SVG, or press **Make with AI**. A horizontal logo works best. It is shown in the portal rail, on the sign-in screens, and at the top of the app's sidebar. You can also add a **Logo on dark backgrounds** and a **Square logo**. 2. **Brand color.** Type a hex code or pick a swatch. It is used for buttons and links. 3. **Font** and **Headline font.** Pick a font, or press **Upload font** to use your own (TTF, OTF, WOFF or WOFF2). **Same as body** keeps headings in the body font. 4. **Theme** (System, Light or Dark) and **Rail** (Follow the page, or Dark). 5. **Sign-in backdrop.** Upload an image and place it in the **Corner** or over the whole page (**Cover the page**). **Band along the bottom** adds a strip of colour along the bottom of the sign-in page and the portal login. 6. **Remove platform branding.** Replaces the platform's mark and its "Powered by" line with your logo across the portal and every link you share. 7. **Brand my team's app too.** Your logo, colours and font also dress the app your team and your sub-accounts sign into. It needs Remove platform branding. 8. **Product name.** How your product and its assistant are named across the app and its emails. Leave it empty and your workspace name is used. 9. **What your assistant says about itself** (Sub-account brand page). How the assistant describes itself to your team and sub-accounts. 10. **Send invitations and sign-in links from my domain** (Sub-account brand page). Off until you turn it on. See [Send email from your own domain](https://trycook.ai/docs/send-email-from-your-own-domain). 11. **Call to action on shared links** and **Footer on shared links** (Portal white-label page). 12. Press **Save changes**. The Portal white-label page shows a **Preview** of the portal in your brand before you save. #### Or ask the assistant In a chat, describe the look you want in plain words, for example "make our sign-in page match our website". The assistant proposes the change on an approval card. Under **See it first**, **Client portal** opens the portal wearing the proposed look. Once you have your own [app domain](https://trycook.ai/docs/team-on-your-own-domain), **Sign-in page** opens your sign-in page wearing it, and **Team app** opens the app your team works in wearing it, for anyone signed in to your workspace. The links show the proposed look only while the card waits for your decision. Nothing changes until you press **Approve**. #### Check it Open the client portal as a client (**View as client** on a client's page: open the **Clients** tab in the sidebar and choose the client), and open the sign-in page on your app domain. Both show your logo and name. The setup list turns the "Logo, colour and product name set" row green once all three are filled in. #### What is still Cook's Your Stripe, your domains and your senders are yours. The platform's own name appears only in the platform's own billing to you, never to your clients. ### Use your own domain for the client portal https://trycook.ai/docs/portal-on-your-own-domain Serve the client portal on a domain you own, such as portal.yourbrand.com, with the sign-in screen included. #### What changes for your clients Your clients sign in and work at your address, for example portal.yourbrand.com. Invitations, shared deliverables and intake forms link to that address. The sign-in screen shows your logo and product name. #### Before you start - Your plan includes white-label (the first row of the **White-label setup** list). - You can add DNS records at the company that hosts your domain (your registrar or DNS provider). #### Connect the domain 1. Open **Agency → Portal white-label** and find **Portal domain**. (The Agency tab appears when **Agency mode** is on in the account menu.) 2. Type the domain you want, for example `portal.yourbrand.com`, and press **Connect**. 3. Two DNS records appear, with Type, Host and Value: an **A** record and a **TXT** record. Add both at your DNS provider. The A record points the domain at Cook; the TXT record proves the domain is yours. There is no CNAME. 4. Press **Verify domain**. New DNS records can take a few minutes to be visible; press it again if the first check fails. 5. When it reads "Domain verified — your portal is live on it.", you are done. Using Cloudflare? Set the record to DNS-only (the grey cloud), not proxied, and do not add an AAAA record. #### After it is verified The card reads "Your portal is live at … — new invites use it automatically." Cook checks the domain every day and shows the time of the last check. If the records disappear, the portal falls back to its Cook address and the workspace owner is told, so nobody is locked out. The setup list at the top of Portal white-label shows the domain and when it was last checked. ### Use your own domain for your team https://trycook.ai/docs/team-on-your-own-domain Serve the app your team signs into on a domain you own, such as app.yourbrand.com, so invitations and sign-in links carry your name. #### What changes for your team Your team signs in at your address, for example app.yourbrand.com. Invitation emails, password resets and magic links point there. A session belongs to the host it was created on: signing in at app.yourbrand.com keeps you on app.yourbrand.com. #### Connect the domain 1. Open **Agency → Sub-account brand** and find **App domain**. (The Agency tab appears when **Agency mode** is on in the account menu.) 2. Type the domain, for example `app.yourbrand.com`, and press **Connect**. 3. Add the DNS records shown at your DNS provider, then press **Verify domain**. 4. When it reads "Domain verified — your team can sign in on it.", invite a teammate: the invitation mail links to your domain. Once verified, the card shows the domain as **Active** with "Your team signs in at …" and "Checked every day", with the time of the last check. The same rules as the portal domain apply: Cloudflare records stay DNS-only, the domain is checked every day, and the setup list shows the last check. #### Connections from your domain Connecting Google Calendar, Slack and the other integrations from your domain returns to your domain with the connection saved. Nothing in that flow shows the platform's own address. ### Send email from your own domain https://trycook.ai/docs/send-email-from-your-own-domain Invitations, portal invites and digests go out from an address on your domain, and replies come back to you. #### What changes Email Cook sends to your leads goes out from your sender, for example `hello@mg.yourbrand.com`, with your name on it. Replies come back to your inbox in Cook and land on the right lead's conversation. Cook's own emails for your workspace — team invitations, client portal invites, sign-in links, password resets and reports — need two more switches, in step 5. Until both are on, they leave from the platform address, signed with your name. #### Add a sending domain 1. Open **Agency → Email domain**, or open **Growth → Emails** and press the settings button at the top right. 2. Under **Sending domain**, type your domain and press **Set up**. A subdomain such as `mg.yourbrand.com` keeps your regular email untouched. 3. Add the records shown at your DNS provider, then press **Verify domain**. New records can take a few minutes. 4. Under **Send as**, set the address on your domain, the **Name** people see, and an optional **Reply-to**. Press **Save sender**. 5. Open **Agency → Sub-account brand**. Turn on **Remove platform branding**, then turn on **Send invitations and sign-in links from my domain**. It is off until you turn it on. **Show DNS records** on the domain's card lists the records again at any time: the sending records and the two MX records. #### Replies **Receive replies here** routes replies to your emails into this inbox and onto the lead's conversation. Once the domain is verified and its two MX records check out, it turns on by itself, and the card shows **Replies received**. Turn the switch off if you want replies to go elsewhere; turning it off is remembered. With the switch off and no Reply-to set, a reply to any email you send bounces, and the card shows **Replies bounce**. #### Check it Invite a teammate or resend a client's portal invite. With step 5 done, the mail arrives from your sender, and the link inside it points to your domain when you have connected one. If it still comes from the platform address, check both switches in step 5. The **White-label setup** list shows "Email sent from your own domain" and "Replies routed back to you" once both are done. ### Sub-accounts https://trycook.ai/docs/sub-accounts Give a client a workspace of their own that your agency still runs, start it from a template, and keep the client's portal working. #### What a sub-account is A sub-account is a separate workspace that your agency created or linked and manages. Its owner runs it; your owners and admins are admins in it, so your team can work inside it, add clients and members, and change settings. They cannot change its billing, delete it, or remove its owner. Sub-accounts are part of the Agency plan. #### Create one 1. Open **Agency → Sub-accounts** (the Agency tab appears when **Agency mode** is on in the account menu). The page lists every sub-account with today's numbers: clients, last activity, spend, what needs you, how many of your staff are in it, its template and its wallet. 2. Type a name under **New sub-account name** and press **Create sub-account**. If you have templates, choose one in the menu next to the name first (it reads **No template** until you do). 3. Press **Open** on the row to switch into it. The workspace switcher lists your sub-accounts under your agency. Your owners and admins are added to every sub-account and kept in sync: promote someone to admin in your workspace and they gain the sub-accounts; remove them and they lose them. ##### From chat Ask your agent, for example: "Make a sub-account for Aesthetic Growth Ventures and invite victor@example.com as its owner." It shows an approval card first, with the name, who gets invited and how it is billed. Nothing is created until an owner or admin approves it. Then the sub-account exists, you own it, and the person gets an invitation email for the role you asked for (owner, admin or member). To give an existing client a sub-account, name the client instead: the client's own email owns it and gets a sign-in link, as **Give a client their own workspace** below does. A sub-account's AI usage is billed to your agency's credits, and it runs on your agency's plan. If your plan doesn't include sub-accounts, or you've used every one it allows, the agent says so and files no card. #### Link an existing workspace 1. Open **Agency → Sub-accounts**. 2. Under **Link existing workspace**, choose a workspace from **Choose a workspace you own**. 3. Press **Link existing workspace**, then confirm. Your agency becomes the payer; the linked workspace keeps its ID, content, members and settings. No new workspace is created. You must own the workspace you link. It must be standalone, without active sub-accounts or a live standalone subscription, and your agency's plan must have room for another sub-account. #### A business can be a client and a sub-account A client is your agency's CRM record for a business. A sub-account is the business's separate workspace. Link the two to show **Client** and **Sub-account** together on the client profile, client roster and Agency row. - **From Agency:** press **Link to client** on the existing sub-account's row, choose a client, then confirm. **Add client** opens the normal client-creation dialog; after creating the record, confirm the association. - **From a client profile:** under **Their own workspace**, choose an active sub-account from **Link existing sub-account**, then confirm. The sub-account must already belong to this agency. One sub-account can have one associated client record, and a client must be unlinked before choosing another workspace. Linking requires an agency owner or admin with workspace-management permission and permission to edit that client. Linking changes the client association only: it does not create a workspace, move files, migrate onboarding, invite a portal user, change memberships or modify billing settings. The existing workspace keeps its ID and its native owners. The card says **Linked workspace** rather than showing migration progress. **View client** opens the agency's CRM record; **Open workspace** switches into the business's workspace. If the client already has a prepaid wallet, the sub-account's existing wallet rules resolve that wallet through the client association. Linking does not create a wallet or subscription. ##### Unlinking, archiving and detaching are different - **Unlink client** clears only the client-to-workspace association. The client record remains, and the workspace stays an active sub-account with its existing members and agency payer. - **Archive** on the client profile removes the client from active CRM rosters and routines. It does not detach the sub-account. Agency shows **Archived client** beside **Sub-account**; **View client** still opens the archived record, where it can be restored or unlinked. Restore it before making a new association. - **Detach** removes the workspace's agency relationship and clears any associated client pointer. The CRM record, workspace data and native owners remain. Agency-added access and agency billing end. - **Archive** in your personal workspace switcher only hides the workspace for you. It does not unlink the client or detach the workspace. #### Invite your team Open **Settings → Team**, then **Members**. Press **Invite people**, type their email addresses, choose a **Role**, then press **Send invite**. The invitation email comes from your sending domain once you have one and have turned on sending from it (see [Send email from your own domain](https://trycook.ai/docs/send-email-from-your-own-domain)); until then it comes from the platform address, signed with your name. The link in it opens your app domain once you have connected one. #### Templates A template is a workspace's playbooks, routines, pipelines, portal setup and branding, saved once and applied to new sub-accounts. In Settings → General → Organization, press **Save as template** on the workspace you want to copy. Members, clients, conversations and secrets are never part of a template. A sub-account created from a template shows the template's name in the Agency list while it is being applied. #### Give a client their own workspace On a client's page, under **Their own workspace**, press **Give their own workspace**. The client's portal account becomes the owner of a new sub-account, your staff are added as admins, the client's files move in, and the client receives an email with a sign-in link (from your sender, once sending from your domain is on). Their client portal on your workspace keeps working. Press **Open** on the same card to switch into their workspace later. #### History and detaching **History** on a row shows what happened to that sub-account: created, linked, staff synced, opened by your staff, detached. **Suspend** makes a sub-account read-only until you resume it. **Cancel at period end** ends its plan at the end of the period. **Detach** removes access added by the agency link; the workspace keeps its data, owner and pre-existing members. The sub-account's owner can also detach from their own Settings. **Archive** in the account-menu workspace switcher hides a workspace only for you. It does not detach it, delete its data or stop its runtime. ### Give a client their portal https://trycook.ai/docs/client-portal Invite a client to a private portal on your domain, see exactly what they see, and let them follow their onboarding and message your team. #### What the client gets A private sign-in to message your team and follow their project. It is a restricted portal: the client never sees the rest of your workspace. With white-label on, the portal and its emails carry your logo and product name, on your portal domain once you have connected one. #### Invite the client 1. Open the **Clients** tab in the sidebar, choose the client, and find **Client portal** on their page. 2. If the client has no email yet, press **Edit** at the top of the client's page, add their email and press **Save details**. 3. Press **Invite to portal**. The page shows "Sign-in link emailed to …" and then **Portal access active**. Once they have access, the same place offers: - **Invite to onboarding** — emails onboarding credentials. They sign in with the emailed password and walk the onboarding wizard. - **Resend portal invite** — sends the invitation again. - **View as client** — opens a read-only preview of their portal, exactly as they would see it. Messaging is turned off while you view as the client. - **Revoke access** — ends their access. Under **People with access**, **Add a client teammate** gives someone else at the client their own sign-in: type an email (the name is optional) and press **Send invite**. Teammates share the client's portal and channel, with messages attributed to each person. #### What the client receives An email signed with your product name, with an **Open your portal** button. It comes from your sending domain once you have turned on sending from it (see [Send email from your own domain](https://trycook.ai/docs/send-email-from-your-own-domain)); until then it comes from the platform address. On your portal's sign-in page they can press **Email me a sign-in link**, or **Sign in with a password instead**. No password is needed for the link. #### Inside the portal - **Onboarding** — a few quick questions so your team can start getting them results. - **Deliverables** — the work you share with them. - **Channels** — their channel with your team. Their messages appear in the client's channel in your app, where your team replies. - **Chats** — their own assistant. #### Check it Press **View as client** on the client's page. A bar at the top reads "Viewing as … — read-only preview of their portal." Press **Exit** to return. When you ask Cook to change the portal in a chat, the chat opens a **Client portal** panel on the right with the same read-only view. An approved change shows up in it right away. The menu at the top of the panel picks whose portal it shows, and the chat's **Files** list has a **Client portal** row that opens it again after you close it. #### Video walkthroughs Three short videos, one for each person who uses the portal. Each one is also in Spanish. ##### For you: set up and change the portal by chat [Watch it in Spanish](https://www.tella.tv/video/vid_cmujj3pwy000b0agm239g8rvb/view) ##### For your team: answer clients from one place [Watch it in Spanish](https://www.tella.tv/video/vid_cmujj5chk000a0agm1z76hkxv/view) ##### For your clients: send them this one [Watch it in Spanish](https://www.tella.tv/video/vid_cmujj5ijp000i0agmgd072lgj/view) ### Sell a plan that includes a workspace https://trycook.ai/docs/sell-a-plan Sell a monthly or yearly plan on your own Stripe. Paying gives each buyer a workspace of their own under your agency and your brand. #### What happens You put a plan on a funnel page. A buyer pays on your Stripe checkout. Paying creates a workspace of their own under your agency, with the seats, clients and credits you set. The buyer gets a sign-in email from your sending domain (once you have turned on sending from your domain, see [Send email from your own domain](https://trycook.ai/docs/send-email-from-your-own-domain)) and signs in on your app domain, under your brand. Stripe bills the plan every month or every year; you are the merchant of record. #### Before you start - **Connect Stripe.** Open **Agency → Plans & billing** and press **Connect Stripe**. Products, prices and Payment Links then live on your own Stripe. - **A funnel for the plan.** The page buyers land on. See [Building a lead generating asset](https://trycook.ai/docs/funnels). - Optional, and recommended: your own [app domain](https://trycook.ai/docs/team-on-your-own-domain) and [sending domain](https://trycook.ai/docs/send-email-from-your-own-domain), so the buyer's sign-in email and sign-in page carry your name. #### Set up the plan 1. Open the funnel and its **Launch** panel, then **Payments**. 2. Press **+ Add product**. Fill in the **Product name**, **Price** and **Currency**. 3. Turn on **This product is a recurring plan that gives the buyer their own workspace**. 4. Choose **Monthly** or **Yearly**, then set **Credits per month**, **Seats**, **Clients**, **Markup %**, **Grace days** and, if you want one, **Trial days**. You can also name a template to start each new workspace from, and an automatic top-up pack. 5. Save the product. Checkouts run on your Stripe test key until you turn on **Charge live**: no money moves in test mode. Going live needs a live Stripe key. You can also ask the assistant in plain words, for example "set up a monthly plan for $97 with 5 seats and put it on my funnel". Publishing the page waits for your approval. #### What the buyer gets 1. Checkout on your Stripe, for the price you set. 2. An email from your sending domain (or from the platform address, signed with your name, until you turn on sending from your domain): "Your … workspace is ready", with the email address they sign in with and a temporary password to change after their first sign-in. 3. Their own workspace on your app domain. Its assistant greets them by your product's name. #### Where you see it - **Agency → Sub-accounts** lists the buyer's workspace like any other sub-account, with its wallet. - **Agency → Plans & billing** shows, for the last 30 days, what you earned from plans and packs, your MRR, active, new and churned plans, and for each sub-account its revenue, platform cost, margin and wallet. Before you price it, read [What you may charge and advertise](https://trycook.ai/docs/what-you-may-advertise). ### What you may charge and advertise https://trycook.ai/docs/what-you-may-advertise You set your own prices when you resell Cook under your brand. There is one rule about the price you put in public, and one about lifetime deals. #### You set your own prices When you resell Cook under your own brand, what you charge a client is your decision. Your own bill from us does not change with it: you pay for your plan and for everything your sub-accounts use, pooled onto one invoice, whatever you charge on top. Sell a workspace for $47 or for $497 — the margin is yours either way. Two rules bound that freedom, and they are about what the public can see. #### The price you advertise publicly: $97 a month or more Do not advertise access to the platform below **$97 a month** anywhere the public can find it. That covers your website, your funnel pages, your ads, your social posts, your videos and anything a search engine can reach. You may still **sell** below $97. A private price is your business: - a quote you send a client directly - a checkout code they enter at the till - a price that only appears after someone presses "see my price" or adds the plan to a cart - a rate you agreed in a conversation The line is publication, not the number. A $47 plan sold by direct link is fine. The same plan with "$47/mo" on your home page is not. When you ask the assistant to price a plan under the floor, it says so as it saves the plan and tells you what you may still do with it. Saving the price yourself on the **Launch** panel shows no such note. Either way the plan is saved, because the price itself is allowed. #### No lifetime or one-time access to the platform Do not sell lifetime access, a one-time fee for permanent use, or any offer that grants the platform forever for a single payment. Plans are monthly or yearly. If you have a reason to do otherwise, ask us first and get it in writing. #### Why these exist A publicly advertised price teaches the whole market what the software is worth, including the clients of every other agency using it. A private discount costs nobody else anything. Lifetime deals sell a cost that never ends for a payment that does. #### What happens if you break them We will ask you to take the public price down. Repeated or deliberate breaches put your reseller access at risk. We would rather talk first — if a campaign needs an exception, ask. ## When something goes wrong ### The AI model was too busy https://trycook.ai/docs/problems/provider-busy The company that runs the AI model turned the request away because it had too many requests at that moment. #### What happened Cook sends each piece of work to an AI model that another company runs, such as OpenAI, Anthropic or Google. That company turned the request away because it had too many requests at that moment. Cook tried again several times before it stopped. If you connected your own ChatGPT or Claude plan, that plan has its own usage limit, and reaching it has the same result. #### What to do - Wait a few minutes, then try again: send the message again, run the routine again, or give the task to Cook again. - If it keeps happening, choose a different model in the model menu under the message box, then try again. - If your own ChatGPT or Claude plan reached its limit, try again once that plan's limit resets. ### The AI model did not answer https://trycook.ai/docs/problems/provider-down Cook could not get an answer from the company that runs the AI model, even after trying again several times. #### What happened Cook sends each piece of work to an AI model that another company runs. That company's service did not answer: it was down, it returned an error, or it took too long to respond. Cook tried again several times before it stopped. #### What to do - Try again in a few minutes: send the message again, run the routine again, or give the task to Cook again. - If it keeps failing, choose a different model in the model menu under the message box, then try again. - [trycook.ai/status](https://trycook.ai/status) shows whether Cook's own services are running. ### The conversation was too long for the AI model https://trycook.ai/docs/problems/too-long The AI model refused the request because the conversation and its files were more text than it can read at once. #### What happened An AI model can only read a limited amount of text in one request. This conversation, together with its files and earlier messages, was more than the model could take, so the model refused it. #### What to do - Start a new chat and paste in only the part you need. - Send fewer files at once, or smaller ones. - For a long document, ask about one section at a time. ### Your workspace reached its spending limit https://trycook.ai/docs/problems/spend-cap Cook stopped because the workspace reached its AI spend cap, used up its monthly credits, ran out of its agency's tokens, or is unpaid. #### What happened Cook stopped before starting more work. The message it showed says which of these four it was. #### It reached its AI spend cap Every workspace has an AI spend cap: a limit on how much Cook may spend on AI for it in a day or a month. The workspace reached it. A daily cap resets tomorrow (UTC); a monthly cap resets at the start of next month. - A workspace owner can raise the limit on the web in Settings → **Plan**, in the section called **AI spend cap**. Only an owner can change it. - If an agency runs your workspace and pays for it, the agency sets the limit. Ask them to raise it. #### It used up this month's credits The plan's credits for this month are used up. They reset at the start of the next month, on the date the message names. - To continue now, buy a credit pack from the card under the message, or in Settings → **Plan**. - If your workspace shares its credits with an agency's other accounts, the agency buys more. Ask them. #### Your agency's tokens ran out Your workspace is run by an agency, and the agency's tokens are used up. Work is paused until the agency adds more. Ask them. #### The workspace is read-only The workspace's subscription is unpaid, so it is read-only until it is paid. Everything is kept. Pay it in Settings → **Plan**, or, if an agency runs your workspace, ask the agency. #### Then try again Send the message again, run the routine again, or give the task to Cook again. ### A connected account needs reconnecting https://trycook.ai/docs/problems/reconnect An account you connected to Cook refused the request, usually because its sign-in expired, changed or was removed. #### What happened This work used an account you connected to Cook, such as your own ChatGPT or Claude plan, or a tool like ClickUp or Gmail. That account refused the request. This usually means its sign-in expired, its password or permissions changed, or the connection was removed. #### What to do - Open **Skills & Plugins** from your profile menu, choose the **Plugins** tab, find that account, and connect it again. If it was your Claude plan, Cook shows its own **Reconnect Claude** prompt. - Then try again: send the message again, run the routine again, or give the task to Cook again. ### The work took longer than Cook allows https://trycook.ai/docs/problems/took-too-long Cook gives each step of a job a time limit, and this step reached it before it finished. #### What happened Cook gives each step of a job a time limit, so that one stuck step cannot keep running forever. This step reached its limit before it finished. #### What to do - Split the job into smaller parts and ask for them one at a time. - If the step was waiting on a slow website or a very large file, try again later. ### Cook had a problem on its side https://trycook.ai/docs/problems/cook-error Something inside Cook failed while it worked on this. Nothing you did caused it. #### What happened Something inside Cook failed while it worked on this, or the work stopped before Cook could record why. Nothing you did caused it. #### What to do - Try again: send the message again, run the routine again, or give the task to Cook again. - If it fails the same way again, email [austin@clientacquisition.io](mailto:austin@clientacquisition.io) with the link to the chat or task, so the team can look at what happened. ### Getting help from a person https://trycook.ai/docs/support How to reach the Cook team when something does not work, and what to include so we can answer the first time. Email **austin@clientacquisition.io**. A person on the Cook team reads every message. #### What to include - The name of your workspace. - What you were doing, and what you expected to happen. - What happened instead: the exact message on screen, or a screenshot. - The page address from your browser, if the problem is on one page. For a connected account (Zoom, Slack, Gmail and others), say which one and which email address it is connected as. #### Before you write These pages answer the most common problems on their own: - [A connected account needs reconnecting](https://trycook.ai/docs/problems/reconnect) - [Putting a Zoom link on every booking](https://trycook.ai/docs/connect-zoom) #### Restore a deleted workspace A deleted workspace is kept for 7 days. The date it is removed for good is in the message you saw when you deleted it. To get it back, email **austin@clientacquisition.io** before that date, with the name of the workspace. It comes back as it was: chats, agents, clients, files and routines. #### Privacy and data requests Requests to see, correct or delete your data go to the same address. The [privacy policy](https://trycook.ai/privacy) explains what we keep and for how long. A deleted workspace is kept for 7 days so it can be restored, then erased. If it must be erased sooner, say so in your email and we erase it right away. ## Move from another tool ### Keep your scripts when you move to Cook (compatible APIs) https://trycook.ai/docs/compat Cook answers the APIs of the tools it replaces. Point a script, a Zapier code step or a vendor SDK at Cook's address, give it a Cook key, and it keeps working. When you move a tool's work into Cook, the scripts, automations and SDK code you wrote against that tool don't have to be rewritten. Cook answers the same API at its own address. You change two things: the address the script calls, and the key it sends. | Tool | Its address | Cook's address | Page | |---|---|---|---| | Calendly | `https://api.calendly.com` | `https://api.trycook.ai/compat/calendly` | [Calendly](https://trycook.ai/docs/compat/calendly) | | Typeform | `https://api.typeform.com` | `https://api.trycook.ai/compat/typeform` | [Typeform](https://trycook.ai/docs/compat/typeform) | | GoHighLevel | `https://services.leadconnectorhq.com` | `https://api.trycook.ai/compat/ghl` | [GoHighLevel](https://trycook.ai/docs/compat/ghl) | Everything after the address stays as the tool documents it: the paths, the query parameters, the request and response bodies, the page tokens, the error bodies and the webhook payloads. #### The key Make a key in Cook under **Settings → API keys**. It starts with `ck_live_`. Send it wherever the tool's own key went; Cook reads it from any of these: - `Authorization: Bearer ck_live_…` (what Calendly's and GoHighLevel's docs and Typeform's SDK send) - `Authorization: ck_live_…` - `X-Api-Key: ck_live_…` - an `api_key` or `access_token` query parameter The key decides the workspace. Everything the script reads or writes is in the workspace the key was made in, and the key's permissions apply: a key that may only read leads can't book or delete anything through these APIs either. #### What you get back - **Ids.** Records you imported keep the ids they had in the other tool, so an id your script saved still finds the same record. Records made in Cook get an id in the other tool's format the first time an API returns them, and keep it. - **Links that carry an address.** Where the tool puts its own address inside a response (Calendly's `uri`, Typeform's `self.href`), Cook puts `https://api.trycook.ai/compat/` there. Cook also accepts the other tool's address in anything you send it, so a saved `https://api.calendly.com/users/…` still works as a filter. - **Errors** come back in the tool's own error body and status codes, so the tool's SDK raises the same errors it always did. - **Limits.** Each key may make 300 calls a minute, with bursts up to 600. Past that the answer is `429` with a `Retry-After` header, plus the rate-limit headers the tool itself sends. #### Webhooks Webhooks you register through these APIs are sent the way the tool sends them: the same event names, the same payloads, signed with the tool's scheme and the secret you gave, and retried on the tool's schedule. They fire for every change in Cook, whatever made it: a booking on a Cook booking page, a form filled on your site, or a change made in Cook itself. #### Using it from an AI agent (Cook MCP) What a script makes through these APIs is Cook's own data, so an AI agent on Cook's MCP reaches it with Cook's tools. It needs no import and no token from the other tool. | Made through | In Cook it is | The Cook MCP tool | |---|---|---| | Typeform's API (`/compat/typeform`) | A Cook form, and each response is a lead | `form_list` and `form_get` for the form, `lead_list` for its responses | | Calendly's API (`/compat/calendly`) | A Cook meeting on a Cook booking page | `meeting_list` | | `POST /invitee_no_shows` | The meeting's No-show outcome | `meeting_mark_no_show` (and `meeting_unmark_no_show` for `DELETE /invitee_no_shows/{uuid}`) | | An invitee's `reschedule_url` | The booking's own manage link | `rebookUrl` on each meeting in `meeting_list` | | GoHighLevel's API (`/compat/ghl`) contacts | Cook leads | `lead_list` | | GoHighLevel's API opportunities | A lead's place in a pipeline: pipeline, stage, value, status | `pipeline_view` to read, `lead_set_opportunity` to create or move one | The `ghl_*` tools are for a GoHighLevel account the workspace has connected, not for contacts and opportunities made through `/compat/ghl`. `import_start` is only for an account on the other tool itself, and asks for that tool's token. Whether a text or an email to a lead goes out at once or waits for a person to approve it is decided by the workspace's approval rules (`approval_rules`). ### Calendly's API on Cook https://trycook.ai/docs/compat/calendly Keep your Calendly scripts. Point them at Cook's Calendly address with a Cook key, and your event types, bookings, invitees and webhooks answer the way Calendly's do. Cook answers Calendly's API v2. A script that lists bookings, books invitees, creates event types or listens for `invitee.created` webhooks keeps working when you point it at Cook. Your event types are Cook booking pages, your bookings are Cook meetings, and the people who book become leads in your Cook workspace. An AI agent on Cook's MCP finds these bookings with `meeting_list` (each with its `reschedule_url` as `rebookUrl`) and marks a no-show with `meeting_mark_no_show`; see [Using it from an AI agent](https://trycook.ai/docs/compat#using-it-from-an-ai-agent-cook-mcp). #### The switch: two lines Change the address and the key. Nothing else changes. ``` Base URL: https://api.trycook.ai/compat/calendly Authorization: Bearer ck_live_… ``` Make the key in Cook under **Settings → API keys**. The key decides the workspace, and its permissions decide what the script may do (see [the compat overview](https://trycook.ai/docs/compat)). Use an account key (one made for a person) when the script reads the team or changes event types; see [Approvals](#approvals). Everything after the address is as Calendly documents it: the paths, query parameters, request and response bodies, pagination (`count` up to 100, `page_token`, `next_page`) and the error body (`{ "title", "message", "details" }` with Calendly's titles). One thing to take from Cook rather than from Calendly: the URIs. Start with `GET /users/me`. Its `uri` and `current_organization` are on Cook's address (`https://api.trycook.ai/compat/calendly/users/…`), and that is what you pass as `user=` and `organization=`. Filters and bodies also accept a URI on `api.calendly.com` or any other host: Cook matches the id at its end. The ids are Cook's own, so a Calendly id only matches for meetings Cook synced from your Calendly account, which keep their Calendly ids. #### What Cook answers **Supported** means it behaves as Calendly documents it. **Partial** says what differs. **Not supported** answers Calendly's error and says why. | Calendly call | On Cook | Notes | |---|---|---| | `GET /users/me` | Supported | An account key gets its own person; a workspace key gets the workspace owner. `scheduling_url` is the person's own Cook page, `…/book/u/`: it lists every live booking page they host, like Calendly's own user page, and says they have nothing to book yet when they host none. | | `GET /users/{uuid}` | Supported | Other people on the team need an account key. | | `GET /organizations/{uuid}` | Partial | Your Cook workspace. `plan` is always `teams` and `stage` always `paid`: Cook's API is for paid workspaces. | | `GET /organization_memberships` | Supported | Account key. Filters `organization`, `user`, `email`, `role`. Clients in your workspace are not members. | | `GET /organization_memberships/{uuid}` | Supported | Account key. | | `DELETE /organization_memberships/{uuid}` | Supported | With a key made with `team:manage`, removes the member at once and answers `204`. Any other key files an approval card and gets `403` naming it (see [Approvals](#approvals)). An owner can't be removed. | | `GET /organizations/{uuid}/invitations`, `GET /organizations/{org_uuid}/invitations/{uuid}` | Supported | Account key. Filters `status`, `email`; sort `created_at`. A rejected invitation reads as `declined`; a revoked one is left out. | | `POST /organizations/{uuid}/invitations` | Supported | With a key made with `team:manage`, Cook sends the invitation at once and answers `201` with it (`pending`). Any other key files an approval card and gets `403` naming it: Cook never reports an invitation as sent before a person approves it. | | `DELETE /organizations/{org_uuid}/invitations/{uuid}` | Supported | With a key made with `team:manage`, revokes a pending invitation and answers `204`. Any other key gets `403`: revoke it in Cook under **Settings → Team**. | | `GET /event_types` | Supported | Filters `organization`, `user`, `active`, `admin_managed`, `user_availability_schedule`; sort `name`, `position`, `created_at`, `updated_at`. Shares and one-off event types are not listed, as on Calendly. | | `GET /event_types/{uuid}` | Supported | Also reads shares and one-off event types. | | `POST /event_types` | Partial | Makes a Cook booking page for the `owner` and publishes it (unless `active: false`). One duration (`duration_options` may only repeat it), one location (see [Locations](#locations)), `locale` `en`. | | `PATCH /event_types/{uuid}` | Partial | `name`, `description`, `duration`, `locations` go through the workspace's approval rule; `active` applies at once. `color` answers `400`: change it in Cook. Shares and one-offs answer `403`. | | `POST /one_off_event_types` | Partial | See [Links, shares and one-offs](#links-shares-and-one-offs). | | `GET /event_type_available_times` | Supported | Up to 7 days per call, as on Calendly. Uses the page's hours, calendar, buffers and minimum notice; `invitees_remaining` counts seats on a group page. | | `GET /event_type_memberships` | Supported | The page's hosts that are on your team (the owner when it has none). | | `GET /event_type_availability_schedules` | Supported | The schedule the page follows, or its own hours. | | `PATCH /event_type_availability_schedules` | Partial | Weekly (`wday`) rules and the time zone, through the workspace's approval rule. Date rules answer `400` (set date overrides in Cook). A page that follows a shared schedule answers `403`: change that schedule in Cook. | | `GET /scheduled_events` | Supported | Meetings from every source: Cook booking pages, your AI setter, synced calendars and Calendly. Filters `user`, `organization`, `invitee_email`, `status`, `min_start_time`, `max_start_time`; sort `start_time`. Private meetings are left out. `group` answers `404`: Cook has no groups. | | `GET /scheduled_events/{uuid}` | Supported | | | `POST /scheduled_events/{uuid}/cancellation` | Partial | Cancels the meeting the way Cook does, then answers `201` once it reads as canceled. A meeting with no lead in Cook answers `403`; so does one your AI setter's settings route to an approval card (naming the card). | | `GET /scheduled_events/{uuid}/invitees`, `GET /scheduled_events/{event_uuid}/invitees/{invitee_uuid}` | Supported | One invitee per scheduled event. `questions_and_answers` are the booking's answers; `cancel_url` and `reschedule_url` are the booker's own manage link. | | `POST /invitees` | Partial | Books through the booking page itself, so the lead, the meeting, the calendar event, reminders and webhooks are exactly what a booking on the page makes. `event_guests` answers `400`. A taken time answers `400` on `start_time`. An invitee the page's qualification rules turn away answers `400`, and the lead is still captured. | | `POST /invitee_no_shows` | Partial | Marks the meeting's outcome No-show in Cook (routed the way Cook routes a no-show). A canceled meeting answers `400`. | | `GET /invitee_no_shows/{uuid}` | Supported | | | `DELETE /invitee_no_shows/{uuid}` | Supported | Puts back the outcome the meeting had before. | | `POST /scheduling_links` | Supported | A single-use link (`max_event_count: 1`). | | `POST /shares` | Partial | See [Links, shares and one-offs](#links-shares-and-one-offs). | | `GET /webhook_subscriptions`, `POST /webhook_subscriptions` | Partial | Scope `organization` or `user`; `group` answers `400`. See [Webhooks](#webhooks). | | `GET /webhook_subscriptions/{webhook_uuid}`, `DELETE /webhook_subscriptions/{webhook_uuid}` | Supported | | | `GET /sample_webhook_data` | Partial | Built from your newest real meeting in that scope; `404` when there is none yet. | | `GET /user_availability_schedules`, `GET /user_availability_schedules/{uuid}` | Partial | Your workspace's named schedules (the whole team shares them), then the own hours of each page the person hosts. | | `GET /user_busy_times` | Partial | Up to 7 days. The meetings in Cook the person hosts, including ones synced from a connected calendar (type `external`). Other busy time on that calendar is not included. | | Contacts (`/contacts`, `/contacts/custom_field_definitions`) | Not supported | `404`. Your bookers are leads in Cook's CRM; reach them with Cook's own API. | | Routing forms (`/routing_forms`, `/routing_form_submissions`) | Not supported | `404`. Cook booking pages route with their own questions and rules. | | Groups and teams (`/groups`, `/group_relationships`, `/teams`) | Not supported | `404`. A Cook workspace has one team. | | Meeting recaps (`/meeting_recaps`) | Not supported | `404`. Cook keeps call recordings and notes on the meeting in Cook. | | `/activity_log_entries`, `/outgoing_communications` | Not supported | `404`. | | `/locations` | Not supported | `404`. Locations are set per event type (see [Locations](#locations)). | | Data compliance (`/data_compliance/deletion/invitees`, `/data_compliance/deletion/events`) | Not supported | `404`. Delete a lead or a meeting in Cook. | #### Approvals Some Calendly calls change things a person in your workspace may want to see first. Cook decides them with your workspace's approval rules, the same ones that decide what Cook's AI may do, under **Settings → Approvals**. - **Event type changes** (`PATCH /event_types/{uuid}` and `PATCH /event_type_availability_schedules`) follow the rule **Edit / delete event types** (`booking.*`). With an account key whose person's role is allowed to run it without a card (for example the rule set to run without a card for owners, and the key made by an owner), the change applies and Cook answers `200` with the changed event type. - **Otherwise** Cook files an approval card and answers `403` naming it. Nothing changes until a person approves the card in Cook: ```json { "title": "Permission Denied", "message": "Cook changes a booking page through an approval card: card … waits for a person in Cook, and nothing changes until it is approved." } ``` - **Workspace keys** (not made for a person) always get the card. - **Team changes** (`POST /organizations/{uuid}/invitations`, `DELETE /organization_memberships/{uuid}`) wait for a person, whatever the rules say, and answer `403` naming the card, unless the key was made with **Can invite and remove teammates without an approval card** (the `team:manage` scope, Cook → **Settings → API keys**, owners and admins only). Such a key invites, revokes invitations and removes members at once, as its person, with the checks **Settings → Team** runs (seat limit, owners, agency staff); Cook's audit log names the key for each change. - **No card needed:** creating an event type, turning one on or off (`active`), booking with `POST /invitees`, no-shows, links, shares, one-offs and webhooks. #### Ids and URIs - Every object's `uri` is on Cook's address, for example `https://api.trycook.ai/compat/calendly/scheduled_events/…`. Nested references are URIs too, as on Calendly. - Users, organizations, event types, memberships and invitations have 16-character ids (`AFEHBEDFE6WUE2R7`). Scheduled events, invitees, no-shows, availability schedules and webhook subscriptions have UUIDs. - An object gets its id the first time Cook returns it, and keeps it. - Meetings Cook synced from your Calendly account keep their Calendly event and invitee ids. #### Webhooks `POST /webhook_subscriptions` with `url`, `events`, `organization`, `scope` (and `user` for user scope). The URL must be a public `https` address. The same URL twice in one scope answers `409`. | Event | Sent when | |---|---| | `invitee.created` | A meeting is booked: on a Cook booking page, by `POST /invitees`, by your AI setter, or synced in. | | `invitee.canceled` | A meeting is canceled. `canceler_type` is `invitee` when the booker canceled from their manage link, else `host`. | | `invitee_no_show.created` | A meeting is marked No-show. | | `invitee_no_show.deleted` | A No-show is removed: by `DELETE /invitee_no_shows/{uuid}`, or when the meeting's outcome in Cook changes from No-show to completed. | - **The body** is Calendly's: `event`, `created_at`, `created_by` and `payload`, the invitee with its `scheduled_event` inside. - **A reschedule** sends what Calendly sends: `invitee.canceled` with `rescheduled: true` and `new_invitee`, then `invitee.created` with `old_invitee`. - **User scope** hears only meetings that person hosts. - **Signing.** Give the subscription a `signing_key` and each delivery carries `Calendly-Webhook-Signature: t=,v1=`, where the signature is the hex HMAC-SHA256 of `.` with your signing key, as Calendly signs. Without a signing key there is no header. - **Retries.** A failed delivery is retried after 1 minute, then twice as long each time, at most 4 hours apart. After 24 hours of failures the subscription's `state` becomes `disabled` and you make it again. Your server has 15 seconds to answer. #### Links, shares and one-offs Each of these is a link of its own to one of your booking pages. Its `booking_url` (or `scheduling_url`) is a Cook link, `…/book/`, and the booking page there applies the link's settings at every step: the times it offers, the booking, the meeting's name and length, and the calendar event. - **`POST /scheduling_links`** makes a single-use link to an event type. After one booking the link stops working. A canceled booking doesn't give it back, as on Calendly. - **`POST /shares`** makes a customized copy of an event type with its own link: `name`, `duration` (one), `period_type` (`fixed` with `start_date` and `end_date`; `moving` or `available_moving` with `max_booking_time` in days; `unlimited` offers times up to a year ahead), one entry in `location_configurations`, and `availability_rule` (weekly and date rules with a time zone). `hide_location: true` answers `400`: Cook booking pages show their location. The response's `scheduling_links[0].owner` is the share's own event type, which `GET /event_types/{uuid}` reads. - **`POST /one_off_event_types`** makes a one-off event type (`AdhocEventType`) with its own `name`, `duration`, `timezone`, `location`, `co_hosts` and `date_setting` (`date_range`, `days_in_future` with `only_weekdays`, or `spots`). It is held on the host's first live booking page, whose questions and calendar it uses, so a host with no live booking page answers `400`. A `date_range` one-off offers times only between its dates, and a `spots` one-off only at its spots; after that it takes no bookings. - Shares and one-offs are fixed once made: `PATCH` on them answers `403`. Make a new one instead. #### Locations A Cook booking page has one location. `locations` (on event types), a one-off's `location` and a share's `location_configurations` take one of these: | Calendly `kind` | What the booker gets | |---|---| | `google_conference`, `zoom_conference`, `microsoft_teams_conference` | A meeting link made for each booking on your connected calendar (or Zoom). | | `custom` | Your `location` text. | | `physical` | Your address (`location`). | | `inbound_call` | "Phone call: call" and your `phone_number`. | | `outbound_call` | "Phone call: the host calls you". The scheduled event's location is the phone number the booking captured, if any. | | `ask_invitee` | Your `location` text. Cook doesn't ask the booker for a place. | `gotomeeting_conference` and `webex_conference` answer `400`: Cook doesn't create those calls. More than one location answers `400`. The kind you set reads back as you set it, until someone changes the location in Cook. #### Gotchas - **`calendar_event` is `null`** when Cook made no calendar event for the meeting, which is the case when your workspace has no booking calendar connected. With Google Calendar connected it is `{ "kind": "google" }`; with a calendar connected through Cook's calendar connection it names that calendar's provider. - **Cancellation takes a moment.** `POST /scheduled_events/{uuid}/cancellation` answers once the meeting reads as canceled, up to about 10 seconds. If it takes longer, the answer is a `500` saying the cancellation is still being applied: read the event again shortly. - **Reschedules keep the same URIs.** Cook moves the meeting rather than making a new one, so `old_invitee` and `new_invitee` in the webhooks point at the same invitee. - **Group events.** On a booking page with more than one seat, each booking is its own scheduled event with one invitee. `invitees_remaining` in the available times still counts the seats left. - **Some fields can be `null`.** `event_type` on a meeting that didn't come from a booking page or from Calendly; `cancel_url` and `reschedule_url` when the meeting has no manage link. - **Colour.** An event type with no colour set reads as `#8247f5`, the colour Cook shows for it. - **Limits.** Cook's own limits apply: 300 calls a minute per key, with bursts up to 600, then `429` with `Retry-After` and Calendly's `X-RateLimit-Limit`, `X-RateLimit-Remaining` and `X-RateLimit-Reset` headers. - **Plan.** A workspace without a paid plan gets `403` (Calendly never sends `402`). #### What can't move - **Calendly links.** Links on `calendly.com` keep pointing at Calendly. Share the Cook link instead: an event type's `scheduling_url`, or a link from `POST /scheduling_links` or `POST /shares`. - **Embeds.** Calendly's `widget.js` embed and its inline, popup and badge widgets are not provided. Use the Cook booking page's link, or show it on a Cook page. - **Payments.** Stripe and PayPal payment on booking stays in Calendly; `payment` on an invitee is always `null`. - **Calendly Workflows.** Its reminder and follow-up workflows don't come along. Cook booking pages send their own reminders, and Cook routines and the webhooks above take the place of the rest. - **Routing forms, contacts and meeting recaps.** They stay in Calendly (see the table above for what Cook uses instead). ### Typeform's API on Cook https://trycook.ai/docs/compat/typeform Keep your Typeform scripts and SDK code. Point them at Cook's Typeform address with a Cook key, and your forms, responses and webhooks answer the way Typeform's do. Cook answers Typeform's Create, Responses and Webhooks APIs. A script that creates forms, reads responses or listens for `form_response` webhooks keeps working when you point it at Cook. Your forms then live in Cook, and the people who fill them in become leads in your Cook workspace. An AI agent on Cook's MCP finds these forms with `form_list` and their responses as leads, with no import; see [Using it from an AI agent](https://trycook.ai/docs/compat#using-it-from-an-ai-agent-cook-mcp). #### The switch: two lines Change the address and the key. Nothing else changes. ``` Base URL: https://api.trycook.ai/compat/typeform Authorization: Bearer ck_live_… ``` Make the key in Cook under **Settings → API keys**. The key decides the workspace, and its permissions decide what the script may do (see [the compat overview](https://trycook.ai/docs/compat)). With Typeform's official JavaScript SDK (`@typeform/api-client`), it is one line: ```js const typeform = createClient({ token: "ck_live_…", apiBaseUrl: "https://api.trycook.ai/compat/typeform" }); ``` Everything after the address is as Typeform documents it: the paths, query parameters, request and response bodies, page sizes and the error body (`{ "code", "description", "details" }`). #### What Cook answers **Supported** means it behaves as Typeform documents it. **Partial** says what differs. **Not supported** answers Typeform's error and says why. | Typeform call | On Cook | Notes | |---|---|---| | `GET /me` | Supported | The key's person (or the workspace's name for a workspace key). | | `GET /forms` | Supported | `page`, `page_size` (up to 200), `search`, `workspace_id`, `is_public`, `sort_by`, `order_by`. | | `POST /forms` | Partial | Creates a Cook form. Field types Cook can't collect are refused (see [Field types](#field-types)). The new form gets a new Typeform-style id; field ids you send are kept. | | `GET /forms/{form_id}` | Supported | Reads back what you wrote, including refs, choice ids, descriptions and welcome screens. | | `PUT /forms/{form_id}` | Partial | Replaces the form. Field ids and refs are kept. Same field rules as `POST`. | | `PATCH /forms/{form_id}` | Supported | JSON Patch on `/title`, `/theme`, `/workspace` and `/settings/is_public`, `/settings/meta`, `/settings/facebook_pixel`, `/settings/google_analytics`, `/settings/google_tag_manager`, `/settings/enrichment_in_renderer`, `/settings/email_consent_notifications_config`. | | `DELETE /forms/{form_id}` | Partial | Deletes the form and its responses (`204`) for an owner's or admin's key, or a workspace key. Any other key gets `202` and an approval card (see [Gotchas](#gotchas)). | | `GET /forms/{form_id}/responses` | Supported | Every Typeform filter: `page_size` (up to 1000), `since`, `until`, `after`, `before`, `included_response_ids`, `excluded_response_ids`, `response_type`, `completed`, `sort`, `query`, `fields`, `answered_fields`. | | `POST /forms/{form_id}/responses/search` | Supported | `filter_group` with `equals`, `any_of`, `interval`, `contains` on `response_id`, `timestamp`, `tags`, `answers.{field_id}`, `metadata.{key}`, `hidden.{key}`; `sort`, `size`, `query`. | | `DELETE /forms/{form_id}/responses` | Partial | `included_response_ids` or `included_tokens`, up to 1000. Needs an owner's or admin's key, or a workspace key; other keys get `403`. | | `GET /forms/{form_id}/responses/files` | Supported | Answers `204` ("no file upload fields in the form"), as Typeform does for such a form. Cook forms have no file upload field, so there are never files. | | `GET /forms/{form_id}/responses/{response_id}/fields/{field_id}/files/{filename}` | Not supported | `404`: Cook forms collect no files. | | `GET /forms/{form_id}/webhooks` | Supported | | | `GET /forms/{form_id}/webhooks/{tag}` | Supported | | | `PUT /forms/{form_id}/webhooks/{tag}` | Supported | Create or update. The URL must be public `https`. | | `DELETE /forms/{form_id}/webhooks/{tag}` | Supported | | | `GET /forms/{form_id}/webhooks/{tag}/deliveries` | Supported (Cook extra) | The hook's delivery log, newest first. Typeform shows this only in its admin. | | `GET /workspaces`, `GET /accounts/{account_id}/workspaces` | Supported | | | `GET /workspaces/{workspace_id}` | Supported | Members are your Cook workspace's team, when the key may read the team. | | `POST /workspaces`, `POST /accounts/{account_id}/workspaces` | Supported | Makes a folder for forms (see [Gotchas](#gotchas)). | | `PATCH /workspaces/{workspace_id}` | Partial | Renames a workspace made here. Changing `/members` answers `403`: invite and remove people in Cook. | | `DELETE /workspaces/{workspace_id}` | Partial | Only an empty workspace you made here; the default one can't be deleted (`403`). | | Images API (`/images`) | Not supported | Cook keeps no Typeform image library. Pictures on choices are taken as `https` links. | | Themes API (`/themes`) | Not supported | Cook's hosted form uses your workspace's brand, not Typeform themes. A form's `theme.href` is stored and read back, but there is no `/themes` route. | | Custom messages (`/forms/{form_id}/messages`) | Not supported | Cook's hosted form has its own wording. | | Translations (`/forms/{form_id}/translations`) | Not supported | Cook forms have one language. | | Insights (`/insights/{form_id}/summary`) | Not supported | Cook shows views and submission counts on the form in Cook. | #### Field types These Typeform field types work in both directions: a script writes them and reads them back as the same type, ref and choices. | Typeform type | Cook stores it as | |---|---| | `short_text` | text (or a ZIP code field made in Cook) | | `website` | text | | `long_text` | long text | | `email` | email | | `phone_number` | phone | | `number` | number | | `dropdown` | dropdown | | `multiple_choice` | single choice | | `picture_choice` | single choice with a picture link on each choice | | `yes_no` | single choice with the answers Yes and No | | `legal` | checkbox | | hidden fields (`hidden: [...]`) | hidden field | Cook can't collect these, so a form that has one is refused: `calendly`, `checkbox`, `contact_info`, `date`, `file_upload`, `google_calendar`, `group`, `matrix`, `multi_format`, `nps`, `opinion_scale`, `payment`, `ranking`, `rating`, `signature`, `statement`, `address`, `inline_group`. The answer is Typeform's validation error, naming the field: ```json { "code": "VALIDATION_ERROR", "description": "The request is not valid", "details": [ { "code": "NOT_ALLOWED_VALUE", "description": "Cook forms cannot collect a \"file_upload\" field (\"Upload your logo\")", "field": "/fields/3/type", "in": "body" } ] } ``` Also refused with the same kind of error, because Cook's form would not do what the script asked: - `allow_multiple_selection: true` (a Cook choice question takes one answer) - `allow_other_choice: true` (Cook has no "Other" answer) - the validations `max_length`, `min_value`, `max_value`, `min_selection`, `max_selection` (Cook doesn't enforce them); `required` works - logic that does anything but jump to an ending: Cook asks every question, and it doesn't calculate variables, so `calculated.score` is always `0`. Jump conditions may use `is`, `equal`, `is_not`, `not_equal`, `contains`, `greater_than`, `lower_than`, `always` and `and`. - more than 30 fields (hidden fields count), a question longer than 120 characters, more than 25 choices or a choice longer than 120 characters, a form title longer than 80 characters - a hidden field name that isn't lower-case letters, digits and `_` (up to 40) #### Webhooks A `form_response` webhook fires each time someone submits the form, however they reached it: the form's link, a page that shows the form, or a form filled on your site. The body is Typeform's: `event_id`, `event_type`, and `form_response` with `form_id`, `token`, `landed_at`, `submitted_at`, `hidden`, `calculated`, `definition`, `answers` and `ending`. The `token` and the answers are the same ones the responses API returns for that response. - **Signing.** Give the hook a `secret` and each delivery carries `Typeform-Signature: sha256=`, where the signature is the base64 HMAC-SHA256 of the raw body with your secret, as Typeform signs. Your existing check works unchanged. - **Retries**, on Typeform's schedule. A `404` or `410` from your server switches the hook off. A `429`, `408`, `503` or `423` is retried every 2 to 3 minutes for up to 10 hours. Any other failure is retried 5 times, after 5 minutes, 10 minutes, 20 minutes, 1 hour and 2 hours, then given up. Your server has 30 seconds to answer. - **Creating and toggling.** `PUT` without `event_types` listens for `form_response`. A `PUT` that sends only `{ "enabled": false }` (the SDK's toggle) keeps the URL and secret. A new hook is off until you send `enabled: true`, as on Typeform. - **`form_response_partial`.** You can subscribe to it and it reads back as subscribed, but it never fires: Cook keeps only submitted responses, so there are no partial ones to send. - **The URL** must be a public `https` address. An `http` URL answers `400` with code `webhook_url_https_required`. #### Gotchas - **Deleting a form with a key that isn't an owner's or admin's.** Cook doesn't delete it. It files an approval card in the workspace, the same card Cook's AI files, and answers `202`: ```json { "status": "pending_approval", "description": "Cook filed an approval card to delete this form and its responses; the form is deleted when a person in the workspace approves it.", "approval_id": "…" } ``` The form stays until someone approves the card. A script that expects `204` should use an owner's or admin's key, or a workspace key. - **Workspaces.** Your Cook workspace is one Typeform account. Its default Typeform workspace is the Cook workspace itself: it can't be renamed or deleted through the API. `POST /workspaces` makes extra workspaces that only group forms for the API; Cook itself shows all forms together. Members are your Cook team (owners and admins read as `owner`, everyone else as `member`). - **Response ids.** `token`, `response_id` and `landing_id` are the same value, a Typeform-style id Cook gives each submission and keeps. Use it for `included_response_ids`, `after`, `before` and deletes. - **No partial or started responses.** `response_type=partial`, `response_type=started` and `completed=false` return an empty list. - **Times.** `landed_at` equals `submitted_at`: Cook records when the form was sent, not when the page opened. New responses show up at once, without the half-hour delay Typeform warns about. - **Big forms.** One read of the responses API looks at up to 4,000 of the form's newest submissions in the time window you give. For more, page with `since` and `until`. - **What Cook's hosted form shows.** Refs, choice ids, field descriptions, welcome screens, the theme and settings Cook has no use for are stored so the API reads back what you wrote, but the form people fill in on Cook doesn't show them. `settings.is_public` is whether the form is live: when it's `false`, the form's link stops taking submissions. - **The form's link.** `_links.display` is the form's Cook link (`…/f/`), not a `form.typeform.com` address. - **Limits.** Cook's own limits apply: 300 calls a minute per key, with bursts up to 600, then `429` with `Retry-After`. #### What can't move - **Links and embeds.** Typeform links (`form.typeform.com/to/…`) and Typeform embed codes on your site keep pointing at Typeform. Paste the Cook form's link (`_links.display`) or show the form on a Cook page instead. - **Past responses.** Typeform's API has no way to write responses, so a script can't copy old ones in through this API. - **File uploads and payments.** Cook forms collect neither, so forms that use them need another way to collect those. - **Partial responses, calculated scores and branching between questions.** Cook keeps submitted responses only, doesn't score, and asks every question; jumps can only go to an ending. - **Typeform's look.** Themes, custom messages and translations stay in Typeform. Your Cook form uses your workspace's brand. - **Typeform's own integrations.** Its native Google Sheets, HubSpot and similar connections don't come along. Webhooks you register here, and Cook's CRM, take their place. To bring a form over yourself, read it from Typeform (`GET /forms/{form_id}` at `api.typeform.com`) and send the same body to Cook's `POST /forms`. It is accepted as long as its field types are ones Cook can collect. ### GoHighLevel's API on Cook https://trycook.ai/docs/compat/ghl Keep your GoHighLevel scripts. Point them at Cook's GoHighLevel address with a Cook key, and your contacts, opportunities, conversations, calendars and users answer the way GoHighLevel's API does. Cook answers GoHighLevel's API v2 (LeadConnector, `services.leadconnectorhq.com`). A script that creates contacts, moves opportunities, logs messages, books appointments or reads your team keeps working when you point it at Cook. A GoHighLevel location is your Cook workspace, contacts are Cook leads, opportunities are a lead's place in a pipeline, calendars are Cook booking pages, appointments are Cook meetings and users are the people on your team. #### The switch: two lines Change the address and the key. Nothing else changes. ``` Base URL: https://api.trycook.ai/compat/ghl Authorization: Bearer ck_live_… Version: 2021-07-28 ``` Make the key in Cook under **Settings → API keys**. The key decides the workspace, and its permissions decide what the script may do (see [the compat overview](https://trycook.ai/docs/compat)). Use an account key (one made for a person) for the team calls; see [Approvals](#approvals). - **`Version` header.** Required, as on GoHighLevel. Cook accepts `2021-07-28`, `2021-04-15`, `2023-02-21`, `v3` and `legacy`. A missing one answers `401` "version header was not found."; any other value answers `401` "version header is invalid". - **Your `locationId`.** Your workspace has a GoHighLevel-shaped location id (20 letters and digits) and a company id. Read them once with `GET /locations/search`: `locations[0].id` is your `locationId`, `locations[0].companyId` your `companyId`. Pass them wherever GoHighLevel asks for them. Another location's id answers `403` "The token does not have access to this location."; another company's id answers `401` "The token does not have access to this company.". Everything after the address is as GoHighLevel documents it: the paths, query parameters, request and response bodies, `succeded` spelled as GoHighLevel spells it, and the error body (`{ "statusCode", "message", "error" }`; a `422` carries `message` as a list of reasons). A path Cook doesn't answer is a `404` `"Cannot /"`. #### What Cook answers **Supported** means it behaves as GoHighLevel documents it. **Partial** says what differs. **Not supported** says why. ##### Locations | GoHighLevel call | On Cook | Notes | |---|---|---| | `GET /locations/search` | Supported | Your one location. `email` filters on the workspace's email. | | `GET /locations/{locationId}` | Partial | Name, email, website, logo and timezone: your default availability schedule's, else the time zone Cook last saw you chat from, else `UTC`. `settings` says one contact per email or phone and one opportunity per contact. | | `POST /locations/`, `PUT` and `DELETE /locations/{locationId}` | Not supported | `404`. Make and remove workspaces in Cook. | | `/locations/{locationId}/timezones`, `/templates`, `/tasks/search`, `/recurring-tasks` | Not supported | `404`. | ##### Contacts | GoHighLevel call | On Cook | Notes | |---|---|---| | `POST /contacts/` | Supported | `201`. Name, email, phone, company, source, timezone, address fields, website, date of birth, tags, `dnd` (or `dndSettings`), `assignedTo` and `customFields`. Fields Cook has no place for (gender, attribution and the like) are not kept. An email or phone another contact already has answers `400` "This location does not allow duplicated contacts." with `meta.contactId` and `meta.matchingField`, as GoHighLevel does with duplicates off. | | `GET`, `PUT`, `DELETE /contacts/{contactId}` | Supported | Delete removes the lead and what it owns in Cook. | | `POST /contacts/upsert` | Supported | Matches on email, then phone. `new: true` when it made one. | | `POST /contacts/search` | Supported | `filters` (`eq`, `not_eq`, `contains`, `not_contains`, `exists`, `not_exists` and ranges on dates) on name fields, email, phone, company, source, timezone, type, tags, `assignedTo`, `dnd`, `dateAdded` and `customFields.`; up to two `sort` fields; `page` + `pageLimit` (up to 500, first 10,000 rows) or `searchAfter`. | | `GET /contacts/search/duplicate` | Supported | `email` or `number`. `{ "contact": null }` when none. | | `GET /contacts/` | Supported | `query`, `limit` (up to 100), `startAfter`, `startAfterId`. | | `/contacts/{contactId}/notes`, `/notes/{id}` | Supported | Notes on the lead's timeline in Cook. | | `/contacts/{contactId}/tasks`, `/tasks/{taskId}`, `/tasks/{taskId}/completed` | Partial | Tasks on Cook's task board, linked to the lead. Only tasks made through this API list on a contact (see [Gotchas](#gotchas)). `dueDate` keeps the day and reads back at `T00:00:00.000Z`. | | `GET /contacts/{contactId}/appointments` | Supported | The lead's meetings in Cook. | | `POST`, `DELETE /contacts/{contactId}/tags` | Supported | | | `POST /contacts/bulk/tags/update/{type}` | Supported | `add` or `remove` (with `removeAllTags`), up to 500 contacts. | | `POST`, `DELETE /contacts/{contactId}/workflow/{workflowId}` | Partial | See [Workflows](#workflows). | | `/contacts/{contactId}/campaigns/…`, `/followers`, `/contacts/bulk/business`, `/contacts/business/{businessId}` | Not supported | `404`. Cook has no campaigns, followers or businesses; a lead has one owner (`assignedTo`). | | `GET /contacts/lookup` | Not supported | `404`. It is not in GoHighLevel's published API v2; use `GET /contacts/search/duplicate`. | ##### Tags, custom fields and custom values | GoHighLevel call | On Cook | Notes | |---|---|---| | `GET`, `POST /locations/{locationId}/tags`, `GET`, `PUT`, `DELETE /locations/{locationId}/tags/{tagId}` | Supported | See [Tags](#tags). | | `GET`, `POST /locations/{locationId}/customFields`, `GET`, `PUT`, `DELETE /customFields/{id}` | Partial | Contact fields only. See [Custom fields and values](#custom-fields-and-values). | | `POST /locations/{locationId}/customFields/upload` | Not supported | `404`. | | `GET`, `POST /locations/{locationId}/customValues`, `GET`, `PUT`, `DELETE /customValues/{id}` | Supported | See [Custom fields and values](#custom-fields-and-values). | ##### Opportunities and pipelines | GoHighLevel call | On Cook | Notes | |---|---|---| | `GET /opportunities/pipelines` | Supported | Your Cook pipelines and their stages. | | `POST /opportunities/` | Partial | `201`. One opportunity per contact: see [Opportunities](#opportunities). | | `GET`, `PUT`, `DELETE /opportunities/{id}` | Supported | `PUT` moves the lead to another stage or pipeline. `DELETE` takes the lead out of the pipeline; the contact stays. | | `PUT /opportunities/{id}/status` | Supported | `open`, `won`, `lost`, `abandoned`. | | `POST /opportunities/upsert` | Supported | Updates the contact's opportunity, moving it if `pipelineId` differs. | | `GET /opportunities/search` | Supported | `location_id`, `pipeline_id`, `pipeline_stage_id`, `contact_id`, `assigned_to`, `status`, `q`, `date`, `endDate`, `order`, `limit`, `page`, `startAfter` + `startAfterId`. | | `POST /opportunities/search` | Partial | `query`, `limit`, `page`, `searchAfter`, and `filters` with `eq` on `pipeline_id`, `pipeline_stage_id`, `contact_id`, `assigned_to`, `status`, `id`. `aggregations` is empty. | | Pipeline create, edit, delete | Not supported | GoHighLevel's API v2 has no such calls. Make pipelines in Cook under **Pipelines**, or with Cook's own API (`/v1` `crm.pipelineCreate`). | | `/opportunities/{id}/followers`, `/opportunities/lost-reason` | Not supported | `404`. | ##### Conversations and messages | GoHighLevel call | On Cook | Notes | |---|---|---| | `POST /conversations/` | Supported | `201`. A contact that already has a conversation answers `400` "Conversation already exists" with its `conversationId`. | | `GET`, `PUT`, `DELETE /conversations/{conversationId}` | Partial | `PUT`: `starred` and `unreadCount` (`0` marks it read in Cook too); `feedback` answers `422`. `DELETE` removes the conversation and its messages. | | `GET /conversations/search` | Partial | `contactId`, `id`, `query`, `assignedTo`, `sort`, `startAfterDate`, `limit` (up to 100), `lastMessageType`, `lastMessageDirection`, `lastMessageAction`, `status`, `startDate`, `endDate`. `followers`, `mentions`, the score profile filters and any `sortBy` but `last_message_date` answer `422`. | | `GET /conversations/{conversationId}/messages` | Supported | `{ "messages": { "lastMessageId", "nextPage", "messages": [...] } }`, as GoHighLevel's live API answers. `limit` up to 100, `lastMessageId`, `type`. | | `GET /conversations/messages/{id}` | Supported | Also reads a send that waits for approval. | | `POST /conversations/messages` | Partial | SMS and Email only. See [Sending messages](#sending-messages). | | `POST /conversations/messages/inbound` | Supported | Logs a message the contact sent, without sending anything. See [Logging messages](#logging-messages). | | `POST /conversations/messages/outbound` | Supported | Logs a call (`type: "Call"`, as GoHighLevel allows). | | `PUT /conversations/messages/{messageId}/status` | Partial | For messages Cook's own carrier didn't send. A text Cook sent answers `400` "This message's delivery status is reported by the carrier that sent it". | | Attachments, uploads, recordings, transcriptions, export, email scheduling, custom subtypes, unsubscribes, live-chat typing, review replies | Not supported | `404`. Cook keeps call recordings and transcripts on the meeting or call in Cook. | ##### Calendars and appointments | GoHighLevel call | On Cook | Notes | |---|---|---| | `GET /calendars/` | Supported | Your booking pages. `showDrafted=false` lists live ones only. `groupId` answers an empty list. | | `POST /calendars/` | Partial | Makes a booking page and publishes it (unless `isActive: false`) in the location's timezone. Kept: `name`, `description`, `eventColor`, `meetingLocation`, `slotDuration` (+ `slotDurationUnit`), `formSubmitRedirectURL`, `teamMembers`. Other fields are not kept. | | `GET /calendars/{calendarId}` | Supported | | | `PUT /calendars/{calendarId}` | Partial | Name, description, length, location, redirect or thank-you message and team members, through the workspace's approval rule (see [Approvals](#approvals)). `isActive` publishes or unpublishes at once. | | `DELETE /calendars/{calendarId}` | Supported | A routine's test page answers `400`. | | `GET /calendars/{calendarId}/free-slots` | Supported | `startDate`, `endDate` (ms), `timezone`, `userId` (a user who isn't a host gets no slots). Uses the page's hours, connected calendar, buffers and notice. | | `GET /calendars/events` | Supported | `locationId`, `startTime`, `endTime` (required), `calendarId`, `userId`. `groupId` answers an empty list. | | `GET /calendars/events/appointments/{eventId}` | Supported | | | `POST /calendars/events/appointments` | Partial | Books through the booking page itself (it must be live, the contact needs an email, the time must be free). `ignoreFreeSlotValidation` is not honoured. A status other than `confirmed`, or an `endTime` that changes the page's length, answers `422`. | | `PUT /calendars/events/appointments/{eventId}` | Partial | `startTime` reschedules; `appointmentStatus` `cancelled` cancels; `showed` and `noshow` set the meeting's outcome. Title, address, assigned user, description, location, `rrule`, another calendar or another length answer `422`. | | `DELETE /calendars/events/{eventId}` | Partial | `201` `{ "succeeded": true }`. Cancels the meeting; Cook keeps it, and it reads back as `cancelled`. | | Groups, block slots, appointment notes, resources, notifications, schedules | Not supported | `404`. | ##### Workflows and users | GoHighLevel call | On Cook | Notes | |---|---|---| | `GET /workflows/` | Supported | Your Cook routines. `status` is `published` when the routine is on, else `draft`. | | `GET /users/`, `GET /users/{userId}` | Supported | The people on your team. Owners and admins read as `admin`, members as `user`. | | `GET /users/search` | Supported | `companyId` (yours), `query`, `role`, `ids`, `sort`, `sortDirection`, `skip`, `limit`. | | `POST /users/`, `PUT`, `DELETE /users/{userId}` | Partial | Through an approval card. See [Approvals](#approvals). | | `POST /users/search/filter-by-email` | Not supported | `404`. Use `GET /users/search` with `query`. | ##### Everything else Forms and surveys, campaigns, custom objects and associations, invoices, payments, products, funnels, blogs, social posting, SaaS and agency calls and the rest of GoHighLevel's API answer `404`. Marketplace OAuth is served; see [Marketplace apps (OAuth)](#marketplace-apps-oauth). #### Opportunities GoHighLevel keeps opportunities apart from contacts, and a contact can have several. In Cook an opportunity is the lead's place in a pipeline: its pipeline, stage, status and value. So: - **One opportunity per contact.** A second `POST /opportunities/` for the same contact answers `400` and names the one it has: ```json { "statusCode": 400, "message": "This contact already has an opportunity in this pipeline.", "error": "OPPORTUNITY_NO_DUPLICATE", "meta": { "existingId": "…" } } ``` In another pipeline the message is "This contact already has an opportunity in another pipeline. Cook keeps one opportunity per contact: move it with PUT /opportunities/{id} (pipelineId, pipelineStageId)." - **`POST /opportunities/upsert`** updates the contact's opportunity, and moves it when you give another `pipelineId`. - **Moving** is `PUT /opportunities/{id}` with `pipelineId` and `pipelineStageId`. A new pipeline without a stage starts at its first stage. - **Deleting** an opportunity takes the lead out of the pipeline. The contact stays. - **Imported contacts.** A GoHighLevel contact you imported with several opportunities is several leads in Cook that share its contact id. Each is its own opportunity, and contact edits reach all of them. - **The opportunity's name** is kept on the lead. Its custom fields are not: Cook keeps custom fields on contacts (see below). - **`createdAt`** is when the opportunity was made, not when its contact was: a deal opened today on a contact from last month is today's deal. `GET /opportunities/search` sorts by it (`order`) and filters on it (`date`, `endDate`). An imported opportunity keeps GoHighLevel's own `createdAt`. - **From an AI agent**, the Cook MCP's `lead_set_opportunity` (or `/v1` `crm.setOpportunity`) makes and moves the same opportunities. #### Approvals Some calls change things a person in your workspace may want to see first. Cook decides them with your workspace's approval rules, the same ones that decide what Cook's AI may do, under **Settings → Approvals**. When a card is filed, nothing happens until a person approves it in Cook. - **Sending a message** (`POST /conversations/messages`) follows the rules for texting and emailing a lead. When a card is filed the answer is still `200`, with `status: "pending"`: ```json { "conversationId": "…", "messageId": "…", "emailMessageId": "…", "messageIds": ["…"], "msg": "Message is waiting for approval: nothing is sent until a person approves it in Cook.", "status": "pending" } ``` `emailMessageId` is there for an Email. Read the message again with `GET /conversations/messages/{id}`: it reads `pending` while the card waits, then the carrier's status once it is sent, or `failed` when the card is turned down, expires or fails. - **Changing a calendar** (`PUT /calendars/{calendarId}`) follows the rule for booking pages. When a card is filed: `403` "Cook changes a calendar through an approval card: card … waits for a person in Cook, and nothing changes until it is approved." When the rule lets the change through, Cook waits for it (up to about 10 seconds) and answers `200` with the calendar. - **Rescheduling or cancelling an appointment** (`PUT` and `DELETE` on events) follows your AI setter's settings. When they ask for a card: `403` "Nothing was moved yet: approval card … waits for a person in Cook. …" (or "Nothing was cancelled yet: …"), ending with the note the card carries. - **The team always waits for a person.** - `POST /users/` answers `403` "Cook does not change the team directly: it filed approval card … ("…"). … is invited when a person approves it in Cook." - `PUT /users/{userId}` with a new `role` answers `403` with the same start, ending "…'s role changes when a person approves it in Cook." Other fields (name, email, password, phone, permissions) answer `422`: people change their own profile in Cook. An owner's role answers `422`. - `DELETE /users/{userId}` answers `200` `{ "succeded": false, "message": "Cook does not change the team directly: it filed approval card … (\"…\"). … is removed when a person approves it in Cook." }`. - These three need an account key; a workspace key is refused. Everything else (contacts, notes, tasks, tags, fields, values, opportunities, conversations, logging messages, booking, enrolling in a workflow) applies at once. #### Tags GoHighLevel's location tags are the tags on your Cook leads. - `GET /locations/{locationId}/tags` lists every tag in use on a lead, plus the ones made with `POST` and not used yet. - `PUT /locations/{locationId}/tags/{tagId}` renames the tag on every lead that has it. - `DELETE /locations/{locationId}/tags/{tagId}` takes it off every lead. #### Custom fields and values - **Custom fields** are Cook's lead fields. `dataType` `TEXT`, `LARGE_TEXT`, `PHONE` and `TEXTBOX_LIST` are text; `NUMERICAL` and `MONETORY` are numbers; `DATE` is a date; `SINGLE_OPTIONS`, `RADIO`, `MULTIPLE_OPTIONS` and `CHECKBOX` are a pick list (give `options`). Any other `dataType` answers `422`. A field reads back with the nearest of these types and `fieldKey` `contact.`. - **Set a field on a contact** with `customFields: [{ "id": "…", "field_value": "…" }]` (or `key` instead of `id`, `value` instead of `field_value`). A list value is stored as one comma-separated text. - **Opportunity fields.** `model: "opportunity"` answers `400`, and `?model=opportunity` lists none: Cook keeps custom fields on contacts. - **Restricted fields** you made private in Cook are left out of the list and can't be read, searched or set through this API (setting one answers `422`). - **Custom values** are your workspace's custom values, the same ones Cook's templates use. `fieldKey` is `{{ custom_values. }}`, and that tag works in Cook's emails, texts and routines. Renaming a value keeps its key. #### Sending messages `POST /conversations/messages` sends through Cook, from the contact's client's own number or mailbox, under your approval rules. - **`type: "SMS"`** sends a text (`message`). **`type: "Email"`** sends an email (`subject`, `html` or `message`). - **Other types** answer `400` "`` messages cannot be sent through this location: Cook sends SMS and Email through the API". Log messages on other channels with `/inbound` instead. - **When Cook refuses**, the answer is `400` with Cook's reason, for example "Not sent: this lead's client has no live texting number of its own, and a client's leads are never texted from another number." - `attachments`, `scheduledTimestamp`, `templateId`, `emailCc`, `emailBcc`, an `emailTo` other than the contact's email and a `toNumber` other than the contact's phone answer `422`. Cook picks the sender and the thread, so `fromNumber`, `emailFrom`, `threadId` and `conversationProviderId` are not used. #### Logging messages `POST /conversations/messages/inbound` and `/outbound` write a message on the conversation without sending anything. - **Conversations and channels.** One GoHighLevel conversation holds a contact's texts and calls together, and Cook files them in the conversation you name. Email (and Facebook and Instagram) have their own conversations; a message of that kind goes on the contact's conversation for its channel, and the answer gives that conversation's id. - **What an inbound message does in Cook:** it updates the conversation and the lead's timeline; "STOP" turns on do-not-disturb and "START" turns it off (no reply text is sent); an ordinary reply counts as the lead replying, so routines that start or stop on a reply do. Cook's AI setter does not answer it, because the message didn't come through Cook. - `altId` makes a repeat of the same message a no-op. #### Workflows Cook routines take the place of GoHighLevel workflows. - `GET /workflows/` lists your routines with UUID ids. - `POST /contacts/{contactId}/workflow/{workflowId}` starts a run of that routine for the lead, with the checks Cook's own Run button makes. A routine that is off answers `400` "This workflow is a draft. Cook enrolls contacts only in a published (switched on) workflow". A routine for one client refuses a lead of another. `eventStartTime` is accepted, but Cook's appointment waits use the lead's next meeting in Cook. - `DELETE /contacts/{contactId}/workflow/{workflowId}` stops the lead's runs of that routine. They read as canceled in the routine's enrollment list. #### Calendars A GoHighLevel calendar is a Cook booking page; an appointment is a Cook meeting. - **Ids.** Calendars, appointments, contacts and users have 20-character ids; pipeline stages and workflows have UUIDs. An object gets its id the first time Cook returns it, and keeps it. Objects you imported from GoHighLevel keep their GoHighLevel ids. - **Times** are ISO 8601 with the offset of the `timezone` you ask for, else the page's. - **Booking** goes through the booking page, so the lead, the meeting, the calendar event and reminders are what a booking on the page makes. #### Webhooks None yet. GoHighLevel's webhooks belong to a Marketplace app (an app subscribes, rather than a URL you register through the API), and Cook does not send Marketplace webhook events (`INSTALL`, `ContactCreate`, …) to apps. To act when something changes in Cook (a new lead, a booking, a reply), use a Cook routine that starts on that event. #### Marketplace apps (OAuth) An app built on GoHighLevel's Marketplace OAuth (a setter bot, a dialer, a reporting tool) moves to Cook by changing its OAuth and API addresses. Cook serves GoHighLevel's OAuth 2.0 authorization-code flow: the choose-location page, `POST /oauth/token`, refresh, `POST /oauth/locationToken` and `GET /oauth/installedLocations`, with GoHighLevel's request and response bodies. ##### 1. Register the app in Cook GoHighLevel registers apps in its Marketplace; Cook registers them through the API. Any Cook workspace's owner or admin can do it, with their own full-access account key (Settings → API keys, made for a person, no narrowed areas): ``` POST https://api.trycook.ai/compat/ghl/oauth/clients Authorization: Bearer ck_live_… Version: 2021-07-28 Content-Type: application/json { "name": "Example Setter", "redirectUris": ["https://setter.example.com/oauth/callback/highlevel"], "scopes": ["contacts.readonly", "contacts.write", "conversations.write", "conversations/message.write", "calendars/events.write", "locations.readonly", "oauth.readonly", "oauth.write"] } ``` The answer (`201`) carries `clientId` (GoHighLevel's shape, `-`), `appId`, `clientSecret` and `installUrl`, the choose-location link to send people to. **The client secret is shown once**: Cook keeps only its hash. Lost it? Delete the app and register it again. - `redirectUris`: up to 10, `https` (or `http` on `localhost` / `127.0.0.1`), matched exactly. - `scopes`: the GoHighLevel scopes the app may ask for. An unknown scope is refused (`422`). - `GET /oauth/clients` lists your apps (no secrets) and how many workspaces installed each. `DELETE /oauth/clients/{clientId}` deletes an app and ends every token it holds, in every workspace, at once. ##### 2. Swap the OAuth addresses | GoHighLevel | Cook | |---|---| | `https://marketplace.gohighlevel.com/oauth/chooselocation` | `https://app.trycook.ai/compat/ghl/oauth/chooselocation` (the `installUrl` host) | | `https://services.leadconnectorhq.com/oauth/token` | `https://api.trycook.ai/compat/ghl/oauth/token` | | `https://services.leadconnectorhq.com/oauth/locationToken` | `https://api.trycook.ai/compat/ghl/oauth/locationToken` | | `https://services.leadconnectorhq.com/oauth/installedLocations` | `https://api.trycook.ai/compat/ghl/oauth/installedLocations` | | `https://services.leadconnectorhq.com` (the API) | `https://api.trycook.ai/compat/ghl` | The app sends people to the choose-location page with `response_type=code`, `client_id`, `redirect_uri` and `scope` (and `state`, returned untouched). The person signs in to Cook, picks the workspace (GoHighLevel's location), sees what the app would reach in plain words and installs or denies. Cook then sends the browser to the redirect URI with `?code=…` (or `?error=access_denied`). Only an owner or admin of a paid workspace can install an app. The token calls are GoHighLevel's, form-encoded (JSON is accepted too): ``` POST https://api.trycook.ai/compat/ghl/oauth/token Content-Type: application/x-www-form-urlencoded client_id=…&client_secret=…&grant_type=authorization_code&code=…&user_type=Location&redirect_uri=… ``` The answer is GoHighLevel's token body: `access_token`, `token_type` (`Bearer`), `expires_in` (`86399`), `refresh_token`, `scope`, `refreshTokenId`, `userType`, `locationId` (or `approvedLocations` for `user_type=Company`), `companyId`, `userId` and `traceId`. Call the API with `Authorization: Bearer ` and the `Version` header, as on GoHighLevel. ##### Tokens - **Codes** are good once, for ten minutes, for the redirect URI they were issued for. A code presented again more than a minute after it was used ends what it was exchanged for. - **Access tokens** last a day (`expires_in: 86399`). Each one is a Cook key acting as the person who installed the app, in the workspace they picked, narrowed to what the approved scopes reach (below). Cook re-checks that person's role and the workspace's plan on every call. - **Refresh tokens** last a year and rotate: `grant_type=refresh_token&refresh_token=…` returns a new pair, and the refresh token used is refused from then on (`400` "Invalid grant: refresh token is invalid"). The access token it replaced keeps working for five minutes. A used refresh token presented again after a minute ends the install, so store the new one before using it. - **Company tokens** (`user_type=Company`) carry `oauth.readonly` / `oauth.write` routes: `GET /oauth/installedLocations` lists your one location; `POST /oauth/locationToken` (`companyId`, `locationId`) returns a location token. ##### Scopes Cook's permissions are coarser than GoHighLevel's scopes, so a scope reaches the whole Cook area its calls use: | GoHighLevel scope | Reaches in Cook | |---|---| | `contacts.readonly` / `.write` | CRM and board, read / write (contacts, notes, tasks) | | `conversations.*`, `conversations/message.*`, `opportunities.*`, `locations.readonly`, `locations/tags.*`, `locations/customFields.*`, `locations/customValues.*`, `calendars/events.*` | CRM, read / write | | `calendars.readonly` / `.write` | Booking pages, read / write | | `users.readonly` / `.write` | Team, read / write | | `workflows.readonly` | Routines, read | | `oauth.readonly` / `oauth.write` | The OAuth routes above; no Cook data | Any other documented GoHighLevel scope is accepted and reaches nothing in Cook. A token never gets full access, never registers apps and never decides approval cards. Adding a contact to a workflow needs a Cook key with routines write; no scope grants it. ##### Removing an app - **The workspace that installed it:** revoke one of its keys (named "OAuth · ") in Settings → API keys. The install ends: every token it holds stops and its refresh token is refused. - **The app itself:** `DELETE /marketplace/app/{appId}/installations` with its token. - **The app's maker:** `DELETE /oauth/clients/{clientId}` ends it everywhere. Not served: Marketplace webhooks, `grant_type=client_credentials`, bulk installs across several locations (a Cook company has one location), and the Marketplace listing itself. #### Gotchas - **`GET /contacts/lookup` isn't served.** Use `GET /contacts/search/duplicate`. - **Pipelines are read-only here.** Make and change them in Cook. - **Calendar groups** don't exist in Cook: `groupId` filters answer empty lists. - **`DELETE /calendars/events/{eventId}` cancels.** The meeting stays in Cook and reads back as `cancelled`. - **Tasks on a contact.** `GET /contacts/{contactId}/tasks` lists the tasks made through this API. Tasks people add on Cook's board are not linked to a lead, so they don't show there. - **One contact per email or phone.** Creating a duplicate answers `400`; use `POST /contacts/upsert`. - **Limits.** Cook's own limit applies: 300 calls a minute per key, then `429` with `Retry-After` and GoHighLevel's `X-RateLimit-*` headers. - **Plan.** A workspace without a paid plan gets `402`. #### What can't move - **Workflow graphs.** GoHighLevel has no API to read them. Rebuild them as Cook routines (Cook's AI can do this from a description). - **Funnels, websites and snapshots.** Not readable through GoHighLevel's API; rebuild them in Cook. - **A2P 10DLC registration.** It belongs to the carrier. Register your business again for texting in Cook. - **LC Phone numbers.** They stay with GoHighLevel until you port them. - **The white-label mobile app** stays with GoHighLevel.