For more advanced calculations, you can use SQL custom expressions. These expressions are helpful when the aggregation results for a billable metric require complex calculations.
When creating a billable metric, you can choose between using a simple aggregation field or a custom expression.
Custom expressions allow you to define more advanced computation logic, which is useful when the required aggregation involves complex calculations that Lago should handle.
Dashboard
API
To add a custom expression through the user interface:
Define the name and code for the billable metric;
Choose an aggregation type;
Select Custom expressions as the aggregation option instead of Unique field;
Enter your custom expression in the expanded side panel;
Test the custom expression; and
Save the billable metric.
Create a custom expression for a billable metric
Here are a few examples of custom expressions you can create for a billable metric:
If you need a custom expression that isn’t supported by default in Lago, feel free to contact our team or consider contributing to the open-source version.
Lago provides a testing tool to help you validate the custom expressions you’ve created. A sample event is used to test your expression. You can override any field in the test event.
If your custom expression is incorrect, Lago will return an error, and you won’t be able to save it until it’s valid.Keep the following in mind:
You can dynamically reference any event field within your expression; and
Use precise paths to reference fields accurately. For instance, to use the event timestamp, the path is event.timestamp. To reference a custom property sent with the event, the path is event.properties.your_field.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Lago","description":"Developer documentation for Lago, the open-source billing platform for usage metering, subscriptions, invoicing, payments, and revenue operations.","colors":{"primary":"#006CFA","light":"#006CFA","dark":"#006CFA"},"logo":{"light":"https://mintcdn.com/lago-docs/zZSJbpe68PHhSs3x/logo/light.svg?fit=max\u0026auto=format\u0026n=zZSJbpe68PHhSs3x\u0026q=85\u0026s=b4af3001527c985b81858b9a0928534c","dark":"https://mintcdn.com/lago-docs/zZSJbpe68PHhSs3x/logo/dark.svg?fit=max\u0026auto=format\u0026n=zZSJbpe68PHhSs3x\u0026q=85\u0026s=1eb7aacac796b0cc6bf05be790a792b1"},"favicon":"https://mintcdn.com/lago-docs/8N-yOElNGe9jRGG5/favicon.svg?fit=max\u0026auto=format\u0026n=8N-yOElNGe9jRGG5\u0026q=85\u0026s=5c319e58dd9b5c5b8a31cf2ad8009a1c","api":{"openapi":"https://swagger.getlago.com/openapi.yaml","mdx":{"server":"https://api.getlago.com/api/v1"}},"background":{"color":{"light":"#F5F5EF","dark":"#131923"}},"navbar":{"links":[{"href":"https://getlago.com/book-a-demo","label":"Book a Demo"}],"primary":{"type":"button","label":"Get Started","href":"https://getlago.com/book-a-demo"}},"footer":{"socials":{"github":"https://github.com/getlago/lago","slack":"https://getlago.com/slack","x":"https://x.com/getlago","linkedin":"https://www.linkedin.com/company/getlago","youtube":"https://www.youtube.com/channel/UCp6ltp7n3SgDVsmerJ7O7ZA"},"links":[{"header":"Documentation","items":[{"label":"Get started","href":"https://getlago.com/docs/guide/introduction/welcome-to-lago"},{"label":"API reference","href":"https://getlago.com/docs/api-reference/intro"},{"label":"Integrations","href":"https://getlago.com/docs/integrations/introduction"},{"label":"Templates","href":"https://getlago.com/docs/templates/introduction"},{"label":"Changelog","href":"https://getlago.com/docs/changelog/product"},{"label":"FAQ","href":"https://getlago.com/docs/faq/about-lago"}]},{"header":"Developers","items":[{"label":"Developer hub","href":"https://getlago.com/docs/developers"},{"label":"Authentication","href":"https://getlago.com/docs/auth"},{"label":"Webhooks","href":"https://getlago.com/docs/guide/webhooks"},{"label":"SDKs","href":"https://getlago.com/docs/developers"},{"label":"OpenAPI spec","href":"https://swagger.getlago.com/"},{"label":"MCP server","href":"https://getlago.com/docs/guide/ai-agents/mcp-server"},{"label":"Self-hosted","href":"https://getlago.com/docs/guide/lago-self-hosted/overview"},{"label":"llms.txt","href":"https://getlago.com/docs/llms.txt"}]},{"header":"Platform","items":[{"label":"Usage metering","href":"https://getlago.com/platform/usage-metering"},{"label":"Billing \u0026 invoicing","href":"https://getlago.com/platform/billing-invoicing"},{"label":"Cash collection","href":"https://getlago.com/platform/cash-collection"},{"label":"Revenue analytics","href":"https://getlago.com/platform/revenue-analytics"},{"label":"Entitlements","href":"https://getlago.com/platform/entitlements"},{"label":"Lago AI","href":"https://getlago.com/platform/ai"},{"label":"Pricing","href":"https://getlago.com/pricing"}]},{"header":"Company","items":[{"label":"About Lago","href":"https://getlago.com/docs/about"},{"label":"Customers","href":"https://getlago.com/customers"},{"label":"Blog","href":"https://getlago.com/blog"},{"label":"Contact","href":"https://getlago.com/docs/contact"},{"label":"Trust center","href":"https://security.getlago.com"},{"label":"Status","href":"https://status.getlago.com"}]}]},"seo":{"metatags":{"canonical":"https://getlago.com/docs","description":"Developer documentation for Lago's API-first billing platform, including OpenAPI, SDKs, webhooks, MCP, authentication, and implementation guides.","keywords":"Lago API, billing API, usage metering API, OpenAPI, billing SDK, Lago MCP"},"organization":{"id":"https://getlago.com/#organization","name":"Lago","legalName":"Get Lago Corp.","url":"https://getlago.com","logo":"https://getlago.com/docs/logo/light.svg","sameAs":["https://github.com/getlago","https://www.linkedin.com/company/getlago","https://x.com/GetLago","https://www.youtube.com/channel/UCp6ltp7n3SgDVsmerJ7O7ZA"]},"indexing":"all"},"fonts":{"heading":{"family":"GT America","weight":700,"source":"fonts/GT-America-Standard-Medium.woff2","format":"woff2"},"body":{"family":"GT America","source":"fonts/GT-America-Standard-Regular.woff2","format":"woff2"}},"styling":{"codeblocks":"dark","latex":true},"integrations":{"ga4":{"measurementId":"G-743BQ9THCG"},"cookies":{"key":"lago_docs_analytics","value":"granted"}},"errors":{"404":{"redirect":false,"title":"Documentation page not found","description":"No Lago documentation exists at this URL. Start at [Lago Developer Documentation](/welcome), browse [Developer Resources](/developers), inspect the [documentation index](/llms.txt) or [sitemap](/sitemap.xml), or search the [API reference](/api-reference/intro)."}},"contextual":{"options":["copy","view","chatgpt","claude"],"display":"header"},"navigation":{"global":{"anchors":[{"anchor":"Blog","icon":"newspaper","href":"https://getlago.com/blog"},{"anchor":"Community","icon":"slack","href":"https://getlago.com/slack"},{"anchor":"GitHub","icon":"github","href":"https://github.com/getlago/lago"},{"anchor":"Status","icon":"signal-bars","href":"https://status.getlago.com/"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"lago-docs","hasAudioNarration":false,"actualSubdomain":"lago-docs","customDomains":["getlago.com"],"gitSource":{"type":"github","owner":"getlago","repo":"lago-doc","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6adf4e12d7cf896c8ad837f6","collectionId":"ef513b95-75bf-42ca-a474-434543e00351","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6adf4e12d7cf896c8ad837f6"},"feedback":{"thumbs":true,"edits":true,"issues":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6adf4e12d7cf896c8ad837f6","clientVersion":"0.0.3971","searchFilterCounts":[{"language":"default","tag":"API References","count":235},{"language":"default","tag":"API Reference","count":235},{"language":"default","tag":"Guide","count":198},{"language":"default","tag":"Integrations","count":54},{"language":"default","tag":"Plans","count":46},{"language":"default","tag":"Resources","count":44},{"language":"default","tag":"Charges","count":39},{"language":"default","tag":"Pricing \u0026 Subscriptions","count":35},{"language":"default","tag":"Subscriptions","count":31},{"language":"default","tag":"Invoices","count":27}]},"assistantConfig":{},"basePath":"/docs","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"html{visibility:hidden;background-color:#f5f5ef}@media (prefers-color-scheme:dark){html{background-color:#131923}}html.ready{visibility:visible}.dark .welcome-card{background-color:#1c2535!important;border-color:rgba(255,255,255,.1)!important;box-shadow:0 1px 2px 0 rgba(0,0,0,.3)!important;color:#e5e7eb}.dark .welcome-card:hover{background-color:#243044!important}.dark #changelog-month-nav .changelog-month-nav__list a:hover,.dark .welcome-card h3{color:#fff}.dark .welcome-card p{color:#9ca3af!important}#changelog-month-nav{padding-left:2.5rem;width:19rem;box-sizing:border-box;margin-bottom:1.75rem;max-height:45vh;overflow-y:auto}#changelog-month-nav .changelog-month-nav__year{margin:0 0 .5rem;font-size:.875rem;line-height:1.5rem;font-weight:500;color:#364152}#changelog-month-nav .changelog-month-nav__list{list-style:none;margin:0;padding:0;border-left:1px solid rgba(0,0,0,.08)}#changelog-month-nav .changelog-month-nav__list a{display:block;padding:.25rem 0 .25rem .75rem;margin-left:-1px;border-left:1px solid transparent;font-size:.875rem;line-height:1.5rem;color:#697586;text-decoration:none;transition:color .15s ease,border-color .15s ease}#changelog-month-nav .changelog-month-nav__list a:hover{color:#121926}#changelog-month-nav .changelog-month-nav__list a.is-active{color:#006cfa;border-left-color:#006cfa;font-weight:500}.dark #changelog-month-nav .changelog-month-nav__year{color:#cdd5df}.dark #changelog-month-nav .changelog-month-nav__list{border-left-color:rgba(255,255,255,.12)}.dark #changelog-month-nav .changelog-month-nav__list a{color:#9aa4b2}.dark #changelog-month-nav .changelog-month-nav__list a.is-active{color:#4d9bff;border-left-color:#4d9bff}.update-container>div:first-child{display:none}.update-container>div:nth-child(2){flex:1 1 100%;max-width:100%;width:100%}.update-container{gap:0}#footer a[href*=\"utm_campaign=poweredBy\"]{display:none}"}],"page":{"pagePath":"guide/billable-metrics/sql-expressions","slug":"/guide/billable-metrics/sql-expressions","pageMetadata":{"title":"SQL expressions","description":"For more advanced calculations, you can use SQL custom expressions. These expressions are helpful when the aggregation results for a billable metric require complex calculations.","href":"/guide/billable-metrics/sql-expressions"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"For more advanced calculations, you can use SQL custom expressions. These expressions are helpful when the aggregation results for a billable metric require complex calculations.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,CodeGroup,Frame,Heading,Info,OptimizedImage,Tab,Tabs}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!CodeGroup)_missingMdxReference(`CodeGroup`,true);if(!Frame)_missingMdxReference(`Frame`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Info)_missingMdxReference(`Info`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Tab)_missingMdxReference(`Tab`,true);if(!Tabs)_missingMdxReference(`Tabs`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`2`,id:`creating-a-sql-custom-expression`,children:`Creating a SQL custom expression`}),`\n`,_jsxs(_components.p,{children:[`When creating a billable metric, you can choose between using a simple aggregation field or a custom expression.\n`,_jsx(_components.strong,{children:`Custom expressions allow you to define more advanced computation logic`}),`, which is useful when the required aggregation involves complex calculations that Lago should handle.`]}),`\n`,_jsxs(Tabs,{children:[_jsxs(Tab,{title:`Dashboard`,id:`dashboard`,children:[_jsx(_components.p,{children:`To add a custom expression through the user interface:`}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Define the `,_jsx(_components.code,{children:`name`}),` and `,_jsx(_components.code,{children:`code`}),` for the billable metric;`]}),`\n`,_jsx(_components.li,{children:`Choose an aggregation type;`}),`\n`,_jsxs(_components.li,{children:[`Select `,_jsx(_components.code,{children:`Custom expressions`}),` as the aggregation option instead of `,_jsx(_components.code,{children:`Unique field`}),`;`]}),`\n`,_jsx(_components.li,{children:`Enter your custom expression in the expanded side panel;`}),`\n`,_jsx(_components.li,{children:`Test the custom expression; and`}),`\n`,_jsx(_components.li,{children:`Save the billable metric.`}),`\n`]}),_jsx(Frame,{caption:`Create a custom expression for a billable metric`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/lago-docs/L57i4PY_iDpAEuWL/guide/billable-metrics/images/custom-expression-creation.png?fit=max\u0026auto=format\u0026n=L57i4PY_iDpAEuWL\u0026q=85\u0026s=e2f0bb331d9fb36c03508d22e89f469a`,\"data-og-width\":`1636`,width:`1636`,\"data-og-height\":`1028`,height:`1028`,\"data-path\":`guide/billable-metrics/images/custom-expression-creation.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/lago-docs/L57i4PY_iDpAEuWL/guide/billable-metrics/images/custom-expression-creation.png?w=280\u0026fit=max\u0026auto=format\u0026n=L57i4PY_iDpAEuWL\u0026q=85\u0026s=0615c5b804ca6aeca2b9e676f0095d55 280w, https://mintcdn.com/lago-docs/L57i4PY_iDpAEuWL/guide/billable-metrics/images/custom-expression-creation.png?w=560\u0026fit=max\u0026auto=format\u0026n=L57i4PY_iDpAEuWL\u0026q=85\u0026s=25555214ba19e21d5987099622a11bb4 560w, https://mintcdn.com/lago-docs/L57i4PY_iDpAEuWL/guide/billable-metrics/images/custom-expression-creation.png?w=840\u0026fit=max\u0026auto=format\u0026n=L57i4PY_iDpAEuWL\u0026q=85\u0026s=c4f1b3b10419a7162d451003a4a91a28 840w, https://mintcdn.com/lago-docs/L57i4PY_iDpAEuWL/guide/billable-metrics/images/custom-expression-creation.png?w=1100\u0026fit=max\u0026auto=format\u0026n=L57i4PY_iDpAEuWL\u0026q=85\u0026s=b5c2466a20ce5f7b9013fc26f6fa03f9 1100w, https://mintcdn.com/lago-docs/L57i4PY_iDpAEuWL/guide/billable-metrics/images/custom-expression-creation.png?w=1650\u0026fit=max\u0026auto=format\u0026n=L57i4PY_iDpAEuWL\u0026q=85\u0026s=5ccf633dcaaaa9869ff4646d3a678517 1650w, https://mintcdn.com/lago-docs/L57i4PY_iDpAEuWL/guide/billable-metrics/images/custom-expression-creation.png?w=2500\u0026fit=max\u0026auto=format\u0026n=L57i4PY_iDpAEuWL\u0026q=85\u0026s=7ea790e1f7efe7c3aa4bbec2cdec083f 2500w`})})]}),_jsxs(Tab,{title:`API`,id:`api`,children:[_jsx(_components.p,{children:`Here are a few examples of custom expressions you can create for a billable metric:`}),_jsxs(CodeGroup,{children:[_jsx(CodeBlock,{filename:`Storage`,highlight:`[13,14]`,numberOfLines:`17`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes dark-plus dark-plus`,style:{backgroundColor:`#0B0C0E`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`17`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` LAGO_URL`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`\"https://api.getlago.com\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` API_KEY`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`\"__YOUR_API_KEY__\"`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:` curl`}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:` --location`}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:` --request`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` POST`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` \"`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`$LAGO_URL`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`/api/v1/billable_metrics\"`}),_jsx(_components.span,{style:{color:`#D7BA7D`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:` --header`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` \"Authorization: Bearer `}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`$API_KEY`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#D7BA7D`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:` --header`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` 'Content-Type: application/json'`}),_jsx(_components.span,{style:{color:`#D7BA7D`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:` --data-raw`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` '{`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` \"billable_metric\": {`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` \"name\": \"Storage\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` \"code\": \"storage\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` \"description\": \"Number of GB consumed\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` \"aggregation_type\": \"sum_agg\",`})}),`\n`,_jsx(_components.span,{className:`line line-highlight`,children:_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` \"expression\": \"event.properties.gb * event.properties.replicas * (event.properties.ended_at - event.properties.started_at) / 3600\",`})}),`\n`,_jsx(_components.span,{className:`line line-highlight`,children:_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` \"field_name\": \"consumed_gb_hours\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` \"recurring\": false`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` }'`})}),`\n`]})})}),_jsx(CodeBlock,{filename:`Seats`,highlight:`[13]`,numberOfLines:`17`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes dark-plus dark-plus`,style:{backgroundColor:`#0B0C0E`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`17`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` LAGO_URL`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`\"https://api.getlago.com\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` API_KEY`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`\"__YOUR_API_KEY__\"`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:` curl`}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:` --location`}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:` --request`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` POST`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` \"`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`$LAGO_URL`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`/api/v1/billable_metrics\"`}),_jsx(_components.span,{style:{color:`#D7BA7D`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:` --header`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` \"Authorization: Bearer `}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`$API_KEY`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#D7BA7D`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:` --header`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` 'Content-Type: application/json'`}),_jsx(_components.span,{style:{color:`#D7BA7D`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:` --data-raw`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` '{`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` \"billable_metric\": {`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` \"name\": \"Seats\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` \"code\": \"seats\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` \"description\": \"Number of seats used\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` \"aggregation_type\": \"unique_count_agg\",`})}),`\n`,_jsxs(_components.span,{className:`line line-highlight`,children:[_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` \"expression\": \"CONCAT(event.properties.user_id, '`}),_jsx(_components.span,{style:{color:`#D7BA7D`,\"--shiki-dark\":`#D7BA7D`},children:`\\\\'`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`'-'`}),_jsx(_components.span,{style:{color:`#D7BA7D`,\"--shiki-dark\":`#D7BA7D`},children:`\\\\'`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`' , event.properties.app_id)\",`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` \"field_name\": \"seat_id\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` \"recurring\": true`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` }'`})}),`\n`]})})})]})]})]}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[`Custom expressions can be used with any aggregation type except `,_jsx(_components.code,{children:`COUNT`}),`.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`supported-expressions`,children:`Supported expressions`}),`\n`,_jsx(_components.p,{children:`A variety of SQL custom expressions are available for use. Here are a few examples:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Concatenation:`}),` `,_jsx(_components.code,{children:`CONCAT(event.properties.user_id, '-', event.properties.app_id)`})]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Math operations:`}),` `,_jsx(_components.code,{children:`(event.properties.cpu_number * 25 * event.properties.duration_msec) + (event.properties.memory_mb * 0.000001 * event.properties.duration_msec)`})]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Rounding:`}),` `,_jsx(_components.code,{children:`ROUND(event.properties.duration_msec * 1000)`})]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Least/Greatest:`}),` `,_jsx(_components.code,{children:`LEAST(event.properties.memory_mb, 10.0)`})]}),`\n`]}),`\n`,_jsx(_components.p,{children:`You can find the full list of supported expressions below:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`#event-attributes`,children:`Event attributes`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`#atoms`,children:`Atoms`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`#operators`,children:`Operators`})}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`#functions`,children:`Functions`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`#concat`,children:_jsx(_components.code,{children:`CONCAT`})})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`#round`,children:_jsx(_components.code,{children:`ROUND`})})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`#floor`,children:_jsx(_components.code,{children:`FLOOR`})})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`#ceil`,children:_jsx(_components.code,{children:`CEIL`})})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`#least`,children:_jsx(_components.code,{children:`LEAST`})})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`#greatest`,children:_jsx(_components.code,{children:`GREATEST`})})}),`\n`]}),`\n`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`If you need a custom expression that isn’t supported by default in Lago, `,_jsx(_components.strong,{children:`feel free to contact our team`}),` or `,_jsx(_components.strong,{children:`consider contributing to the open-source version`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`event-attributes`,children:`Event attributes`}),`\n`,_jsx(_components.p,{children:`Lago expressions may include the following event attributes:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`event.code`}),` (event code)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`event.timestamp`}),` (event timestamp)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`event.properties.[property_name]`}),` (event property)`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`For example, `,_jsx(_components.code,{children:`event.properties.my_property`}),` is a valid event attribute.`]}),`\n`,_jsx(Heading,{level:`3`,id:`atoms`,children:`Atoms`}),`\n`,_jsx(_components.p,{children:`Lago expressions may include atoms:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`123`}),` (integer)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`123.45`}),` (decimal)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`'Hello, world!'`}),` (string)`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`operators`,children:`Operators`}),`\n`,_jsx(_components.p,{children:`Lago expressions may include basic operators:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`+`}),` (addition)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`-`}),` (subtraction)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`*`}),` (multiplication)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`/`}),` (division)`]}),`\n`,_jsxs(_components.li,{children:[`unary minus (`,_jsx(_components.code,{children:`-12`}),`)`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`functions`,children:`Functions`}),`\n`,_jsx(Heading,{level:`4`,id:`concat`,children:_jsx(_components.code,{children:`CONCAT`})}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`CONCAT`}),` function is used to concatenate two or more strings.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`sql`,children:_jsx(_components.pre,{className:`shiki shiki-themes dark-plus dark-plus`,style:{backgroundColor:`#0B0C0E`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},language:`sql`,children:_jsxs(_components.code,{language:`sql`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`CONCAT`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`(str1, str2[,strs,...])`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Parameters:`})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`str1`}),`: The first string to concatenate`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`str2`}),`: The second string to concatenate`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`strs`}),`: (Optional) Additional strings to concatenate.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Returns:`}),` A string with the concatenated strings.`]}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Examples:`})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`CONCAT(event.properties.user_id, '-', event.properties.app_id)`})}),`\n`]}),`\n`,_jsx(Heading,{level:`4`,id:`round`,children:_jsx(_components.code,{children:`ROUND`})}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`ROUND`}),` function is used to round a number to a specified number of decimal places.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`sql`,children:_jsx(_components.pre,{className:`shiki shiki-themes dark-plus dark-plus`,style:{backgroundColor:`#0B0C0E`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},language:`sql`,children:_jsxs(_components.code,{language:`sql`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`ROUND`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`value`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`precision`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Parameters:`})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`value`}),`: The number to round`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`precision`}),`: (Optional) Number of decimal places. Defaults to `,_jsx(_components.code,{children:`0`}),`.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Returns:`}),` A number rounded to the specified precision.`]}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Examples:`})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`ROUND(14.2355)`}),` returns `,_jsx(_components.code,{children:`14`})]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`ROUND(14.2355, 0)`}),` returns `,_jsx(_components.code,{children:`14`})]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`ROUND(14.2355, 2)`}),` returns `,_jsx(_components.code,{children:`14.24`})]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`ROUND(14.2355, -1)`}),` returns `,_jsx(_components.code,{children:`10`})]}),`\n`]}),`\n`,_jsx(Heading,{level:`4`,id:`floor`,children:_jsx(_components.code,{children:`FLOOR`})}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`FLOOR`}),` function is used to round a number down to the nearest integer.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`sql`,children:_jsx(_components.pre,{className:`shiki shiki-themes dark-plus dark-plus`,style:{backgroundColor:`#0B0C0E`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},language:`sql`,children:_jsxs(_components.code,{language:`sql`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`FLOOR`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`value`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`precision`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Parameters:`})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`value`}),`: The number to round`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`precision`}),`: (Optional) Number of decimal places. Defaults to `,_jsx(_components.code,{children:`0`}),`.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Returns:`}),` A number rounded down to the specified precision.`]}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Examples:`})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`FLOOR(16.2365)`}),` returns `,_jsx(_components.code,{children:`16`})]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`FLOOR(16.2365, 0)`}),` returns `,_jsx(_components.code,{children:`16`})]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`FLOOR(16.2365, 2)`}),` returns `,_jsx(_components.code,{children:`16.23`})]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`FLOOR(16.2365, -1)`}),` returns `,_jsx(_components.code,{children:`10`})]}),`\n`]}),`\n`,_jsx(Heading,{level:`4`,id:`ceil`,children:_jsx(_components.code,{children:`CEIL`})}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`CEIL`}),` function is used to round a number up to the nearest integer.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`sql`,children:_jsx(_components.pre,{className:`shiki shiki-themes dark-plus dark-plus`,style:{backgroundColor:`#0B0C0E`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},language:`sql`,children:_jsxs(_components.code,{language:`sql`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`CEIL(`}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`value`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`precision`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Parameters:`})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`value`}),`: The number to round`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`precision`}),`: (Optional) Number of decimal places. Defaults to `,_jsx(_components.code,{children:`0`}),`.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Returns:`}),` A number rounded up to the specified precision.`]}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Examples:`})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`CEIL(14.2345)`}),` returns `,_jsx(_components.code,{children:`15`})]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`CEIL(14.2345, 0)`}),` returns `,_jsx(_components.code,{children:`15`})]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`CEIL(14.2345, 2)`}),` returns `,_jsx(_components.code,{children:`14.24`})]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`CEIL(14.2345, -1)`}),` returns `,_jsx(_components.code,{children:`20`})]}),`\n`]}),`\n`,_jsx(Heading,{level:`4`,id:`least`,children:_jsx(_components.code,{children:`LEAST`})}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`LEAST`}),` function is used to find the minimum of two or more numbers.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`sql`,children:_jsx(_components.pre,{className:`shiki shiki-themes dark-plus dark-plus`,style:{backgroundColor:`#0B0C0E`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},language:`sql`,children:_jsxs(_components.code,{language:`sql`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`LEAST`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`(num1, num2[,nums,...])`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Parameters:`})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`num1`}),`: The first number to check minimum value`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`num2`}),`: The second number to check minimum value`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`nums`}),`: (Optional) Additional numbers to check minimum value.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Returns:`}),` The minimum of the given numbers.`]}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Examples:`})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`LEAST(event.properties.disk1_usage_mb, event.properties.disk2_usage_mb, 10.0)`})}),`\n`]}),`\n`,_jsx(Heading,{level:`4`,id:`greatest`,children:_jsx(_components.code,{children:`GREATEST`})}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`GREATEST`}),` function is used to find the maximum of two or more numbers.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`sql`,children:_jsx(_components.pre,{className:`shiki shiki-themes dark-plus dark-plus`,style:{backgroundColor:`#0B0C0E`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},language:`sql`,children:_jsxs(_components.code,{language:`sql`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`GREATEST`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`(num1, num2[,nums,...])`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Parameters:`})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`num1`}),`: The first number to check maximum value`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`num2`}),`: The second number to check maximum value`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`nums`}),`: (Optional) Additional numbers to check maximum value.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Returns:`}),` The maximum of the given numbers.`]}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Examples:`})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`GREATEST(event.properties.memory_mb, 10.0)`})}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`testing-your-sql-custom-expression`,children:`Testing your SQL custom expression`}),`\n`,_jsx(_components.p,{children:`Lago provides a testing tool to help you validate the custom expressions you’ve created. A sample event is used to test your expression. You can override any field in the test event.\nIf your custom expression is incorrect, Lago will return an error, and you won’t be able to save it until it’s valid.`}),`\n`,_jsx(_components.p,{children:`Keep the following in mind:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`You can dynamically reference any event field within your expression; and`}),`\n`,_jsxs(_components.li,{children:[`Use precise paths to reference fields accurately. For instance, to use the event timestamp, the path is `,_jsx(_components.code,{children:`event.timestamp`}),`. To reference a custom property sent with the event, the path is `,_jsx(_components.code,{children:`event.properties.your_field`}),`.`]}),`\n`]}),`\n`,_jsx(Frame,{caption:`Test your custom expression`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/lago-docs/L57i4PY_iDpAEuWL/guide/billable-metrics/images/test-custom-expression.png?fit=max\u0026auto=format\u0026n=L57i4PY_iDpAEuWL\u0026q=85\u0026s=b78b53417f8d4b209949406a3ec7f67d`,\"data-og-width\":`1636`,width:`1636`,\"data-og-height\":`1035`,height:`1035`,\"data-path\":`guide/billable-metrics/images/test-custom-expression.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/lago-docs/L57i4PY_iDpAEuWL/guide/billable-metrics/images/test-custom-expression.png?w=280\u0026fit=max\u0026auto=format\u0026n=L57i4PY_iDpAEuWL\u0026q=85\u0026s=f683465854f1ff12c1f999b76dc770d5 280w, https://mintcdn.com/lago-docs/L57i4PY_iDpAEuWL/guide/billable-metrics/images/test-custom-expression.png?w=560\u0026fit=max\u0026auto=format\u0026n=L57i4PY_iDpAEuWL\u0026q=85\u0026s=0d1e7564caafb1dfd8e9a738853e9609 560w, https://mintcdn.com/lago-docs/L57i4PY_iDpAEuWL/guide/billable-metrics/images/test-custom-expression.png?w=840\u0026fit=max\u0026auto=format\u0026n=L57i4PY_iDpAEuWL\u0026q=85\u0026s=57594e02a1818bf2d8539fa81ea8865c 840w, https://mintcdn.com/lago-docs/L57i4PY_iDpAEuWL/guide/billable-metrics/images/test-custom-expression.png?w=1100\u0026fit=max\u0026auto=format\u0026n=L57i4PY_iDpAEuWL\u0026q=85\u0026s=797a6371857c0178823a892330a96c34 1100w, https://mintcdn.com/lago-docs/L57i4PY_iDpAEuWL/guide/billable-metrics/images/test-custom-expression.png?w=1650\u0026fit=max\u0026auto=format\u0026n=L57i4PY_iDpAEuWL\u0026q=85\u0026s=cd947e95a2144fa086b03c644917d9bc 1650w, https://mintcdn.com/lago-docs/L57i4PY_iDpAEuWL/guide/billable-metrics/images/test-custom-expression.png?w=2500\u0026fit=max\u0026auto=format\u0026n=L57i4PY_iDpAEuWL\u0026q=85\u0026s=d226499e7adb84b75f89fd71fcdbc7fd 2500w`})})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"codeStyling":"dark","config":{},"pageMetadata":{"title":"SQL expressions","description":"For more advanced calculations, you can use SQL custom expressions. These expressions are helpful when the aggregation results for a billable metric require complex calculations.","href":"/guide/billable-metrics/sql-expressions"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Creating a SQL custom expression","slug":"creating-a-sql-custom-expression","depth":2,"children":[]},{"title":"Supported expressions","slug":"supported-expressions","depth":2,"children":[{"title":"Event attributes","slug":"event-attributes","depth":3,"children":[]},{"title":"Atoms","slug":"atoms","depth":3,"children":[]},{"title":"Operators","slug":"operators","depth":3,"children":[]},{"title":"Functions","slug":"functions","depth":3,"children":[]},{"title":"CONCAT","slug":"concat","depth":4,"children":[]},{"title":"ROUND","slug":"round","depth":4,"children":[]},{"title":"FLOOR","slug":"floor","depth":4,"children":[]},{"title":"CEIL","slug":"ceil","depth":4,"children":[]},{"title":"LEAST","slug":"least","depth":4,"children":[]},{"title":"GREATEST","slug":"greatest","depth":4,"children":[]}]},{"title":"Testing your SQL custom expression","slug":"testing-your-sql-custom-expression","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/docs/_mintlify/custom/lago-docs/a0e77058367d9146/canonical.js","/docs/_mintlify/custom/lago-docs/fa2446312177e9c6/loader.js","/docs/_mintlify/custom/lago-docs/c55d8403f7fc83ad/changelog-anchor-redirect.js","/docs/_mintlify/custom/lago-docs/8c326c8b67b47933/changelog-month-nav.js","/docs/_mintlify/custom/lago-docs/103c90943d27f62a/webmcp.js","/docs/_mintlify/custom/lago-docs/1219fb859e5c496e/github-outbound.js"],"subdomain":"lago-docs","siteName":"Lago","title":"SQL expressions - Lago","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-05T14:25:26.108Z","originalFileLocation":"guide/billable-metrics/sql-expressions.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"For more advanced calculations, you can use SQL custom expressions. These expressions are helpful when the aggregation results for a billable metric require complex calculations.\">\u003cmeta data-mint-head name=\"keywords\" content=\"Lago API, billing API, usage metering API, OpenAPI, billing SDK, Lago MCP\">\u003cmeta data-mint-head name=\"application-name\" content=\"Lago\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/lago-docs/PXUAhcpsneOuo3Dn/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/docs/mintlify-assets/_mintlify/favicons/lago-docs/PXUAhcpsneOuo3Dn/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/lago-docs/PXUAhcpsneOuo3Dn/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/lago-docs/PXUAhcpsneOuo3Dn/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/lago-docs/PXUAhcpsneOuo3Dn/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/lago-docs/PXUAhcpsneOuo3Dn/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/lago-docs/PXUAhcpsneOuo3Dn/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/lago-docs/PXUAhcpsneOuo3Dn/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/lago-docs/PXUAhcpsneOuo3Dn/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"SQL expressions - Lago\">\u003cmeta data-mint-head property=\"og:description\" content=\"For more advanced calculations, you can use SQL custom expressions. These expressions are helpful when the aggregation results for a billable metric require complex calculations.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Lago\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://getlago.com/docs/guide/billable-metrics/sql-expressions\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://lago-docs.mintlify.app/_mintlify/api/og/v2?division=Billable+metrics\u0026amp;title=SQL+expressions\u0026amp;description=For+more+advanced+calculations%2C+you+can+use+SQL+custom+expressions.+These+expressions+are+helpful+when+the+aggregation+results+for+a+billable+metric+require+com\u0026amp;theme=eb987f771609ccd12d360d11\u0026amp;signature=d9640f7dec821c6e0d7f41c27656d8e487f64c3b7206dc213432932042991614\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"SQL expressions - Lago\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"For more advanced calculations, you can use SQL custom expressions. These expressions are helpful when the aggregation results for a billable metric require complex calculations.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://lago-docs.mintlify.app/_mintlify/api/og/v2?division=Billable+metrics\u0026amp;title=SQL+expressions\u0026amp;description=For+more+advanced+calculations%2C+you+can+use+SQL+custom+expressions.+These+expressions+are+helpful+when+the+aggregation+results+for+a+billable+metric+require+com\u0026amp;theme=eb987f771609ccd12d360d11\u0026amp;signature=d9640f7dec821c6e0d7f41c27656d8e487f64c3b7206dc213432932042991614\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/docs/mintlify-assets/_mintlify/favicons/lago-docs/PXUAhcpsneOuo3Dn/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Lago\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#006CFA\">\u003clink data-mint-head rel=\"canonical\" href=\"https://getlago.com/docs/guide/billable-metrics/sql-expressions\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/docs/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/docs/guide/billable-metrics/sql-expressions.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://getlago.com/#organization\",\"name\":\"Lago\",\"legalName\":\"Get Lago Corp.\",\"url\":\"https://getlago.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://getlago.com/docs/logo/light.svg\"},\"sameAs\":[\"https://github.com/getlago\",\"https://www.linkedin.com/company/getlago\",\"https://x.com/GetLago\",\"https://www.youtube.com/channel/UCp6ltp7n3SgDVsmerJ7O7ZA\"]},{\"@type\":\"WebSite\",\"@id\":\"https://getlago.com/docs#website\",\"name\":\"Lago\",\"url\":\"https://getlago.com/docs\",\"publisher\":{\"@id\":\"https://getlago.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://getlago.com/docs/guide/billable-metrics/sql-expressions#webpage\",\"url\":\"https://getlago.com/docs/guide/billable-metrics/sql-expressions\",\"name\":\"SQL expressions\",\"description\":\"For more advanced calculations, you can use SQL custom expressions. These expressions are helpful when the aggregation results for a billable metric require complex calculations.\",\"dateModified\":\"2026-10-05T14:25:26.108Z\",\"isPartOf\":{\"@id\":\"https://getlago.com/docs#website\"},\"breadcrumb\":{\"@id\":\"https://getlago.com/docs/guide/billable-metrics/sql-expressions#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://getlago.com/docs/guide/billable-metrics/sql-expressions#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Events \u0026 Usage Components\",\"item\":\"https://getlago.com/docs/guide/billable-metrics/create-billable-metrics\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Billable metrics\",\"item\":\"https://getlago.com/docs/guide/billable-metrics/create-billable-metrics\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"SQL expressions\",\"item\":\"https://getlago.com/docs/guide/billable-metrics/sql-expressions\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://getlago.com/docs/guide/billable-metrics/sql-expressions#article\",\"headline\":\"SQL expressions\",\"name\":\"SQL expressions\",\"description\":\"For more advanced calculations, you can use SQL custom expressions. These expressions are helpful when the aggregation results for a billable metric require complex calculations.\",\"url\":\"https://getlago.com/docs/guide/billable-metrics/sql-expressions\",\"mainEntityOfPage\":{\"@id\":\"https://getlago.com/docs/guide/billable-metrics/sql-expressions#webpage\"},\"dateModified\":\"2026-10-05T14:25:26.108Z\",\"publisher\":{\"@id\":\"https://getlago.com/#organization\"},\"isPartOf\":{\"@id\":\"https://getlago.com/docs#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Lago\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Lago","nav":{"global":{"anchors":[{"anchor":"Blog","icon":"newspaper","href":"https://getlago.com/blog"},{"anchor":"Community","icon":"slack","href":"https://getlago.com/slack"},{"anchor":"GitHub","icon":"github","href":"https://github.com/getlago/lago"},{"anchor":"Status","icon":"signal-bars","href":"https://status.getlago.com/"}]},"tabs":[{"tab":"Home","pages":[{"title":"Home","href":"/welcome"}]},{"tab":"Guide","groups":[{"group":"Introduction","pages":[{"title":"Welcome to Lago","href":"/guide/introduction/welcome-to-lago"},{"title":"Why billing is a nightmare","href":"/guide/introduction/why-billing-is-a-nightmare"}]},{"group":"Get started","pages":[{"title":"Lago Cloud","href":"/guide/lago-cloud"},{"group":"Lago Self-hosted","pages":[{"title":"Self-hosting overview","sidebarTitle":"Overview","href":"/guide/lago-self-hosted/overview"},{"title":"Docker","href":"/guide/lago-self-hosted/docker"},{"title":"Kubernetes","href":"/guide/lago-self-hosted/kubernetes"},{"title":"Compatibility matrix","href":"/guide/lago-self-hosted/compatibility-matrix"},{"title":"Database maintenance","href":"/guide/lago-self-hosted/database-maintenance"},{"title":"Tracking and analytics","href":"/guide/lago-self-hosted/tracking-analytics"},{"title":"Versions update","href":"/guide/lago-self-hosted/update-instance"},{"title":"Useful commands","href":"/guide/lago-self-hosted/commands"}]}]},{"group":"Events \u0026 Usage Components","pages":[{"group":"Billable metrics","pages":[{"title":"Create billable metrics","href":"/guide/billable-metrics/create-billable-metrics"},{"group":"Aggregation types","pages":[{"title":"Aggregation types: how usage is measured and counted","sidebarTitle":"Overview","href":"/guide/billable-metrics/aggregation-types/overview"},{"title":"COUNT","href":"/guide/billable-metrics/aggregation-types/count"},{"title":"UNIQUE COUNT","href":"/guide/billable-metrics/aggregation-types/count-unique"},{"title":"LATEST","href":"/guide/billable-metrics/aggregation-types/latest"},{"title":"MAX","href":"/guide/billable-metrics/aggregation-types/max"},{"title":"SUM","href":"/guide/billable-metrics/aggregation-types/sum"},{"title":"WEIGHTED SUM","href":"/guide/billable-metrics/aggregation-types/weighted-sum"},{"title":"CUSTOM","href":"/guide/billable-metrics/aggregation-types/custom-agg"},{"title":"Aggregation examples","href":"/guide/billable-metrics/aggregation-types/aggregation-examples"}]},{"title":"Recurring vs metered","description":null,"href":"/guide/billable-metrics/recurring-vs-metered"},{"title":"SQL expressions","href":"/guide/billable-metrics/sql-expressions"},{"title":"Rounding","description":"Lago aggregates your events in real time. You can add rounding rules to the final result.","href":"/guide/billable-metrics/rounding"},{"title":"Filters and dimensions","href":"/guide/billable-metrics/filters"},{"title":"Delete billable metrics","href":"/guide/billable-metrics/delete-billable-metrics"}]},{"group":"Usage ingestion","pages":[{"title":"Ingest usage","href":"/guide/events/ingesting-usage"},{"title":"Performance and optimization","href":"/guide/events/usage-performances"},{"title":"Metering ingestion sources","href":"/guide/events/metering-source"},{"title":"Retrieve usage","href":"/guide/events/retrieve-usage"}]},{"group":"Alerts","pages":[{"title":"Usage alerts","href":"/guide/alerts/usage-alerts"},{"title":"Credits consumption alerts","href":"/guide/alerts/credits-consumption-alerts"}]}]},{"group":"Pricing \u0026 Subscriptions","pages":[{"group":"Plans","pages":[{"title":"Plans: price subscriptions, usage and hybrid models","sidebarTitle":"Overview","href":"/guide/plans/overview"},{"title":"Plan model","href":"/guide/plans/plan-model"},{"group":"Charges","pages":[{"title":"Usage based charge","href":"/guide/plans/charges/usage-based-charges"},{"title":"Fixed charge","href":"/guide/plans/charges/fixed-charges"},{"group":"Charge models","pages":[{"title":"Standard","href":"/guide/plans/charges/charge-models/standard"},{"title":"Graduated","href":"/guide/plans/charges/charge-models/graduated"},{"title":"Package","href":"/guide/plans/charges/charge-models/package"},{"title":"Percentage","href":"/guide/plans/charges/charge-models/percentage"},{"title":"Volume","href":"/guide/plans/charges/charge-models/volume"},{"title":"Graduated percentage","href":"/guide/plans/charges/charge-models/graduated-percentage"},{"title":"Dynamic","href":"/guide/plans/charges/charge-models/dynamic"},{"title":"Custom price","href":"/guide/plans/charges/charge-models/custom-price"}]},{"title":"Metered vs Recurring","href":"/guide/plans/charges/metered-vs-recurring"},{"title":"Arrears vs Advance","href":"/guide/plans/charges/arrears-vs-advance"},{"title":"Prorated vs Full","href":"/guide/plans/charges/prorated-vs-full"},{"title":"Spending minimums","href":"/guide/plans/charges/spending-minimum"},{"title":"Invoiceable vs Uninvoiceable","href":"/guide/plans/charges/invoiceable-vs-noninvoiceable"},{"title":"Charges with filters","href":"/guide/plans/charges/charges-with-filters"},{"title":"Group keys","href":"/guide/plans/charges/grouping"}]},{"title":"Custom pricing units","href":"/guide/plans/custom-pricing-units"},{"title":"Commitments","href":"/guide/plans/commitment"},{"title":"Progressive billing","href":"/guide/plans/progressive-billing"}]},{"group":"Customers","pages":[{"title":"Customer management","href":"/guide/customers/customer-management"},{"title":"Customer metadata","href":"/guide/customers/customer-metadata"},{"title":"Invoice a customer","href":"/guide/customers/invoice-customer"},{"title":"The customer portal","href":"/guide/customers/customer-portal"}]},{"title":"Billing entities","href":"/guide/billing-entities"},{"group":"Subscriptions","pages":[{"title":"Assign a plan to a customer","href":"/guide/subscriptions/assign-plan"},{"title":"Activation rules","href":"/guide/subscriptions/activation-rules"},{"title":"Upgrades and downgrades","href":"/guide/subscriptions/upgrades-downgrades"},{"title":"Edit a subscription","href":"/guide/subscriptions/edit-subscription"},{"title":"Terminate a subscription","href":"/guide/subscriptions/terminate-subscription"}]},{"title":"Coupons","href":"/guide/coupons"},{"title":"Entitlements","href":"/guide/entitlements"},{"title":"Emails","href":"/guide/emails"}]},{"group":"Quotes \u0026 Order Forms","pages":[{"title":"Quotes and order forms: from proposal to provisioned billing","sidebarTitle":"Overview","href":"/guide/quotes/overview"},{"title":"Creating a quote","href":"/guide/quotes/create-a-quote"},{"title":"Writing the quote content","href":"/guide/quotes/quote-editor"},{"title":"Order forms","href":"/guide/quotes/order-forms"},{"title":"Orders","href":"/guide/quotes/orders"},{"title":"Limitations","href":"/guide/quotes/limitations"}]},{"group":"Invoicing","pages":[{"group":"Invoices","pages":[{"title":"Invoicing: generate invoices from plans and usage","sidebarTitle":"Overview","href":"/guide/invoicing/overview"},{"group":"Invoicing settings","pages":[{"title":"Invoicing settings: customize invoices per billing entity","sidebarTitle":"Overview","href":"/guide/invoicing/invoicing-settings/overview"},{"title":"Invoice numbering","href":"/guide/invoicing/invoicing-settings/invoice-numbering"},{"title":"Grace period","href":"/guide/invoicing/invoicing-settings/grace-period"},{"title":"Net payment term","href":"/guide/invoicing/invoicing-settings/net-payment-term"},{"title":"Empty invoice generation","href":"/guide/invoicing/invoicing-settings/empty-invoices"},{"title":"Issuing date preferences","href":"/guide/invoicing/invoicing-settings/issuing_date"},{"title":"Taxes","href":"/guide/invoicing/invoicing-settings/taxes"}]},{"title":"Fees","href":"/guide/invoicing/fees"},{"title":"Draft invoices","href":"/guide/invoicing/draft-invoices"},{"title":"Download invoices","href":"/guide/invoicing/download-invoices"},{"title":"Invoice metadata","href":"/guide/invoicing/invoice-metadata"},{"title":"Preview an invoice","href":"/guide/invoicing/previews"},{"title":"Void invoices","href":"/guide/invoicing/void"}]},{"group":"One-off invoices","pages":[{"title":"Create add-ons","href":"/guide/one-off-invoices/create-add-ons"},{"title":"Issue one-off invoices","href":"/guide/one-off-invoices/create-one-off-invoices"}]},{"group":"Credit notes","pages":[{"title":"Credit notes: correct an invoice without losing the record","sidebarTitle":"Overview","href":"/guide/invoicing/credit-notes/overview"},{"title":"Credit note metadata","href":"/guide/invoicing/credit-notes/credit-note-metadata"}]},{"title":"Revenue share","href":"/guide/revenue-share"},{"group":"E-invoicing","pages":[{"title":"E-invoicing: generate invoices that comply by country","sidebarTitle":"Overview","href":"/guide/invoicing/e-invoicing/overview"},{"title":"E-Invoicing contributions","href":"/guide/invoicing/e-invoicing/contributions"}]}]},{"group":"Payments \u0026 Cash Collection","pages":[{"group":"Payments","pages":[{"title":"Payment providers integrations","href":"/guide/payments/payment-providers"},{"title":"Payment methods","href":"/guide/payments/payment-methods"},{"title":"Record manual payments","href":"/guide/payments/record-manual-payments"},{"title":"Payment pre-authorization","href":"/guide/payments/payment-authorization"},{"title":"Payment retries","href":"/guide/payments/payment-retries"},{"title":"Payment receipts","href":"/guide/payments/receipts"}]},{"group":"Dunning","pages":[{"title":"Manual dunning","href":"/guide/dunning/manual-dunning"},{"title":"Automatic dunning","href":"/guide/dunning/automatic-dunning"}]},{"group":"Wallets and prepaid credits","pages":[{"title":"Prepaid credits and wallets: bill usage against a balance","sidebarTitle":"Overview","href":"/guide/wallet-and-prepaid-credits/overview"},{"title":"Top-up and void credits","href":"/guide/wallet-and-prepaid-credits/wallet-top-up-and-void"},{"title":"Traceability","href":"/guide/wallet-and-prepaid-credits/traceability"}]}]},{"group":"AI Agents and MCP","pages":[{"title":"AI tools for Lago","sidebarTitle":"AI tools","href":"/guide/ai-agents/for-agents"},{"title":"Build Lago billing with a coding agent","sidebarTitle":"Build with a coding agent","href":"/guide/ai-agents/coding-agents"},{"group":"Lago Agent SDK","pages":[{"title":"Agent SDK: bill LLM token usage from your application","sidebarTitle":"Overview","href":"/guide/ai-agents/agent-sdk/overview"},{"title":"Billing","href":"/guide/ai-agents/agent-sdk/billing"},{"group":"Providers","pages":[{"title":"OpenAI","href":"/guide/ai-agents/agent-sdk/openai"},{"title":"Anthropic","href":"/guide/ai-agents/agent-sdk/anthropic"},{"title":"AWS Bedrock","href":"/guide/ai-agents/agent-sdk/bedrock"},{"title":"Google Gemini","href":"/guide/ai-agents/agent-sdk/gemini"},{"title":"Mistral","href":"/guide/ai-agents/agent-sdk/mistral"}]},{"group":"Gateways","pages":[{"title":"Cloudflare AI Gateway","href":"/guide/ai-agents/agent-sdk/cloudflare"},{"title":"Databricks AI Gateway","href":"/guide/ai-agents/agent-sdk/databricks"},{"title":"Snowflake Cortex","href":"/guide/ai-agents/agent-sdk/snowflake"},{"title":"Ramp Router","href":"/guide/ai-agents/agent-sdk/ramp-router"}]},{"title":"Reference","href":"/guide/ai-agents/agent-sdk/reference"}]},{"title":"The Billing Assistant","href":"/guide/ai-agents/billing-assistant"},{"title":"The Finance Assistant","href":"/guide/ai-agents/finance-assistant"},{"title":"The Dunning Agent","href":"/guide/ai-agents/dunning-agent"},{"title":"MCP server for billing: connect coding agents to usage and invoices","sidebarTitle":"Lago MCP Server","href":"/guide/ai-agents/mcp-server"}]},{"group":"Data \u0026 Analytics","pages":[{"title":"Webhooks","href":"/guide/webhooks"},{"group":"Analytics","pages":[{"group":"Reports","pages":[{"title":"Billing analytics: read revenue, usage and invoice reports","sidebarTitle":"Overview","href":"/guide/analytics/overview"},{"group":"Subscriptions","pages":[{"title":"Active subscriptions","href":"/guide/analytics/subscriptions/active"},{"title":"New subscriptions","href":"/guide/analytics/subscriptions/new"},{"title":"Churn","href":"/guide/analytics/subscriptions/churn"}]},{"group":"Revenue","pages":[{"title":"Revenue streams","href":"/guide/analytics/revenue/revenue-streams"},{"title":"MRR","href":"/guide/analytics/revenue/mrr"}]},{"title":"Credit ledgers","href":"/guide/analytics/credit-ledgers"},{"title":"Usage","href":"/guide/analytics/usage"},{"group":"Cash collection","pages":[{"title":"Payments","href":"/guide/analytics/cash-collection/payments"},{"title":"Dunnings","href":"/guide/analytics/cash-collection/dunnings"}]},{"title":"Invoices","href":"/guide/analytics/invoices"}]},{"title":"Forecasted usage","href":"/guide/analytics/forecasted-usage"}]},{"group":"Data exports","pages":[{"title":"Export invoices","href":"/guide/invoicing/export"},{"title":"Lago Data Pipeline","href":"/integrations/data/lago-data-pipeline"}]}]},{"group":"Revenue recognition","tag":"Private beta","pages":[{"title":"Revenue recognition: turn billing into accrual-basis revenue","sidebarTitle":"Overview","href":"/guide/revenue-recognition/overview"},{"group":"How it works","pages":[{"title":"Methodology","href":"/guide/revenue-recognition/how-it-works/methodology"},{"title":"Subscriptions","href":"/guide/revenue-recognition/how-it-works/subscriptions"},{"title":"Usage-based charges","href":"/guide/revenue-recognition/how-it-works/usage-based-charges"},{"title":"Minimum commitments","href":"/guide/revenue-recognition/how-it-works/minimum-commitments"},{"title":"Taxes","href":"/guide/revenue-recognition/how-it-works/taxes"},{"title":"Payments","href":"/guide/revenue-recognition/how-it-works/payments"},{"title":"Credit notes and adjustments","href":"/guide/revenue-recognition/how-it-works/credit-notes-and-adjustments"},{"title":"Disputes and failed payments","href":"/guide/revenue-recognition/how-it-works/disputes-and-failed-payments"},{"title":"Wallets and prepaid credits","href":"/guide/revenue-recognition/how-it-works/wallets-and-prepaid-credits"}]},{"group":"Get started","pages":[{"title":"Enable revenue recognition","href":"/guide/revenue-recognition/get-started/enable"},{"title":"Prepare your billing data","href":"/guide/revenue-recognition/get-started/prepare-billing-data"},{"title":"Review your first reporting period","href":"/guide/revenue-recognition/get-started/review-first-period"},{"title":"Export revenue recognition data","href":"/guide/revenue-recognition/get-started/export"}]},{"group":"Reports","pages":[{"title":"Recognized Revenue","href":"/guide/revenue-recognition/reports/recognized-revenue"},{"title":"Deferred Revenue","href":"/guide/revenue-recognition/reports/deferred-revenue"},{"title":"Revenue Waterfall","href":"/guide/revenue-recognition/reports/revenue-waterfall"},{"title":"Statements","href":"/guide/revenue-recognition/reports/statements"},{"title":"Journal Entry Details","href":"/guide/revenue-recognition/reports/journal-entry-details"}]},{"group":"Examples","pages":[{"title":"Full lifecycle example","href":"/guide/revenue-recognition/examples/full-lifecycle"}]}]},{"group":"Resources","pages":[{"group":"Security","pages":[{"title":"Audit logs","href":"/guide/security/audit-logs"},{"title":"Security logs","href":"/guide/security/security-logs"},{"title":"API Keys","href":"/guide/security/api-keys"},{"title":"RBAC - Role-Based Access Control","href":"/guide/security/rbac"},{"title":"Single Sign-On (SSO)","href":"/guide/security/sso"},{"title":"SOC 2 Type 2","href":"/guide/security/soc"}]},{"title":"Integration testing","href":"/guide/integration-testing"},{"title":"Lago OpenAPI","href":"/guide/lago-open-api"},{"group":"Lago CLI","pages":[{"title":"Lago CLI: the billing API from your terminal","sidebarTitle":"Overview","href":"/guide/lago-cli/overview"},{"group":"Command reference","pages":[{"title":"Command reference","href":"/guide/lago-cli/commands/overview"},{"title":"Setup and diagnostics","href":"/guide/lago-cli/commands/setup"},{"title":"Helpers","href":"/guide/lago-cli/commands/helpers"},{"title":"Billable metrics","href":"/guide/lago-cli/commands/billable-metrics"},{"title":"Plans","href":"/guide/lago-cli/commands/plans"},{"title":"Features and entitlements","href":"/guide/lago-cli/commands/features-and-entitlements"},{"title":"Customers","href":"/guide/lago-cli/commands/customers"},{"title":"Subscriptions","href":"/guide/lago-cli/commands/subscriptions"},{"title":"Events","href":"/guide/lago-cli/commands/events"},{"title":"Invoices","href":"/guide/lago-cli/commands/invoices"},{"title":"Credit notes","href":"/guide/lago-cli/commands/credit-notes"},{"title":"Coupons and add-ons","href":"/guide/lago-cli/commands/coupons-and-add-ons"},{"title":"Wallets","href":"/guide/lago-cli/commands/wallets"},{"title":"Taxes and fees","href":"/guide/lago-cli/commands/taxes-and-fees"},{"title":"Payments","href":"/guide/lago-cli/commands/payments"},{"title":"Webhooks","href":"/guide/lago-cli/commands/webhooks"},{"title":"Analytics and logs","href":"/guide/lago-cli/commands/analytics-and-logs"},{"title":"Organization","href":"/guide/lago-cli/commands/organization"},{"title":"Quotes and orders","href":"/guide/lago-cli/commands/quotes-and-orders"}]}]},{"group":"Migrations","pages":[{"title":"Migration to v1.54.0","href":"/guide/migration/migration-to-v1.54.0"},{"title":"Migration to v1.52.0","href":"/guide/migration/migration-to-v1.52.0"},{"title":"Migration to v1.50.0","href":"/guide/migration/migration-to-v1.50.0"},{"title":"Migration to v1.45.0","href":"/guide/migration/migration-to-v1.45.0"},{"title":"Migration to v1.44.0","href":"/guide/migration/migration-to-v1.44.0"},{"title":"Migration to v1.43.0","href":"/guide/migration/migration-to-v1.43.0"},{"title":"Migration to v1.32.0","href":"/guide/migration/migration-to-v1.32.0"},{"title":"Migration to v1.31.0","href":"/guide/migration/migration-to-v1.31.0"},{"title":"Migration to v1.29.0","href":"/guide/migration/migration-to-v1.29.0"},{"title":"Migration to v1.28.1","href":"/guide/migration/migration-to-v1.28.1"},{"title":"Migration to v1.25.0","href":"/guide/migration/migration-to-v1.25.0"},{"title":"Migration to v1.20.0","href":"/guide/migration/migration-to-v1.20.0"},{"title":"Migration to v1.2.0","href":"/guide/migration/migration-to-v1.2.0"}]}]}]},{"tab":"API References","pages":[{"title":"API References","href":"/api-reference/intro"}]},{"tab":"Integrations","pages":[{"title":"Integrations","href":"/integrations/introduction"}]},{"tab":"Templates","pages":[{"title":"Templates","href":"/templates/introduction"}]},{"tab":"FAQ","pages":[{"title":"FAQ","href":"/faq/about-lago"}]},{"tab":"Knowledge Base","href":"https://knowledge.getlago.com"},{"tab":"Changelog","pages":[{"title":"Changelog","href":"/changelog/product"}]}]},"title":"SQL expressions - Lago","buildId":"dpl_GvhK4qVXq51DpfYJLCtPpYNN4YHN","deploymentId":"dpl_GvhK4qVXq51DpfYJLCtPpYNN4YHN","dynamics":["07c022d89b","a74be98ba7"],"chunks":["Frame-5VlDM5Io.js","DynamicMarkdown-DO1Fz7ar.js","zoom-image-lightbox-uyuQJRFs.js","lightbox-handle-r17bVUz3.js"]}