What it builds
Four objects most small teams need and no more: accounts, contacts, deals, tasks. Contacts and deals look up their account; tasks look up their deal. Deals carry a stage, so the pipeline grid groups by it, and each salesperson has a grid of their own open tasks.
Creating a deal fires one workflow: assign an owner, email them. Managers get the full drawer; Sales gets the pipeline grid filtered to their own open records. Both are group permissions, evaluated server-side — a button a group cannot use is hidden, and the dispatch is rejected if it is called anyway.
The vocabulary is the customer’s. A CRM that calls their engagements “opportunities” loses the room in the first minute, so put their word in the prompt: deal, engagement, matter.
The primitives map
- Objects —
crm_accounts,crm_contacts,crm_deals,crm_tasks. Real Postgres tables you can query and export through the documented API. - Forms — one per object; lookups tie contact and deal to account, task to deal.
- Object view —
accounts_with_pipelineJOINs accounts to their deals, so the grid shows the account name and the stage on one row instead of two ids. - Grids — pipeline by stage; my open tasks.
- Workflow — on deal created: assign owner, email owner.
- Screens and drawer — twelve: three per object from one screenflow. The drawer reads Accounts · Pipeline · Contacts · Tasks.
The build, as an op-log
add-lookup-field is where the relations come from; create-object-view is where the grid stops showing raw ids. Single named operations, not code.
Starter prompt
Build a solution called Acme CRM with the prefix crm for a consultancy that runs its pipeline in a spreadsheet. Create the groups Sales and Managers first. Objects: Account (name, industry, owner), Contact (account, name, email, role), Deal (account, name, value, stage as multiple choice, close date) and Task (deal, title, owner, due date, done). Use their word for the pipeline record — Deal, Engagement, Matter — and ask me if a term is ambiguous. Generate the screens, add a pipeline grid grouped by stage and a grid of my open tasks, and add a workflow that assigns and emails the owner when a deal is created. Preview the diff before committing.
Rename before you build, not after. Put the customer’s nouns in the prompt and the tables, forms and drawer come out in their language.
Screens (placeholders)
Screenshots pending [PLACEHOLDER: screenshots of the built app — pipeline grid by stage, deal form with account lookup, drawer]
Extend it
- Add a second workflow on stage = won that creates an onboarding task and emails Managers.
- Add a calculated field on Account that totals open deal value.
- Add an ExternalService step that posts new deals to Zapier, Make or n8n.
Related
- Use case: CRM-lite
- Closed in 24 Hours: CRM-lite for 35 consultants in 22 hours
- Role page: For agencies