Skip to Content
Odoo Menu
  • Sign in
  • Try it free
  • Apps
    Finance
    • Accounting
    • Invoicing
    • Expenses
    • Spreadsheet (BI)
    • Documents
    • Sign
    Sales
    • CRM
    • Sales
    • POS Shop
    • POS Restaurant
    • Subscriptions
    • Rental
    Websites
    • Website Builder
    • eCommerce
    • Blog
    • Forum
    • Live Chat
    • eLearning
    Supply Chain
    • Inventory
    • Manufacturing
    • PLM
    • Purchase
    • Maintenance
    • Quality
    Human Resources
    • Employees
    • Recruitment
    • Time Off
    • Appraisals
    • Referrals
    • Fleet
    Marketing
    • Social Marketing
    • Email Marketing
    • SMS Marketing
    • Events
    • Marketing Automation
    • Surveys
    Services
    • Project
    • Timesheets
    • Field Service
    • Helpdesk
    • Planning
    • Appointments
    Productivity
    • Discuss
    • Approvals
    • IoT
    • VoIP
    • Knowledge
    • WhatsApp
    Third party apps Odoo Studio Odoo Cloud Platform
  • Industries
    Retail
    • Book Store
    • Clothing Store
    • Furniture Store
    • Grocery Store
    • Hardware Store
    • Toy Store
    Food & Hospitality
    • Bar and Pub
    • Restaurant
    • Fast Food
    • Guest House
    • Beverage Distributor
    • Hotel
    Real Estate
    • Real Estate Agency
    • Architecture Firm
    • Construction
    • Property Management
    • Gardening
    • Property Owner Association
    Consulting
    • Accounting Firm
    • Odoo Partner
    • Marketing Agency
    • Law firm
    • Talent Acquisition
    • Audit & Certification
    Manufacturing
    • Textile
    • Metal
    • Furnitures
    • Food
    • Brewery
    • Corporate Gifts
    Health & Fitness
    • Sports Club
    • Eyewear Store
    • Fitness Center
    • Wellness Practitioners
    • Pharmacy
    • Hair Salon
    Trades
    • Handyman
    • IT Hardware & Support
    • Solar Energy Systems
    • Shoe Maker
    • Cleaning Services
    • HVAC Services
    Others
    • Nonprofit Organization
    • Environmental Agency
    • Billboard Rental
    • Photography
    • Bike Leasing
    • Software Reseller
    Browse all Industries
  • Community
    Learn
    • Tutorials
    • Documentation
    • Certifications
    • Training
    • Blog
    • Podcast
    Empower Education
    • Education Program
    • Scale Up! Business Game
    • Visit Odoo
    Get the Software
    • Download
    • Compare Editions
    • Releases
    Collaborate
    • Github
    • Forum
    • Events
    • Translations
    • Become a Partner
    • Services for Partners
    • Register your Accounting Firm
    Get Services
    • Find a Partner
    • Find an Accountant
      • Get a Tailored Demo
    • Implementation Services
    • Customer References
    • Support
    • Upgrades
    Github Youtube Twitter Linkedin Instagram Facebook Spotify
    +32 2 290 34 90
    • Get a Tailored Demo
  • Pricing
  • Help
  1. APPS
  2. Employees
  3. Employee Portal v 17.0
  4. Sales Conditions FAQ

Employee Portal

by ndd https://duong-odoo-apps.odoo.com
Odoo

$ 68.71

v 17.0 Third Party
Apps purchases are linked to your Odoo account, please sign in or sign up first.
Availability
Odoo Online
Odoo.sh
On Premise
Odoo Apps Dependencies • Employees (hr)
• Time Off (hr_holidays)
• Website (website)
• Discuss (mail)
• Calendar (calendar)
Lines of code 5426
Technical Name d_employee_portal
LicenseOPL-1
Websitehttps://duong-odoo-apps.odoo.com
Versions 17.0 18.0
You bought this module and need support? Click here!
Availability
Odoo Online
Odoo.sh
On Premise
Odoo Apps Dependencies • Employees (hr)
• Time Off (hr_holidays)
• Website (website)
• Discuss (mail)
• Calendar (calendar)
Lines of code 5426
Technical Name d_employee_portal
LicenseOPL-1
Websitehttps://duong-odoo-apps.odoo.com
Versions 17.0 18.0
  • Description
  • Documentation
  • License

Employee Portal

A mobile-first HR hub that gives every employee secure, self-service access to their own documents — payslips, attendance, expenses, timesheets, and more — all through a standard portal login. No internal Odoo account, no extra license.

Employee Portal Home Page — tile grid showing HR document categories

Key Features

Portal-Only Login

Employees authenticate as Odoo portal users at /web/login and land directly on their personal HR hub. No backend access is granted — the Odoo interface stays locked down while employees still reach everything they need.

