Prompt: “Create a simple CRM to manage leads for my online SAAS business”
Copy
Ask AI
{
"domainModel": {
"models": [
{
"id": "urn:sutro:model:user",
"name": "User",
"isUserModel": true,
"fields": [
{
"id": "urn:sutro:edge:name",
"name": "name",
"to": "p_TEXT",
"relationshipType": "hasOne"
},
{
"id": "urn:sutro:edge:email",
"name": "email",
"to": "p_TEXT",
"relationshipType": "hasOne"
},
{
"id": "urn:sutro:edge:ownedLeads",
"name": "ownedLeads",
"to": "urn:sutro:model:lead",
"relationshipType": "hasMany"
}
],
"requirements": [
{
"id": "@requirement/userInspect",
"type": "usability",
"parentId": null,
"description": "Users should be able to view their own profile and current lead assignments",
"importanceForUser": "required",
"importanceForBusiness": "required",
"frequencyOfUse": "occasionally"
}
],
"navigateToOnCreate": "/",
"navigateToOnDelete": "/"
},
{
"id": "urn:sutro:model:lead",
"name": "Lead",
"isUserModel": false,
"fields": [
{
"id": "urn:sutro:edge:name",
"name": "name",
"to": "p_TEXT",
"relationshipType": "hasOne"
},
{
"id": "urn:sutro:edge:email",
"name": "email",
"to": "p_TEXT",
"relationshipType": "hasOne"
},
{
"id": "urn:sutro:edge:phone",
"name": "phone",
"to": "p_PHONE_NUMBER",
"relationshipType": "hasOne"
},
{
"id": "urn:sutro:edge:source",
"name": "source",
"to": "p_TEXT",
"relationshipType": "hasOne"
},
{
"id": "urn:sutro:edge:status",
"name": "status",
"to": "p_TEXT",
"relationshipType": "hasOne"
},
{
"id": "urn:sutro:edge:owner",
"name": "owner",
"to": "urn:sutro:model:user",
"relationshipType": "belongsToOne"
},
{
"id": "urn:sutro:edge:activities",
"name": "activities",
"to": "urn:sutro:model:activity",
"relationshipType": "hasMany"
},
{
"id": "urn:sutro:edge:notes",
"name": "notes",
"to": "p_TEXT",
"relationshipType": "hasOne"
},
{
"id": "urn:sutro:edge:createdAt",
"name": "createdAt",
"to": "p_DATE_TIME",
"relationshipType": "hasOne"
},
{
"id": "urn:sutro:edge:updatedAt",
"name": "updatedAt",
"to": "p_DATE_TIME",
"relationshipType": "hasOne"
}
],
"requirements": [
{
"id": "@requirement/captureLeadInfo",
"type": "userJourneyStep",
"parentId": "@userJourney/createNewLead",
"description": "User enters lead contact information (name, email, phone) with validation applied per @requirement/dataValidation",
"importanceForUser": "critical",
"importanceForBusiness": "critical",
"frequencyOfUse": "often"
},
{
"id": "@requirement/specifyLeadSource",
"type": "userJourneyStep",
"parentId": "@userJourney/createNewLead",
"description": "User specifies the lead source (website, referral, campaign, etc.)",
"importanceForUser": "critical",
"importanceForBusiness": "critical",
"frequencyOfUse": "often"
},
{
"id": "@requirement/assignLeadOwner",
"type": "userJourneyStep",
"parentId": "@userJourney/createNewLead",
"description": "User assigns the lead to a sales team member per @requirement/leadOwnershipTracking",
"importanceForUser": "critical",
"importanceForBusiness": "critical",
"frequencyOfUse": "often"
},
{
"id": "@requirement/displayLeadsSummary",
"type": "userJourneyStep",
"parentId": "@userJourney/viewLeadList",
"description": "LeadList displays all leads with key information (name, email, phone, source, status)",
"importanceForUser": "critical",
"importanceForBusiness": "critical",
"frequencyOfUse": "always"
},
{
"id": "@requirement/changeLeadStatus",
"type": "userJourneyStep",
"parentId": "@userJourney/updateLeadStatus",
"description": "User advances lead status through pipeline stages (new → contacted → qualified → converted/lost) using Lead.advanceStatus",
"importanceForUser": "required",
"importanceForBusiness": "required",
"frequencyOfUse": "often"
},
{
"id": "@requirement/dataValidation",
"type": "usability",
"parentId": null,
"description": "Email and phone number fields should be validated to ensure data quality and prevent invalid entries",
"importanceForUser": "required",
"importanceForBusiness": "required",
"frequencyOfUse": "always"
},
{
"id": "@requirement/leadOwnershipTracking",
"type": "usability",
"parentId": null,
"description": "System should track which sales representative owns each lead and allow reassignment",
"importanceForUser": "required",
"importanceForBusiness": "required",
"frequencyOfUse": "often"
},
{
"id": "@requirement/auditTrail",
"type": "usability",
"parentId": null,
"description": "All changes to leads should be tracked with timestamps and user information for compliance and transparency",
"importanceForUser": "vital",
"importanceForBusiness": "vital",
"frequencyOfUse": "often"
}
],
"navigateToOnCreate": "/leads/:leadId",
"navigateToOnDelete": "/leads"
},
{
"id": "urn:sutro:model:activity",
"name": "Activity",
"isUserModel": false,
"fields": [
{
"id": "urn:sutro:edge:type",
"name": "type",
"to": "p_TEXT",
"relationshipType": "hasOne"
},
{
"id": "urn:sutro:edge:lead",
"name": "lead",
"to": "urn:sutro:model:lead",
"relationshipType": "belongsToOne"
},
{
"id": "urn:sutro:edge:details",
"name": "details",
"to": "p_TEXT",
"relationshipType": "hasOne"
},
{
"id": "urn:sutro:edge:timestamp",
"name": "timestamp",
"to": "p_DATE_TIME",
"relationshipType": "hasOne"
},
{
"id": "urn:sutro:edge:createdBy",
"name": "createdBy",
"to": "urn:sutro:model:user",
"relationshipType": "belongsToOne"
}
],
"requirements": [
{
"id": "@requirement/enterActivityDetails",
"type": "userJourneyStep",
"parentId": "@userJourney/logLeadInteraction",
"description": "User enters activity details, notes, and timestamp information",
"importanceForUser": "required",
"importanceForBusiness": "required",
"frequencyOfUse": "often"
},
{
"id": "@requirement/selectActivityType",
"type": "userJourneyStep",
"parentId": "@userJourney/logLeadInteraction",
"description": "User selects activity type (call, email, meeting, or note)",
"importanceForUser": "required",
"importanceForBusiness": "required",
"frequencyOfUse": "often"
},
{
"id": "@requirement/auditTrail",
"type": "usability",
"parentId": null,
"description": "All changes to leads should be tracked with timestamps and user information for compliance and transparency",
"importanceForUser": "vital",
"importanceForBusiness": "vital",
"frequencyOfUse": "often"
}
],
"navigateToOnCreate": "/leads/:leadId",
"navigateToOnDelete": "/leads/:leadId"
}
]
},
"requirements": [
{
"id": "@requirement/dataValidation",
"type": "usability",
"parentId": null,
"description": "Email and phone number fields should be validated to ensure data quality and prevent invalid entries",
"importanceForUser": "required",
"importanceForBusiness": "required",
"frequencyOfUse": "always"
},
{
"id": "@requirement/leadOwnershipTracking",
"type": "usability",
"parentId": null,
"description": "System should track which sales representative owns each lead and allow reassignment",
"importanceForUser": "required",
"importanceForBusiness": "required",
"frequencyOfUse": "often"
},
{
"id": "@requirement/auditTrail",
"type": "usability",
"parentId": null,
"description": "All changes to leads should be tracked with timestamps and user information for compliance and transparency",
"importanceForUser": "vital",
"importanceForBusiness": "vital",
"frequencyOfUse": "often"
},
{
"id": "@requirement/userInspect",
"type": "usability",
"parentId": null,
"description": "Users should be able to view their own profile and current lead assignments",
"importanceForUser": "required",
"importanceForBusiness": "required",
"frequencyOfUse": "occasionally"
},
{
"id": "@requirement/newLeadForm",
"type": "userJourneyStep",
"parentId": "@userJourney/createNewLead",
"description": "User navigates to the LeadList and initiates lead creation",
"importanceForUser": "critical",
"importanceForBusiness": "critical",
"frequencyOfUse": "often"
},
{
"id": "@requirement/captureLeadInfo",
"type": "userJourneyStep",
"parentId": "@userJourney/createNewLead",
"description": "User enters lead contact information (name, email, phone) with validation applied per @requirement/dataValidation",
"importanceForUser": "critical",
"importanceForBusiness": "critical",
"frequencyOfUse": "often"
},
{
"id": "@requirement/specifyLeadSource",
"type": "userJourneyStep",
"parentId": "@userJourney/createNewLead",
"description": "User specifies the lead source (website, referral, campaign, etc.)",
"importanceForUser": "critical",
"importanceForBusiness": "critical",
"frequencyOfUse": "often"
},
{
"id": "@requirement/assignLeadOwner",
"type": "userJourneyStep",
"parentId": "@userJourney/createNewLead",
"description": "User assigns the lead to a sales team member per @requirement/leadOwnershipTracking",
"importanceForUser": "critical",
"importanceForBusiness": "critical",
"frequencyOfUse": "often"
},
{
"id": "@requirement/confirmLeadCreation",
"type": "userJourneyStep",
"parentId": "@userJourney/createNewLead",
"description": "LeadList.addLead creates the lead and stores it in the system, audit trail is created",
"importanceForUser": "critical",
"importanceForBusiness": "critical",
"frequencyOfUse": "often"
},
{
"id": "@requirement/accessLeadList",
"type": "userJourneyStep",
"parentId": "@userJourney/viewLeadList",
"description": "User navigates to the leads list view",
"importanceForUser": "critical",
"importanceForBusiness": "critical",
"frequencyOfUse": "always"
},
{
"id": "@requirement/displayLeadsSummary",
"type": "userJourneyStep",
"parentId": "@userJourney/viewLeadList",
"description": "LeadList displays all leads with key information (name, email, phone, source, status)",
"importanceForUser": "critical",
"importanceForBusiness": "critical",
"frequencyOfUse": "always"
},
{
"id": "@requirement/searchFilterLeads",
"type": "userJourneyStep",
"parentId": "@userJourney/viewLeadList",
"description": "User can search or filter leads using LeadList.findRelevantLead by various criteria",
"importanceForUser": "critical",
"importanceForBusiness": "critical",
"frequencyOfUse": "always"
},
{
"id": "@requirement/viewLeadDetail",
"type": "userJourneyStep",
"parentId": "@userJourney/viewLeadList",
"description": "User selects a lead and calls Lead.inspect to view full details",
"importanceForUser": "critical",
"importanceForBusiness": "critical",
"frequencyOfUse": "always"
},
{
"id": "@requirement/openLeadRecord",
"type": "userJourneyStep",
"parentId": "@userJourney/updateLeadStatus",
"description": "User finds and opens a lead record using LeadList.findRelevantLead and Lead.inspect",
"importanceForUser": "required",
"importanceForBusiness": "required",
"frequencyOfUse": "often"
},
{
"id": "@requirement/changeLeadStatus",
"type": "userJourneyStep",
"parentId": "@userJourney/updateLeadStatus",
"description": "User advances lead status through pipeline stages (new → contacted → qualified → converted/lost) using Lead.advanceStatus",
"importanceForUser": "required",
"importanceForBusiness": "required",
"frequencyOfUse": "often"
},
{
"id": "@requirement/updateLeadDetails",
"type": "userJourneyStep",
"parentId": "@userJourney/updateLeadStatus",
"description": "User updates other details as needed using Lead.updateContactInfo or Lead.reassignOwner",
"importanceForUser": "required",
"importanceForBusiness": "required",
"frequencyOfUse": "often"
},
{
"id": "@requirement/persistLeadChanges",
"type": "userJourneyStep",
"parentId": "@userJourney/updateLeadStatus",
"description": "System saves changes and creates audit trail entries per @requirement/auditTrail",
"importanceForUser": "required",
"importanceForBusiness": "required",
"frequencyOfUse": "often"
},
{
"id": "@requirement/openLeadForActivity",
"type": "userJourneyStep",
"parentId": "@userJourney/logLeadInteraction",
"description": "User finds and opens a lead record using LeadList.findRelevantLead",
"importanceForUser": "required",
"importanceForBusiness": "required",
"frequencyOfUse": "often"
},
{
"id": "@requirement/selectActivityType",
"type": "userJourneyStep",
"parentId": "@userJourney/logLeadInteraction",
"description": "User selects activity type (call, email, meeting, or note)",
"importanceForUser": "required",
"importanceForBusiness": "required",
"frequencyOfUse": "often"
},
{
"id": "@requirement/enterActivityDetails",
"type": "userJourneyStep",
"parentId": "@userJourney/logLeadInteraction",
"description": "User enters activity details, notes, and timestamp information",
"importanceForUser": "required",
"importanceForBusiness": "required",
"frequencyOfUse": "often"
},
{
"id": "@requirement/persistActivity",
"type": "userJourneyStep",
"parentId": "@userJourney/logLeadInteraction",
"description": "ActivityLog.logActivity creates the activity record with permanent audit trail per @requirement/auditTrail",
"importanceForUser": "required",
"importanceForBusiness": "required",
"frequencyOfUse": "often"
},
{
"id": "@requirement/accessPipelineView",
"type": "userJourneyStep",
"parentId": "@userJourney/viewLeadPipeline",
"description": "User navigates to the pipeline or dashboard view",
"importanceForUser": "required",
"importanceForBusiness": "required",
"frequencyOfUse": "often"
},
{
"id": "@requirement/displayPipelineStages",
"type": "userJourneyStep",
"parentId": "@userJourney/viewLeadPipeline",
"description": "Pipeline.viewByStage organizes and displays leads in columns by status/stage (new, contacted, qualified, converted, lost)",
"importanceForUser": "required",
"importanceForBusiness": "required",
"frequencyOfUse": "often"
},
{
"id": "@requirement/viewStageCounts",
"type": "userJourneyStep",
"parentId": "@userJourney/viewLeadPipeline",
"description": "User can see lead counts for each pipeline stage to understand distribution",
"importanceForUser": "required",
"importanceForBusiness": "required",
"frequencyOfUse": "often"
},
{
"id": "@requirement/identifyPriorities",
"type": "userJourneyStep",
"parentId": "@userJourney/viewLeadPipeline",
"description": "User uses Pipeline.identifyBottlenecks to spot stages with high lead counts and identify priority areas",
"importanceForUser": "required",
"importanceForBusiness": "required",
"frequencyOfUse": "often"
}
],
"sitemap": {
"nodes": [
{
"id": "dashboard",
"type": "Page",
"route": "/",
"context": null,
"content": [
{
"title": "Pipeline Overview",
"description": "Visual dashboard displaying leads organized by pipeline stages (new, contacted, qualified, converted, lost) with lead counts and status indicators for quick pipeline management"
},
{
"title": "Quick Stats",
"description": "Summary metrics showing total leads, leads by stage, and key performance indicators for sales pipeline"
},
{
"title": "Recent Activities",
"description": "Feed of recently logged activities including calls, emails, meetings, and notes across all leads with timestamps"
}
],
"referencesRequirements": [
"@requirement/accessPipelineView",
"@requirement/displayPipelineStages",
"@requirement/viewStageCounts",
"@requirement/identifyPriorities"
]
},
{
"id": "leadsList",
"type": "ListView",
"route": "/leads",
"context": null,
"content": [
{
"title": "Leads List",
"description": "Comprehensive list of all leads in the system with key information including name, email, phone, source, status, and assigned owner"
},
{
"title": "Search and Filter",
"description": "Search capabilities and filter options to find leads by name, email, source, status, or assigned owner"
},
{
"title": "Create Lead Action",
"description": "Quick action button to initiate the creation of a new lead"
}
],
"referencesRequirements": [
"@requirement/accessLeadList",
"@requirement/displayLeadsSummary",
"@requirement/searchFilterLeads",
"@requirement/newLeadForm"
]
},
{
"id": "createLead",
"type": "FormView",
"route": "/leads/new",
"context": null,
"content": [
{
"title": "Lead Information",
"description": "Form fields for capturing lead contact information including name, email (with validation), and phone number (with validation per @requirement/dataValidation)"
},
{
"title": "Lead Source",
"description": "Dropdown or selection field for specifying lead source such as website, referral, campaign, or other sources"
},
{
"title": "Lead Owner Assignment",
"description": "Selection field to assign the lead to a sales team member per @requirement/leadOwnershipTracking"
},
{
"title": "Submit Action",
"description": "Button to confirm and create the lead with all entered information and audit trail"
}
],
"referencesRequirements": [
"@requirement/newLeadForm",
"@requirement/captureLeadInfo",
"@requirement/specifyLeadSource",
"@requirement/assignLeadOwner",
"@requirement/confirmLeadCreation",
"@requirement/dataValidation",
"@requirement/leadOwnershipTracking",
"@requirement/auditTrail"
]
},
{
"id": "leadDetail",
"type": "Page",
"route": "/leads/:leadId",
"context": {
"leadId": "urn:sutro:model:lead"
},
"content": [
{
"title": "Lead Information",
"description": "Display and editing of lead contact details including name, email, phone, source, and current status with validation applied"
},
{
"title": "Lead Status",
"description": "Current pipeline stage of the lead (new, contacted, qualified, converted, lost) with ability to advance to next stage"
},
{
"title": "Lead Owner",
"description": "Display of current assigned owner and ability to reassign the lead to another sales representative per @requirement/leadOwnershipTracking"
},
{
"title": "Activity History",
"description": "Timeline of all logged activities (calls, emails, meetings, notes) associated with this lead with timestamps and user information for audit trail per @requirement/auditTrail"
},
{
"title": "Log Activity",
"description": "Form section to log new interactions with the lead including activity type, details, and notes"
}
],
"referencesRequirements": [
"@requirement/viewLeadDetail",
"@requirement/openLeadRecord",
"@requirement/changeLeadStatus",
"@requirement/updateLeadDetails",
"@requirement/persistLeadChanges",
"@requirement/openLeadForActivity",
"@requirement/selectActivityType",
"@requirement/enterActivityDetails",
"@requirement/persistActivity",
"@requirement/dataValidation",
"@requirement/leadOwnershipTracking",
"@requirement/auditTrail"
]
},
{
"id": "userProfile",
"type": "Page",
"route": "/profile",
"context": null,
"content": [
{
"title": "User Profile Information",
"description": "Display of current user's profile details including name and email address"
},
{
"title": "Assigned Leads Summary",
"description": "Overview of leads assigned to the current user with status breakdown and quick access links"
}
],
"referencesRequirements": [
"@requirement/userInspect"
]
}
],
"edges": [
{
"from": "dashboard",
"to": "leadsList",
"type": "Navigate",
"context": null,
"outputContext": null
},
{
"from": "dashboard",
"to": "leadDetail",
"type": "Navigate",
"context": {
"leadId": null
},
"outputContext": null
},
{
"from": "dashboard",
"to": "userProfile",
"type": "Navigate",
"context": null,
"outputContext": null
},
{
"from": "leadsList",
"to": "createLead",
"type": "Navigate",
"context": null,
"outputContext": null
},
{
"from": "leadsList",
"to": "leadDetail",
"type": "Navigate",
"context": {
"leadId": null
},
"outputContext": null
},
{
"from": "createLead",
"to": "leadDetail",
"type": "Create",
"context": null,
"outputContext": "leadId"
},
{
"from": "createLead",
"to": "leadsList",
"type": "Navigate",
"context": null,
"outputContext": null
},
{
"from": "leadDetail",
"to": "leadsList",
"type": "Navigate",
"context": null,
"outputContext": null
},
{
"from": "leadDetail",
"to": "leadDetail",
"type": "Edit",
"context": {
"leadId": null
},
"outputContext": null
}
]
}
}