📌 Interface screenshots in this article are illustrative. Microsoft updates its UI regularly — actual screens may look slightly different depending on your version or environment.
What Are Prompt Columns?
A Prompt Column is a native data type in Microsoft Dataverse — the enterprise data platform underlying Power Apps, Power Automate, and Dynamics 365 — that lets you attach a natural language AI prompt directly to a table column. When a record is created or updated, the prompt runs automatically against other columns in the same row, and the AI-generated result is written back — persistently — into that column.
No Power Automate flow. No external API call. No custom code. The enrichment lives in the schema.
The formal term for this category of feature is enrichment-as-a-column: the AI logic is not a process that runs externally and then populates data; it is a first-class attribute of the table structure itself, defined once and applied to every qualifying record automatically.
📌 Production-ready
Prompt Columns reached General Availability on July 29, 2026. They are production-ready across enterprise environments.
The Problem They Solve
Traditional computed columns in Dataverse — formula columns, rollup fields, calculated columns — are fundamentally deterministic. They evaluate a rule: “if Status equals Active and Region equals EMEA, then flag this record.” They can aggregate, transform, and derive values from existing data.
But some business logic cannot be expressed deterministically. Consider these scenarios:
- Lead scoring based on notes: “How hot is this lead based on the last sales rep’s notes?” — the answer depends on language, tone, implied urgency, and context that no formula can parse.
- Customer sentiment on support tickets: “Is this customer satisfied, neutral, or frustrated?” — even a 20-word response requires semantic understanding, not string matching.
- Content classification: “Which product category does this support request belong to?” — classification against unstructured text requires inference, not lookup.
- Automatic summarization: “Summarize this account’s recent activity for the next sales rep who picks it up” — this is generation, not computation.
Prompt Columns handle all four. They bring generative AI into the data layer — where the data already lives — instead of building pipelines to move data to AI and back.
Architecture: How a Prompt Column Is Built
Setting up a Prompt Column involves four components that combine into the complete execution path.
1. Data Type: Prompt
In the Dataverse column editor, select Prompt as the data type. Each table supports a maximum of five Prompt Columns. This limit applies per table.
2. The Prompt Definition
The core of the feature. You write a natural language instruction that tells the AI model what to generate. The prompt is constructed using the Prompt Builder — the same editor used in Copilot Studio and AI Builder. You can reference input columns from the same row using the / column picker, giving the model access to the record’s data as context.
💡 Effective prompt patterns
Be specific and instruction-oriented. Provide output format constraints when the value will be used programmatically — “Return only one word” or “Return a numbered list, maximum three items” reduces variability and hallucination risk. Reference only columns that are reliably populated.
Input columns cannot be: formula columns, file columns, image data type columns, or other Prompt Columns. These types are unsupported as prompt inputs — if referenced, their values are ignored.
3. Filter Conditions
Filter conditions control when the prompt runs, independent of whether the record was created or updated. This is critical for two reasons: cost control (every skipped execution is a credit saved) and relevance (some prompts only make sense in specific states — a risk assessment should not run on records still in Draft).
Filter conditions evaluate first. If the conditions are not met, the prompt does not execute — silently, without surfacing an error. This “skip and save credits” behavior is by design.
4. AI Model
The default is GPT-4.1 mini, served via Azure AI Foundry. Leave it. Change it only if test results give you a concrete reason — inconsistent output on edge cases, or a classification pattern that consistently misses.
How Prompt Columns Work
MICROSOFT DATAVERSE · PROMPT COLUMNS
When Does a Prompt Column Fire?
The trigger has two conditions that must both be true simultaneously. Understanding this rule is what separates a well-designed Prompt Column from one that silently wastes credits or never runs.
The Execution Model
The trigger logic is worth understanding precisely, because it shapes how you design and troubleshoot Prompt Columns in production.
A Prompt Column executes when a column referenced in the prompt is created or updated, provided the filter condition is satisfied at that exact moment. Both conditions must be true simultaneously:
- Update a referenced column while the filter is not satisfied → nothing happens
- Satisfy the filter condition without touching a referenced column → nothing happens either
- Update a referenced column while the filter is satisfied → prompt executes
The filter condition column is not a trigger. Satisfying it alone does not fire the prompt — only updating a referenced column while the filter is satisfied causes execution.
— vsgueradev.com
Two cases to understand:
📝 Record creation
If the filter condition is satisfied at the moment of creation, and the referenced columns are being written for the first time, the prompt executes immediately on save.
✏️ Record update
Satisfying the filter condition arms it — but the prompt only fires when one of the referenced input columns is subsequently updated while the filter remains satisfied.
This also means: if you add or change a filter condition after records already exist in the table, those records will not be reprocessed. The prompt does not look back — it only reacts to changes going forward.
Execution is asynchronous — deliberately decoupled from the save transaction. Saving a record never waits for AI processing. The user’s action completes immediately; the AI result arrives in the column shortly after, in the background.
Status Tracking
Every Prompt Column generates two companion columns automatically:
(columnName)_PromptColumnStatus— tracks the execution lifecycle(columnName)_PromptColumnDetails— stores timestamps and error details
The status lifecycle follows four official states:
| Code | Name | Description |
|---|---|---|
| 0 | NotStarted | Record created. AI analysis has not started yet. |
| 1 | InProgress | AI analysis in progress. Details column shows start timestamp. Output column still empty. |
| 2 | Completed | Prompt executed successfully. Details column shows completion timestamp. |
| 3 | Failed | AI generation failed. Details column shows error details. |
🔍 Observed in testing
When the filter condition is not met, the portal shows RecordDoesNotSatisfyFilter in the Details column and a numeric value (2,000) in the Status column. When the filter becomes satisfied and execution is queued, the Status changes to 2,001. These internal values are not documented by Microsoft — the official codes are 0, 1, 2, and 3.
Prerequisites
Before creating a Prompt Column in any environment, verify the following:
- Copilot Credits: Prompt Columns consume Copilot Credits per execution. The environment must have an active entitlement — from seeded credits in eligible licenses, or via add-on purchase. Note: Microsoft has announced that seeded AI Builder credits will be removed from Power Platform and Dynamics 365 licenses from November 1, 2026. Plan accordingly.
- Copilot and AI Prompts features enabled: In the Power Platform Admin Center, navigate to the target environment’s settings → Features → confirm both Copilot and AI Prompts are enabled.
- Block unmanaged customizations disabled: If this environment setting is enabled, Prompt Columns cannot be created or edited. Temporarily disable it or use a managed solution from a dev environment.
- Region availability: The feature relies on Azure AI Foundry models, which have regional constraints. Verify your environment’s region supports prompts before planning a rollout.
Creating a Prompt Column: Step by Step
We are building this from scratch, in a single linear flow. By the end of this section you will have a working solution with two Prompt Columns, a real contract record, and live AI-generated results on screen.
Step 1 — Create the Solution
Navigate to make.powerapps.com → Solutions → New solution. Set the Display name to Contract Risk and select your publisher. Leave everything else as auto-generated. Select Create.
📌 About schema name prefixes
The schema names in this tutorial use the prefix vinc_ — the publisher prefix from the environment used to build this case study. Substitute it with your own prefix wherever you see vinc_.
Step 2 — Create the Table
Inside the solution, select New → Table → Table. Set Display name to Vendor Contract. Leave everything else — plural name, schema name, primary column — as auto-generated. Select Save.
Step 3 — Add the Standard Columns
Open the Vendor Contract table → Columns → New column. The Name primary column is already there — auto-generated by Dataverse. Add these three columns one at a time:
| Display Name | Data Type | Notes |
|---|---|---|
| Contract Body | Multiple lines of text | Required. Select Plain text — not Rich text. Set max length to 2000 characters. |
| Review Status | Choice | Required. Options: Draft, Ready for Review, Approved, Rejected. Default: Draft. |
| Contract Type | Choice | Required. Options: NDA, MSA, SOW, SLA. No default — must be set explicitly on each record. |
⚠️ Contract Body must be Plain text
Rich text stores HTML markup internally. If a Prompt Column reads a Rich text field, the model receives <p>This agreement...</p> instead of clean text, which significantly degrades output quality.
Step 4 — Create the Case Study Record
This is the Vertex Analytics contract — the record you will use both to test the prompts during configuration and to demonstrate the two trigger scenarios at the end.
Go to the Vendor Contract table default view → + New row. Fill in:
| Field | Value |
|---|---|
| Name | Vertex Analytics — MSA |
| Contract Type | MSA |
| Review Status | Draft |
| Contract Body | Paste the contract text below |
Paste this into Contract Body:
This Master Service Agreement ("Agreement") is entered into between Vertex Analytics Ltd ("Vendor") and the undersigned client organization ("Client").
Section 8.3 — Indemnification. Vendor shall indemnify, defend, and hold harmless Client from and against any and all claims, damages, losses, costs, and expenses (including reasonable attorneys' fees) arising out of or related to Vendor's performance under this Agreement. Client's indemnification obligations under this Agreement shall be unlimited in scope and shall not be subject to any cap or limitation of liability.
Section 12.1 — Term and Renewal. This Agreement shall commence on the Effective Date and continue for an initial term of twelve (12) months. Unless either party provides written notice of non-renewal at least ninety (90) days prior to the end of the then-current term, this Agreement shall automatically renew for successive one-year periods.
Section 15.2 — Governing Law. This Agreement shall be governed by and construed in accordance with the laws of the State of Delaware, without regard to its conflict of law provisions.
Click outside the row to autosave. Leave Review Status as Draft for now. Then copy the GUID from the Vendor Contract column visible directly in the table view — it is the unique identifier of the record (vinc_vendorcontractid). You will paste it into the PromptColumnRecordId field when testing each Prompt Column.
Step 5 — Create Prompt Column 1: Risk Level
Columns → New column.
- Display name:
Risk Level - Data type: Prompt
- Clear Allow form fill assistance
Select + Add new prompt to open the Prompt Builder. Write this prompt:
You are a contract risk analyst. Based on the contract text and contract type below, assign a risk level to this vendor contract.
Use these definitions:
- High: the contract contains one or more of the following — uncapped indemnification obligations, unilateral termination rights for the vendor, auto-renewal clauses without notice requirements, governing law in a high-risk jurisdiction, or liability exposure disproportionate to the contract value.
- Medium: the contract contains clauses that warrant legal review before signing but do not represent immediate high-risk exposure.
- Low: standard terms with no unusual risk indicators identified.
Return only one word: High, Medium, or Low. Do not add any explanation.
Contract Type: {Contract Type}
Contract Text: {Contract Body}
Reference the columns. The prompt above shows {Contract Type} and {Contract Body} as placeholders — replace each one with the actual column reference:
- Select and delete
{Contract Type}in the prompt text - Type
/— the column picker opens immediately - Select Contract Type from the list — it is inserted
- Select and delete
{Contract Body} - Type
/again and select Contract Body
Test it. In the prompt area you will see PromptColumnRecordId as a pill — Dataverse adds it automatically to every Prompt Column as a system reference to identify which record to use during testing. If you do not see it, close the Prompt Builder and reopen it via Edit on the prompt. Click on the PromptColumnRecordId pill: a Text input panel opens with a Sample data field. Paste the GUID you copied in Step 4. Select Close, then select Test in the top right.
The result panel has two tabs:
- Model response — the AI output: in this case
High - Knowledge used — the JSON payload sent to the model, showing exactly which record and column values were used. You will see
vinc_vendorcontractid,vinc_name,contract_body, and@entityFriendlyName. This confirms the correct data reached the model.
💰 Execution cost
The cost is visible at the bottom of the Prompt Builder: 0.2 Copilot credits per execution with the default GPT-4.1 mini model.
Save. Select Save — you return to the column properties panel.
Add the filter. Select Edit filter → + Add → Add row → Review Status equals Ready for Review → OK.
Save → Close to return to the table.
✅ Companion columns created automatically
Dataverse automatically creates vinc_RiskLevel_PromptColumnStatus and vinc_RiskLevel_PromptColumnDetails. They appear in the table within a minute — no action needed.
Step 6 — Create Prompt Column 2: Critical Clauses
New column → Display name: Critical Clauses → Data type: Prompt → Clear Allow form fill assistance → + Add new prompt.
Write this prompt:
You are a contract analyst. Read the contract text below and identify up to three clauses that a legal reviewer should pay particular attention to before signing.
Focus on: indemnification scope, limitation of liability caps, termination rights, auto-renewal terms, data processing obligations, IP ownership provisions, and exclusivity constraints.
Format your response as a numbered list. Each item should be one sentence that names the clause type and describes the specific concern. Maximum three items. If fewer than three concerns are identified, return only those found.
If no critical clauses are identified, return: No critical clauses identified.
Contract Text: {Contract Body}
Select and delete {Contract Body}, type /, and select Contract Body from the picker.
Test it. Select Test → click PromptColumnRecordId pill → paste the GUID → Close → Test. Check both tabs — Model response for the output, Knowledge used to confirm contract_body is populated.
Expected output:
1. Indemnification Clause: The Client's indemnification obligations are unlimited in scope and not subject to any cap or limitation of liability, which may expose the Client to significant risk.
2. Auto-Renewal Terms: The Agreement automatically renews for successive one-year periods unless either party provides written notice of non-renewal at least ninety (90) days before the current term ends, requiring careful attention to termination timing.
3. Term and Renewal Clause: The initial term is twelve (12) months, and the automatic renewal mechanism may limit the Client's flexibility to terminate without advance notice.
Save → Edit filter → + Add → Add row → Review Status equals Ready for Review → OK → Save → Close.
✅ Companion columns created automatically
Dataverse automatically creates vinc_CriticalClauses_PromptColumnStatus and vinc_CriticalClauses_PromptColumnDetails. They appear in the table within a minute.
Step 7 — Watch It Run
Both trigger scenarios use the same record — Vertex Analytics — MSA — currently with Review Status = Draft. Both demonstrate the same rule from different angles:
CASE STUDY · LEGAL & PROCUREMENT · MICROSOFT DATAVERSE
Contract Risk Intelligence — Execution Flow & Prompt Columns
One custom table. Two Prompt Columns. The moment a contract is marked Ready for Review and a referenced column is updated, AI enrichment starts — no flow, no code, no manual effort.
🔑 A prompt executes only when a column referenced in the prompt is created or updated, AND the filter condition is satisfied at that exact moment.
Updating Review Status, Name, or any other column not referenced in the prompt does nothing. The filter being satisfied is not enough on its own.
Trigger A — Referenced columns written at creation, filter satisfied
When a record is created with Review Status = Ready for Review, the filter condition is satisfied from the start. At the same moment, Contract Body and Contract Type — the two columns referenced in the prompts — are written for the first time. Both conditions are true simultaneously on save: the prompts execute immediately.
Steps:
- Delete the current Vertex Analytics — MSA record
- Select + New row and fill in: Review Status =
Ready for Review, Name =Vertex Analytics — MSA, Contract Type =MSA, Contract Body = paste the contract text from Step 4 - Click outside the row to autosave
When execution completes, open the record and check each column:
- Risk Level — contains
High. The model evaluated the contract text and contract type and returned the classification. - vinc_RiskLevel_PromptColumnStatus — shows
2(Completed) - vinc_RiskLevel_PromptColumnDetails — shows the completion timestamp
- Critical Clauses — contains the numbered list of three clauses
- vinc_CriticalClauses_PromptColumnStatus — shows
2(Completed) - vinc_CriticalClauses_PromptColumnDetails — shows the completion timestamp
Trigger B — Referenced column updated, filter already satisfied
The record now has Review Status = Ready for Review — filter satisfied. Update Contract Body — referenced in both prompts — by adding a new clause. This gives the model something different to evaluate, and both prompts re-execute.
Open the record and add this sentence at the end of Contract Body:
Section 16.1 — Exclusivity. Vendor shall provide services exclusively to Client for a period of 24 months and shall not engage with any competitor of Client during this period without prior written consent.
Click outside the row to autosave. Both prompts re-execute because Contract Body is referenced in both. When execution completes:
- Risk Level —
Medium(changed fromHigh— the model re-evaluated the full contract including the new exclusivity clause) - vinc_RiskLevel_PromptColumnDetails — new timestamp, later than the Trigger A one
- Critical Clauses — now starts with “1. Exclusivity Clause: The vendor is required…” — the new clause appears first
- vinc_CriticalClauses_PromptColumnDetails — new timestamp
The updated timestamps confirm a new execution ran. The output changed because the input changed. The prompt always reads the current column values at the moment of execution — there is no caching.
CASE STUDY · LEGAL & PROCUREMENT · MICROSOFT DATAVERSE
From Raw Contract to AI-Enriched Record
One status change. Two enrichments. Zero manual effort from the legal team.
This is the rule in action: changing Name or Review Status does not trigger anything — even changing Review Status to satisfy the filter for the first time is not a trigger by itself. Only updating a referenced column — Contract Type or Contract Body — while the filter is satisfied causes execution.
⚠️ If any column shows status 3 (Failed): open the Details column — it contains the error reason. Most common causes: missing Copilot Credits, Copilot features not enabled in the environment, or an input column left empty in the record.
Under the Hood — What Actually Runs
This section documents what is verified about the internal mechanism of Prompt Columns. Every claim has an explicit source.
The FormPredict Action
Microsoft Learn documents a Dataverse Web API action named FormPredict in the Microsoft.Dynamics.CRM namespace, described as “Predict the next field in a record given context.” This is the underlying API that Prompt Columns invoke when they execute. Its parameters reveal exactly what information is sent to the model at runtime:
| Parameter | Type | Description |
|---|---|---|
| context | String | Context to assist prediction |
| requestedFields | Collection(String) | The columns to be predicted — i.e. the Prompt Column output |
| recordValues | String | JSON-serialized current values of the record |
| entityName | String | The logical name of the table |
| predictorFields | Collection(String) | The columns used as input — i.e. the columns you referenced in the prompt |
| clientPartnerSource | String | Used for Copilot Credits metering |
The predictorFields parameter confirms that the model only receives the columns you explicitly referenced. It has no access to other columns, other tables, or SharePoint data. The Knowledge used tab in the Prompt Builder shows exactly what was sent.
Asynchronous Execution
Prompt Column execution is asynchronous — decoupled from the save transaction. The record save returns immediately; the prompt executes in the background and the result is written to the column when ready. The system is capable of processing thousands of records per hour.
Monitoring Execution and Credit Consumption
Every Prompt Column execution is automatically logged in the AI Event table (msdyn_aievent) — a standard Dataverse table documented on Microsoft Learn. This is the authoritative source for execution history, output values, and credit consumption data.
In Power Apps maker portal, go to Tables → search for AI Event → open the default view. Every row is one prompt execution.
Key columns:
| Schema Name | Display Name | What It Contains |
|---|---|---|
| msdyn_name | AI Model | Name of the Prompt Column that ran — format: [Table] – [Column] [timestamp] |
| msdyn_consumptionsource | Consumption Source | For Prompt Columns: API (value 2) |
| msdyn_creditconsumed | Credit Consumed | Shows 0 for Prompt Columns — actual consumption is inside msdyn_eventdata |
| msdyn_output | Output | The generated value — e.g. High, Medium, Low |
| msdyn_eventdata | Event Data | JSON with full consumption details including Copilot credits consumed |
| msdyn_processingdate | Processing Date | Timestamp of execution |
💡 Where the credit value actually lives
The msdyn_creditconsumed column shows 0 for Prompt Columns. The actual credit consumption is inside the msdyn_eventdata JSON field, under messageConsumption.consumption. The partnerSource field confirms the origin: Dataverse.PromptColumn. From our test environment: 0.2 Copilot credits per execution, model gpt-41-mini-2025-04-14.
Operational Considerations
Backfills Are Not Automatic
Existing records are not retroactively processed when a Prompt Column is first created. To populate values on existing records, update one of the columns referenced in the prompt definition. For large-scale backfills, a Power Automate flow that systematically updates a referenced column on each record is a practical workaround — at the cost of Copilot Credits per record.
Disabling Execution
The Allow prompt column execution checkbox on the column properties page controls whether AI processing runs. Disabling it suspends AI analysis without deleting the column definition — useful during data migrations or bulk imports. Both the tenant-level Copilot settings and the column-level setting must be enabled for prompts to execute.
No On-Demand Execution
Prompt Columns trigger on record creation or update only. There is no mechanism to trigger execution manually without touching a record. Updating the prompt definition itself does not re-process existing records.
No Audit Trail
Prompt Columns are not included in Dataverse audit logging. AI-generated values do not appear in the audit trail. For environments where data provenance is a compliance requirement, account for this gap in your governance design.
Cost and Licensing
Prompt Columns consume Copilot Credits per execution. Credit consumption depends on the model used, prompt length, and response length — Microsoft does not publish a fixed per-execution cost. Filter conditions directly reduce credit consumption by skipping executions that do not meet criteria.
⚠️ From November 1, 2026, seeded AI Builder credits will be removed from Power Platform and Dynamics 365 licenses. Copilot Credits will be required. Plan accordingly if you manage license budgets.
What Prompt Columns Change
The significance of Prompt Columns is not just the feature itself — it is what it signals about where the Power Platform is heading. AI enrichment is no longer a pipeline you build on top of your data layer. It is an attribute of the data layer itself.
❌ Before
Enrich a record with AI → build a flow, manage triggers, handle retries, monitor separately. Operational overhead is significant.
✅ After
Define a Prompt Column, set a filter, write the prompt → the platform manages the rest. The enrichment lives in the schema.
The tradeoff is less granular control over the execution pipeline compared to a custom flow — but for the majority of enrichment use cases, that tradeoff is clearly worth it. Prompt Columns don’t remove the need for thoughtful prompt engineering, governance over Copilot Credits, and awareness of the current limitations. But they make AI-enriched data accessible to a much wider range of makers and architects — which is precisely the point.
AI enrichment is no longer something you add to Dataverse. It is now part of what Dataverse is.


















