Microsoft Graph External Connection schema · Platform soft limit: 100–128 properties (overall) · Recommended: keep queryable count well below that · 5 objects: Account, Contact, Lead, Opportunity, Case · Schema annotations guide
IsPrivate might not be supported by the connector platform. IsDeleted shall not be crawled — deleted records are excluded from ingestion.
| #▲ | Section▲ | Property▲ | Type▲ | Description | Semantic Label▲ | S▲ | Q▲ | R▲ | Ref▲ | Note | SF Source | Rationale |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | Common | Id |
String | Unique Salesforce record identifier (18-char). Maps to the external item ID in the Graph connection. Not displayed to users directly. |
Exact match required |
Id |
Salesforce record ID; used as external item ID | |||||
| 2 | Common | Url |
String | Direct URL to open the record in Salesforce. Enables deep-linking from search results and Copilot cards. |
url | Computed: {instanceUrl}/{Id} |
Deep link to the SF record | |||||
| 3 | Common | IconUrl |
String | URL to the object-type icon asset displayed on search result cards (e.g. Account icon, Case icon). |
iconUrl | Computed: per-object icon asset URL |
Drives result card icon | |||||
| 4 | Common | ObjectName |
String | CRM object type name (Account, Contact, Lead, Opportunity, Case). Used as the primary entity-type filter and for the itemType semantic label. |
itemType | Computed: "Account" / "Contact" / ... |
Entity-type discriminator for filtering | |||||
| 5 | Common | Type |
String | Record sub-classification within an object (e.g. 'Customer', 'Partner' for Account; 'Problem', 'Question' for Case). Null for Lead and Contact. |
Null for Lead & Contact |
Acct: Type; Opp: Type; Lead: null; Contact: null; Case: Type |
Classification label (e.g. "Customer", "Problem") | |||||
| 6 | Common | Source |
String | Marketing/lead attribution source indicating how the record entered the pipeline (e.g. 'Web', 'Phone Inquiry', 'Partner Referral'). Merges AccountSource, LeadSource, and Origin into one unified property. |
Merges Origin (Case) with LeadSource |
Acct: AccountSource; Opp: LeadSource; Lead: LeadSource; Contact: LeadSource; Case: Origin |
Pipeline attribution — "leads from web form" | |||||
| 7 | Common | Number |
String | The number assigned to an Account or Case. For Account this is the customer/vendor AccountNumber; for Case this is the auto-generated CaseNumber. Contains null if the record is not an Account or Case. |
secondaryId | Exact match required |
Acct: AccountNumber; Case: CaseNumber; Contact: null; Lead: null; Opp: null |
Account or Case number — "find account #12345" / "find case 00001234" | ||||
| 8 | Common | Name |
String | Primary display name of the record (e.g. account company name, contact full name, opportunity deal name, case subject). Mapped to the 'title' semantic label for search result rendering. |
title | Name |
Primary display name; queryable for name lookups | |||||
| 9 | Common | Description |
String | Free-text description field. Mapped to the CONTENT property for semantic search and Copilot summarization rather than as a schema property, to save property budget. |
Mapped to CONTENT; not a property slot in practice |
Description |
Rich text description | |||||
| 10 | Common | Owner |
Principal | The user who owns this record, resolved as a Principal type carrying both display name and profile URL. Enables queries like 'show my leads' or 'leads owned by Alice'. |
assignedToPeople | Acct: Account Owner; Opp: Opportunity Owner; Lead: Lead Owner; Contact: Contact Owner; Case: Case Owner |
Record owner — "leads owned by Alice" | |||||
| 11 | Common | CreatedBy |
Principal | The user who created this record, resolved as a Principal type. Semantic label 'createdBy' enables platform-native 'created by' filtering in Microsoft Search. |
createdBy | CreatedById → resolve Name + URL |
Audit; semantic label enables platform "created by" | |||||
| 12 | Common | CreatedDate |
DateTime | Timestamp when the record was created. Enables time-based queries like 'cases opened this week' or 'leads created last month'. Semantic label 'createdDateTime'. |
createdDateTime | CreatedDate |
"Cases opened this week" | |||||
| 13 | Common | LastModifiedBy |
Principal | The user who last modified this record, resolved as a Principal type. Semantic label 'lastModifiedBy' for platform audit features. |
lastModifiedBy | LastModifiedById → resolve Name + URL |
Audit field | |||||
| 14 | Common | LastModifiedDate |
DateTime | Timestamp of the most recent modification to the record. Enables recency-based queries like 'recently updated opportunities'. Semantic label 'lastModifiedDateTime'. |
lastModifiedDateTime | LastModifiedDate |
"Recently updated opportunities" | |||||
| 15 | Common | AccountName |
String | Name of the related Account record. For Lead, only populated after conversion (null for unconverted leads). Enables queries like 'find contacts at Acme Corp'. |
Lead only populated after conversion; null for unconverted leads |
Acct: Name; Opp: Account.Name; Contact: Account.Name; Lead: ConvertedAccount.Name; Case: Account.Name |
"Find contacts at Acme Corp" | |||||
| 16 | Common | AccountId |
String | Salesforce ID of the related Account record. Enables relationship traversal across objects. For Lead, only populated after conversion (null for unconverted leads). |
Changed from AccountUrl to AccountId per Yogesh review 2026-04-09: IDs enable relationship traversal |
Acct: Id; Opp: AccountId; Contact: AccountId; Lead: ConvertedAccountId; Case: AccountId |
Related Account ID — enables relationship traversal | |||||
| 17 | Common | ContactName |
String | Full contact name. For Contact and Lead records, this is computed by concatenating Salutation, FirstName, and LastName (e.g. 'Dr. John Smith'). For Opportunity and Case, this is the related Contact's name. Null for Account. |
For Contact & Lead: merged from Salutation, FirstName, LastName — concatenated as "{Salutation} {FirstName} {LastName}", trimmed. For Opp & Case: related contact name. Null for Account. |
Acct: null; Opp: Contact.Name; Contact: Computed: "{Salutation} {FirstName} {LastName}" (e.g. "Dr. John Smith"); Lead: Computed: "{Salutation} {FirstName} {LastName}"; Case: Contact.Name |
Contact's full name with salutation, or related Contact name for other objects | |||||
| 18 | Common | ContactId |
String | Salesforce ID of the related Contact record. For Lead, maps from ConvertedContactId (null for unconverted leads). Null for Account and Contact itself. Enables cross-object relationship traversal. |
Merged from Opp ContactId, Lead ConvertedContactId, Case ContactId into Common per Yogesh review 2026-04-09 |
Acct: null; Opp: ContactId; Contact: null; Lead: ConvertedContactId; Case: ContactId |
Related Contact ID — enables relationship traversal | |||||
| 19 | Common | ContactDetails |
String | Consolidated contact details combining all phone, email, and fax fields into a single searchable JSON string. Contact: work/home/other/mobile/assistant phone + fax + email; Lead: work/mobile phone + fax + email; Account: phone + fax. JSON structure preserves field-type labels. Searchable for keyword discovery but not queryable. |
Merged from Phone, Email, Fax, MobilePhone, HomePhone, OtherPhone, AssistantPhone. Stored as JSON to preserve field-type labels. (2026-04-10) |
Computed: JSON object per object — Contact: {"phone":{work,home,other,mobile,assistant,fax}, "email":Email}; Lead: {"phone":{work,mobile,fax}, "email":Email}; Acct: {"phone":Phone, "fax":Fax}; Opp: null; Case: null |
Consolidated contact info — searchable for keyword discovery, not queryable (avoids LLM confusion from multiple similar fields) | |||||
| 20 | Common | Email |
String | Primary email address. Queryable for exact-match lookups like 'find lead with email X'. Also present in the ContactDetails JSON for keyword discovery. Null for Account and Opportunity. |
Also stored in ContactDetails JSON; this dedicated property enables direct email queries |
Acct: null; Contact: Email; Lead: Email; Opp: null; Case: ContactEmail |
"Find lead with email X" — explicit queryable email for exact-match lookups | |||||
| 21 | Common | Address |
String | Consolidated address field combining all address sources per object into a single searchable JSON string. Account: billing + shipping; Contact: mailing + other; Lead: single address. JSON structure preserves address-type labels (e.g. billing vs shipping) while keeping a single property slot. Searchable for geo keyword discovery; not queryable in Phase 1 — validate coverage via evaluation sets. |
Merged from Acct BillingAddress+ShippingAddress, Contact MailingAddress+OtherAddress, Lead Address into Common. Stored as JSON to preserve billing/shipping/mailing/other distinction. (2026-04-10) |
Computed: JSON object per object — Acct: {"billing":{street,city,state,postalCode,country}, "shipping":{street,city,state,postalCode,country}}; Contact: {"mailing":{street,city,state,postalCode,country}, "other":{street,city,state,postalCode,country}}; Lead: {"address":{street,city,state,postalCode,country}}; Opp: null; Case: null |
Combined address — searchable for geo discovery, not queryable in Phase 1 per Yogesh review | |||||
| 22 | Common | Status |
String | Lifecycle status of the record (e.g. 'Open', 'Closed Won', 'Qualified'). For Opportunity this is StageName (also duplicated to Opp-specific Stage). Null for Account and Contact. |
Opp StageName duplicated to Opp-specific Stage; Acct & Contact have no native status |
Acct: null; Opp: StageName; Lead: Status; Contact: null; Case: Status |
Lifecycle stage — "open cases", "closed-won opps" | |||||
| 23 | Common | IsClosed |
Boolean | Boolean indicating the record has reached a terminal state (closed case, closed opp, converted lead). For Lead, maps from IsConverted. Null for Account and Contact. |
Lead IsConverted ≠ IsClosed semantically |
Acct: null; Opp: IsClosed; Lead: IsConverted; Contact: null; Case: IsClosed |
Terminal-state flag | |||||
| 24 | Common | LastActivityDate |
DateTime | Date of the most recent logged activity (call, email, task) on the record. Useful for detecting stale records (e.g. 'accounts with no activity in 90 days'). Null for Case. |
Null for Case |
Acct: LastActivityDate; Contact: ...; Lead: ...; Opp: ...; Case: null |
Date of last logged activity (call, email, task) | |||||
| 25 | Common | Industry |
String | Industry classification picklist (e.g. 'Technology', 'Healthcare', 'Finance'). Only populated for Account and Lead. Enables queries like 'show tech industry accounts'. |
Picklist; only populated for Account & Lead |
Acct: Industry; Lead: Industry; Contact: null; Opp: null; Case: null |
"Show tech industry records" | |||||
| 26 | Common | Rating |
String | Engagement rating picklist (Hot, Warm, Cold). Same picklist on both Account and Lead. Null for Contact, Opportunity, and Case. |
Picklist; same values on Account & Lead; null for other objects |
Acct: Rating; Lead: Rating; Contact: null; Opp: null; Case: null |
Engagement rating (Hot/Warm/Cold) | |||||
| 27 | Common | Website |
String | Company website URL. Only populated for Account and Lead. Null for Contact, Opportunity, and Case. |
Only populated for Account & Lead; null for other objects |
Acct: Website; Lead: Website; Contact: null; Opp: null; Case: null |
Company website URL | |||||
| 28 | Common | AnnualRevenue |
Int64 | Annual revenue of the company, normalized to the org's base currency. Only populated for Account and Lead. Base currency must be specified in the Copilot description during Connector setup. |
Normalized to org's base currency; base currency must be specified in Copilot description during Connector setup (2026-04-09 review) |
Acct: AnnualRevenue; Lead: AnnualRevenue; Contact: null; Opp: null; Case: null |
Revenue-based filtering — "accounts over $1M" | |||||
| 29 | Common | NumberOfEmployees |
Int64 | Number of employees at the company. Only populated for Account and Lead. |
Only Account & Lead |
Acct: NumberOfEmployees; Lead: NumberOfEmployees; Contact: null; Opp: null; Case: null |
Size-based filtering — "enterprise accounts with 1000+ employees" | |||||
| 30 | Common | ParentId |
String | Foreign key to the parent record. Account links to parent Account; Case links to parent Case. The 'parentId' semantic label enables platform hierarchy navigation. |
parentId | Account → parent Account; Case → parent Case; null for other objects |
Acct: ParentId; Case: ParentId; Lead: null; Contact: null; Opp: null |
FK to parent record; enables hierarchy features | ||||
| 31 | Common | ParentName |
String | Display name of the parent record. For Account this is the parent account name; for Case it's the parent case number. Denormalized for display without additional lookups. |
Account uses parent account name; Case uses parent case number |
Acct: Parent.Name; Case: Parent.CaseNumber; others: null |
Parent record display name — denormalized | |||||
| 32 | Common | ParentUrl |
String | URL deep link to the parent record in Salesforce. Null when no parent relationship exists. |
parentURL | Null when ParentId is empty |
Computed: {instanceUrl}/{ParentId} |
Deep link to parent record | ||||
| 33 | Common | ClosedDate |
DateTime | Date the record was closed or converted. For Opportunity this is CloseDate; for Lead it's ConvertedDate; for Case it's ClosedDate. Null for Account and Contact. |
Lead duplicates from ConvertedDate; Acct & Contact have no close date |
Acct: null; Opp: CloseDate; Lead: ConvertedDate; Contact: null; Case: ClosedDate |
Date the record was closed/converted | |||||
| 34 | Account | Ownership |
String | Ownership structure picklist (Public, Private, Subsidiary, Other). |
Picklist: Public, Private, Subsidiary, etc. |
Ownership |
"Show publicly traded accounts" | |||||
| 35 | Account | TickerSymbol |
String | Stock market ticker symbol (e.g. 'MSFT', 'AAPL'). Only relevant for publicly traded companies. |
Null for private companies |
TickerSymbol |
Stock ticker for public companies | |||||
| 36 | Account | SicCode |
String | Standard Industrial Classification (SIC) code for industry categorization. Complements the Industry picklist for more granular classification. |
Complements Industry for fine-grained classification |
Sic |
Standard Industrial Classification code | |||||
| 37 | Account | Site |
String | Location descriptor label for the account (e.g. 'HQ', 'Branch', 'Regional Office'). Not the website URL — purely an organizational location label. |
Not the website — this is a location descriptor |
Site |
Account site/location label (e.g. "HQ", "Branch") | |||||
| 38 | Contact | JobTitle |
String | Job title of the contact or lead (e.g. 'VP of Engineering', 'CTO'). Free-text field with inconsistent values — better suited as searchable for keyword discovery rather than queryable. Renamed from Title to JobTitle to avoid confusion with Object Type. |
Renamed from Title to JobTitle to avoid confusion; covers both Contact and Lead Title fields. Searchable-only per Yogesh review 2026-04-09 |
Contact: Title |
Job title — searchable for keyword discovery, not queryable due to inconsistent values (CTO vs Chief Technology Officer) | |||||
| 39 | Contact | Department |
String | Department the contact belongs to (e.g. 'Engineering', 'Sales', 'Marketing'). Free-text field with inconsistent entries — better suited as searchable rather than queryable. |
Searchable-only per Yogesh review 2026-04-09 |
Department |
Department — searchable for keyword discovery, not queryable due to inconsistent values | |||||
| 40 | Contact | Birthdate |
DateTime | Contact's date of birth. PII-sensitive — some organizations may choose not to index this field. |
PII consideration |
Birthdate |
Contact's date of birth | |||||
| 41 | Contact | AssistantName |
String | Name of the contact's administrative assistant. |
AssistantName |
Name of contact's assistant | ||||||
| 42 | Contact | ReportsTo |
String | Name of the contact's manager/supervisor, denormalized from the ReportsTo relationship. Enables hierarchical queries like 'who does X report to'. |
Enables "who does X report to" queries |
ReportsTo.Name |
Manager/supervisor name — denormalized | |||||
| 43 | Contact | ReportsToId |
String | Salesforce ID of the contact's manager/supervisor. Enables hierarchy traversal for queries like 'find all contacts reporting to X'. Changed from URL to ID per schema review — IDs are needed for programmatic hierarchy navigation. |
Changed from ReportsToUrl to ReportsToId per Yogesh review 2026-04-09: IDs enable hierarchy traversal |
ReportsToId |
Manager ID — enables hierarchy traversal ("find all contacts reporting to X") | |||||
| 44 | Lead | ConvertedDate |
DateTime | Date when the lead was converted to a Contact + Account + Opportunity. Null for unconverted leads. |
Null for unconverted leads |
ConvertedDate |
Date the lead was converted | |||||
| 45 | Lead | ConvertedOpportunityName |
String | Name of the Opportunity record created during lead conversion. Denormalized from ConvertedOpportunityId for human-readable display. Null if no Opportunity was created. |
Null if no Opp was created during conversion |
ConvertedOpportunity.Name |
Name of the Opportunity created at conversion | |||||
| 46 | Lead | ConvertedOpportunityId |
String | Salesforce ID of the Opportunity record created during lead conversion. Enables relationship traversal to the converted opportunity. Null if no Opportunity was created. |
Changed from ConvertedOpportunityUrl to ConvertedOpportunityId per Yogesh review 2026-04-09 |
ConvertedOpportunityId |
ID of Opportunity created at conversion — enables relationship traversal | |||||
| 47 | Lead | Company |
String | Company or organization name for the lead. Free-text field populated before conversion. After conversion, the Account name is available via common AccountName. |
Free-text field; pre-conversion only |
Company |
Lead company name — "leads from Acme" | |||||
| 48 | Opportunity | Stage |
String | Opportunity pipeline stage (e.g. 'Prospecting', 'Negotiation', 'Closed Won'). Intentionally duplicates common Status because Stage is the primary CRM concept for opportunities. |
Duplicates common Status intentionally |
StageName |
Pipeline stage — "Prospecting", "Closed Won" | |||||
| 49 | Opportunity | Amount |
Int64 | Deal monetary value. Key pipeline metric for revenue-based queries like 'opportunities over $100K'. Normalized to org's base currency. Base currency must be specified in the Copilot description during Connector setup. |
Normalized to org's base currency; base currency must be specified in Copilot description during Connector setup (2026-04-09 review) |
Amount |
Deal value — "opportunities over $100K" | |||||
| 50 | Opportunity | Probability |
Int32 | Estimated probability of winning the deal as a percentage (0-100). Often auto-populated based on Stage in many Salesforce orgs. |
Normalized to org's base currency; base currency must be specified in Copilot description during Connector setup (2026-04-09 review) |
Probability |
Win probability percentage | |||||
| 51 | Opportunity | ExpectedRevenue |
Int64 | Weighted expected revenue calculated as Amount multiplied by Probability. Computed by Salesforce; normalized to org's base currency. Base currency must be specified in the Copilot description during Connector setup. |
Normalized to org's base currency; base currency must be specified in Copilot description during Connector setup (2026-04-09 review) |
ExpectedRevenue |
Weighted revenue (Amount x Probability) | |||||
| 52 | Opportunity | NextStep |
String | Free-text field describing the next planned action or milestone for this deal. |
NextStep |
Free-text next action for the deal | ||||||
| 53 | Opportunity | IsWon |
Boolean | Boolean flag indicating whether the opportunity was won. Combined with IsClosed distinguishes between 'Closed Won' and 'Closed Lost'. |
Complements IsClosed — closed-won vs closed-lost |
IsWon |
Win/loss flag | |||||
| 54 | Opportunity | ForecastCategory |
String | Sales forecast category bucket (Pipeline, Best Case, Commit, Closed). Key field for sales forecasting roll-ups and pipeline reviews. |
Key for sales forecasting roll-ups |
ForecastCategoryName |
Forecast bucket (Pipeline, Best Case, Commit, Closed) | |||||
| 55 | Opportunity | FiscalQuarter |
Int32 | Fiscal quarter number (1-4) computed by Salesforce based on CloseDate and the org's fiscal year settings. |
SF-computed from CloseDate + org fiscal year settings |
FiscalQuarter |
Fiscal quarter (1-4) | |||||
| 56 | Opportunity | FiscalYear |
Int32 | Fiscal year number computed by Salesforce based on CloseDate and the org's fiscal year settings. |
SF-computed |
FiscalYear |
Fiscal year | |||||
| 57 | Opportunity | Fiscal |
String | Human-readable fiscal period label combining year and quarter (e.g. '2026 Q2'). Convenience property for display. |
Combined fiscal quarter + year |
Fiscal |
Fiscal period label (e.g. "2026 Q2") | |||||
| 58 | Case | Subject |
String | Case subject line / headline summarizing the issue. Primary textual identifier beyond the auto-numbered CaseNumber. |
Primary text for case identification beyond CaseNumber |
Subject |
Case headline/summary | |||||
| 59 | Case | Priority |
String | Case priority picklist (High, Medium, Low, Critical). Key triage filter for support workflows — 'show high priority cases'. Semantic label 'priority'. |
priority | Key triage filter |
Priority |
Case priority (High/Medium/Low) | ||||
| 60 | Case | Reason |
String | Root cause category picklist (e.g. 'Installation', 'Performance', 'User Error'). |
Picklist; categorizes root cause |
Reason |
Case reason (e.g. "Installation", "Performance") | |||||
| 61 | Case | IsEscalated |
Boolean | Boolean flag indicating the case has been escalated. Useful for identifying and filtering escalated support issues. |
Useful for escalation reporting |
IsEscalated |
Whether the case has been escalated | |||||
| 62 | Case | InternalComments |
String | Internal agent-facing comments and case notes. Mapped to CONTENT for semantic search alongside the Description field. |
Mapped to CONTENT alongside Description |
Comments |
Internal comments / case notes | |||||
| 63 | Case | SuppliedEmail |
String | Email address submitted through Web-to-Case or Email-to-Case. May differ from the linked Contact's email for unlinked cases. |
May differ from Contact email |
SuppliedEmail |
Email address submitted via Web-to-Case |