Document Tile Home

The portal home renders an auto-generated tile grid — one tile per enabled HR document. Each tile shows a Font Awesome icon, a label, and a live counter badge that reflects the employee's current record count. One tap navigates to that document's list page.

Snippet Table

Every document list page ships with a JavaScript-powered interactive table: free-text search box, status dropdown filter, start/end date pickers, column-sortable rows, and seamless pagination — all without a full page reload. New, Edit, and Delete buttons appear when the admin enables them per-document.

Embedded Backend Views

The standout feature: enable Use Backend Views on any document configuration and the portal page embeds the real Odoo web client — native list, form, kanban, or calendar — inside the portal shell. Employees get print-to-PDF, the attachments panel, chatter comments, group-by, and custom filters with no internal user license required. Works for any Odoo model.

Website Builder Ready

Every portal document page is a full Odoo website page. Open the Website Builder and drag any snippet — text blocks, images, FAQ accordions, carousels, call-to-action banners — above or below the document table. The Employee Documents snippet itself is repositionable within the page, giving HR teams full editorial control with zero code.

Odoo Theme Colors

The portal shell reads CSS variables directly from the active Odoo website theme. There is no hardcoded color anywhere in the module. Changing the color preset in Website Configuration instantly recolors the entire portal — no CSS file to touch, no developer required.

Portal Home — Tile Grid & Navigation

Employee Portal Home — tile grid with document categories and live counter badges

After login, the employee lands on /employee/home. The page presents a My Documents tile grid — one card per published document configuration. Each tile displays a Font Awesome icon, a document label, and a live counter badge showing how many records belong to that employee right now (e.g. "3 pending expenses", "12 payslips"). An employee profile card summarises the employee's name, job position, and department. A persistent bottom navigation bar provides quick-jump links to the most important document categories without scrolling.

Document List — Snippet Table

Payslips list page — snippet table with search box, status filter, and date pickers

Each document list page renders a responsive, interactive table. A search box at the top supports free-text lookup across whitelisted fields in real time. A status dropdown filter lets employees narrow records by workflow state (e.g. Draft, Confirmed, Paid). Start and end date pickers filter by any configured date field. When Allow Create is turned on for the document, a + New button appears and opens a modal form pre-scoped to the employee. Clicking any row navigates to the record detail page. All interactions — filtering, pagination, row selection — are handled client-side with no full page reload.

Embedded Backend Views — Native Odoo Inside the Portal

Native Odoo attendance list view embedded inside the Employee Portal shell — column headers, rows, Filters and Group By buttons, pagination

Enable Use Backend Views on any document configuration to embed the real Odoo web client inside the portal shell. Employees interact with a genuine Odoo list, form, kanban, or calendar view — with print to PDF, attachments panel, chatter comments, group-by, and custom filters — without holding an internal user license. The portal shell wraps the embedded client seamlessly: the header, bottom nav bar, and theme colors remain consistent while the full Odoo view lives inside the page body.

Admin document configuration form showing the Backend Views settings group — Use Backend Views checkbox, Backend View Types field, auto-generated view IDs, Try as Portal User and Auto-grant Missing Access buttons

Admin form showing Backend View settings — one checkbox enables the entire embedded Odoo client for that document.

Auto-Security Setup

When Backend Views mode is activated, the system automatically creates ir.model.access and ir.rule records scoped to the portal user for all related co-models the embedded view depends on. A Try as Portal User button lets the admin preview the embedded view exactly as the employee sees it and detects any missing access rights. If access gaps are found, the Auto-grant Missing Access button resolves every detected issue in a single click — no manual ACL configuration needed.

Works for Any Odoo Model

Embedded Backend Views is not limited to HR. Configure it for contracts, sales orders, vendor bills, project tasks, purchase orders, or any custom model in your Odoo database. The portal shell wraps the embedded client automatically regardless of the model, and the auto-security tooling handles access rights for the chosen model's entire dependency graph.

Kanban View — Visual Record Cards

Attendance records shown as kanban cards inside the Employee Portal shell

Enable Kanban in the Backend View Types field to display records as visual cards. Employees can switch between list and kanban views using the view-switcher buttons in the control panel. The kanban view is ideal for records where a quick visual overview matters — expenses by status, timesheets by project, attendance by week. Any model that has an Odoo kanban view can be used in kanban mode inside the portal.

Form View — Full Record Detail

Full attendance record displayed in the native Odoo form view inside the Employee Portal shell

Add Form to Backend View Types to let employees open any record in the native Odoo form view. The form delivers the complete record experience: every field, related sub-lists, status bar, action buttons (Print, Archive, etc.), the attachments panel, and chatter thread — exactly as seen in the backend. This is the same form HR managers use; employees benefit from the same rich interface without requiring an internal user license.

