Dynamics 365 Sales Module Deep Dive: Getting Started
Subject: "New Qualified Opportunity: [Topic]" Body: Include budget, timeline, contact details
- Create Task: "Schedule Discovery Call" Due: 2 business days Assign: Opportunity Owner
**Conditional Branching (Large Deals):**
```javascript
// Client-side script: BPF stage change event
function onStageChange(executionContext) {
var formContext = executionContext.getFormContext();
var activeStage = formContext.data.process.getActiveStage();
if (activeStage.getName() === "Propose Solution") {
var revenue = formContext.getAttribute("estimatedvalue").getValue();
if (revenue > 100000) {
// Show approval section
formContext.ui.tabs.get("tab_approval").setVisible(true);
formContext.getAttribute("contoso_approvalstatus").setRequiredLevel("required");
// Trigger approval workflow
Xrm.WebApi.online.execute({
uri: "/api/data/v9.2/contoso_triggerapprovalproperty",
method: "POST",
data: {opportunityid: formContext.data.entity.getId()}
});
}
}
}
// Register on BPF stage change
formContext.data.process.addOnStageChange(onStageChange);
Step 3: Configure Forms & Views
Opportunity Form Customization:
Header Section (always visible):
- Opportunity Name
- Estimated Revenue
- Close Date
- Sales Stage (BPF current stage)
General Tab:
- Account (lookup)
- Primary Contact (lookup)
- Description
- Budget Amount (custom field)
Stakeholders Tab:
- Subgrid: Related Contacts with Roles
- Columns: Name, Role, Decision Maker (Y/N), Influence Level
Products Tab:
- Subgrid: Opportunity Products
- Inline editable for quick updates
Competitors Tab:
- Subgrid: Competitor Analysis
- Quick Create form enabled
Documents Tab:
- SharePoint document library integration
- Filter: Proposals, Contracts, Presentations
Quick View Form (Account Summary on Opportunity):
Account Quick View:
- Account Name
- Parent Account
- Annual Revenue
- Number of Employees
- Primary Contact
- Last Purchase Date (custom rollup)
- Total Contract Value (custom rollup)
// Shows account context without leaving opportunity form
Custom View: High-Value Pipeline
<fetch>
<entity name="opportunity">
<attribute name="name" />
<attribute name="estimatedvalue" />
<attribute name="estimatedclosedate" />
<attribute name="customerid" />
<attribute name="stepname" /> <!-- BPF current stage -->
<filter>
<condition attribute="statecode" operator="eq" value="0" /> <!-- Open -->
<condition attribute="estimatedvalue" operator="ge" value="100000" />
</filter>
<order attribute="estimatedvalue" descending="true" />
</entity>
</fetch>
Form Script: Auto-Calculate Weighted Revenue
function calculateWeightedRevenue(executionContext) {
var formContext = executionContext.getFormContext();
var estimatedRevenue = formContext.getAttribute("estimatedvalue").getValue() || 0;
var probability = formContext.getAttribute("closeprobability").getValue() || 0;
var weightedRevenue = estimatedRevenue * (probability / 100);
formContext.getAttribute("contoso_weightedrevenue").setValue(weightedRevenue);
}
// Register on field change
formContext.getAttribute("estimatedvalue").addOnChange(calculateWeightedRevenue);
formContext.getAttribute("closeprobability").addOnChange(calculateWeightedRevenue);
Step 4: Product Catalog & Price Lists
Unit Group Setup:
Unit Group: Software Licenses
Base Unit: License
Conversions:
- 1 License Pack (5 licenses) = 5 Licenses
- 1 License Pack (10 licenses) = 10 Licenses
- 1 Enterprise Bundle (50 licenses) = 50 Licenses
Unit Group: Consulting Services
Base Unit: Hour
Conversions:
- 1 Day = 8 Hours
- 1 Week = 40 Hours
Product Hierarchy:
Diagram: See the official Microsoft documentation for architecture details.
Price List Configuration:
Price List: Standard Price List (USD)
Currency: US Dollar
Valid From: 2025-01-01
Products:
- Microsoft 365 E5: $57.00/license
- Azure Consulting: $200.00/hour
Price List: Enterprise Price List (USD)
Currency: US Dollar
Valid From: 2025-01-01
Products:
- Microsoft 365 E5: $50.00/license (bulk discount)
- Azure Consulting: $175.00/hour (volume discount)
Apply to: Accounts with > 500 employees
Discount List (Volume Discounts):
Discount List: Volume License Discount
Apply to: Microsoft 365 E5
Tiers:
- 1-49 licenses: 0% discount (list price)
- 50-199 licenses: 10% discount
- 200-499 licenses: 15% discount
- 500+ licenses: 20% discount
Discount Type: Percentage
Automatic Application: Yes
Add Products to Opportunity:
// Power Automate: Auto-suggest products based on account industry
Trigger: Opportunity created
Condition: Account Industry = "Financial Services"
Action: Create Opportunity Products
- Add: Compliance Bundle
- Add: Security Assessment (10 hours)
- Notification: "Suggested products added based on industry"
Step 5: Automations & Workflows
[Power Automate vs classic workflows decision]
Step 6: Reporting & Dashboards
[Sales dashboards, forecasting visuals, KPIs]
Best Practices
- Keep forms lean; remove unused legacy fields
- Use solution layering for managed deployments
- Document security roles vs entity privileges
Common Issues & Troubleshooting
Figure: Configuration and management dashboard with status overview.
Issue: Business Process Flow stage won't advance
Symptom: "Next Stage" button disabled or error on click
Diagnostic Steps:
1. Check required fields: All stage-specific required fields filled?
2. Check field-level security: User has read/write access to all fields?
3. Check plugin errors:
Settings → System Jobs → Filter by "Failed"
Review exception details
4. Check conditional branching logic: JavaScript errors in console?
Solution:
// Enable all required fields
formContext.getAttribute("budgetamount").setRequiredLevel("required");
// Check for plugin errors
SELECT TOP 10
Message,
FriendlyMessage,
ErrorCode
FROM AsyncOperationBase
WHERE StatusCode = 31 -- Failed
AND RegardingObjectId = '<opportunity-id>'
ORDER BY CreatedOn DESC;
Issue: Form loads slowly (5+ seconds)
Causes:
1. Too many subgrids loading data simultaneously
2. Heavy JavaScript in onLoad event
3. Complex security role calculations
4. Multiple web resources loading external content
Solution:
1. Lazy-load subgrids:
Subgrid Properties → Display → "Show list of associated records": No
Load on demand with tab selection
2. Defer non-critical scripts:
Form Properties → Events → OnLoad
Set "Pass execution context": Yes
Use setTimeout() for non-blocking operations
3. Optimize views used by subgrids:
Reduce columns, add filters to limit rows
4. Monitor with Browser DevTools:
Network tab: Identify slow API calls
Performance tab: Profile JavaScript execution
Issue: Product prices not calculating correctly
Problem: Discount not applied, wrong price list used
Diagnostic:
1. Check opportunity price list: Is correct price list associated?
2. Check product existence in price list
3. Verify discount list date range (valid from/to)
4. Check unit conversion: Using correct unit of measure?
Solution:
// Query to verify price list items
SELECT
p.Name AS ProductName,
pl.Name AS PriceListName,
pli.Amount AS Price,
pli.UoMId
FROM ProductPriceLevel pli
INNER JOIN Product p ON pli.ProductId = p.ProductId
INNER JOIN PriceLevel pl ON pli.PriceLevelId = pl.PriceLevelId
WHERE p.ProductId = '<product-id>'
AND pl.PriceLevelId = '<opportunity-pricelevel-id>';
Issue: Users can't see opportunities (security)
Problem: "You do not have permission to access these records"
Solution:
1. Assign security role with Opportunity privileges:
Settings → Security → Security Roles
Select role → Core Records → Opportunity
Grant: Create, Read, Write, Append (User level minimum)
2. Check ownership: Opportunities owned by user or team?
3. Check Business Unit hierarchy: User in correct BU?
4. Grant specific record access:
Opportunity → Share → Select user → Grant access
// PowerShell: Bulk assign security role
Add-MsolRoleMember -RoleName "Sales Manager" -RoleMemberEmailAddress "user@contoso.com"
> **Architecture Overview:** ## Real World Customization Examples
Architecture Decision and Tradeoffs
When designing business applications solutions with Dynamics 365, consider these key architectural trade-offs:
| Approach | Best For | Tradeoff |
|---|---|---|
| Managed / platform service | Rapid delivery, reduced ops burden | Less customisation, potential vendor lock-in |
| Custom / self-hosted | Full control, advanced tuning | Higher operational overhead and cost |
Recommendation: Start with the managed approach for most workloads and move to custom only when specific requirements demand it.
Security and Governance Considerations
- Least Privilege: Grant only the permissions required for each role
- Secret Management: Store credentials in Azure Key Vault or equivalent; never hard-code secrets
- Audit Logging: Enable diagnostic and activity logs for compliance and forensic analysis
- Data Protection: Encrypt data at rest and in transit; classify data with sensitivity labels where applicable
Cost and Performance Notes
- Primary Cost Drivers: Compute tier, storage volume, and network egress
- Optimization Levers: Right-size resources, use reserved instances or savings plans, and review Azure Advisor recommendations regularly
- Performance Baseline: Define SLAs, latency targets, and throughput thresholds before going live
- Scaling Strategy: Use auto-scale rules and monitor utilisation to balance cost and responsiveness
Validation and Versioning
- Last Validated: April 2026
- Tested With: Current generally-available Dynamics 365 APIs and SDKs
- Known Constraints: Check regional availability and service limits before production deployment
Official Microsoft References
Public Examples from Official Sources
Discussion