Wasting $103K on Manual Searches? Build Custom Filters in Odoo 18
By Braincuber Team
Published on December 22, 2025
Sales manager opens Odoo product list—2,400 products. Needs to find "Products under $50 with stock < 10 units, grouped by category." Manual approach: Scroll, click product, check price, check stock, note category. Takes 47 minutes to compile list for reordering meeting. Does this 3 times weekly = 2.4 hours. Developer says: "Add custom filter." Quote: $1,200. Business rejects (too expensive for "just a filter"). Keeps scrolling 47 minutes, 3 times weekly. Annual waste: 124 hours × $67/hour = $8,308.
Your search UX disaster: Default Odoo search shows all 2,400 records (overwhelming). Users manually scroll looking for specific data. Common searches repeated daily (e.g., "My open orders", "Overdue invoices", "Low stock products"). No saved filters—re-enter criteria every time. Grouping unavailable—can't organize by category/salesperson/status. Search by name only (can't search by custom fields). Meeting prep takes 47 minutes scrolling (should take 30 seconds with proper filters). Reports delayed (waiting for data compilation).
Cost: Manual scrolling = 47 min × 3 weekly × 52 × $67/hour = $8,308/year (sales manager). Repeated searches = 23 users × 8 searches daily × 1.2 min each × 252 days × $67/hour = $52,147/year. Delayed decisions (waiting for data) = 8 critical decisions delayed avg 2.7 days = $43,200 opportunity cost. Developer quotes rejected = $1,200 × 8 filter requests = $9,600 (could've solved problem). User frustration = decreased productivity, increased errors (wrong product selected from long list).
Odoo 18 Search Views/Filters/Grouping fix this: Define custom search fields in XML (search by any field). Create predefined filters (one-click: "Low Stock", "My Orders", "Overdue"). Add grouping options ("Group by Category", "Group by Salesperson"). Filters saved—users don't re-enter. Complex conditions possible (price < $50 AND stock < 10). Takes 15 minutes to configure vs $1,200 quote. Here's how to build search views so you stop losing $103K annually to manual data hunting.
You're Losing Money If:
What Search Views/Filters/Grouping Do
Search Views: Define which fields users can search (name, email, custom fields). Filters: Predefined conditions (one-click: show inactive, overdue, mine). Grouping: Organize records by field (category, status, salesperson).
| Default Odoo Search | Custom Search/Filters/Grouping |
|---|---|
| Search name only (limited) | Search any field (name, email, reference, custom) |
| Shows all 2,400 records (scroll hell) | One-click filters show relevant 47 records |
| Re-enter search criteria daily (repetitive) | Saved filters (click "Low Stock", done) |
| No grouping (flat list chaos) | Group by category/salesperson (organized view) |
| 47 min data hunting ($8,308/year) | 30 seconds with filters ($0 wasted time) |
💡 Search View Example:
Scenario: Product manager needs "Products < $50 AND stock < 10"
- Without custom search: Scroll 2,400 products, check each (47 minutes)
- With custom filter: Click "Low Stock & Low Price" filter (instant, 47 results shown)
- With grouping: Results grouped by category (organized for reordering)
- Time saved: 46.5 minutes per search × 3 weekly = 2.3 hours saved
Step 1: Define Search View (Basic)
Search view specifies which fields users can search.
Create Search View XML
product.product.search
product.product
Search View Structure:
- <search>: Root element defining search structure
- <field name="...">: Each searchable field
- string attribute: Label shown in search dropdown
- Users can now: Type in search bar → Select field → Enter value
How Users Search
- User clicks search bar in list view
- Dropdown shows: "Search Product Name, Internal Reference, Barcode, Category..."
- User selects field (e.g., "Category")
- Types value (e.g., "Electronics")
- Odoo instantly filters list to matching records
Step 2: Add Predefined Filters
Filters = one-click conditions. Users don't type—just click filter name.
Basic Filters
Filter Attributes Explained:
- string: Filter label (shown in Filters dropdown)
- name: Technical identifier (unique)
- domain: Filter condition using Odoo domain syntax
- <separator/>: Visual divider between filter groups
Advanced Filter Examples
Domain Syntax Reference
Common Domain Operators:
| Operator | Description | Example |
|---|---|---|
= |
Equals | [('active', '=', True)] |
!= |
Not equals | [('state', '!=', 'draft')] |
<, > |
Less than, Greater than | [('qty', '<', 10)] |
<=, >= |
Less/Greater or equal | [('price', '>=', 100)] |
in |
In list | [('state', 'in', ['draft', 'sent'])] |
not in |
Not in list | [('stage', 'not in', [1, 2])] |
like |
Contains substring | [('name', 'like', 'laptop')] |
ilike |
Case-insensitive like | [('email', 'ilike', '@gmail')] |
Logical Operators:
['&', condition1, condition2]- AND (default, can omit&)['|', condition1, condition2]- OR['!', condition]- NOT
Step 3: Add Grouping Options
Grouping organizes records into collapsible categories.
Grouping Attributes:
- <group expand="0">: Group section (expand="0" = collapsed by default)
- context="{'group_by': 'field_name'}": Specifies grouping field
- Multiple grouping: Users can select multiple "Group By" simultaneously
- Visual result: Records organized into expandable/collapsible sections
Common Grouping Use Cases
- Group by Salesperson: Track individual performance (who sold what)
- Group by Status: Organize workflows (Pending, In Progress, Done)
- Group by Category: Product organization (Electronics, Clothing, etc.)
- Group by Region: Geographic analysis (customers by state/country)
- Group by Date: Time-based analysis (orders by month/year)
Step 4: Complete Example (Products)
Full search view with fields, filters, and grouping for product management.
product.product.search.custom
product.product
Step 5: Register View in __manifest__.py
{
'name': 'Custom Search Views',
'version': '18.0.1.0.0',
'depends': ['base', 'product', 'stock'],
'data': [
'views/product_views.xml',
],
}
Step 6: Test Search View
- Update module:
-u module_name - Go to Products list view
- Test searchable fields:
- Click search bar
- See custom fields in dropdown
- Type value, verify filtering works
- Test filters:
- Click Filters dropdown
- See custom filters listed
- Click filter, verify records filtered
- Try combining multiple filters
- Test grouping:
- Click Group By dropdown
- Select grouping option (e.g., "Category")
- Verify records grouped with expand/collapse
- Try multiple groupings simultaneously
Advanced Techniques
1. Default Filters (Auto-Applied)
Products
product.product
tree,form
{'search_default_filter_to_sell': 1}
search_default_filter_name: 1 auto-applies filter when view opens.
2. Date Range Filters
3. Custom Search with Filter Domain
Real-World Impact
E-commerce Company (2,400 SKUs) Example:
Before Custom Search Views:
- Default search: Name only (limited usefulness)
- Product manager: 47 min compiling low-stock list (scroll 2,400 products)
- Done 3× weekly for reordering meetings = 2.4 hours
- Sales team: Searching by category requires scrolling all products
- Inventory team: Can't quickly find "Low stock + Low price" items
- 23 employees × 8 searches daily × 1.2 min each = 220 min daily wasted
- Decisions delayed 2.7 days avg (waiting for data compilation)
- Developer quote for 8 custom filters: $9,600 (rejected)
After Implementing Custom Search/Filters:
- Configured search view in 15 minutes (XML file)
- Added 12 filters: Low Stock, Price ranges, Category-based, Combined conditions
- Added 4 grouping options: Category, Supplier, Type, Date
- Product manager: 47 min → 30 seconds (click "Reorder Alert" filter)
- Sales team: "Group by Category" + "Can be Sold" filter = instant organization
- Inventory team: One-click filters for all scenarios
- Search time: 220 min daily → 12 min daily (95% reduction)
- Decisions: Real-time data access (0 delay)
- Developer cost: $0 (15-min internal configuration)
Financial Impact:
- Product manager time: 2.4 hrs weekly × 52 × $87/hr = $10,876 saved
- Team search time: 208 min daily × 252 days × $67/hr = $46,742 saved
- Decision speed: Eliminated $43,200 opportunity cost (2.7-day delays gone)
- Developer cost avoided: $9,600
- Productivity increase: 15% (faster data access) = $127,000 value
- Total Year 1 impact: $237,418
- Implementation: 15 minutes, $0 cost
Best Practices
- Start with User Needs
- Ask: "What do you search for daily?"
- Create filters for top 5 repetitive searches
- Don't add filters nobody will use
- Use Descriptive Filter Names
- Good: "Low Stock (< 10 units)", "Price $50-$200"
- Bad: "Filter 1", "Custom"
- Users should understand filter purpose without testing
- Group Related Filters
- Use
<separator/>between filter groups - Example: Stock filters together, Price filters together
- Makes UI cleaner, easier to navigate
- Use
- Test Filter Performance
- Complex domains can slow down searches
- Test with production-size datasets
- Add database indexes if needed
- Document Custom Filters
- Add comments in XML explaining filter purpose
- Helps future developers understand logic
- Especially important for complex domain conditions
Pro Tip: Users won't tell you they need better search—they'll just waste time scrolling. Watch over their shoulder for 1 hour. Count how many times they scroll through lists looking for something. Found 8+ repetitive searches? That's 8 filters you should build. Each filter = 1-2 minutes saved per search. 8 searches × 1.5 min × 23 users × 252 days = 1,044 hours saved annually = $69,948 @ $67/hr. Implementation: 15 minutes. ROI: Infinite.
Wasting $103K Annually on Manual Data Hunting?
We build Odoo 18 custom search views: Analyze user workflows, configure searchable fields, create predefined filters, setup grouping options. Turn 47-minute data hunts into 30-second one-click filters.
