Overview
This guide is a diagnostic reference for anyone investigating why a package does not appear in search results. The causes range from a simple Active flag being unchecked to subtle interactions between service level assignments, departure statuses, and inventory constraints. Each section covers one category of failure, with symptoms, diagnostic steps, and resolution.
The search pipeline applies filters in sequence. A package that fails any single filter is excluded from results. This means the first step in any investigation is to identify which filter is responsible — and that requires checking them in order.
This guide is intended for delivery consultants, programs managers, and technical staff who configure or debug package search. It complements the Package Search Guide, which covers how to use Package Search as an end user.
Prerequisites
Before using this guide, you should have:
- Access to the Salesforce org where the package is configured.
- Familiarity with the package data model — packages, components, services, departures, inventory seasons, and allotment days.
- Access to search request logs or API configuration if the issue involves request parameters (particularly
service_level_ids).
The Search Diagnostic Flowchart
Work through these checks in order. The first “No” answer is likely your root cause.
-
Is the package Active?
- No — the package is excluded from all search results. Go to Issue 1.
- Yes — continue.
-
Is the Visibility Setting correct for the search context?
- Set to Restricted with no matching Access Rule for the channel — the package is hidden. Go to Issue 2.
- Set to Public, or Restricted with a matching Access Rule — continue.
-
Does the package have Service Level Assignments?
- Yes, and the search request does not include
service_level_ids— the package is excluded. Go to Issue 3. - Yes, and
service_level_idsis included — continue. - No service levels assigned — continue.
- Yes, and the search request does not include
-
Does the departure type match the requested dates?
- Fixed: Is there a departure with Status = Open and Eligibility = Bookable for the requested dates? If not — go to Issue 4.
- Seasonal: Do the time periods cover the requested dates? If not — go to Issue 5.
- Anyday: Do the time periods or inventory date coverage include the requested dates? If not — go to Issue 5.
-
Do all services in the package have available allotment for the requested dates?
- No — one or more services are sold out, on stop sale, or missing allotment days. Go to Issue 6.
- Yes — continue.
-
Is the search scoped to a specific channel or business unit?
- Yes, and the package is not assigned to that channel — go to Issue 7.
- No, or the package is assigned — the package should appear.
If you have worked through all six checks and the package still does not appear, verify that the search request itself is well-formed (valid date format, correct API endpoint, no request-level errors).
Issue 1: Package Not Active
Symptoms
The package does not appear in any search, regardless of dates, channel, or user. It also does not appear in the Package Name lookup field.
Diagnosis
Open the package record in Salesforce and check the Active checkbox.
| Field | Expected Value |
|---|---|
| Active | true (checked) |
If Active is false, the package is completely excluded from search. This is the broadest filter and is applied first.
Package record detail showing the Active checkbox field
Resolution
Set Active = true on the package record. The package will become searchable immediately (subject to passing all other filters).
If the package was intentionally deactivated, confirm with the programs team before reactivating.
Issue 2: Visibility Restriction
For a complete reference on setting up and managing visibility rules, see Visibility Settings & Access Rules.
Symptoms
The package appears in search for some users or channels but not others. Or it does not appear at all, despite being Active.
Diagnosis
Check the Visibility Setting field on the package record.
| Visibility Setting | Behavior |
|---|---|
| Public | Visible to all search requests. No further checks needed. |
| Restricted | Only visible when the search is from a channel or account that matches an Access Rule. |
If the setting is Restricted, check the Access Rules:
- Navigate to the package’s related Access Rule records.
- Verify that the Access Rule has channel assignments or account assignments that match the context of the failing search.
- If the Access Rule exists but has no assignments, the package is effectively hidden from all searches.
Access Rule related list on a package, showing channel and account assignments
Resolution
Either:
- Set Visibility Setting = Public if the package should be universally searchable.
- Add the appropriate channel or account assignments to the Access Rule if the package should remain restricted but visible to specific audiences.
The Name Lookup Caveat
The Package Name lookup field in Salesforce does not apply visibility filtering — it only checks Active = true. A package can appear in the Name Lookup but be invisible in search due to visibility restrictions.
This is documented in the Package Search Guide. If users report that they can “see” a package but it doesn’t appear in search, the Name Lookup versus search distinction is the likely explanation.
Issue 3: Missing service_level_ids
This is the single most common cause of packages disappearing from search results. If a package was previously appearing in search and stops appearing after service levels are added, this is almost certainly the cause.
Symptoms
- A package has service level assignments and does not appear in search results.
- The same package appeared in search before service levels were configured.
- The package passes all other checks (Active, Public, valid dates, inventory available).
Diagnosis
Step 1: Confirm the package has service levels.
Open the package record and check the Service Level Assignments related list. If there are one or more assignments, the package requires service_level_ids in every search request.
Step 2: Check the search request.
Examine the API request being sent by the front-end, booking engine, or integration layer. Look for the service_level_ids parameter.
{
"package_id": "a]0XXXXXXXXXXXXXXX",
"start_date": "2026-06-01",
"end_date": "2026-06-08",
"service_level_ids": ["a0AXXXXXXXXXXXXXXX"]
}
If service_level_ids is missing from the request, the Search API will exclude the package entirely. The API cannot resolve pricing without knowing which tier to use.
Step 3: Verify the service level IDs are correct.
If service_level_ids is present but the package still does not appear, confirm that the IDs in the request match the actual Service Level Assignment records on the package. Mismatched IDs are treated the same as missing IDs.
Service Level Assignments related list on a package record, showing the assignment IDs
Resolution
Option A: Include service_level_ids in the search request.
Update the front-end, QUEST configuration, or API integration to pass service_level_ids with every search request. The IDs should correspond to the service level records that apply to the target package. In most implementations, the front-end fetches available service levels and includes them as a filter.
Option B: Remove service levels if they are not needed.
If service levels were added in error or are no longer required, delete the Service Level Assignment records from the package. The package will then appear in search without the service_level_ids parameter.
For full details on service level configuration and the search integration, see the Service Level Configuration guide.
Issue 4: Departure Status (Fixed Packages)
Symptoms
A fixed-departure package does not appear for specific travel dates, or it appears for some dates but not others.
Diagnosis
For fixed-departure packages, each departure is a discrete bookable instance. Search only returns departures that meet both status conditions:
| Field | Required Value | What It Means |
|---|---|---|
| Status | Open | The departure is available for sale (not Sold Out, Cancelled, or Draft) |
| Eligibility | Bookable | The departure accepts firm bookings (not Waitlist or Inactive) |
Check the departure record for the dates in question:
- Navigate to the package’s Departures related list.
- Find the departure matching the requested travel dates.
- Verify both Status and Eligibility fields.
| Status | Eligibility | Appears in Search? |
|---|---|---|
| Open | Bookable | Yes |
| Open | Waitlist | Depends on configuration — some implementations exclude waitlist departures |
| Open | Inactive | No |
| Sold Out | Any | No |
| Cancelled | Any | No |
| Draft | Any | No |
Departure record showing Status = Open and Eligibility = Bookable fields
Resolution
- Set the departure to Status = Open and Eligibility = Bookable if it should be available.
- If the departure was sold out legitimately, no action is needed — the search correctly excludes it.
- If no departure exists for the requested dates, create one. See the Fixed Departure Management guide for the full workflow.
Issue 5: Date Range Mismatch
Symptoms
The package does not appear for the requested dates but may appear for other dates. All other checks (Active, Visibility, service levels) pass.
Diagnosis
The diagnostic steps depend on the departure type.
Seasonal Packages:
Seasonal packages use time periods to define when they are bookable. Check:
- Does a time period exist that covers the requested start date?
- Does the time period’s day-of-week configuration allow the requested start day? (Some seasonal packages restrict start days to specific weekdays.)
- Is the time period’s status active?
Anyday Packages:
Anyday packages rely on time periods and inventory date coverage to define when they are bookable. Check:
- Do the time periods or inventory seasons covering the requested dates include those dates?
- Are there any blackout dates or exclusion rules that overlap with the request?
Fixed Packages:
Fixed packages require an exact departure match. If no departure record exists for the requested date, the package will not appear. This is covered in Issue 4.
Time period configuration showing date range and day-of-week settings on a seasonal package
Resolution
| Departure Type | Action |
|---|---|
| Seasonal | Add or extend time periods to cover the requested dates. Verify day-of-week rules. See Seasonal Package Setup. |
| Anyday | Extend the time periods or inventory seasons to cover the requested dates. Remove conflicting blackout dates. See Anyday Package Setup. |
| Fixed | Create a new departure for the requested dates. See Fixed Departure Management. |
Issue 6: Inventory Constraints
Symptoms
The package appears intermittently — available for some dates but not others, or it appeared previously and has since disappeared for specific dates. All package-level checks pass.
Diagnosis
Package availability is the intersection of all service availabilities across every component. If any single service in the package has zero available units for the requested dates, the entire package is excluded.
For each component in the package:
- Identify the service assigned to the component.
- Open the service’s Inventory Season that covers the requested dates.
- Check the Allotment Days for those dates.
Look for any of these conditions:
| Condition | Effect |
|---|---|
| Available = 0 | Service is sold out for that date |
| Status = Stop Sale | Service is manually blocked for that date |
| Status = On Request | Service may or may not be available — depends on configuration |
| No allotment day record | Inventory season does not cover the date |
| No inventory season | Service has no inventory configured for the date range |
A single allotment day with zero availability on one service can block the entire package for that date. Always check all services in the chain, not just the one you expect to be the bottleneck.
Allotment day list view showing dates with varying availability, including a Stop Sale flag
Resolution
| Condition | Action |
|---|---|
| Sold out | Increase total allotment if supplier has additional capacity |
| Stop sale | Remove the stop sale flag if the block is no longer needed |
| On request | Change to Available status if firm availability is confirmed |
| Missing allotment days | Regenerate allotment days for the inventory season |
| Missing inventory season | Create a new inventory season covering the required dates |
For detailed inventory management procedures, see the Inventory Operations Guide.
Issue 7: Channel and Business Unit Filtering
Symptoms
The package appears when searching from one channel but not from another. Or it appears in a general search but not when the search is scoped to a specific business unit (an org-level filter).
Diagnosis
Some implementations scope search results by channel or business unit. This is separate from the Visibility Setting / Access Rule mechanism — it is an additional layer of filtering applied at the search request level. Business Unit is an org-level concept, not a field on the Package object.
Check:
- Package-Channel Assignments — is the package assigned to the channel from which the search is being performed?
- Search scope — if the search is scoped to a specific business unit, the filter is applied at the org/search level. Verify the search request’s context matches the intended scope.
- API request parameters — examine the search request for
channel_idorbusiness_unit_idfilters.
Package record showing channel assignments in the related list
Resolution
- Assign the package to additional channels if it should be visible across multiple sales channels.
- Verify that the search request’s channel parameters match the package’s channel assignments. For business unit scoping, the filter is applied at the org/search level — ensure the search context matches the intended scope.
- If channel filtering is not needed, ensure the search request does not include restrictive channel parameters.
Quick Reference: Search Checklist
Use this checklist when investigating a missing package. Work through each item in order — the first failure is your root cause.
| # | Check | Where to Look | Pass Condition |
|---|---|---|---|
| 1 | Package is active | Package record — Active field | Active = true |
| 2 | Visibility allows access | Package record — Visibility Setting + Access Rules | Public, or Restricted with matching assignments |
| 3 | Service level IDs included | Search API request payload | service_level_ids present if package has service level assignments |
| 4 | Departure is open (Fixed only) | Departure record — Status and Eligibility | Status = Open, Eligibility = Bookable |
| 5 | Dates fall within valid range | Time periods (Seasonal), time period or inventory coverage (Anyday), or departure dates (Fixed) | Requested dates are within configured ranges |
| 6 | Inventory is available | Allotment days for each service in every component | Available > 0, no Stop Sale, allotment days exist |
| 7 | Channel/BU assignment matches | Package-Channel assignments, search request parameters | Package assigned to the searched channel |
Common Issue Combinations
When multiple factors overlap, diagnosis gets harder. These combinations appear frequently.
| Symptoms | Likely Cause | Where to Start |
|---|---|---|
| Package disappeared after adding service levels | Missing service_level_ids in search request | Issue 3 |
| Package visible in Name Lookup but not in search | Visibility = Restricted with no matching Access Rule | Issue 2 |
| Package appears for some dates but not others (Fixed) | Some departures are Sold Out or not yet Open | Issue 4 |
| Package appears for some dates but not others (Seasonal/Anyday) | Inventory constraint on one service for specific dates | Issue 6 |
| Package appears in one channel but not another | Missing channel assignment or restrictive API parameter | Issue 7 |
| Package was visible yesterday, invisible today | Allotment sold out overnight, or departure status changed | Check Issue 4 then Issue 6 |
| New package never appeared in search | Multiple: check Active, Visibility, service levels, dates, and inventory in order | Start at the flowchart |
Service Search Troubleshooting
The issues above cover package-level search visibility. This section covers problems that arise when working with individual services — searching for services to add to a component, resolving service pricing in the Package Builder, and diagnosing “unpriced” states.
Issue 8: Service Not Appearing as a Component Option
Symptoms
When adding or editing a component in the Package Builder, a service that should be available does not appear in the service search results (the component option picker).
Diagnosis
The service search within a component filters candidates based on several criteria. Check these in order:
| Check | What to Verify | Where to Look |
|---|---|---|
| Service is active | The service record’s Active field must be checked | Service record — Active field |
| Record type matches | The service’s record type must match the component’s expected record type (e.g., Accommodation, Transfer, Activity) | Component record type configuration vs. Service record type |
| Price category exists | The service must have at least one active Price Category | Service record — Price Categories related list |
| Supplier match (single-supplier packages) | If the package is configured for a single supplier, the service must belong to that supplier | Service record — Supplier lookup vs. Package supplier assignment |
Service search results in the component option picker, filtered by record type and supplier
Resolution
| Condition | Action |
|---|---|
| Service is inactive | Set Active = true on the service record |
| Record type mismatch | Verify the component expects the service’s record type. If the component is configured for Accommodation, a Transfer-type service will not appear |
| No price category | Create a Price Category on the service with the correct pricing structure |
| Supplier mismatch | Assign the service to the correct supplier, or reconfigure the package’s supplier constraint |
Issue 9: Service Pricing Not Resolving in Builder
Symptoms
A service is selected as a component option, but the Package Builder shows no price or a zero price for the service. The package may still appear in search, but the pricing breakdown is incomplete or incorrect.
Diagnosis
Pricing resolution requires multiple conditions to align. Check:
| Check | What to Verify | Where to Look |
|---|---|---|
| Price season coverage | A price season must exist that covers the travel dates | Service — Price Seasons related list |
| Cost entered on price category | The price category must have a cost value (buy price) entered | Price Category record — cost fields |
| Currency match | The price category currency must match the itinerary’s sell currency or have a valid conversion rate | Price Category currency vs. Itinerary/Channel currency |
| Allocation type alignment | The service’s allocation type (per person, per unit, per night, etc.) must match the expected pricing model for the component | Service record — Allocation Type field |
Price category detail showing cost fields, currency, and price season coverage
Resolution
| Condition | Action |
|---|---|
| No price season for dates | Create or extend a price season to cover the requested travel dates |
| No cost on price category | Enter the buy price on the price category record |
| Currency mismatch | Add the correct currency to the price category, or configure a conversion rate on the channel’s brand |
| Allocation type mismatch | Verify the allocation type on the service matches how the component expects to price it (per person vs. per unit vs. per night) |
Issue 10: Service Showing as Unpriced
Symptoms
A component option displays an “Unpriced” label in the Package Builder or pricing summary. The service is selected and appears in the component, but is excluded from the price total.
Diagnosis
The “Unpriced” state has three common causes:
| Check | What to Verify | Where to Look |
|---|---|---|
| Unpriced flag on component option | The component option record may have the Unpriced checkbox checked, which explicitly excludes it from pricing | Component Option record — Unpriced field |
| No cost on price category | Even if a price category exists, if no cost value has been entered, the service resolves as unpriced | Price Category record — cost fields |
| Price season gap | A price season exists but does not cover all the travel dates. Partial coverage can result in the service being treated as unpriced for the uncovered portion | Service — Price Seasons date ranges vs. itinerary dates |
Component option record showing the Unpriced checkbox and its effect on the pricing summary
Resolution
| Condition | Action |
|---|---|
| Unpriced flag checked intentionally | No action needed — the service is correctly excluded from pricing (e.g., complimentary services) |
| Unpriced flag checked in error | Uncheck the Unpriced field on the component option record |
| No cost on price category | Enter the buy price on the relevant price category |
| Price season gap | Extend the existing price season or create an additional one to cover the full date range |
Issue 11: Service Missing from Pre/Post Stay Tabs Despite Valid Pricing
Symptoms
A service works correctly in standalone bookings — it can be added to an itinerary and priced without issues — but it does not appear in the Pre Stay or Post Stay tabs in package search results. All other configuration looks correct: allocation behaviour is set, inventory is available, and pricing exists.
Diagnosis
The package search results builder (PackageSearchResultsBuilder) sorts price categories by their Sort Order field when constructing the pre/post stay tab options. If the Sort Order field is null on any price category, that category is filtered out during the sorting and grouping logic. Because standalone booking uses a different code path that does not depend on Sort Order, the service works fine outside of package search.
This issue is most common when price categories were created via data import rather than through the Salesforce UI. The UI enforces Sort Order as a mandatory field, but bulk imports and data loads can skip it — and the import will succeed without error.
| Check | What to Verify | Where to Look |
|---|---|---|
| Sort Order populated | Every price category on the service has a non-null Sort Order value | Service record — Price Categories related list — Sort Order field |
| Service works in standalone | The service can be added to an itinerary and priced outside of package search | Create a test itinerary and add the service manually |
| Other pre/post config is correct | Allocation Behaviour is PreNight/PostNight, Selection Type is Optional, inventory covers extension dates | Component record and service inventory seasons |
Resolution
| Condition | Action |
|---|---|
| Sort Order is blank on price categories | Populate the Sort Order field on all price categories for the affected service. Any positive integer value will work — the field controls display ordering in the results |
| Multiple services affected (bulk import) | Run a bulk update across all price categories with null Sort Order. Query: SELECT Id, Name, KaptioTravel__SortOrder__c FROM KaptioTravel__PriceCategory__c WHERE KaptioTravel__SortOrder__c = null |
After populating Sort Order, the service will appear in Pre/Post Stay tabs on the next search. No package reactivation or cache clear is needed.
For the full pre/post stay configuration walkthrough, see the Pre/Post Stay Configuration guide.
Error Message Troubleshooting
When Salesforce displays an error toast or modal in the Package Builder, Booking Wizard, or related UIs, the message originates from an AuraHandledException in the Apex controller layer. This table maps common error messages to their root cause and resolution.
| Error Message | Where It Appears | Root Cause | Solution |
|---|---|---|---|
| ”Itinerary not found” | Booking Overview, Payments | The itinerary ID passed to the controller does not match any record. Usually caused by a stale browser tab or a deleted/merged itinerary. | Refresh the page. If the itinerary was merged or cancelled, navigate to the correct record. |
| ”No conversion rate found for the selected currency” | Payments — currency conversion | The itinerary’s channel brand does not have a conversion rate configured for the requested currency pair. | Add the missing currency conversion rate to the Brand record’s currency configuration. Verify both the source and target currencies are present. |
| ”Itinerary has open amendment” | Booking Overview, Itinerary actions, PNR Import | An amendment is already in progress on this booking. The system prevents concurrent modifications. | Complete or discard the existing amendment before making further changes. Check the itinerary’s Open Amendment field. |
| ”Itinerary is invoiced or itinerary year is closed” | Booking Overview, Itinerary actions | The booking has been invoiced or its accounting year has been closed, preventing further edits. | If the invoice is correct, no action is needed. If changes are required, the finance team must re-open the accounting period or reverse the invoice first. |
| ”Cannot make changes when amendment operation in progress” | Booking Overview, Itinerary actions | A recalculation or amendment merge is currently processing. The itinerary is locked until completion. | Wait for the amendment operation to complete. Check the Recalculation Status field on the itinerary. If stuck, contact support to investigate the background job. |
| ”Cannot make changes to the snapshot booking” | Booking Overview, Itinerary actions, PNR Import | The record is a snapshot (point-in-time copy) of the original booking, which is read-only by design. | Navigate to the original booking record to make changes. Snapshots are reference copies and cannot be edited. |
| ”Cannot make changes to the merged/rejected booking” | Booking Overview, Itinerary actions | The itinerary has been merged into another booking or was rejected during amendment, making it read-only. | Navigate to the surviving booking (the merge target) to make changes. |
| ”Service record type assignment is missing” | Price Category setup | The service’s record type does not have a Price Category Type configuration. The system cannot determine the default pricing structure. | Create a Price Category Type record that maps to the service’s record type. This is typically configured during initial org setup. |
| ”Price Lines Per Passenger is not enabled for this Itinerary” | Adjustments | The Adjustments UI requires the “Price Lines Per Passenger” feature to be enabled on the itinerary, but it is not present in the Enabled Features field. | Enable “Price Lines Per Passenger” in the itinerary’s Enabled Features configuration. This is controlled by the package or channel settings. |
| ”There was an error fetching the allotment days. Please refresh the page and try again.” | Inventory Table | The inventory query returned no matching contract records for the selected service and date range. This can happen if inventory seasons were deleted or the service-contract link is broken. | Refresh the page. If the error persists, verify that the service has valid inventory seasons with contract assignments for the date range in question. |
| ”Bookable From cannot be greater than Bookable To” | Price Category Settings | The Bookable From date on a price category or add-on is set after the Bookable To date, creating an invalid date range. | Correct the date range so that Bookable From is earlier than or equal to Bookable To. |
| ”Failed to initialize modification” | Booking Wizard | The system could not start the itinerary modification operation. The underlying cause varies — check the full error message for details. | Review the full error message appended after the prefix. Common causes include locked records, missing permissions, or validation rule failures. |
Related Schema Objects
| Object | Role in Search |
|---|---|
| Package | Top-level searchable entity. Holds Active flag, Visibility Setting, departure type. |
| Access Rule | Controls visibility for Restricted packages. Links to channels and accounts. |
| Service Level | Defines a pricing tier. |
| Service Level Assignment | Links a service level to a package. Triggers the service_level_ids requirement. |
| Departure | (Fixed packages) Individual bookable instance with Status and Eligibility. |
| Time Period | (Seasonal packages) Date range and day-of-week rules for valid search dates. |
| Component | Links a package to one or more services. Each component must be available. |
| Service | Supplier service with inventory. Assigned to a component. |
| Inventory Season | Date-ranged allocation for a service. Contains allotment days. |
| Allotment Day | Single-date record with availability count and status flags. |
See Also
- Package Fundamentals — package structure, components, and departure types.
- Supplier & Service Setup — creating suppliers, services, record types, and price categories.
- Cost & Pricing Architecture — how pricing resolves from price categories, price seasons, and cost entries.
- Service Level Configuration — multi-tier pricing setup and the
service_level_idssearch integration. - Inventory Operations Guide — day-to-day allotment management, stop sale, and availability auditing.
- Anyday Package Setup Guide — creating and configuring anyday packages with time period and inventory date coverage.
- Seasonal Package Setup Guide — time period configuration for seasonal packages.
- Fixed Departure Management — creating departures, managing status and eligibility.
- Package Search Guide — how to use Package Search, understand results and availability views.