{"id":1746,"date":"2021-09-30T11:44:04","date_gmt":"2021-09-30T11:44:04","guid":{"rendered":"https:\/\/citrusleaf.in\/blog\/?p=1746"},"modified":"2022-04-13T13:02:08","modified_gmt":"2022-04-13T13:02:08","slug":"strapi-headless-cms-top-pros-and-cons","status":"publish","type":"post","link":"https:\/\/citrusleaf.in\/blog\/strapi-headless-cms-top-pros-and-cons\/","title":{"rendered":"Strapi Headless CMS: Top Pros and Cons"},"content":{"rendered":"\n<p>With the growing channels of content distribution, the need for  <a href=\"https:\/\/citrusleaf.in\/blog\/introduction-to-headless-content-management\/\"><strong>headless cms strapi<\/strong><\/a><strong> <\/strong>is more than ever before. While traditional CMS were good for managing content for one or two channels, like a website, they soon became a bottleneck for scaling content needs.<br><\/p>\n\n\n\n<p>Your audience is now consuming content from more than one source. They are now looking for your brand in the form of a website, a mobile app, a YouTube channel etc. To gain more visibility you have two options: do manual work and post content for each platform separately, or use a CMS that exposes one API to be consumed by all of your platforms.<br><\/p>\n\n\n\n<p>This is where  <strong>Headless CMS Strapi <\/strong>comes into picture. They allow you to easily manage content across the platforms by giving you one place to manage it. And one such CMS is Strapi.<br><\/p>\n\n\n\n<p><a href=\"https:\/\/citrusleaf.in\/strapi-headless-cms-development\"><strong>Strapi<\/strong><\/a> gives you a lot of flexibility in terms of data modeling and APIs. It readily gives you standard CRUD APIs out of the box for any kind of data model. You can then consume those APIs wherever you want: Website, Mobile App and even on modern advertisement billboards. Basically, anything which is connected to the Internet can use Strapi\u2019s APIs.<br><\/p>\n\n\n\n<p>Let\u2019s explore some of the advantages of using it as your Headless CMS.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Advantages of Strapi Headless CMS:<\/h4>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Easy Data Modeling:<\/strong> It gives you an amazing interface right out of the box to model your data. Which means that you don\u2019t have to create database tables and write queries. Using Strapi\u2019s admin UI, you can create any kind of relational data including One-to-Many and Many-to-Many relationships.<\/li><\/ul>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/pagepro.co\/blog\/wp-content\/uploads\/2020\/03\/8-1024x522.png?resize=512%2C261&#038;ssl=1\" alt=\"What Is Strapi And How To Build Your First API? - Pagepro\" width=\"512\" height=\"261\"\/><figcaption>Strapi offers a number of fields to make any kind of data points<\/figcaption><\/figure><\/div>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Authentication and Authorization:<\/strong> Strapi also gives you the ability to control who can consume your data using APIs. For example, you might want to hide some data points from public usage, and hence you can put those entities behind an authentication method. Strapi also gives you the ability to provide fine-grained access to fields inside an entity or data point. These are called Roles and Permissions in Strapi.<\/li><\/ul>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/paper-attachments.dropbox.com\/s_CC88355492B2A98EAA40B097B1643DA8AE3D35CE509F7D881364ACA0FE320D6E_1590485724497_image.png\" alt=\"All in one guide for creating a killer API with Strapi | Anshul Goyal\" width=\"480\" height=\"238\"\/><figcaption>With custom roles, you can fully customize authorization with Strapi<\/figcaption><\/figure><\/div>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Internationalization:<\/strong> Many CMSs are still suffering from poor i18n support. With <a href=\"https:\/\/docs.strapi.io\/developer-docs\/latest\/plugins\/plugins-intro.html\"><strong>Strapi&#8217;s latest release<\/strong><\/a>, It now has gained the ability to provide translation to any data entity. This means that you can now serve content to a wider audience without much-ado.<\/li><\/ul>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/paper-attachments.dropbox.com\/s_75763409C2F676A56666F5A72B9E5F7A23BC73D4BF13033A6B3418E998DD3AF1_1620378814253_frenchLocal.PNG\" alt=\"i18n Implementation &amp; Best Practices in Strapi\" width=\"553\" height=\"250\"\/><figcaption>With i18n plugin, you can easily make localized content for your audience<\/figcaption><\/figure><\/div>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>REST and GraphQL APIs:<\/strong> This gives you out-of-the box documented REST and GraphQL APIs. Just create your entities in the its Admin and you can get the Swagger\/GraphQL documentation for free! If you\u2019re writing any custom end-points or making changes to existing ones, make sure to update the API documentation.<\/li><\/ul>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/d2zv2ciw0ln4h1.cloudfront.net\/uploads\/api-documentation-plugin_6155bf202c.png?resize=552%2C359&#038;ssl=1\" alt=\"Introducing the API Documentation (Swagger) Plugin\" width=\"552\" height=\"359\"\/><figcaption>Get ready-made Swagger API docs with Strapi in one click<\/figcaption><\/figure><\/div>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Easy customization:<\/strong> It started as an MVC framework for NodeJS and it\u2019s still the same internally. You can easily add more API end-points as per your requirements and write custom logic in models and controllers for it. You can <a href=\"https:\/\/strapi.io\/documentation\/developer-docs\/latest\/guides\/custom-data-response.html#introduction\">customize&nbsp;strapi<\/a> existing end-points as well. You can also provide authentication and authorization for the custom endpoints. The Admin panel is also very customizable thanks to React.<\/li><\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"docs-internal-guid-40e67d3d-7fff-7de5-7f40-df46d6908288\">Disadvantages of Strapi headless CMS:<\/h4>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Limited database migration\/seed support:<\/strong> Any type of content type creation\/updates are handled transparently by Strapi into the database. This means that you have to manually handle database migrations across multiple environments. For example, changing permissions for an entity in one environment are recorded transparently inside the database. There are no migration files generated. Hence, in your other environments, you\u2019ll either have to write a custom migration solution or manually do those permission changes.<\/li><li><strong>Limited TypeScript support:<\/strong> It is completely written in JavaScript. If you want to use TypeScript, you\u2019ll have to use an external package to convert existing models into TypeScript code. This is not an issue with smaller codebases, but if you\u2019re planning to build large content systems using Strapi, you should consider using this package before starting the development.<\/li><li><strong>Frequent updates:<\/strong> While this is a good thing for Strapi as an ecosystem, however, if you\u2019re planning to use Strapi for large content repositories, you\u2019ll find frequent updates a bit off-putting. Some of these updates introduce breaking changes which makes it hard for a production system to be upgraded easily without full end-to-end testing.<\/li><\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Do you need Strapi?<\/h4>\n\n\n\n<p>If you really want to scale your content and have multiple integration requirements, we\u2019d say yes. It gives you a very easy and automated way to create APIs. It also gets out the way if you want to do any kind of customization.&nbsp;<br><\/p>\n\n\n\n<p>For example, if you want to <a href=\"https:\/\/docs.strapi.io\/developer-docs\/latest\/guides\/external-data.html#content-type-settings\"><strong>fetch external data<\/strong><\/a> into your own Strapi app, you can do that. Want to send emails programmatically? It has covered that too. We recently created a whole Mobile CRM with complete accounting and backend\/inventory needs using Strapi. <\/p>\n\n\n\n<p>Do read it\u2019s case study <a href=\"https:\/\/citrusleaf.in\/case-studies\/retail-distribution-business-mobile-crm-development\">here<\/a>.<br><\/p>\n\n\n\n<p>Not only from a development perspective, it gives non-technical users a great experience in building data models easily with great flexibility. It also has amazing media handling capabilities. All in all, we believe that it should be your first choice for making a content heavy website or a mobile application.<br><\/p>\n\n\n\n<p><em>If you\u2019re looking for someone well-versed in <a href=\"https:\/\/citrusleaf.in\/\"><strong>Strapi development<\/strong><\/a>, please reach out to us on hello@citrusleaf.in<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>With the growing channels of content distribution, the need for headless cms strapi is more than ever before. While traditional CMS were good for managing content for one or two channels, like a website, they&hellip; <\/p>\n","protected":false},"author":2,"featured_media":1748,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false},"version":2}},"categories":[10,271],"tags":[281,279,272,266,280,277,278],"class_list":["post-1746","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development","category-strapi","tag-headless-cms-node","tag-open-source-headless-cms","tag-strapi","tag-strapi-applications","tag-strapi-cms","tag-strapi-development","tag-strapi-headless-cms"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/citrusleaf.in\/blog\/wp-content\/uploads\/2021\/09\/Strapi-Headless-CMS-Pros-and-Cons.png?fit=1200%2C628&ssl=1","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/pei5Vv-sa","_links":{"self":[{"href":"https:\/\/citrusleaf.in\/blog\/wp-json\/wp\/v2\/posts\/1746","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/citrusleaf.in\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/citrusleaf.in\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/citrusleaf.in\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/citrusleaf.in\/blog\/wp-json\/wp\/v2\/comments?post=1746"}],"version-history":[{"count":10,"href":"https:\/\/citrusleaf.in\/blog\/wp-json\/wp\/v2\/posts\/1746\/revisions"}],"predecessor-version":[{"id":1779,"href":"https:\/\/citrusleaf.in\/blog\/wp-json\/wp\/v2\/posts\/1746\/revisions\/1779"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/citrusleaf.in\/blog\/wp-json\/wp\/v2\/media\/1748"}],"wp:attachment":[{"href":"https:\/\/citrusleaf.in\/blog\/wp-json\/wp\/v2\/media?parent=1746"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/citrusleaf.in\/blog\/wp-json\/wp\/v2\/categories?post=1746"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/citrusleaf.in\/blog\/wp-json\/wp\/v2\/tags?post=1746"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}