{"id":33,"date":"2026-09-12T15:38:12","date_gmt":"2026-09-12T15:38:12","guid":{"rendered":"https:\/\/demo.gatilab.com\/hassium\/tour\/post-layouts\/"},"modified":"2026-09-12T15:38:12","modified_gmt":"2026-09-12T15:38:12","slug":"post-layouts","status":"publish","type":"page","link":"https:\/\/demo.gatilab.com\/hassium\/tour\/post-layouts\/","title":{"rendered":"Post layouts"},"content":{"rendered":"\n<div class=\"wp-block-group alignfull has-soft-gradient-background has-background has-global-padding is-layout-constrained wp-container-core-group-is-layout-843958c9 wp-block-group-is-layout-constrained\" style=\"border-bottom-color:var(--wp--preset--color--contrast-3);border-bottom-style:solid;border-bottom-width:1px;padding-top:var(--wp--preset--spacing--70);padding-bottom:var(--wp--preset--spacing--60)\">\n<h1 class=\"wp-block-heading has-text-align-center\" style=\"font-size:clamp(2rem, 1.5rem + 1.8vw, 2.75rem)\">Post layouts<\/h1>\n\n\n\n<p class=\"has-text-align-center has-contrast-2-color has-text-color wp-block-paragraph\">Starting structures offered when you create a post: an article, release notes, a customer story, and a how-to guide.<\/p>\n<\/div>\n\n\n\n<p class=\"is-style-lead is-style-lead--1 wp-block-paragraph\">A shared inbox works when anyone can tell, at a glance, which requests are theirs. This is the setup we walk new teams through in their first week, and the habits that keep it tidy after that.<\/p>\n\n\n\n<div class=\"wp-block-group is-style-card is-layout-flow wp-container-core-group-is-layout-92488599 wp-block-group-is-layout-flow is-style-card--2\">\n<p class=\"has-contrast-color has-text-color has-small-font-size wp-block-paragraph\" style=\"font-weight:600\">In this article<\/p>\n\n\n\n<ul class=\"wp-block-list is-style-plain has-small-font-size\">\n<li><a href=\"#one-owner\">Give every request one owner<\/a><\/li>\n\n\n\n<li><a href=\"#tags-and-views\">Use tags for topics and views for people<\/a><\/li>\n\n\n\n<li><a href=\"#saved-replies\">Write saved replies that sound like you<\/a><\/li>\n<\/ul>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"one-owner\" style=\"margin-top:var(--wp--preset--spacing--50);font-size:clamp(1.6rem, 1.1rem + 1.4vw, 2rem)\">Give every request one owner<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">When a request belongs to everyone, it belongs to no one. The first rule we set is that every open request has exactly one owner, even when three people end up working on it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Owners change hands all the time, and that is fine. What matters is that the name on the request belongs to the person who sends the next reply.<\/p>\n\n\n\n<ul class=\"wp-block-list is-style-check\">\n<li>Flag requests that sit without an owner for more than an hour<\/li>\n\n\n\n<li>Hand a request over with an internal note, not a chat message<\/li>\n\n\n\n<li>Close a request only when the customer has what they asked for<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"tags-and-views\" style=\"margin-top:var(--wp--preset--spacing--50);font-size:clamp(1.6rem, 1.1rem + 1.4vw, 2rem)\">Use tags for topics and views for people<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Tags describe what a request is about: billing, bookings, a bug. Views describe who should see it. Mixing the two up is the most common reason a queue turns messy by the third month.<\/p>\n\n\n\n<figure class=\"wp-block-image alignwide size-full is-style-shot\"><img decoding=\"async\" src=\"https:\/\/demo.gatilab.com\/hassium\/wp-content\/themes\/hassium\/assets\/images\/app-inbox.webp\" alt=\"A Hassium inbox view for one team, with an open request and an internal note from a teammate\"\/><figcaption class=\"wp-element-caption\">A view for the bookings team. Tags show what each request is about at a glance.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Start with five or six tags and one view per team. Add more only when someone asks for a list that does not exist yet.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"saved-replies\" style=\"margin-top:var(--wp--preset--spacing--50);font-size:clamp(1.6rem, 1.1rem + 1.4vw, 2rem)\">Write saved replies that sound like you<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Customers can tell when they are reading a template. Write each saved reply the way you would answer one person, then leave room for a line only a teammate could add.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">We rewrite a saved reply whenever a customer answers it with a follow-up question. That question is the part the reply missed.<\/p>\n<cite>Tobias Kline, support lead at Hassium<\/cite><\/blockquote>\n\n\n\n<div class=\"wp-block-group has-primary-tint-background-color has-background is-layout-flow wp-block-group-is-layout-flow\" style=\"border-radius:var(--wp--preset--border-radius--lg);padding-top:var(--wp--preset--spacing--40);padding-right:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--40);padding-left:var(--wp--preset--spacing--40)\">\n<p class=\"has-small-font-size wp-block-paragraph\"><strong>Try this:<\/strong> Review your saved replies once a quarter. Old prices, retired features, and broken links hide in them longer than anywhere else.<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-group is-style-card is-layout-flow wp-container-core-group-is-layout-813c598a wp-block-group-is-layout-flow is-style-card--3\" style=\"margin-top:var(--wp--preset--spacing--50)\">\n<h3 class=\"wp-block-heading\">Try this setup on your own queue<\/h3>\n\n\n\n<p class=\"has-contrast-2-color has-text-color has-small-font-size wp-block-paragraph\">Every feature is free for 14 days. Bring a week of real requests and see how the inbox feels with owners and views in place.<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"#\">Try Hassium free<\/a><\/div>\n<\/div>\n<\/div>\n\n\n\n\n<div class=\"wp-block-group is-layout-flex wp-container-core-group-is-layout-3661bf32 wp-block-group-is-layout-flex\">\n<p class=\"is-style-pill wp-block-paragraph\">Workflows 2.0<\/p>\n\n\n\n<p class=\"is-style-meta is-style-meta--4 wp-block-paragraph\">Available on every plan<\/p>\n<\/div>\n\n\n\n<p class=\"is-style-lead is-style-lead--5 wp-block-paragraph\">Workflows can now take different paths, pause for a customer, and show you their work on old requests before anyone depends on them. Here is everything in the release.<\/p>\n\n\n\n<figure class=\"wp-block-image alignwide size-full is-style-frame\"><img decoding=\"async\" src=\"https:\/\/demo.gatilab.com\/hassium\/wp-content\/themes\/hassium\/assets\/images\/app-workflow.webp\" alt=\"The workflow builder with a refund workflow that splits into two branches after a check on the order total\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" style=\"margin-top:var(--wp--preset--spacing--50);font-size:clamp(1.6rem, 1.1rem + 1.4vw, 2rem)\">What is new<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Branches.<\/strong> Split a workflow on a tag, a form answer, or the customer&#039;s plan, and give each path its own actions.<\/li>\n\n\n\n<li><strong>Delays.<\/strong> Pause a step for a set time, or until the customer writes back, then carry on from the same place.<\/li>\n\n\n\n<li><strong>Test runs.<\/strong> Choose a date range and see what a draft would have done to every request in it, while the draft is still private.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" style=\"margin-top:var(--wp--preset--spacing--50);font-size:clamp(1.6rem, 1.1rem + 1.4vw, 2rem)\">Improvements<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The step log now says why each condition passed or failed.<\/li>\n\n\n\n<li>Large workflows open about twice as fast in the builder.<\/li>\n\n\n\n<li>Duplicating a workflow now copies its test history too.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Workflow runs in the REST API now include the branch each run took and the steps it ran, in order. Existing fields are unchanged.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>GET \/v1\/runs\/run_8f2c\n\n{\n  \"id\": \"run_8f2c\",\n  \"status\": \"completed\",\n  \"branch\": \"over_limit\",\n  \"steps\": [\n    \"check_total\",\n    \"ask_approval\",\n    \"notify_owner\"\n  ]\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" style=\"margin-top:var(--wp--preset--spacing--50);font-size:clamp(1.6rem, 1.1rem + 1.4vw, 2rem)\">Fixes<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Approval requests sent by email now expire after seven days, as the setting says.<\/li>\n\n\n\n<li>A form submitted twice within a second no longer starts the same workflow twice.<\/li>\n\n\n\n<li>Renaming a tag now updates every workflow condition that uses it.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" style=\"margin-top:var(--wp--preset--spacing--50);font-size:clamp(1.6rem, 1.1rem + 1.4vw, 2rem)\">Upgrade notes<\/h2>\n\n\n\n<div class=\"wp-block-group is-layout-flow wp-container-core-group-is-layout-2957bd8f wp-block-group-is-layout-flow\">\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\" open><summary>For workspace admins<\/summary>\n<p class=\"wp-block-paragraph\">Existing workflows keep running exactly as they did. Branches and delays appear the next time you open a workflow in the builder, and nothing changes until you publish a new version.<\/p>\n<\/details>\n\n\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>For API users<\/summary>\n<p class=\"wp-block-paragraph\"><code>branch<\/code> is a new field on every run. It is empty for runs that started before September 8, 2026, so allow an empty value if your code checks responses strictly.<\/p>\n<\/details>\n<\/div>\n\n\n\n\n<p class=\"is-style-lead is-style-lead--6 wp-block-paragraph\">Brightwater Dental books patients across nine clinics from one front desk team. Here is how they stopped losing appointment changes between the phone, the inbox, and the website.<\/p>\n\n\n\n<figure tabindex=\"0\" class=\"wp-block-table\"><table><thead><tr><th>Company<\/th><th>Brightwater Dental<\/th><\/tr><\/thead><tbody><tr><td>Team size<\/td><td>12 people across nine clinics<\/td><\/tr><tr><td>Plan<\/td><td>Team, billed yearly<\/td><\/tr><tr><td>Using Hassium since<\/td><td>March 2025<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" style=\"margin-top:var(--wp--preset--spacing--50);font-size:clamp(1.6rem, 1.1rem + 1.4vw, 2rem)\">The challenge<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Patients asked to move appointments by phone, by email, and through a form on the website, and each clinic kept its own list of changes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Changes slipped between those lists. A patient would email on Friday, call on Monday, and arrive on Wednesday for a slot that had already moved. Priya Nair, the operations manager, counted 14 missed changes in one quarter.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" style=\"margin-top:var(--wp--preset--spacing--50);font-size:clamp(1.6rem, 1.1rem + 1.4vw, 2rem)\">What they changed<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The team moved all three channels into one Hassium inbox in a week. An intake form replaced the free text box on the website, so every request now arrives with the clinic, the patient, and two preferred times.<\/p>\n\n\n\n<ul class=\"wp-block-list is-style-check\">\n<li>A workflow routes each request to the clinic it names<\/li>\n\n\n\n<li>Anything without a reply after two hours goes to the shift lead<\/li>\n\n\n\n<li>Saved replies confirm the new time and link to the clinic&#039;s map<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" style=\"margin-top:var(--wp--preset--spacing--50);font-size:clamp(1.6rem, 1.1rem + 1.4vw, 2rem)\">The results<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Six months later, the same front desk team handles about a third more requests, and missed changes are close to zero.<\/p>\n\n\n\n<div class=\"wp-block-group is-layout-grid wp-container-core-group-is-layout-20e67bfd wp-block-group-is-layout-grid\">\n<div class=\"wp-block-group is-style-card is-layout-flow wp-container-core-group-is-layout-92488599 wp-block-group-is-layout-flow is-style-card--7\">\n<p class=\"has-contrast-color has-text-color has-inter-font-family has-x-large-font-size wp-block-paragraph\" style=\"font-weight:700;letter-spacing:-0.02em;line-height:1.1\">38 min<\/p>\n\n\n\n<p class=\"is-style-meta is-style-meta--8 wp-block-paragraph\">Median first reply, down from 5 hours<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-group is-style-card is-layout-flow wp-container-core-group-is-layout-92488599 wp-block-group-is-layout-flow is-style-card--9\">\n<p class=\"has-contrast-color has-text-color has-inter-font-family has-x-large-font-size wp-block-paragraph\" style=\"font-weight:700;letter-spacing:-0.02em;line-height:1.1\">1<\/p>\n\n\n\n<p class=\"is-style-meta is-style-meta--10 wp-block-paragraph\">Missed change last quarter, down from 14<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-group is-style-card is-layout-flow wp-container-core-group-is-layout-92488599 wp-block-group-is-layout-flow is-style-card--11\">\n<p class=\"has-contrast-color has-text-color has-inter-font-family has-x-large-font-size wp-block-paragraph\" style=\"font-weight:700;letter-spacing:-0.02em;line-height:1.1\">94%<\/p>\n\n\n\n<p class=\"is-style-meta is-style-meta--12 wp-block-paragraph\">Patients who rated their reply good or great<\/p>\n<\/div>\n<\/div>\n\n\n\n<figure class=\"wp-block-pullquote\"><blockquote><p>Nobody keeps a list on a sticky note anymore. If a patient asked for something, it is in Hassium, and it has a name next to it.<\/p><cite>Priya Nair, operations manager, Brightwater Dental<\/cite><\/blockquote><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Brightwater is now setting up the same routing for insurance questions, starting with the two busiest clinics.<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button is-style-text is-style-text--13\"><a class=\"wp-block-button__link wp-element-button\" href=\"#\">Read more customer stories<\/a><\/div>\n<\/div>\n\n\n\n\n<p class=\"is-style-lead is-style-lead--14 wp-block-paragraph\">This guide connects Hassium to your own server with a webhook, so every new request is posted to an address you control. From there you can log it, alert on it, or copy it into another system. Plan on about fifteen minutes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" style=\"margin-top:var(--wp--preset--spacing--50);font-size:clamp(1.6rem, 1.1rem + 1.4vw, 2rem)\">What you need<\/h2>\n\n\n\n<ul class=\"wp-block-list is-style-check\">\n<li>An admin role in your Hassium workspace<\/li>\n\n\n\n<li>An HTTPS endpoint that accepts POST requests<\/li>\n\n\n\n<li>A safe place for a secret, such as an environment variable<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" style=\"margin-top:var(--wp--preset--spacing--50);font-size:clamp(1.6rem, 1.1rem + 1.4vw, 2rem)\">Set up the webhook<\/h2>\n\n\n\n<ol class=\"wp-block-list is-style-steps\">\n<li><strong>Open the webhook settings<\/strong> Go to Settings, then Integrations, and choose Add webhook.<\/li>\n\n\n\n<li><strong>Paste your endpoint<\/strong> Enter the HTTPS address that should receive requests. Plain HTTP addresses are rejected.<\/li>\n\n\n\n<li><strong>Pick the events<\/strong> Start with Request created. You can add replies and status changes later.<\/li>\n\n\n\n<li><strong>Copy the signing secret<\/strong> Hassium shows it once. Store it with your other credentials, never in your code.<\/li>\n\n\n\n<li><strong>Send a test event<\/strong> Choose Send test and check that your endpoint answers with a 200 status.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\" style=\"margin-top:var(--wp--preset--spacing--50);font-size:clamp(1.6rem, 1.1rem + 1.4vw, 2rem)\">Check the signature<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Every delivery carries a signature header. Compute your own from the raw body and your secret, and trust the request only when the two match. A minimal check looks like this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const expected = hmacSha256(secret, rawBody);\nconst received = request.headers['hassium-signature'];\n\nif (!timingSafeEqual(expected, received)) {\n  return respond(401);\n}\n\nreturn respond(200);<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" style=\"margin-top:var(--wp--preset--spacing--50);font-size:clamp(1.6rem, 1.1rem + 1.4vw, 2rem)\">Troubleshooting<\/h2>\n\n\n\n<div class=\"wp-block-group is-layout-flow wp-container-core-group-is-layout-2957bd8f wp-block-group-is-layout-flow\">\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\" open><summary>The test event times out<\/summary>\n<p class=\"wp-block-paragraph\">Hassium waits 10 seconds for an answer. Reply with a 200 status straight away and do the slow work afterward, in a queue or a background job.<\/p>\n<\/details>\n\n\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>The signatures never match<\/summary>\n<p class=\"wp-block-paragraph\">Compute the signature from the raw body, before anything parses it. Parsing and re-encoding the JSON changes the bytes, and the signature changes with them.<\/p>\n<\/details>\n\n\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>Every request arrives twice<\/summary>\n<p class=\"wp-block-paragraph\">Hassium retries a delivery when it gets no 200 status in time. Store the delivery ID from the header and skip any ID you have already handled.<\/p>\n<\/details>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\" style=\"margin-top:var(--wp--preset--spacing--50);font-size:clamp(1.6rem, 1.1rem + 1.4vw, 2rem)\">Next steps<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Once test events arrive, you can narrow down what gets sent or add more events:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"#\">Send only some requests by adding a workflow condition<\/a><\/li>\n\n\n\n<li><a href=\"#\">Add a second webhook for replies and status changes<\/a><\/li>\n\n\n\n<li><a href=\"#\">Read the webhook reference in the REST API docs<\/a><\/li>\n<\/ul>\n\n\n\n","protected":false},"excerpt":{"rendered":"<p>Post layouts Starting structures offered when you create a post: an article, release notes, a customer story, and a how-to guide.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":26,"menu_order":7,"comment_status":"closed","ping_status":"closed","template":"page-no-title","meta":{"footnotes":""},"class_list":["post-33","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/demo.gatilab.com\/hassium\/wp-json\/wp\/v2\/pages\/33","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demo.gatilab.com\/hassium\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/demo.gatilab.com\/hassium\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/demo.gatilab.com\/hassium\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demo.gatilab.com\/hassium\/wp-json\/wp\/v2\/comments?post=33"}],"version-history":[{"count":0,"href":"https:\/\/demo.gatilab.com\/hassium\/wp-json\/wp\/v2\/pages\/33\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/demo.gatilab.com\/hassium\/wp-json\/wp\/v2\/pages\/26"}],"wp:attachment":[{"href":"https:\/\/demo.gatilab.com\/hassium\/wp-json\/wp\/v2\/media?parent=33"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}