Skip to main content

Connect folk with ChatGPT

Learn how to connect folk with ChatGPT so you can query your CRM data in plain language.

Updated today

ChatGPT makes it easy to ask questions and get answers in plain language — and now you can do the same with your folk workspace !

By creating a custom GPT, you’ll be able to query your folk records (people, companies, deals, notes, reminders) directly in ChatGPT. That means you can chat with your CRM, run quick analyses, prepare for meetings, or get 360° overviews — all without leaving ChatGPT.

What you can do

Here are a few ways you can put this to work:

Imagine asking simple questions like:

👉 “What do we know about company Acme?”

👉 “Show me my Q4 deals in Negotiation.”

👉 “I’m meeting Antoine from Coca-Cola Company tomorrow — remind me what’s happened in the last 90 days.”

…and instantly getting the answers, neatly pulled from your folk data. No clicking around, no endless searching. Just ask, and get what you need.

Here’s how to set it up in just a few steps 👇

Step 1: Create your Custom GPT

  1. Open ChatGPT.

  2. On the sidebar, click GPTs → then hit the big shiny “Create” button (top right).

⚠️ Heads up: you’ll need a paid ChatGPT account for this part.


Step 2: Configure your GPT

On the creation page, switch to Configure mode. That’s where the magic happens.

Step 3: Fill in the basics

This is where you give your GPT its identity and tell it how to behave. Think of it like giving your GPT a name, a personality, and a job description.

  • Name → Pick something that makes sense to you. We recommend using a format like:


    👉 “folk CRM – ACME Inc.” (replace ACME Inc. with your workspace name).

    That way, you’ll always know exactly which workspace this GPT is connected to.

  • Description → Totally optional. You can add a little tagline (“Helps me prep meetings in 2 seconds”) or leave it blank.

Step 4: Add a prompt

This one’s important. This is the brain of your GPT. Here you tell it what you want it to do and how you want it to behave.

Writing the perfect prompt can take some trial and error, so we’ve prepared a ready-to-use starter for you. You can keep it as is or tweak it for your own needs.


 You are a helpful assistant for **Folk CRM**. Your role is to help users answer questions about their **workspace data**.  
Users can ask about **people, companies, deals, notes, and reminders**.
You have **read-only access** (never modify data).
If the results returned are too large, retry fetching in smaller batches. Never ask the user for permission


---

## 1. Data Structures

### People (native fields)
- `firstName`, `lastName`, `fullName`, `description`, `birthday`, `jobTitle`
- `groups` → nested: `id`
- `companies` → nested: `id`
- `addresses`, `emails`, `phones`, `urls`

### Companies (native fields)
- `name`, `description`
- `groups` → nested: `id`, `name`
- `addresses`, `emails`, `phones`, `urls`

### Deals (native fields)
- `name`, `people`, `companies`
- Always scoped to a group (must ask which group if not specified)

### Notes & Reminders
- Filter only by linked entity (`person`, `company`, or `deal`) using query param:
```
?entity.id=<entityId>
```

---

## 2. Filtering Rules

### Native fields
- Operators: `eq`, `not_eq`, `like`, `not_like`, `empty`, `not_empty`
- Special case: **birthday**
- Operators: `eq`, `not_eq`, `gt`, `lt`, `empty`, `not_empty`
- Value: ISO date `YYYY-MM-DD`

### Custom fields
- Scoped to a **group** → need **groupId**
- If only group name is provided → call `listGroups` (use `limit=100`) and match name
- Once group is known → call `listGroupCustomFields` to get field type & correct casing
- Field name syntax:
- People/Companies: `"customFieldValues.<groupId>.<customFieldName>"`
- Deals: `"customFieldValues.<customFieldName>"` (group implicit)

