Skip to content

Sales

What the getodden/crm-sales package adds on top of Odden Core, and the models it provides.

getodden/crm-sales is Odden's sales module. It adds pipelines, deals, products, quotes with online acceptance, forecasting and quotas, lead routing, outbound sequences, qualification playbooks, and public meeting-booking links. It builds on the contacts, companies, activities, associations, and custom properties from Odden Core.

Installation

The package requires PHP 8.3+, Laravel 12 or 13, and getodden/crm-core. See Installation for the full setup.

bash
composer require getodden/crm-sales
php artisan migrate

Odden\Sales\SalesServiceProvider is auto-discovered. It loads the package migrations, the odden-sales:: views, and (unless you turn them off) the public quote and meeting routes. To customize the config file, publish it:

bash
php artisan vendor:publish --tag=odden-sales-config

What it adds to Core

  • Deals are Core records. Odden\Sales\Models\Deal uses Core's HasActivities, HasAssociations, HasCustomProperties, AuditsProperties, and BelongsToTeam traits. You log activities on a deal, associate it with contacts and companies, and store custom properties on it the same way as on a contact.
  • New relations on Core models. The service provider registers deals() on Odden\Core\Models\Contact and Odden\Core\Models\Company, and salesSequenceEnrollments() on Contact. Deal links to contacts and companies are stored in Core's associations table.
  • Merges move Sales data. When Core merges two contacts, Sales moves the duplicate's sequence enrollments and meeting bookings to the surviving contact. Deals move with Core's associations. See Merging contacts.
  • Activities written for you. Many sales actions log activities on deals and contacts (stage automation tasks, quote views and signatures, routed leads, sequence emails and calls, booked meetings). These are ordinary Core Activity records.

Models

All models live in Odden\Sales\Models. Table names come from odden-sales.tables (see Configuration and routes).

Model Default table Purpose
Pipeline odden_pipelines A named sales process with ordered stages.
PipelineStage odden_pipeline_stages A stage with a win probability, closed won/lost flags, and a rotting threshold.
StageAutomation odden_stage_automations Entry requirements and actions that run when a deal enters a stage.
Deal odden_deals An opportunity in a pipeline stage, with amount, status, and owner.
DealStageHistory odden_deal_stage_history One row per stage a deal has entered, with time spent there.
DealProduct odden_deal_products A line item on a deal. Line items drive the deal amount.
Quote odden_quotes A proposal for a deal, with a public token for online acceptance.
QuoteItem odden_quote_items A line item on a quote.
SalesQuota odden_sales_quotas A revenue target for one user over a date range.
LeadRoutingRule odden_sales_lead_routing_rules Assigns owners to contacts and deals.
SalesEmailTemplate odden_sales_email_templates Email subject and body with merge tags.
SalesSequence odden_sales_sequences A multi-step outbound cadence.
SalesSequenceEnrollment odden_sales_sequence_enrollments A contact's progress through a sequence.
SalesPlaybook odden_sales_playbooks A qualification script whose answers are saved as custom properties.
SalesMeetingLink odden_sales_meeting_links A public booking page for a user.

Pages in this section

Demo data

The package ships Odden\Sales\Database\Seeders\SalesDatabaseSeeder, which creates sample users, playbooks, templates, sequences, meeting links, routing rules, and deals. It creates users such as admin@odden.test with the password password, so only run it in local or demo environments:

bash
php artisan db:seed --class="Odden\Sales\Database\Seeders\SalesDatabaseSeeder"