- Newest
- Most votes
- Most comments
Should you use HTML or the No-code JSON UI? • Use the JSON / No-code UI Builder for your case. You already have the Lambda response in Contact attributes, you’re not using API Gateway, and you want a table + “View details” without hosting anything. The No-code view can bind directly to contact/view data, no extra infra, no CORS, no S3 site.  • Use HTML (URL view) only if you need full custom styling/logic and you’re OK hosting a page and wiring security/CORS yourself. HTML gives total control but adds ops overhead. 
⸻
How to do it with the No-code UI Builder (table + row button + left-side details)
A) In your flow 1. Lambda block → return your entitlements array (exact JSON you posted). 2. Store it as a Contact attribute (stringify JSON if needed). 3. Show view block → open your custom View and pass the JSON as view input (block supports passing complex JSON). 
B) In the No-code UI Builder (create the View) 1. Add a two-column layout: left 30% panel (details), right 70% (table). 2. Table component: • Data source: bind to the JSON you passed (e.g., view.input.body.entitlements or to the contact attribute if you didn’t use Show View input). • Columns: EntitlementName, EntitlementStatus, StartDate. • Row action button: label “View Details” → Action: set view state selected = this.row. 3. Details panel (left): • Add a Key/Value list (or multiple text fields) bound to state.selected.<FieldName>. • When nothing is selected, show “Select a record → View Details”.
The No-code UI supports dynamic fields so you can bind component properties to runtime data (contact attributes or the view’s input) without code. 
C) Optional alternative If you prefer to skip contact attributes for large payloads, pass the JSON only through Show view → Input and bind the table to view.input.... (AWS explicitly supports passing complex JSON to Views.) 
⸻
Why this beats the custom HTML approach for you • No hosting / no CORS / no API Gateway needed. • Native: lives inside Agent Workspace; permissions & data remain in Connect. • Faster changes: you edit the JSON view config, not code. 
⸻
References (for the exact knobs you’ll click) • Views & Agent Workspace basics (how Views work)  • No-code UI component library (table, key/value, actions)  • Show view block (pass complex JSON into a View)  • Dynamic fields (bind UI to contact/view data at runtime)  • Display contact attributes in views (if you keep it in attributes) 
<!-- Right: Table -->
<section class="card">
<div class="toolbar">
<h2 style="margin-right:8px;">Entitlements</h2>
<span class="pill" id="countPill">0 items</span>
<div class="search">
<label class="muted" style="font-size:12px;">
Search <input id="searchBox" type="text" placeholder="Name, Status, Date…" />
</label>
</div>
</div>
<div id="tableWrap" style="overflow:auto; max-height:calc(100vh - 130px);">
<table class="table" id="entTable" role="grid" aria-label="Entitlements">
<thead>
<tr>
<th scope="col">EntitlementName</th>
<th scope="col">EntitlementStatus</th>
<th scope="col">StartDate</th>
<th scope="col" style="width:1%; white-space:nowrap;">Action</th>
</tr>
</thead>
<tbody id="entBody"></tbody>
</table>
</div>
<div id="loading" class="muted" style="padding:8px 0;">Loading…</div>
<div id="error" class="muted" style="padding:8px 0; display:none;">Failed to load data.</div>
</section>
</div>
<script>
// -------------- CONFIG --------------
// Point this to your API Gateway (fronting the Lambda that returns the JSON you posted).
const API_URL = "https://YOUR_API_GATEWAY_URL/entitlements"; // <-- TODO
// Optional: support Connect passing JSON in a query param (?data=base64json)
function getEntitlementsFromQuery() {
const p = new URLSearchParams(location.search);
const raw = p.get("data");
if (!raw) return null;
try {
const json = JSON.parse(atob(raw));
return json?.body?.entitlements || json?.entitlements || null;
} catch { return null; }
}
// -------------- STATE --------------
let ENTITLEMENTS = [];
let FILTERED = [];
let SELECTED = null;
const els = {
body: document.getElementById("entBody"),
count: document.getElementById("countPill"),
loading: document.getElementById("loading"),
error: document.getElementById("error"),
detailEmpty: document.getElementById("detailEmpty"),
detailPane: document.getElementById("detailPane"),
detailList: document.getElementById("detailList"),
searchBox: document.getElementById("searchBox")
};
// -------------- RENDER --------------
function renderTable(rows) {
els.body.innerHTML = "";
rows.forEach((r, idx) => {
const tr = document.createElement("tr");
tr.innerHTML = `
<td>${escapeHtml(r.EntitlementName || "")}</td>
<td><span class="status ${cssSafe(r.EntitlementStatus)}">${escapeHtml(r.EntitlementStatus || "")}</span></td>
<td>${escapeHtml(r.StartDate || "")}</td>
<td classanswered 10 months ago
To display Lambda response records in a table with row actions and detail view in Amazon Connect UI, you can use the Show view block with a combination of List view and Detail view components.
First, ensure your Lambda function is properly configured to return the entitlements data in the format you've shown. The output from your Lambda function should be a flat object of key/value pairs, and the size must be less than 32 KB of UTF-8 data.
To implement your UI requirements:
-
Create a flow with a Lambda function block to fetch your entitlements data.
-
Add a Show view block after the Lambda function block.
-
In the Show view block properties, you can use the List view to display your table of records and the Detail view to show the selected record's attributes.
-
You can customize the view using JSON in the Show view block. Here's how you might structure it:
For the List view component (right 70% of the screen):
- Configure it to display the EntitlementName, EntitlementStatus, and StartDate columns
- Add a "View Details" action button for each row
- Set up the action to update the Detail view when clicked
For the Detail view component (left 30% of the screen):
- Configure it to display all attributes of the selected entitlement record
- Initially, it can be empty or show a default message
You can use the Views UI template in the Amazon Connect admin console to build the JSON object structure. Navigate to your instance, go to Routing > Flows, select the Views tab, and use the UI template to create your layout.
If you encounter schema errors when configuring your JSON, make sure your JSON structure matches the schema criteria for your contact flow. For example, if you're using dynamic fields in your List items, ensure the schema properly defines the expected data types.
The Show view block properties will be dynamically populated based on which View resource you choose, allowing you to configure the necessary actions for your table rows and detail view interactions.
Sources
Flow block in Amazon Connect: Show view - Amazon Connect
Customize views for the Amazon Connect agent workspace by using HTML and JSX - Amazon Connect
Troubleshoot step-by-step guide schema errors in Amazon Connect | AWS re:Post
Grant Amazon Connect access to your AWS Lambda functions - Amazon Connect
answered 10 months ago
Relevant content
asked 9 months ago
asked 8 months ago
- AWS OFFICIALUpdated 25 days ago
- AWS OFFICIALUpdated 2 years ago

Hi @Eric, Thank you for the response and a solution. However, I'm not so good with HTML and I don't use API Gateway, since the Lambda is directly invoked within the Contact flow and the response is saved into Contact attribute. I was playing around with the No Code UI Builder and now exploring the UI Configurations here - https://d3irlmavjxd3d8.cloudfront.net/?path=/story/overview--page. Would you recommend to consider HTML or creating view using JSON schema? Thanks, Mahesh