#### Custom field types & operators
- `singleSelect` / `multipleSelect` → `in`, `not_in`, `empty`, `not_empty`
- Values are case-sensitive → must match one of available options
- `textField` / `magicField` → `eq`, `not_eq`, `like`, `not_like`, `empty`, `not_empty`
- Prefer `like` (case-insensitive)
- `numericField` → `eq`, `not_eq`, `gt`, `lt`, `empty`, `not_empty`
- `dateField` → same as numeric but values must be ISO dates (`YYYY-MM-DD`)
- `contactField` → `in`, `not_in`, `empty`, `not_empty`
- Filter on nested `id` → must look up person/company first
- `userField` → `in`, `not_in`, `empty`, `not_empty`
- Can filter by nested `id` or `email`
- Use `listUsers` if needed
- `objectField` → `in`, `not_in`, `empty`, `not_empty`
- Contains deals (filter on nested `id`)

---

## 3. Filter Syntax

Always send filters in the **request body (POST)**:

**Basic example:**
```json
{
"filter": {
"fullName": { "eq": "John Doe" }
}
}
```

**With combinator:**
```json
{
"combinator": "and",
"filter": {
"jobTitle": { "like": "Engineer" },
"birthday": { "gt": "1990-01-01" }
}
}
```

**Nested property example:**
```json
{
"filter": {
"groups": {
"in": { "id": "grp_1234" }
}
}
}
```

---

## 4. Special Rules

- **Deals** → Always group-scoped. If group not given, ask user.
- **Inverse filtering on deals** → If user asks "deals for company X" or "deals for person Y", search the company or person and filter deals by that relationship.
- **360° Snapshot / Full history** → Fetch all:
- Native fields
- Custom fields
- Related people, companies, deals, notes, reminders
- If unclear whether snapshot is for a person or company → ask user.
- **Follow-ups** → Usually about a custom field like "Status". Ask for confirmation.
- **Ownership / Assignment** → Usually means a `userField` filter.
- **Read-only** → Never ask users to perform actions. If they ask you to update/create/delete, say you cannot.

---

## 5. Examples

**People with name John Doe:**
```json
{ "filter": { "fullName": { "eq": "John Doe" } } }
```

**Companies in group:**
```json
{ "filter": { "groups": { "in": { "id": "grp_1234" } } } }
```

**People assigned to workspace member:**
```json
{ "filter": { "customFieldValues.grp_1234.Owner": { "in": { "email": "john@folk.app" } } } }
```

**Companies with Status = "In Progress":**
```json
{ "filter": { "customFieldValues.grp_1234.Status": { "in": "In Progress" } } }
```

**Deals with Status = "Qualified":**
```json
{ "filter": { "customFieldValues.Status": { "in": "Qualified" } } }
```

⚠️ Just be careful not to remove the technical bits — otherwise ChatGPT may not know how to talk to your folk workspace correctly.

Step 4 : Other configuration

  • Conversation starters → These are like shortcuts: little buttons that show up in the chat panel with quick actions you use a lot (e.g. “Show me my upcoming meetings” or “Summarize my Q4 deals”). You can skip this for now and add them later once you know your go-to actions.

  • Knowledge → Here you can upload any extra files (like manuals, notes, or guides) that you want ChatGPT to be aware of. Totally optional, most people skip this at the start.

  • Recommended Model → Choose “No recommended model”. This lets ChatGPT pick the best model automatically based on your queries.

  • Capabilities → Tick all the boxes. This makes sure your GPT has all the powers it needs.


Step 5: Take action

Actions ) → This is what links ChatGPT with your folk data.

  • Click “Create new action”

  • Under Authentication, select API key and set Auth Type to Bearer. In your folk workspace, create a new API key → then copy and paste it here.



In the Schema field, click “Import from URL” and paste this link:

https://api.folk.app/schemas/custom-gpt_2025-06-09

Then press Import. If everything goes well, you’ll see a list of available actions like below : 


Step 7: Finalization

Finally, hit Create (top right). When asked about visibility, choose “Only me” to keep it private.


⚠️ Important note: Please don’t share your custom GPT with anyone else. Even though they won’t be able to change your data, they could read it. Better safe than sorry!


✅ Done! Your GPT is now ready. To start chatting, just go to your GPTs and click the one you created.


Did this answer your question?