Admin: Document Configuration

Navigate to Employees → Employee Portal → Documents to manage document configurations. Each configuration controls one tile on the portal home and its corresponding list, detail, and (optionally) embedded backend pages.

Identity & Display

Name — label shown on the portal tile and page heading.
Technical Name — becomes the URL slug (e.g. payslip → /employee/payslip).
Icon — Font Awesome class displayed on the tile (e.g. fa-money, fa-clock-o).
Sequence — controls the order of tiles on the home page.
Is Published — toggle visibility without deleting the configuration.

Data Source

Applied Document (Model) — the Odoo model this document represents.
Employee Scope — a dynamic domain expression that restricts records to the current employee; supports uid, user, employee, and today as context variables (e.g. [('employee_id', '=', employee.id)]).
Additional Filters — static business-logic filters stacked on top of the scope domain.
Edit Gate — an optional domain that restricts which records are editable by the employee (e.g. only draft records).

Sort & Page

Order Field — default record ordering for the list.
Default Page Size — number of rows shown per page on initial load.
Maximum Page Size — upper limit a user can select when changing page size.

Action Controls

Allow Create — shows the + New button and enables the create modal form.
Allow Update — lets employees open and edit records via the update form.
Allow Delete — enables a delete action on individual records.

Whitelisted Fields Tab

Per-field role assignments control exactly how each field is exposed:
Column — visible as a table column.
Default Column — shown by default without the user needing to enable it.
Searchable — included in the search box lookup.
Status Filter — shown as an option in the status dropdown filter.
Date Filter — drives the start/end date range pickers.
Show on Detail — shown on the record detail page.
Create Form / Update Form — shown in the create or edit modal respectively.

Backend Views Group

Use Backend Views checkbox — switches from the snippet table to the embedded Odoo web client.
Backend View Types — comma-separated list of view types to enable (e.g. kanban,list,form,calendar).
Auto-generated View IDs — the system creates and stores ir.ui.view records scoped to the portal user for each enabled view type.
Try as Portal User button — preview the embedded view as the employee and detect missing access rights.
Auto-grant Missing Access button — fix all detected access gaps in one click.
Auto-fill on Create table — one row per required field; configures how the system automatically pre-fills that field when the portal user creates a new record (e.g. auto-set employee_id to the current employee).

Page Body & Detail Body

Editable HTML regions rendered above or below the document table on the list page and the detail page respectively. These regions are fully editable in the Website Builder — HR teams can add instructions, announcements, policy reminders, or branding without any developer involvement.

Website Builder — Full Drag-and-Drop Editing

Odoo Website Builder open on an Employee Portal page — snippet panel visible alongside the portal document table

Every portal document page is a genuine Odoo website page. Open the Website Builder from the top bar and the full snippet panel slides in — text blocks, image galleries, FAQ accordions, countdown timers, carousels, call-to-action banners, and every other Odoo website snippet. Drag them above or below the Employee Documents snippet to compose the page. The Employee Documents snippet itself is repositionable within the page. HR teams can publish policy notes, deadline countdowns, onboarding checklists, or manager contact cards alongside any document list — with no code, no deployment, and no IT ticket.

Bridge Modules

The Employee Portal is extended by optional bridge modules. Each bridge auto-installs when both d_employee_portal and the related HR module are present in the database. Install only the bridges you need.

Employee Portal — Payslips

Adds the Payslips tile to the portal home. Provides a full payslip list with search, status filter, and date range filter. Includes a dedicated detail page showing Work Entries, Other Inputs, the full Salary Computation table, and a Basic / Gross / Net summary card at the bottom. Requires hr_payroll (Odoo Enterprise).

Employee Portal — Attendance

Adds the Attendance tile and a read-only list of check-in and check-out records with computed worked hours. Supports start/end date range filtering. Requires hr_attendance (Community or Enterprise).

Employee Portal — Expenses

Adds the Expenses tile with full create and edit capabilities for draft expense records. Employees can submit new expenses from the portal, edit drafts, and track approval status through to reimbursement. Requires hr_expense.

Employee Portal — Timesheets

Adds the Timesheets tile with the ability to log and edit timesheet entries directly from the portal. Includes project and task selection dropdowns and a date range filter. Requires hr_timesheet.

Requirements & Support

Required Modules

  • base — included in all Odoo installations
  • website — Odoo Website module
  • hr — Odoo Employees module

Optional (for Bridge Modules)

  • hr_payroll — Odoo Enterprise Payroll (for the Payslips bridge)
  • hr_attendance — Odoo Attendance (for the Attendance bridge)
  • hr_expense — Odoo Expenses (for the Expenses bridge)
  • hr_timesheet — Odoo Timesheets (for the Timesheets bridge)

Support

