Prompt Columns bring generative AI directly into the Dataverse data layer.

📌 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:

CodeNameDescription
0NotStartedRecord created. AI analysis has not started yet.
1InProgressAI analysis in progress. Details column shows start timestamp. Output column still empty.
2CompletedPrompt executed successfully. Details column shows completion timestamp.
3FailedAI generation failed. Details column shows error details.
Official Prompt Column status codes (Microsoft Learn)

🔍 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:

  1. 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.
  2. 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.
  3. 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.
  4. 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.comSolutionsNew 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 NewTableTable. 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 → ColumnsNew column. The Name primary column is already there — auto-generated by Dataverse. Add these three columns one at a time:

Display NameData TypeNotes
Contract BodyMultiple lines of textRequired. Select Plain text — not Rich text. Set max length to 2000 characters.
Review StatusChoiceRequired. Options: Draft, Ready for Review, Approved, Rejected. Default: Draft.
Contract TypeChoiceRequired. Options: NDA, MSA, SOW, SLA. No default — must be set explicitly on each record.
Standard columns to create on the Vendor Contract table

⚠️ 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:

FieldValue
NameVertex Analytics — MSA
Contract TypeMSA
Review StatusDraft
Contract BodyPaste 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:

  1. Select and delete {Contract Type} in the prompt text
  2. Type / — the column picker opens immediately
  3. Select Contract Type from the list — it is inserted
  4. Select and delete {Contract Body}
  5. 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.
Screenshot: Prompt Builder — Model response = High, Knowledge used tab with JSON payload

💰 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+ AddAdd rowReview Status equals Ready for ReviewOK.

SaveClose 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 → CloseTest. 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.

SaveEdit filter+ AddAdd rowReview Status equals Ready for ReviewOKSaveClose.

✅ 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:

  1. Delete the current Vertex Analytics — MSA record
  2. 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
  3. 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 LevelMedium (changed from High — 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:

ParameterTypeDescription
contextStringContext to assist prediction
requestedFieldsCollection(String)The columns to be predicted — i.e. the Prompt Column output
recordValuesStringJSON-serialized current values of the record
entityNameStringThe logical name of the table
predictorFieldsCollection(String)The columns used as input — i.e. the columns you referenced in the prompt
clientPartnerSourceStringUsed for Copilot Credits metering
FormPredict action parameters — Microsoft Learn official documentation

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 NameDisplay NameWhat It Contains
msdyn_nameAI ModelName of the Prompt Column that ran — format: [Table] – [Column] [timestamp]
msdyn_consumptionsourceConsumption SourceFor Prompt Columns: API (value 2)
msdyn_creditconsumedCredit ConsumedShows 0 for Prompt Columns — actual consumption is inside msdyn_eventdata
msdyn_outputOutputThe generated value — e.g. High, Medium, Low
msdyn_eventdataEvent DataJSON with full consumption details including Copilot credits consumed
msdyn_processingdateProcessing DateTimestamp of execution
msdyn_aievent key columns — verified from Microsoft Learn schema and real environment data

💡 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.