AI privacy, data sent and costs
6 min read
AI in Mass Custom Fields is bring your own key: your server talks directly to the provider you chose. WPMass has no server in between, sees none of your data and receives no usage statistics from AI. This page tells you what leaves your site and what it costs.
When your server contacts a provider
Only when you trigger something. Visitors never cause an AI request: AI text is generated ahead of time and stored with each page.
Action | What is sent |
|---|---|
Test connection in Settings › AI | A tiny fixed request ("Reply with ok set to true.") with your key |
Opening the model list (a saved key, Refresh list) | A request to list models, authenticated with your key. No content. |
A task's AI run (started by hand, after generation, or from the pages list) | One request per page with the page's data and instructions (below) |
Write with AI / Rewrite AI values in the page editor | The same request for one page or one value |
Requests go over HTTPS to a fixed host per provider:
Provider | Host |
|---|---|
OpenAI |
|
Anthropic |
|
Google Gemini |
|
(Developers who add a provider with the filter wpmcf/ai/providers decide its host.) Your API key authenticates the request; it is never sent anywhere else.
What is in a request
A request has two parts, a system message with fixed instructions and the brief, and a user message with the page. A real request from a test run (OpenAI-style structure, German brief, one data column):
System:
You write the content of one page of a website. Many similar pages are generated from a dataset; each targets a different search query, so make this page specific to its data.
Write in the language of the locale "de_de".
Tone: friendly.
Use these keywords where they fit naturally: family, budget.
Never mention: cheap.
Write plain text without HTML or Markdown. Do not invent facts that are not in the data. Never output {{ or }}.
Answer with the requested JSON object only.
User:
Topic of the website section: City guides for families
Page title: Visit Porto
Page URL: https://example.com/guides/porto/
Data of this page (JSON):
{ "my_cities": { "city": "Porto" } }
Write these fields:
- my_group__intro: "Intro" (text). One welcoming sentence.
- my_group__body: "Body" (textarea)
- seo__seo_title: "SEO title" shown in search results. Specific to this page, the main keyword first, at most 60 characters, no site name.
- schema__faq__mainEntity: "FAQ › Questions" for the structured data (schema.org) of the page, 3 items at most. Questions families ask. Only facts from the data.plus a JSON schema that names each field, its type (text, number, boolean, a list of choices) and the answer shape, and the maximum answer length.
So the provider receives:
Sent | Details |
|---|---|
The brief | Topic, language, tone, keywords, avoid words |
The page title and URL | The generated title (not a hand-edited one) and the full page URL |
The data of the page | Every non-empty column of the page’s source row(s), under the source key, whether or not the template uses it. Not sent: the storage columns |
The field definitions | For each value to write: its label, type, your note, allowed choices and maximum length |
Not sent: the template's content, other pages, your posts, users, Global Data, settings, other API keys, or any other column of your database.
Password columns never leave your site
Password-type columns of a source (and their companion columns) are never included in a request. Everything else in the row is sent, so still do not point an AI-enabled task at a source that holds private data: personal data (names, emails, phone numbers of people), internal notes or prices you do not publish. Put the public data you want on pages into a separate data table with only those columns and use it as the task’s source. Empty cells are skipped. If you cannot restructure the data, leave the AI off for that task.
What is stored on your site
Item | Where | Notes |
|---|---|---|
API keys | Option | See AI setup |
Provider, model, limits | Settings table ( | No key |
AI answers | The page values table ( | Removed when the task or its pages are deleted |
Run log | The task log: counts of fields, failures, requests, tokens | No prompts are logged |
Prompts and answers are not logged by the plugin. Deleting a task deletes its AI values. Uninstalling the plugin removes data only when you enabled that in Settings (see Uninstalling).
What the provider does with it
The provider receives the request under its own terms. Review your provider's API data policies: whether API data is used for training, how long it is retained and where it is processed. The plugin's readme.txt links them for the three built-in providers (OpenAI Terms and Privacy Policy, Anthropic Commercial Terms and Privacy Policy, Google Gemini API Terms and Google Privacy Policy). If you process personal data you are the controller; you may need a data processing agreement with the provider and a line in your privacy policy.
Suggested privacy policy text
We use an AI service (OpenAI, Anthropic or Google, depending on configuration) to help write the text of some pages. Only business data that is published on those pages, a title and a page address are sent to the service; no visitor data is involved. The service acts under its own terms: <link>.Adjust it to the provider and data you really use.
Costs
The provider bills your account, not WPMass. There is no markup and no credit system in the plugin. Prices differ per model and change over time: see your provider's pricing page. The plugin helps you estimate before you spend.
The estimate in the run panel
The panel AI content of this task shows, for pages without AI content:
- Requests: pages × ⌈values ÷ 12⌉ (12 values per request),
- Input tokens (approx.): one real prompt measured (characters ÷ 4) times the requests,
- Output tokens (approx.): about 150 tokens per value (per item for lists such as FAQ) times the pages.
Example: 1,000 pages with 6 values each (three text fields, one number, the SEO title and the meta description) need 1,000 requests. The estimate in a test with this shape was about 560 input tokens per request, so about 560,000 input tokens, and 6 × 150 × 1,000 = 900,000 output tokens. Multiply by your model’s price per million tokens: input tokens × input price + output tokens × output price. The numbers are estimates; the real run reports actual counts (Last run: … fields written, … failed, … requests, … tokens).
Actual token counts come from the provider's answers and are stored per value (split evenly over the values of one request).
Keeping the bill small
Do | Why |
|---|---|
Try 3 to 10 pages first (quick start sample or a filter) | You see quality before you pay for thousands |
Use a smaller model | "Smaller models are cheaper and usually good enough for field content." |
Switch Write this field off for fields that do not need AI | Fewer values per request |
Keep notes and brief short | They are sent with every request |
Do not edit the brief during a rollout | A changed brief makes every value outdated, so the next run rewrites and bills them again |
Avoid Rewrite all… | It bills every request again |
Leave Run automatically after each generation off for tasks with frequent data changes | Each changed page is rewritten |
Lower Maximum answer length only as far as your fields need | A too-low limit cuts answers (and wastes the request) |
Set a spending limit in your provider's console | The plugin stops on an exhausted quota but cannot cap your spend |
Runs are cached: unchanged pages and fields cost nothing on the next run, hand-edited values are never sent again, and a failed value is retried only by the next run.
When money runs out
If the provider account has no credit the run stops with "The AI provider account has no credit or quota left. Check its plan and billing, then run AI again." and nothing else is attempted. Refill the account and use Write missing content now: finished values stay.
Still stuck? Contact support