For questions, bug reports, or feature requests, please contact:

duongodooapps@gmail.com

Employee Portal

The Employee Portal gives your workforce a mobile-first HR hub where they can view payslips, contracts, expenses, timesheets, and any other HR record you choose to expose — all from a smartphone or any browser, and without needing a full internal Odoo account. Employees log in with a lightweight portal account and land on a personalised home page that shows only the documents relevant to them.

This guide covers how employees use the portal (sections 1–4), how administrators configure document pages (section 5), and a complete step-by-step walkthrough for displaying HR Contracts in the portal (section 6).

Employee Portal home page after login

1. Logging In

Portal employees log in at /web/login using their portal credentials. After a successful login, Odoo automatically redirects them to /employee/home. If an employee uses the portal from multiple devices, the session persists through browser cookies — no extra setup is required.

If an employee is redirected to the standard customer portal instead of the employee portal, ask your administrator to verify that their user account is linked to an employee record (see section 8, Troubleshooting).

2. The Home Page

2.1 Tile Grid

The centre of the home page is a tile grid. Each published HR document appears as a card showing an icon and a label. Click any tile to open that document's list page immediately. The tiles are ordered by the Sequence value set in the document configuration — lower numbers appear first, reading left-to-right and top-to-bottom.

Employee Portal home page showing the tile grid

2.2 Employee Profile Card

Near the top of the home page a profile card shows the employee's name, job title, and department. This confirms which employee record is active for the current session — useful if a manager oversees multiple employees and switches between accounts.

2.3 Bottom Navigation Bar

On mobile screens a fixed navigation bar appears along the bottom edge of the display, giving one-tap access to key pages without scrolling back to the home tile grid. The tiles shown in the bar are controlled by the administrator through the Show in Bottom Nav toggle on each document configuration.

3. Viewing a Document List

Click any tile on the home page to open its document list. Every list page includes the following controls:

  • Search box — type any keyword to search across all fields marked as Searchable on the document configuration. Results update as you type.
  • Status dropdown — narrows the list to records in a specific state, such as Draft, Confirmed, or Expired. The available options come from whichever field the administrator has marked as the Status Filter.
  • From date picker — shows only records whose date field falls on or after this date.
  • To date picker — shows only records whose date field falls on or before this date.
  • Clear button — removes all active filters (search text, status, and date range) at once and returns the full unfiltered list.
  • + New button — only visible when the administrator has enabled Allow Create on the document. Click it to open a creation form and add a new record without leaving the portal.
  • Results table — each row represents one record. The columns shown are the fields that the administrator has marked as visible columns. Click any row to open the full detail page for that record.
  • Pagination controls — appear at the bottom of the table when there are more records than the configured page size. Click the page numbers or the next/previous arrows to move between pages.
A document list page with search filters and a results table

4. Viewing a Record Detail

Click any row in the list to open the full detail page for that record. The page includes the following navigation and content elements:

  • Breadcrumb — displayed at the top of the page in the format Home → Document Name → Record Name. Click any segment to navigate back to that level without using the browser back button.
  • Field values — the fields the administrator has enabled with Show on Detail are displayed here, labelled in plain language. Each value is read-only unless the document has Allow Update enabled and the record is within the Editable Domain.
  • Delete button — appears only when the administrator has enabled Allow Delete on the document. Clicking it permanently removes the record. This action cannot be undone from the portal.
  • Embedded backend view — when the document is configured to use Use Backend Views, the full Odoo interface appears instead of the plain field list. This includes the attachments panel, the chatter thread, print buttons, action menus, and all native Odoo controls — exactly as an internal user would see them.
Native Odoo form view embedded inside the portal shell on the detail page

5. Admin: Configuring Document Pages

Go to Employees → Employee Portal → Documents to create and manage the tiles that appear on the portal home page. Each document record controls one complete portal section — its tile on the home page, its list page, and its detail page.

Admin configuration form for a portal document

5.1 Creating a New Document

Follow these steps to add a new section to the portal:

  1. Go to Employees → Employee Portal → Documents.
  2. Click New.
  3. Fill in the Basic Settings (see section 5.2).
  4. Set the Data Source (see section 5.3).
  5. Configure Display and Pagination (see section 5.4).
  6. Set the Action Controls (see section 5.5).
  7. Add Whitelisted Fields (see section 5.6) or enable Use Backend Views (see section 5.7). These two approaches are mutually exclusive — use one or the other.
  8. Optionally add custom HTML to the Page Body or Detail Body (see section 5.8).
  9. Set Is Published to on when you are ready for employees to see the tile.
  10. Click Save to apply all changes.

