In B2B sales a deal rarely starts with a cart. First there is a phone call, a meeting, a quote request and a few weeks of back-and-forth. Those conversations usually live in a separate CRM or a spreadsheet, while the orders and quotes live in the sales platform. The sales rep copies data between systems, and the sales manager has no single place to see what is in progress and what it is worth.
In the post about opening the code we said the next release would be a CRM built into Endora Commerce. The module is ready. It is free, available under the MIT licence in the Endora Commerce repository on GitHub, and it has its own place in the admin panel: a CRM group directly below the Sales group.
The screenshots in this post come from the English version of the admin panel. The module is fully available in Polish as well.
The sales opportunity
The module tracks sales opportunities: deals a sales rep is working on with one customer organization, from first contact to the moment the opportunity is won or lost.
An opportunity gets its own number (OPP-000123), belongs to one organization and is run in one currency. It can have a contact person, a sales channel, a value, an expected close date, an assigned sales rep and any number of tags. You search the list by title, number and organization name, and filter it by state, status, organization, assignee, tags, sales channel and creation date.
Opportunities are visible according to the organizations an administrator has access to. A sales rep restricted to selected organizations sees only their opportunities, regardless of who is working on them.
The board
You can see the same opportunities as cards on a board, one column per status. The column header gives the number of opportunities and their value, separately for each currency.
You move a card to another status in two ways:
- By dragging it: with a mouse, on a touch screen or from the keyboard. Columns the workflow does not allow the card to move to are dimmed while you drag.
- From the “Move to…” menu on the card, which lists exactly the statuses the workflow allows from the card’s current status.
You choose what the card shows below the title: up to six fields, including your own custom fields. The choice is one for the whole platform, so the entire team looks at the same card.
The opportunity screen
The screen of a single opportunity has two columns. On the left are the stage bar and the tabs, on the right a panel with the details: value and deadline, customer and assignee, classification.
The stage bar shows the current status and only the moves the workflow allows from there, grouped as Back and Forward. You can add a reason to a status change, and it is saved in the history.
Below the bar are the tabs:
- Overview: the description and custom fields.
- Links: the opportunity’s orders and quote requests, with Create order and Create quote request buttons.
- Events: what has been planned for the opportunity, with reminders.
- Notes and Messages: an author can edit and delete their note, while a message in the team conversation cannot be changed once sent.
- Attachments: files stored in the media library as private.
- Change history: everything that has been done to the opportunity, newest first.
In a description, a note or a message you can mention a person, an order or a product by typing @, @@ or @@@. The person you mention gets a notification in the admin panel.
Your own status workflow
A fresh install starts with six statuses: new, qualified, proposal, negotiation, won and lost. That is only a starting point. On the Workflow screen you add your own statuses with a name in each language and a colour, mark the start status and the statuses that close an opportunity as won or lost, and draw the allowed transitions on a graph.
An opportunity can only take a configured step. Reopening is a transition like any other: in the default workflow you can go from lost back to new, so a deal that comes back to life is reopened rather than entered again. A change that would break the workflow, for example deleting the only won status, is rejected and names the rule it would violate.
Orders follow the opportunity, and the opportunity follows orders
This is the part an external CRM wired to the platform through an integration cannot give you. You link existing orders and quote requests of the same organization to an opportunity, or create them straight from its screen. Then you set two mappings:
- Order status for each opportunity status. When an opportunity enters a given status, its linked orders are asked to move to the order status you chose.
- Opportunity status for each order status. When a linked order reaches a given status, the opportunity moves to the status you chose, no matter whether the order was changed by an administrator, a booked payment or a dispatched shipment.
Nothing is forced along the way. The request to an order goes through the order status workflow, exactly as if someone had changed the order by hand. If an order refuses, the opportunity still moves, and next to it you see what happened to each order, with the reason and Retry and Dismiss buttons. The two directions do not loop, and an order never reopens a closed opportunity.
For the order-to-opportunity mapping you can tick a condition that the opportunity moves only when every linked order is there. That way one delivered order out of three does not win the deal.
A value entered by hand or computed
You can enter the value of an opportunity as your own estimate or have it computed from the linked documents. You choose this per opportunity and can switch either way, and the amount you entered is not lost.
A computed value is the sum of the linked orders (gross total) and quote requests (net sum of the lines) that are in statuses marked as counting. An order placed from a linked quote request counts once, not twice.
Amounts in different currencies are never added together or converted. The platform has no exchange rates, so each currency is reported on its own.
Events, reminders and the calendar
You plan events for an opportunity: a call, a meeting, a deadline. An event has a name, a day, times or an “all day” flag, and an optional reminder.
The platform decides who gets a reminder at the moment it falls due: it goes to the person working the opportunity at that time, not to whoever set it. The reminder appears in the notification bell in the admin panel, and if the recipient is not online at that moment, they also get it by email.
The calendar gathers the events of open opportunities in a month, week, day or agenda view. The Mine / All switch narrows it to the opportunities assigned to you.
Analytics
The Analytics screen shows five metrics for a chosen range of days, with an optional sales channel and sales rep filter:
- average handling time of an opportunity, overall and separately for won and lost,
- average time in each status, which shows where opportunities wait the longest,
- most effective sales reps: the number and value of won opportunities, also month by month,
- top opportunities by value,
- average opportunity value.
The metrics are calculated live, when the screen is opened. A manager with access to selected organizations gets them for those organizations only. We also want to be honest about the limit: every metric is a value, not a profit, because the module knows nothing about costs or margin.
Tags and custom fields
You label opportunities with coloured tags, for example Key account or Tender. The tag list is one for the whole platform, and renaming or recolouring a tag takes effect on every opportunity straight away.
If you need data of your own, for example “Lead source”, “Competitor” or “Decision date”, you define it as custom fields on the platform’s existing screen, without a deployment. They appear in the opportunity form and can be added to the board card and to the filters.
CRM on the other screens of the admin panel
The module does not end at its own group in the menu:
- the organization screen has an Open opportunities panel with a New opportunity button,
- the order and quote request screens have a Linked opportunity panel, where you link the document to an existing opportunity or create a new one,
- you open the most common CRM screens from the command palette (
⌘K/Ctrl+K).
Two settings, off by default, let opportunities be opened automatically: for every new order (per sales channel) and for every new quote request. Such an opportunity is linked to the document straight away, has a computed value and goes to the sales rep assigned to the organization.
For integrators
- API: everything the admin panel does is available under
/api/v1/admin/crm. - Webhooks: opportunity created, status changed and closed can be sent to other systems as signed webhooks with retries.
- Permissions:
crm:read,crm:write,crm:configureandcrm:analytics. The module grants none of them automatically, so you decide which roles see the CRM. - Your own logic: another module can listen to opportunity status changes or register a rule that refuses a specific transition.
What is not in this release
We would rather say it plainly than leave it to be discovered after a rollout:
- import and export of opportunities,
- multi-day and recurring events,
- synchronization with Google Calendar and Outlook,
- profit and margin metrics.
How to start
The CRM is an optional module and is on by default. You switch it off and back on from the Modules screen, and switching it off deletes nothing. After installing, grant the CRM permissions to the roles you choose, check the status workflow and set the mappings to order statuses.
If you want to see the module with data first, the endora demo seed command adds twelve sample opportunities with three months of history, so the board and the analytics have something to show. The full description is in the Endora Commerce documentation.
Want to run B2B sales and CRM in one admin panel, or planning a rollout? Get in touch. Rollouts are led by the Endora team, with more than 12 years of experience in B2B e‑commerce.