The Corrily Platform is designed to control and optimize almost every aspect of Pricing
and Monetization for subscription-based businesses. Its architecture consists of several key components,
including Pricing API, Analytics dashboard and Integrations.
With Corrily, your pricing page becomes dynamic and remotely-configured, eliminating the need
for hardcoded prices. The content of the Pricing Page (including sets of plans to display, prices itself,
currencies, discounts, trial info, etc) will be fetched via API, which can be consumed either
by your back-end code or directly from the front-end or Mobile App using Corrily’s SDKs.
That approach enables a personalized and dynamic pricing experience for each user.
Corrily serves as an external “admin panel” that controls your prices, acting
as a source of truth for pricing and monetization. It allows you to configure and immediately
apply every aspect of subscription monetization through the Corrily dashboard.On each API call, the platform dynamically determines the country and audience of the User,
deciding if the User falls into an active experiment, and then responds with the appropriate
pricing page content for that User.
After displaying prices to the User, Corrily records the displayed values,
ensuring the User consistently encounters the same prices across the product and checkout pages,
and even on different platforms like on web or mobile app.
To enable Corrily’s analytics capabilities, it’s required to feed revenue events into the Corrily Platform
from your Subscription Management solution (Stripe Billing, Chargebee, Recurly or other).
Revenue events are typically fetched by Corrily itself using API Key or OAuth integration,
but it’s also possible to use Subscription Management Platform webhooks
or to feed revenue events using Corrily CRUD API.In summary, the Corrily Platform architecture is designed to provide rich control
and optimization capabilities for different aspects of your pricing page.
By leveraging these components, you can create personalized pricing experiences for your users,
make data-driven decisions, and ultimately maximize revenue.
Before Corrily, companies typically use this simple setup:
Paywall Plans and Prices are hardcoded on the front-end, or stored in the database
Checkout prices are configured on the billing platform catalog
That means any update requires engineering effort, at least on the billing engineering side,
and, optionally, on front-end.
Also, that means there are risks of different types of inconsistencies.
With Corrily your Pricing Page becomes dynamic and controlled by the centralized monetization service.
As a centralized service, Corrily will ensure the following aspects:
Config correctness - Corrily determines User’s country and audience in real-time to let Users see the appropriate prices configured for that country and audience
User Experience consistency - Corrily ensures User will see the same set of plans, prices and currencies across all the places in the product and all the platforms
Checkout consistency - Corrily ensures Users will pay the same price that they have seen
Features consistency - Corrily ensures Users will always see the same set of features available in each plan
Here’s a more detailed explanation of the Control Flow with Corrily Platform integrated:
Anonymous Pricing Page: When a user visits your anonymous pricing page, either your backend or the Corrily Front-End Software Development Kit (FE SDK) sends the user’s IP address as a parameter to the Price request. The request would look like this:
{ "ip": "127.0.0.1"}
Corrily then stores the prices served for that IP address. This ensures that if the same Visitor opens a pricing page again, he’ll see the same price.
Internal Paywall: Once the user signs in and visits the internal paywall, your backend needs to send both the IP address and the user ID to Corrily. This allows Corrily to associate the IP address with the user ID and maintain the same price that was previously shown to the unauthenticated Visitor. The request would look like this:
{ "ip": "127.0.0.1", "user_id": "my_user_1"}
If it’s not possible to accurately determine the user’s IP address at the time of visiting the internal paywall, you can associate the user with the IP address at the time of signup by sending an Identify Request to Corrily with the IP address and user ID.
Subscription Creation: When creating a new subscription, you need to pass the price provided by Corrily to the Subscription Management Platform. This is typically done using Overrides (refer to the integration guides for each platform for more details)By passing overrides, you ensure that the user will pay the price they saw, not the price hardcoded in the Subscription Management Platform catalog. This is particularly important during price experimentation, where different users might see different prices for the same plans.
Successful Payment: After a successful payment, the new subscription and charge rows will be automatically pulled by Corrily via data ingestion pipeline (for OAuth and API-Key integrations), or via webhook, and will appear in analytics on the next iteration of dashboard metrics recalculation.
Corrily Paywall is a fully functional front-end component, displaying plans, prices, coupons, and other entities from Corrily’s Core.
Essentially, it’s a payment page, rendered by front-end SDK,
that dynamically displays prices from Corrily’s Core for each specific user.
A Package means a set of plans to be displayed on the Paywall depending on the user’s location or other attributes.
It encapsulates several plans, all of which are displayed on the Paywall.
This abstraction simplifies management of which plan sets to show to which Audience and in which country.
Corrily Product represents a Plan or Addon User might subscribe to.
Typically, Corrily Products are mapped 1:1 to Plans or Addons from billing platforms.
Corrily Price is an entity which holds the amount and currency to be displayed for the selected Product
in the selected country for the User’s Audience.
A fixed price is a set <amount, currency> pair that is set
via the dashboard, or one of our CRUD API endpoints, and identifiable by a price_id prefixed by price_<id>. The amount set will match exactly the
display values returned by Corrily’s API.
Ephemeral prices are the product of price transformations applied to fixed prices such as explicit applications of
rounding, calls for the price to be displayed in another currency, coupon applications, or price overrides.
Ephemeral prices too are identifiable by price IDs but these are prefixed by eph_price_<id>.
A Trial Period is an entity that allows the addition of a free or paid trial period to a Product.
The parameters of the Trial Period are configured separately from the Product itself
and can be experimented with by attempting different Trials for different Products.
Corrily Coupon represents a discount option,
which allows giving a specific User a fixed or percentage discount on a Product.
Typically Corrily Coupons map 1:1 to the coupons on billing platforms.
Product Feature represents a piece of functionality included into a specific Product.
Corrily allows to dynamically show different sets of features included into Products on the Paywall.
Corrily User represents physical person, who can see the price and can have one or several subscriptions,
each subscription comprises one or several products.
Typically Corrily User maps 1:1 to billing platform Customer.
An Experiment is a single A-B-test, or Bayesian test, allowing comparison of different Packages,
Prices, striked “old” prices, Trial Periods, discounts, Features,
and other pricing attributes User can see.
{"docsConfig":{"$schema":"https://mintlify.com/docs.json","theme":"mint","name":"Corrily","colors":{"primary":"#2AB896","light":"#3DE2BB","dark":"#371BB1"},"favicon":"/favicon.svg","logo":{"light":"https://mintcdn.com/corrily/Cn8I82iLKQofoT0a/logo/light.svg?fit=max\u0026auto=format\u0026n=Cn8I82iLKQofoT0a\u0026q=85\u0026s=1afe53d6becf6d0438247f620e7703c1","dark":"https://mintcdn.com/corrily/Cn8I82iLKQofoT0a/logo/dark.svg?fit=max\u0026auto=format\u0026n=Cn8I82iLKQofoT0a\u0026q=85\u0026s=35ccda704fe6fcae866645495262a3ef"},"api":{"mdx":{"server":null,"auth":{"method":"key","name":"X-Api-Key"}}},"footer":{"socials":{"website":"https://www.corrily.com","twitter":"https://twitter.com/usecorrily","linkedin":"https://www.linkedin.com/company/corrily"}},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"corrily","hasAudioNarration":false,"actualSubdomain":"corrily","customDomains":["docs.corrily.com"],"gitSource":{"type":"github","owner":"corrily","repo":"docs","deployBranch":"main","contentDirectory":"docs","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6a20c34112ef21155ee55083","collectionId":"e8ba0cd2-8851-4efe-b256-d5ca4fa301f7","schemaVersion":"v2"},"entitlements":{},"buildId":"6a20c34112ef21155ee55083:success","clientVersion":"0.0.3939","searchFilterCounts":[{"language":"default","tag":"Documentation","count":36},{"language":"default","tag":"API Reference","count":18},{"language":"default","tag":"Users","count":7},{"language":"default","tag":"Integration Guides","count":7},{"language":"default","tag":"Price Management","count":6},{"language":"default","tag":"Experiments","count":6},{"language":"default","tag":"Products","count":5},{"language":"default","tag":"Charges","count":4},{"language":"default","tag":"Subscriptions","count":4},{"language":"default","tag":"Basics","count":3}]},"assistantConfig":{},"hasChatPermissions":false,"hasWebMcpPermissions":false,"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":"billing-updated-9-15","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}],"isAtlas":false,"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"basics/02_corrily-architecture","slug":"/basics/02_corrily-architecture","pageMetadata":{"title":"Corrily Architecture","description":"Explore Corrily Platform components, Data Model and Control Flow.","href":"/basics/02_corrily-architecture"},"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: \"Explore Corrily Platform components, Data Model and Control Flow.\"\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`,em:`em`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,OptimizedImage,Tip}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Tip)_missingMdxReference(`Tip`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`2`,id:`architecture-overview`,children:`Architecture Overview`}),`\n`,_jsx(OptimizedImage,{src:`https://mintcdn.com/corrily/XkFh8wuvLduVZNrE/img/Architecture/Architecture1.png?fit=max\u0026auto=format\u0026n=XkFh8wuvLduVZNrE\u0026q=85\u0026s=1ae37364e0f2f4d388738c40b22d5904`,\"data-og-width\":`2880`,width:`2880`,\"data-og-height\":`1800`,height:`1800`,\"data-path\":`img/Architecture/Architecture1.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/corrily/XkFh8wuvLduVZNrE/img/Architecture/Architecture1.png?w=280\u0026fit=max\u0026auto=format\u0026n=XkFh8wuvLduVZNrE\u0026q=85\u0026s=c541cdb06e2df1d736487c3c44711191 280w, https://mintcdn.com/corrily/XkFh8wuvLduVZNrE/img/Architecture/Architecture1.png?w=560\u0026fit=max\u0026auto=format\u0026n=XkFh8wuvLduVZNrE\u0026q=85\u0026s=ebecac8f21aead60d29d21e87e8c554c 560w, https://mintcdn.com/corrily/XkFh8wuvLduVZNrE/img/Architecture/Architecture1.png?w=840\u0026fit=max\u0026auto=format\u0026n=XkFh8wuvLduVZNrE\u0026q=85\u0026s=64ce04db6ef809e52cfd1c7b8318dcc8 840w, https://mintcdn.com/corrily/XkFh8wuvLduVZNrE/img/Architecture/Architecture1.png?w=1100\u0026fit=max\u0026auto=format\u0026n=XkFh8wuvLduVZNrE\u0026q=85\u0026s=47b74b38bcd789fdff7398cfabcbb452 1100w, https://mintcdn.com/corrily/XkFh8wuvLduVZNrE/img/Architecture/Architecture1.png?w=1650\u0026fit=max\u0026auto=format\u0026n=XkFh8wuvLduVZNrE\u0026q=85\u0026s=39059840630ab9cb2bd9c6007522da61 1650w, https://mintcdn.com/corrily/XkFh8wuvLduVZNrE/img/Architecture/Architecture1.png?w=2500\u0026fit=max\u0026auto=format\u0026n=XkFh8wuvLduVZNrE\u0026q=85\u0026s=f713b658d2c438a37d9aec1212f7d6d8 2500w`}),`\n`,_jsx(_components.p,{children:`The Corrily Platform is designed to control and optimize almost every aspect of Pricing\nand Monetization for subscription-based businesses. Its architecture consists of several key components,\nincluding Pricing API, Analytics dashboard and Integrations.`}),`\n`,_jsx(Heading,{level:`3`,id:`paywall-builder`,children:`Paywall Builder`}),`\n`,_jsx(_components.p,{children:`With Corrily, your pricing page becomes dynamic and remotely-configured, eliminating the need\nfor hardcoded prices. The content of the Pricing Page (including sets of plans to display, prices itself,\ncurrencies, discounts, trial info, etc) will be fetched via API, which can be consumed either\nby your back-end code or directly from the front-end or Mobile App using Corrily’s SDKs.\nThat approach enables a personalized and dynamic pricing experience for each user.`}),`\n`,_jsx(Heading,{level:`3`,id:`price-management-and-price-experimentation`,children:`Price Management and Price Experimentation`}),`\n`,_jsx(_components.p,{children:`Corrily serves as an external “admin panel” that controls your prices, acting\nas a source of truth for pricing and monetization. It allows you to configure and immediately\napply every aspect of subscription monetization through the Corrily dashboard.`}),`\n`,_jsx(_components.p,{children:`On each API call, the platform dynamically determines the country and audience of the User,\ndeciding if the User falls into an active experiment, and then responds with the appropriate\npricing page content for that User.`}),`\n`,_jsx(Tip,{children:_jsx(_components.p,{children:`After displaying prices to the User, Corrily records the displayed values,\nensuring the User consistently encounters the same prices across the product and checkout pages,\nand even on different platforms like on web or mobile app.`})}),`\n`,_jsx(Heading,{level:`3`,id:`revenue-data-ingestion`,children:`Revenue Data Ingestion`}),`\n`,_jsx(_components.p,{children:`To enable Corrily’s analytics capabilities, it’s required to feed revenue events into the Corrily Platform\nfrom your Subscription Management solution (Stripe Billing, Chargebee, Recurly or other).\nRevenue events are typically fetched by Corrily itself using API Key or OAuth integration,\nbut it’s also possible to use Subscription Management Platform webhooks\nor to feed revenue events using Corrily CRUD API.`}),`\n`,_jsx(_components.p,{children:`In summary, the Corrily Platform architecture is designed to provide rich control\nand optimization capabilities for different aspects of your pricing page.\nBy leveraging these components, you can create personalized pricing experiences for your users,\nmake data-driven decisions, and ultimately maximize revenue.`}),`\n`,_jsx(Heading,{level:`2`,id:`control-flow`,children:`Control Flow`}),`\n`,_jsx(_components.p,{children:`There are typically multiple places where users could see or interact with your pricing page:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Anonymous pricing page`}),`, publicly visible for unauthenticated website users or mobile app visitors`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Internal Paywall or Customer Portal`}),`, visible for signed users`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Checkout Flow`}),`, hosted by you, by subscription management platforms, or by IOS/Google Play`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`control-flow-before-corrily`,children:`Control Flow before Corrily`}),`\n`,_jsx(OptimizedImage,{src:`https://mintcdn.com/corrily/XkFh8wuvLduVZNrE/img/Architecture/ControlFlow1.png?fit=max\u0026auto=format\u0026n=XkFh8wuvLduVZNrE\u0026q=85\u0026s=082782d984d0e1de3e8d9bbdd062646a`,\"data-og-width\":`2500`,width:`2500`,\"data-og-height\":`836`,height:`836`,\"data-path\":`img/Architecture/ControlFlow1.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/corrily/XkFh8wuvLduVZNrE/img/Architecture/ControlFlow1.png?w=280\u0026fit=max\u0026auto=format\u0026n=XkFh8wuvLduVZNrE\u0026q=85\u0026s=68b5e24fe2876840560a6098fe0bb048 280w, https://mintcdn.com/corrily/XkFh8wuvLduVZNrE/img/Architecture/ControlFlow1.png?w=560\u0026fit=max\u0026auto=format\u0026n=XkFh8wuvLduVZNrE\u0026q=85\u0026s=5fbbcf600fc822d556e2417a200822bd 560w, https://mintcdn.com/corrily/XkFh8wuvLduVZNrE/img/Architecture/ControlFlow1.png?w=840\u0026fit=max\u0026auto=format\u0026n=XkFh8wuvLduVZNrE\u0026q=85\u0026s=6af0a2fac596dc8d5634183aaaf341cb 840w, https://mintcdn.com/corrily/XkFh8wuvLduVZNrE/img/Architecture/ControlFlow1.png?w=1100\u0026fit=max\u0026auto=format\u0026n=XkFh8wuvLduVZNrE\u0026q=85\u0026s=14b6ae74e8558174b09da21056a4df23 1100w, https://mintcdn.com/corrily/XkFh8wuvLduVZNrE/img/Architecture/ControlFlow1.png?w=1650\u0026fit=max\u0026auto=format\u0026n=XkFh8wuvLduVZNrE\u0026q=85\u0026s=c32cc554be7f41084db2b67508bdcffc 1650w, https://mintcdn.com/corrily/XkFh8wuvLduVZNrE/img/Architecture/ControlFlow1.png?w=2500\u0026fit=max\u0026auto=format\u0026n=XkFh8wuvLduVZNrE\u0026q=85\u0026s=f7a2c6af2e1354c8a49bafa449994956 2500w`}),`\n`,_jsx(_components.p,{children:`Before Corrily, companies typically use this simple setup:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Paywall Plans and Prices are hardcoded on the front-end, or stored in the database`}),`\n`,_jsx(_components.li,{children:`Checkout prices are configured on the billing platform catalog`}),`\n`]}),`\n`,_jsx(_components.p,{children:`That means any update requires engineering effort, at least on the billing engineering side,\nand, optionally, on front-end.\nAlso, that means there are risks of different types of inconsistencies.`}),`\n`,_jsx(Heading,{level:`3`,id:`control-flow-with-corrily`,children:`Control Flow with Corrily`}),`\n`,_jsx(OptimizedImage,{src:`https://mintcdn.com/corrily/XkFh8wuvLduVZNrE/img/Architecture/ControlFlow2.png?fit=max\u0026auto=format\u0026n=XkFh8wuvLduVZNrE\u0026q=85\u0026s=59ca43a519b52cb516935621103a1417`,\"data-og-width\":`2580`,width:`2580`,\"data-og-height\":`850`,height:`850`,\"data-path\":`img/Architecture/ControlFlow2.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/corrily/XkFh8wuvLduVZNrE/img/Architecture/ControlFlow2.png?w=280\u0026fit=max\u0026auto=format\u0026n=XkFh8wuvLduVZNrE\u0026q=85\u0026s=6436652bfa63bd76a474b1ab92b36934 280w, https://mintcdn.com/corrily/XkFh8wuvLduVZNrE/img/Architecture/ControlFlow2.png?w=560\u0026fit=max\u0026auto=format\u0026n=XkFh8wuvLduVZNrE\u0026q=85\u0026s=6a4f3370f278420d88f913cd783b80fa 560w, https://mintcdn.com/corrily/XkFh8wuvLduVZNrE/img/Architecture/ControlFlow2.png?w=840\u0026fit=max\u0026auto=format\u0026n=XkFh8wuvLduVZNrE\u0026q=85\u0026s=5b4cb5bd5fd64ef6a345797de190533b 840w, https://mintcdn.com/corrily/XkFh8wuvLduVZNrE/img/Architecture/ControlFlow2.png?w=1100\u0026fit=max\u0026auto=format\u0026n=XkFh8wuvLduVZNrE\u0026q=85\u0026s=5b54e20bf38f138ffc126561bc9b182b 1100w, https://mintcdn.com/corrily/XkFh8wuvLduVZNrE/img/Architecture/ControlFlow2.png?w=1650\u0026fit=max\u0026auto=format\u0026n=XkFh8wuvLduVZNrE\u0026q=85\u0026s=48376366ee239199e45f714bd898a603 1650w, https://mintcdn.com/corrily/XkFh8wuvLduVZNrE/img/Architecture/ControlFlow2.png?w=2500\u0026fit=max\u0026auto=format\u0026n=XkFh8wuvLduVZNrE\u0026q=85\u0026s=0f2532a8109a93d6f3001c414ef3dbf1 2500w`}),`\n`,_jsx(_components.p,{children:`With Corrily your Pricing Page becomes dynamic and controlled by the centralized monetization service.\nAs a centralized service, Corrily will ensure the following aspects:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Config correctness`}),` - Corrily determines User’s country and audience in real-time to let Users see the appropriate prices configured for that country and audience`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`User Experience consistency`}),` - Corrily ensures User will see the same set of plans, prices and currencies across all the places in the product and all the platforms`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Checkout consistency -`}),` Corrily ensures Users will pay the same price that they have seen`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Features consistency -`}),` Corrily ensures Users will always see the same set of features available in each plan`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`Here’s a more detailed explanation of the Control Flow with Corrily Platform integrated:`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Anonymous Pricing Page`}),`: When a user visits your anonymous pricing page, either your backend or the Corrily Front-End Software Development Kit (FE SDK) sends the user’s IP address as a parameter to the\\xA0`,_jsx(_components.strong,{children:_jsx(_components.a,{href:`/api-reference/calculate-price`,children:`Price\\xA0request`})}),`. The request would look like this:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`3`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"ip\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"127.0.0.1\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Corrily then stores the prices served for that IP address. This ensures that if the same Visitor opens a pricing page again, he’ll see the same price.`}),`\n`,`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Internal Paywall`}),`: Once the user signs in and visits the internal paywall, your backend needs to send both the `,_jsx(_components.code,{children:`IP`}),` address and the `,_jsx(_components.code,{children:`user ID`}),` to Corrily. This allows Corrily to associate the `,_jsx(_components.code,{children:`IP`}),` address with the `,_jsx(_components.code,{children:`user ID`}),` and maintain the same price that was previously shown to the unauthenticated Visitor. The request would look like this:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`4`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"ip\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"127.0.0.1\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"user_id\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"my_user_1\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`If it’s not possible to accurately determine the user’s `,_jsx(_components.code,{children:`IP`}),` address at the time of visiting the internal paywall, you can associate the user with the `,_jsx(_components.code,{children:`IP`}),` address at the time of signup by sending an `,_jsx(_components.a,{href:`/api-reference/set-user-characteristics`,children:`Identify Request`}),` to Corrily with the `,_jsx(_components.code,{children:`IP`}),` address and `,_jsx(_components.code,{children:`user ID`}),`.`]}),`\n`]}),`\n`]}),`\n`,`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Subscription Creation`}),`: When creating a new subscription, you need to pass the price provided by Corrily to the Subscription Management Platform. This is typically done using `,_jsx(_components.code,{children:`Overrides`}),` (refer to the integration guides for each platform for more details)`]}),`\n`,_jsx(_components.p,{children:`By passing overrides, you ensure that the user will pay the price they saw, not the price hardcoded in the Subscription Management Platform catalog. This is particularly important during price experimentation, where different users might see different prices for the same plans.`}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Successful Payment`}),`: After a successful payment, the new subscription and charge rows will be automatically pulled by Corrily via data ingestion pipeline (for OAuth and API-Key integrations), or via webhook, and will appear in analytics on the next iteration of dashboard metrics recalculation.`]}),`\n`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`corrily-data-model`,children:`Corrily Data Model`}),`\n`,_jsx(OptimizedImage,{src:`https://mintcdn.com/corrily/XkFh8wuvLduVZNrE/img/Architecture/DataModel.png?fit=max\u0026auto=format\u0026n=XkFh8wuvLduVZNrE\u0026q=85\u0026s=ef43f2731804d446897350a985200936`,\"data-og-width\":`2840`,width:`2840`,\"data-og-height\":`1770`,height:`1770`,\"data-path\":`img/Architecture/DataModel.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/corrily/XkFh8wuvLduVZNrE/img/Architecture/DataModel.png?w=280\u0026fit=max\u0026auto=format\u0026n=XkFh8wuvLduVZNrE\u0026q=85\u0026s=b19d318b7649d515b956d1e1d74f1e9c 280w, https://mintcdn.com/corrily/XkFh8wuvLduVZNrE/img/Architecture/DataModel.png?w=560\u0026fit=max\u0026auto=format\u0026n=XkFh8wuvLduVZNrE\u0026q=85\u0026s=d527cf4db40cc3599fe9d3bf55029825 560w, https://mintcdn.com/corrily/XkFh8wuvLduVZNrE/img/Architecture/DataModel.png?w=840\u0026fit=max\u0026auto=format\u0026n=XkFh8wuvLduVZNrE\u0026q=85\u0026s=ce261e3cc9ba8ef70ebab9db33984a3f 840w, https://mintcdn.com/corrily/XkFh8wuvLduVZNrE/img/Architecture/DataModel.png?w=1100\u0026fit=max\u0026auto=format\u0026n=XkFh8wuvLduVZNrE\u0026q=85\u0026s=be24e1067b9279acf91d4340adeb37df 1100w, https://mintcdn.com/corrily/XkFh8wuvLduVZNrE/img/Architecture/DataModel.png?w=1650\u0026fit=max\u0026auto=format\u0026n=XkFh8wuvLduVZNrE\u0026q=85\u0026s=4d21eff650ae11bcc20a01373575c2c2 1650w, https://mintcdn.com/corrily/XkFh8wuvLduVZNrE/img/Architecture/DataModel.png?w=2500\u0026fit=max\u0026auto=format\u0026n=XkFh8wuvLduVZNrE\u0026q=85\u0026s=743bf2bf23448cebc53ddd3f37670999 2500w`}),`\n`,_jsx(Heading,{level:`3`,id:`paywall`,children:`Paywall`}),`\n`,_jsxs(_components.p,{children:[`Corrily `,_jsx(_components.strong,{children:`Paywall`}),` is a fully functional front-end component, displaying plans, prices, coupons, and other entities from Corrily’s Core.\nEssentially, it’s a payment page, rendered by `,_jsx(_components.a,{href:`/integrations/02_paywall-integration`,children:`front-end SDK`}),`,\nthat dynamically displays prices from Corrily’s Core for each specific user.`]}),`\n`,_jsx(Heading,{level:`3`,id:`package`,children:`Package`}),`\n`,_jsxs(_components.p,{children:[`A Package means a set of plans to be displayed on the `,_jsx(_components.a,{href:`#paywall`,children:`Paywall`}),` depending on the user’s location or other attributes.\nIt encapsulates several plans, all of which are displayed on the `,_jsx(_components.a,{href:`#paywall`,children:`Paywall`}),`.\nThis abstraction simplifies management of which plan sets to show to which `,_jsx(_components.a,{href:`#audience`,children:`Audience`}),` and in which country.`]}),`\n`,_jsx(Heading,{level:`3`,id:`product`,children:`Product`}),`\n`,_jsxs(_components.p,{children:[`Corrily `,_jsx(_components.strong,{children:`Product`}),` represents a Plan or Addon User might subscribe to.\nTypically, Corrily `,_jsx(_components.strong,{children:`Products`}),` are mapped 1:1 to Plans or Addons from billing platforms.`]}),`\n`,_jsx(Heading,{level:`3`,id:`price`,children:`Price`}),`\n`,_jsxs(_components.p,{children:[`Corrily `,_jsx(_components.strong,{children:`Price`}),` is an entity which holds the `,_jsx(_components.code,{children:`amount`}),` and `,_jsx(_components.code,{children:`currency`}),` to be displayed for the selected `,_jsx(_components.a,{href:`#product`,children:`Product`}),`\nin the selected country for the User’s `,_jsx(_components.a,{href:`#audience`,children:`Audience`}),`.`]}),`\n`,_jsx(Heading,{level:`4`,id:`fixed-vs-ephemeral-prices`,children:`Fixed vs. Ephemeral prices`}),`\n`,_jsx(_components.p,{children:_jsx(_components.em,{children:`The concept of ephemeral prices in Corrily.`})}),`\n`,_jsxs(_components.p,{children:[`Corrily price can be either `,_jsx(_components.strong,{children:`fixed`}),` or `,_jsx(_components.strong,{children:`ephemeral`}),`.`]}),`\n`,_jsx(Heading,{level:`4`,id:`fixed-prices`,children:`Fixed Prices`}),`\n`,_jsxs(_components.p,{children:[`A fixed price is a set `,_jsx(_components.em,{children:`\u003camount, currency>`}),` pair that is set\nvia the dashboard, or one of our CRUD API endpoints, and identifiable by a `,_jsx(_components.em,{children:`price_id`}),` prefixed by `,_jsx(_components.code,{children:`price_\u003cid>`}),`. The amount set will match exactly the\ndisplay values returned by Corrily’s API.`]}),`\n`,_jsx(Heading,{level:`4`,id:`ephemeral-prices`,children:`Ephemeral Prices`}),`\n`,_jsxs(_components.p,{children:[`Ephemeral prices are the product of price transformations applied to fixed prices such as explicit applications of\nrounding, calls for the price to be displayed in another currency, coupon applications, or price overrides.\nEphemeral prices too are identifiable by price IDs but these are prefixed by `,_jsx(_components.code,{children:`eph_price_\u003cid>`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`trial-period`,children:`Trial Period`}),`\n`,_jsxs(_components.p,{children:[`A `,_jsx(_components.strong,{children:`Trial Period`}),` is an entity that allows the addition of a free or paid trial period to a `,_jsx(_components.a,{href:`#product`,children:`Product`}),`.\nThe parameters of the `,_jsx(_components.strong,{children:`Trial Period`}),` are configured separately from the `,_jsx(_components.a,{href:`#product`,children:`Product`}),` itself\nand can be experimented with by attempting different `,_jsx(_components.strong,{children:`Trials`}),` for different `,_jsx(_components.strong,{children:`Products`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`coupon`,children:`Coupon`}),`\n`,_jsxs(_components.p,{children:[`Corrily `,_jsx(_components.strong,{children:`Coupon`}),` represents a discount option,\nwhich allows giving a specific User a fixed or percentage discount on a `,_jsx(_components.a,{href:`#product`,children:`Product`}),`.\nTypically `,_jsx(_components.strong,{children:`Corrily Coupons`}),` map 1:1 to the coupons on billing platforms.`]}),`\n`,_jsx(Heading,{level:`3`,id:`product-feature`,children:`Product Feature`}),`\n`,_jsxs(_components.p,{children:[`Product Feature represents a piece of functionality included into a specific `,_jsx(_components.a,{href:`#product`,children:`Product`}),`.\nCorrily allows to dynamically show different sets of features included into `,_jsx(_components.a,{href:`#product`,children:`Products`}),` on the `,_jsx(_components.a,{href:`#paywall`,children:`Paywall`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`user`,children:`User`}),`\n`,_jsxs(_components.p,{children:[`Corrily `,_jsx(_components.strong,{children:`User`}),` represents physical person, who can see the price and can have one or several subscriptions,\neach subscription comprises one or several products.\nTypically Corrily `,_jsx(_components.strong,{children:`User`}),` maps 1:1 to billing platform `,_jsx(_components.strong,{children:`Customer`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`user-attribute`,children:`User Attribute`}),`\n`,_jsxs(_components.p,{children:[`Corrily might store any custom metadata `,_jsx(_components.strong,{children:`Attributes`}),` assigned to a `,_jsx(_components.a,{href:`#user`,children:`User`}),`.\nThose attribute values can be used to define `,_jsx(_components.a,{href:`#audience`,children:`Audiences`}),` by a variety of rules.`]}),`\n`,_jsx(Heading,{level:`3`,id:`audience`,children:`Audience`}),`\n`,_jsxs(_components.p,{children:[`Corrily allows to segment `,_jsx(_components.a,{href:`#user`,children:`Users`}),` based on the rules on top of `,_jsx(_components.a,{href:`#user-attribute`,children:`User Attributes`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`experiment`,children:`Experiment`}),`\n`,_jsxs(_components.p,{children:[`An `,_jsx(_components.strong,{children:`Experiment`}),` is a single A-B-test, or Bayesian test, allowing comparison of different `,_jsx(_components.a,{href:`#package`,children:`Packages`}),`,\n`,_jsx(_components.a,{href:`#price`,children:`Prices`}),`, striked “old” prices, `,_jsx(_components.a,{href:`#trial-period`,children:`Trial Periods`}),`, discounts, `,_jsx(_components.a,{href:`#user-feature`,children:`Features`}),`,\nand other pricing attributes User can see.`]})]})}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":{"config":{},"pageMetadata":{"title":"Corrily Architecture","description":"Explore Corrily Platform components, Data Model and Control Flow.","href":"/basics/02_corrily-architecture"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Architecture Overview","slug":"architecture-overview","depth":2,"children":[{"title":"Paywall Builder","slug":"paywall-builder","depth":3,"children":[]},{"title":"Price Management and Price Experimentation","slug":"price-management-and-price-experimentation","depth":3,"children":[]},{"title":"Revenue Data Ingestion","slug":"revenue-data-ingestion","depth":3,"children":[]}]},{"title":"Control Flow","slug":"control-flow","depth":2,"children":[{"title":"Control Flow before Corrily","slug":"control-flow-before-corrily","depth":3,"children":[]},{"title":"Control Flow with Corrily","slug":"control-flow-with-corrily","depth":3,"children":[]}]},{"title":"Corrily Data Model","slug":"corrily-data-model","depth":2,"children":[{"title":"Paywall","slug":"paywall","depth":3,"children":[]},{"title":"Package","slug":"package","depth":3,"children":[]},{"title":"Product","slug":"product","depth":3,"children":[]},{"title":"Price","slug":"price","depth":3,"children":[]},{"title":"Fixed vs. Ephemeral prices","slug":"fixed-vs-ephemeral-prices","depth":4,"children":[]},{"title":"Fixed Prices","slug":"fixed-prices","depth":4,"children":[]},{"title":"Ephemeral Prices","slug":"ephemeral-prices","depth":4,"children":[]},{"title":"Trial Period","slug":"trial-period","depth":3,"children":[]},{"title":"Coupon","slug":"coupon","depth":3,"children":[]},{"title":"Product Feature","slug":"product-feature","depth":3,"children":[]},{"title":"User","slug":"user","depth":3,"children":[]},{"title":"User Attribute","slug":"user-attribute","depth":3,"children":[]},{"title":"Audience","slug":"audience","depth":3,"children":[]},{"title":"Experiment","slug":"experiment","depth":3,"children":[]}]}],"codeExamples":{}},"jsLinks":[],"subdomain":"corrily","siteName":"Corrily","title":"Corrily Architecture - Corrily","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-01-02T07:17:22.551Z","originalFileLocation":"basics/02_corrily-architecture.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=\"Explore Corrily Platform components, Data Model and Control Flow.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Corrily\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/corrily/gXHpgCTf7BKZKcpb/_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=\"/mintlify-assets/_mintlify/favicons/corrily/gXHpgCTf7BKZKcpb/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/corrily/gXHpgCTf7BKZKcpb/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/corrily/gXHpgCTf7BKZKcpb/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/corrily/gXHpgCTf7BKZKcpb/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/corrily/gXHpgCTf7BKZKcpb/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/corrily/gXHpgCTf7BKZKcpb/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/corrily/gXHpgCTf7BKZKcpb/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/corrily/gXHpgCTf7BKZKcpb/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Corrily Architecture - Corrily\">\u003cmeta data-mint-head property=\"og:description\" content=\"Explore Corrily Platform components, Data Model and Control Flow.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Corrily\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.corrily.com/basics/02_corrily-architecture\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://corrily.mintlify.app/_mintlify/api/og/v2?division=Basics\u0026amp;title=Corrily+Architecture\u0026amp;description=Explore+Corrily+Platform+components%2C+Data+Model+and+Control+Flow.\u0026amp;theme=d28a543d8620e3880f95f036\u0026amp;signature=538b5442f47d1178e5ec9537c30fd03f8475dc2b0c7df7bad51559c7e031d76d\">\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=\"Corrily Architecture - Corrily\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Explore Corrily Platform components, Data Model and Control Flow.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://corrily.mintlify.app/_mintlify/api/og/v2?division=Basics\u0026amp;title=Corrily+Architecture\u0026amp;description=Explore+Corrily+Platform+components%2C+Data+Model+and+Control+Flow.\u0026amp;theme=d28a543d8620e3880f95f036\u0026amp;signature=538b5442f47d1178e5ec9537c30fd03f8475dc2b0c7df7bad51559c7e031d76d\">\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=\"/mintlify-assets/_mintlify/favicons/corrily/gXHpgCTf7BKZKcpb/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Corrily\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#2AB896\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.corrily.com/basics/02_corrily-architecture\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/basics/02_corrily-architecture.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.corrily.com/#organization\",\"name\":\"Corrily\",\"url\":\"https://docs.corrily.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/corrily/Cn8I82iLKQofoT0a/logo/light.svg?fit=max\u0026auto=format\u0026n=Cn8I82iLKQofoT0a\u0026q=85\u0026s=1afe53d6becf6d0438247f620e7703c1\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.corrily.com#website\",\"name\":\"Corrily\",\"url\":\"https://docs.corrily.com\",\"publisher\":{\"@id\":\"https://docs.corrily.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.corrily.com/basics/02_corrily-architecture#webpage\",\"url\":\"https://docs.corrily.com/basics/02_corrily-architecture\",\"name\":\"Corrily Architecture\",\"description\":\"Explore Corrily Platform components, Data Model and Control Flow.\",\"dateModified\":\"2026-01-02T07:17:22.551Z\",\"isPartOf\":{\"@id\":\"https://docs.corrily.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.corrily.com/basics/02_corrily-architecture#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.corrily.com/basics/02_corrily-architecture#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Basics\",\"item\":\"https://docs.corrily.com/basics/00_introduction\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Corrily Architecture\",\"item\":\"https://docs.corrily.com/basics/02_corrily-architecture\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.corrily.com/basics/02_corrily-architecture#article\",\"headline\":\"Corrily Architecture\",\"name\":\"Corrily Architecture\",\"description\":\"Explore Corrily Platform components, Data Model and Control Flow.\",\"url\":\"https://docs.corrily.com/basics/02_corrily-architecture\",\"mainEntityOfPage\":{\"@id\":\"https://docs.corrily.com/basics/02_corrily-architecture#webpage\"},\"dateModified\":\"2026-01-02T07:17:22.551Z\",\"publisher\":{\"@id\":\"https://docs.corrily.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.corrily.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Corrily\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Corrily","nav":{"global":null,"anchors":[{"anchor":"Documentation","icon":"book-open","groups":[{"group":"Basics","pages":[{"title":"Introduction","href":"/basics/00_introduction"},{"title":"What is Corrily?","description":"Know exactly how to price and package your products, services, subscriptions.","href":"/basics/01_what-is-corrily"},{"title":"Corrily Architecture","href":"/basics/02_corrily-architecture"}]},{"group":"Integration Guides","pages":[{"title":"Launch checklist","description":"A launch checklist to be used before going live with Corrily.","href":"/integrations/00_launch-checklist"},{"title":"Invite the team","href":"/integrations/01_inviting_users"},{"group":"Connect to the Billing Platforms","pages":[{"title":"Apple App Store","href":"/integrations/13_platform-app-store"}]},{"group":"Show Corrily Prices","pages":[{"title":"Paywall JS SDK Integration","href":"/integrations/02_paywall-integration"},{"title":"iOS Swift SDK Integration","href":"/integrations/04_ios-integration"},{"title":"API Integration (Web \u0026 Mobile)","href":"/integrations/03_api-integration"}]},{"group":"Feed Corrily with billing events","pages":[{"title":"Custom integration","href":"/integrations/15_platform-custom-integration"}]}]},{"group":"Price Management","pages":[{"title":"Country Prices","href":"/prices/01_country-prices"},{"title":"Audience Prices","href":"/prices/02_audience-prices"},{"title":"Experimental Prices","href":"/prices/03_experiment-prices"},{"title":"Price Rounding","href":"/prices/05_price-rounding"},{"title":"FX Rates","href":"/prices/06_fx-rates"},{"title":"07 products configuration","href":"/prices/07_products_configuration"},{"title":"Coupons","href":"/coupons_and_campaigns/01_discount-coupons"}]},{"group":"Product Management","pages":[{"title":"Products","href":"/products/products_configuration"},{"title":"Features","href":"/products/features"},{"title":"Packages","href":"/products/packages"}]},{"group":"Paywall Builder","pages":[{"title":"Paywall Builder","href":"/paywall-builder/configure"}]},{"group":"Users","pages":[{"title":"Users","href":"/users/01_users"},{"title":"User Features","href":"/users/02_user-features"},{"title":"Handling Anonymous Users","href":"/users/03_handling-anonymous-users"},{"title":"Audiences","href":"/segmentation/01_audiences"},{"title":"Attributes","href":"/segmentation/02_attributes"}]},{"group":"Experiments","pages":[{"title":"How to Design Experiment","href":"/experiments/01_experiment_design"},{"title":"Corrily Experimentation Platform","href":"/experiments/02_experimentation_platform"},{"title":"Experiment on Prices","href":"/experiments/03_price_experiments"},{"title":"Experiment on Discounts","href":"/experiments/04_discount_experiments"},{"title":"Experiment on Packages","href":"/experiments/05_packaging_experiments"},{"title":"Experiment Analytics","href":"/experiments/08_experiment_analytics"}]},{"group":"Analytics Platform","pages":[{"title":"Funnel Analytics based on Billing Data","href":"/metrics/02_funnel_analytics_billing_data"},{"title":"Funnel Analytics based on Users and Billing Data","href":"/metrics/03_funnel_analytics_corrily_data"}]},{"group":"Security and Privacy","pages":[{"title":"Security and Compliance","href":"/security_privacy/00_security_compliance"},{"title":"GDPR Compliance","href":"/security_privacy/01_GDPR"}]},{"group":"Tutorials and FAQs","pages":[{"title":"Recommendation Engine","href":"/experiments/05_recommendation_engine"}]}]},{"anchor":"API Reference","icon":"rectangle-terminal","pages":[{"title":"API Reference","href":"/api-reference/calculate-price"}]},{"anchor":"Implementation Examples","href":"https://github.com/corrily/integration-examples","icon":"github"}]},"title":"Corrily Architecture - Corrily","buildId":"dpl_5UDDZ9hnigTkoV7QtvQ39eUp84nu","deploymentId":"dpl_5UDDZ9hnigTkoV7QtvQ39eUp84nu","dynamics":["a74be98ba7"],"chunks":["zoom-image-lightbox-ChyC7Hte.js","PlusIcon-DXkY3IBj.js","lightbox-handle-r17bVUz3.js"]}