5.2 Basic Settings

  • Name (name) — the label shown on the tile and at the top of the document's portal page. For example: My Contracts or Expense Reports. Keep it short and descriptive so employees recognise it immediately.
  • Technical Name (technical_name) — sets the URL path segment for the portal page. Must be unique across all documents and must not contain spaces or special characters. For example, contracts produces the URL /employee/contracts.
  • Icon (icon) — a Font Awesome 4 class name displayed on the home tile. For example, fa-file-text for a document icon or fa-money for a currency symbol. Browse the full list at fontawesome.com/v4.
  • Sequence (sequence) — controls the display order of tiles on the home page. Lower numbers appear first (left-to-right, top-to-bottom). Set two documents to the same sequence number to let Odoo decide their relative order by ID.
  • Is Published (is_published) — toggle on to make the tile visible to employees, or off to hide it without deleting any configuration. Use this to stage a new document before employees can see it.
  • Show in Bottom Nav (show_in_bottom_nav) — when enabled, this document also appears as a one-tap shortcut in the fixed bottom navigation bar on mobile screens. Reserve this for the most frequently used documents to avoid overcrowding the bar.

5.3 Data Source

  • Model (model_id) — the Odoo model this document reads records from. For example, hr.contract for employment contracts, hr.expense for expenses, or any other model your portal users should access. Type part of the model's technical name or display name in the search box to find it.

  • Employee Scope Domain (scope_domain) — a domain expression that restricts records to the current logged-in employee. This is the most important security field: it ensures each employee sees only their own data. Several variables are available inside this domain at runtime:

    Variable Value
    uid The current user's numeric ID (res.users.id)
    user The current res.users record
    employee The current user's linked hr.employee record
    today Today's date as a Python date object
    datetime Python's datetime module (for date arithmetic)

    Example: [('employee_id', '=', employee.id)]

  • Additional Filter Domain (domain) — a static filter applied on top of the scope domain. Use this for business logic that does not depend on who is logged in. For example: [('state', 'not in', ['cancel'])] hides cancelled records for all employees.

  • Editable Domain (editable_domain) — a subset of the visible records that the portal user is allowed to edit. This requires Allow Update to be on. Records that do not match this domain are shown as read-only even when Allow Update is enabled. For example: [('state', '=', 'draft')] allows editing only while a record is in draft.

5.4 Display and Pagination

  • Order (order) — the default sort applied to the results table. Use the format field_name asc or field_name desc. For example, date_start desc shows the most recent records first. Leave blank to use the model's default order.
  • Default Limit (default_limit) — the number of rows shown per page before pagination is triggered. Defaults to 20. Lower this for models with many columns to keep the page responsive.
  • Max Limit (max_limit) — the maximum number of rows a portal user can request per page. Prevents unbounded queries on large datasets and protects server performance.
  • Counter Key (counter_key) — an optional field name used to display a badge count on the home tile (for example, the number of pending records). Leave blank if you do not want a counter badge on the tile.

5.5 Action Controls

These three toggles control what employees can do with records. All three are off by default — enable only what you explicitly want to allow.

  • Allow Create (allow_create) — shows a + New button on the list page. Employees can open a creation form and submit a new record directly from the portal. When Use Backend Views is on, you must also configure the Auto-fill on Create table (see section 5.7).
  • Allow Update (allow_update) — makes records editable. An employee can click a row to open an edit form and save changes. The Editable Domain further restricts which records can be edited. For example, you might allow updating only draft records.
  • Allow Delete (allow_delete) — shows a Delete button on the record detail page. An employee can permanently remove a record. Use with caution — deleted records cannot be recovered from the portal.

5.6 Whitelisted Fields

The Whitelisted Fields tab (field_line_ids) controls exactly which fields are visible and where they appear. Add one line per field you want to expose. Each line has the following role toggles:

  • Column (role_column) — the field appears as a column header and value in the list table.
  • Default Column (role_default_column) — the column is visible by default without the employee needing to enable it. If this is unchecked, the field is available but hidden until the employee switches it on from the column picker.
  • Show on Detail (role_detail) — the field appears on the record detail page when an employee clicks a row.
  • Create Form (role_create) — the field appears in the form shown when an employee clicks + New. Enable this for every field an employee needs to fill when creating a record.
  • Update Form (role_update) — the field appears in the form when an employee edits a record. You can expose different fields for create and update if needed.
  • Searchable (role_search) — the field is included in the query run by the search box. Works best on text fields such as name or description.
  • Status Filter (role_status) — the field's distinct values populate the Status dropdown filter on the list page. Use this on a selection or many2one field that represents a record's state (for example, the state field).
  • Date Filter (role_date) — this field drives the From and To date range pickers on the list page. Only one field per document should have this role enabled.

Example for a contract document (hr.contract):

Field Column Default Column Detail Create Searchable Status Date
name ✓ ✓ ✓ ✓ ✓    
date_start ✓ ✓ ✓       ✓
date_end ✓   ✓        
wage ✓ ✓ ✓        
state ✓ ✓ ✓     ✓  

