Use case

Getting the Words for the Site Out of the Client's Head

The design is done, the build is ready, and the site is still full of "lorem ipsum" because nobody has the actual copy. Here's how to get it in one pass instead of a dozen scattered emails.

The problem

Problem

Copy is the slowest-arriving asset on almost every website project. Files and logins tend to exist already, sitting in someone's folder. Words about the business usually don't — they have to be written, and the client is the only one who can write them.

So they arrive in fragments. The about-us paragraph shows up on Monday. The team bios trickle in over two weeks, one person at a time, because the client is forwarding your request to five other people. The FAQ answers never come at all until you ask a third time. Opening hours get sent as a photo of a handwritten note taped to the shop door.

Each fragment lands at a different time, in a different format — an email body, a Google Doc link, a screenshot of a WhatsApp message. You end up keeping your own tracking sheet just to know what's left and who you're still waiting on.

How it runs

Workflow

  1. Define one intake, not one email per page. List every piece of copy as a separate item — about text, team bios, FAQ answers, opening hours, legal details — each with its own label and, where it matters, a character-limit constraint.
  2. The client gets one link. They see every item, with your help text explaining what goes where, and fill it in at their own pace instead of replying to a thread.
  3. Structured fields stay structured. Opening hours or anything with a fixed shape goes in as a structured item with a schema, so you get an object with named fields back, not a paragraph to parse.
  4. BriefGate chases the gaps. If the bios are done but the FAQ answers aren't, the reminder only mentions what's missing — not a generic "please respond" that makes the client re-read everything they already sent.
  5. You or your agent read the results once. When the intake completes, pull everything back as typed values — no retyping text out of a screenshot.
  6. Anything unclear goes back with a note. A vague answer gets a revision request explaining what's missing, flagged in the client's portal instead of buried in a reply-all.
What your client sees
The client's portal with each page's copy listed as a separate item and a progress bar at the top.
The client's portal with each page's copy listed as a separate item and a progress bar at the top.
For the agent

MCP example

A coding agent building the site can create the intake directly. Here about_text and faq_answers are longtext items with a character ceiling, opening_hours is structured so the schedule comes back as data, and legal_business_name is a short text field for the footer:

{
  "project_name": "Bella Cucina — Website Copy",
  "client": {
    "name": "Marco Esposito",
    "email": "[email protected]"
  },
  "items": [
    {
      "key": "about_text",
      "type": "longtext",
      "label": "About us page text",
      "help": "Two or three paragraphs on the restaurant's story and what makes it different.",
      "required": true,
      "constraints": { "max_chars": 2000 }
    },
    {
      "key": "team_bios",
      "type": "longtext",
      "label": "Team bios",
      "help": "One short paragraph per person you want on the Team page.",
      "required": false
    },
    {
      "key": "faq_answers",
      "type": "longtext",
      "label": "FAQ answers",
      "help": "Answer each question from the list we sent, in your own words.",
      "required": true
    },
    {
      "key": "opening_hours",
      "type": "structured",
      "label": "Opening hours",
      "required": true,
      "schema": {
        "type": "object",
        "required": ["mon_fri", "sat", "sun"],
        "properties": {
          "mon_fri": { "type": "string", "example": "12:00-22:00" },
          "sat": { "type": "string", "example": "12:00-23:00" },
          "sun": { "type": "string", "example": "Closed" }
        }
      }
    },
    {
      "key": "legal_business_name",
      "type": "text",
      "label": "Registered legal business name",
      "required": true
    }
  ],
  "chase_schedule": "default"
}

get_intake_results hands the finished copy straight back as values keyed by item — about_text and faq_answers as plain strings, opening_hours as an object matching the schema. Nothing needs cleaning up before it goes into the build.

Read the docs

What changes

Result

You stop maintaining a side tracking sheet for who sent what. Each page's copy has a home, a status, and one place the client goes to finish it. The gaps that used to need a manual follow-up get chased automatically, in the client's own language. When the intake is complete, the copy is already typed data — you paste it into the build instead of extracting it from a screenshot first.

Start free, no card required, and send your next copy request as one link instead of an email thread.

Free tier, no card required.