230 lines
256 KiB
HTML
230 lines
256 KiB
HTML
<!DOCTYPE html><html lang="en"> <head> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link href="https://fonts.googleapis.com/css2?family=Neuton:wght@300;400;700&family=Open+Sans:wght@300..800&display=swap" rel="stylesheet"> <script data-container-id="GTM-W7DPCL97">
|
||
function initializeGtm(gtmTagId) {
|
||
const searchParams = new URLSearchParams(window.location.search);
|
||
if (searchParams.get('gtmoff') === 'true') {
|
||
console.log('GTM is disabled from the url');
|
||
return;
|
||
}
|
||
|
||
const layerName = 'dataLayer';
|
||
window[layerName] = window[layerName] || [];
|
||
window[layerName].push({ 'gtm.start': new Date().getTime(), event: 'gtm.js' });
|
||
const firstScript = document.getElementsByTagName('script')[0];
|
||
const newScript = document.createElement('script');
|
||
newScript.async = true;
|
||
newScript.src = `https://www.googletagmanager.com/gtm.js?id=${gtmTagId}`;
|
||
firstScript?.parentNode?.insertBefore(newScript, firstScript);
|
||
}
|
||
|
||
const { containerId } = document.currentScript.dataset;
|
||
initializeGtm(containerId);
|
||
</script> <meta charset="UTF-8"><meta name="viewport" content="width=device-width"><link rel="icon" href="https://cdn.buttercms.com/E9s0C9vETriyFGeiPn77"><title>Load Testing Round Up: 8 tools you can use to strengthen your stack | ButterCMS</title><meta name="description" content="We’ve evaluated the pros and cons of several free and paid load testing software suites so you can evaluate what best fits your needs."><link rel="canonical" href="https://buttercms.com/blog/load-testing-round-up-8-tools-you-can-use-to-strengthen-your-stack/"><meta property="og:type" content="article"><meta property="og:title" content="Load Testing Round-Up: 8 Tools to Strengthen Your Stack"><meta property="og:description" content="We’ve evaluated the pros and cons of several free and paid load testing software suites so you can evaluate what best fits your needs."><meta property="og:image" content="https://cdn.buttercms.com/9t3YosTS9MkI4Rh88Og3"><meta property="og:url" content="https://buttercms.com/blog/load-testing-round-up-8-tools-you-can-use-to-strengthen-your-stack/"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="Load Testing Round-Up: 8 Tools to Strengthen Your Stack"><meta name="twitter:description" content="We’ve evaluated the pros and cons of several free and paid load testing software suites so you can evaluate what best fits your needs."><meta name="twitter:image" content="https://cdn.buttercms.com/9t3YosTS9MkI4Rh88Og3"><meta name="twitter:url" content="https://buttercms.com/blog/load-testing-round-up-8-tools-you-can-use-to-strengthen-your-stack/"><meta name="generator" content="Astro v6.3.1"><link rel="stylesheet" href="/_astro/_blog_.DF6aHyML.css">
|
||
<link rel="stylesheet" href="/_astro/config.mWTikB7y.css">
|
||
<link rel="stylesheet" href="/_astro/TBVirtualBlock.C_zr52JH.css">
|
||
<link rel="stylesheet" href="/_astro/TFeatureComparisonTable.CUCd3FYS.css"></head> <body class="dx"> <noscript> <iframe src="https://www.googletagmanager.com/ns.html?id=GTM-W7DPCL97" height="0" width="0" style="display:none;visibility:hidden"></iframe> </noscript> <style>astro-island,astro-slot,astro-static-slot{display:contents}</style><script>(()=>{var e=async t=>{await(await t())()};(self.Astro||(self.Astro={})).only=e;window.dispatchEvent(new Event("astro:only"));})();</script><script>(()=>{var g=Object.defineProperty;var w=(c,s,d)=>s in c?g(c,s,{enumerable:!0,configurable:!0,writable:!0,value:d}):c[s]=d;var l=(c,s,d)=>w(c,typeof s!="symbol"?s+"":s,d);var E=new Set(["__proto__","constructor","prototype"]);{let c={0:t=>y(t),1:t=>d(t),2:t=>new RegExp(t),3:t=>new Date(t),4:t=>new Map(d(t)),5:t=>new Set(d(t)),6:t=>BigInt(t),7:t=>new URL(t),8:t=>new Uint8Array(t),9:t=>new Uint16Array(t),10:t=>new Uint32Array(t),11:t=>Number.POSITIVE_INFINITY*t},s=t=>{let[p,e]=t;return p in c?c[p](e):void 0},d=t=>t.map(s),y=t=>typeof t!="object"||t===null?t:Object.fromEntries(Object.entries(t).map(([p,e])=>[p,s(e)]));class f extends HTMLElement{constructor(){super(...arguments);l(this,"Component");l(this,"hydrator");l(this,"hydrate",async()=>{var b;if(!this.hydrator||!this.isConnected)return;let e=(b=this.parentElement)==null?void 0:b.closest("astro-island[ssr]");if(e){e.addEventListener("astro:hydrate",this.hydrate,{once:!0});return}let n=this.querySelectorAll("astro-slot"),r={},i=this.querySelectorAll("template[data-astro-template]");for(let o of i){let a=o.closest(this.tagName);a!=null&&a.isSameNode(this)&&(r[o.getAttribute("data-astro-template")||"default"]=o.innerHTML,o.remove())}for(let o of n){let a=o.closest(this.tagName);a!=null&&a.isSameNode(this)&&(r[o.getAttribute("name")||"default"]=o.innerHTML)}let u;try{u=this.hasAttribute("props")?y(JSON.parse(this.getAttribute("props"))):{}}catch(o){let a=this.getAttribute("component-url")||"<unknown>",v=this.getAttribute("component-export");throw v&&(a+=` (export ${v})`),console.error(`[hydrate] Error parsing props for component ${a}`,this.getAttribute("props"),o),o}let h;await this.hydrator(this)(this.Component,u,r,{client:this.getAttribute("client")}),this.removeAttribute("ssr"),this.dispatchEvent(new CustomEvent("astro:hydrate"))});l(this,"unmount",()=>{this.isConnected||this.dispatchEvent(new CustomEvent("astro:unmount"))})}disconnectedCallback(){document.removeEventListener("astro:after-swap",this.unmount),document.addEventListener("astro:after-swap",this.unmount,{once:!0})}connectedCallback(){if(!this.hasAttribute("await-children")||document.readyState==="interactive"||document.readyState==="complete")this.childrenConnectedCallback();else{let e=()=>{document.removeEventListener("DOMContentLoaded",e),n.disconnect(),this.childrenConnectedCallback()},n=new MutationObserver(()=>{var r;((r=this.lastChild)==null?void 0:r.nodeType)===Node.COMMENT_NODE&&this.lastChild.nodeValue==="astro:end"&&(this.lastChild.remove(),e())});n.observe(this,{childList:!0}),document.addEventListener("DOMContentLoaded",e)}}async childrenConnectedCallback(){let e=this.getAttribute("before-hydration-url");e&&await import(e),this.start()}getRetryImportUrl(e){let n=new URL(e,document.baseURI),r=`astro-retry=${Date.now()}`,i=n.hash.replace(/^#/,"");return n.hash=i?`${i}&${r}`:r,n.toString()}async importWithRetry(e){try{return await import(e)}catch(n){return await new Promise(r=>setTimeout(r,1e3)),import(this.getRetryImportUrl(e))}}handleHydrationError(e){let n=this.getAttribute("component-url"),r=new CustomEvent("astro:hydration-error",{cancelable:!0,bubbles:!0,composed:!0,detail:{error:e,componentUrl:n}});this.dispatchEvent(r)&&console.error(`[astro-island] Error hydrating ${n}`,e)}async start(){let e=JSON.parse(this.getAttribute("opts")),n=this.getAttribute("client");if(Astro[n]===void 0){window.addEventListener(`astro:${n}`,()=>this.start(),{once:!0});return}try{await Astro[n](async()=>{let r=this.getAttribute("renderer-url");try{let[i,{default:u}]=await Promise.all([this.importWithRetry(this.getAttribute("component-url")),r?this.importWithRetry(r):Promise.resolve({default:()=>()=>{}})]),h=this.getAttribute("component-export")||"default";if(h.includes(".")){this.Component=i;for(let m of h.split(".")){if(E.has(m)||!this.Component||typeof this.Component!="object"&&typeof this.Component!="function"||!Object.hasOwn(this.Component,m))throw new Error(`Invalid component export path: ${h}`);this.Component=this.Component[m]}}else{if(E.has(h))throw new Error(`Invalid component export path: ${h}`);this.Component=i[h]}return this.hydrator=u,this.hydrate}catch(i){return this.handleHydrationError(i),()=>{}}},e,this)}catch(r){this.handleHydrationError(r)}}attributeChangedCallback(){this.hydrate()}}l(f,"observedAttributes",["props"]),customElements.get("astro-island")||customElements.define("astro-island",f)}})();</script><astro-island uid="OPtkA" component-url="/_astro/FormsInit.BwWbNej1.js" component-export="default" renderer-url="/_astro/client.D_fF9-0X.js" props="{"requireCompanyEmail":[0,false],"formIds":[1,[[0,"cms-guide-signup"]]]}" ssr client="only" opts="{"name":"FormsInit","value":"vue"}"></astro-island> <div id="icm" data-id="bp1btbv7"></div> <script>
|
||
intercom: {
|
||
const intercomId = document.getElementById('icm').dataset.id;
|
||
if (!intercomId) break intercom;
|
||
|
||
if (!window.intercomSettings) {
|
||
window.intercomSettings = {
|
||
app_id: intercomId,
|
||
};
|
||
}
|
||
(function () {
|
||
var m = /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent);
|
||
var e;
|
||
if (m) {
|
||
e = ['onscroll', 'scroll'];
|
||
} else {
|
||
e = ['onload', 'load'];
|
||
}
|
||
var w = window;
|
||
var ic = w.Intercom;
|
||
if (typeof ic === 'function') {
|
||
ic('reattach_activator');
|
||
ic('update', intercomSettings);
|
||
} else {
|
||
var d = document;
|
||
var i = function () {
|
||
i.c(arguments);
|
||
};
|
||
i.q = [];
|
||
i.c = function (args) {
|
||
i.q.push(args);
|
||
};
|
||
w.Intercom = i;
|
||
function l(ev) {
|
||
var s = d.createElement('script');
|
||
s.type = 'text/javascript';
|
||
s.async = true;
|
||
s.src = 'https://widget.intercom.io/widget/{{INTERCOM_APP_KEY}}';
|
||
var x = d.getElementsByTagName('script')[0];
|
||
x.parentNode.insertBefore(s, x);
|
||
ev.currentTarget.removeEventListener(ev.type, l);
|
||
}
|
||
if (w.attachEvent) {
|
||
w.attachEvent(e[0], l);
|
||
} else {
|
||
w.addEventListener(e[1], l, false);
|
||
}
|
||
}
|
||
})();
|
||
}
|
||
</script> <div class="page" data-astro-cid-daz465cn> <script>(()=>{var a=(s,i,o)=>{let r=async()=>{await(await s())()},t=typeof i.value=="object"?i.value:void 0,c={rootMargin:t==null?void 0:t.rootMargin},n=new IntersectionObserver(e=>{for(let l of e)if(l.isIntersecting){n.disconnect(),r();break}},c);for(let e of o.children)n.observe(e)};(self.Astro||(self.Astro={})).visible=a;window.dispatchEvent(new Event("astro:visible"));})();</script><astro-island uid="28q6z" prefix="s6" component-url="/_astro/index.C3t1o5QC.js" component-export="TBBlock" renderer-url="/_astro/client.D_fF9-0X.js" props="{"block":[0,{"type":[0,"website_navigation"],"props":[0,{"sectionPalette":[0,"palette-navigation"],"logo":[0,{"src":[0,"https://cdn.buttercms.com/nDD3LeMXQxiR9aJRpRLE"],"alt":[0,"ButterCMS Logo"],"width":[0,{"base":[0,"140px"],"md":[0,"163px"],"lg":[0,"163px"],"xl":[0,"163px"]}],"height":[0,{"base":[0,"24px"],"md":[0,"28px"]}]}],"menuItems":[1,[[0,{"label":[0,"Product"],"items":[1,[[0,{"label":[0,"Overview"],"items":[1,[[0,{"label":[0,"Headless CMS"],"href":[0,"/headless-cms/"],"iconGroup":[0,"tt"],"icon":[0,"butter"],"iconSize":[0,"lg"]}],[0,{"label":[0,"Features"],"href":[0,"/features/"],"iconGroup":[0,"tt"],"icon":[0,"butter"],"iconSize":[0,"lg"]}],[0,{"label":[0,"Integrations"],"href":[0,"/marketplace/"],"iconGroup":[0,"tt"],"icon":[0,"butter"],"iconSize":[0,"lg"]}],[0,{"label":[0,"API"],"href":[0,"/docs/api/"],"iconGroup":[0,"tt"],"icon":[0,"butter"],"iconSize":[0,"lg"]}]]]}],[0,{"label":[0,"Capabilities"],"columnItemsMax":[0,4],"items":[1,[[0,{"label":[0,"Content Modeling & Creation"],"href":[0,""],"description":[0,"Structure content once, reuse it everywhere"]}],[0,{"label":[0,"Developer Tools & Integration"],"href":[0,""],"description":[0,"Plug into your stack quickly with APIs, SDKs, and webhooks"]}],[0,{"label":[0,"Workflow & Collaboration"],"href":[0,""],"description":[0,"Streamline publishing with user roles and approval flows"]}],[0,{"label":[0,"Multisite & Multi-language"],"href":[0,""],"description":[0,"Manage multiple brands, regions, and languages from one CMS"]}],[0,{"label":[0,"SEO & Performance"],"href":[0,""],"description":[0,"Drive search traffic with built-in SEO and fast-loading HTML"]}],[0,{"label":[0,"Media & Asset Management"],"href":[0,""],"description":[0,"Centralize media management and streamline delivery across digital touchpoints"]}],[0,{"label":[0,"AI & Automation"],"href":[0,""],"description":[0,"Speed up content creation with smart AI blocks and suggestions"]}],[0,{"label":[0,"Security & Governance"],"href":[0,""],"description":[0,"Reduce risk with CDN, APIs, version history, and access controls"]}]]],"lastItem":[0,{"label":[0,"Explore all features & capabilities"],"href":[0,"/capabilities/"],"rightIconGroup":[0,"text"],"rightIcon":[0,"→"]}]}]]]}],[0,{"label":[0,"Solutions"],"items":[1,[[0,{"label":[0,"Use Cases"],"items":[1,[[0,{"label":[0,"Ecommerce"],"href":[0,"/solutions/ecommerce/"]}],[0,{"label":[0,"Mobile Apps"],"href":[0,"/solutions/mobile-apps/"]}],[0,{"label":[0,"Websites"],"href":[0,"/solutions/websites/"]}]]],"lastItem":[0,{"label":[0,"Explore all use cases"],"href":[0,"/solutions/"],"rightIconGroup":[0,"text"],"rightIcon":[0,"→"]}]}],[0,{"label":[0,"Audiences"],"items":[1,[[0,{"label":[0,"Developers"],"href":[0,"/solutions/for-developers/"]}],[0,{"label":[0,"Marketers"],"href":[0,"/solutions/for-marketers/"]}]]]}]]]}],[0,{"label":[0,"Developers"],"items":[1,[[0,{"items":[1,[[0,{"label":[0,"Developer Hub"],"href":[0,"/developers-hub/"]}],[0,{"label":[0,"Quickstart Guides"],"href":[0,"/docs/api-client/other/#Quickstart"]}],[0,{"label":[0,"Starter Projects"],"href":[0,"/starters/"]}],[0,{"label":[0,"Developer Docs"],"href":[0,"/docs/"]}],[0,{"label":[0,"API Documentation"],"href":[0,"/docs/api/"]}]]]}],[0,{"label":[0,"Frameworks"],"items":[1,[[0,{"label":[0,"Angular"],"href":[0,"/docs/api-client/angular/"]}],[0,{"label":[0,"Django"],"href":[0,"/docs/api-client/django/"]}],[0,{"label":[0,"Laravel"],"href":[0,"/docs/api-client/laravel/"]}],[0,{"label":[0,"Next.js"],"href":[0,"/docs/api-client/nextjs/"]}],[0,{"label":[0,"React"],"href":[0,"/docs/api-client/react/"]}]]]}]]]}],[0,{"label":[0,"Partners"],"href":[0,"/partners/"]}],[0,{"label":[0,"Resources"],"items":[1,[[0,{"items":[1,[[0,{"label":[0,"Blog"],"href":[0,"/blog/"]}],[0,{"label":[0,"Podcast"],"href":[0,"/knowledge-base/category/podcasts/"]}],[0,{"label":[0,"Knowledge Base"],"href":[0,"/knowledge-base/"]}]]]}]]]}],[0,{"label":[0,"Pricing"],"href":[0,"/pricing/"]}]]],"desktopMenuCentered":[0,true],"topActions":[1,[[0,{"text":[0,"Login"],"href":[0,"/login/"],"style":[0,"link"],"variant":[0,"neutral"],"weight":[0,"regular"]}],[0,{"text":[0,"Contact Us"],"href":[0,"/sales/"],"style":[0,"link"],"variant":[0,"neutral"],"weight":[0,"regular"]}]]],"mainActions":[1,[[0,{"text":[0,"Request a Demo"],"href":[0,"/sales/"],"style":[0,"outline"],"variant":[0,"primary"],"size":[0,"sm"]}],[0,{"text":[0,"Start for Free"],"href":[0,"/join/"],"style":[0,"filled"],"variant":[0,"secondary"],"size":[0,"sm"]}]]],"submenuBorder":[0,true],"submenuSeparator":[0,true]}]}],"data-astro-cid-daz465cn":[0,true]}" ssr client="visible" opts="{"name":"TBBlock","value":{"rootMargin":"100px"}}" await-children><!--[--><header class="website-navigation-container" data-v-841170b4><div class="palette-navigation website-navigation section-container section-container--with-background" style="--section-background:var(--color-background);" data-v-841170b4 data-v-bc505aac><!--[--><div class="website-navigation--wide-layout" data-v-841170b4><div class="website-navigation__top-row website-navigation__top-row--wide-layout" data-v-841170b4><!--[--><a href="/login/" class="nav-button nav-button--padding palette-nav-menu-item palette-nav-menu-item-interactive palette-navigation-nav-menu-item palette-navigation-nav-menu-item-interactive nav-button-nav-menu-item" data-v-841170b4 data-v-7ec88356><!--[--><span class="" data-v-7ec88356>Login</span><!--[--><!----><!--]--><!--]--></a><a href="/sales/" class="nav-button nav-button--padding palette-nav-menu-item palette-nav-menu-item-interactive palette-navigation-nav-menu-item palette-navigation-nav-menu-item-interactive nav-button-nav-menu-item" data-v-841170b4 data-v-7ec88356><!--[--><span class="" data-v-7ec88356>Contact Us</span><!--[--><!----><!--]--><!--]--></a><!--]--></div><div class="website-navigation__main-row--wide-layout" data-v-841170b4><a href="/" data-v-841170b4><div class="image__container" style="--width-base:140px;--width-md:163px;--width-lg:163px;--width-xl:163px;--height-base:24px;--height-md:28px;--height-lg:28px;--height-xl:28px;" data-v-841170b4 data-v-1a15d540><img src="https://cdn.buttercms.com/nDD3LeMXQxiR9aJRpRLE" alt="ButterCMS Logo" loading="lazy" class="image image--fit-contain" data-v-1a15d540></div></a><nav class="desktop-nav desktop-nav--centered desktop-nav--separator" data-v-841170b4 data-v-3ce5ad9b><!--[--><div class="desktop-nav__menu-item-container" data-v-3ce5ad9b><div class="desktop-nav__submenu-container" data-v-3ce5ad9b><button class="nav-button palette-nav-menu-item palette-nav-menu-item-interactive palette-navigation-nav-menu-item palette-navigation-nav-menu-item-interactive nav-button-nav-menu-item desktop-nav__menu-item" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="" data-v-7ec88356>Product</span><!--[--><i class="pi pi-chevron-down desktop-nav__dropdown-icon" data-v-3ce5ad9b></i><!--]--><!--]--></button><div class="desktop-nav__submenu--border desktop-nav__submenu" data-v-3ce5ad9b><div class="desktop-nav__submenu-content" data-v-3ce5ad9b><!--[--><div class="desktop-nav__submenu-group" data-v-3ce5ad9b><p class="text text--size-md text--weight-bold text--no-margin desktop-nav__submenu-group-title" data-v-3ce5ad9b data-v-2e32ee71><!--[-->Overview<!--]--></p><div class="desktop-nav__submenu-group-columns" style="" data-v-3ce5ad9b><!--[--><div class="desktop-nav__submenu-column" style="width:320px;" data-v-3ce5ad9b><!--[--><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/headless-cms/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item nav-button--extended desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><div class="nav-button__extended-content" data-v-7ec88356><div class="nav-button__row nav-button__row--main" data-v-7ec88356><span class="nav-button__icon-slot" aria-hidden="true" data-v-7ec88356><span class="icon icon--icon-color nav-button__icon--lg" data-v-7ec88356 data-v-be81bbc2><i class="tt-icon tt-icon--butter" data-v-be81bbc2></i></span></span><span class="nav-button__label nav-button__label--bold" data-v-7ec88356>Headless CMS</span><!----></div><!----></div></a></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/features/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item nav-button--extended desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><div class="nav-button__extended-content" data-v-7ec88356><div class="nav-button__row nav-button__row--main" data-v-7ec88356><span class="nav-button__icon-slot" aria-hidden="true" data-v-7ec88356><span class="icon icon--icon-color nav-button__icon--lg" data-v-7ec88356 data-v-be81bbc2><i class="tt-icon tt-icon--butter" data-v-be81bbc2></i></span></span><span class="nav-button__label nav-button__label--bold" data-v-7ec88356>Features</span><!----></div><!----></div></a></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/marketplace/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item nav-button--extended desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><div class="nav-button__extended-content" data-v-7ec88356><div class="nav-button__row nav-button__row--main" data-v-7ec88356><span class="nav-button__icon-slot" aria-hidden="true" data-v-7ec88356><span class="icon icon--icon-color nav-button__icon--lg" data-v-7ec88356 data-v-be81bbc2><i class="tt-icon tt-icon--butter" data-v-be81bbc2></i></span></span><span class="nav-button__label nav-button__label--bold" data-v-7ec88356>Integrations</span><!----></div><!----></div></a></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/docs/api/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item nav-button--extended desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><div class="nav-button__extended-content" data-v-7ec88356><div class="nav-button__row nav-button__row--main" data-v-7ec88356><span class="nav-button__icon-slot" aria-hidden="true" data-v-7ec88356><span class="icon icon--icon-color nav-button__icon--lg" data-v-7ec88356 data-v-be81bbc2><i class="tt-icon tt-icon--butter" data-v-be81bbc2></i></span></span><span class="nav-button__label nav-button__label--bold" data-v-7ec88356>API</span><!----></div><!----></div></a></div><!--]--></div><!--]--></div><!----></div><div class="desktop-nav__submenu-group" data-v-3ce5ad9b><p class="text text--size-md text--weight-bold text--no-margin desktop-nav__submenu-group-title" data-v-3ce5ad9b data-v-2e32ee71><!--[-->Capabilities<!--]--></p><div class="desktop-nav__submenu-group-columns" style="" data-v-3ce5ad9b><!--[--><div class="desktop-nav__submenu-column" style="width:400px;" data-v-3ce5ad9b><!--[--><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><button href class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item nav-button--extended desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><div class="nav-button__extended-content" data-v-7ec88356><div class="nav-button__row nav-button__row--main" data-v-7ec88356><!----><span class="nav-button__label nav-button__label--bold" data-v-7ec88356>Content Modeling & Creation</span><!----></div><div class="nav-button__row" data-v-7ec88356><!----><p class="nav-button__description" data-v-7ec88356>Structure content once, reuse it everywhere</p></div></div></button></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><button href class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item nav-button--extended desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><div class="nav-button__extended-content" data-v-7ec88356><div class="nav-button__row nav-button__row--main" data-v-7ec88356><!----><span class="nav-button__label nav-button__label--bold" data-v-7ec88356>Developer Tools & Integration</span><!----></div><div class="nav-button__row" data-v-7ec88356><!----><p class="nav-button__description" data-v-7ec88356>Plug into your stack quickly with APIs, SDKs, and webhooks</p></div></div></button></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><button href class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item nav-button--extended desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><div class="nav-button__extended-content" data-v-7ec88356><div class="nav-button__row nav-button__row--main" data-v-7ec88356><!----><span class="nav-button__label nav-button__label--bold" data-v-7ec88356>Workflow & Collaboration</span><!----></div><div class="nav-button__row" data-v-7ec88356><!----><p class="nav-button__description" data-v-7ec88356>Streamline publishing with user roles and approval flows</p></div></div></button></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><button href class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item nav-button--extended desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><div class="nav-button__extended-content" data-v-7ec88356><div class="nav-button__row nav-button__row--main" data-v-7ec88356><!----><span class="nav-button__label nav-button__label--bold" data-v-7ec88356>Multisite & Multi-language</span><!----></div><div class="nav-button__row" data-v-7ec88356><!----><p class="nav-button__description" data-v-7ec88356>Manage multiple brands, regions, and languages from one CMS</p></div></div></button></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><button href class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item nav-button--extended desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><div class="nav-button__extended-content" data-v-7ec88356><div class="nav-button__row nav-button__row--main" data-v-7ec88356><!----><span class="nav-button__label nav-button__label--bold" data-v-7ec88356>SEO & Performance</span><!----></div><div class="nav-button__row" data-v-7ec88356><!----><p class="nav-button__description" data-v-7ec88356>Drive search traffic with built-in SEO and fast-loading HTML</p></div></div></button></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><button href class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item nav-button--extended desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><div class="nav-button__extended-content" data-v-7ec88356><div class="nav-button__row nav-button__row--main" data-v-7ec88356><!----><span class="nav-button__label nav-button__label--bold" data-v-7ec88356>Media & Asset Management</span><!----></div><div class="nav-button__row" data-v-7ec88356><!----><p class="nav-button__description" data-v-7ec88356>Centralize media management and streamline delivery across digital touchpoints</p></div></div></button></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><button href class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item nav-button--extended desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><div class="nav-button__extended-content" data-v-7ec88356><div class="nav-button__row nav-button__row--main" data-v-7ec88356><!----><span class="nav-button__label nav-button__label--bold" data-v-7ec88356>AI & Automation</span><!----></div><div class="nav-button__row" data-v-7ec88356><!----><p class="nav-button__description" data-v-7ec88356>Speed up content creation with smart AI blocks and suggestions</p></div></div></button></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><button href class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item nav-button--extended desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><div class="nav-button__extended-content" data-v-7ec88356><div class="nav-button__row nav-button__row--main" data-v-7ec88356><!----><span class="nav-button__label nav-button__label--bold" data-v-7ec88356>Security & Governance</span><!----></div><div class="nav-button__row" data-v-7ec88356><!----><p class="nav-button__description" data-v-7ec88356>Reduce risk with CDN, APIs, version history, and access controls</p></div></div></button></div><!--]--></div><!--]--></div><div class="desktop-nav__submenu-last-item" style="width:400px;" data-v-3ce5ad9b><a href="/capabilities/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item nav-button--extended" data-v-3ce5ad9b data-v-7ec88356><div class="nav-button__extended-content" data-v-7ec88356><div class="nav-button__row nav-button__row--main" data-v-7ec88356><!----><span class="nav-button__label nav-button__label--bold" data-v-7ec88356>Explore all features & capabilities</span><div class="nav-button__right-icon" data-v-7ec88356><span data-v-7ec88356>→</span></div></div><!----></div></a></div></div><!--]--></div><!----></div></div></div><div class="desktop-nav__menu-item-container--with-margin desktop-nav__menu-item-container" data-v-3ce5ad9b><div class="desktop-nav__submenu-container" data-v-3ce5ad9b><button class="nav-button palette-nav-menu-item palette-nav-menu-item-interactive palette-navigation-nav-menu-item palette-navigation-nav-menu-item-interactive nav-button-nav-menu-item desktop-nav__menu-item" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="" data-v-7ec88356>Solutions</span><!--[--><i class="pi pi-chevron-down desktop-nav__dropdown-icon" data-v-3ce5ad9b></i><!--]--><!--]--></button><div class="desktop-nav__submenu--border desktop-nav__submenu" data-v-3ce5ad9b><div class="desktop-nav__submenu-content" data-v-3ce5ad9b><!--[--><div class="desktop-nav__submenu-group" data-v-3ce5ad9b><p class="text text--size-md text--weight-bold text--no-margin desktop-nav__submenu-group-title" data-v-3ce5ad9b data-v-2e32ee71><!--[-->Use Cases<!--]--></p><div class="desktop-nav__submenu-group-columns" style="" data-v-3ce5ad9b><!--[--><div class="desktop-nav__submenu-column" style="width:320px;" data-v-3ce5ad9b><!--[--><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/solutions/ecommerce/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Ecommerce</span><!--[--><!----><!--]--><!--]--></a></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/solutions/mobile-apps/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Mobile Apps</span><!--[--><!----><!--]--><!--]--></a></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/solutions/websites/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Websites</span><!--[--><!----><!--]--><!--]--></a></div><!--]--></div><!--]--></div><div class="desktop-nav__submenu-last-item" style="width:320px;" data-v-3ce5ad9b><a href="/solutions/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item nav-button--extended" data-v-3ce5ad9b data-v-7ec88356><div class="nav-button__extended-content" data-v-7ec88356><div class="nav-button__row nav-button__row--main" data-v-7ec88356><!----><span class="nav-button__label nav-button__label--bold" data-v-7ec88356>Explore all use cases</span><div class="nav-button__right-icon" data-v-7ec88356><span data-v-7ec88356>→</span></div></div><!----></div></a></div></div><div class="desktop-nav__submenu-group" data-v-3ce5ad9b><p class="text text--size-md text--weight-bold text--no-margin desktop-nav__submenu-group-title" data-v-3ce5ad9b data-v-2e32ee71><!--[-->Audiences<!--]--></p><div class="desktop-nav__submenu-group-columns" style="" data-v-3ce5ad9b><!--[--><div class="desktop-nav__submenu-column" style="width:320px;" data-v-3ce5ad9b><!--[--><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/solutions/for-developers/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Developers</span><!--[--><!----><!--]--><!--]--></a></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/solutions/for-marketers/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Marketers</span><!--[--><!----><!--]--><!--]--></a></div><!--]--></div><!--]--></div><!----></div><!--]--></div><!----></div></div></div><div class="desktop-nav__menu-item-container--with-margin desktop-nav__menu-item-container" data-v-3ce5ad9b><div class="desktop-nav__submenu-container" data-v-3ce5ad9b><button class="nav-button palette-nav-menu-item palette-nav-menu-item-interactive palette-navigation-nav-menu-item palette-navigation-nav-menu-item-interactive nav-button-nav-menu-item desktop-nav__menu-item" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="" data-v-7ec88356>Developers</span><!--[--><i class="pi pi-chevron-down desktop-nav__dropdown-icon" data-v-3ce5ad9b></i><!--]--><!--]--></button><div class="desktop-nav__submenu--border desktop-nav__submenu" data-v-3ce5ad9b><div class="desktop-nav__submenu-content" data-v-3ce5ad9b><!--[--><div class="desktop-nav__submenu-group" data-v-3ce5ad9b><!----><div class="desktop-nav__submenu-group-columns" style="" data-v-3ce5ad9b><!--[--><div class="desktop-nav__submenu-column" style="width:320px;" data-v-3ce5ad9b><!--[--><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/developers-hub/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Developer Hub</span><!--[--><!----><!--]--><!--]--></a></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/docs/api-client/other/#Quickstart" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Quickstart Guides</span><!--[--><!----><!--]--><!--]--></a></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/starters/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Starter Projects</span><!--[--><!----><!--]--><!--]--></a></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/docs/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Developer Docs</span><!--[--><!----><!--]--><!--]--></a></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/docs/api/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>API Documentation</span><!--[--><!----><!--]--><!--]--></a></div><!--]--></div><!--]--></div><!----></div><div class="desktop-nav__submenu-group" data-v-3ce5ad9b><p class="text text--size-md text--weight-bold text--no-margin desktop-nav__submenu-group-title" data-v-3ce5ad9b data-v-2e32ee71><!--[-->Frameworks<!--]--></p><div class="desktop-nav__submenu-group-columns" style="" data-v-3ce5ad9b><!--[--><div class="desktop-nav__submenu-column" style="width:320px;" data-v-3ce5ad9b><!--[--><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/docs/api-client/angular/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Angular</span><!--[--><!----><!--]--><!--]--></a></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/docs/api-client/django/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Django</span><!--[--><!----><!--]--><!--]--></a></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/docs/api-client/laravel/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Laravel</span><!--[--><!----><!--]--><!--]--></a></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/docs/api-client/nextjs/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Next.js</span><!--[--><!----><!--]--><!--]--></a></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/docs/api-client/react/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>React</span><!--[--><!----><!--]--><!--]--></a></div><!--]--></div><!--]--></div><!----></div><!--]--></div><!----></div></div></div><div class="desktop-nav__menu-item-container--with-margin desktop-nav__menu-item-container" data-v-3ce5ad9b><a href="/partners/" class="nav-button palette-nav-menu-item palette-nav-menu-item-interactive palette-navigation-nav-menu-item palette-navigation-nav-menu-item-interactive nav-button-nav-menu-item desktop-nav__menu-item" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="" data-v-7ec88356>Partners</span><!--[--><!----><!--]--><!--]--></a></div><div class="desktop-nav__menu-item-container--with-margin desktop-nav__menu-item-container" data-v-3ce5ad9b><div class="desktop-nav__submenu-container" data-v-3ce5ad9b><button class="nav-button palette-nav-menu-item palette-nav-menu-item-interactive palette-navigation-nav-menu-item palette-navigation-nav-menu-item-interactive nav-button-nav-menu-item desktop-nav__menu-item" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="" data-v-7ec88356>Resources</span><!--[--><i class="pi pi-chevron-down desktop-nav__dropdown-icon" data-v-3ce5ad9b></i><!--]--><!--]--></button><div class="desktop-nav__submenu--border desktop-nav__submenu" data-v-3ce5ad9b><div class="desktop-nav__submenu-content" data-v-3ce5ad9b><!--[--><div class="desktop-nav__submenu-group" data-v-3ce5ad9b><!----><div class="desktop-nav__submenu-group-columns" style="" data-v-3ce5ad9b><!--[--><div class="desktop-nav__submenu-column" style="width:320px;" data-v-3ce5ad9b><!--[--><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/blog/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Blog</span><!--[--><!----><!--]--><!--]--></a></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/knowledge-base/category/podcasts/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Podcast</span><!--[--><!----><!--]--><!--]--></a></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/knowledge-base/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Knowledge Base</span><!--[--><!----><!--]--><!--]--></a></div><!--]--></div><!--]--></div><!----></div><!--]--></div><!----></div></div></div><div class="desktop-nav__menu-item-container--with-margin desktop-nav__menu-item-container" data-v-3ce5ad9b><a href="/pricing/" class="nav-button palette-nav-menu-item palette-nav-menu-item-interactive palette-navigation-nav-menu-item palette-navigation-nav-menu-item-interactive nav-button-nav-menu-item desktop-nav__menu-item" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="" data-v-7ec88356>Pricing</span><!--[--><!----><!--]--><!--]--></a></div><!--]--></nav><div class="website-navigation__main-actions--wide-layout" data-v-841170b4><!--[--><a class="button palette-primary-outline palette-primary-outline-interactive" style="" href="/sales/" data-v-841170b4 data-v-063ae83e><div class="button__content button__content--sm" data-v-063ae83e><!----><!--[--><div class="button__text" data-v-063ae83e>Request a Demo</div><!--]--><!----></div><!----></a><a class="button palette-secondary-filled palette-secondary-filled-interactive" style="" href="/join/" data-v-841170b4 data-v-063ae83e><div class="button__content button__content--sm" data-v-063ae83e><!----><!--[--><div class="button__text" data-v-063ae83e>Start for Free</div><!--]--><!----></div><!----></a><!--]--></div><button class="button button--link palette-neutral-link palette-neutral-link-interactive website-navigation__mobile-menu-button" style="" type="button" data-v-841170b4 data-v-063ae83e><div class="button__content button__content--md" data-v-063ae83e><span class="" data-v-063ae83e><!--[--><span class="icon icon--icon-color button__icon" data-v-063ae83e data-v-be81bbc2><i class="pi pi-bars" data-v-be81bbc2></i></span><!--]--></span><!--[--><div class="button__text" data-v-063ae83e></div><!--]--><!----></div><!----></button></div></div><div class="website-navigation__compact-layout" data-v-841170b4><div class="website-navigation__top-row website-navigation__top-row--compact-layout" data-v-841170b4><a href="/" data-v-841170b4><div class="image__container" style="--width-base:140px;--width-md:163px;--width-lg:163px;--width-xl:163px;--height-base:24px;--height-md:28px;--height-lg:28px;--height-xl:28px;" data-v-841170b4 data-v-1a15d540><img src="https://cdn.buttercms.com/nDD3LeMXQxiR9aJRpRLE" alt="ButterCMS Logo" loading="lazy" class="image image--fit-contain" data-v-1a15d540></div></a><div class="website-navigation__actions--compact-layout" data-v-841170b4><div class="website-navigation__top-actions--compact-layout" data-v-841170b4><!--[--><a href="/login/" class="nav-button nav-button--padding palette-nav-menu-item palette-nav-menu-item-interactive palette-navigation-nav-menu-item palette-navigation-nav-menu-item-interactive nav-button-nav-menu-item" data-v-841170b4 data-v-7ec88356><!--[--><span class="" data-v-7ec88356>Login</span><!--[--><!----><!--]--><!--]--></a><a href="/sales/" class="nav-button nav-button--padding palette-nav-menu-item palette-nav-menu-item-interactive palette-navigation-nav-menu-item palette-navigation-nav-menu-item-interactive nav-button-nav-menu-item" data-v-841170b4 data-v-7ec88356><!--[--><span class="" data-v-7ec88356>Contact Us</span><!--[--><!----><!--]--><!--]--></a><!--]--></div><div class="website-navigation__main-actions--compact-layout" data-v-841170b4><!--[--><a class="button palette-primary-outline palette-primary-outline-interactive" style="" href="/sales/" data-v-841170b4 data-v-063ae83e><div class="button__content button__content--sm" data-v-063ae83e><!----><!--[--><div class="button__text" data-v-063ae83e>Request a Demo</div><!--]--><!----></div><!----></a><a class="button palette-secondary-filled palette-secondary-filled-interactive" style="" href="/join/" data-v-841170b4 data-v-063ae83e><div class="button__content button__content--sm" data-v-063ae83e><!----><!--[--><div class="button__text" data-v-063ae83e>Start for Free</div><!--]--><!----></div><!----></a><!--]--></div><button class="button button--link palette-neutral-link palette-neutral-link-interactive website-navigation__mobile-menu-button" style="" type="button" data-v-841170b4 data-v-063ae83e><div class="button__content button__content--md" data-v-063ae83e><span class="" data-v-063ae83e><!--[--><span class="icon icon--icon-color button__icon" data-v-063ae83e data-v-be81bbc2><i class="pi pi-bars" data-v-be81bbc2></i></span><!--]--></span><!--[--><div class="button__text" data-v-063ae83e></div><!--]--><!----></div><!----></button></div></div><nav class="desktop-nav desktop-nav--centered desktop-nav--separator" data-v-841170b4 data-v-3ce5ad9b><!--[--><div class="desktop-nav__menu-item-container" data-v-3ce5ad9b><div class="desktop-nav__submenu-container" data-v-3ce5ad9b><button class="nav-button palette-nav-menu-item palette-nav-menu-item-interactive palette-navigation-nav-menu-item palette-navigation-nav-menu-item-interactive nav-button-nav-menu-item desktop-nav__menu-item" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="" data-v-7ec88356>Product</span><!--[--><i class="pi pi-chevron-down desktop-nav__dropdown-icon" data-v-3ce5ad9b></i><!--]--><!--]--></button><div class="desktop-nav__submenu--border desktop-nav__submenu" data-v-3ce5ad9b><div class="desktop-nav__submenu-content" data-v-3ce5ad9b><!--[--><div class="desktop-nav__submenu-group" data-v-3ce5ad9b><p class="text text--size-md text--weight-bold text--no-margin desktop-nav__submenu-group-title" data-v-3ce5ad9b data-v-2e32ee71><!--[-->Overview<!--]--></p><div class="desktop-nav__submenu-group-columns" style="" data-v-3ce5ad9b><!--[--><div class="desktop-nav__submenu-column" style="width:320px;" data-v-3ce5ad9b><!--[--><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/headless-cms/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item nav-button--extended desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><div class="nav-button__extended-content" data-v-7ec88356><div class="nav-button__row nav-button__row--main" data-v-7ec88356><span class="nav-button__icon-slot" aria-hidden="true" data-v-7ec88356><span class="icon icon--icon-color nav-button__icon--lg" data-v-7ec88356 data-v-be81bbc2><i class="tt-icon tt-icon--butter" data-v-be81bbc2></i></span></span><span class="nav-button__label nav-button__label--bold" data-v-7ec88356>Headless CMS</span><!----></div><!----></div></a></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/features/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item nav-button--extended desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><div class="nav-button__extended-content" data-v-7ec88356><div class="nav-button__row nav-button__row--main" data-v-7ec88356><span class="nav-button__icon-slot" aria-hidden="true" data-v-7ec88356><span class="icon icon--icon-color nav-button__icon--lg" data-v-7ec88356 data-v-be81bbc2><i class="tt-icon tt-icon--butter" data-v-be81bbc2></i></span></span><span class="nav-button__label nav-button__label--bold" data-v-7ec88356>Features</span><!----></div><!----></div></a></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/marketplace/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item nav-button--extended desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><div class="nav-button__extended-content" data-v-7ec88356><div class="nav-button__row nav-button__row--main" data-v-7ec88356><span class="nav-button__icon-slot" aria-hidden="true" data-v-7ec88356><span class="icon icon--icon-color nav-button__icon--lg" data-v-7ec88356 data-v-be81bbc2><i class="tt-icon tt-icon--butter" data-v-be81bbc2></i></span></span><span class="nav-button__label nav-button__label--bold" data-v-7ec88356>Integrations</span><!----></div><!----></div></a></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/docs/api/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item nav-button--extended desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><div class="nav-button__extended-content" data-v-7ec88356><div class="nav-button__row nav-button__row--main" data-v-7ec88356><span class="nav-button__icon-slot" aria-hidden="true" data-v-7ec88356><span class="icon icon--icon-color nav-button__icon--lg" data-v-7ec88356 data-v-be81bbc2><i class="tt-icon tt-icon--butter" data-v-be81bbc2></i></span></span><span class="nav-button__label nav-button__label--bold" data-v-7ec88356>API</span><!----></div><!----></div></a></div><!--]--></div><!--]--></div><!----></div><div class="desktop-nav__submenu-group" data-v-3ce5ad9b><p class="text text--size-md text--weight-bold text--no-margin desktop-nav__submenu-group-title" data-v-3ce5ad9b data-v-2e32ee71><!--[-->Capabilities<!--]--></p><div class="desktop-nav__submenu-group-columns" style="" data-v-3ce5ad9b><!--[--><div class="desktop-nav__submenu-column" style="width:400px;" data-v-3ce5ad9b><!--[--><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><button href class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item nav-button--extended desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><div class="nav-button__extended-content" data-v-7ec88356><div class="nav-button__row nav-button__row--main" data-v-7ec88356><!----><span class="nav-button__label nav-button__label--bold" data-v-7ec88356>Content Modeling & Creation</span><!----></div><div class="nav-button__row" data-v-7ec88356><!----><p class="nav-button__description" data-v-7ec88356>Structure content once, reuse it everywhere</p></div></div></button></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><button href class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item nav-button--extended desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><div class="nav-button__extended-content" data-v-7ec88356><div class="nav-button__row nav-button__row--main" data-v-7ec88356><!----><span class="nav-button__label nav-button__label--bold" data-v-7ec88356>Developer Tools & Integration</span><!----></div><div class="nav-button__row" data-v-7ec88356><!----><p class="nav-button__description" data-v-7ec88356>Plug into your stack quickly with APIs, SDKs, and webhooks</p></div></div></button></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><button href class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item nav-button--extended desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><div class="nav-button__extended-content" data-v-7ec88356><div class="nav-button__row nav-button__row--main" data-v-7ec88356><!----><span class="nav-button__label nav-button__label--bold" data-v-7ec88356>Workflow & Collaboration</span><!----></div><div class="nav-button__row" data-v-7ec88356><!----><p class="nav-button__description" data-v-7ec88356>Streamline publishing with user roles and approval flows</p></div></div></button></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><button href class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item nav-button--extended desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><div class="nav-button__extended-content" data-v-7ec88356><div class="nav-button__row nav-button__row--main" data-v-7ec88356><!----><span class="nav-button__label nav-button__label--bold" data-v-7ec88356>Multisite & Multi-language</span><!----></div><div class="nav-button__row" data-v-7ec88356><!----><p class="nav-button__description" data-v-7ec88356>Manage multiple brands, regions, and languages from one CMS</p></div></div></button></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><button href class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item nav-button--extended desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><div class="nav-button__extended-content" data-v-7ec88356><div class="nav-button__row nav-button__row--main" data-v-7ec88356><!----><span class="nav-button__label nav-button__label--bold" data-v-7ec88356>SEO & Performance</span><!----></div><div class="nav-button__row" data-v-7ec88356><!----><p class="nav-button__description" data-v-7ec88356>Drive search traffic with built-in SEO and fast-loading HTML</p></div></div></button></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><button href class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item nav-button--extended desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><div class="nav-button__extended-content" data-v-7ec88356><div class="nav-button__row nav-button__row--main" data-v-7ec88356><!----><span class="nav-button__label nav-button__label--bold" data-v-7ec88356>Media & Asset Management</span><!----></div><div class="nav-button__row" data-v-7ec88356><!----><p class="nav-button__description" data-v-7ec88356>Centralize media management and streamline delivery across digital touchpoints</p></div></div></button></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><button href class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item nav-button--extended desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><div class="nav-button__extended-content" data-v-7ec88356><div class="nav-button__row nav-button__row--main" data-v-7ec88356><!----><span class="nav-button__label nav-button__label--bold" data-v-7ec88356>AI & Automation</span><!----></div><div class="nav-button__row" data-v-7ec88356><!----><p class="nav-button__description" data-v-7ec88356>Speed up content creation with smart AI blocks and suggestions</p></div></div></button></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><button href class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item nav-button--extended desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><div class="nav-button__extended-content" data-v-7ec88356><div class="nav-button__row nav-button__row--main" data-v-7ec88356><!----><span class="nav-button__label nav-button__label--bold" data-v-7ec88356>Security & Governance</span><!----></div><div class="nav-button__row" data-v-7ec88356><!----><p class="nav-button__description" data-v-7ec88356>Reduce risk with CDN, APIs, version history, and access controls</p></div></div></button></div><!--]--></div><!--]--></div><div class="desktop-nav__submenu-last-item" style="width:400px;" data-v-3ce5ad9b><a href="/capabilities/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item nav-button--extended" data-v-3ce5ad9b data-v-7ec88356><div class="nav-button__extended-content" data-v-7ec88356><div class="nav-button__row nav-button__row--main" data-v-7ec88356><!----><span class="nav-button__label nav-button__label--bold" data-v-7ec88356>Explore all features & capabilities</span><div class="nav-button__right-icon" data-v-7ec88356><span data-v-7ec88356>→</span></div></div><!----></div></a></div></div><!--]--></div><!----></div></div></div><div class="desktop-nav__menu-item-container--with-margin desktop-nav__menu-item-container" data-v-3ce5ad9b><div class="desktop-nav__submenu-container" data-v-3ce5ad9b><button class="nav-button palette-nav-menu-item palette-nav-menu-item-interactive palette-navigation-nav-menu-item palette-navigation-nav-menu-item-interactive nav-button-nav-menu-item desktop-nav__menu-item" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="" data-v-7ec88356>Solutions</span><!--[--><i class="pi pi-chevron-down desktop-nav__dropdown-icon" data-v-3ce5ad9b></i><!--]--><!--]--></button><div class="desktop-nav__submenu--border desktop-nav__submenu" data-v-3ce5ad9b><div class="desktop-nav__submenu-content" data-v-3ce5ad9b><!--[--><div class="desktop-nav__submenu-group" data-v-3ce5ad9b><p class="text text--size-md text--weight-bold text--no-margin desktop-nav__submenu-group-title" data-v-3ce5ad9b data-v-2e32ee71><!--[-->Use Cases<!--]--></p><div class="desktop-nav__submenu-group-columns" style="" data-v-3ce5ad9b><!--[--><div class="desktop-nav__submenu-column" style="width:320px;" data-v-3ce5ad9b><!--[--><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/solutions/ecommerce/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Ecommerce</span><!--[--><!----><!--]--><!--]--></a></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/solutions/mobile-apps/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Mobile Apps</span><!--[--><!----><!--]--><!--]--></a></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/solutions/websites/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Websites</span><!--[--><!----><!--]--><!--]--></a></div><!--]--></div><!--]--></div><div class="desktop-nav__submenu-last-item" style="width:320px;" data-v-3ce5ad9b><a href="/solutions/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item nav-button--extended" data-v-3ce5ad9b data-v-7ec88356><div class="nav-button__extended-content" data-v-7ec88356><div class="nav-button__row nav-button__row--main" data-v-7ec88356><!----><span class="nav-button__label nav-button__label--bold" data-v-7ec88356>Explore all use cases</span><div class="nav-button__right-icon" data-v-7ec88356><span data-v-7ec88356>→</span></div></div><!----></div></a></div></div><div class="desktop-nav__submenu-group" data-v-3ce5ad9b><p class="text text--size-md text--weight-bold text--no-margin desktop-nav__submenu-group-title" data-v-3ce5ad9b data-v-2e32ee71><!--[-->Audiences<!--]--></p><div class="desktop-nav__submenu-group-columns" style="" data-v-3ce5ad9b><!--[--><div class="desktop-nav__submenu-column" style="width:320px;" data-v-3ce5ad9b><!--[--><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/solutions/for-developers/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Developers</span><!--[--><!----><!--]--><!--]--></a></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/solutions/for-marketers/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Marketers</span><!--[--><!----><!--]--><!--]--></a></div><!--]--></div><!--]--></div><!----></div><!--]--></div><!----></div></div></div><div class="desktop-nav__menu-item-container--with-margin desktop-nav__menu-item-container" data-v-3ce5ad9b><div class="desktop-nav__submenu-container" data-v-3ce5ad9b><button class="nav-button palette-nav-menu-item palette-nav-menu-item-interactive palette-navigation-nav-menu-item palette-navigation-nav-menu-item-interactive nav-button-nav-menu-item desktop-nav__menu-item" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="" data-v-7ec88356>Developers</span><!--[--><i class="pi pi-chevron-down desktop-nav__dropdown-icon" data-v-3ce5ad9b></i><!--]--><!--]--></button><div class="desktop-nav__submenu--border desktop-nav__submenu" data-v-3ce5ad9b><div class="desktop-nav__submenu-content" data-v-3ce5ad9b><!--[--><div class="desktop-nav__submenu-group" data-v-3ce5ad9b><!----><div class="desktop-nav__submenu-group-columns" style="" data-v-3ce5ad9b><!--[--><div class="desktop-nav__submenu-column" style="width:320px;" data-v-3ce5ad9b><!--[--><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/developers-hub/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Developer Hub</span><!--[--><!----><!--]--><!--]--></a></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/docs/api-client/other/#Quickstart" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Quickstart Guides</span><!--[--><!----><!--]--><!--]--></a></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/starters/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Starter Projects</span><!--[--><!----><!--]--><!--]--></a></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/docs/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Developer Docs</span><!--[--><!----><!--]--><!--]--></a></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/docs/api/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>API Documentation</span><!--[--><!----><!--]--><!--]--></a></div><!--]--></div><!--]--></div><!----></div><div class="desktop-nav__submenu-group" data-v-3ce5ad9b><p class="text text--size-md text--weight-bold text--no-margin desktop-nav__submenu-group-title" data-v-3ce5ad9b data-v-2e32ee71><!--[-->Frameworks<!--]--></p><div class="desktop-nav__submenu-group-columns" style="" data-v-3ce5ad9b><!--[--><div class="desktop-nav__submenu-column" style="width:320px;" data-v-3ce5ad9b><!--[--><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/docs/api-client/angular/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Angular</span><!--[--><!----><!--]--><!--]--></a></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/docs/api-client/django/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Django</span><!--[--><!----><!--]--><!--]--></a></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/docs/api-client/laravel/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Laravel</span><!--[--><!----><!--]--><!--]--></a></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/docs/api-client/nextjs/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Next.js</span><!--[--><!----><!--]--><!--]--></a></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/docs/api-client/react/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>React</span><!--[--><!----><!--]--><!--]--></a></div><!--]--></div><!--]--></div><!----></div><!--]--></div><!----></div></div></div><div class="desktop-nav__menu-item-container--with-margin desktop-nav__menu-item-container" data-v-3ce5ad9b><a href="/partners/" class="nav-button palette-nav-menu-item palette-nav-menu-item-interactive palette-navigation-nav-menu-item palette-navigation-nav-menu-item-interactive nav-button-nav-menu-item desktop-nav__menu-item" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="" data-v-7ec88356>Partners</span><!--[--><!----><!--]--><!--]--></a></div><div class="desktop-nav__menu-item-container--with-margin desktop-nav__menu-item-container" data-v-3ce5ad9b><div class="desktop-nav__submenu-container" data-v-3ce5ad9b><button class="nav-button palette-nav-menu-item palette-nav-menu-item-interactive palette-navigation-nav-menu-item palette-navigation-nav-menu-item-interactive nav-button-nav-menu-item desktop-nav__menu-item" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="" data-v-7ec88356>Resources</span><!--[--><i class="pi pi-chevron-down desktop-nav__dropdown-icon" data-v-3ce5ad9b></i><!--]--><!--]--></button><div class="desktop-nav__submenu--border desktop-nav__submenu" data-v-3ce5ad9b><div class="desktop-nav__submenu-content" data-v-3ce5ad9b><!--[--><div class="desktop-nav__submenu-group" data-v-3ce5ad9b><!----><div class="desktop-nav__submenu-group-columns" style="" data-v-3ce5ad9b><!--[--><div class="desktop-nav__submenu-column" style="width:320px;" data-v-3ce5ad9b><!--[--><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/blog/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Blog</span><!--[--><!----><!--]--><!--]--></a></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/knowledge-base/category/podcasts/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Podcast</span><!--[--><!----><!--]--><!--]--></a></div><div class="desktop-nav__submenu-item" data-v-3ce5ad9b><a href="/knowledge-base/" class="nav-button nav-button--padding palette-nav-submenu-item palette-nav-submenu-item-interactive palette-navigation-nav-submenu-item palette-navigation-nav-submenu-item-interactive nav-button-nav-submenu-item desktop-nav__submenu-item-link" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Knowledge Base</span><!--[--><!----><!--]--><!--]--></a></div><!--]--></div><!--]--></div><!----></div><!--]--></div><!----></div></div></div><div class="desktop-nav__menu-item-container--with-margin desktop-nav__menu-item-container" data-v-3ce5ad9b><a href="/pricing/" class="nav-button palette-nav-menu-item palette-nav-menu-item-interactive palette-navigation-nav-menu-item palette-navigation-nav-menu-item-interactive nav-button-nav-menu-item desktop-nav__menu-item" data-v-3ce5ad9b data-v-7ec88356><!--[--><span class="" data-v-7ec88356>Pricing</span><!--[--><!----><!--]--><!--]--></a></div><!--]--></nav></div><!----><!--]--></div></header><!----><!--]--><!--astro:end--></astro-island> <main class="page__main tracking-consumption-content" data-astro-cid-daz465cn> <script>(()=>{var e=async t=>{await(await t())()};(self.Astro||(self.Astro={})).load=e;window.dispatchEvent(new Event("astro:load"));})();</script><div class="blog-post-page section-container section-container--padding-top-block section-container--padding-bottom-block" style="--section-background:;" data-astro-cid-jdrsq7vm="true" data-v-bc505aac><!--[--> <div class="breadcrumbs" style="'--breadcrumbs-item-font-size:var(--text-font-size-sm)';" data-astro-cid-jdrsq7vm="true" data-v-df69f11f><!--[--><!--[--><a href="/" class="nav-button palette-button palette-button-interactive nav-button-button" data-v-df69f11f data-v-7ec88356><!--[--><span class="" data-v-7ec88356>Home</span><!--[--><!----><!--]--><!--]--></a><span class="icon icon--inherit-color breadcrumbs__separator" data-v-df69f11f data-v-be81bbc2><i class="pi pi-chevron-right" data-v-be81bbc2></i></span><!--]--><!--[--><a href="/blog" class="nav-button palette-button palette-button-interactive nav-button-button" data-v-df69f11f data-v-7ec88356><!--[--><span class="" data-v-7ec88356>Blog</span><!--[--><!----><!--]--><!--]--></a><span class="icon icon--inherit-color breadcrumbs__separator" data-v-df69f11f data-v-be81bbc2><i class="pi pi-chevron-right" data-v-be81bbc2></i></span><!--]--><!--[--><a href="/blog/category/cms-developer-tutorials/" class="nav-button palette-button palette-button-interactive nav-button-button" data-v-df69f11f data-v-7ec88356><!--[--><span class="" data-v-7ec88356>CMS Developer Tutorials</span><!--[--><!----><!--]--><!--]--></a><span class="icon icon--inherit-color breadcrumbs__separator" data-v-df69f11f data-v-be81bbc2><i class="pi pi-chevron-right" data-v-be81bbc2></i></span><!--]--><!--]--><span class="breadcrumbs__item--last" data-v-df69f11f>Load Testing Round-Up: 8 Tools to Strengthen Your Stack</span></div> <div class="blog-post-page__content" data-astro-cid-jdrsq7vm> <div class="blog-post-hero blog-post-page__hero" data-astro-cid-jdrsq7vm="true" data-v-049a4f25><div class="card-container card-container--left card blog-card blog-post-hero__header" style="--card-background:;--card-spacing-x:var(--card-spacing-x-card);--card-spacing-y:var(--card-spacing-y-card);--card-content-max-width:100%;--card-content-max-width-md:100%;--card-content-max-width-lg:100%;--card-content-max-width-xl:100%;--card-heading-max-width:100%;--card-heading-max-width-md:100%;--card-heading-max-width-lg:100%;--card-heading-max-width-xl:100%;" fullwidth="false" data-v-049a4f25 data-v-29135824 data-v-bdd66a97 data-v-36432e43><!--[--><!----><div class="" data-v-bdd66a97><!----><div class="card__content" data-v-bdd66a97><div class="card__heading" data-v-bdd66a97><!--[--><div class="heading--margin-bottom" style="--heading-font-size:var(--heading-1-font-size);" data-v-bdd66a97 data-v-1848a4e8><!--[--><!----><!--]--><div class="title title--1" data-v-1848a4e8><!--[--><h1 class="title--internal" data-v-1848a4e8>Load Testing Round-Up: 8 Tools to Strengthen Your Stack</h1><!--]--><!----></div><!--[--><!----><!--]--></div><!--]--></div><div class="" data-v-bdd66a97><!--[--><div class="blog-card__info" data-v-29135824><div style="--max-name-title-width:14em;" data-v-29135824 data-v-5ced18b5><a href="/blog/author/noah-heinrich/" class="author__profile" data-v-5ced18b5><div data-v-5ced18b5><div class="avatar avatar--size-md avatar--shape-circle" data-v-5ced18b5 data-v-fe7f3189><img src="https://cdn.buttercms.com/8iUgtc12RbR4lMgFMXSj" alt="Noah Heinrich" class="avatar-image" data-v-fe7f3189></div></div><div data-v-5ced18b5><div class="text text--size-md text--weight-medium text--no-margin author__name" data-v-5ced18b5 data-v-2e32ee71><!--[-->Noah Heinrich<!--]--></div><div class="text text--size-md text--weight-regular text--no-margin author__text author__text--separator" data-v-5ced18b5 data-v-2e32ee71><!--[-->Writer<!--]--></div><!----></div></a><!----></div><div class="blog-card__separator" data-v-29135824></div><div class="blog-card__dates" data-v-29135824><div class="text text--size-sm text--weight-bold text--no-margin blog-card__published" data-v-29135824 data-v-2e32ee71><!--[-->Published on <time datetime="2023-10-09" data-v-29135824>October 9, 2023</time><!--]--></div><div class="text text--size-sm text--weight-regular text--no-margin blog-card__updated" data-v-29135824 data-v-2e32ee71><!--[-->Updated on <time datetime="2026-03-18" data-v-29135824>March 18, 2026</time><!--]--></div></div><div class="blog-card__separator" data-v-29135824></div><span class="text text--size-sm text--weight-bold text--no-margin blog-card__read-time" data-v-29135824 data-v-2e32ee71><!--[-->9 min read<!--]--></span></div><!--]--></div><!--[--><!--]--><!----><!--[--><!----><!--]--></div></div><!--]--></div><div class="blog-image blog-post-hero__image" data-v-049a4f25 data-v-65a0fc8d><div class="image__container blog-image__image" style="--width-base:100%;--width-md:100%;--width-lg:100%;--width-xl:100%;--height-base:100%;--height-md:100%;--height-lg:100%;--height-xl:100%;" data-v-65a0fc8d data-v-1a15d540><img src="https://cdn.buttercms.com/9t3YosTS9MkI4Rh88Og3" alt="" loading="lazy" class="image image--fit-cover" data-v-1a15d540></div><a class="blog-category blog-image__category" href="/blog/category/cms-developer-tutorials/" data-v-65a0fc8d data-v-d1ba30b1>CMS Developer Tutorials</a></div></div> <div class="blog-post-page__rich-text" data-astro-cid-jdrsq7vm> <div class="rich-text rich-text--blog-post text--size-md" data-astro-cid-jdrsq7vm="true" data-v-b0e7e4d7><p><span style="font-weight: 400;">They say that no plan survives contact with the enemy; by the same token, no web application survives its first contact with users, no matter how thoroughly it’s been tested. However, that doesn’t mean that you shouldn’t try to <a href="/blog/how-to-test-nextjs-apps/">test an application</a> to its limits. Most developers do performance testing, but one type of testing that is easy to overlook is load testing.</span></p>
|
||
<h2><span style="font-weight: 400;">Performance versus load testing</span></h2>
|
||
<p><span style="font-weight: 400;">Although often used interchangeably, performance testing and load testing are not exactly the same. Performance testing is the more general practice of testing an application’s responsiveness and stability under real-life scenarios. </span></p>
|
||
<p><span style="font-weight: 400;">Load testing is a specific subset of performance testing that is meant to determine the application’s quality of service when being used by a specific number of users simultaneously. Load testing software simulates numerous simultaneous uses throughout the application, allowing you to identify bottlenecks caused by throughfare or by massive concurrency. </span></p>
|
||
<p><span style="font-weight: 400;">For example, I noticed that users of a blogging application were experiencing slowdowns while trying to edit their own content, an issue I had never noticed during conventional testing. By using load testing software called Apache JMeter, I found that a <a href="/ruby-cms/" rel="follow">Ruby </a>gem was causing a 20% slowdown for this particular functionality. I never would have identified the source of that bottleneck on my own.</span></p>
|
||
<p><span style="font-weight: 400;">Load testing may seem like an obvious practice but it can be overlooked. When you test your own application each day, it is easy to forget that what you see and what your users see may be very different. Any client-server application needs load testing in order to determine its limits and improve user experience.</span></p>
|
||
<p><span style="font-weight: 400;">Of course, your own personal development environment is a far cry from what your application will see during professional use. While there is some merit to load testing in your production environment, it’s more realistic and safer to either replicate your own, or reproduce a client’s environment. No matter what you do, make sure that your testing environment is not using third-party plugins like PayPal. There are plenty of modules that can simulate those aspects of your application, but the only thing interacting with the test should be virtual users.</span></p>
|
||
<h3><span style="font-weight: 400;">Staging environments</span></h3>
|
||
<p><span style="font-weight: 400;">Testing in a staging environment is key to performance testing of all stripes. Having one gives you a buffer between your development environment and the client’s production environment. This allows you to catch errors and slowdowns before you push to production, thus keeping your clients happy. There are many online tools that can help your team set up a staging environment for your site, including </span><a href="https://www.siteground.com/tutorials/staging/"><span style="font-weight: 400;">SiteGround</span></a><span style="font-weight: 400;"> and </span><a href="https://www.vagrantup.com/"><span style="font-weight: 400;">Vagrant</span></a><span style="font-weight: 400;">. Use these software suites to create a staging environment that closely resembles real-use cases.</span></p>
|
||
<p><a href="/api-first-cms/" rel="follow"><img src="https://cdn.buttercms.com/enbNXKXrQl6guxBEKPbT" alt="blog-cta-any-stack_800x100.png"></a></p>
|
||
<p><span style="font-weight: 400;">The most popular load testing software is <a href="https://software.microfocus.com/en-us/products/loadrunner-load-testing/overview">LoadRunner</a>, but there are many viable alternatives out there. Below, we’ve evaluated the pros and cons of several of these load testing software suites so you can evaluate what best fits your needs.</span></p>
|
||
<h2><span style="font-weight: 400;">Load testing software suites</span></h2>
|
||
<h3><span style="font-weight: 400;">Free Solutions</span></h3>
|
||
<p><b>Apache JMeter</b></p>
|
||
<p><a href="https://jmeter.apache.org/"><span style="font-weight: 400;">JMeter</span></a><span style="font-weight: 400;">, like most Apache software, is open source. This makes it ideal for independent developers, but it’s not as effective for applications that anticipate thousands of users per day.</span></p>
|
||
<p><b>Pros:</b></p>
|
||
<ul>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Free to use</span></li>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Easy to set up and run from any environment</span></li>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Scripting is easy to use and replicate</span></li>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Highly customizable by adding extensions</span></li>
|
||
</ul>
|
||
<p><b>Cons:</b></p>
|
||
<ul>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Data visualization is not user friendly</span></li>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Distributed testing is not available; you cannot test two different use cases at the same time</span></li>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Not as scalable as premium testing suites</span></li>
|
||
</ul>
|
||
<p><b>Locust</b></p>
|
||
<p><a href="https://locust.io/"><span style="font-weight: 400;">Locust</span></a><span style="font-weight: 400;"> is a Python-based load testing software. It is completely open source, and allows users to create their own testing suites using pure Python code.</span></p>
|
||
<p><b>Pros:</b></p>
|
||
<ul>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Open source</span></li>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Highly customizable using <a href="/python-cms/" rel="follow">Python</a>, which makes it very human-friendly</span></li>
|
||
</ul>
|
||
<p><b>Cons:</b></p>
|
||
<ul>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">No built-in visualization services</span></li>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Suffers from poor performance when creating more than a few hundred virtual users</span></li>
|
||
</ul>
|
||
<p><b>Loader.io</b></p>
|
||
<p><a href="https://loader.io/"><span style="font-weight: 400;">Loader.io</span></a><span style="font-weight: 400;"> is a cloud-based load testing service, with a robust free option available. </span></p>
|
||
<p><b>Pros:</b></p>
|
||
<ul>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Easy to use and understand web-based interface</span></li>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Data visualization is crisp and clean</span></li>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">No installation required</span></li>
|
||
</ul>
|
||
<p><b>Cons:</b></p>
|
||
<ul>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Free plan only allows one target host, compared to unlimited target hosts in paid option</span></li>
|
||
</ul>
|
||
<p><b>Gatling</b></p>
|
||
<p><a href="https://gatling.io/"><span style="font-weight: 400;">Gatling</span></a><span style="font-weight: 400;"> is another open source load testing suite. Like Locust, is allows text-based scripting, using their own domain-specific language. There is also a paid option called Gatling FrontLine.</span></p>
|
||
<p><b>Pros:</b></p>
|
||
<ul>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Open source</span></li>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Easy to design custom testing scripts</span></li>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Colorful and readable data visualization</span></li>
|
||
</ul>
|
||
<p><b>Cons:</b></p>
|
||
<ul>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Not as intuitive as other open source software suites</span></li>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Does not support very many protocols</span></li>
|
||
</ul>
|
||
<p><b>BlazeMeter</b></p>
|
||
<p><a href="https://www.blazemeter.com/load-testing"><span style="font-weight: 400;">BlazeMeter</span></a><span style="font-weight: 400;"> is a popular platform as service designed to work with JMeter. It is able to make up for the scalability and visualization weaknesses of JMeter, but it is not open source.</span></p>
|
||
<p><b>Pros:</b></p>
|
||
<ul>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Excellent visualization and reporting</span></li>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Highly scalable</span></li>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Fully compatible with JMeter</span></li>
|
||
</ul>
|
||
<p><b>Cons:</b></p>
|
||
<ul>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Customer support is slow at best</span></li>
|
||
</ul>
|
||
<p><span style="font-weight: 400;"><img src="https://cdn.buttercms.com/kz0kdyfWQfnyJs8LsYy7" alt="" style="display: block; margin-left: auto; margin-right: auto;"></span></p>
|
||
<h2><span style="font-weight: 400;">Paid-Only Options</span></h2>
|
||
<p><b>Radview WebLOAD</b></p>
|
||
<p><a href="https://www.radview.com/webload-download/"><span style="font-weight: 400;">WebLOAD</span></a><span style="font-weight: 400;"> is one of the longest-standing load testing software suites available, and is currently on version 10.3.1. It has a limited free release, and the premium version price depends on your projected virtual users per day. Its tests are based in JavaScript.</span></p>
|
||
<p><a href="/api-first-cms/" rel="follow"><img src="https://cdn.buttercms.com/enbNXKXrQl6guxBEKPbT" alt="blog-cta-any-stack_800x100.png"></a></p>
|
||
<p><b>Pros:</b></p>
|
||
<ul>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Easy to use and set up, with a web-based UI </span></li>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Analytics are displayed clearly without fuss</span></li>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Support by RadView is responsive and prompt</span></li>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Although there is no listed price, it is reportedly more cost effective than other premium load testing software</span></li>
|
||
</ul>
|
||
<p><b>Cons:</b></p>
|
||
<ul>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Does not currently have a recording function</span></li>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">RadView does not display pricing on their website</span></li>
|
||
</ul>
|
||
<p><span style="font-weight: 400;"><img src="https://cdn.buttercms.com/2IstuqtR4a8SQgehEjUA" alt="Loadrunner" style="display: block; margin-left: auto; margin-right: auto;" width="934" height="507"></span></p>
|
||
<p><b>Micro Focus LoadRunner</b></p>
|
||
<p><span style="font-weight: 400;">One of the most popular load testing tools available, </span><a href="https://software.microfocus.com/en-us/products/loadrunner-load-testing/overview"><span style="font-weight: 400;">LoadRunner</span></a><span style="font-weight: 400;"> is arguably the most reliable and versatile load testing software suites. Like WebLOAD, a free version is available, with price increases for running more simulations.</span></p>
|
||
<p><b>Pros:</b></p>
|
||
<ul>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Ease of use and setup; works very quickly without requiring much server downtime</span></li>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Very adaptable to multiple scenarios; easy to create multiple types of simulated uses</span></li>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">A new beta feature allows it to integrate with JMeter</span></li>
|
||
</ul>
|
||
<p><b>Cons: </b></p>
|
||
<ul>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">On the pricier side, and free version only allows 50 use cases</span></li>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Data visualization is not user-friendly</span></li>
|
||
</ul>
|
||
<p><b>IBM Rational Performance Tester</b></p>
|
||
<p><a href="https://www.ibm.com/developerworks/downloads/r/rpt/index.html"><span style="font-weight: 400;">Rational Performance Tester</span></a><span style="font-weight: 400;"> is a tool created by IBM, primarily designed to test <a href="/java-cms/" rel="follow">Java</a>-based applications. IBM offers several tiers of payment for use of the software license.</span></p>
|
||
<p><b>Pros:</b></p>
|
||
<ul>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Distributed load testing is easy to set up</span></li>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">The UI is beginner-friendly</span></li>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Data parameterization is done more efficiently than many software suites</span></li>
|
||
</ul>
|
||
<p><b>Cons:</b></p>
|
||
<ul>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Purchasing a software license is a complex procedure</span></li>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Does not support protocols that are not HTTP</span></li>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Fee for monthly license is more expensive than many competitors</span></li>
|
||
</ul>
|
||
<p><b>SmartBear LoadUI Pro</b></p>
|
||
<p><a href="https://smartbear.com/product/ready-api/loadui/overview/"><span style="font-weight: 400;">This</span></a><span style="font-weight: 400;"> is a load testing tool from the makers of the popular SoapUI API testing software. It is best suited towards testing SOAP-based applications, and is one of the most expensive options on the market.</span></p>
|
||
<p><b>Pros:</b></p>
|
||
<ul>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Interface is highly intuitive, and can be configured in real time.</span></li>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Is easily compatible with SoapUI</span></li>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Amazon cloud integration</span></li>
|
||
</ul>
|
||
<p><b>Cons:</b></p>
|
||
<ul>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Setting up tests has a steep learning curve</span></li>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">An annual software license is very expensive</span></li>
|
||
</ul>
|
||
<h2><span style="font-weight: 400;">Choosing and using your load testing software</span></h2>
|
||
<p><span style="font-weight: 400;">These are just a few of the more popular load testing tools. There are many more out there, so don’t be afraid to shop around for one that is best suited to your particular application.</span></p>
|
||
<p><span style="font-weight: 400;">When considering which to pick, think about these factors: </span></p>
|
||
<ol>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Affordability </span></li>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Learnability </span></li>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Ease of use </span></li>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Analytic and data visualization </span></li>
|
||
<li style="font-weight: 400;"><span style="font-weight: 400;">Compatibility with your environment. </span></li>
|
||
</ol>
|
||
<p><span style="font-weight: 400;">Once you’ve picked which load testing software to use, you might find yourself unsure of how to start. Some of the software suites, like WebLOAD and Locust.io, have extensive documentation and customer support for beginners, while BlazeMeter and LoadUI do not. Here are a few best practices to keep in mind while setting up your load tests.</span></p>
|
||
<p><b></b></p>
|
||
<ul>
|
||
<li><b>Thoughtfully increase the number of virtual users <span style="font-weight: 400;">- It may be tempting to throw as many virtual users at your app to see how much it can take, but this blunt strategy won’t necessarily help you identify problems. Remember, the goal is to identify slowdowns, not crash your system. Set up your tests for one virtual user, then gradually increase the number so that you can identify trends more easily.</span></b><b><span style="font-weight: 400;"></span></b></li>
|
||
<li><b>Simulate real use <span style="font-weight: 400;">- Your application may have a pre-planned flow to it, but real life users rarely do what you want them to. The more flexible testers, such as Locust and JMeter, make it easy to make your virtual users click through your app like a real user might--often at random, doubling back, and sometimes never purchasing anything.</span></b></li>
|
||
<li><strong>Analyze, analyze, analyze</strong> <span style="font-weight: 400;">- Load testing isn’t about passing tests, it’s about obtaining data that can help you identify problem areas. All of these software suites show results in some way. Loader.io, WebLOAD, and BlazeMeter are particularly good at visualizing this data, but these tests don’t matter if you can’t interpret the output. If data analysis is not your thing, find somebody whose thing it is, and get their take on it!</span></li>
|
||
</ul>
|
||
<p></p>
|
||
<p></p>
|
||
<p><span style="font-weight: 400;">Remember, function should always take priority over form. Clients want a product that looks good, but only if it also works consistently and efficiently. By making regular load tests a part of your production cycle, you can identify lag before it becomes an issue, making you and your client much happier.</span></p>
|
||
<p><span style="font-weight: 400;"></span><em>Looking to add a blog or CMS to your current website while continuing to use your choice of tech stack? Read our <a href="/blog/cms-integration-how-to-add-a-blog-into-existing-site/" target="_blank" rel="noopener" title="CMS integration">guide on CMS Integration</a>.</em></p>
|
||
</div> </div> <div class="heading--margin-top heading--margin-bottom blog-post-page__author-heading palette-bg-main-tl-primary-dark" style="--heading-font-size:var(--heading-4-font-size);" data-astro-cid-jdrsq7vm="true" data-v-1848a4e8><!--[--><!----><!--]--><div class="title title--4" data-v-1848a4e8><!--[--><h4 class="title--internal" data-v-1848a4e8>Author</h4><!--]--><!----></div><!--[--><!----><!--]--></div> <astro-island uid="2bVJVT" prefix="s4" component-url="/_astro/index.BRyCdey2.js" component-export="TAuthorInfo" renderer-url="/_astro/client.D_fF9-0X.js" props="{"palette":[0,"palette-accordion-main"],"author":[0,{"name":[0,"Noah Heinrich"],"text":[0,"Writer"],"avatarSrc":[0,"https://cdn.buttercms.com/8iUgtc12RbR4lMgFMXSj"],"bio":[0,"Noa Heinrich is an instructor at the Flatiron School in Chicago, and a produce of the weekly gaming podcast Tabletop Potluck."],"slug":[0,"noah-heinrich"],"linkedinUrl":[0,""],"twitterHandle":[0,""],"facebookUrl":[0,""],"href":[0,"/blog/author/noah-heinrich/"]}],"text":[0,"Noa Heinrich is an instructor at the Flatiron School in Chicago, and a produce of the weekly gaming podcast Tabletop Potluck."],"socialLinks":[1,[]],"expanded":[0,true],"border":[0,true],"class":[0,"blog-post-page__author-info"],"data-astro-cid-jdrsq7vm":[0,true]}" ssr client="visible" opts="{"name":"TAuthorInfo","value":{"rootMargin":"100px"}}" await-children><div class="palette-accordion-main accordion accordion--expanded accordion--border accordion--rounded blog-post-page__author-info" data-astro-cid-jdrsq7vm="true" data-v-7cb0d8c0 data-v-73c7940d><button class="accordion__header" data-v-73c7940d><!--[--><div style="--max-name-title-width:none;" data-v-7cb0d8c0 data-v-5ced18b5><a href="/blog/author/noah-heinrich/" class="author__profile" data-v-5ced18b5><div data-v-5ced18b5><div class="avatar avatar--size-lg avatar--shape-circle" data-v-5ced18b5 data-v-fe7f3189><img src="https://cdn.buttercms.com/8iUgtc12RbR4lMgFMXSj" alt="Noah Heinrich" class="avatar-image" data-v-fe7f3189></div></div><div data-v-5ced18b5><div class="text text--size-md text--weight-medium text--no-margin author__name" data-v-5ced18b5 data-v-2e32ee71><!--[-->Noah Heinrich<!--]--></div><div class="text text--size-md text--weight-regular text--no-margin author__text author__text--separator" data-v-5ced18b5 data-v-2e32ee71><!--[-->Writer<!--]--></div><!----></div></a><!----></div><!--]--><span class="icon icon--icon-color accordion__icon accordion__icon--expanded" data-v-73c7940d data-v-be81bbc2><i class="pi pi-chevron-down" data-v-be81bbc2></i></span></button><div class="accordion__content-wrapper" id="accordion-content-default" style="--content-max-height:0px;" data-v-73c7940d><div class="accordion__content" data-v-73c7940d><div class="rich-text rich-text--default text--size-md accordion__rich-text" data-v-73c7940d data-v-b0e7e4d7>Noa Heinrich is an instructor at the Flatiron School in Chicago, and a produce of the weekly gaming podcast Tabletop Potluck.</div><!--[--><div class="author-info__social" data-v-7cb0d8c0><!--[--><!--]--></div><!--]--></div></div></div><!--astro:end--></astro-island> <astro-island uid="xwdQ2" prefix="s5" component-url="/_astro/BlogPostFooter.CaeRe4CH.js" component-export="default" renderer-url="/_astro/client.D_fF9-0X.js" props="{"blogPosts":[1,[[0,{"slug":[0,"chatgpt-prompt-frameworks"],"author":[0,{"name":[0,"Maab Saleem"],"text":[0,""],"avatarSrc":[0,"https://cdn.buttercms.com/yrU8akCQcCdsvcXzQRXE"],"bio":[0,"Maab Salem is a software engineer who's spent his 15+ year career building and scaling products used by millions, and leading engineering teams at companies ranging from multinationals to unicorns. These days he runs Scale My Vibe, an agency that helps non-technical founders turn their vibe-coded projects into something solid. He has a knack for making hard technical ideas click for a wider audience, and he's happiest when he's debugging something nobody else can figure out."],"slug":[0,"maab-saleem"],"linkedinUrl":[0,""],"twitterHandle":[0,""],"facebookUrl":[0,""],"href":[0,"/blog/author/maab-saleem/"]}],"categories":[1,[[0,{"name":[0,"CMS Developer Tutorials"],"slug":[0,"cms-developer-tutorials"],"href":[0,"/blog/category/cms-developer-tutorials/"]}]]],"tags":[1,[[0,{"name":[0,"chatgpt"],"slug":[0,"chatgpt"]}],[0,{"name":[0,"content marketing"],"slug":[0,"content-marketing"]}],[0,{"name":[0,"prompts"],"slug":[0,"prompts"]}]]],"status":[0,"published"],"published":[3,"2026-03-24T21:13:00.000Z"],"updated":[3,"2026-03-27T19:41:51.962Z"],"featuredImageSrc":[0,"https://cdn.buttercms.com/UQ2IyokeR3WAVPi4ckNw"],"featuredImageAlt":[0,"8 ChatGPT Prompt Frameworks Every Marketer Should Know"],"title":[0,"8 ChatGPT prompt frameworks every marketer should know"],"body":[0,"<table border=\"1\" style=\"border-collapse: collapse; width: 100.001%; height: 100px; border-width: 2px; border-spacing: 60px; background-color: #f0fcff; border-color: #f0fcff;\"><colgroup><col style=\"width: 99.943%;\"></colgroup>\n<tbody>\n<tr>\n<td style=\"border-width: 2px; padding: 50px; border-color: #f0fcff;\">\n<p><strong>TL;DR</strong></p>\n<p>A ChatGPT prompt framework is a repeatable structure that breaks your AI instructions into discrete components like role, context, task, and expected output format. Instead of writing a vague prompt and hoping for the best, you slot your information into a defined template and get more consistent, usable results.</p>\n<p>This article covers eight frameworks. The simplest ones (TAG, PAR) use three components and work well for quick, single-output tasks like generating subject lines or diagnosing a campaign issue. The more detailed ones (RACE, TRACE, CRISPE) use four to five components and are better suited for strategy work, multi-step plans, or creative ideation where you need multiple variations. AIDA and BAB are specialized for persuasive copywriting and storytelling, respectively.</p>\n<p>If you're not sure which one to use, start with the comparison table below. Pick the framework that matches your task type, plug in your specifics, and refine from there. No single framework is best for everything, but any of them will produce better output than an unstructured prompt.</p>\n</td>\n</tr>\n</tbody>\n</table>\n<p>If you want better output from ChatGPT, the structure of your prompt matters just as much as the idea behind it. A vague prompt usually leads to a vague response. A well-structured prompt gives ChatGPT the context, direction, and constraints it needs to generate something useful.</p>\n<p>That&rsquo;s where prompt frameworks come in. They give you a repeatable way to write stronger prompts for common marketing tasks like strategy, copywriting, segmentation, research, and campaign planning.</p>\n<p>In this post, we&rsquo;ll walk through eight ChatGPT prompt frameworks marketers can use to get more accurate, relevant, and actionable output. You&rsquo;ll also see when each framework works best, when not to use it, and a quick comparison table to help you choose the right one faster.</p>\n<h2>What are ChatGPT prompt frameworks?</h2>\n<p>ChatGPT prompt frameworks are simple structures that help you write better prompts. Instead of giving the model a vague instruction, you give it the role, context, task, format, or outcome it needs to generate a more useful response.</p>\n<p>Without that structure, ChatGPT&rsquo;s output can be generic or off-target. With a clear framework, you can create prompts for things like content strategy, customer personas, tone of voice guidelines, campaign ideas, and more with much less guesswork.</p>\n<h2>Why should marketers use prompt frameworks?</h2>\n<p>Prompt frameworks help marketers get better output with less back-and-forth. They&rsquo;re especially useful when you want more control over tone, structure, accuracy, or depth.</p>\n<p>Here&rsquo;s why they matter:</p>\n<ul>\n<li>\n<p><strong>Clear communication of end goals:</strong> You may want a product launch email, but unless you specify the target audience, tone of voice, writing style, and format, ChatGPT won&rsquo;t generate an email to your liking. Prompt frameworks help you feed all that information to the chatbot to generate accurate content.</p>\n</li>\n<li>\n<p><strong>Break down complex prompts: </strong>With a framework, you can break a long, complex prompt into smaller, easier-to-interpret pieces. For example, context, role, instruction, details, style, and expectations.</p>\n</li>\n<li>\n<p><strong>Save time and energy: </strong>What use is ChatGPT if you still have to spend hours tweaking its responses to use them for your marketing materials? Prompt frameworks help generate content that you can use in your campaigns with minimal intervention.</p>\n</li>\n<li>\n<p><strong>Allow experimentation: </strong>By changing or modifying only a few parts of the prompt, you can test out different angles, optimize strategy, and try different tones. A framework provides the base for these experiments.</p>\n</li>\n</ul>\n<p>Discover how the Butter AI Assistant supercharges content creation: <a href=\"https://cdn.buttercms.com/key9Mj5RoeeEv5SuXpR3\">Watch our latest webinar</a> for SEO strategies, success stories, and an exclusive look at AI-powered innovations.</p>\n<h2>Which ChatGPT prompt framework should you use?</h2>\n<p>Before we dive into the specifics of each framework, here's a quick comparison to help you pick the right framework for the task at hand:</p>\n<div align=\"left\" style=\"overflow-x: auto;\">\n<table style=\"border-collapse: collapse; width: 100%; height: 100%; border-width: 1px; border-spacing: 15px; border-style: solid;\" border=\"1\"><colgroup><col style=\"width: 72px;\"><col style=\"width: 109px;\"><col style=\"width: 97px;\"><col style=\"width: 108px;\"><col style=\"width: 81px;\"><col style=\"width: 77px;\"><col style=\"width: 148px;\"></colgroup>\n<thead>\n<tr style=\"height: 98.2639px; background-color: #5050ff;\">\n<td style=\"border-width: 1px; padding: 15px; text-align: center;\">\n<p><span style=\"color: #ffffff;\"><strong>Framework</strong></span></p>\n</td>\n<td style=\"border-width: 1px; padding: 15px; text-align: center;\">\n<p><span style=\"color: #ffffff;\"><strong>Quick definition</strong></span></p>\n</td>\n<td style=\"border-width: 1px; padding: 15px; text-align: center;\">\n<p><span style=\"color: #ffffff;\"><strong>Best for</strong></span></p>\n</td>\n<td style=\"border-width: 1px; padding: 15px; text-align: center;\">\n<p><span style=\"color: #ffffff;\"><strong>Level of detail</strong></span></p>\n</td>\n<td style=\"border-width: 1px; padding: 15px; text-align: center;\">\n<p><span style=\"color: #ffffff;\"><strong>Key strength</strong></span></p>\n</td>\n<td style=\"border-width: 1px; padding: 15px; text-align: center;\">\n<p><span style=\"color: #ffffff;\"><strong>Output style</strong></span></p>\n</td>\n<td style=\"border-width: 1px; padding: 15px; text-align: center;\">\n<p><span style=\"color: #ffffff;\"><strong>When to avoid</strong></span></p>\n</td>\n</tr>\n</thead>\n<tbody>\n<tr style=\"height: 100px;\">\n<td style=\"border-width: 1px; padding: 15px; background-color: #9dc4ff;\">\n<p><strong>RACE</strong></p>\n</td>\n<td style=\"border-width: 1px; padding: 15px;\">\n<p>A structured framework that defines the role, task, context, and expected outcome.</p>\n</td>\n<td style=\"border-width: 1px; padding: 15px;\">\n<p>General marketing tasks</p>\n</td>\n<td style=\"border-width: 1px; padding: 15px;\">\n<p>Medium&ndash;High</p>\n</td>\n<td style=\"border-width: 1px; padding: 15px;\">\n<p>Clear structure with flexibility</p>\n</td>\n<td style=\"border-width: 1px; padding: 15px;\">\n<p>Structured, practical</p>\n</td>\n<td style=\"border-width: 1px; padding: 15px;\">\n<p>When the task is very simple or you need lots of creative variation</p>\n</td>\n</tr>\n<tr style=\"height: 100px;\">\n<td style=\"border-width: 1px; padding: 15px; background-color: #9dc4ff;\">\n<p><strong>TAG</strong></p>\n</td>\n<td style=\"border-width: 1px; padding: 15px; background-color: #f0fcff;\">\n<p>A simple framework that focuses on the task, approach, and end goal.</p>\n</td>\n<td style=\"border-width: 1px; padding: 15px; background-color: #f0fcff;\">\n<p>Quick, straightforward tasks</p>\n</td>\n<td style=\"border-width: 1px; padding: 15px; background-color: #f0fcff;\">\n<p>Low</p>\n</td>\n<td style=\"border-width: 1px; padding: 15px; background-color: #f0fcff;\">\n<p>Speed and simplicity</p>\n</td>\n<td style=\"border-width: 1px; padding: 15px; background-color: #f0fcff;\">\n<p>Direct, concise</p>\n</td>\n<td style=\"border-width: 1px; padding: 15px; background-color: #f0fcff;\">\n<p>When the task needs deeper context, nuance, or a more detailed output</p>\n</td>\n</tr>\n<tr style=\"height: 100px;\">\n<td style=\"border-width: 1px; padding: 15px; background-color: #9dc4ff;\">\n<p><strong>TRACE</strong></p>\n</td>\n<td style=\"border-width: 1px; padding: 15px;\">\n<p>A detailed framework that combines instructions, context, actions, and examples for complex tasks.</p>\n</td>\n<td style=\"border-width: 1px; padding: 15px;\">\n<p>Complex, multi-step tasks</p>\n</td>\n<td style=\"border-width: 1px; padding: 15px;\">\n<p>High</p>\n</td>\n<td style=\"border-width: 1px; padding: 15px;\">\n<p>Strong structure and guidance</p>\n</td>\n<td style=\"border-width: 1px; padding: 15px;\">\n<p>Detailed, step-by-step</p>\n</td>\n<td style=\"border-width: 1px; padding: 15px;\">\n<p>When speed matters more than depth or the task is too simple</p>\n</td>\n</tr>\n<tr style=\"height: 100px;\">\n<td style=\"border-width: 1px; padding: 15px; background-color: #9dc4ff;\">\n<p><strong>CARE</strong></p>\n</td>\n<td style=\"border-width: 1px; padding: 15px; background-color: #f0fcff;\">\n<p>An outcome-focused framework built around context, action, result, and example.</p>\n</td>\n<td style=\"border-width: 1px; padding: 15px; background-color: #f0fcff;\">\n<p>Outcome-driven marketing tasks</p>\n</td>\n<td style=\"border-width: 1px; padding: 15px; background-color: #f0fcff;\">\n<p>Medium&ndash;High</p>\n</td>\n<td style=\"border-width: 1px; padding: 15px; background-color: #f0fcff;\">\n<p>Clear direction tied to results</p>\n</td>\n<td style=\"border-width: 1px; padding: 15px; background-color: #f0fcff;\">\n<p>Actionable, outcome-focused</p>\n</td>\n<td style=\"border-width: 1px; padding: 15px; background-color: #f0fcff;\">\n<p>When the goal is still exploratory or not clearly defined</p>\n</td>\n</tr>\n<tr style=\"height: 100px;\">\n<td style=\"border-width: 1px; padding: 15px; background-color: #9dc4ff;\">\n<p><strong>PAR</strong></p>\n</td>\n<td style=\"border-width: 1px; padding: 15px;\">\n<p>A concise framework for solving a defined problem with a targeted action and result.</p>\n</td>\n<td style=\"border-width: 1px; padding: 15px;\">\n<p>Problem-solving</p>\n</td>\n<td style=\"border-width: 1px; padding: 15px;\">\n<p>Medium</p>\n</td>\n<td style=\"border-width: 1px; padding: 15px;\">\n<p>Direct problem-to-solution flow</p>\n</td>\n<td style=\"border-width: 1px; padding: 15px;\">\n<p>Analytical, solution-focused</p>\n</td>\n<td style=\"border-width: 1px; padding: 15px;\">\n<p>When the task is more creative, open-ended, or not tied to a clear problem</p>\n</td>\n</tr>\n<tr style=\"height: 100px;\">\n<td style=\"border-width: 1px; padding: 15px; background-color: #9dc4ff;\">\n<p><strong>CRISPE</strong></p>\n</td>\n<td style=\"border-width: 1px; padding: 15px; background-color: #f0fcff;\">\n<p>A creative framework that combines role, context, tone, and experimentation to generate multiple ideas.</p>\n</td>\n<td style=\"border-width: 1px; padding: 15px; background-color: #f0fcff;\">\n<p>Ideation and testing</p>\n</td>\n<td style=\"border-width: 1px; padding: 15px; background-color: #f0fcff;\">\n<p>High</p>\n</td>\n<td style=\"border-width: 1px; padding: 15px; background-color: #f0fcff;\">\n<p>Encourages variation and experimentation</p>\n</td>\n<td style=\"border-width: 1px; padding: 15px; background-color: #f0fcff;\">\n<p>Diverse, idea-heavy</p>\n</td>\n<td style=\"border-width: 1px; padding: 15px; background-color: #f0fcff;\">\n<p>When you only need one direct answer or recommendation</p>\n</td>\n</tr>\n<tr style=\"height: 100px;\">\n<td style=\"border-width: 1px; padding: 15px; background-color: #9dc4ff;\">\n<p><strong>AIDA</strong></p>\n</td>\n<td style=\"border-width: 1px; padding: 15px;\">\n<p>A persuasive framework that moves from attention to interest, desire, and action.</p>\n</td>\n<td style=\"border-width: 1px; padding: 15px;\">\n<p>Copywriting and conversion tasks</p>\n</td>\n<td style=\"border-width: 1px; padding: 15px;\">\n<p>Medium</p>\n</td>\n<td style=\"border-width: 1px; padding: 15px;\">\n<p>Proven persuasion structure</p>\n</td>\n<td style=\"border-width: 1px; padding: 15px;\">\n<p>Persuasive, conversion-focused</p>\n</td>\n<td style=\"border-width: 1px; padding: 15px;\">\n<p>When the task is analytical, neutral, or purely informational</p>\n</td>\n</tr>\n<tr style=\"height: 100px;\">\n<td style=\"border-width: 1px; padding: 15px; background-color: #9dc4ff;\">\n<p><strong>BAB</strong></p>\n</td>\n<td style=\"border-width: 1px; padding: 15px; background-color: #f0fcff;\">\n<p>A storytelling framework that shows a before state, an improved after state, and the bridge between them.</p>\n</td>\n<td style=\"border-width: 1px; padding: 15px; background-color: #f0fcff;\">\n<p>Storytelling and transformation-led content</p>\n</td>\n<td style=\"border-width: 1px; padding: 15px; background-color: #f0fcff;\">\n<p>Medium</p>\n</td>\n<td style=\"border-width: 1px; padding: 15px; background-color: #f0fcff;\">\n<p>Clear narrative arc</p>\n</td>\n<td style=\"border-width: 1px; padding: 15px; background-color: #f0fcff;\">\n<p>Narrative, story-driven</p>\n</td>\n<td style=\"border-width: 1px; padding: 15px; background-color: #f0fcff;\">\n<p>When there is no obvious before-and-after transformation</p>\n</td>\n</tr>\n</tbody>\n</table>\n</div>\n<h2>8 ChatGPT frameworks for crafting effective marketing prompts</h2>\n<p>Below are 8 ChatGPT prompt frameworks you can use for highly effective prompt engineering:</p>\n<h3>1. RACE (Role, Action, Context, Expectation)</h3>\n<p><strong>Best for: general marketing tasks that need structure without too much complexity.</strong></p>\n<h4>What is the RACE prompt framework?</h4>\n<p>RACE is a prompt framework that helps you write clearer, more effective instructions by defining who the AI should be, what it should do, what background it needs, and what the final output should look like.</p>\n<p>It's a practical way to structure prompts for marketing work because it mirrors current prompt-writing best practices: assign a clear task, provide useful context, and specify the format or outcome you want.</p>\n<h4>How the RACE framework works</h4>\n<p><strong>Role:</strong> Define the perspective or expertise ChatGPT should adopt. This helps shape tone, priorities, and domain knowledge.</p>\n<p><strong>Action:</strong> State exactly what you want ChatGPT to do. Keep this instruction direct and outcome-focused, such as \"write,\" \"analyze,\" \"compare,\" \"generate,\" or \"improve.\"</p>\n<p><strong>Context: </strong>Add the information the model needs to produce a relevant answer. This could include your audience, product, channel, campaign goal, market, brand voice, or performance constraints.</p>\n<p><strong>Expectation:</strong> Explain what a good result looks like. This can include format, length, level of detail, structure, tone, or any must-have elements.</p>\n<h4>An example of the RACE framework in action</h4>\n<p><strong>Role: </strong>\"You are a marketing strategist specializing in customer segmentation for ecommerce brands.\"&nbsp;</p>\n<p><strong>Action:</strong> \"Develop a customer segmentation strategy.\"&nbsp;</p>\n<p><strong>Context:</strong> \"The company sells premium fitness equipment online to health-conscious consumers in the U.S. Its goals are to increase customer loyalty and improve personalization in email marketing.\"&nbsp;</p>\n<p><strong>Expectation: </strong>\"Create 3 to 4 customer segments based on demographics, purchase behavior, and engagement level. For each segment, include key traits, likely motivations, messaging angles, and preferred communication channels.\"</p>\n<h4>Full RACE prompt example</h4>\n<p>\"You are a marketing strategist specializing in customer segmentation for ecommerce brands. Develop a customer segmentation strategy for a premium fitness equipment company that sells online to health-conscious consumers in the U.S. The goals are to increase customer loyalty and improve personalization in email marketing. Create 3 to 4 customer segments based on demographics, purchase behavior, and engagement level. For each segment, include key traits, likely motivations, messaging angles, and preferred communication channels.\"</p>\n<h4>When not to use RACE</h4>\n<ul>\n<li>\n<p>The task is extremely simple (adds unnecessary structure)</p>\n</li>\n<li>\n<p>You don't have enough context to provide meaningful background</p>\n</li>\n<li>\n<p>You need multiple creative variations rather than one well-defined output</p>\n</li>\n<li>\n<p>Speed matters more than precision (e.g., quick drafts or ideas)</p>\n</li>\n</ul>\n<h3>2. TAG (Task, Action, Goal)</h3>\n<p><strong>Best for: quick, straightforward marketing tasks where speed matters.</strong></p>\n<h4>What is the TAG prompt framework?</h4>\n<p>TAG is a simple prompt framework that helps you get usable results fast by defining the task, the approach, and the desired outcome.</p>\n<p>The TAG framework works well for straightforward marketing tasks where you want clear direction without adding too much complexity. It aligns well with current prompt-writing best practices: clearly state what you want done, add guidance on how it should be handled, and define what success looks like.</p>\n<h4>How the TAG framework works</h4>\n<p><strong>Task:</strong> State what ChatGPT needs to do. This should be the core request, such as writing ad copy, improving email performance, summarizing research, or generating campaign ideas.</p>\n<p><strong>Action: </strong>Explain how the task should be approached. This is where you can guide the method, focus area, or lens ChatGPT should use.</p>\n<p><strong>Goal: </strong>Describe what the final result should achieve. This keeps the response focused on a clear outcome instead of vague ideas. It also makes the output more useful in real work.</p>\n<h4>An example of the TAG framework in action</h4>\n<p><strong>Task: </strong>\"Improve the open rates of our email marketing campaigns.\"&nbsp;</p>\n<p><strong>Action: </strong>\"Identify effective strategies for subject lines, send-time testing, and audience segmentation.\"&nbsp;</p>\n<p><strong>Goal:</strong> \"Recommend practical changes that could help increase open rates by 15% over the next 3 months.\"</p>\n<h4>Full TAG prompt example</h4>\n<p>\"Improve the open rates of our email marketing campaigns. Identify effective strategies for subject lines, send-time testing, and audience segmentation. Recommend practical changes that could help increase open rates by 15% over the next 3 months, and present the suggestions as a prioritized action plan.\"</p>\n<h4>When not to use TAG</h4>\n<ul>\n<li>\n<p>The task requires deep context or nuance</p>\n</li>\n<li>\n<p>You need structured, multi-step outputs (e.g., strategies, frameworks)</p>\n</li>\n<li>\n<p>Tone, role, or audience specificity is critical</p>\n</li>\n<li>\n<p>You want multiple variations or creative exploration</p>\n</li>\n</ul>\n<h3>3. TRACE (Task, Request, Action, Context, Example)</h3>\n<p><strong>Best for: complex, multi-step marketing tasks that need detailed structure and guidance.</strong></p>\n<h4>What is the TRACE prompt framework?</h4>\n<p>TRACE is a structured prompt framework designed for more complex marketing tasks that combines clear instructions, context, specific action steps, and examples to guide high-quality outputs.</p>\n<p>TRACE is particularly useful when you need detailed, structured responses, such as strategy development, process design, or multi-step execution plans. It reflects current prompt best practices by layering clarity (Task + Request), guidance (Action), relevant background (Context), and demonstration (Example).</p>\n<h4>How the TRACE framework works</h4>\n<p><strong>Task: </strong>Define the overarching objective. This sets the direction and ensures the response stays focused on the business goal.</p>\n<p><strong>Request:</strong> Specify what you want ChatGPT to produce. This is the core deliverable (e.g., a guide, plan, framework, or set of recommendations).</p>\n<p><strong>Action: </strong>Outline how the task should be approached. This adds structure and ensures the output includes the right components or steps.</p>\n<p><strong>Context: </strong>Provide the background information needed to make the response relevant and actionable.</p>\n<p><strong>Example: </strong>Include a sample or illustration of what you expect. This helps anchor the response and improves consistency.</p>\n<h4>An example of the TRACE framework in action</h4>\n<p><strong>Task: </strong>\"Automate the lead follow-up process.\"&nbsp;</p>\n<p>Request: \"Provide a step-by-step guide to setting up automated follow-up sequences.\"&nbsp;</p>\n<p><strong>Action:</strong> \"Include email templates, timing recommendations, suggested tools, and personalization strategies.\"&nbsp;</p>\n<p><strong>Context: </strong>\"We are a B2B software company with a large database of leads who have shown interest but have not yet converted. The goal is to improve lead nurturing and conversion rates.\"&nbsp;</p>\n<p><strong>Example: </strong>\"For example, include triggered email sequences based on lead behavior, CRM integration workflows, and sample follow-up emails.\"</p>\n<h4>Full TRACE prompt example</h4>\n<p>\"Automate the lead follow-up process for a B2B software company. Provide a step-by-step guide to setting up automated follow-up sequences, including email templates, timing recommendations, suggested tools, and personalization strategies. The company has a large database of leads who have shown interest but have not yet converted, and the goal is to improve lead nurturing and conversion rates. For example, include triggered email sequences based on lead behavior, CRM integrations, and sample follow-up emails.\"</p>\n<h4>When not to use TRACE</h4>\n<ul>\n<li>\n<p>The task is simple and doesn't need detailed structure</p>\n</li>\n<li>\n<p>You don't have a clear example to guide the output</p>\n</li>\n<li>\n<p>Speed is a priority over depth</p>\n</li>\n<li>\n<p>You want open-ended or highly creative responses</p>\n</li>\n</ul>\n<h3>4. CARE (Context, Action, Result, Example)</h3>\n<p><strong>Best for: outcome-driven marketing tasks like campaign planning, feedback systems, or workflow improvements.</strong></p>\n<h4>What is the CARE prompt framework?</h4>\n<p>CARE is a prompt framework for creating detailed, actionable prompts by combining background, a clear task, the desired outcome, and an example of what good looks like.</p>\n<p>The CARE framework is especially useful for marketing tasks that need more than a simple instruction, such as process design, campaign planning, feedback systems, or workflow improvements.</p>\n<h4>How the CARE framework works</h4>\n<p><strong>Context: </strong>Set the stage with the background ChatGPT needs to understand the task. This could include your company type, audience, business challenge, goals, or constraints.</p>\n<p><strong>Action: </strong>Specify exactly what you want ChatGPT to do. Keep this instruction direct and practical so the model can focus on the task itself.</p>\n<p><strong>Result:</strong> Describe the outcome you want. This helps make the response more useful by defining what success looks like and what the output should achieve.</p>\n<p><strong>Example: </strong>Provide an example of the kind of response you want.</p>\n<h4>An example of the CARE framework in action</h4>\n<p><strong>Context: </strong>\"We are a SaaS company offering project management software. Our goal is to improve the product based on user feedback, but we currently lack an organized system to capture and act on customer feedback efficiently.\"&nbsp;</p>\n<p><strong>Action:</strong> \"Create a structured customer feedback loop that helps us gather, analyze, and act on feedback to continuously improve the product.\"&nbsp;</p>\n<p><strong>Result: </strong>\"The feedback loop should improve customer satisfaction and retention by helping us address product issues faster, act on user suggestions, and strengthen communication between the product and customer support teams.\"&nbsp;</p>\n<p><strong>Example: </strong>\"For example, include regular customer surveys, a system for tagging and prioritizing feedback, and a process for closing the loop by telling users what actions were taken.\"</p>\n<h4>Full CARE prompt example</h4>\n<p>\"We are a SaaS company offering project management software. Our goal is to improve the product based on user feedback, but we currently lack an organized system to capture and act on customer feedback efficiently. Create a structured customer feedback loop that helps us gather, analyze, and act on feedback to continuously improve the product. The feedback loop should improve customer satisfaction and retention by helping us address product issues faster, act on user suggestions, and strengthen communication between the product and customer support teams. For example, include regular customer surveys, a system for tagging and prioritizing feedback, and a process for closing the loop by telling users what actions were taken.\"</p>\n<h4>When not to use CARE</h4>\n<ul>\n<li>\n<p>When you don't have clear desired outcomes defined yet</p>\n</li>\n<li>\n<p>When the task is exploratory rather than outcome-driven</p>\n</li>\n<li>\n<p>When you need multiple variations instead of a single solution</p>\n</li>\n<li>\n<p>When minimal input is preferred (e.g., quick prompts)</p>\n</li>\n</ul>\n<h3>5. PAR (Problem, Action, Result)</h3>\n<p><strong>Best for: solving specific, well-defined marketing problems.</strong></p>\n<h4>What is the PAR prompt framework?</h4>\n<p>PAR is a concise prompt framework that helps you solve specific marketing problems by clearly defining the issue, the approach, and the desired outcome.</p>\n<p>The PAR framework is ideal for situations where you need a direct, solution-focused response, such as diagnosing performance drops, improving campaigns, or fixing funnel issues.</p>\n<h4>How the PAR framework works</h4>\n<p><strong>Problem: </strong>Clearly describe the issue you're facing. The more specific you are (e.g., timeframe, metrics, impact), the more precise the response will be.</p>\n<p><strong>Action: </strong>Specify what you want ChatGPT to do to address the problem. This could include analysis, recommendations, comparisons, or step-by-step solutions.</p>\n<p><strong>Result:</strong> Define what success looks like. This ensures the response is outcome-driven and aligned with your business goals.</p>\n<h4>An example of the PAR framework in action</h4>\n<p><strong>Problem: </strong>\"Our website has experienced a significant drop in search engine rankings over the past three months, leading to a decline in organic traffic.\"&nbsp;</p>\n<p><strong>Action: </strong>\"Analyze potential causes for the ranking drop, including on-page SEO issues, algorithm updates, backlink profile changes, and website performance. Recommend steps to improve rankings.\"&nbsp;</p>\n<p><strong>Result: </strong>\"Identify the root causes and provide a clear action plan to restore and improve rankings, with the goal of recovering organic traffic within the next few months.\"</p>\n<h4>Full PAR prompt example</h4>\n<p>\"Our website has experienced a significant drop in search engine rankings over the past three months, resulting in a decline in organic traffic. Analyze potential causes for the drop, including on-page SEO issues, algorithm updates, backlink profile changes, and website performance. Recommend a prioritized action plan to restore and improve rankings, with the goal of recovering organic traffic within the next few months.\"</p>\n<h4>When not to use PAR</h4>\n<ul>\n<li>\n<p>There isn't a clearly defined problem</p>\n</li>\n<li>\n<p>The task is creative rather than solution-oriented</p>\n</li>\n<li>\n<p>You need multiple ideas or experimentation</p>\n</li>\n<li>\n<p>Deeper context or nuance is required</p>\n</li>\n</ul>\n<h3>6. CRISPE (Capacity/Role, Insight, Statement, Personality, Experiment)</h3>\n<p><strong>Best for: creative ideation, ad testing, and tasks that benefit from multiple variations.</strong></p>\n<h4>What is the CRISPE prompt framework?</h4>\n<p>CRISPE is a prompt framework designed to generate diverse, high-quality ideas by combining clear instructions, context, tone guidance, and multiple output variations.</p>\n<p>CRISPE is particularly effective for creative marketing tasks like campaign ideation, ad testing, messaging exploration, and experimentation.</p>\n<h4>How the CRISPE framework works</h4>\n<p><strong>Capacity/Role:</strong> Define the expertise or perspective ChatGPT should adopt. This helps shape the quality and relevance of ideas, especially for specialized marketing tasks.</p>\n<p><strong>Insight:</strong> Provide the background information needed to ground the response. This could include performance data, current challenges, audience behavior, or campaign context.</p>\n<p><strong>Statement:</strong> Clearly state the core task you want ChatGPT to do.</p>\n<p><strong>Personality:</strong> Specify the tone or style. This is especially useful for creative work, whether you want something data-driven, bold, experimental, or brand-aligned.</p>\n<p><strong>Experiment:</strong> Ask for multiple variations or test ideas.</p>\n<h4>An example of the CRISPE framework in action</h4>\n<p><strong>Capacity/Role: </strong>\"You are a digital marketing expert specializing in paid advertising and performance optimization.\"&nbsp;</p>\n<p><strong>Insight:</strong> \"We've been running Facebook and Google ads for six months, but our click-through rate (CTR) and conversion rates have plateaued. We suspect the issue may be related to ad creatives or targeting.\"&nbsp;</p>\n<p><strong>Statement: </strong>\"Develop a paid ad testing strategy to improve CTR and conversion rates.\"&nbsp;</p>\n<p>Personality: \"Take a data-driven approach, but include creative ideas for testing new ad formats and audience segments.\"&nbsp;</p>\n<p><strong>Experiment: </strong>\"Design A/B tests for Facebook and Google ads, including multiple variations of ad copy, creative formats (images vs. video), and audience targeting. Include KPIs and benchmarks to evaluate success.\"</p>\n<h4>Full CRISPE prompt example</h4>\n<p>\"You are a digital marketing expert specializing in paid advertising and performance optimization. We've been running Facebook and Google ads for six months, but CTR and conversion rates have plateaued, likely due to creative or targeting issues. Develop a paid ad testing strategy to improve performance. Take a data-driven approach, but include creative ideas for testing new ad formats and audience segments. Design A/B tests for Facebook and Google ads, including multiple variations of ad copy, creative formats, and audience targeting, and include KPIs and benchmarks to evaluate success.\"</p>\n<h4>When not to use CRISPE</h4>\n<ul>\n<li>\n<p>The task is simple and doesn't need multiple variations</p>\n</li>\n<li>\n<p>You only need one direct answer or recommendation</p>\n</li>\n<li>\n<p>Time is limited (this framework can produce longer outputs)</p>\n</li>\n<li>\n<p>You don't need tone or personality guidance</p>\n</li>\n</ul>\n<h3>7. AIDA (Attention, Interest, Desire, Action)</h3>\n<p><strong>Best for: persuasive copywriting and conversion-focused content.</strong></p>\n<h4>What is the AIDA prompt framework?</h4>\n<p>AIDA is a classic copywriting framework that structures messaging to capture attention, build interest, create desire, and drive action.</p>\n<p>AIDA is one of the best-known formulas for persuasive marketing copy, and it also works well as a prompt framework for creative tasks like landing pages, ads, email copy, and product messaging. It remains useful because it gives ChatGPT a clear persuasive sequence to follow, in line with the latest prompting guidance.</p>\n<h4>How the AIDA framework works</h4>\n<p><strong>Attention: </strong>Describe how the copy should capture the audience's attention. This is usually the hook, such as a pain point or a bold benefit.</p>\n<p><strong>Interest:</strong> Explain what should keep the audience engaged.</p>\n<p><strong>Desire: </strong>Show how the copy should build emotional or practical appeal. This is where you highlight outcomes, transformation, proof points, or reasons to want the product now.</p>\n<p><strong>Action: </strong>State the action you want the audience to take, such as buying, signing up, booking a demo, or starting a free trial.</p>\n<h4>An example of the AIDA framework in action</h4>\n<p><strong>Attention: </strong>\"Create a headline and hero section that immediately grabs attention by addressing a major customer pain point.\"&nbsp;</p>\n<p><strong>Interest: </strong>\"Write clear, engaging copy that highlights the product's key features and benefits in a way that is easy to scan.\"&nbsp;</p>\n<p><strong>Desire:</strong> \"Use persuasive messaging, outcomes, and social proof to make the product feel valuable and relevant.\"&nbsp;</p>\n<p><strong>Action: </strong>\"End with a clear, prominent call to action that encourages visitors to start a free trial.\"</p>\n<h4>Full AIDA prompt example</h4>\n<p>\"Create landing page copy for a project management SaaS product using the AIDA framework. Write a headline and hero section that immediately grabs attention by addressing a major customer pain point. Then write clear, engaging copy that highlights the product's key features and benefits in a way that is easy to scan. Use persuasive messaging, outcomes, and social proof to build desire, and end with a clear, prominent call to action that encourages visitors to start a free trial.\"</p>\n<h4>When not to use AIDA</h4>\n<ul>\n<li>\n<p>The task is analytical rather than persuasive</p>\n</li>\n<li>\n<p>You're not creating marketing or conversion-focused copy</p>\n</li>\n<li>\n<p>The audience is already highly informed and doesn't need persuasion</p>\n</li>\n<li>\n<p>You need neutral, informational content (e.g., reports, documentation)</p>\n</li>\n</ul>\n<h3>8. BAB (Before, After, Bridge)</h3>\n<p><strong>Best for: storytelling, case studies, and transformation-based marketing content.</strong></p>\n<h4>What is the BAB prompt framework?</h4>\n<p>BAB is a storytelling framework that gives ChatGPT a simple narrative arc to follow: identify the problem state, paint the improved future state, and explain how the product or service connects the two.</p>\n<p>The BAB framework is especially effective for marketing tasks that rely on transformation-based storytelling, such as case studies, customer success stories, product pages, sales copy, and campaign messaging.</p>\n<h4>How the BAB framework works</h4>\n<p><strong>Before:</strong> Describe the situation before the product, service, or solution was introduced.</p>\n<p><strong>After:</strong> Show what changed once the product or service was in place. Focus on the improved outcome, whether that is better performance, less friction, stronger results, or a better customer experience.</p>\n<p><strong>Bridge: </strong>Explain what created the transformation.</p>\n<h4>An example of the BAB framework in action</h4>\n<p><strong>Before:</strong> \"Before launching our new service, customers struggled to manage projects efficiently because their existing tools lacked integration and automation features.\"&nbsp;</p>\n<p><strong>After:</strong> \"After adopting the new service, customers reported smoother workflows, faster project turnaround times, and better team collaboration.\"&nbsp;</p>\n<p><strong>Bridge: </strong>\"The improvement came from a combination of user-friendly design, automation capabilities, seamless integrations, and strong onboarding support.\"</p>\n<h4>Full BAB prompt example</h4>\n<p>\"Write a customer success story using the BAB framework for a new project management service. Start by describing how customers struggled with outdated, disconnected tools before the launch. Then explain how the new service improved workflow efficiency, reduced turnaround times, and strengthened team collaboration. Finally, show how features such as automation, integrations, a user-friendly interface, and onboarding support helped create that transformation.\"</p>\n<h4>When not to use BAB</h4>\n<ul>\n<li>\n<p>There is no clear \"transformation\" or before/after state</p>\n</li>\n<li>\n<p>The task is purely informational or technical</p>\n</li>\n<li>\n<p>You need structured analysis rather than storytelling</p>\n</li>\n<li>\n<p>Brevity is critical and narrative framing would add unnecessary length</p>\n</li>\n</ul>\n<h2>Prompt engineering best practices to keep in mind when crafting your prompts</h2>\n<p>Writing good prompts is what separates average results from useful ones. If you want consistent output from ChatGPT, these simple habits can make a big difference:</p>\n<ul>\n<li>\n<p><strong>Use iterative refinement:</strong> Don&rsquo;t expect the first prompt to be perfect. Try a version, review the output, then adjust and run it again. Small changes often lead to much better results.</p>\n</li>\n<li>\n<p><strong>Break things down step by step:</strong> Instead of asking for everything at once, split your prompt into smaller parts per a framework. This makes it easier for the model to follow your logic and give clearer responses.&nbsp;</p>\n</li>\n<li>\n<p><strong>Be specific and explicit:</strong> General prompts lead to generic answers. Clearly state what you want, how you want it, and any constraints the model should follow.</p>\n</li>\n<li>\n<p><strong>Keep prompts simple:</strong> If your request feels too packed, it probably is. Split complex tasks into smaller prompts instead of forcing everything into one.</p>\n</li>\n<li>\n<p><strong>Give the right amount of context:</strong> Add enough background so the model understands the task, but don&rsquo;t overload it with extra details that don&rsquo;t help.</p>\n</li>\n</ul>\n<h2>Closing thoughts</h2>\n<p>The ChatGPT prompt frameworks shared above help you save time and effort while creating more effective prompts. But even the best framework may not give perfect results on the first try.</p>\n<p>What matters more is how you use them. Test different versions and keep refining until the output matches what you need. Over time, this process becomes faster and more natural, and you start getting consistent results without much trial and error.</p>\n<p>And keep in mind: AI isn't just changing how we create content, it's changing how people find it. Tools like ChatGPT and Google's AI Overviews are now pulling from sources they trust enough to cite, which means how you structure your content matters more than ever. We wrote a guide on that too. Check out <a href=\"https://buttercms.com/blog/structured-content/\">Structured Content 101: What Is It? Why Do You Need It?</a> to learn more.</p>\n"],"summary":[0,"Discover the 8 essential ChatGPT prompt frameworks to help marketers crush daily tasks, increase efficiency, and drive results."],"seoTitle":[0,"8 Must-Know ChatGPT Prompt Frameworks for Marketers"],"metaDescription":[0,"Discover the 8 essential ChatGPT prompt frameworks to help marketers crush daily tasks, increase efficiency, and drive results."],"readTimeMinutes":[0,22],"href":[0,"/blog/chatgpt-prompt-frameworks/"]}],[0,{"slug":[0,"json-serialization-in-rails-a-complete-guide"],"author":[0,{"name":[0,"Maab Saleem"],"text":[0,""],"avatarSrc":[0,"https://cdn.buttercms.com/yrU8akCQcCdsvcXzQRXE"],"bio":[0,"Maab Salem is a software engineer who's spent his 15+ year career building and scaling products used by millions, and leading engineering teams at companies ranging from multinationals to unicorns. These days he runs Scale My Vibe, an agency that helps non-technical founders turn their vibe-coded projects into something solid. He has a knack for making hard technical ideas click for a wider audience, and he's happiest when he's debugging something nobody else can figure out."],"slug":[0,"maab-saleem"],"linkedinUrl":[0,""],"twitterHandle":[0,""],"facebookUrl":[0,""],"href":[0,"/blog/author/maab-saleem/"]}],"categories":[1,[[0,{"name":[0,"CMS Developer Tutorials"],"slug":[0,"cms-developer-tutorials"],"href":[0,"/blog/category/cms-developer-tutorials/"]}]]],"tags":[1,[]],"status":[0,"published"],"published":[3,"2026-03-17T07:18:00.000Z"],"updated":[3,"2026-03-18T14:19:05.851Z"],"featuredImageSrc":[0,"https://cdn.buttercms.com/EzycKt5fSGCVgeE9mtfJ"],"featuredImageAlt":[0,"Featured Image: JSON Serialization in Rails: A Complete Guide"],"title":[0,"JSON serialization in Rails: A complete guide"],"body":[0,"<p>Since JavaScript has become the main language of the web and frontend frameworks are based on JavaScript, JSON serialization has become a very important part of many web apps. In this article, I&rsquo;m going to explain what JSON serialization is, why you may need it in your <a href=\"https://buttercms.com/headless-cms/rails-cms/\" rel=\"follow noopener\" target=\"_blank\">Rails</a> application and how to leverage existing libraries to implement JSON serialization in a concise and performant way. I will start with a high-level explanation, then discuss some of the most popular solutions, and finally model how to implement JSON serialization using the most optimal solution in a Ruby on Rails application.</p>\n<p>Basic Ruby&nbsp;knowledge will be helpful to fully understand the code presented in the tutorial.</p>\n<div class=\"section__content-aside\">\n<h4>Table of contents</h4>\n</div>\n<div class=\"section__content-main\">\n<ul>\n<li><a href=\"#What\" rel=\"follow\">What is JSON serialization?</a></li>\n<li><a href=\"#why\" rel=\"follow\">Why you need a Rails JSON serializer</a></li>\n<li><a href=\"#two-stages\" rel=\"follow\">The two stages of Rails JSON serialization</a>\n<ul>\n<li><a href=\"#stage-1\" rel=\"follow\">Stage 1: Data preparation</a></li>\n<li><a href=\"#stage-2\" rel=\"follow\">Stage 2: Transformation to JSON</a></li>\n</ul>\n</li>\n<li><a href=\"#benchmark\" rel=\"follow\">Benchmark results: Best Rails JSON serializer performance</a>\n<ul>\n<li><a href=\"#data-preparation\" rel=\"follow\">Data preparation tools ranking</a></li>\n<li><a href=\"#libraries-ranking\" rel=\"follow\">JSON serialization libraries ranking</a></li>\n</ul>\n</li>\n<li><a href=\"#implementing\" rel=\"follow\">Implementing fast JSON serialization in Ruby on Rail</a>s<br>\n<ul>\n<li><a href=\"#step-1\" rel=\"follow\">Step 1: Adding the gems</a></li>\n<li><a href=\"#step-2\" rel=\"follow\">Step 2: Creating a Rails controller with JSON responses</a></li>\n<li><a href=\"#step-3\" rel=\"follow\">Step 3: Building a Ruby on Rails serializer&nbsp;</a></li>\n<li><a href=\"#step-4\" rel=\"follow\">Step 4: Optimizing rails JSON with Oj</a></li>\n<li><a href=\"#step-5\" rel=\"follow\">Step 5: Returning JSON in Rails API endpoints</a></li>\n</ul>\n</li>\n<li><a href=\"#key\" rel=\"follow\">Key takeaways: Choosing the right Ruby on Rails serializer</a></li>\n</ul>\n</div>\n<h2 dir=\"ltr\" id=\"What\"><span style=\"font-weight: 400;\">What is JSON serialization?</span><span style=\"font-weight: 400;\"></span></h2>\n<p>JavaScript Object Notation (JSON) is a data format that encodes objects in a string. Such data representation can easily be translated between servers and browsers. Serialization in Rails, and other languages, is a process that transforms an object into that string.&nbsp;</p>\n<p>If you&rsquo;re looking to streamline the initial setup of your Rails projects, consider checking out the <a href=\"/starters/rails-starter-project/\" rel=\"follow noopener\" target=\"_blank\">ButterCMS Rails starter project</a>. While it&rsquo;s not directly related to serialization, it provides a solid foundation to get your application up and running faster, allowing you to focus on building out your features with ease.</p>\n<h2 dir=\"ltr\" id=\"why\"><span style=\"font-weight: 400;\">Why you need a Rails JSON serializer</span></h2>\n<p>In Rails, you can use a serializer to define how data from your models should be formatted when sent as a response in JSON. It acts as a blueprint to control what attributes or relationships of a model are included in the output.&nbsp;</p>\n<p>This is particularly handy for APIs, where you need to send structured data to clients. For example, instead of exposing the entire model, you can choose specific fields or even modify how certain attributes appear in the response.</p>\n<p>To make matters easier for developers, Rails ships with a native serializer known as the&nbsp;<a href=\"https://github.com/rails-api/active_model_serializers\" rel=\"nofollow noopener\" target=\"_blank\">Active Model Serializer</a>&nbsp;(gem &lsquo;active_model_serializers&rsquo;). It&rsquo;s open-source, well-documented, extensible, and easy to use.</p>\n<h2 dir=\"ltr\" id=\"two-stages\"><span style=\"font-weight: 400;\">The two stages of Rails JSON serialization</span><span style=\"font-weight: 400;\"></span></h2>\n<p>The JSON serialization process consists of two stages: data preparation and transformation to the JSON format.&nbsp;</p>\n<p>&nbsp;In the first stage (data preparation), we define how we want our data to be serialized. In the second step (transformation), the actual serialization takes place.&nbsp;</p>\n<h3 dir=\"ltr\" id=\"stage-1\"><span style=\"font-weight: 400;\">Stage 1: Data preparation</span></h3>\n<p>In this stage, we define an <code>attributes</code> hash that lists the fields to include in the serialized output of the object. The keys of this hash must be strings (not symbols), and their corresponding values can be nil initially.</p>\n<p>When serialization is triggered, the <code>attributes</code> hash is checked to determine what data to include. The serializer uses instance methods with names matching the keys in the attributes hash to fetch the data. Let&rsquo;s consider a simple example:</p>\n<pre><code class=\"hljs language-ruby\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title class_\">Person</span>\n <span class=\"hljs-keyword\">include</span> <span class=\"hljs-title class_\">ActiveModel::Serialization</span>\n\n <span class=\"hljs-built_in\">attr_accessor</span> <span class=\"hljs-symbol\">:name</span>\n <span class=\"hljs-built_in\">attr_accessor</span> <span class=\"hljs-symbol\">:age</span>\n\n <span class=\"hljs-keyword\">def</span> <span class=\"hljs-title function_\">attributes</span>\n\t{ <span class=\"hljs-string\">&#x27;name&#x27;</span> =&gt; <span class=\"hljs-literal\">nil</span> }\n <span class=\"hljs-keyword\">end</span>\n<span class=\"hljs-keyword\">end</span>\n\nperson = <span class=\"hljs-title class_\">Person</span>.new\nperson.serializable_hash <span class=\"hljs-comment\"># =&gt; {&quot;name&quot;=&gt;nil}</span>\nperson.name = <span class=\"hljs-string\">&quot;Bob&quot;</span>\nperson.serializable_hash <span class=\"hljs-comment\"># =&gt; {&quot;name&quot;=&gt;&quot;Bob&quot;}</span>\n</code></pre>\n<p>Here, the&nbsp;<code>attributes</code>&nbsp;hash acts as a blueprint for the data preparation stage.&nbsp;</p>\n<p><span style=\"font-weight: 400;\">Here is the full list of best practices that you should stick to when preparing data in order to have good performance:</span></p>\n<ul>\n<li style=\"font-weight: 400;\"><b>Choose only those attributes you really need in the JSON response</b><span style=\"font-weight: 400;\">. The easiest way to do this in Rails is to call the </span><code><span style=\"font-weight: 400;\">#to_json</span></code><span style=\"font-weight: 400;\"> method on a model instance and pass only </span><code><span style=\"font-weight: 400;\">:option</span></code><span style=\"font-weight: 400;\"> which contains the array of attributes names you really need: </span><code><span style=\"font-weight: 400;\">person.to_json(only: [:email, :name])</span></code></li>\n<li style=\"font-weight: 400;\"><b>Consider truncating long content</b><span style=\"font-weight: 400;\">. In the case that you need to display many records in a list, you may truncate descriptions or values to fit more records on the page. This truncation logic is best done on the backend, so that the frontend is only responsible for displaying the information.</span></li>\n<li style=\"font-weight: 400;\"><b>Ensure attribute names are descriptive</b><span style=\"font-weight: 400;\">. If you are working on an existing app and you have to deal with poorly named attributes, take care to use more descriptive names &nbsp;in the JSON response so it&rsquo;s obvious on the frontend what a given field contains by only looking at its name.</span></li>\n<li style=\"font-weight: 400;\"><b>Choose included associations wisely</b>. Think about the attributes you really need when including associations. Loading unnecessary associations data is an easy way to slow down your data preparation process.</li>\n</ul>\n<h4 style=\"font-weight: 400;\">Popular Rails JSON serializer gems (comparison)</h4>\n<p>Ruby on Rails offers several gems to simplify and customize data preparation for your application. While their APIs share some similarities, each gem has distinct features and capabilities. In this guide, I&rsquo;ll cover some of the most popular data preparation tools and compare them to help you decide on the best solution for your needs.</p>\n<p>If you want to test the code examples below on your side, you can generate a new Rails project and the models by using the following code:</p>\n<pre><code class=\"hljs language-vbnet\">gem install rails\nrails <span class=\"hljs-built_in\">new</span> jsontest\ncd jsontest\nbundle exec rake db:create\nbundle exec rails g model post title:<span class=\"hljs-type\">string</span> content:<span class=\"hljs-keyword\">text</span> published:<span class=\"hljs-type\">boolean</span>\nbundle exec rails g model comment author:<span class=\"hljs-type\">string</span> body:<span class=\"hljs-keyword\">text</span> post_id:<span class=\"hljs-type\">integer</span>\nbundle exec rake db:migrate\n\n# app/models/post.rb\n\n<span class=\"hljs-keyword\">class</span> Post &lt; ActiveRecord::Base\n has_many :comments\n<span class=\"hljs-keyword\">end</span>\n\n# app/models/comment.rb\n\n<span class=\"hljs-keyword\">class</span> Comment &lt; ActiveRecord::Base\n belongs_to :post\n<span class=\"hljs-keyword\">end</span>\n\n# <span class=\"hljs-keyword\">Let</span><span class=\"hljs-comment\">&#x27;s load the test data - bundle exec rails c</span>\n\npost = Post.create!(title: <span class=\"hljs-string\">&quot;Post&quot;</span>, content: <span class=\"hljs-string\">&quot;content&quot;</span>, published: <span class=\"hljs-literal\">true</span>)\nComment.create!(post: post, author: <span class=\"hljs-string\">&quot;Author&quot;</span>, body: <span class=\"hljs-string\">&quot;Comment&quot;</span>)\n</code></pre>\n<p><a href=\"https://api.rubyonrails.org/classes/ActiveModel/Serialization.html\" rel=\"nofollow noopener\" target=\"_blank\"><span style=\"font-weight: 400;\">Active Model Serializers</span></a></p>\n<p><span style=\"font-weight: 400;\"><code>ActiveModel::Serialization</code> implementation is the native serialization method in Rails. It&rsquo;s also the most popular. Let&rsquo;s start with adding the gem into our Gemfile:</span><span style=\"font-weight: 400;\"></span></p>\n<pre><code class=\"hljs language-bash\">gem <span class=\"hljs-string\">&#x27;active_model_serializers&#x27;</span></code></pre>\n<p>Now, here&rsquo;s how we can update our Post and Comment models to make them serializable:&nbsp;</p>\n<pre><code class=\"hljs language-ruby\"><span class=\"hljs-comment\"># app/serializers/post_serializer.rb</span>\n\n<span class=\"hljs-keyword\">class</span> <span class=\"hljs-title class_\">PostSerializer</span>\n <span class=\"hljs-keyword\">include</span> <span class=\"hljs-title class_\">ActiveModel::Serializers::JSON</span>\n\n <span class=\"hljs-built_in\">attr_accessor</span> <span class=\"hljs-symbol\">:id</span>, <span class=\"hljs-symbol\">:title</span>, <span class=\"hljs-symbol\">:content</span>, <span class=\"hljs-symbol\">:comments</span>\n\n <span class=\"hljs-keyword\">def</span> <span class=\"hljs-title function_\">attributes</span>\n\t{ <span class=\"hljs-string\">&#x27;id&#x27;</span> =&gt; <span class=\"hljs-literal\">nil</span>, <span class=\"hljs-string\">&#x27;title&#x27;</span> =&gt; <span class=\"hljs-literal\">nil</span>, <span class=\"hljs-string\">&#x27;content&#x27;</span> =&gt; <span class=\"hljs-literal\">nil</span>, <span class=\"hljs-string\">&#x27;comments&#x27;</span> =&gt; <span class=\"hljs-literal\">nil</span> }\n <span class=\"hljs-keyword\">end</span>\n\n <span class=\"hljs-keyword\">def</span> <span class=\"hljs-title function_\">comments</span>\n\t<span class=\"hljs-variable\">@comments</span>.map { |<span class=\"hljs-params\">comment</span>| comment.serializable_hash }\n <span class=\"hljs-keyword\">end</span>\n<span class=\"hljs-keyword\">end</span>\n\n<span class=\"hljs-comment\"># app/serializers/comment_serializer.rb</span>\n<span class=\"hljs-keyword\">class</span> <span class=\"hljs-title class_\">CommentSerializer</span>\n <span class=\"hljs-keyword\">include</span> <span class=\"hljs-title class_\">ActiveModel::Serializers::JSON</span>\n\n <span class=\"hljs-built_in\">attr_accessor</span> <span class=\"hljs-symbol\">:id</span>, <span class=\"hljs-symbol\">:body</span>, <span class=\"hljs-symbol\">:author</span>\n\n <span class=\"hljs-keyword\">def</span> <span class=\"hljs-title function_\">attributes</span>\n\t{ <span class=\"hljs-string\">&#x27;id&#x27;</span> =&gt; <span class=\"hljs-literal\">nil</span>, <span class=\"hljs-string\">&#x27;body&#x27;</span> =&gt; <span class=\"hljs-literal\">nil</span>, <span class=\"hljs-string\">&#x27;author&#x27;</span> =&gt; <span class=\"hljs-literal\">nil</span> }\n <span class=\"hljs-keyword\">end</span>\n<span class=\"hljs-keyword\">end</span>\n</code></pre>\n<p>With the above changes made, we can test our serializers this way:</p>\n<pre><code class=\"hljs language-swift\"># <span class=\"hljs-type\">Testing</span> the serializers\ncomment1 <span class=\"hljs-operator\">=</span> <span class=\"hljs-type\">CommentSerializer</span>.new\ncomment1.id <span class=\"hljs-operator\">=</span> <span class=\"hljs-number\">201</span>\ncomment1.body <span class=\"hljs-operator\">=</span> <span class=\"hljs-string\">&quot;Comment&quot;</span>\ncomment1.author <span class=\"hljs-operator\">=</span> <span class=\"hljs-string\">&quot;Author&quot;</span>\n\npost <span class=\"hljs-operator\">=</span> <span class=\"hljs-type\">PostSerializer</span>.new\npost.id <span class=\"hljs-operator\">=</span> <span class=\"hljs-number\">12</span>\npost.title <span class=\"hljs-operator\">=</span> <span class=\"hljs-string\">&quot;Post&quot;</span>\npost.content <span class=\"hljs-operator\">=</span> <span class=\"hljs-string\">&quot;content&quot;</span>\npost.comments <span class=\"hljs-operator\">=</span> [comment1]\n\npost.serializable_hash\n# <span class=\"hljs-operator\">=&gt;</span> {<span class=\"hljs-string\">&quot;id&quot;</span><span class=\"hljs-operator\">=&gt;</span><span class=\"hljs-number\">12</span>, <span class=\"hljs-string\">&quot;title&quot;</span><span class=\"hljs-operator\">=&gt;</span><span class=\"hljs-string\">&quot;Post&quot;</span>, <span class=\"hljs-string\">&quot;content&quot;</span><span class=\"hljs-operator\">=&gt;</span><span class=\"hljs-string\">&quot;content&quot;</span>, <span class=\"hljs-string\">&quot;comments&quot;</span><span class=\"hljs-operator\">=&gt;</span>[{<span class=\"hljs-string\">&quot;id&quot;</span><span class=\"hljs-operator\">=&gt;</span><span class=\"hljs-number\">201</span>, <span class=\"hljs-string\">&quot;body&quot;</span><span class=\"hljs-operator\">=&gt;</span><span class=\"hljs-string\">&quot;Comment&quot;</span>, <span class=\"hljs-string\">&quot;author&quot;</span><span class=\"hljs-operator\">=&gt;</span><span class=\"hljs-string\">&quot;Author&quot;</span>}]}\n\npost.to_json\n# <span class=\"hljs-operator\">=&gt;</span> <span class=\"hljs-string\">&quot;{<span class=\"hljs-subst\">\\&quot;</span>id<span class=\"hljs-subst\">\\&quot;</span>:12,<span class=\"hljs-subst\">\\&quot;</span>title<span class=\"hljs-subst\">\\&quot;</span>:<span class=\"hljs-subst\">\\&quot;</span>Post<span class=\"hljs-subst\">\\&quot;</span>,<span class=\"hljs-subst\">\\&quot;</span>content<span class=\"hljs-subst\">\\&quot;</span>:<span class=\"hljs-subst\">\\&quot;</span>content<span class=\"hljs-subst\">\\&quot;</span>,<span class=\"hljs-subst\">\\&quot;</span>comments<span class=\"hljs-subst\">\\&quot;</span>:[{<span class=\"hljs-subst\">\\&quot;</span>id<span class=\"hljs-subst\">\\&quot;</span>:201,<span class=\"hljs-subst\">\\&quot;</span>body<span class=\"hljs-subst\">\\&quot;</span>:<span class=\"hljs-subst\">\\&quot;</span>Comment<span class=\"hljs-subst\">\\&quot;</span>,<span class=\"hljs-subst\">\\&quot;</span>author<span class=\"hljs-subst\">\\&quot;</span>:<span class=\"hljs-subst\">\\&quot;</span>Author<span class=\"hljs-subst\">\\&quot;</span>}]}&quot;</span>\n</code></pre>\n<p><a href=\"http://jsonapi-rb.org/\" rel=\"nofollow noopener\" target=\"_blank\"><span style=\"font-weight: 400;\">JSONAPI-RB</span></a></p>\n<p><span style=\"font-weight: 400;\">The </span><a href=\"https://github.com/jsonapi-rb/jsonapi-rb\"><span style=\"font-weight: 400;\">jsonapi-rb</span></a><span style=\"font-weight: 400;\"> is an intuitive Ruby library, comprised of 4 independent micro-libraries: </span><a href=\"https://github.com/jsonapi-rb/parser\" rel=\"nofollow noopener\" target=\"_blank\"><span style=\"font-weight: 400;\">jsonapi-parser</span></a><span style=\"font-weight: 400;\">, </span><a href=\"https://github.com/jsonapi-rb/renderer\" rel=\"nofollow noopener\" target=\"_blank\"><span style=\"font-weight: 400;\">jsonapi-renderer</span></a><span style=\"font-weight: 400;\">, </span><a href=\"https://github.com/jsonapi-rb/serializable\" rel=\"nofollow noopener\" target=\"_blank\"><span style=\"font-weight: 400;\">jsonapi-serializable</span></a><span style=\"font-weight: 400;\"> and </span><a href=\"https://github.com/jsonapi-rb/deserializable\" rel=\"nofollow noopener\" target=\"_blank\"><span style=\"font-weight: 400;\">jsonapi-deserializable</span></a><span style=\"font-weight: 400;\">.</span></p>\n<p><span style=\"font-weight: 400;\">Let&rsquo;s add the gem to our Gemfile:</span></p>\n<pre>gem 'jsonapi-rails'</pre>\n<p><span style=\"font-weight: 400;\">Now, we have to update our serializers stored under </span><code><span style=\"font-weight: 400;\">app/serializers/post_serializer.rb</span></code><span style=\"font-weight: 400;\"> and </span><code><span style=\"font-weight: 400;\">app/serializers/comment_serializer.rb</span></code><span style=\"font-weight: 400;\"> paths:</span></p>\n<pre># app/serializers/post_serializer.rb\n\nclass PostSerializer &lt; JSONAPI::Serializable::Resource\n type 'posts'\n has_many :comments\n attributes :id, :title, :content\nend\n\n# app/serializers/comment_serializer.rb\n\nclass CommentSerializer &lt; JSONAPI::Serializable::Resource\n type 'comments'\n\n attributes :id, :author, :body\nend</pre>\n<p><span style=\"font-weight: 400;\">We are ready to test our serializers:</span></p>\n<pre>post = Post.joins(:comments).first\nrenderer = JSONAPI::Serializable::Renderer.new\nrenderer.render(post, class: { Post: PostSerializer, Comment: CommentSerializer }, include: [:comments]) # =&gt; {:data=&gt;{:id=&gt;\"113\", :type=&gt;:posts, :attributes=&gt;{:id=&gt;113,\n:title=&gt;\"Post\",\n:content=&gt;\"content\"},\n:relationships=&gt;{:comments=&gt;{:data=&gt;[{:type=&gt;:comments, \n:id=&gt;\"2702\"}]}}}, :included=&gt;[{:id=&gt;\"2702\", :type=&gt;:comments, \n:attributes=&gt;{:id=&gt;2702, :author=&gt;\"Author\", :body=&gt;\"Comment\"}}]}</pre>\n<p><a href=\"https://github.com/Netflix/fast_jsonapi\" rel=\"nofollow noopener\" target=\"_blank\"><span style=\"font-weight: 400;\">Fast JSON API</span></a></p>\n<p><span style=\"font-weight: 400;\">The lib is a lightning fast JSON:API serializer for Ruby Objects created by Netflix.</span></p>\n<p><span style=\"font-weight: 400;\">Let&rsquo;s add the gem to our Gemfile:</span></p>\n<pre>gem 'fast_jsonapi'</pre>\n<p><span style=\"font-weight: 400;\">The next step is to update our serializers to use Fast JSON API gem:</span></p>\n<pre># app/serializers/post_serializer.rb\n\nclass PostSerializer\n include FastJsonapi::ObjectSerializer\n attributes :title, :content\n has_many :comments\nend\n\n# app/serializers/comment_serializer.rb\n\nclass CommentSerializer\n include FastJsonapi::ObjectSerializer\n attributes :id, :body, :author\nend</pre>\n<p><span style=\"font-weight: 400;\">Now, we can prepare our data for serialization:</span></p>\n<pre>post = Post.joins(:comments).first\nPostSerializer.new(post, include: [:comments]).serializable_hash # =&gt; \n{:data=&gt;{:id=&gt;\"12\", :type=&gt;:post, :attributes=&gt;{:title=&gt;\"Post\", \n:content=&gt;\"content\"}, :relationships=&gt;{:comments=&gt;{:data=&gt;[{:id=&gt;\"201\", :type=&gt;:comment}]}}}, :included=&gt;[{:id=&gt;\"201\", :type=&gt;:comment, \n:attributes=&gt;{:id=&gt;201, :body=&gt;\"Comment\", :author=&gt;\"Author\"}}]}<span style=\"font-weight: 400;\"></span><span style=\"font-weight: 400;\"></span></pre>\n<p style=\"text-align: left;\"><span style=\"font-weight: 400;\"><a href=\"https://github.com/fotinakis/jsonapi-serializers\" rel=\"nofollow noopener\" target=\"_blank\">JSON API Serializers</a></span></p>\n<p style=\"text-align: left;\"><span style=\"font-weight: 400;\"></span><span style=\"font-weight: 400;\">JSONAPI: Serializers is a simple library for serializing Ruby objects and their relationships.</span></p>\n<p style=\"text-align: left;\"><span style=\"font-weight: 400;\">Add the following line to your Gemfile:</span></p>\n<pre>gem 'jsonapi-serializers'</pre>\n<p><span style=\"font-weight: 400;\">Now, we have to update the existing serializers that we created above:</span></p>\n<pre># app/serializers/post_serializer.rb\n\nclass PostSerializer\n include JSONAPI::Serializer\n\n attribute :id\n attribute :title\n attribute :content\n\n has_many :comments\nend\n\n# app/serializers/comment_serializer.rb\n\nclass CommentSerializer\n include JSONAPI::Serializer\n\n attribute :id\n attribute :author\n attribute :body\nend</pre>\n<p><span style=\"font-weight: 400;\">and we can generate the data for our JSON response:</span></p>\n<pre>post = Post.joins(:comments).first\nJSONAPI::Serializer.serialize(post, include: ['comments']) # =&gt;\n{\"data\"=&gt;{\"type\"=&gt;\"posts\", \"id\"=&gt;\"12\", \"attributes\"=&gt;{\"id\"=&gt;12,\n\"title\"=&gt;\"Post\", \"content\"=&gt;\"content\"}, \"links\"=&gt;{\"self\"=&gt;\"/posts/12\"}, \n\"relationships\"=&gt;{\"comments\"=&gt;{\"links\"=&gt;{\"self\"=&gt;\"/posts/12/relationships/comments\", \"related\"=&gt;\"/posts/12/comments\"}, \n\"data\"=&gt;[{\"type\"=&gt;\"comments\", \"id\"=&gt;\"201\"}]}}}, \n\"included\"=&gt;[{\"type\"=&gt;\"comments\", \"id\"=&gt;\"201\", \n\"attributes\"=&gt;{\"id\"=&gt;201, \n\"author\"=&gt;\"Author\", \"body\"=&gt;\"Comment\"}, \n\"links\"=&gt;{\"self\"=&gt;\"/comments/201\"}}]}</pre>\n<p><span style=\"font-weight: 400;\"><a href=\"https://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/Serialization/ClassMethods.html\" rel=\"nofollow noopener\" target=\"_blank\">Active Record Serialization</a></span></p>\n<p>The <strong>ActiveRecord </strong>component provides built-in support for serializing attributes directly in the database. This is done using the <code>serialize</code> method, which can handle formats like JSON, YAML, or even custom serializers. If you want to serialize a class to your database, this is the functionality you should use.&nbsp;</p>\n<p>For example, here&rsquo;s how you could implement custom JSON serialization for a sample class:</p>\n<pre><code class=\"hljs language-ruby\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title class_\">Profile</span>\n <span class=\"hljs-built_in\">attr_reader</span> <span class=\"hljs-symbol\">:bio</span>, <span class=\"hljs-symbol\">:website</span>, <span class=\"hljs-symbol\">:social_links</span>\n\n <span class=\"hljs-comment\"># Deserialize JSON data into a Profile instance</span>\n <span class=\"hljs-keyword\">def</span> <span class=\"hljs-title function_\">self</span>.load(payload)\n\tdata = payload.present? ? <span class=\"hljs-variable constant_\">JSON</span>.parse(payload) : {}\n\tnew(data[<span class=\"hljs-string\">&quot;bio&quot;</span>], data[<span class=\"hljs-string\">&quot;website&quot;</span>], data[<span class=\"hljs-string\">&quot;social_links&quot;</span>])\n <span class=\"hljs-keyword\">end</span>\n\n <span class=\"hljs-comment\"># Serialize a Profile instance into JSON</span>\n <span class=\"hljs-keyword\">def</span> <span class=\"hljs-title function_\">self</span>.dump(profile)\n\t<span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">if</span> profile.<span class=\"hljs-literal\">nil</span>?\n\n\t<span class=\"hljs-variable constant_\">JSON</span>.dump(\n \t{\n \t<span class=\"hljs-string\">&quot;bio&quot;</span> =&gt; profile.bio,\n \t<span class=\"hljs-string\">&quot;website&quot;</span> =&gt; profile.website,\n \t<span class=\"hljs-string\">&quot;social_links&quot;</span> =&gt; profile.social_links\n \t}\n\t)\n <span class=\"hljs-keyword\">end</span>\n\n <span class=\"hljs-keyword\">def</span> <span class=\"hljs-title function_\">initialize</span>(<span class=\"hljs-params\">bio, website, social_links = {}</span>)\n\t<span class=\"hljs-variable\">@bio</span> = bio\n\t<span class=\"hljs-variable\">@website</span> = website\n\t<span class=\"hljs-variable\">@social_links</span> = social_links\n <span class=\"hljs-keyword\">end</span>\n<span class=\"hljs-keyword\">end</span>\n\n<span class=\"hljs-keyword\">class</span> <span class=\"hljs-title class_\">User</span> &lt; <span class=\"hljs-title class_ inherited__\">ActiveRecord::Base</span>\n <span class=\"hljs-comment\"># Use the Profile class for custom serialization with JSON</span>\n serialize <span class=\"hljs-symbol\">:profile</span>, <span class=\"hljs-symbol\">coder:</span> <span class=\"hljs-title class_\">Profile</span>\n<span class=\"hljs-keyword\">end</span>\n</code></pre>\n<p>After saving the user, the <code>profile</code> column in the database will contain JSON data like this:</p>\n<pre><code class=\"hljs language-json\"><span class=\"hljs-punctuation\">{</span>\n <span class=\"hljs-attr\">&quot;bio&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;Ruby developer and tech enthusiast.&quot;</span><span class=\"hljs-punctuation\">,</span>\n <span class=\"hljs-attr\">&quot;website&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;https://janedoe.dev&quot;</span><span class=\"hljs-punctuation\">,</span>\n <span class=\"hljs-attr\">&quot;social_links&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-punctuation\">{</span>\n\t<span class=\"hljs-attr\">&quot;twitter&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;jane_doe&quot;</span><span class=\"hljs-punctuation\">,</span>\n\t<span class=\"hljs-attr\">&quot;github&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;janedoe&quot;</span>\n <span class=\"hljs-punctuation\">}</span>\n<span class=\"hljs-punctuation\">}</span>\n</code></pre>\n<p></p>\n<h3 dir=\"ltr\" id=\"stage-2\"><span style=\"font-weight: 400;\">Stage 2: Transformation to JSON</span></h3>\n<p>After data preparation, the object is serialized into JSON or other formats. This process converts the hash generated in the preparation stage into a final JSON string. Rails provides methods like <code>to_json</code> and <code>as_json</code> for this purpose. Here&rsquo;s an example of how a typical JSON serialization looks:</p>\n<pre><code class=\"hljs language-ruby\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title class_\">Person</span>\n <span class=\"hljs-keyword\">include</span> <span class=\"hljs-title class_\">ActiveModel::Serializers::JSON</span>\n\n <span class=\"hljs-built_in\">attr_accessor</span> <span class=\"hljs-symbol\">:name</span>\n <span class=\"hljs-built_in\">attr_accessor</span> <span class=\"hljs-symbol\">:age</span>\n\n <span class=\"hljs-keyword\">def</span> <span class=\"hljs-title function_\">attributes</span>\n\t{ <span class=\"hljs-string\">&#x27;name&#x27;</span> =&gt; <span class=\"hljs-literal\">nil</span> }\n <span class=\"hljs-keyword\">end</span>\n<span class=\"hljs-keyword\">end</span>\n\nperson = <span class=\"hljs-title class_\">Person</span>.new\nperson.to_json \t<span class=\"hljs-comment\"># =&gt; &quot;{\\&quot;name\\&quot;:null}&quot;</span>\nperson.name = <span class=\"hljs-string\">&quot;Bob&quot;</span>\nperson.to_json \t<span class=\"hljs-comment\"># =&gt; &quot;{\\&quot;name\\&quot;:\\&quot;Bob\\&quot;}&quot;</span>\n</code></pre>\n<p>Rails also supports options like <code>:only</code>, <code>:except</code>, <code>:methods</code>, and <code>:include</code> to customize the serialized output. For example:</p>\n<pre><code class=\"hljs language-go\">person.serializable_hash(only: <span class=\"hljs-string\">&#x27;name&#x27;</span>) \t# =&gt; {<span class=\"hljs-string\">&quot;name&quot;</span>=&gt;<span class=\"hljs-string\">&quot;Bob&quot;</span>}\nperson.serializable_hash(include: :address) \t# =&gt; {<span class=\"hljs-string\">&quot;name&quot;</span>=&gt;<span class=\"hljs-string\">&quot;Bob&quot;</span>, <span class=\"hljs-string\">&quot;address&quot;</span>=&gt;...}\n</code></pre>\n<h4>Ruby gems for JSON transformation</h4>\n<p>Next, we will explore the different Ruby gems that can be used to implement serialization, i.e., the transformation of the generated hash to the JSON format.&nbsp;</p>\n<p>Read also: <a href=\"https://buttercms.com/blog/ruby-app-tutorial-building-landing-pages-with-buttercms/\" rel=\"follow noopener\" target=\"_blank\">How to build landing pages with Ruby and ButterCMS</a></p>\n<p><a href=\"https://github.com/ohler55/oj\" rel=\"nofollow noopener\" target=\"_blank\">Oj</a> (fastest Rails JSON serializer)</p>\n<p><span style=\"font-weight: 400;\">Oj is a fast JSON parser and Object marshaller as a Ruby gem. Let&rsquo;s add the new line to our Gemfile in order to install it:</span></p>\n<pre><code class=\"hljs language-bash\">gem <span class=\"hljs-string\">&#x27;oj&#x27;</span></code></pre>\n<p><span style=\"font-weight: 400;\">Now we can try to transform a hash to the JSON format:</span></p>\n<pre><code class=\"hljs language-swift\">hash <span class=\"hljs-operator\">=</span> {name: <span class=\"hljs-string\">&quot;John Doe&quot;</span>, email: <span class=\"hljs-string\">&quot;john@doe.com&quot;</span>}\n<span class=\"hljs-type\">Oj</span>.dump(hash) # <span class=\"hljs-operator\">=&gt;</span> <span class=\"hljs-string\">&quot;{<span class=\"hljs-subst\">\\&quot;</span>name<span class=\"hljs-subst\">\\&quot;</span>:<span class=\"hljs-subst\">\\&quot;</span>John Doe<span class=\"hljs-subst\">\\&quot;</span>,<span class=\"hljs-subst\">\\&quot;</span>email<span class=\"hljs-subst\">\\&quot;</span>:<span class=\"hljs-subst\">\\&quot;</span>john@doe.com<span class=\"hljs-subst\">\\&quot;</span>}&quot;</span></code></pre>\n<p><a href=\"http://ruby-doc.org/stdlib-2.0.0/libdoc/json/rdoc/JSON.html\" rel=\"nofollow noopener\" target=\"_blank\">JSON</a><span style=\"font-weight: 400;\">&nbsp;(Standard) </span></p>\n<p><span style=\"font-weight: 400;\">The JSON library is a standard serialization library for Ruby, so we can try it directly in our console without adding any extra code:</span></p>\n<pre><code class=\"hljs language-swift\">hash <span class=\"hljs-operator\">=</span> {name: <span class=\"hljs-string\">&quot;John Doe&quot;</span>, email: <span class=\"hljs-string\">&quot;john@doe.com&quot;</span>}\n<span class=\"hljs-type\">JSON</span>.generate(hash) # <span class=\"hljs-operator\">=&gt;</span> <span class=\"hljs-string\">&quot;{<span class=\"hljs-subst\">\\&quot;</span>name<span class=\"hljs-subst\">\\&quot;</span>:<span class=\"hljs-subst\">\\&quot;</span>John Doe<span class=\"hljs-subst\">\\&quot;</span>,<span class=\"hljs-subst\">\\&quot;</span>email<span class=\"hljs-subst\">\\&quot;</span>:<span class=\"hljs-subst\">\\&quot;</span>john@doe.com<span class=\"hljs-subst\">\\&quot;</span>}&quot;</span></code></pre>\n<p><a href=\"https://github.com/brianmario/yajl-ruby\" rel=\"nofollow noopener\" target=\"_blank\"><span style=\"font-weight: 400;\">Yajl</span></a></p>\n<p><span style=\"font-weight: 400;\">Yajl is a streaming JSON parsing and encoding library for Ruby.</span></p>\n<p><span style=\"font-weight: 400;\">We have to bundle the gem before we can try it:</span></p>\n<pre><code class=\"hljs language-bash\">gem <span class=\"hljs-string\">&#x27;yajl-ruby&#x27;</span></code></pre>\n<p><span style=\"font-weight: 400;\">Now we can serialize a sample hash:</span></p>\n<pre><code class=\"hljs language-swift\">require &#x27;yajl&#x27;\n\nhash <span class=\"hljs-operator\">=</span> {name: <span class=\"hljs-string\">&quot;John Doe&quot;</span>, email: <span class=\"hljs-string\">&quot;john@doe.com&quot;</span>}\n<span class=\"hljs-type\">Yajl</span>::<span class=\"hljs-type\">Encoder</span>.encode(hash) # <span class=\"hljs-operator\">=&gt;</span> <span class=\"hljs-string\">&quot;{<span class=\"hljs-subst\">\\&quot;</span>name<span class=\"hljs-subst\">\\&quot;</span>:<span class=\"hljs-subst\">\\&quot;</span>John Doe<span class=\"hljs-subst\">\\&quot;</span>,<span class=\"hljs-subst\">\\&quot;</span>email<span class=\"hljs-subst\">\\&quot;</span>:<span class=\"hljs-subst\">\\&quot;</span>john@doe.com<span class=\"hljs-subst\">\\&quot;</span>}&quot;</span></code></pre>\n<h2 dir=\"ltr\" id=\"benchmark\"><span style=\"font-weight: 400;\">Benchmark results: Best Rails JSON serializer performance</span></h2>\n<p><span style=\"font-weight: 400;\">At this point, we&rsquo;ve gone through the most popular data preparation and JSON serialization tools. Now, it&rsquo;s time to choose the most performant pair. I will compare the speed of data preparation and JSON serialization using the code presented in the above paragraphs.</span></p>\n<p><span style=\"font-weight: 400;\">To test, I will create 100 </span><code><span style=\"font-weight: 400;\">Post</span></code><span style=\"font-weight: 400;\"> objects and each post will have 25 comments:</span></p>\n<pre><code class=\"hljs language-ruby\"><span class=\"hljs-number\">100</span>.times <span class=\"hljs-keyword\">do</span> |<span class=\"hljs-params\">i</span>|\n post = <span class=\"hljs-title class_\">Post</span>.create!(<span class=\"hljs-symbol\">title:</span> <span class=\"hljs-string\">&quot;Title <span class=\"hljs-subst\">#{i}</span>&quot;</span>, <span class=\"hljs-symbol\">content:</span> <span class=\"hljs-string\">&quot;Content <span class=\"hljs-subst\">#{i}</span>&quot;</span>)\n <span class=\"hljs-number\">25</span>.times <span class=\"hljs-keyword\">do</span> |<span class=\"hljs-params\">i2</span>|\n <span class=\"hljs-title class_\">Comment</span>.create!(<span class=\"hljs-symbol\">post:</span> post, <span class=\"hljs-symbol\">author:</span> <span class=\"hljs-string\">&quot;Author <span class=\"hljs-subst\">#{i2}</span>&quot;</span>, <span class=\"hljs-symbol\">body:</span> <span class=\"hljs-string\">&quot;Comment <span class=\"hljs-subst\">#{i2}</span>&quot;</span>)\n <span class=\"hljs-keyword\">end</span>\n<span class=\"hljs-keyword\">end</span></code></pre>\n<p><span style=\"font-weight: 400;\">I will use Ruby Benchmark module to compare the data preparation time for each tool.</span></p>\n<h3 dir=\"ltr\" id=\"data-preparation\"><span style=\"font-weight: 400;\">Data preparation tools ranking</span><span style=\"font-weight: 400;\"></span></h3>\n<p><span style=\"font-weight: 400;\">Below are the solutions ranked fastest to slowest:</span></p>\n<table border=\"1\" style=\"border-collapse: collapse; width: 94.5969%; height: 509.375px; border-style: solid; border-width: 1px;\"><colgroup><col style=\"width: 103px;\"><col style=\"width: 103px;\"></colgroup>\n<tbody>\n<tr style=\"height: 85px; background-color: #5050ff;\">\n<td style=\"border-width: 1px;\"><strong><span style=\"color: #ffffff;\">Solution name</span></strong></td>\n<td style=\"border-width: 1px;\"><span style=\"color: #ffffff;\"><strong>Time</strong></span></td>\n</tr>\n<tr style=\"height: 85px; background-color: #f0fcff;\">\n<td style=\"border-width: 1px;\"><strong>Fast JSON API</strong></td>\n<td style=\"border-width: 1px;\"><strong>.121921s</strong></td>\n</tr>\n<tr style=\"height: 85px;\">\n<td style=\"border-width: 1px;\"><strong>JSON API Serializers</strong></td>\n<td style=\"border-width: 1px;\"><strong>.262120s</strong></td>\n</tr>\n<tr style=\"height: 85px; background-color: #f0fcff;\">\n<td style=\"border-width: 1px;\"><strong>Active Model Serializers</strong></td>\n<td style=\"border-width: 1px;\"><strong>.154672s</strong></td>\n</tr>\n<tr style=\"height: 85px;\">\n<td style=\"border-width: 1px;\"><strong>JSONAPI-RB</strong></td>\n<td style=\"border-width: 1px;\"><strong>.246346s</strong></td>\n</tr>\n</tbody>\n</table>\n<p><span style=\"font-weight: 400;\"></span></p>\n<p><span style=\"font-weight: 400;\">The fastest solution is the Fast JSON API. </span><span style=\"font-weight: 400;\">Fortunately, FAST JSON API is also very intuitive and does not require any extra configuration. All we need to do to start using it is define attributes and associations for given model.</span></p>\n<p><span style=\"font-weight: 400;\">The code used for tests is </span><a href=\"https://gist.github.com/ssut/10734921\" rel=\"nofollow noopener\" target=\"_blank\"><span style=\"font-weight: 400;\">available here</span></a><span style=\"font-weight: 400;\">.</span></p>\n<h3 dir=\"ltr\" id=\"libraries-ranking\"><span style=\"font-weight: 400;\">JSON serialization libraries ranking</span></h3>\n<table border=\"1\" style=\"border-collapse: collapse; width: 94.5969%; height: 94.5969%; border-width: 1px; border-style: solid;\"><colgroup><col style=\"width: 50%;\"><col style=\"width: 50%;\"></colgroup>\n<tbody>\n<tr style=\"height: 85px; background-color: #5050ff;\">\n<td><strong><span style=\"color: #ffffff;\">Solution name</span></strong></td>\n<td><strong><span style=\"color: #ffffff;\">Time (seconds) for 500,000 iterations</span></strong></td>\n</tr>\n<tr style=\"height: 85px; background-color: #f0fcff;\">\n<td><strong>Oj</strong></td>\n<td><strong>0.31s</strong></td>\n</tr>\n<tr style=\"height: 85px;\">\n<td><strong>Yaji</strong></td>\n<td><strong>0.69s</strong></td>\n</tr>\n<tr style=\"height: 85px; background-color: #f0fcff;\">\n<td><strong>JSON</strong></td>\n<td><strong>1.73s</strong></td>\n</tr>\n</tbody>\n</table>\n<p><span style=\"font-weight: 400;\">The fastest solution is the Oj library. It&rsquo;s several times faster than its opponents, making it the clear winner.</span></p>\n<h2><span style=\"font-weight: 400;\">Implementing fast JSON serialization in a Ruby on Rails application</span></h2>\n<p><span style=\"font-weight: 400;\">After our testing, we have our winning couple: Fast JSON API and Oj. It&rsquo;s time to use both solutions in a Ruby on Rails application to demonstrate how to create performant JSON serialization.</span></p>\n<h3 dir=\"ltr\" id=\"step-1\"><span style=\"font-weight: 400;\">Step 1: Adding the gems (fast_jsonapi and oj)</span></h3>\n<p><span style=\"font-weight: 400;\">Let&rsquo;s start by adding required gems to our Gemfile:</span></p>\n<pre><code class=\"hljs language-bash\">gem <span class=\"hljs-string\">&#x27;oj&#x27;</span>\ngem <span class=\"hljs-string\">&#x27;fast_jsonapi&#x27;</span></code></pre>\n<p>Once you have added the gems, install them by issuing the `<code>bundle install</code>` command.</p>\n<h3 dir=\"ltr\" id=\"step-2\"><span style=\"font-weight: 400;\">Step 2: Creating a Rails controller with JSON responses</span></h3>\n<p><span style=\"font-weight: 400;\">Previously, we created a bunch of posts and related comments, so now it&rsquo;s time to create an endpoint where we provide data in the JSON format. In order to do this, let&rsquo;s add a new controller class <code>app/controllers/posts_controller.rb</code> with the following contents:<br></span></p>\n<pre><code class=\"hljs language-ruby\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title class_\">PostsController</span> &lt; <span class=\"hljs-title class_ inherited__\">ApplicationController</span>\n <span class=\"hljs-keyword\">def</span> <span class=\"hljs-title function_\">index</span>\n posts = <span class=\"hljs-title class_\">Post</span>.joins(<span class=\"hljs-symbol\">:comments</span>)\n <span class=\"hljs-keyword\">end</span>\n<span class=\"hljs-keyword\">end</span></code></pre>\n<h3 dir=\"ltr\" id=\"step-3\"><span style=\"font-weight: 400;\">Step 3: Building a Ruby on Rails serializer</span></h3>\n<p>To serialize our posts and comments data, we have to define serializers with the attributes we want to serialize. The following code should look familiar since we used it before when demonstrating the usage of the gem:</p>\n<pre><code class=\"hljs language-ruby\"><span class=\"hljs-comment\"># app/serializers/post_serializer.rb</span>\n\n<span class=\"hljs-keyword\">class</span> <span class=\"hljs-title class_\">PostSerializer</span>\n <span class=\"hljs-keyword\">include</span> <span class=\"hljs-title class_\">FastJsonapi::ObjectSerializer</span>\n attributes <span class=\"hljs-symbol\">:title</span>, <span class=\"hljs-symbol\">:content</span>\n has_many <span class=\"hljs-symbol\">:comments</span>\n<span class=\"hljs-keyword\">end</span>\n\n<span class=\"hljs-comment\"># app/serializers/comment_serializer.rb</span>\n\n<span class=\"hljs-keyword\">class</span> <span class=\"hljs-title class_\">CommentSerializer</span>\n <span class=\"hljs-keyword\">include</span> <span class=\"hljs-variable constant_\">JSONAPI</span><span class=\"hljs-symbol\">:</span><span class=\"hljs-symbol\">:Serializer</span>\n\n attribute <span class=\"hljs-symbol\">:id</span>\n attribute <span class=\"hljs-symbol\">:author</span>\n attribute <span class=\"hljs-symbol\">:body</span>\n<span class=\"hljs-keyword\">end</span></code></pre>\n<h3 dir=\"ltr\" id=\"step-4\"><span style=\"font-weight: 400;\">Step 4: Optimizing Rails JSON with Oj</span></h3>\n<p><span style=\"font-weight: 400;\">Since the fast_jsonapi gem includes Oj automatically, we don't have to explicitly tell our Rails app to include Oj</span> <span style=\"font-weight: 400;\">&nbsp;- </span><a href=\"https://github.com/Netflix/fast_jsonapi/blob/master/lib/fast_jsonapi/multi_to_json.rb#L57\" rel=\"nofollow noopener\" target=\"_blank\"><span style=\"font-weight: 400;\">https://github.com/Netflix/fast_jsonapi/blob/master/lib/fast_jsonapi/multi_to_json.rb#L57</span></a><span style=\"font-weight: 400;\">.</span></p>\n<h3 dir=\"ltr\" id=\"step-4\"><span style=\"font-weight: 400;\">Step 5: Returning JSON in Rails API Endpoints</span></h3>\n<p><span style=\"font-weight: 400;\">We have our serializers prepared, so the last thing to do is to render the posts in the JSON format. In order to do this, we have to edit our previously created controller:</span></p>\n<pre><code class=\"hljs language-ruby\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title class_\">PostsController</span> &lt; <span class=\"hljs-title class_ inherited__\">ApplicationController</span>\n <span class=\"hljs-keyword\">def</span> <span class=\"hljs-title function_\">index</span>\n posts = <span class=\"hljs-title class_\">Post</span>.joins(<span class=\"hljs-symbol\">:comments</span>)\n render <span class=\"hljs-symbol\">json:</span> <span class=\"hljs-title class_\">PostSerializer</span>.new(posts).serialized_json\n <span class=\"hljs-keyword\">end</span>\n<span class=\"hljs-keyword\">end</span>\n</code></pre>\n<p><span style=\"font-weight: 400;\">and let Rails know that we want to access it by editing the </span><code><span style=\"font-weight: 400;\">config/routes.rb</span></code><span style=\"font-weight: 400;\"> file:</span></p>\n<pre><code class=\"hljs language-ruby\">resources <span class=\"hljs-symbol\">:posts</span>, <span class=\"hljs-symbol\">only:</span> [<span class=\"hljs-symbol\">:index</span>]</code></pre>\n<p><span style=\"font-weight: 400;\">Now you can run </span><code><span style=\"font-weight: 400;\">rails s</span></code><span style=\"font-weight: 400;\"> command and access generated data in the JSON format by using </span><a href=\"http://localhost:3000/posts.json\" rel=\"nofollow noopener\" target=\"_blank\"><span style=\"font-weight: 400;\">http://localhost:3000/posts.json</span></a><span style=\"font-weight: 400;\"> URL.</span></p>\n<h2 dir=\"ltr\" id=\"key\"><span style=\"font-weight: 400;\">Key takeaways</span></h2>\n<p><span style=\"font-weight: 400;\">In this article, we compared the most popular data preparation and serialization tools, and implemented a fast JSON serialization setup in Rails using Fast JSON API and Oj. If you're building JSON-driven Rails APIs, you might also want a content backend that speaks the same language. ButterCMS delivers all your content as clean JSON via API, and has a <a href=\"https://buttercms.com/starters/ruby-starter-project/\" rel=\"follow noopener\" target=\"_blank\">Rails starter kit</a> to get you integrated quickly. You can also check out our tutorial on <a href=\"https://buttercms.com/blog/rails-tutorial-creating-a-knowledge-base/\" rel=\"follow noopener\" target=\"_blank\">building a Rails knowledge base</a> to see it in action. <br><br><a href=\"/join\" rel=\"follow noopener\" target=\"_blank\">Start a free trial</a> to explore on your own, or <a href=\"/sales\" rel=\"follow noopener\" target=\"_blank\">request a demo</a> and we'll walk you through it.</span></p>\n"],"summary":[0,"This article takes a deep dive into what JSON serialization is, why you may need it in your Rails application and how to leverage existing libraries to implement JSON serialization in a concise and performant way."],"seoTitle":[0,"JSON serialization in Rails: A complete guide"],"metaDescription":[0,"Learn what JSON serialization is, why your Rails app needs a Ruby on Rails serializer, and how to implement fast, optimized Rails JSON responses."],"readTimeMinutes":[0,14],"href":[0,"/blog/json-serialization-in-rails-a-complete-guide/"]}]]],"class":[0,"blog-post-page__footer"],"data-astro-cid-jdrsq7vm":[0,true]}" ssr client="load" opts="{"name":"BlogPostFooter","value":true}" await-children><div class="palette-bg-main-tl-primary-dark blog-post-page__footer" data-astro-cid-jdrsq7vm="true" data-v-d6b6f7a9><div class="blog-post-footer__header" data-v-d6b6f7a9><div class="card-container card-container--left card" style="--card-background:;--card-spacing-x:var(--card-spacing-x-card);--card-spacing-y:var(--card-spacing-y-card);--card-content-max-width:100%;--card-content-max-width-md:100%;--card-content-max-width-lg:100%;--card-content-max-width-xl:100%;--card-heading-max-width:100%;--card-heading-max-width-md:100%;--card-heading-max-width-lg:100%;--card-heading-max-width-xl:100%;" fullwidth="false" data-v-d6b6f7a9 data-v-bdd66a97 data-v-36432e43><!--[--><!----><div class="" data-v-bdd66a97><!----><div class="card__content" data-v-bdd66a97><div class="card__heading" data-v-bdd66a97><!--[--><div class="heading--margin-bottom" style="--heading-font-size:var(--heading-2-font-size);" data-v-bdd66a97 data-v-1848a4e8><!--[--><!----><!--]--><div class="title title--2" data-v-1848a4e8><!--[--><h2 class="title--internal" data-v-1848a4e8>Related Posts & Resources</h2><!--]--><!----></div><!--[--><!----><!--]--></div><!--]--></div><div class="" data-v-bdd66a97><!--[--><div class="rich-text rich-text--default text--size-md rich-text--no-margin" data-v-bdd66a97 data-v-b0e7e4d7>Explore more helpful content to build your best site!</div><!--]--></div><!--[--><!--]--><!----><!--[--><!----><!--]--></div></div><!--]--></div><a class="button palette-tertiary-filled palette-tertiary-filled-interactive blog-post-footer__actions-button--lg" style="" href="/blog/" data-v-d6b6f7a9 data-v-063ae83e><div class="button__content button__content--sm" data-v-063ae83e><!----><!--[--><div class="button__text" data-v-063ae83e>View all resources</div><!--]--><!----></div><!----></a></div><div class="blog-post-footer__card-list" data-v-d6b6f7a9><!--[--><div class="card-container card-container--left card blog-tile blog-post-footer__card-list-item" style="--card-background:;--card-spacing-x:var(--card-spacing-x-card);--card-spacing-y:var(--card-spacing-y-card);--card-content-max-width:100%;--card-content-max-width-md:100%;--card-content-max-width-lg:100%;--card-content-max-width-xl:100%;--card-heading-max-width:100%;--card-heading-max-width-md:100%;--card-heading-max-width-lg:100%;--card-heading-max-width-xl:100%;" fullwidth="false" data-v-d6b6f7a9 data-v-55003086 data-v-bdd66a97 data-v-36432e43><!--[--><div class="card__header-image" data-v-bdd66a97><!--[--><!----><div class="blog-image blog-tile__image" data-v-55003086 data-v-65a0fc8d><div class="image__container blog-image__image" style="--width-base:100%;--width-md:100%;--width-lg:100%;--width-xl:100%;--height-base:100%;--height-md:100%;--height-lg:100%;--height-xl:100%;" data-v-65a0fc8d data-v-1a15d540><img src="https://cdn.buttercms.com/UQ2IyokeR3WAVPi4ckNw" alt="8 ChatGPT Prompt Frameworks Every Marketer Should Know" loading="lazy" class="image image--fit-cover" data-v-1a15d540></div><a class="blog-category blog-image__category" href="/blog/category/cms-developer-tutorials/" data-v-65a0fc8d data-v-d1ba30b1>CMS Developer Tutorials</a></div><!--]--></div><div class="" data-v-bdd66a97><!----><div class="card__content" data-v-bdd66a97><div class="card__heading card__heading--has-header" data-v-bdd66a97><!--[--><div class="heading--margin-bottom blog-tile__heading" style="--heading-font-size:var(--heading-4-font-size);" data-v-bdd66a97 data-v-1848a4e8><!--[--><!----><!--]--><div class="title title--4" data-v-1848a4e8><!--[--><a href="/blog/chatgpt-prompt-frameworks/" class="heading__title-link" data-v-1848a4e8><h4 class="title--internal" data-v-1848a4e8>8 ChatGPT prompt frameworks every marketer should know</h4></a><!--]--><!----></div><!--[--><!----><!--]--></div><!--]--></div><div class="" data-v-bdd66a97><!--[--><div style="--max-name-title-width:14em;" data-v-55003086 data-v-5ced18b5><a href="/blog/author/maab-saleem/" class="author__profile" data-v-5ced18b5><div data-v-5ced18b5><div class="avatar avatar--size-sm avatar--shape-circle" data-v-5ced18b5 data-v-fe7f3189><img src="https://cdn.buttercms.com/yrU8akCQcCdsvcXzQRXE" alt="Maab Saleem" class="avatar-image" data-v-fe7f3189></div></div><div data-v-5ced18b5><div class="text text--size-md text--weight-medium text--no-margin author__name" data-v-5ced18b5 data-v-2e32ee71><!--[-->Maab Saleem<!--]--></div><!----><!----></div></a><a class="button button--link palette-primary-link palette-primary-link-interactive author__button" style="" href="/blog/chatgpt-prompt-frameworks/" rel="nofollow" link data-v-5ced18b5 data-v-063ae83e><div class="button__content button__content--md" data-v-063ae83e><!----><!--[-->Read more<!--]--><!----></div><!----></a></div><!--]--></div><!--[--><!--]--><!----><!--[--><!----><!--]--></div></div><!--]--></div><div class="card-container card-container--left card blog-tile blog-post-footer__card-list-item" style="--card-background:;--card-spacing-x:var(--card-spacing-x-card);--card-spacing-y:var(--card-spacing-y-card);--card-content-max-width:100%;--card-content-max-width-md:100%;--card-content-max-width-lg:100%;--card-content-max-width-xl:100%;--card-heading-max-width:100%;--card-heading-max-width-md:100%;--card-heading-max-width-lg:100%;--card-heading-max-width-xl:100%;" fullwidth="false" data-v-d6b6f7a9 data-v-55003086 data-v-bdd66a97 data-v-36432e43><!--[--><div class="card__header-image" data-v-bdd66a97><!--[--><!----><div class="blog-image blog-tile__image" data-v-55003086 data-v-65a0fc8d><div class="image__container blog-image__image" style="--width-base:100%;--width-md:100%;--width-lg:100%;--width-xl:100%;--height-base:100%;--height-md:100%;--height-lg:100%;--height-xl:100%;" data-v-65a0fc8d data-v-1a15d540><img src="https://cdn.buttercms.com/EzycKt5fSGCVgeE9mtfJ" alt="Featured Image: JSON Serialization in Rails: A Complete Guide" loading="lazy" class="image image--fit-cover" data-v-1a15d540></div><a class="blog-category blog-image__category" href="/blog/category/cms-developer-tutorials/" data-v-65a0fc8d data-v-d1ba30b1>CMS Developer Tutorials</a></div><!--]--></div><div class="" data-v-bdd66a97><!----><div class="card__content" data-v-bdd66a97><div class="card__heading card__heading--has-header" data-v-bdd66a97><!--[--><div class="heading--margin-bottom blog-tile__heading" style="--heading-font-size:var(--heading-4-font-size);" data-v-bdd66a97 data-v-1848a4e8><!--[--><!----><!--]--><div class="title title--4" data-v-1848a4e8><!--[--><a href="/blog/json-serialization-in-rails-a-complete-guide/" class="heading__title-link" data-v-1848a4e8><h4 class="title--internal" data-v-1848a4e8>JSON serialization in Rails: A complete guide</h4></a><!--]--><!----></div><!--[--><!----><!--]--></div><!--]--></div><div class="" data-v-bdd66a97><!--[--><div style="--max-name-title-width:14em;" data-v-55003086 data-v-5ced18b5><a href="/blog/author/maab-saleem/" class="author__profile" data-v-5ced18b5><div data-v-5ced18b5><div class="avatar avatar--size-sm avatar--shape-circle" data-v-5ced18b5 data-v-fe7f3189><img src="https://cdn.buttercms.com/yrU8akCQcCdsvcXzQRXE" alt="Maab Saleem" class="avatar-image" data-v-fe7f3189></div></div><div data-v-5ced18b5><div class="text text--size-md text--weight-medium text--no-margin author__name" data-v-5ced18b5 data-v-2e32ee71><!--[-->Maab Saleem<!--]--></div><!----><!----></div></a><a class="button button--link palette-primary-link palette-primary-link-interactive author__button" style="" href="/blog/json-serialization-in-rails-a-complete-guide/" rel="nofollow" link data-v-5ced18b5 data-v-063ae83e><div class="button__content button__content--md" data-v-063ae83e><!----><!--[-->Read more<!--]--><!----></div><!----></a></div><!--]--></div><!--[--><!--]--><!----><!--[--><!----><!--]--></div></div><!--]--></div><!--]--><form id="cms-guide-signup" class="simple-form palette-bg-main-tl-primary-dark blog-post-footer__cms-guide-signup--lg blog-post-footer__card-list-item" data-v-d6b6f7a9 data-v-3698369c data-v-f7f8addb><div class="card-container card-container--left card-container--rounded borders--all card" style="--card-background:;--card-spacing-x:var(--card-spacing-x-card);--card-spacing-y:var(--card-spacing-y-card);--card-content-max-width:100%;--card-content-max-width-md:100%;--card-content-max-width-lg:100%;--card-content-max-width-xl:100%;--card-heading-max-width:100%;--card-heading-max-width-md:100%;--card-heading-max-width-lg:100%;--card-heading-max-width-xl:100%;" fullwidth="false" data-v-f7f8addb data-v-bdd66a97 data-v-36432e43><!--[--><!----><div class="cms-guide-signup card__inner--with-padding" data-v-bdd66a97><!----><div class="card__content" data-v-bdd66a97><div class="card__heading" data-v-bdd66a97><!--[--><div class="heading--margin-bottom" style="--heading-font-size:var(--heading-4-font-size);" data-v-bdd66a97 data-v-1848a4e8><!--[--><!----><!--]--><div class="title title--4" data-v-1848a4e8><!--[--><h4 class="title--internal" data-v-1848a4e8>New to Headless CMS? Check out our Guide!</h4><!--]--><!----></div><!--[--><!----><!--]--></div><!--]--></div><div class="" data-v-bdd66a97><!--[--><div class="rich-text rich-text--default text--size-md" data-v-f7f8addb data-v-b0e7e4d7>Get a step-by-step walkthrough of how to determine whether Headless CMS is a good option for your team and what to do next to enjoy the benefits!</div><div class="input-comment" data-v-f7f8addb data-v-0fdcf393><label for="text-input--cms-guide-signup-comment" data-v-0fdcf393>Comment</label><input id="text-input--cms-guide-signup-comment" name="comment" placeholder="Enter your comments" value="" data-v-0fdcf393></div><div class="input-text" data-v-f7f8addb data-v-0627ca04><label for="text-input--cms-guide-signup-email" class="input-text__label" data-v-0627ca04><span class="input-text__asterisk" aria-hidden="true" data-v-0627ca04>*</span> Email</label><input id="text-input--cms-guide-signup-email" name="email" type="email" aria-describedby="text-input-hint--cms-guide-signup-email" aria-invalid="false" class="input-text__input cms-guide-signup__input" autocomplete="on" data-v-0627ca04><div class="input-text__message" data-v-0627ca04><!----></div></div><!--]--></div><!--[--><!--]--><div class="card__footer--has-content single-input-form__actions" data-v-bdd66a97><!--[--><div class="card__actions card__actions--left" data-v-bdd66a97><!--[--><button class="button palette-primary-filled palette-primary-filled-interactive" style="" type="submit" data-v-bdd66a97 data-v-063ae83e><div class="button__content button__content--md" data-v-063ae83e><!----><!--[--><div class="button__text" data-v-063ae83e>Get My Guide</div><!--]--><!----></div><!----></button><!--]--></div><!--]--></div><!--[--><div class="rich-text rich-text--default text--size-md" data-v-f7f8addb data-v-b0e7e4d7><p><small>By subscribing you agree to our <a href="/privacy">Privacy Policy</a>.</small></p></div><!--]--></div></div><!--]--></div></form></div><div class="blog-post-footer__actions" data-v-d6b6f7a9><a class="button palette-tertiary-filled palette-tertiary-filled-interactive" style="" href="/blog/" data-v-d6b6f7a9 data-v-063ae83e><div class="button__content button__content--sm" data-v-063ae83e><!----><!--[--><div class="button__text" data-v-063ae83e>View all resources</div><!--]--><!----></div><!----></a><form id="cms-guide-signup" class="simple-form palette-bg-main-tl-primary-dark" data-v-d6b6f7a9 data-v-3698369c data-v-f7f8addb><div class="card-container card-container--left card-container--rounded borders--all card" style="--card-background:;--card-spacing-x:var(--card-spacing-x-card);--card-spacing-y:var(--card-spacing-y-card);--card-content-max-width:100%;--card-content-max-width-md:100%;--card-content-max-width-lg:100%;--card-content-max-width-xl:100%;--card-heading-max-width:100%;--card-heading-max-width-md:100%;--card-heading-max-width-lg:100%;--card-heading-max-width-xl:100%;" fullwidth="false" data-v-f7f8addb data-v-bdd66a97 data-v-36432e43><!--[--><!----><div class="cms-guide-signup card__inner--with-padding" data-v-bdd66a97><!----><div class="card__content" data-v-bdd66a97><div class="card__heading" data-v-bdd66a97><!--[--><div class="heading--margin-bottom" style="--heading-font-size:var(--heading-4-font-size);" data-v-bdd66a97 data-v-1848a4e8><!--[--><!----><!--]--><div class="title title--4" data-v-1848a4e8><!--[--><h4 class="title--internal" data-v-1848a4e8>New to Headless CMS? Check out our Guide!</h4><!--]--><!----></div><!--[--><!----><!--]--></div><!--]--></div><div class="" data-v-bdd66a97><!--[--><div class="rich-text rich-text--default text--size-md" data-v-f7f8addb data-v-b0e7e4d7>Get a step-by-step walkthrough of how to determine whether Headless CMS is a good option for your team and what to do next to enjoy the benefits!</div><div class="input-comment" data-v-f7f8addb data-v-0fdcf393><label for="text-input--cms-guide-signup-comment" data-v-0fdcf393>Comment</label><input id="text-input--cms-guide-signup-comment" name="comment" placeholder="Enter your comments" value="" data-v-0fdcf393></div><div class="input-text" data-v-f7f8addb data-v-0627ca04><label for="text-input--cms-guide-signup-email" class="input-text__label" data-v-0627ca04><span class="input-text__asterisk" aria-hidden="true" data-v-0627ca04>*</span> Email</label><input id="text-input--cms-guide-signup-email" name="email" type="email" aria-describedby="text-input-hint--cms-guide-signup-email" aria-invalid="false" class="input-text__input cms-guide-signup__input" autocomplete="on" data-v-0627ca04><div class="input-text__message" data-v-0627ca04><!----></div></div><!--]--></div><!--[--><!--]--><div class="card__footer--has-content single-input-form__actions" data-v-bdd66a97><!--[--><div class="card__actions card__actions--left" data-v-bdd66a97><!--[--><button class="button palette-primary-filled palette-primary-filled-interactive" style="" type="submit" data-v-bdd66a97 data-v-063ae83e><div class="button__content button__content--md" data-v-063ae83e><!----><!--[--><div class="button__text" data-v-063ae83e>Get My Guide</div><!--]--><!----></div><!----></button><!--]--></div><!--]--></div><!--[--><div class="rich-text rich-text--default text--size-md" data-v-f7f8addb data-v-b0e7e4d7><p><small>By subscribing you agree to our <a href="/privacy">Privacy Policy</a>.</small></p></div><!--]--></div></div><!--]--></div></form></div></div><!--astro:end--></astro-island> </div> <!--]--></div> </main> <astro-island uid="ZB10vY" prefix="s7" component-url="/_astro/index.C3t1o5QC.js" component-export="TBBlock" renderer-url="/_astro/client.D_fF9-0X.js" props="{"block":[0,{"type":[0,"footer"],"props":[0,{"logo":[0,{"src":[0,"https://cdn.buttercms.com/8Nbebgi6SU2yZVOPzjPA"],"alt":[0,"ButterCMS Logo"],"width":[0,{"base":[0,"140px"],"md":[0,"160px"]}],"height":[0,{"base":[0,"100%"]}]}],"socialLinks":[1,[[0,{"href":[0,"https://linkedin.com/company/buttercms/"],"icon":[0,"linkedin"]}],[0,{"href":[0,"https://x.com/buttercms"],"icon":[0,"twitter"]}],[0,{"href":[0,"https://www.youtube.com/@buttercmsfm"],"icon":[0,"youtube"]}],[0,{"href":[0,"https://github.com/buttercms"],"icon":[0,"github"]}],[0,{"href":[0,"https://www.g2.com/products/butter-cms/reviews"],"icon":[0,"g2"],"iconGroup":[0,"tt"]}]]],"columns":[1,[[0,{"label":[0,"Product"],"items":[1,[[0,{"label":[0,"Headless CMS"],"href":[0,"/headless-cms/"]}],[0,{"label":[0,"Capabilities"],"href":[0,"/capabilities/"]}],[0,{"label":[0,"Features"],"href":[0,"/features/"]}],[0,{"label":[0,"Integrations"],"href":[0,"/marketplace/"]}],[0,{"label":[0,"API"],"href":[0,"/docs/api/"]}]]]}],[0,{"label":[0,"Developers"],"items":[1,[[0,{"label":[0,"Knowledge Base"],"href":[0,"/knowledge-base/"]}],[0,{"label":[0,"Developer Docs"],"href":[0,"/docs/"]}],[0,{"label":[0,"API Documentation"],"href":[0,"/docs/api/"]}],[0,{"label":[0,"Developer Hub"],"href":[0,"/developers-hub/"]}],[0,{"label":[0,"Starter Projects"],"href":[0,"/starters/"]}],[0,{"label":[0,"API Status"],"href":[0,"https://status.buttercms.com/"]}]]]}],[0,{"label":[0,"Explore"],"items":[1,[[0,{"label":[0,"Pricing"],"href":[0,"/pricing/"]}],[0,{"label":[0,"Partners"],"href":[0,"/partners/"]}],[0,{"label":[0,"Security"],"href":[0,"/security/"]}],[0,{"label":[0,"Careers"],"href":[0,"https://tiugotech.recruitee.com/"]}],[0,{"label":[0,"Contact Us"],"href":[0,"/sales/"]}]]]}],[0,{"label":[0,"Resources"],"items":[1,[[0,{"label":[0,"Blog"],"href":[0,"/blog/"]}],[0,{"label":[0,"Podcast"],"href":[0,"/knowledge-base/category/podcasts/"]}],[0,{"label":[0,"WordPress Alternative"],"href":[0,"/wordpress-alternative/"]}],[0,{"label":[0,"Contentful Alternative"],"href":[0,"/contentful-alternatives/"]}],[0,{"label":[0,"Medium Alternative"],"href":[0,"/medium-alternative/"]}],[0,{"label":[0,"Strapi Alternative"],"href":[0,"/strapi-alternatives/"]}]]]}]]],"copyrightText":[0,"© 2025 ButterCMS. All rights reserved."],"legalLinks":[1,[[0,{"label":[0,"Privacy Policy"],"href":[0,"/privacy/"]}],[0,{"label":[0,"Terms of Use"],"href":[0,"/terms/"]}]]]}]}],"data-astro-cid-daz465cn":[0,true]}" ssr client="visible" opts="{"name":"TBBlock","value":{"rootMargin":"100px"}}" await-children><footer class="footer tracking-consumption-footer section-container section-container--padding-top-block section-container--padding-bottom-block" style="--section-background:;" data-astro-cid-daz465cn="true" data-v-53547ec0 data-v-bc505aac><!--[--><div class="footer__desktop" data-v-53547ec0><div class="footer__desktop-main-content" data-v-53547ec0><div class="footer-brand footer__brand--desktop" data-v-53547ec0 data-v-1791aab3><a href="/" data-v-1791aab3><div class="image__container" style="--width-base:140px;--width-md:160px;--width-lg:160px;--width-xl:160px;--height-base:100%;--height-md:100%;--height-lg:100%;--height-xl:100%;" data-v-1791aab3 data-v-1a15d540><img src="https://cdn.buttercms.com/8Nbebgi6SU2yZVOPzjPA" alt="ButterCMS Logo" loading="lazy" class="image image--fit-contain" data-v-1a15d540></div></a><div class="footer-brand__social" data-v-1791aab3><!--[--><a class="button button--link palette-neutral-link palette-neutral-link-interactive" style="" href="https://linkedin.com/company/buttercms/" data-v-1791aab3 data-v-063ae83e><div class="button__content button__content--lg" data-v-063ae83e><span class="" data-v-063ae83e><!--[--><span class="icon icon--icon-color button__icon" data-v-063ae83e data-v-be81bbc2><i class="pi pi-linkedin" data-v-be81bbc2></i></span><!--]--></span><!--[--><div class="button__text" data-v-063ae83e></div><!--]--><!----></div><!----></a><a class="button button--link palette-neutral-link palette-neutral-link-interactive" style="" href="https://x.com/buttercms" data-v-1791aab3 data-v-063ae83e><div class="button__content button__content--lg" data-v-063ae83e><span class="" data-v-063ae83e><!--[--><span class="icon icon--icon-color button__icon" data-v-063ae83e data-v-be81bbc2><i class="pi pi-twitter" data-v-be81bbc2></i></span><!--]--></span><!--[--><div class="button__text" data-v-063ae83e></div><!--]--><!----></div><!----></a><a class="button button--link palette-neutral-link palette-neutral-link-interactive" style="" href="https://www.youtube.com/@buttercmsfm" data-v-1791aab3 data-v-063ae83e><div class="button__content button__content--lg" data-v-063ae83e><span class="" data-v-063ae83e><!--[--><span class="icon icon--icon-color button__icon" data-v-063ae83e data-v-be81bbc2><i class="pi pi-youtube" data-v-be81bbc2></i></span><!--]--></span><!--[--><div class="button__text" data-v-063ae83e></div><!--]--><!----></div><!----></a><a class="button button--link palette-neutral-link palette-neutral-link-interactive" style="" href="https://github.com/buttercms" data-v-1791aab3 data-v-063ae83e><div class="button__content button__content--lg" data-v-063ae83e><span class="" data-v-063ae83e><!--[--><span class="icon icon--icon-color button__icon" data-v-063ae83e data-v-be81bbc2><i class="pi pi-github" data-v-be81bbc2></i></span><!--]--></span><!--[--><div class="button__text" data-v-063ae83e></div><!--]--><!----></div><!----></a><a class="button button--link palette-neutral-link palette-neutral-link-interactive" style="" href="https://www.g2.com/products/butter-cms/reviews" data-v-1791aab3 data-v-063ae83e><div class="button__content button__content--lg" data-v-063ae83e><span class="" data-v-063ae83e><!--[--><span class="icon icon--icon-color button__icon" data-v-063ae83e data-v-be81bbc2><i class="tt-icon tt-icon--g2" data-v-be81bbc2></i></span><!--]--></span><!--[--><div class="button__text" data-v-063ae83e></div><!--]--><!----></div><!----></a><!--]--></div></div><div class="footer__desktop-columns-container" data-v-53547ec0><div class="footer-columns-desktop footer__desktop-columns" data-v-53547ec0 data-v-a621c41b><!--[--><div data-v-a621c41b><p class="text text--size-md text--weight-bold text--no-margin footer-columns-desktop__column-title" data-v-a621c41b data-v-2e32ee71><!--[-->Product<!--]--></p><div class="footer-columns-desktop__column-items" data-v-a621c41b><!--[--><a href="/headless-cms/" class="nav-button palette-button palette-button-interactive nav-button-button footer-columns-desktop__column-item" data-v-a621c41b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Headless CMS</span><!--[--><!----><!--]--><!--]--></a><a href="/capabilities/" class="nav-button palette-button palette-button-interactive nav-button-button footer-columns-desktop__column-item" data-v-a621c41b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Capabilities</span><!--[--><!----><!--]--><!--]--></a><a href="/features/" class="nav-button palette-button palette-button-interactive nav-button-button footer-columns-desktop__column-item" data-v-a621c41b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Features</span><!--[--><!----><!--]--><!--]--></a><a href="/marketplace/" class="nav-button palette-button palette-button-interactive nav-button-button footer-columns-desktop__column-item" data-v-a621c41b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Integrations</span><!--[--><!----><!--]--><!--]--></a><a href="/docs/api/" class="nav-button palette-button palette-button-interactive nav-button-button footer-columns-desktop__column-item" data-v-a621c41b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>API</span><!--[--><!----><!--]--><!--]--></a><!--]--></div></div><div data-v-a621c41b><p class="text text--size-md text--weight-bold text--no-margin footer-columns-desktop__column-title" data-v-a621c41b data-v-2e32ee71><!--[-->Developers<!--]--></p><div class="footer-columns-desktop__column-items" data-v-a621c41b><!--[--><a href="/knowledge-base/" class="nav-button palette-button palette-button-interactive nav-button-button footer-columns-desktop__column-item" data-v-a621c41b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Knowledge Base</span><!--[--><!----><!--]--><!--]--></a><a href="/docs/" class="nav-button palette-button palette-button-interactive nav-button-button footer-columns-desktop__column-item" data-v-a621c41b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Developer Docs</span><!--[--><!----><!--]--><!--]--></a><a href="/docs/api/" class="nav-button palette-button palette-button-interactive nav-button-button footer-columns-desktop__column-item" data-v-a621c41b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>API Documentation</span><!--[--><!----><!--]--><!--]--></a><a href="/developers-hub/" class="nav-button palette-button palette-button-interactive nav-button-button footer-columns-desktop__column-item" data-v-a621c41b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Developer Hub</span><!--[--><!----><!--]--><!--]--></a><a href="/starters/" class="nav-button palette-button palette-button-interactive nav-button-button footer-columns-desktop__column-item" data-v-a621c41b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Starter Projects</span><!--[--><!----><!--]--><!--]--></a><a href="https://status.buttercms.com/" class="nav-button palette-button palette-button-interactive nav-button-button footer-columns-desktop__column-item" data-v-a621c41b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>API Status</span><!--[--><!----><!--]--><!--]--></a><!--]--></div></div><div data-v-a621c41b><p class="text text--size-md text--weight-bold text--no-margin footer-columns-desktop__column-title" data-v-a621c41b data-v-2e32ee71><!--[-->Explore<!--]--></p><div class="footer-columns-desktop__column-items" data-v-a621c41b><!--[--><a href="/pricing/" class="nav-button palette-button palette-button-interactive nav-button-button footer-columns-desktop__column-item" data-v-a621c41b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Pricing</span><!--[--><!----><!--]--><!--]--></a><a href="/partners/" class="nav-button palette-button palette-button-interactive nav-button-button footer-columns-desktop__column-item" data-v-a621c41b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Partners</span><!--[--><!----><!--]--><!--]--></a><a href="/security/" class="nav-button palette-button palette-button-interactive nav-button-button footer-columns-desktop__column-item" data-v-a621c41b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Security</span><!--[--><!----><!--]--><!--]--></a><a href="https://tiugotech.recruitee.com/" class="nav-button palette-button palette-button-interactive nav-button-button footer-columns-desktop__column-item" data-v-a621c41b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Careers</span><!--[--><!----><!--]--><!--]--></a><a href="/sales/" class="nav-button palette-button palette-button-interactive nav-button-button footer-columns-desktop__column-item" data-v-a621c41b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Contact Us</span><!--[--><!----><!--]--><!--]--></a><!--]--></div></div><div data-v-a621c41b><p class="text text--size-md text--weight-bold text--no-margin footer-columns-desktop__column-title" data-v-a621c41b data-v-2e32ee71><!--[-->Resources<!--]--></p><div class="footer-columns-desktop__column-items" data-v-a621c41b><!--[--><a href="/blog/" class="nav-button palette-button palette-button-interactive nav-button-button footer-columns-desktop__column-item" data-v-a621c41b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Blog</span><!--[--><!----><!--]--><!--]--></a><a href="/knowledge-base/category/podcasts/" class="nav-button palette-button palette-button-interactive nav-button-button footer-columns-desktop__column-item" data-v-a621c41b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Podcast</span><!--[--><!----><!--]--><!--]--></a><a href="/wordpress-alternative/" class="nav-button palette-button palette-button-interactive nav-button-button footer-columns-desktop__column-item" data-v-a621c41b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>WordPress Alternative</span><!--[--><!----><!--]--><!--]--></a><a href="/contentful-alternatives/" class="nav-button palette-button palette-button-interactive nav-button-button footer-columns-desktop__column-item" data-v-a621c41b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Contentful Alternative</span><!--[--><!----><!--]--><!--]--></a><a href="/medium-alternative/" class="nav-button palette-button palette-button-interactive nav-button-button footer-columns-desktop__column-item" data-v-a621c41b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Medium Alternative</span><!--[--><!----><!--]--><!--]--></a><a href="/strapi-alternatives/" class="nav-button palette-button palette-button-interactive nav-button-button footer-columns-desktop__column-item" data-v-a621c41b data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Strapi Alternative</span><!--[--><!----><!--]--><!--]--></a><!--]--></div></div><!--]--></div></div></div><div class="footer-legal footer__legal--desktop" data-v-53547ec0 data-v-fd395dd4><p class="text text--size-sm text--weight-regular text--no-margin" color="muted" data-v-fd395dd4 data-v-2e32ee71><!--[-->© 2025 ButterCMS. All rights reserved.<!--]--></p><div class="footer-legal__links" data-v-fd395dd4><!--[--><a href="/privacy/" class="nav-button nav-button--padding palette-link palette-link-interactive nav-button-link" data-v-fd395dd4 data-v-7ec88356><!--[--><span class="" data-v-7ec88356>Privacy Policy</span><!--[--><!----><!--]--><!--]--></a><a href="/terms/" class="nav-button nav-button--padding palette-link palette-link-interactive nav-button-link" data-v-fd395dd4 data-v-7ec88356><!--[--><span class="" data-v-7ec88356>Terms of Use</span><!--[--><!----><!--]--><!--]--></a><!--]--></div></div></div><div class="footer__mobile" data-v-53547ec0><div data-v-53547ec0 data-v-ee5f7ac3><!--[--><div class="footer-columns-mobile__section" data-v-ee5f7ac3><button class="nav-button nav-button--padding palette-footer-mobile-menu-item palette-footer-mobile-menu-item-interactive nav-button-footer-mobile-menu-item footer-columns-mobile__menu-item" data-v-ee5f7ac3 data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Product</span><!--[--><i class="pi pi-chevron-down footer-columns-mobile__dropdown-icon" data-v-ee5f7ac3></i><!--]--><!--]--></button><div class="footer-columns-mobile__submenu" data-v-ee5f7ac3><div class="footer-columns-mobile__submenu-content" data-v-ee5f7ac3><div class="footer-columns-mobile__column" data-v-ee5f7ac3><!--[--><a href="/headless-cms/" class="nav-button nav-button--padding palette-button palette-button-interactive nav-button-button" data-v-ee5f7ac3 data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Headless CMS</span><!--[--><!----><!--]--><!--]--></a><a href="/capabilities/" class="nav-button nav-button--padding palette-button palette-button-interactive nav-button-button" data-v-ee5f7ac3 data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Capabilities</span><!--[--><!----><!--]--><!--]--></a><a href="/features/" class="nav-button nav-button--padding palette-button palette-button-interactive nav-button-button" data-v-ee5f7ac3 data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Features</span><!--[--><!----><!--]--><!--]--></a><a href="/marketplace/" class="nav-button nav-button--padding palette-button palette-button-interactive nav-button-button" data-v-ee5f7ac3 data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Integrations</span><!--[--><!----><!--]--><!--]--></a><a href="/docs/api/" class="nav-button nav-button--padding palette-button palette-button-interactive nav-button-button" data-v-ee5f7ac3 data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>API</span><!--[--><!----><!--]--><!--]--></a><!--]--></div></div></div></div><div class="footer-columns-mobile__section" data-v-ee5f7ac3><button class="nav-button nav-button--padding palette-footer-mobile-menu-item palette-footer-mobile-menu-item-interactive nav-button-footer-mobile-menu-item footer-columns-mobile__menu-item" data-v-ee5f7ac3 data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Developers</span><!--[--><i class="pi pi-chevron-down footer-columns-mobile__dropdown-icon" data-v-ee5f7ac3></i><!--]--><!--]--></button><div class="footer-columns-mobile__submenu" data-v-ee5f7ac3><div class="footer-columns-mobile__submenu-content" data-v-ee5f7ac3><div class="footer-columns-mobile__column" data-v-ee5f7ac3><!--[--><a href="/knowledge-base/" class="nav-button nav-button--padding palette-button palette-button-interactive nav-button-button" data-v-ee5f7ac3 data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Knowledge Base</span><!--[--><!----><!--]--><!--]--></a><a href="/docs/" class="nav-button nav-button--padding palette-button palette-button-interactive nav-button-button" data-v-ee5f7ac3 data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Developer Docs</span><!--[--><!----><!--]--><!--]--></a><a href="/docs/api/" class="nav-button nav-button--padding palette-button palette-button-interactive nav-button-button" data-v-ee5f7ac3 data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>API Documentation</span><!--[--><!----><!--]--><!--]--></a><a href="/developers-hub/" class="nav-button nav-button--padding palette-button palette-button-interactive nav-button-button" data-v-ee5f7ac3 data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Developer Hub</span><!--[--><!----><!--]--><!--]--></a><a href="/starters/" class="nav-button nav-button--padding palette-button palette-button-interactive nav-button-button" data-v-ee5f7ac3 data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Starter Projects</span><!--[--><!----><!--]--><!--]--></a><a href="https://status.buttercms.com/" class="nav-button nav-button--padding palette-button palette-button-interactive nav-button-button" data-v-ee5f7ac3 data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>API Status</span><!--[--><!----><!--]--><!--]--></a><!--]--></div></div></div></div><div class="footer-columns-mobile__section" data-v-ee5f7ac3><button class="nav-button nav-button--padding palette-footer-mobile-menu-item palette-footer-mobile-menu-item-interactive nav-button-footer-mobile-menu-item footer-columns-mobile__menu-item" data-v-ee5f7ac3 data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Explore</span><!--[--><i class="pi pi-chevron-down footer-columns-mobile__dropdown-icon" data-v-ee5f7ac3></i><!--]--><!--]--></button><div class="footer-columns-mobile__submenu" data-v-ee5f7ac3><div class="footer-columns-mobile__submenu-content" data-v-ee5f7ac3><div class="footer-columns-mobile__column" data-v-ee5f7ac3><!--[--><a href="/pricing/" class="nav-button nav-button--padding palette-button palette-button-interactive nav-button-button" data-v-ee5f7ac3 data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Pricing</span><!--[--><!----><!--]--><!--]--></a><a href="/partners/" class="nav-button nav-button--padding palette-button palette-button-interactive nav-button-button" data-v-ee5f7ac3 data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Partners</span><!--[--><!----><!--]--><!--]--></a><a href="/security/" class="nav-button nav-button--padding palette-button palette-button-interactive nav-button-button" data-v-ee5f7ac3 data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Security</span><!--[--><!----><!--]--><!--]--></a><a href="https://tiugotech.recruitee.com/" class="nav-button nav-button--padding palette-button palette-button-interactive nav-button-button" data-v-ee5f7ac3 data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Careers</span><!--[--><!----><!--]--><!--]--></a><a href="/sales/" class="nav-button nav-button--padding palette-button palette-button-interactive nav-button-button" data-v-ee5f7ac3 data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Contact Us</span><!--[--><!----><!--]--><!--]--></a><!--]--></div></div></div></div><div class="footer-columns-mobile__section" data-v-ee5f7ac3><button class="nav-button nav-button--padding palette-footer-mobile-menu-item palette-footer-mobile-menu-item-interactive nav-button-footer-mobile-menu-item footer-columns-mobile__menu-item" data-v-ee5f7ac3 data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Resources</span><!--[--><i class="pi pi-chevron-down footer-columns-mobile__dropdown-icon" data-v-ee5f7ac3></i><!--]--><!--]--></button><div class="footer-columns-mobile__submenu" data-v-ee5f7ac3><div class="footer-columns-mobile__submenu-content" data-v-ee5f7ac3><div class="footer-columns-mobile__column" data-v-ee5f7ac3><!--[--><a href="/blog/" class="nav-button nav-button--padding palette-button palette-button-interactive nav-button-button" data-v-ee5f7ac3 data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Blog</span><!--[--><!----><!--]--><!--]--></a><a href="/knowledge-base/category/podcasts/" class="nav-button nav-button--padding palette-button palette-button-interactive nav-button-button" data-v-ee5f7ac3 data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Podcast</span><!--[--><!----><!--]--><!--]--></a><a href="/wordpress-alternative/" class="nav-button nav-button--padding palette-button palette-button-interactive nav-button-button" data-v-ee5f7ac3 data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>WordPress Alternative</span><!--[--><!----><!--]--><!--]--></a><a href="/contentful-alternatives/" class="nav-button nav-button--padding palette-button palette-button-interactive nav-button-button" data-v-ee5f7ac3 data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Contentful Alternative</span><!--[--><!----><!--]--><!--]--></a><a href="/medium-alternative/" class="nav-button nav-button--padding palette-button palette-button-interactive nav-button-button" data-v-ee5f7ac3 data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Medium Alternative</span><!--[--><!----><!--]--><!--]--></a><a href="/strapi-alternatives/" class="nav-button nav-button--padding palette-button palette-button-interactive nav-button-button" data-v-ee5f7ac3 data-v-7ec88356><!--[--><span class="nav-button__label--bold" data-v-7ec88356>Strapi Alternative</span><!--[--><!----><!--]--><!--]--></a><!--]--></div></div></div></div><!--]--></div><div class="footer-brand" data-v-53547ec0 data-v-1791aab3><a href="/" data-v-1791aab3><div class="image__container" style="--width-base:140px;--width-md:160px;--width-lg:160px;--width-xl:160px;--height-base:100%;--height-md:100%;--height-lg:100%;--height-xl:100%;" data-v-1791aab3 data-v-1a15d540><img src="https://cdn.buttercms.com/8Nbebgi6SU2yZVOPzjPA" alt="ButterCMS Logo" loading="lazy" class="image image--fit-contain" data-v-1a15d540></div></a><div class="footer-brand__social" data-v-1791aab3><!--[--><a class="button button--link palette-neutral-link palette-neutral-link-interactive" style="" href="https://linkedin.com/company/buttercms/" data-v-1791aab3 data-v-063ae83e><div class="button__content button__content--lg" data-v-063ae83e><span class="" data-v-063ae83e><!--[--><span class="icon icon--icon-color button__icon" data-v-063ae83e data-v-be81bbc2><i class="pi pi-linkedin" data-v-be81bbc2></i></span><!--]--></span><!--[--><div class="button__text" data-v-063ae83e></div><!--]--><!----></div><!----></a><a class="button button--link palette-neutral-link palette-neutral-link-interactive" style="" href="https://x.com/buttercms" data-v-1791aab3 data-v-063ae83e><div class="button__content button__content--lg" data-v-063ae83e><span class="" data-v-063ae83e><!--[--><span class="icon icon--icon-color button__icon" data-v-063ae83e data-v-be81bbc2><i class="pi pi-twitter" data-v-be81bbc2></i></span><!--]--></span><!--[--><div class="button__text" data-v-063ae83e></div><!--]--><!----></div><!----></a><a class="button button--link palette-neutral-link palette-neutral-link-interactive" style="" href="https://www.youtube.com/@buttercmsfm" data-v-1791aab3 data-v-063ae83e><div class="button__content button__content--lg" data-v-063ae83e><span class="" data-v-063ae83e><!--[--><span class="icon icon--icon-color button__icon" data-v-063ae83e data-v-be81bbc2><i class="pi pi-youtube" data-v-be81bbc2></i></span><!--]--></span><!--[--><div class="button__text" data-v-063ae83e></div><!--]--><!----></div><!----></a><a class="button button--link palette-neutral-link palette-neutral-link-interactive" style="" href="https://github.com/buttercms" data-v-1791aab3 data-v-063ae83e><div class="button__content button__content--lg" data-v-063ae83e><span class="" data-v-063ae83e><!--[--><span class="icon icon--icon-color button__icon" data-v-063ae83e data-v-be81bbc2><i class="pi pi-github" data-v-be81bbc2></i></span><!--]--></span><!--[--><div class="button__text" data-v-063ae83e></div><!--]--><!----></div><!----></a><a class="button button--link palette-neutral-link palette-neutral-link-interactive" style="" href="https://www.g2.com/products/butter-cms/reviews" data-v-1791aab3 data-v-063ae83e><div class="button__content button__content--lg" data-v-063ae83e><span class="" data-v-063ae83e><!--[--><span class="icon icon--icon-color button__icon" data-v-063ae83e data-v-be81bbc2><i class="tt-icon tt-icon--g2" data-v-be81bbc2></i></span><!--]--></span><!--[--><div class="button__text" data-v-063ae83e></div><!--]--><!----></div><!----></a><!--]--></div></div><div class="footer-legal" data-v-53547ec0 data-v-fd395dd4><p class="text text--size-sm text--weight-regular text--no-margin" color="muted" data-v-fd395dd4 data-v-2e32ee71><!--[-->© 2025 ButterCMS. All rights reserved.<!--]--></p><div class="footer-legal__links" data-v-fd395dd4><!--[--><a href="/privacy/" class="nav-button nav-button--padding palette-link palette-link-interactive nav-button-link" data-v-fd395dd4 data-v-7ec88356><!--[--><span class="" data-v-7ec88356>Privacy Policy</span><!--[--><!----><!--]--><!--]--></a><a href="/terms/" class="nav-button nav-button--padding palette-link palette-link-interactive nav-button-link" data-v-fd395dd4 data-v-7ec88356><!--[--><span class="" data-v-7ec88356>Terms of Use</span><!--[--><!----><!--]--><!--]--></a><!--]--></div></div></div><!--]--></footer><!--astro:end--></astro-island> </div> </body></html> |