5.7 Use Backend Views

When Use Backend Views (use_backend_views) is enabled, the document page embeds the real Odoo web client inside the portal shell instead of the lightweight field table. Employees see native Odoo views — complete with print to PDF, the attachments panel, the chatter thread, group-by options, and custom filters — without holding an internal user licence.

Native Odoo list view embedded inside the portal shell

Backend View Types (backend_view_types)

A comma-separated list of view types to offer on the document page. Supported values are:

  • list — a sortable, filterable table of all records.
  • form — the full Odoo form for a single record, including all tabs and related sub-lists. Form is always included regardless of what you enter here.
  • kanban — a card-based view grouped by stage or another field, ideal for workflow visualisation.
  • calendar — a monthly or weekly calendar view, useful for time-based records such as attendance or leave.

Example: list,form for a simple read-only view, or list,form,kanban,calendar to give employees the full Odoo experience.

Kanban view cards displayed inside the portal shell Full Odoo form view embedded inside the portal shell

What happens when you save with Use Backend Views on

When you save the document record with Use Backend Views enabled, the system automatically creates the following Odoo objects for the selected model:

  • ir.ui.view records for each of the selected view types (list, kanban, calendar, search, and always form).
  • An ir.actions.act_window that wires all these views together as a single action.

You do not need to create these views manually — the system generates them from the document's configuration.

Auto-security

When backend views are generated, the system also automatically creates:

  • An ir.model.access record granting portal users read access to the model.
  • A scoped ir.rule that limits portal users to records within the document's scope domain.
  • The same pair of access record and rule for every related co-model found in the generated views. For example, if the list view displays a many2one field pointing to res.partner, portal read access is also granted on res.partner automatically.

This auto-security covers the vast majority of models. However, a small set of sensitive models is on a built-in denylist and will never receive auto-generated access rules. hr.contract is one such model. For any denylist model you must add the access rules manually (see sections 6.3 and 6.4 for a concrete example with hr.contract).

Try as Portal User button

The Try as Portal User button simulates a portal user opening the document page from scratch. It catches any AccessError that would occur at runtime, reports which models are missing access rules, and stores the list in the last_simulation_missing_models field on the document. Click this button after setting up a new document to confirm that employees will not encounter a security error when they open the page.

Admin configuration form showing the Try as Portal User button

Auto-grant Missing Access button

After running Try as Portal User, if the simulation found models with missing access, an Auto-grant Missing Access button appears. Clicking it automatically adds every missing co-model (that is not on the denylist) to the transitive dependency list and re-syncs all security rules in one step. For denylist models such as hr.contract, the access rules must still be added by hand — the button deliberately skips them.

Auto-fill on Create table

When Allow Create is enabled alongside Use Backend Views, the system detects which fields on the model are required at the database level and presents an Auto-fill on Create table. Each row in the table lets you choose how that required field is populated when a portal user submits a new record:

  • current_user — fills the field with the current res.users record.
  • current_employee — fills the field with the current user's linked hr.employee record.
  • current_partner — fills the field with the current user's res.partner record.
  • current_company — fills the field with the current user's active company.
  • skip — leaves the field blank. Use only if the field is not truly required or is computed by another mechanism.
  • add_to_form — adds the field to the creation form so the employee fills it in themselves. Use this for fields where the employee must make a choice, such as a project or category.

5.8 Page Body and Detail Body

Each document page has two HTML regions — one above the document table and one below it — that are fully editable in the Odoo Website Builder. Open the portal page while logged in as an administrator, click Edit in the top bar, and drag any website snippet into either region: text blocks, image galleries, FAQ accordions, countdown timers, call-to-action banners, pricing tables, carousels — every snippet in the Website Builder panel works here.

  • The body field stores the HTML for the region above and below the table on the list page.
  • The detail_body field stores the HTML displayed on the record detail page, above and below the field values.

Use these regions to publish policy notices, HR announcements, or helpful links directly on the portal page — with no developer involvement needed.

Editing a portal document page with the Odoo Website Builder

6. Walkthrough: Displaying HR Contracts in the Portal

This section walks through the complete setup for displaying HR Contracts in the portal. HR Contracts (hr.contract) contain sensitive data such as wages, so the steps include both a snippet-table approach (section 6.3) and a backend-views approach (section 6.4). Follow whichever path suits your setup.

