Help center Customer portals Liquid customer case pages: show details, visible fields and activities Updated Wednesday, October 28, 2026 · Marc Staine A customer case page should answer three questions quickly: which issue is this, what has happened, and what can I do next? sb.case supplies the authorized case detail for that page. In a B2B relationship, a clear asset, company and conversation context can prevent repeated explanations across several customer contacts, but the page must still respect the configured visibility of each field and action. At a glanceFor: portal administrators and designers working with support operations. Applies to: Supportbench Core.Start here: Settings → Customer Portal → select the portal → Page templates What this object gives you · Choose the correct page and customer context · Supported values and how to use them · Example: show the issue and permitted custom-field values · Display the conversation without rebuilding reply behavior · Make and verify the change · Common problems and recovery · Keep the portal useful over time What this object gives you sb.case is a single admitted case detail object or null when the case is unavailable in the current context. It contains descriptive fields, a custom-field descriptor list and an activity collection. It is not the same row shape as sb.cases.Display flags such as priority_visible, asset_visible and a custom field’s visible value are part of the page contract. Preserve them when customizing. Hiding a link is not authorization, and adding a field to a template must not be treated as permission to expose it. Choose the correct page and customer context Use the existing case-detail page reached through /case/ and the case identifier. Preserve native reply/reopen forms, input names, attachment upload controls and customer-authentication branches. A display fragment does not implement those actions.Open the intended portal in Settings → Customer Portal, then choose Page templates. You need permission to administer communities or the applicable portal-edit override. Work on the existing page for this task; adding an object name to a different page does not make its records available. Keep existing forms, input names, navigation and scripts intact.Liquid is a presentation language. Expressions inside {{ ... }} print values; statements inside {% ... %} control a loop or condition. A collection must be looped through before reading an individual row. These examples are display fragments to adapt within a working template, not replacement page templates. Supported values and how to use them MemberMeaning and operational useid / subject / summary / summary_visibleCase identity and descriptive text. Use escape_once for subject/summary and respect the summary visibility flag.category_id / category / issue / issue_visibleDivision/category and issue classification. Use the supplied display flag for issue information.status_id / status / priority / priority_visible / outcomeCase state, priority and outcome display values. Status zero represents closed; use the readable label in customer instructions.company / created_by / avatar / owner / queueCompany and people/routing context. Avoid presenting internal team terminology without explanation.asset_id / asset / asset_visibleLinked asset and display policy.project_id / project_name / project_version / project_version_name / project_visible / project_version_visibleProject/version context when supplied and allowed.support_level / sla / sla_date / sla_readableService context. In the detail object sla is nullable date data; guard and format the supplied date appropriately. The declared sla_readable member is not populated by this mapping.created / modified / closed_on / time_spentCase dates and recorded time metadata. Do not relabel modified as a guaranteed last-response timestamp.tags / tags_visibleTag collection and its display policy.fieldsCustom-field descriptors: name, field_id, type_id, value, content, optional value_id, visible, required and list_values. Choice rows contain value and content.activitiesAuthorized activity rows with id, from, to, cc, email aliases, subject, type, content, created_by, avatar, created/modified and attachments.activities.attachmentsAttachment name, path and size. Use the supplied path; a filename is not a download URL.secondaryContacts / vendor metadata / can_reopenAdditional context and supported reopen state. Preserve the existing action implementation and its authorization checks. Example: show the issue and permitted custom-field values {% if sb.case %} <h1>{{ sb.case.id | escape }}: {{ sb.case.subject | escape_once }}</h1> <p>Status: {{ sb.case.status | escape }}</p> {% if sb.case.summary_visible %} <p>{{ sb.case.summary | escape_once }}</p> {% endif %} <dl> {% for field in sb.case.fields %} {% if field.visible %} <dt>{{ field.name | escape }}</dt> <dd>{{ field.content | escape_once }}</dd> {% endif %} {% endfor %} </dl> {% else %} <p>This request is not available in the current customer context.</p> {% endif %}This is a read-only display example. required and list_values matter when the native page builds editable controls, but rendering them in a definition list does not implement field editing. Keep the existing type-aware control and save behavior if customers are allowed to update a field. Display the conversation without rebuilding reply behavior Use the supplied activity content in its intended HTML container, while escaping ordinary metadata. The authorized activity list and server-side page behavior determine what a customer can see. Do not substitute an internal agent activity query or infer that every case activity is public.{% for activity in sb.case.activities %} <section class="case-activity"> <h2>{{ activity.subject | escape_once }}</h2> <p>{{ activity.created_by | escape }} · {{ activity.created | ldate | escape }}</p> <div class="activity-body">{{ activity.content }}</div> {% for file in activity.attachments %} <p><a href="{{ file.path | escape }}">{{ file.name | escape }}</a> ({{ file.size | format_bytes | escape }})</p> {% endfor %} </section> {% endfor %}Keep the existing reply and reopen controls. can_reopen describes availability in the current state; printing a button with that label does not create a working, authorized reopen operation. Make and verify the change Write down the customer task this change should improve. For example, make the correct request or relevant knowledge easier to find. Decide what should appear when there is no data.Copy the current template into your approved change record before editing. Add the fragment in the correct page context without removing functional controls.Choose Save Changes to save the draft, then Design to preview it. Check a populated example and an empty or signed-out example as applicable.Inspect desktop and narrow-screen layouts. Test long customer names, long titles, missing optional values, readable links and keyboard navigation.Use Review changes → Publish when the draft is ready. A saved draft does not update the live visitor page.Open the actual portal as an intended customer and follow the full task. Verify another relevant role or customer scope where visibility differs. Record the account, page, role and outcome with the change.Preview is only part of the checkDesigner examples use synthetic data. They can show layout and syntax problems, but do not prove that a real customer has access to a record. Keep portal access rules and the actual customer test separate from visual preview. Common problems and recovery ProblemWhat to checkThe case exists for an agent but sb.case is nullCheck the customer contact, role, company/secondary relationships and case access.A previously hidden field becomes visibleRestore its visibility condition and review the live customer result. Do not treat available data members as blanket permission to display them.Dropdown values show an ID instead of a labelUse the descriptor’s readable content appropriately; value_id identifies a choice and is not its customer-facing label.An attachment fails after reconstructing the URLUse the supplied path and preserve the native authorization behavior.Reply or reopen stopped workingRestore the existing form controls, IDs, callbacks and permission branches. These examples only render content.The template renders in preview but the live page has not changedConfirm that you published the reviewed draft for the correct portal, page and language. Reopen the live page.A customer sees fewer records than an agentCheck the customer’s portal role, company/contact relationship and the record’s audience. Do not attempt to broaden access by changing a Liquid loop.A layout change breaks a form or navigationCompare the changed template with the saved working version. Restore missing form IDs, inputs, URL patterns or callbacks before publishing the corrected draft. Keep the portal useful over time Test the full customer conversation: identify the case, read its history, download an authorized attachment and use any permitted next action. Include contacts with different roles so the page remains useful without exposing internal information.Use clear labels and meaningful empty states. Do not display a raw ID when a customer needs a descriptive name, and do not describe an absent value as a service failure. After changes to portal roles, topic placement, custom fields or language coverage, revisit the relevant customer examples. A successful render alone does not establish that the instructions, links and customer visibility are still correct. Continue learning Plan and publish a safe Liquid portal customizationDisplay the customer request listUnderstand agent Case View and collaborationConfigure customer rolesConfigure the customer portal Was this article helpful? Yes No Thank you for your feedback.