6.1 Create the Document Record

  1. Go to Employees → Employee Portal → Documents and click New.

  2. Set Name to My Contracts.

  3. Set Technical Name to contracts. The portal URL will be /employee/contracts.

  4. Set Model to hr.contract (type "contract" in the search box).

  5. Set Employee Scope Domain to:

    [('employee_id', '=', employee.id)]
    

    This ensures each employee sees only their own contracts.

  6. Set Additional Filter Domain to:

    [('state', 'not in', ['cancel'])]
    

    This hides cancelled contracts from the list.

  7. Set Icon to fa-file-text.

  8. Set Sequence to 50 (or any number that places the tile where you want it on the home page).

  9. Leave Is Published off for now — turn it on after you have verified everything works.

  10. Click Save (do not close the record yet — you need to add fields or enable backend views in the next steps).

6.2 Add Whitelisted Fields

On the same document record, open the Whitelisted Fields tab and add the following lines. For each line, select the field from the model's field list and check the indicated roles.

Field: name (Contract Reference)

  • Column: on
  • Default Column: on
  • Show on Detail: on
  • Searchable: on

Field: date_start (Start Date)

  • Column: on
  • Default Column: on
  • Show on Detail: on
  • Date Filter: on (this drives the From / To date pickers)

Field: date_end (End Date)

  • Column: on
  • Show on Detail: on

Field: wage (Wage)

  • Column: on
  • Default Column: on
  • Show on Detail: on

Field: state (Status)

  • Column: on
  • Default Column: on
  • Show on Detail: on
  • Status Filter: on (this drives the Status dropdown)

Set Order to date_start desc so the most recent contracts appear first.

Click Save.

6.3 (Snippet Table Approach) Add Manual Security

If you are using the standard snippet table (use_backend_views is off), you must manually grant portal users access to hr.contract. The system will NOT do this automatically because hr.contract is on the security denylist.

Step A — Add an ACL entry

In your module's security/ir.model.access.csv, add a line granting portal users read access:

id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_hr_contract_portal,hr.contract portal read,hr_contract.model_hr_contract,base.group_portal,1,0,0,0

If you do not have a custom module, you can create this entry via Settings → Technical → Security → Access Rights in developer mode.

Step B — Add a record rule

Portal users must be restricted to their own contracts. In your module's security/ir_rules.xml (or via Settings → Technical → Security → Record Rules), add:

<record id="hr_contract_portal_rule" model="ir.rule">
    <field name="name">HR Contract: portal users see own contracts</field>
    <field name="model_id" ref="hr_contract.model_hr_contract"/>
    <field name="groups" eval="[(4, ref('base.group_portal'))]"/>
    <field name="domain_force">
        [('employee_id.user_id', '=', user.id)]
    </field>
    <field name="perm_read" eval="True"/>
    <field name="perm_write" eval="False"/>
    <field name="perm_create" eval="False"/>
    <field name="perm_unlink" eval="False"/>
</record>

This rule matches the scope domain you set in step 6.1 — each portal user sees only the contracts belonging to their linked employee.

After saving, set Is Published to on and test by opening the portal page as an employee.

6.4 (Backend Views Approach) Enable Backend Views

If you prefer the full Odoo interface (chatter, attachments, print, and so on) instead of the snippet table, follow these steps instead of section 6.3.

  1. On the document record you created in section 6.1, check Use Backend Views.
  2. Set Backend View Types to list,form.
  3. Click Save. The system will automatically generate ir.ui.view records and an ir.actions.act_window for hr.contract.
  4. Click Try as Portal User. The system simulates a portal login and reports any models that are missing access rules. Because hr.contract is on the security denylist, it will appear in the missing-access report.
  5. For any models listed in the report that are not hr.contract, click Auto-grant Missing Access to let the system add them automatically.
  6. For hr.contract itself, add the ACL entry and record rule manually as described in section 6.3 steps A and B. This is intentional: hr.contract contains wage and salary data, and the system deliberately requires a human decision before granting portal access to it.
  7. Click Try as Portal User again to confirm there are no remaining errors.
  8. If Allow Create is on, review the Auto-fill on Create table. A common setup for hr.contract is:
    • employee_id → current_employee
    • company_id → current_company
    • Any other required fields → add_to_form (so the employee fills them in) or skip (if they have a sensible default).
  9. Set Is Published to on.

6.5 Test the Result

  1. Open a browser in a private or incognito window.
  2. Log in as a portal user who has a linked employee record with at least one active contract.
  3. Navigate to /employee/home. You should see the My Contracts tile.
  4. Click the tile. The contract list should show only the contracts belonging to that employee, sorted by start date descending, with cancelled contracts excluded.
  5. Click a row to open the contract detail. Verify the fields you configured in section 6.2 are all visible.
  6. Log in as a second portal user (a different employee) and confirm they see only their own contracts — not the first employee's.

If any step fails, consult section 8, Troubleshooting.

7. Standout Features

7.1 Embedded Backend Views

When Use Backend Views is enabled, the portal page embeds the full Odoo web client inside the portal shell. Employees see native list, form, kanban, or calendar views — complete with print to PDF, the attachments panel, the chatter thread, group-by options, and custom filters — without holding an internal user licence. The embedded view respects all existing access rules, so portal users can only see and act on their own records.

Native Odoo list view embedded inside the portal shell

7.2 Kanban View

The kanban view renders records as cards grouped by stage or another configurable field. This is ideal for workflows where employees need to see at a glance which stage each record is in — for example, expense approval stages or contract status.

Kanban cards displayed inside the portal shell

7.3 Form View

The form view opens a single record in the full Odoo form interface, including all tabs, related sub-lists, the attachments panel, and the chatter thread. Employees can print a PDF, download attachments, and follow the record's communication history without ever leaving the portal.

Full Odoo form view embedded inside the portal shell

7.4 Website Builder Integration

Every portal document page is a standard Odoo website page. Open it while logged in as an administrator, click Edit in the top bar, and drag any snippet above or below the document table: text blocks, image galleries, FAQ accordions, call-to-action banners, and every other snippet in the Website Builder panel. Use these regions to publish HR announcements, policy summaries, or important links — with zero developer involvement.

Dragging snippets onto a portal document page in the Website Builder

7.5 Theme Colors

The portal shell — header bar, tile cards, buttons, and navigation — reads CSS variables from the active Odoo website theme. Changing the color preset in Website → Configuration → Themes instantly recolors the entire portal. No custom CSS and no template overrides are needed.

8. Troubleshooting

  • Tiles not showing after install — check that Is Published is enabled on each document in Employees → Employee Portal → Documents. Also confirm the employee's user account is in the Portal access group and not the Internal User group.
  • No records in the list (table is empty) — verify the Employee Scope Domain is correct and that the employee's portal user is linked to an employee record. To check the link, go to Employees → Employees, open the employee form, and confirm the Related User field on the Settings tab points to the correct portal user.
  • Backend view shows a blank page — this usually means the browser is blocking cookies needed for the embedded Odoo session, or the session has expired. Try in a private/incognito window, or clear site cookies and log in again. Also ensure the portal user has the necessary ACL entries for the model.
  • + New button is not visible — Allow Create must be enabled on the document configuration. If using Backend Views, also verify that the portal user's ACL grants create permission on the model.
  • Wrong records showing (employee sees another person's data) — the Employee Scope Domain is missing or incorrect. Make sure the domain references employee.id and that the field being filtered (for example, employee_id) actually links to hr.employee. Also verify the IR rule on the model matches the scope domain.
  • Security error / AccessError on the page — use the Try as Portal User button on the document configuration form to identify which model is missing access. For non-denylist models, click Auto-grant Missing Access. For denylist models such as hr.contract, add the ACL entry and IR rule manually as described in section 6.3.
  • Changes to the config do not appear immediately — some settings are cached by the browser. Clear the browser cache or open a private/incognito window to see the latest configuration.
  • Employee is not redirected to /employee/home after login — confirm the employee's related user has the Portal access group (not the Internal User group), and that no other custom portal redirect override is active in your Odoo instance.
Odoo Proprietary License v1.0

This software and associated files (the "Software") may only be used (executed,
modified, executed after modifications) if you have purchased a valid license
from the authors, typically via Odoo Apps, or if you have received a written
agreement from the authors of the Software (see the COPYRIGHT file).

You may develop Odoo modules that use the Software as a library (typically
by depending on it, importing it and using its resources), but without copying
any source code or material from the Software. You may distribute those
modules under the license of your choice, provided that this license is
compatible with the terms of the Odoo Proprietary License (For example:
LGPL, MIT, or proprietary licenses similar to this one).

It is forbidden to publish, distribute, sublicense, or sell copies of the Software
or modified copies of the Software.

The above copyright notice and this permission notice must be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.

Please log in to comment on this module

  • The author can leave a single reply to each comment.
  • This section is meant to ask simple questions or leave a rating. Every report of a problem experienced while using the module should be addressed to the author directly (refer to the following point).
  • If you want to start a discussion with the author or have a question related to your purchase, please use the support page.
Community
  • Tutorials
  • Documentation
  • Forum
Open Source
  • Download
  • Github
  • Runbot
  • Translations
Services
  • Odoo.sh Hosting
  • Support
  • Upgrade
  • Custom Developments
  • Education
  • Find an Accountant
  • Find a Partner
  • Become a Partner
About us
  • Our company
  • Brand Assets
  • Contact us
  • Jobs
  • Events
  • Podcast
  • Blog
  • Customers
  • Legal • Privacy
  • Security

Odoo is a suite of open source business apps that cover all your company needs: CRM, eCommerce, accounting, inventory, point of sale, project management, etc.

Odoo's unique value proposition is to be at the same time very easy to use and fully integrated.

Website made with