<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: andrzejwp</title>
    <description>The latest articles on Forem by andrzejwp (@andrzejwp).</description>
    <link>https://forem.com/andrzejwp</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F311727%2F463187df-8fa7-433d-a22e-0475ae61f55c.jpeg</url>
      <title>Forem: andrzejwp</title>
      <link>https://forem.com/andrzejwp</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/andrzejwp"/>
    <language>en</language>
    <item>
      <title>How to move from WordPress to Jamstack using our Gatsby WordPress Starter</title>
      <dc:creator>andrzejwp</dc:creator>
      <pubDate>Tue, 04 May 2021 07:59:17 +0000</pubDate>
      <link>https://forem.com/flotiq/how-to-move-from-wordpress-to-jamstack-using-our-gatsby-wordpress-starter-aa2</link>
      <guid>https://forem.com/flotiq/how-to-move-from-wordpress-to-jamstack-using-our-gatsby-wordpress-starter-aa2</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article originally appeared as a blog post on &lt;a href="https://flotiq.com/blog/how-to-move-from-wordpress-to-jamstack-using-our-gatsby-wordpress-starter"&gt;Flotiq.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Let’s say that you are the owner of a WordPress site and you have heard about Jamstack, the “modern way” to build websites. You want to check if this approach is good for a WordPress replacement. Using Gatsby WordPress starter and migration tools you can test it in just a few minutes.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you have a WordPress site with data, you could be worried about the migration, creating a new Gatsby template, and deploying your new site. These things can stop you from deciding to check the Jamstack way of developing your project. Let’s see how to move your WordPress to a Gatsby template without pain, in 2 simple steps.&lt;/p&gt;

&lt;p&gt;Next, optionally, we set up the project live via Netlify, and configure Netlify Plugin in Flotiq, to simplify the build process to one-click action.&lt;/p&gt;

&lt;p&gt;In the next steps, we assume that you have an account in Flotiq (&lt;a href="https://editor.flotiq.com/register.html"&gt;click here to register for free&lt;/a&gt;).&lt;/p&gt;

&lt;h1&gt;
  
  
  Step 1: Migrate data to HeadlessCMS
&lt;/h1&gt;

&lt;p&gt;The first step is to migrate your data to Headless CMS. We recommend using our migration tool. Go to the &lt;a href="https://flotiq.com/services/migrate-wordpress-to-flotiq-headless-cms/"&gt;WordPress to Flotiq migration service&lt;/a&gt;, fill in the required data and start the import. This process will import your media, posts, pages, authors, tags and categories.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PSUAq55w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://api.flotiq.com/image/0x0/_media-7e6ab218-c302-404b-a314-342c50e04927.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PSUAq55w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://api.flotiq.com/image/0x0/_media-7e6ab218-c302-404b-a314-342c50e04927.png" alt="WordPress to Flotiq migration service"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check your Flotiq Account after the migration is done.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DhMzsS6h--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://api.flotiq.com/image/0x0/_media-6391f3bd-fe36-47e4-b68d-f3ef032827b7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DhMzsS6h--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://api.flotiq.com/image/0x0/_media-6391f3bd-fe36-47e4-b68d-f3ef032827b7.png" alt="Content Types in Flotiq"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now your data is stored in the Headless CMS and you can manage it in Flotiq. But we want to achieve more - let’s set up a brand new site based on this data.&lt;/p&gt;

&lt;h1&gt;
  
  
  Step 2: Setup starter locally
&lt;/h1&gt;

&lt;p&gt;Now we can use our Gatsby Starter - WordPress Blog. For detailed instructions &lt;a href="https://github.com/flotiq/gatsby-starter-wordpress-blog"&gt;check the project’s GitHub repository&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Run the project from a template using Flotiq CLI. Type the following commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install -g flotiq-cli
flotiq start [flotiqApiKey] [yourProjectName] https://github.com/flotiq/gatsby-starter-wordpress-blog
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;em&gt;flotiqApKey&lt;/em&gt; is your &lt;code&gt;Read and write API key&lt;/code&gt; to your Flotiq account, and &lt;em&gt;yourProjectName&lt;/em&gt; is your custom project name.&lt;/p&gt;

&lt;p&gt;This script will download the starter, add the required configuration to the &lt;code&gt;.env&lt;/code&gt; file, install dependencies and run gatsby.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wait a moment, and that’s it! Your site is now running at &lt;a href="http://localhost:8000"&gt;http://localhost:8000&lt;/a&gt;.&lt;/strong&gt; To exit the process type Ctrl+C.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kAAiEpl---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://api.flotiq.com/image/0x0/_media-9a724e06-463a-4e19-ab3d-29091c48d9a7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kAAiEpl---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://api.flotiq.com/image/0x0/_media-9a724e06-463a-4e19-ab3d-29091c48d9a7.png" alt="Gatsby WordPress Starter is working!"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next - start developing. Use your favourite IDE to edit project files. There are commands you would use to develop a project&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;gatsby develop - build again your site and expose it on the localhost:8000&lt;/li&gt;
&lt;li&gt;gatsby clean - clear cached data (like posts, media)&lt;/li&gt;
&lt;li&gt;gatsby build - build the site for production environment&lt;/li&gt;
&lt;li&gt;gatsby serve - view the production site locally&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To learn more about Gatsby development process &lt;a href="https://www.gatsbyjs.com/docs/tutorial/part-zero/"&gt;check this tutorial&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Now you can develop and test your site, learn Gatsby and check the Flotiq features.&lt;/strong&gt; You can also take the next extra steps to publish your site on the Internet.&lt;/p&gt;




&lt;h1&gt;
  
  
  Step 3: Deploy your site to Netlify (optional)
&lt;/h1&gt;

&lt;p&gt;You can go live with your site in multiple ways. One way is to simply copy your files from the public directory (created after running Gatsby build) to your server. This fully static page will serve your content without a backend.&lt;/p&gt;

&lt;p&gt;Another way is to use a deploy solution like Netlify. The benefit of this solution is that you can configure automatically build after pushing to the repository or even rebuilding directly from the Flotiq dashboard (using Netlify Plugin).&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Create your project repository in GitHub
&lt;/h2&gt;

&lt;p&gt;Netlify will use your repository to fetch files, run build commands and publish your website. Create an empty repository for your project:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IIgb5FXs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://api.flotiq.com/image/0x0/_media-d1b43559-7b05-4757-9b13-7ca4fb965f56.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IIgb5FXs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://api.flotiq.com/image/0x0/_media-d1b43559-7b05-4757-9b13-7ca4fb965f56.png" alt="Create an empty repository for your project"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Push your project to the newly created repository.
&lt;/h2&gt;

&lt;p&gt;GitHub will show you tips to quickly set up your repository - follow the part &lt;code&gt;…or push an existing repository from the command line&lt;/code&gt;. In projects directory type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git remote add origin git@github.com:[accountName]/[projectName].git
git branch -M main
git push -u origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now your files are stored in GitHub with all benefits of using version control.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Setup Netlify site
&lt;/h2&gt;

&lt;p&gt;Now let’s publish our site. We will use Netlify for this step. To create a site go to the &lt;a href="https://netlify.com/"&gt;Netlify&lt;/a&gt; dashboard. We will create a site from the Git repository.&lt;/p&gt;

&lt;p&gt;Click the &lt;code&gt;New Site from Git&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nMcrdrVW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://api.flotiq.com/image/0x0/_media-60081a11-4bbc-4cda-b669-5f2e86ce1a60.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nMcrdrVW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://api.flotiq.com/image/0x0/_media-60081a11-4bbc-4cda-b669-5f2e86ce1a60.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Choose &lt;code&gt;GitHub&lt;/code&gt; as the project source.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Kxqrg65m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://api.flotiq.com/image/0x0/_media-6448593f-f1d8-4203-a1f1-46cf2e848069.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Kxqrg65m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://api.flotiq.com/image/0x0/_media-6448593f-f1d8-4203-a1f1-46cf2e848069.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Find your new repository.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--n9E2FuwO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://api.flotiq.com/image/0x0/_media-b9323571-a37e-469c-8b81-45cc64c392a5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--n9E2FuwO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://api.flotiq.com/image/0x0/_media-b9323571-a37e-469c-8b81-45cc64c392a5.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Add variable &lt;code&gt;GATSBY_FLOTIQ_API_KEY&lt;/code&gt; with your &lt;code&gt;flotiqApiKey&lt;/code&gt; (like we do in local setup, in the &lt;code&gt;.env&lt;/code&gt; file).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FNOCjNuL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://api.flotiq.com/image/0x0/_media-0b9320f1-5f7b-46f8-aafe-b84a273a690a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FNOCjNuL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://api.flotiq.com/image/0x0/_media-0b9320f1-5f7b-46f8-aafe-b84a273a690a.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, click the &lt;code&gt;Deploy site&lt;/code&gt; button, and wait 2-3 minutes. When the status change, click on your new automatically generated address.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It’s your site, live on the Web. Congratulations!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can change your site URL, or even bind your domain - for further information check the &lt;a href="https://docs.netlify.com/domains-https/custom-domains"&gt;Netlify Docs&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Step 4: Use the Netlify plugin in Flotiq to deploy your site automatically (optional)
&lt;/h1&gt;

&lt;p&gt;For now, every time when you push to the main branch, your site will rebuild automatically. That’s a convenient solution. But what if we want to rebuild the site every time when creating data in Flotiq? Follow these steps to enable the &lt;code&gt;Build Site&lt;/code&gt; button in Flotiq.&lt;/p&gt;

&lt;p&gt;Go back to the Netlify dashboard. Add a build hook in the Build &amp;amp; Deploy settings. The name of this webhook is up to you:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZK43zyMB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://api.flotiq.com/image/0x0/_media-671c4bf0-2abc-4dff-a317-177521a6ecf9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZK43zyMB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://api.flotiq.com/image/0x0/_media-671c4bf0-2abc-4dff-a317-177521a6ecf9.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the hook is created, you get your custom website hook.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kftM6ven--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://api.flotiq.com/image/0x0/_media-148227cb-a346-4355-8090-ff7519d6702b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kftM6ven--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://api.flotiq.com/image/0x0/_media-148227cb-a346-4355-8090-ff7519d6702b.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After these steps, you can not only manage your data in Flotiq Headless CMS. You can also trigger a rebuild of your site by clicking &lt;code&gt;Build site&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FUj7mDRI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://api.flotiq.com/image/0x0/_media-96121528-8671-4874-8985-4eb66bf2a084.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FUj7mDRI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://api.flotiq.com/image/0x0/_media-96121528-8671-4874-8985-4eb66bf2a084.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now your site is live, and you can easily manage the site content. You can take the benefits of Headless CMS and the Gatsby ecosystem.&lt;/p&gt;

&lt;h1&gt;
  
  
  Next steps
&lt;/h1&gt;

&lt;p&gt;Use the data stored and managed in Flotiq in multiple ways, building other websites or &lt;a href="https://flotiq.com/docs/Deep-Dives/mobile-expo-product-showcase/"&gt;mobile applications&lt;/a&gt;. Extend your project scope by adding new functionalities like &lt;a href="https://flotiq.com/docs/Deep-Dives/node-js-ecommerce-snipcart-gatsby-demo/"&gt;e-commerce&lt;/a&gt; or a &lt;a href="https://flotiq.com/docs/Deep-Dives/storing-location-data-headless-cms/"&gt;map with a store locator&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>tutorial</category>
      <category>wordpress</category>
      <category>flotiq</category>
    </item>
    <item>
      <title>Migrate WordPress to Flotiq Headless CMS</title>
      <dc:creator>andrzejwp</dc:creator>
      <pubDate>Mon, 30 Nov 2020 13:13:08 +0000</pubDate>
      <link>https://forem.com/flotiq/migrate-wordpress-to-flotiq-headless-cms-48a5</link>
      <guid>https://forem.com/flotiq/migrate-wordpress-to-flotiq-headless-cms-48a5</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article originally appeared as a blog post on &lt;a href="https://flotiq.com/blog/migrate-wordpress-to-flotiq-headless-cms" rel="noopener noreferrer"&gt;Flotiq.com&lt;/a&gt; &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  TLDR;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Moving from WordPress to a headless CMS is a matter of time for many projects. &lt;/li&gt;
&lt;li&gt;Trying new solutions is easier when you can rely on pure content.&lt;/li&gt;
&lt;li&gt;Flotiq provides a one-click solution to migrate data &lt;a href="https://flotiq.com/services/migrate-wordpress-to-flotiq-headless-cms/" rel="noopener noreferrer"&gt;from WordPress to our headless CMS&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;After importing the data you can use Flotiq benefits - personal APIs, API docs, SDKs, Postman Collections, and so on.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Decision about migration
&lt;/h2&gt;

&lt;p&gt;Once your project grows, you may start getting disappointed with WordPress. We've already talked about some common culprits of WordPress in our &lt;a href="https://flotiq.com/blog/why-you-should-consider-flotiq-headless-cms-over-wordpress" rel="noopener noreferrer"&gt;previous article&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;When you already know you need more - you will want to try other systems. But what with your existing data, the endless hours spent building those hundreds of blogposts? This question often stops developers from making a decision to switch to other systems. They see a painful migration on the horizon. &lt;/p&gt;

&lt;h2&gt;
  
  
  Migration? Try our one-click tool
&lt;/h2&gt;

&lt;p&gt;At Flotiq we understand our fellow developers and embrace the fear of migration. We created a simple tool for migrating your data from WordPress to our Headless CMS. All you need is your personal &lt;a href="https://flotiq.com/docs/API/" rel="noopener noreferrer"&gt;Flotiq Read And Write API Key&lt;/a&gt; and of course your WordPress Site address. Read on to see how easy it is.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Get your API Key
&lt;/h3&gt;

&lt;p&gt;To create a Flotiq Account go to the &lt;a href="https://editor.flotiq.com/register.html" rel="noopener noreferrer"&gt;register page&lt;/a&gt;. Next, copy your Read and Write API key from Flotiq Dashboard.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fapi.flotiq.com%2Fimage%2F0x0%2F_media-f291eeb1-1cd7-4695-bc6c-f4d55794e7aa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fapi.flotiq.com%2Fimage%2F0x0%2F_media-f291eeb1-1cd7-4695-bc6c-f4d55794e7aa.png" alt="Get Read And Write API key from Flotiq Dashboard"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Use our migration service
&lt;/h3&gt;

&lt;p&gt;Go to the &lt;a href="https://flotiq.com/services/migrate-wordpress-to-flotiq-headless-cms/" rel="noopener noreferrer"&gt;WordPress to Flotiq migration service&lt;/a&gt;, fill in the required data you already have, and start the import. This process will import your posts, pages, tags, and categories. It takes care of your media also and will transfer it to your Flotiq Media Library.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fapi.flotiq.com%2Fimage%2F0x0%2F_media-5afea582-9fac-47e5-8535-eca5c657c8ef.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fapi.flotiq.com%2Fimage%2F0x0%2F_media-5afea582-9fac-47e5-8535-eca5c657c8ef.png" alt="One-click migration from WordPress to Flotiq Headless CMS"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. That's it. Check your data in Flotiq
&lt;/h3&gt;

&lt;p&gt;Now, check your Flotiq account. You will see new Content Type Definitions. Remember, that you can modify imported data and schemas to fit your needs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fapi.flotiq.com%2Fimage%2F0x0%2F_media-6391f3bd-fe36-47e4-b68d-f3ef032827b7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fapi.flotiq.com%2Fimage%2F0x0%2F_media-6391f3bd-fe36-47e4-b68d-f3ef032827b7.png" alt="New, WordPress-like Content Type Definitions in your Flotiq Account"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Look over the imported data.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fapi.flotiq.com%2Fimage%2F0x0%2F_media-9d8c7033-2cf4-4cb4-8bee-4776f0af315e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fapi.flotiq.com%2Fimage%2F0x0%2F_media-9d8c7033-2cf4-4cb4-8bee-4776f0af315e.png" alt="WordPress data in Flotiq headless CMS"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Instant benefits
&lt;/h2&gt;

&lt;p&gt;Now, when your data is imported you can manage it in Flotiq. You can also go a step further. Once the content types are created, you now have access to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://flotiq.com/docs/API/dynamic-content-api/" rel="noopener noreferrer"&gt;personal API Doc&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://flotiq.com/docs/API/generate-package/" rel="noopener noreferrer"&gt;personal SDKs&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;personal Postman collection.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Below you can see the Postman Collection imported from your account, using your imported data. You can use it as a playground or share it with your team.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fapi.flotiq.com%2Fimage%2F0x0%2F_media-1c42d37f-0438-4dd3-aa33-0fbe17d5720b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fapi.flotiq.com%2Fimage%2F0x0%2F_media-1c42d37f-0438-4dd3-aa33-0fbe17d5720b.png" alt="WordPress imported data in Flotiq Headless CMS as Postman Collection Playground"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Next steps
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Learn more about &lt;a href="https://flotiq.com/docs/panel/" rel="noopener noreferrer"&gt;Flotiq Dashboard&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Learn more about &lt;a href="https://flotiq.com/docs/API/dynamic-content-api/" rel="noopener noreferrer"&gt;Flotiq Dynamic Content API&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Create your site with Gatsby using our &lt;a href="https://flotiq.com/docs/Deep-Dives/Building-a-blog-in-3-minutes/" rel="noopener noreferrer"&gt;Gatsby Starters&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Try to migrate WordPress data using our &lt;a href="https://github.com/flotiq/flotiq-cli#import-data-from-wordpress-to-flotiq" rel="noopener noreferrer"&gt;Flotiq CLI&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;If you have any questions let us know on the &lt;a href="https://discord.gg/FwXcHnX" rel="noopener noreferrer"&gt;Discord channel&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>tutorial</category>
      <category>javascript</category>
      <category>wordpress</category>
      <category>flotiq</category>
    </item>
    <item>
      <title>Product showcase mobile app in React and Flotiq</title>
      <dc:creator>andrzejwp</dc:creator>
      <pubDate>Tue, 15 Sep 2020 09:01:23 +0000</pubDate>
      <link>https://forem.com/flotiq/product-showcase-mobile-app-in-react-52hh</link>
      <guid>https://forem.com/flotiq/product-showcase-mobile-app-in-react-52hh</guid>
      <description>&lt;h1&gt;
  
  
  React-native mobile product showcase
&lt;/h1&gt;

&lt;p&gt;This simple guide will show you how to adapt the &lt;a href="https://github.com/flotiq/flotiq-mobile-demo"&gt;Flotiq Mobile Expo&lt;/a&gt; application source code to work as a product showcase app. &lt;/p&gt;

&lt;p&gt;You will build a mobile app that will let your users:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;browse through the list of products, &lt;/li&gt;
&lt;li&gt;read product details,&lt;/li&gt;
&lt;li&gt;search through the product list.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The app will be synchronized with your Flotiq account, so you can use the CMS to add and update products and it will compile for Android and iOS phones, out of the box. The code changes required in this guide are minimal, but it might take some time to setup the working environment, both for Android and iOS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;We encourage you to download the Flotiq mobile expo application from your Google Play or Apple App Store and connect it with your Flotiq account. This way you will understand how the application works and what you can expect.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apps.apple.com/app/flotiq-mobile-expo/id1505331246"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lgZTWwNx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/551004/29770691-a2082ff4-8bc6-11e7-89a6-964cd405ea8e.png" alt="Flotiq Mobile Expo on Apple App Store"&gt;&lt;/a&gt; &lt;a href="https://play.google.com/store/apps/details?id=com.flotiqmobiledemo"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6nPfKpCF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/551004/29770692-a20975c6-8bc6-11e7-8ab0-1cde275496e0.png" alt="Flotiq Mobile Expo on Google Play"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The article assumes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;you already &lt;a href="https://editor.flotiq.com/register.html"&gt;registered a free Flotiq account&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;you know how to &lt;a href="https://flotiq.com/docs/API/"&gt;retrieve your API keys&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here are the remaining essentials:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Fork the application repo&lt;/p&gt;

&lt;p&gt;Go to &lt;a href="https://github.com/flotiq/flotiq-mobile-demo"&gt;Flotiq Mobile Expo on GitHub&lt;/a&gt; and fork our repo. You will be making some changes to the code and it will be easier to keep track of it later on. Don't forget to give us a star if you find it useful!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Setup your workspace&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install &lt;a href="https://apps.apple.com/us/app/xcode/id497799835?mt=12"&gt;XCode&lt;/a&gt; on your Mac or &lt;/li&gt;
&lt;li&gt;Install Android Studio, for example through &lt;a href="https://www.jetbrains.com/toolbox-app/"&gt;JetBrains Toolbox&lt;/a&gt;. Once installed - launch it and &lt;a href="https://developer.android.com/studio/run/emulator#install"&gt;install an emulator&lt;/a&gt; with a recent Android Virtual Device&lt;/li&gt;
&lt;li&gt;Clone the git repository you just forked or use ours: 
&lt;code&gt;git clone https://github.com/flotiq/flotiq-mobile-demo&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Install node dependencies in your project directory:
&lt;code&gt;npm install&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Start the iOS emulator
&lt;code&gt;npx react-native run-ios&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Or start the Android emulator
&lt;code&gt;npx react-native run-android&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This should bring up the emulator and launch Flotiq app.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oibt3zZF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/mobile-expo-product-showcase-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oibt3zZF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/mobile-expo-product-showcase-1.png" alt="Flotiq Mobile Expo login screen"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The screen you will see allows you to connect with your Flotiq account, but we will do this through a simple change in the source code.&lt;/p&gt;

&lt;p&gt;If you have any issues - consult the README file in the application repo.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Code updates
&lt;/h2&gt;

&lt;p&gt;Here are the steps needed to connect the app to your Flotiq account and simplify it, so it only displays the products.&lt;/p&gt;

&lt;h3&gt;
  
  
  Authenticate with your Flotiq API key
&lt;/h3&gt;

&lt;p&gt;The code in the repository uses a login screen to authenticate with your API key. We won't need that for our Product Showcase application, but we still need to authenticate with the Flotiq API.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Login to the &lt;a href="https://editor.flotiq.com"&gt;Flotiq dashboard&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Create a &lt;a href="https://flotiq.com/docs/API/#user-defined-api-keys"&gt;scoped API key&lt;/a&gt; for the Product and Media content types&lt;/li&gt;
&lt;li&gt;Copy the key. &lt;/li&gt;
&lt;li&gt;Now save it in your React code, by adding the following line to the &lt;code&gt;App.js&lt;/code&gt; file:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;FlotiqNavigator&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./app/navigation/FlotiqNavigator/FlotiqNavigator&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;contentTypesReducer&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./app/store/reducers/contentTypes&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;authReducer&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./app/store/reducers/auth&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Add this line after imports:&lt;/span&gt;
    &lt;span class="nx"&gt;AsyncStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;flotiqApiKey&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;&amp;lt; YOUR FLOTIQ READ-ONLY API KEY HERE &amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;enableScreens&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Once you save the file - the application should automatically reload in the emulator and the login screen should be skipped. You should now see the application's home screen:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--R0iMAxhU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/mobile-expo-product-showcase-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--R0iMAxhU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/mobile-expo-product-showcase-2.png" alt="Flotiq Mobile Expo home screen, after login"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Simplify navigation
&lt;/h3&gt;

&lt;p&gt;For our Product Showcase app we would like to skip to the product list immediately, instead of showing the default Home screen and Content Type browser screen. To achieve that - you will need to update how the navigation is structured. &lt;/p&gt;

&lt;p&gt;Open the &lt;code&gt;StackNavigator.js&lt;/code&gt; file and make the necessary adjustments:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Remove the &lt;code&gt;{{HomeStackScreen()}}&lt;/code&gt; line in the &lt;code&gt;RootStackNavigator&lt;/code&gt; component,&lt;/li&gt;
&lt;li&gt;Remove the entire &lt;code&gt;Stack.Screen&lt;/code&gt; called &lt;code&gt;ContentTypesScreen&lt;/code&gt; in the &lt;code&gt;ContentTypesStackScreen&lt;/code&gt; constant,&lt;/li&gt;
&lt;li&gt;Make the following adjustments in &lt;code&gt;ContentTypeObjectsScreen.js&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;comment out the first line add the following constants:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;    &lt;span class="c1"&gt;//const { contentTypeName, partOfTitleProps, withReachTextProps, refetchData, contentTypeLabel } = props.route.params;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;contentTypeName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;product&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;partOfTitleProps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;withReachTextProps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;description&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;refetchData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Now, to properly hide the splash screen - add the following import statement:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;SplashScreen&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native-splash-screen&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;and add the following &lt;code&gt;useEffect()&lt;/code&gt; before the first one appearing in the file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;    &lt;span class="nx"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;isLoading&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;SplashScreen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hide&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;isLoading&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Finally, in the &lt;code&gt;contentTypeObjectsScreenOptions&lt;/code&gt; method - replace the &lt;code&gt;screenTitle&lt;/code&gt; const with a static one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;screenTitle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Products&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Here's the &lt;a href="https://github.com/andrzejwp/flotiq-mobile-demo/pull/1/files"&gt;full list of changes&lt;/a&gt; that have to be made to simplify the original app, in case you missed something.&lt;/p&gt;

&lt;h2&gt;
  
  
  Effects
&lt;/h2&gt;

&lt;p&gt;That's it! You should now see the product list immediately after the app has loaded:&lt;br&gt;
    &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vLLTPtng--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/mobile-expo-product-showcase-3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vLLTPtng--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/mobile-expo-product-showcase-3.png" alt="Flotiq Mobile Product Showcase home screen"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, you can go and play with it or publish it straight to the App stores. The original application has already been approved by Apple and Google stores, so it should be a quick and easy task to get your app approved too!&lt;/p&gt;

&lt;p&gt;Some ideas you can try:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;add product images to the list,&lt;/li&gt;
&lt;li&gt;modify the product detail screen,&lt;/li&gt;
&lt;li&gt;remove add / edit content buttons.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Have fun, and tell us what you built!&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>react</category>
      <category>javascript</category>
      <category>reactnative</category>
    </item>
    <item>
      <title>Building a banner rotator with an admin interface</title>
      <dc:creator>andrzejwp</dc:creator>
      <pubDate>Tue, 23 Jun 2020 13:48:01 +0000</pubDate>
      <link>https://forem.com/flotiq/building-a-banner-rotator-with-an-admin-interface-14n6</link>
      <guid>https://forem.com/flotiq/building-a-banner-rotator-with-an-admin-interface-14n6</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article was first posted as a &lt;a href="https://flotiq.com/docs/Deep-Dives/building-a-banner-rotator-with-an-admin-interface/"&gt;Flotiq Deep-Dive&lt;/a&gt;. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This quick tutorial shows how you can build your own system that can rotate ads on your website. You can easily adapt it to many other solutions and several techniques shown here may come handy in different projects.&lt;/p&gt;

&lt;p&gt;Requirements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;easy to use interface for administering ad banners,&lt;/li&gt;
&lt;li&gt;banner admin system decoupled from website CMS,&lt;/li&gt;
&lt;li&gt;option to group banners, for example vertical / horizontal,&lt;/li&gt;
&lt;li&gt;no changes to existing Web CMS code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Plan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;prepare a data model in Flotiq headless CMS,&lt;/li&gt;
&lt;li&gt;generate a read-only API key,&lt;/li&gt;
&lt;li&gt;write a simple script to load banners and display random one,&lt;/li&gt;
&lt;li&gt;attach the minified script to the website.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1. The Content Type Definition
&lt;/h2&gt;

&lt;p&gt;The first step will be to define the data model. In Flotiq you do that by creating a new Content Type Definition. You can start with something simple - Flotiq supports iterative development because you can change your Content Type Definitions any time and adjust them to changing needs.&lt;/p&gt;

&lt;p&gt;Since one of the requirements is the ability to group banners together - we can create a single Content Type Definition that will reflect a &lt;code&gt;Rotator&lt;/code&gt; which will be composed of an array of &lt;code&gt;Banner&lt;/code&gt; objects. In our case we chose not to build a separate &lt;code&gt;Banner&lt;/code&gt; type - we'll simply add the required properties using Flotiq's &lt;code&gt;List&lt;/code&gt; field.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--M7bt-JbU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/building-a-banner-rotator/rotator-content-type-definition-sketch.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--M7bt-JbU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/building-a-banner-rotator/rotator-content-type-definition-sketch.png" alt="The Rotator Content Type Definition"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here are the properties we will require:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Name (text)&lt;/li&gt;
&lt;li&gt;Width (number)&lt;/li&gt;
&lt;li&gt;Height (number)&lt;/li&gt;
&lt;li&gt;Banners (list)

&lt;ul&gt;
&lt;li&gt;Enabled (boolean)&lt;/li&gt;
&lt;li&gt;Image (media)&lt;/li&gt;
&lt;li&gt;Link (text)&lt;/li&gt;
&lt;li&gt;Title (text)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;after adding that into a new Flotiq Content Type you should see the following:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7VWZWhlL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/building-a-banner-rotator/rotator-content-type-definition-flotiq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7VWZWhlL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/building-a-banner-rotator/rotator-content-type-definition-flotiq.png" alt="The Rotator Content Type Definition in Flotiq"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hit Save and you can start adding new Rotators!&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Create an API Key
&lt;/h2&gt;

&lt;p&gt;It's always recommended to use a scoped API key - that way access to content is restricted to specific Content Types and even if you add new data models in the future - your data will be safe.In our case - we will need access to 2 Content Types - &lt;code&gt;Rotator&lt;/code&gt; and &lt;code&gt;Media&lt;/code&gt;, so let's add a key for that purpose.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--a_9pMgjE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/building-a-banner-rotator/flotiq-api-keys.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--a_9pMgjE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/building-a-banner-rotator/flotiq-api-keys.png" alt="Flotiq scoped API Keys"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Build the rotator script
&lt;/h2&gt;

&lt;p&gt;The rotator script should pull a particular rotator, randomly select one of the banners and display it in the target HTML container.&lt;/p&gt;

&lt;p&gt;The HTML container can look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;data-rotator-id=&lt;/span&gt;&lt;span class="s"&gt;"__ROTATOR_ID__"&lt;/span&gt; 
     &lt;span class="na"&gt;data-rotator-key=&lt;/span&gt;&lt;span class="s"&gt;"__FLOTIQ_SCOPED_READ_ONLY_KEY__"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;and here's a very simple JavaScript that downloads the banner and shows it in the target container:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;initRotator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;linkElement&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="cm"&gt;/* Build html element with banner */&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;createHtmlBanner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;link&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;anchor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;a&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;img&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;anchor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;href&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;link&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;anchor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;alt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;img-responsive&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;img-fluid&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;anchor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;image&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;anchor&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="cm"&gt;/* Get elements data */&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rotatorId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;linkElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;data-rotator-id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;readOnlyKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;linkElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;data-rotator-key&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="cm"&gt;/* Fetch data from Flotiq API */&lt;/span&gt;
    &lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://api.flotiq.com/api/v1/content/rotator/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;rotatorId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;?hydrate=1&amp;amp;auth_token=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;readOnlyKey&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rotator&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;enabledBanners&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;rotator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Banners&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;banner&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;banner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;enabled&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;randomBanner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;enabledBanners&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;enabledBanners&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)];&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;enabledBanners&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nx"&gt;linkElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="nx"&gt;linkElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;createHtmlBanner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="s2"&gt;`https://api.flotiq.com/image/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;rotator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Width&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;x&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;rotator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Height&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;randomBanner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;image&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;randomBanner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;image&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;extension&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="nx"&gt;randomBanner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="nx"&gt;randomBanner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;link&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="cm"&gt;/* Initialize rotators */&lt;/span&gt;
&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[data-rotator-id]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;initRotator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Who! That's not even 40 lines of code and we have a working ad rotator!&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Simple CDN - GitHub + jsDelivr
&lt;/h2&gt;

&lt;p&gt;One of the goals is to have a solution that will not change any CMS code and as such - can be used with any CMS tool. For that purpose we'll put the script on GitHub and serve through &lt;a href="https://jsdelivr.com"&gt;jsDelivr&lt;/a&gt;. How does this work?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Start with creating a public GitHub repo&lt;/li&gt;
&lt;li&gt;Put the script in that repo&lt;/li&gt;
&lt;li&gt;jsDelivr will do its magic&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The only thing you need to do is prepare a correct URL. According to &lt;a href="https://www.jsdelivr.com/features"&gt;jsDelivr&lt;/a&gt; docs you can use &lt;code&gt;https://cdn.jsdelivr.net/gh/[user]/[repo]@[version]/[file]&lt;/code&gt;. If you add &lt;code&gt;.min.js&lt;/code&gt; to the URL - the CDN will automatically minify the file for you.&lt;/p&gt;

&lt;p&gt;With that - we don't need to put the entire script on our website, it's enough to reference it. The full banner rotator setup is then reduced to pasting these lines in your HTML:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;data-rotator-id=&lt;/span&gt;&lt;span class="s"&gt;"__ROTATOR_ID__"&lt;/span&gt; 
     &lt;span class="na"&gt;data-rotator-key=&lt;/span&gt;&lt;span class="s"&gt;"__FLOTIQ_SCOPED_READ_ONLY_KEY__"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.jsdelivr.net/gh/trzcina/flotiq-rotator@1/src/script.min.js"&lt;/span&gt; &lt;span class="na"&gt;defer&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;This code can be pasted in any CMS. Here's how it looks in BoltCMS &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_QkWNIAG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/building-a-banner-rotator/rotator-bolt-cms.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_QkWNIAG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/building-a-banner-rotator/rotator-bolt-cms.png" alt="Flotiq Rotator in Bolt CMS"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and Wordpress&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oc21hOi4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/building-a-banner-rotator/rotator-wordpress.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oc21hOi4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/building-a-banner-rotator/rotator-wordpress.png" alt="Flotiq Rotator in Wordpress"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Next Steps
&lt;/h2&gt;

&lt;p&gt;The solution shown in this article meets the basic requirements and is ready to use.Possible next steps are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ability to choose if the link should open in a new tab&lt;/li&gt;
&lt;li&gt;sending out a click event to Google Analytics&lt;/li&gt;
&lt;li&gt;ability to add AdSense ads to the Rotator.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Heads up! Try not to use &lt;code&gt;ad&lt;/code&gt; or &lt;code&gt;adv&lt;/code&gt; or &lt;code&gt;banner&lt;/code&gt; in your paths and filenames. This way your chances of triggering AdBlock tools are lower!&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>tutorial</category>
      <category>javascript</category>
      <category>flotiq</category>
      <category>webmonetization</category>
    </item>
    <item>
      <title>Use Netlify, Zapier and Gatsby to instantly deploy your CMS content</title>
      <dc:creator>andrzejwp</dc:creator>
      <pubDate>Thu, 30 Apr 2020 15:39:06 +0000</pubDate>
      <link>https://forem.com/flotiq/use-netlify-zapier-and-gatsby-to-instantly-deploy-your-cms-content-2357</link>
      <guid>https://forem.com/flotiq/use-netlify-zapier-and-gatsby-to-instantly-deploy-your-cms-content-2357</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article was originally posted as a &lt;a href="https://flotiq.com/docs/Deep-Dives/netlify-zapier-gatsby-serverless-deployment-pipeline/"&gt;Flotiq Deep Dive&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;In this article, we'll setup an extremely powerful, yet totally effortless (and free!) deployment pipeline for your Gatsby websites. We'll use Netlify as a deployment target, so no servers required.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why?
&lt;/h2&gt;

&lt;p&gt;Gatsby is a static website generator. What that means is - your content won't update, unless you rebuild and redeploy your website. This might quickly become a bit of a pain if you're doing content updates often, or if the person doing these updates doesn't know how to rebuild your site.&lt;/p&gt;

&lt;p&gt;You can easily set up GitHub hooks to update your website when your code changes, but that doesn't work for &lt;strong&gt;content&lt;/strong&gt; changes.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Go explain to a copywriter that they need to &lt;code&gt;gatsby build&lt;/code&gt; and &lt;code&gt;npm run deploy&lt;/code&gt; every time they update the website's content!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What you want to have is an automated process that will publish the website once your &lt;strong&gt;content&lt;/strong&gt; is updated.&lt;/p&gt;

&lt;p&gt;This article covers step by step guide, how to: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Setup your data source using a Gatsby Starter and Flotiq&lt;/li&gt;
&lt;li&gt;Setup your page deployment in Netlify&lt;/li&gt;
&lt;li&gt;Setup an automation workflow in Zapier&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In the end - whenever you update your page content in Flotiq, Zapier will trigger deploy process in Netlify to make sure your site is up to date!&lt;/p&gt;

&lt;p&gt;Let's dive deep.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Netlify Account (free) &lt;a href="https://app.netlify.com/signup"&gt;Sign up for Netlify&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub/Gitlab/Bitbucket account (free) &lt;a href="https://github.com/join"&gt;Sign up for GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Zapier account (free) &lt;a href="https://zapier.com/sign-up/"&gt;Sign up for Zapier&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Flotiq account (free) &lt;a href="https://editor.flotiq.com/register.html"&gt;Register a Flotiq account here&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Grab one of our Gatsby Starters!
&lt;/h2&gt;

&lt;p&gt;Head out to our &lt;a href="https://github.com/flotiq"&gt;Github repository&lt;/a&gt; and pick one of Gatsby starter projects. Let's use the popular &lt;a href="https://github.com/flotiq/gatsby-starter-recipes"&gt;Gatsby Recipes Starter&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;gatsby new gatsby-starter-recipes https://github.com/flotiq/gatsby-starter-recipes.git
&lt;span class="nb"&gt;cd &lt;/span&gt;gatsby-starter-recipes
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;You can either build the Content Types yourself or use our predefined content&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;node ./example/importExample.js
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;This handy command will add 4 images and 2 recipes to your Flotiq account.&lt;/p&gt;

&lt;p&gt;Each of our gatsby starters has a "Deploy to Netlify" button at the bottom of the README:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jtiRV-gl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/serverless-deployment-pipeline/github-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jtiRV-gl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/serverless-deployment-pipeline/github-1.png" alt="Deploy to Netlify button"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click it: &lt;a href="https://app.netlify.com/start/deploy?repository=https://github.com/flotiq/gatsby-starter-recipes"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Gq_bfuxi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.netlify.com/img/deploy/button.svg" alt="Deploy"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Configure your Netlify site deploy
&lt;/h2&gt;

&lt;p&gt;You'll now see a 3-step configuration process, that involves:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Connecting to your GitHub account&lt;/li&gt;
&lt;li&gt;Setting up required parameters for deploy&lt;/li&gt;
&lt;li&gt;Deploying your site&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--R7NvrP2S--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/serverless-deployment-pipeline/netlify-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--R7NvrP2S--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/serverless-deployment-pipeline/netlify-1.png" alt="Connect to your provider in Netlify"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Connect your GitHub account and head on to the next step.&lt;/p&gt;

&lt;p&gt;In the next view, you will be prompted to enter 3 parameters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repository name - this is where Netlify will create a new repository for you.&lt;/li&gt;
&lt;li&gt;Flotiq API url - enter: &lt;code&gt;https://api.flotiq.com&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Your Flotiq read-only API Key.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;We advise that you always create a scoped API key. Its disposable nature makes it a safer choice. More about Flotiq API Keys &lt;a href="https://flotiq.com/docs/API/"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kfJ6nNvl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/serverless-deployment-pipeline/netlify-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kfJ6nNvl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/serverless-deployment-pipeline/netlify-2.png" alt="Configure your build"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After filling in all the fields, hit the &lt;code&gt;Save &amp;amp; Deploy&lt;/code&gt; button and wait for your site to build.&lt;/p&gt;

&lt;p&gt;That's all! You will be redirected to your Netlify dashboard. You can check the build logs by clicking here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--udSPRHEp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/serverless-deployment-pipeline/netlify-3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--udSPRHEp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/serverless-deployment-pipeline/netlify-3.png" alt="Netlify dashboard"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Manage Netlify deploys using Zapier
&lt;/h2&gt;

&lt;p&gt;By default, Netlify will observe any changes in your repository, so any push will trigger a build on Netlify. This is usually what you want because you might be pushing some new features to your website and you want them to automatically appear online.  &lt;/p&gt;

&lt;p&gt;But your website is not just the code in your repository. You want your &lt;strong&gt;content&lt;/strong&gt; to be up to date too! We'll show you how to use &lt;a href="https://zapier.com"&gt;Zapier&lt;/a&gt; to update your website every time you create new content.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Log in to Zapier&lt;/li&gt;
&lt;li&gt;On your account dashboard, hover over the left sidebar and click &lt;code&gt;Make a Zap&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As a trigger application, choose &lt;code&gt;Flotiq&lt;/code&gt;, and for the event &lt;code&gt;New Content Object&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PhZYw6T9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/serverless-deployment-pipeline/zapier-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PhZYw6T9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/serverless-deployment-pipeline/zapier-1.png" alt="Choose trigger app in Zapier"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Next, choose your Flotiq account and click &lt;code&gt;Continue&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ei6hS9hl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/serverless-deployment-pipeline/zapier-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ei6hS9hl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/serverless-deployment-pipeline/zapier-2.png" alt="Choose Flotiq Account in Zapier"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Choose your Content Type Definition from the list.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yyKQydAY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/serverless-deployment-pipeline/zapier-3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yyKQydAY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/serverless-deployment-pipeline/zapier-3.png" alt="Choose Content Type Definition from the list"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click continue. You can skip the test phase and proceed to the next action.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Choose &lt;code&gt;Netlify&lt;/code&gt; as an action application, and &lt;code&gt;Start deploy&lt;/code&gt; as an event.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---5Li0qkN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/serverless-deployment-pipeline/zapier-4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---5Li0qkN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/serverless-deployment-pipeline/zapier-4.png" alt="Choose action application"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sign in to your Netlify account and proceed further.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--osfqZ4tL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/serverless-deployment-pipeline/zapier-5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--osfqZ4tL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/serverless-deployment-pipeline/zapier-5.png" alt="Choose your Netlify account"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select your site from the list. Alternatively, you can choose to clear build cache, but it will increase the build time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BMcpZa_p--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/serverless-deployment-pipeline/zapier-6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BMcpZa_p--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/serverless-deployment-pipeline/zapier-6.png" alt="Select site to be built"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the last step, you can test if this action works properly. It will rebuild your site.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  That's it
&lt;/h2&gt;

&lt;p&gt;You're set! Click &lt;code&gt;Turn the Zap On!&lt;/code&gt;. Now you can create a new entry in the &lt;a href="https://editor.flotiq.com"&gt;Flotiq editor&lt;/a&gt; and see that your recipe will appear on your website in a moment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Useful links
&lt;/h2&gt;

&lt;p&gt;Learn more about building powerful integrations with Zapier and Flotiq:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://flotiq.com/docs/API/zapier/"&gt;More about Zapier Integrations in Flotiq&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Or try one of the awesome Gatsby starters we've integrated with Flotiq:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://dev.to/flotiq/build-an-e-commerce-site-with-gatsby-and-snipcart-3jpg"&gt;Build an e-commerce site using Gatsby, Flotiq and Snipcart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/flotiq/building-a-recipes-website-using-gatsby-and-flotiq-2b3a"&gt;Build a recipe website using Gatsby and Flotiq&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>gatsby</category>
      <category>javascript</category>
      <category>serverless</category>
      <category>flotiq</category>
    </item>
    <item>
      <title>Building a recipes website using Gatsby and Flotiq</title>
      <dc:creator>andrzejwp</dc:creator>
      <pubDate>Tue, 21 Apr 2020 18:10:51 +0000</pubDate>
      <link>https://forem.com/flotiq/building-a-recipes-website-using-gatsby-and-flotiq-2b3a</link>
      <guid>https://forem.com/flotiq/building-a-recipes-website-using-gatsby-and-flotiq-2b3a</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article was originally posted as a Flotiq &lt;a href="https://flotiq.com/docs/Deep-Dives/jamstack-recipes-website-complex-data-structures/"&gt;deep dive on using complex data structures&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;When you're ready to take your headless CMS to the next level and start building data models that are a little more complex you'll find that standard, fixed data types will be too restrictive. Flotiq has always supported building relationships between Content Types, but sometimes that's not enough. &lt;/p&gt;

&lt;p&gt;In this article we'll discuss a couple of particular problems you might encounter when designing a data model and later - when working with it. Accidentally - we'll also build a &lt;strong&gt;stunning website&lt;/strong&gt; with your favorite culinary recipes (scrambled eggs, of course!). &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--u16elvnv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://editor.flotiq.com/images/flotiq-starter-recipes.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--u16elvnv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://editor.flotiq.com/images/flotiq-starter-recipes.png" alt="Recipes website built using Gatsby and Flotiq"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A simple &lt;code&gt;Recipe&lt;/code&gt; model you might find useful for a recipe website could look like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Name - text&lt;/li&gt;
&lt;li&gt;Slug - text&lt;/li&gt;
&lt;li&gt;Image - image&lt;/li&gt;
&lt;li&gt;Description - rich text&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ingredients&lt;/strong&gt; - rich text&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Steps&lt;/strong&gt; - rich text&lt;/li&gt;
&lt;li&gt;Cooking time - number&lt;/li&gt;
&lt;li&gt;Servings - number&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For such a model - Flotiq would generate a form looking like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wpZjcnLa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/jamstack-recipes-complex-data-structures/upload_5466699a3bcd1bdc5e419f2d17240c37.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wpZjcnLa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/jamstack-recipes-complex-data-structures/upload_5466699a3bcd1bdc5e419f2d17240c37.png" alt="Flotiq form for a simple data model"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and your API docs would describe that model this way:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--d0Ba3Ofh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/jamstack-recipes-complex-data-structures/upload_0158c43f8d5cc1154fddd8ae68a15ae9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--d0Ba3Ofh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/jamstack-recipes-complex-data-structures/upload_0158c43f8d5cc1154fddd8ae68a15ae9.png" alt="Flotiq API docs for a simple data model"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This model might be acceptable for very simple websites, but having the &lt;code&gt;Ingredients&lt;/code&gt; and &lt;code&gt;Steps&lt;/code&gt; entered as unstructured text (even if using HTML &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt;) will soon become an issue. &lt;/p&gt;

&lt;p&gt;Here's why:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;No easy, programmatic, access to ingredients - eg. no way to build a shopping list out of it&lt;/li&gt;
&lt;li&gt;Can't easily iterate through the recipe's steps - difficult to build an interactive UI, doesn't help with SEO either&lt;/li&gt;
&lt;li&gt;People editing the content will use different formatting every time and the content will quickly become messy. You'll get entries like:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    2 eggs
    1 pinch of salt
    1 tbsp of butter
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Eggs: 2
- Salt: 1 pinch
- Butter: 1 tbsp
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;ul&amp;gt;
    &amp;lt;li&amp;gt;2 eggs&amp;lt;/li&amp;gt;
    &amp;lt;li&amp;gt;1 pinch of salt&amp;lt;/li&amp;gt;
    &amp;lt;li&amp;gt;1 tablespoon of butter&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;and so on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution
&lt;/h2&gt;

&lt;p&gt;The problem of unstructured data can be solved using repeatable content fragments defined directly in a data model. It's a simple and convenient solution - both for developers modeling data and content editors as well.&lt;/p&gt;

&lt;p&gt;Here's how you would go about it with Flotiq's &lt;code&gt;list&lt;/code&gt; data type:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WrjR-lIC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/jamstack-recipes-complex-data-structures/upload_9ecd3721c970774c2735a195ff55643f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WrjR-lIC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/jamstack-recipes-complex-data-structures/upload_9ecd3721c970774c2735a195ff55643f.png" alt="Flotiq's list data type"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Less mess, providing structure without the need to create additional content types.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;list&lt;/code&gt; data type will render as a set of sub-forms - makes it easier for content editing.&lt;/li&gt;
&lt;li&gt;Easier data access from the API - more readable data structure.&lt;/li&gt;
&lt;li&gt;Easier to interpret complex data on the frontend.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Use case: Recipe content type
&lt;/h2&gt;

&lt;p&gt;Now - let's apply the &lt;code&gt;list&lt;/code&gt; data type to the recipes Content Type. Let's assume each step  will include a description and an optional image and every ingredient - it's amount, unit, product name.&lt;/p&gt;

&lt;p&gt;We can now extend the example mentioned above:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Name - text&lt;/li&gt;
&lt;li&gt;Slug - text&lt;/li&gt;
&lt;li&gt;Image - image&lt;/li&gt;
&lt;li&gt;Description - richtext&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ingredients - a list of:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;amount - number&lt;/li&gt;
&lt;li&gt;unit - text&lt;/li&gt;
&lt;li&gt;product - text&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Steps - a list of:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;description - textarea&lt;/li&gt;
&lt;li&gt;image - image&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Cooking time&lt;/li&gt;
&lt;li&gt;Servings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your Content Type definition in Flotiq would then look like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BwWEooIc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/jamstack-recipes-complex-data-structures/upload_7d565cfe5f5df4287c3d7e0d7004fc94.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BwWEooIc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/jamstack-recipes-complex-data-structures/upload_7d565cfe5f5df4287c3d7e0d7004fc94.png" alt="Recipe content type definition using lists"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and you would expect this in the API docs:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aKY2uX9r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/jamstack-recipes-complex-data-structures/upload_769871eca6460389041c8c52c381826f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aKY2uX9r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/jamstack-recipes-complex-data-structures/upload_769871eca6460389041c8c52c381826f.png" alt="Recipe API docs showing lists"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Yup, we know, we're drooling over Flotiq's API docs every time, too. And you know what? You don't need to write a line of code - the docs, just as your entire RESTful API are generated every time you change your model definitions!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And this is how the form for that Content Type would render:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xk6-5he0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/jamstack-recipes-complex-data-structures/upload_a99534a9bf1aee346e58aec39037bfd5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xk6-5he0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/jamstack-recipes-complex-data-structures/upload_a99534a9bf1aee346e58aec39037bfd5.png" alt="Flotiq form for a content object using lists"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We used the &lt;code&gt;list&lt;/code&gt; datatype in this &lt;a href="https://github.com/flotiq/gatsby-starter-recipes"&gt;Gatsby &amp;amp; Flotiq recipes starter&lt;/a&gt; and you can see the results &lt;a href="https://flotiq-starter-recipes.herokuapp.com/"&gt;here&lt;/a&gt;. With this data model it's now really simple for a frontend developer to interpret that content on the website.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vCa3zPAf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/jamstack-recipes-complex-data-structures/upload_7dd4947f6433fabfaf9c94170b445dc4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vCa3zPAf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/jamstack-recipes-complex-data-structures/upload_7dd4947f6433fabfaf9c94170b445dc4.png" alt="Full example of a recipe using Flotiq lists"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Experiment with the Gatsby starter
&lt;/h2&gt;

&lt;p&gt;If you'd like to dig a little deeper into this recipe website, here's your quickstart:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Install gatsby&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; gatsby
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Start project from the template using Gatsby CLI&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gatsby new gatsby-starter-recipes https://github.com/flotiq/gatsby-starter-recipes.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Setup "Recipe" Content Type in Flotiq&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Create your &lt;a href="https://flotiq.com"&gt;Flotiq.com&lt;/a&gt; account. Next, create the &lt;code&gt;Recipe&lt;/code&gt; Content Type:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5Vc6lhfh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/flotiq/gatsby-starter-recipes/raw/master/docs/create-definition-recipe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5Vc6lhfh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/flotiq/gatsby-starter-recipes/raw/master/docs/create-definition-recipe.png" alt="Recipe content type in flotiq"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: You can also create &lt;code&gt;Recipe&lt;/code&gt; using &lt;a href="https://flotiq.com/docs/API/"&gt;Flotiq REST API&lt;/a&gt;.&lt;/em&gt; &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configure application&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The next step is to configure our application to know from where it has to fetch the data.&lt;/p&gt;

&lt;p&gt;You need to create a file called &lt;code&gt;.env&lt;/code&gt; inside the root of the directory, with the following structure:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GATSBY_FLOTIQ_BASE_URL="https://api.flotiq.com"
FLOTIQ_API_KEY="YOUR FLOTIQ API KEY"
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Launch the Gatsby project&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Navigate into your new site’s directory and start it up.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;gatsby-starter-recipes
npm &lt;span class="nb"&gt;install
&lt;/span&gt;gatsby develop
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Open the source code and start editing!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your site is now running at &lt;code&gt;http://localhost:8000&lt;/code&gt;!&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusions
&lt;/h2&gt;

&lt;p&gt;Flotiq's list data type is an extremely easy to use solution for structuring your data. It organizes the content and makes it easy for content editors to build content, at the same time it's fully supported in the API and API docs. &lt;/p&gt;

&lt;p&gt;Go play with the recipe website project - we've shared a Gatsby starter for that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/flotiq/gatsby-starter-recipes"&gt;Gatsby starter recipes - GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://flotiq-starter-recipes.herokuapp.com"&gt;Gatsby starter recipes - deployed on Heroku&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>gatsby</category>
      <category>javascript</category>
      <category>tutorial</category>
      <category>flotiq</category>
    </item>
    <item>
      <title>Build an e-commerce site with Gatsby, Snipcart and Flotiq</title>
      <dc:creator>andrzejwp</dc:creator>
      <pubDate>Thu, 09 Apr 2020 09:44:38 +0000</pubDate>
      <link>https://forem.com/flotiq/build-an-e-commerce-site-with-gatsby-and-snipcart-3jpg</link>
      <guid>https://forem.com/flotiq/build-an-e-commerce-site-with-gatsby-and-snipcart-3jpg</guid>
      <description>&lt;p&gt;Times are tough, so many businesses are trying to move their sales online. So - this time, we'll dive deep into building e-commerce with Snipcart, Flotiq and Gatsby. &lt;/p&gt;

&lt;p&gt;We'll start with a fresh Flotiq account, build a Content Type Definition, hook it up with a Gatsby starter and finally - deploy it live using Heroku.&lt;/p&gt;

&lt;p&gt;What you'll get:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A simple, but beautiful, functional e-commerce website with your own products, running live on the Internet.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fflotiq.com%2Fdocs%2FDeep-Dives%2Fimages%2Fsnipcart-gatsby-demo%2Flive-website.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fflotiq.com%2Fdocs%2FDeep-Dives%2Fimages%2Fsnipcart-gatsby-demo%2Flive-website.png" alt="Live e-commerce website, built and released in 5 minutes"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What you'll need:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Flotiq account (free),&lt;/li&gt;
&lt;li&gt;Snipcart account (free for testing), register &lt;a href="https://snipcart.com" rel="noopener noreferrer"&gt;here&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Node.js &amp;amp; NPM installed&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/flotiq/gatsby-starter-products" rel="noopener noreferrer"&gt;This repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Heroku account (free) if you'd like to put it live.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let's get started!&lt;/p&gt;

&lt;h2&gt;
  
  
  Prepare your Flotiq account
&lt;/h2&gt;

&lt;p&gt;For this particular project - we'll use Flotiq to store the information about products - names, prices, etc.&lt;br&gt;
There's a couple of simple steps that shouldn't take longer than 1 minute to complete.&lt;/p&gt;
&lt;h3&gt;
  
  
  Register an account, 30 seconds
&lt;/h3&gt;

&lt;p&gt;The first thing you'll need is a free Flotiq account, &lt;a href="https://editor.flotiq.com/register.html" rel="noopener noreferrer"&gt;register a free account in Flotiq&lt;/a&gt;. No payments, no credit cards, simply connect using your Github account or email. &lt;/p&gt;
&lt;h3&gt;
  
  
  Create your Content Type Definition, 30 seconds
&lt;/h3&gt;

&lt;p&gt;The most crucial step - you have to tell Flotiq what kind of data you want to store in the system. What are the names of the content types and their properties. &lt;/p&gt;

&lt;p&gt;When you first log in - it's going to be pretty empty. No content, nothing. Head over to the &lt;code&gt;Type definitions&lt;/code&gt; screen.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fflotiq.com%2Fdocs%2FDeep-Dives%2Fimages%2Fsnipcart-gatsby-demo%2Fupload_eb0f862f52d89aa0558842509818938a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fflotiq.com%2Fdocs%2FDeep-Dives%2Fimages%2Fsnipcart-gatsby-demo%2Fupload_eb0f862f52d89aa0558842509818938a.png" alt="Predefined Content Type Definitions"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here you find a list of simple boilerplate content types, which are a great start if you're in a hurry. &lt;/p&gt;

&lt;p&gt;Click on &lt;code&gt;Product&lt;/code&gt; and then &lt;code&gt;Save&lt;/code&gt;. You don't need to make any changes to get up and running with this project!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fflotiq.com%2Fdocs%2FDeep-Dives%2Fimages%2Fsnipcart-gatsby-demo%2Fupload_2b69829cba0a8ad8d76416fb0bf7a6b0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fflotiq.com%2Fdocs%2FDeep-Dives%2Fimages%2Fsnipcart-gatsby-demo%2Fupload_2b69829cba0a8ad8d76416fb0bf7a6b0.png" alt="Product content type body"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Create your content, 2 minutes
&lt;/h3&gt;

&lt;p&gt;For this project to work - you have to create a couple of products. In the left sidebar click on &lt;code&gt;Content&lt;/code&gt; → &lt;code&gt;Products&lt;/code&gt; and click the &lt;code&gt;Add new Product object&lt;/code&gt; button.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fflotiq.com%2Fdocs%2FDeep-Dives%2Fimages%2Fsnipcart-gatsby-demo%2Fupload_999f5372a47637004f06bc1a00cc007e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fflotiq.com%2Fdocs%2FDeep-Dives%2Fimages%2Fsnipcart-gatsby-demo%2Fupload_999f5372a47637004f06bc1a00cc007e.png" alt="Adding new Content Object of type Product"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enter the product detail.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fflotiq.com%2Fdocs%2FDeep-Dives%2Fimages%2Fsnipcart-gatsby-demo%2Fupload_9832c93c03f6862b07fcb13f848962fe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fflotiq.com%2Fdocs%2FDeep-Dives%2Fimages%2Fsnipcart-gatsby-demo%2Fupload_9832c93c03f6862b07fcb13f848962fe.png" alt="Product details in Flotiq"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can upload your images or use our awesome Unsplash integration - head over to the &lt;code&gt;Stock photos&lt;/code&gt; tab in the Media Library and browse through thousands of beautiful images.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fflotiq.com%2Fdocs%2FDeep-Dives%2Fimages%2Fsnipcart-gatsby-demo%2Fupload_a1a461706f319a31ce3f4ba1b58756dc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fflotiq.com%2Fdocs%2FDeep-Dives%2Fimages%2Fsnipcart-gatsby-demo%2Fupload_a1a461706f319a31ce3f4ba1b58756dc.png" alt="Stock photos media library"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally - click the &lt;code&gt;Save button&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Repeat for as many products as you want.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Hint:&lt;/strong&gt; If you'd like to programmatically import hundreds or thousands of products, instead of typing them by hand - you can use Flotiq's &lt;code&gt;batch&lt;/code&gt; endpoints in your API. Read more about &lt;a href="https://flotiq.com/docs/API/content-types/#batch-content-upload" rel="noopener noreferrer"&gt;batch content creation in Flotiq&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Start your Gatsby project, 2 minutes
&lt;/h2&gt;

&lt;p&gt;To make this extremely simple, we have prepared a Gatsby starter, that integrates with Flotiq as a data source for products. You will configure the project, install its dependencies and put the site live in no-time.&lt;/p&gt;
&lt;h3&gt;
  
  
  Clone the repo
&lt;/h3&gt;

&lt;p&gt;Start by cloning the repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/flotiq/gatsby-starter-products
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Configure Flotiq
&lt;/h3&gt;

&lt;p&gt;Then, in the root folder of the repository create a file called &lt;code&gt;.env&lt;/code&gt;. This file store the configuration for Flotiq and Snipcart. Put the following contents in the &lt;code&gt;.env&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GATSBY_FLOTIQ_BASE_URL="https://api.flotiq.com"
FLOTIQ_API_KEY="YOUR FLOTIQ API KEY"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can find your Flotiq API keys in the user profile section of the interface:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fflotiq.com%2Fdocs%2FDeep-Dives%2Fimages%2Fsnipcart-gatsby-demo%2Fupload_61473eb050d5e4992b8c88eac716e52b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fflotiq.com%2Fdocs%2FDeep-Dives%2Fimages%2Fsnipcart-gatsby-demo%2Fupload_61473eb050d5e4992b8c88eac716e52b.png" alt="Flotiq user API key"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Caution:&lt;/strong&gt; We strongly recommend that you create a scoped API key (read more about &lt;a href="https://flotiq.com/docs/API/" rel="noopener noreferrer"&gt;API access&lt;/a&gt;), but for development, you can use the default Read Only key provided in the interface. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Check if it works!
&lt;/h3&gt;

&lt;p&gt;It's as simple as that. You should be good to go. Install the NPM dependencies and start your gatsby project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install
gatsby develop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should now see your store at &lt;code&gt;http://localhost:8000&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fflotiq.com%2Fdocs%2FDeep-Dives%2Fimages%2Fsnipcart-gatsby-demo%2Fupload_18388a1968458357ff2eea62bb563adc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fflotiq.com%2Fdocs%2FDeep-Dives%2Fimages%2Fsnipcart-gatsby-demo%2Fupload_18388a1968458357ff2eea62bb563adc.png" alt="Your store"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Start selling online
&lt;/h2&gt;

&lt;p&gt;Yes, it is &lt;strong&gt;that&lt;/strong&gt; simple. &lt;br&gt;
You're almost ready to start selling; the final part is to configure Snipcart properly.&lt;/p&gt;
&lt;h3&gt;
  
  
  Configure Snipcart
&lt;/h3&gt;

&lt;p&gt;Head over to &lt;a href="https://snipcart.com" rel="noopener noreferrer"&gt;Snipcart&lt;/a&gt; and in your account - retrieve your Public API Key.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fflotiq.com%2Fdocs%2FDeep-Dives%2Fimages%2Fsnipcart-gatsby-demo%2Fupload_73bf9f96f1fadaf960e12e802833a26b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fflotiq.com%2Fdocs%2FDeep-Dives%2Fimages%2Fsnipcart-gatsby-demo%2Fupload_73bf9f96f1fadaf960e12e802833a26b.png" alt="Snipcart account api key settings"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Put that key in the &lt;code&gt;.env&lt;/code&gt; file, so the file now looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GATSBY_FLOTIQ_BASE_URL="https://api.flotiq.com"
FLOTIQ_API_KEY="YOUR FLOTIQ API KEY"
SNIPCART_API_KEY="YOUR SNIPCART KEY"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and restart gatsby with &lt;code&gt;gatsby develop&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Here's what you should now see, once you put an item in the cart:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fflotiq.com%2Fdocs%2FDeep-Dives%2Fimages%2Fsnipcart-gatsby-demo%2Fupload_82b4d268d923659550753caa762f02c2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fflotiq.com%2Fdocs%2FDeep-Dives%2Fimages%2Fsnipcart-gatsby-demo%2Fupload_82b4d268d923659550753caa762f02c2.png" alt="Your cart"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you complete the checkout steps, you'll see the final screen:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fflotiq.com%2Fdocs%2FDeep-Dives%2Fimages%2Fsnipcart-gatsby-demo%2Fupload_632049a8ac4b39a5d39233d1e8414720.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fflotiq.com%2Fdocs%2FDeep-Dives%2Fimages%2Fsnipcart-gatsby-demo%2Fupload_632049a8ac4b39a5d39233d1e8414720.png" alt="Confirm order"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But if you try to place the order from your local machine - it will end up looking like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fflotiq.com%2Fdocs%2FDeep-Dives%2Fimages%2Fsnipcart-gatsby-demo%2Fupload_0b4afe702b39d742e65fe8bf652a517f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fflotiq.com%2Fdocs%2FDeep-Dives%2Fimages%2Fsnipcart-gatsby-demo%2Fupload_0b4afe702b39d742e65fe8bf652a517f.png" alt="Your order cart content"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So - if you want to test the integration entirely - it's time to put this site live!&lt;/p&gt;

&lt;h2&gt;
  
  
  Putting the website live using Heroku, 2 minutes
&lt;/h2&gt;

&lt;p&gt;To make it super simple - we've prepared a button, that immediately put your project live on the Internet. &lt;/p&gt;

&lt;p&gt;Press the button!&lt;br&gt;
  &lt;a href="https://heroku.com/deploy?template=https://github.com/flotiq/gatsby-starter-products" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.herokucdn.com%2Fdeploy%2Fbutton.svg" alt="Deploy"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you log in to Heroku (you can use a free account for that) - you have to pick a domain name for your project. We used &lt;code&gt;snipcart-flotiq&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fflotiq.com%2Fdocs%2FDeep-Dives%2Fimages%2Fsnipcart-gatsby-demo%2Fupload_f7b021894467811e477eae8c3a3190f9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fflotiq.com%2Fdocs%2FDeep-Dives%2Fimages%2Fsnipcart-gatsby-demo%2Fupload_f7b021894467811e477eae8c3a3190f9.png" alt="Name and Region settings in Heroku"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and then copy the details from your &lt;code&gt;.env&lt;/code&gt; file in the input fields &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fflotiq.com%2Fdocs%2FDeep-Dives%2Fimages%2Fsnipcart-gatsby-demo%2Fupload_e88ab376e585bfdf413351b01898f9f7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fflotiq.com%2Fdocs%2FDeep-Dives%2Fimages%2Fsnipcart-gatsby-demo%2Fupload_e88ab376e585bfdf413351b01898f9f7.png" alt="Application Configuration in Heroku"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and hit &lt;code&gt;Deploy app&lt;/code&gt;. In a minute (or two) - your app is live!&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fflotiq.com%2Fdocs%2FDeep-Dives%2Fimages%2Fsnipcart-gatsby-demo%2Fupload_0e11e37662064ad43e0fc994f4cf7401.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fflotiq.com%2Fdocs%2FDeep-Dives%2Fimages%2Fsnipcart-gatsby-demo%2Fupload_0e11e37662064ad43e0fc994f4cf7401.png" alt="Deploy App to Heroku button"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;!!! hint&lt;br&gt;
    If you'd like to host this project under your own domain name, you can use the wonderful &lt;strong&gt;and free&lt;/strong&gt; service provided by Cloudflare and &lt;a href="//../add-a-custom-domain-to-heroku-for-free/"&gt;this hack&lt;/a&gt; to add a custom domain to a free Heroku account. Normally - you would have to pay for that in Heroku, but hey - times are difficult.&lt;/p&gt;

&lt;h3&gt;
  
  
  Provide the domain name in Snipcart
&lt;/h3&gt;

&lt;p&gt;While you're waiting for the deployment to finish - go to your Snipcart profile page and configure your domain name:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fflotiq.com%2Fdocs%2FDeep-Dives%2Fimages%2Fsnipcart-gatsby-demo%2Fupload_b9ba70e10596a6c60ec648a41eb1ee4c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fflotiq.com%2Fdocs%2FDeep-Dives%2Fimages%2Fsnipcart-gatsby-demo%2Fupload_b9ba70e10596a6c60ec648a41eb1ee4c.png" alt="Provide domain name in Snipcart"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Verify the result
&lt;/h3&gt;

&lt;p&gt;Result? You've successfully placed an order!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fflotiq.com%2Fdocs%2FDeep-Dives%2Fimages%2Fsnipcart-gatsby-demo%2Fupload_5c0836387a79f4dc5e187d30fef345c9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fflotiq.com%2Fdocs%2FDeep-Dives%2Fimages%2Fsnipcart-gatsby-demo%2Fupload_5c0836387a79f4dc5e187d30fef345c9.png" alt="Order Result"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And you immediately see it in Snipcart, too.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fflotiq.com%2Fdocs%2FDeep-Dives%2Fimages%2Fsnipcart-gatsby-demo%2Fupload_1a5a590dd6e2fa214c221305e11f8b13.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fflotiq.com%2Fdocs%2FDeep-Dives%2Fimages%2Fsnipcart-gatsby-demo%2Fupload_1a5a590dd6e2fa214c221305e11f8b13.png" alt="Snipcart Order"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusions
&lt;/h2&gt;

&lt;p&gt;You've successfully built and deployed an end-to-end e-commerce platform using no code, thanks to the tools and templates provided by Flotiq, Snipcart and Gatsby. While there are still many important things to consider before you launch your e-commerce - this is a great way to minimize the cost and effort required on the technical side.&lt;/p&gt;

&lt;p&gt;As always - let us know how it worked for you!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This article was originally published as a Flotiq Deep Dive &lt;a href="https://flotiq.com/docs/Deep-Dives/node-js-ecommerce-snipcart-gatsby-demo/" rel="noopener noreferrer"&gt;Start selling online with Snipcart, Flotiq, Gatsby and Heroku&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>javascript</category>
      <category>gatsby</category>
      <category>snipcart</category>
      <category>flotiq</category>
    </item>
    <item>
      <title>Fast-track your Angular projects with a headless CMS library</title>
      <dc:creator>andrzejwp</dc:creator>
      <pubDate>Wed, 01 Apr 2020 23:06:38 +0000</pubDate>
      <link>https://forem.com/flotiq/fast-track-your-angular-projects-with-a-headless-cms-library-3a8f</link>
      <guid>https://forem.com/flotiq/fast-track-your-angular-projects-with-a-headless-cms-library-3a8f</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article first appeared as a Flotiq Deep Dive on &lt;a href="https://flotiq.com/docs/Deep-Dives/angular-headless-cms/"&gt;Angular 8 and Flotiq headless CMS&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In this article we're going to show you how you can integrate a Flotiq SDK package in your Angular project in order to get full access to your content stored in Flotiq. &lt;/p&gt;

&lt;p&gt;Using Flotiq's SDKs is the most convenient way to connect to a headless CMS system because your models are going to be exported exactly in the way you designed them. You will be able to use your IDE's built in code completion features and at the same time you will read and write content from your Flotiq Headless CMS account.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://editor.flotiq.com"&gt;Flotiq account&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;At least one your own Content Type in Flotiq (we will use Blogpost as an example)&lt;/li&gt;
&lt;li&gt;Generated Angular package that you can download from your Flotiq Dashboard page.&lt;/li&gt;
&lt;li&gt;Little knowledge of &lt;a href="https://angular.io/guide/rx-library"&gt;rxjs&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Additional information: We used Angular 8.3.25 in this example, but it shouldn't be a problem if you use the newest one (for now it's Angular 9).&lt;/p&gt;

&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;h3&gt;
  
  
  About packages
&lt;/h3&gt;

&lt;p&gt;We decided to give developers a hand by automatically generating a library package that contains all the required elements to get you started with the Flotiq API. Thanks to Flotiq's adoption of the OpenAPI schema and the &lt;a href="https://github.com/OpenAPITools/openapi-generator"&gt;Open API Generator&lt;/a&gt; it is possible to work with various frameworks or programming languages.&lt;/p&gt;

&lt;h2&gt;
  
  
  Package overview
&lt;/h2&gt;

&lt;p&gt;When we extract the downloaded package we will see some directories and typescript configuration files. We are interested mostly in only two positions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;   &lt;code&gt;/api&lt;/code&gt; directory, which contains services for every content type object definition as well as for some internal types like media and also for functionalities like graphQL and search.&lt;/li&gt;
&lt;li&gt;   &lt;code&gt;/model&lt;/code&gt; directory, which has all Content Type Definitions that exists on your Flotiq account. They are implemented as exported interfaces with the following template body:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EETigfOf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/angular_sdk_1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EETigfOf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/angular_sdk_1.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Package installation
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Download Angular package from your account dashboard &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--730yAL5t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/angular_sdk_2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--730yAL5t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/angular_sdk_2.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In package directory run:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install
npm run build
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;This will create a &lt;code&gt;dist&lt;/code&gt; directory, which will be used for installing your package in project.&lt;/p&gt;

&lt;p&gt;Go to generated &lt;code&gt;dist&lt;/code&gt; directory and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm link
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;In your application directory:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install
npm install &amp;lt;path_to_your_package&amp;gt;/dist
npm link flotiq
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;And that's all. Basic setup is done!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IMPORTANT!&lt;/strong&gt; There are known issues with &lt;code&gt;npm link&lt;/code&gt; on Windows OS, but they only concern installed packages via path, not registry.&lt;/p&gt;

&lt;h2&gt;
  
  
  Package usage
&lt;/h2&gt;

&lt;p&gt;In your project &lt;code&gt;app.module.ts&lt;/code&gt; file import following classes:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qypZXwn5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/angular_sdk_3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qypZXwn5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/angular_sdk_3.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In &lt;code&gt;environments&lt;/code&gt; directory are two &lt;code&gt;env&lt;/code&gt; files. Add your &lt;code&gt;API_KEY&lt;/code&gt; as a key-value pair in your &lt;code&gt;environtment.ts&lt;/code&gt; file, so it should look like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--baQaXV95--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/angular_sdk_4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--baQaXV95--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/angular_sdk_4.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you plan to deploy your application, remember to fill out &lt;code&gt;environment.prod.ts&lt;/code&gt; file too!&lt;/p&gt;

&lt;p&gt;Next, you have to export a function that will hold all needed configuration to work with Flotiq. You can include it in your &lt;code&gt;app.module.ts&lt;/code&gt; file below the imports. As a minimum only your &lt;code&gt;API_KEY&lt;/code&gt; is required:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zURHiELM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/angular_sdk_5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zURHiELM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/angular_sdk_5.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the final step add Flotiq &lt;code&gt;ApiModule&lt;/code&gt; into providers array in your application &lt;code&gt;AppModule&lt;/code&gt;. You must call &lt;code&gt;fotRoot()&lt;/code&gt; function on &lt;code&gt;ApiModule&lt;/code&gt; providing required configuration that you set step before:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ApiModule.forRoot(apiConfigFactory);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;It's important to also import &lt;code&gt;HttpClientModule&lt;/code&gt; from &lt;code&gt;@angular/common/http&lt;/code&gt;. Otherwise you won't be able to make API calls to Flotiq.&lt;/p&gt;

&lt;p&gt;Your &lt;code&gt;@NgModule&lt;/code&gt; decorator should look like that after whole setup process:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6TFlF7Ps--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/angular_sdk_6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6TFlF7Ps--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/angular_sdk_6.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Example Service (Blogpost)
&lt;/h2&gt;

&lt;p&gt;Create a simple service file &lt;code&gt;blogpost.service.ts&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Export a class and provide an &lt;code&gt;@Injectable()&lt;/code&gt; decorator, so you can inject other services into this service. Remember to import it from &lt;code&gt;@angular/core&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To make this service application-wide pass an parameter object &lt;code&gt;{providedIn: 'root'}&lt;/code&gt; to &lt;code&gt;Injectable&lt;/code&gt; decorator (it's a shortcut, you can also import and add your service to &lt;code&gt;providers&lt;/code&gt; array in &lt;code&gt;app.module.ts&lt;/code&gt; file)&lt;/p&gt;

&lt;p&gt;Your file should like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ThgtSvmy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/angular_sdk_7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ThgtSvmy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/angular_sdk_7.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, import your Blogpost model and ContentService provided by installed package.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { ContentBlogpostService, Blogpost } from 'flotiq';
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Next, create a constructor and add your ContentService&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;constructor(private blogpostApiService: ContentBlogpostService) {}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;code&gt;blogpostApiService&lt;/code&gt; is just example variable name, you can change it if you like.&lt;/p&gt;

&lt;p&gt;Add a simple method (for example &lt;code&gt;addBlogpost&lt;/code&gt;) which will take any value as an argument, but it's preferred that it has &lt;code&gt;Blogpost&lt;/code&gt; model type.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;addBlogpost(blogpost: Blogpost) {}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;In the body return a result of ContentService function, so you can &lt;code&gt;subscribe&lt;/code&gt; to it later and handle response and errors.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;addBlogpost(blogpost: Blogpost) {
    return this.blogpostApiService.createblogpost(post);
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;It's important here to pass an object of type &lt;code&gt;Blogpost&lt;/code&gt; here, because in other cases types will mismatch and Typescript will throw an error.&lt;/p&gt;

&lt;p&gt;That's all! Implement the rest of methods and use your custom service in other parts of your application.&lt;/p&gt;

&lt;p&gt;Look into your generated package to find what models and ContentServices where created for you and start developing!&lt;/p&gt;

&lt;p&gt;Here is a small animation that shows you an example project based on generated package(To-do-list content type definition used) and &lt;a href="https://tailwindcss.com/"&gt;Tailwind CSS&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oMees0WV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/angular_sdk_8.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oMees0WV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/angular_sdk_8.gif" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Important information
&lt;/h2&gt;

&lt;p&gt;When you start your application use &lt;code&gt;npm start&lt;/code&gt; instead of &lt;code&gt;ng serve&lt;/code&gt;. This will avoid confusion and incompatibility with your global installed angular-cli and it's dependencies with those specified in &lt;code&gt;package.json&lt;/code&gt; file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Generated package based on your OpenApiSchema is a powerful tool, that can speed up your development process a lot. You can install it in your project and don't worry anymore about writing API calls&lt;/p&gt;

&lt;p&gt;Helpful links:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Learn how to get your own OpenApiSchema &lt;a href="https://flotiq.com/docs/API/open-api-schema/"&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Didn't find a package in a langauage or framework you love? No problem check this &lt;a href="https://flotiq.com/docs/API/generate-package/"&gt;link&lt;/a&gt; to learn how to generate your own!&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>angular</category>
      <category>flotiq</category>
      <category>javascript</category>
    </item>
    <item>
      <title>JAMstack full-text search with Flotiq search API</title>
      <dc:creator>andrzejwp</dc:creator>
      <pubDate>Wed, 25 Mar 2020 16:33:19 +0000</pubDate>
      <link>https://forem.com/flotiq/headless-cms-search-api-in-flotiq-1he2</link>
      <guid>https://forem.com/flotiq/headless-cms-search-api-in-flotiq-1he2</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This post was originally published as a &lt;a href="https://flotiq.com/docs/Deep-Dives/search-api-deepdive/"&gt;Flotiq Search API deep dive&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;Flotiq provides a powerful full-text search capabilities by partially exposing the ElasticSearch (ES) engine inside Flotiq's search API. In order to provide the best Developer Experience we're not exposing ES directly, but wrapping it and stripping to leave only the essentials.&lt;/p&gt;

&lt;p&gt;We still pass queries to ES, but to provide compatibility with the rest of the API we abstracted it one level higher into a wrapper that can allow us to do all the magic and still maintain Flotiq's natural simplicity.&lt;/p&gt;

&lt;p&gt;In this article we will focus on search operations like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Global Search (all content types)&lt;/li&gt;
&lt;li&gt;Limited Search (particular content type)&lt;/li&gt;
&lt;li&gt;Limited Search using filters (objects with specific attributes)&lt;/li&gt;
&lt;li&gt;Results aggregation (a.k.a. faceted search)&lt;/li&gt;
&lt;li&gt;Results ranking / scoring (using ES field boosting).&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Remember to check our &lt;a href="https://flotiq.com/docs/API/search/"&gt;Flotiq Search API Documentation&lt;/a&gt; for more details and examples.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For this article's purpose we will use Postman to provide request examples and responses.&lt;/p&gt;

&lt;p&gt;On the screenshots below you'll see values like &lt;code&gt;api_url&lt;/code&gt; and &lt;code&gt;content_type&lt;/code&gt;. These are our own Postman Global Variables so remember to change them to your own values if you want to test Search Feature.&lt;/p&gt;

&lt;p&gt;Let's dive deep into it!&lt;/p&gt;

&lt;h2&gt;
  
  
  Global search
&lt;/h2&gt;

&lt;p&gt;By default, you would probably want to find everything related to a entered query. This is what most of our competitors offer as well, so no surprises here.&lt;/p&gt;

&lt;p&gt;To achieve that you have to pass the query parameter &lt;code&gt;q&lt;/code&gt;. The result set will contain all entries in your Flotiq instance that match the query content.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2dsT1YV---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/searchapi/global.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2dsT1YV---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/searchapi/global.png" alt="Flotiq headless CMS global search"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The response object also contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;total_count&lt;/code&gt; - number of found entries,&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;count&lt;/code&gt; - number of entries on current page,&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;total_pages&lt;/code&gt; - number of pages,&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;current_page&lt;/code&gt; - ehm, current page,&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;summary&lt;/code&gt; - object containing aggregates / buckets,&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;data&lt;/code&gt; - the array containing matched entries.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Limited search
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;/api/v1/search&lt;/code&gt; endpoint also supports parameters that can narrow the search or limit display count per page:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;limit&lt;/code&gt; - basic parameter for limiting per page results&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;content_type[]&lt;/code&gt; - narrow search area to specific Content Type Definition. Don't forget you have to add square brackets &lt;code&gt;[]&lt;/code&gt; to a parameter name here. We have provided an example below:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fields[]&lt;/code&gt; - restrict to search only in specific field names ex. &lt;code&gt;name, title&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--W8CV-4ju--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/searchapi/contenttype.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--W8CV-4ju--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/searchapi/contenttype.png" alt="Flotiq CMS search limited to a specific content type"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So if you'd like to narrow down the search to a specific content type, e.g. &lt;code&gt;blogpost&lt;/code&gt; - it's as simple as adding &lt;code&gt;content_type[]=blogpost&lt;/code&gt; to your search query.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limited search using filters
&lt;/h2&gt;

&lt;p&gt;We can also add a filter to our query to search for specific values in provided fields. &lt;/p&gt;

&lt;p&gt;Remember, it must have the following syntax: &lt;code&gt;filters[propertyName]=propertyValue&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;If you want to have more filters then add more parameters using syntax above by separating them with &lt;code&gt;&amp;amp;&lt;/code&gt; like this &lt;code&gt;filters[status]=draft&amp;amp;filters[type]=post&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YsZufZcA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/searchapi/filters.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YsZufZcA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/searchapi/filters.gif" alt="Flotiq headless CMS filtering in search results"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Results aggregation
&lt;/h2&gt;

&lt;p&gt;This is, by far, one of the coolest features described in this article. Using this technique you'll be able to immediately build faceted search results that look like this&lt;/p&gt;

&lt;p&gt;Simply add &lt;code&gt;aggregate_by[]=value&lt;/code&gt; parameter to populate the &lt;code&gt;summary&lt;/code&gt; object in your response - it will now contain the numbers of unique occurences per property value that you provided earlier.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XjLiI3EF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/searchapi/aggregate.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XjLiI3EF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/searchapi/aggregate.gif" alt="Flotiq aggregated search results - perfect for faceting"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The part of response that is interesting us in this case looks like in image below:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_-HS7HQt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/searchapi/summaryres.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_-HS7HQt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/searchapi/summaryres.png" alt="Full view of the search results aggregation structure"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Increase search score by using ElasticSearch field boosting
&lt;/h2&gt;

&lt;p&gt;And finally, probably the most sought after and extremely powerful features that will allow you to define how your search results should be ranked. With this technique you can decide what is more important in your search query and display desired result in an order that matches your defined importance.&lt;/p&gt;

&lt;p&gt;Achieving it is - again - extremely simple. You only need to add fields weights using the &lt;code&gt;fields&lt;/code&gt; parameter like &lt;code&gt;^3&lt;/code&gt; or &lt;code&gt;^5&lt;/code&gt; or whatever multiplier you want to set.&lt;/p&gt;

&lt;p&gt;For example if you define your field boosting like this:&lt;br&gt;
&lt;code&gt;fields[]=category^2&amp;amp;fields[]=title^5&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;you basically say that entries matching your query in the &lt;code&gt;title&lt;/code&gt; field will be considered more important than those, where the match is in &lt;code&gt;category&lt;/code&gt;. The order of the results returned by the search endpoint will reflect that and you will also find the score assigned by ES in the &lt;code&gt;score&lt;/code&gt; property for each entry.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Wc_t4tf0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/searchapi/boosting.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Wc_t4tf0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://flotiq.com/docs/Deep-Dives/images/searchapi/boosting.gif" alt="Boosting search results in Flotiq"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The request above produces a response like the following:&lt;/p&gt;

&lt;p&gt;Search score for text found in title&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;5.0425596&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Search score for text found in content&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;2.0425596&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Flotiq is built to be extremely easy to use, yet very powerful. Our search feature is trivial to use, but at the same time offers features that make us stand out from out competitors (see &lt;a href="https://flotiq.com/blog/headless-cms-search-comparison"&gt;Headless CMS Full-text search comparison&lt;/a&gt; article). Using Flotiq's search you can now build a complex search engine into your apps without the need to worry about integrating with external solutions.&lt;/p&gt;

</description>
      <category>jamstack</category>
      <category>headlesscms</category>
      <category>elasticsearch</category>
      <category>flotiq</category>
    </item>
    <item>
      <title>Headless CMS full-text search comparison</title>
      <dc:creator>andrzejwp</dc:creator>
      <pubDate>Wed, 11 Mar 2020 12:41:32 +0000</pubDate>
      <link>https://forem.com/flotiq/headless-cms-full-text-search-comparison-9hc</link>
      <guid>https://forem.com/flotiq/headless-cms-full-text-search-comparison-9hc</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article originally appeared as a blog post on &lt;a href="https://flotiq.com/blog/headless-cms-search-comparison"&gt;Flotiq.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Most of the CMS systems on the market offer some level of support for full-text search, some of them are quite sophisticated, some are actually pretty poor. This article compares the search capabilities of Contentful, Prismic, Flotiq, Gentics Mesh, Cloud CMS and Butter CMS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prismic
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://prismic.io"&gt;Prismic&lt;/a&gt; offers a wide variety of search capabilities. It doesn't matter if you want to search within a single data type or in the entire database - you can use the same mechanisms and APIs. &lt;/p&gt;

&lt;h3&gt;
  
  
  Advantages of Prismic full-text search
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Prismic's query predicates are a powerful, and easy to understand, concept and are supported by &lt;a href="https://prismic.io/docs/rest-api/query-the-api/fulltext-search"&gt;comprehensive documentation&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_P4aDTuK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/s6yj5x6a0chc8ybgdrgn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_P4aDTuK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/s6yj5x6a0chc8ybgdrgn.png" alt="Prismic search API"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prismic's docs also provide code snippets for many popular languages, which is also a plus.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Disadvantages of Prismic full-text search
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;It doesn't seem that Prismic provides any sort of scoring within the search results and the response is simply based on "match" or "no-match".&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gAxrLTBo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/caxgc3okskw9wwcdu09c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gAxrLTBo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/caxgc3okskw9wwcdu09c.png" alt="Prismic search results - no scoring provided"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Contentful
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://contentful.com"&gt;Contentful&lt;/a&gt; also supports full-text searches through their API, but it seems very basic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Advantages of Contentful full-text search
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The search API is easy to use and understand.&lt;/li&gt;
&lt;li&gt;Their API provides support for geo-based queries, useful for searching objects within a distance from a given location.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Disadvantages of Contentful full-text search
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The search API is minimal and Contentful admits that in their documentation:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0XEehr3T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1spnnhxcjdmsvmyuh8ec.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0XEehr3T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1spnnhxcjdmsvmyuh8ec.png" alt="Contentful search API"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;There are no aggregations or result scoring support.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Flotiq
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://flotiq.com"&gt;Flotiq&lt;/a&gt; (yes, that's us ;) ) provides extensive full-text search capabilities by wrapping Elasticsearch in Flotiq APIs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Advantages of Flotiq full-text search
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Flotiq's full-text search is based on queries passed to Elasticsearch, which is a very powerful full-text search engine.&lt;/li&gt;
&lt;li&gt;Flotiq wraps the ES API in order to provide better compatibility with the remaining parts of the API.&lt;/li&gt;
&lt;li&gt;Search results are scored.&lt;/li&gt;
&lt;li&gt;You can score each field individually, very convenient if you'd like to promote results where the match appears in a specific field, e.g. in the blog post title.&lt;/li&gt;
&lt;li&gt;You can aggregate results by any of the fields, which makes it super easy you build faceted search results pages.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Disadvantages of Flotiq full-text search
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://flotiq.com/docs/"&gt;Flotiq's documentation&lt;/a&gt; is still evolving.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Gentics Mesh &amp;amp; Cloud CMS
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://getmesh.io"&gt;Gentics Mesh&lt;/a&gt; and &lt;a href="https://www.cloudcms.com"&gt;Cloud CMS&lt;/a&gt; both provide direct access to ElasticSearch query API and so - offer a very powerful search mechanism.&lt;/p&gt;

&lt;h3&gt;
  
  
  Advantages of Gentics' and Cloud CMS' full-text search
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Powerful search engine, based on ElasticSearch&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Disadvantages of Gentics' and Cloud CMS' full-text search
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You will need to educate yourself on ElasticSearch as Gentics seems to provide raw access to ES, instead of neatly wrapping its API into a set of methods that are familiar to their own users.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Contentstack
&lt;/h2&gt;

&lt;p&gt;Contentstack provides a limited search API and recommends integrating with other services to provide full-text and ranked search results:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8i5C7Z7F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://minio.dev.cdwv.pl:80/hackmd/uploads/upload_48d1f9fc10fba29de49916c794f6f171.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8i5C7Z7F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://minio.dev.cdwv.pl:80/hackmd/uploads/upload_48d1f9fc10fba29de49916c794f6f171.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Advantages of Contentstack full-text search
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;They openly admit that you should use a dedicated search solution.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Disadvantages of Contentstack full-text search
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Very limited.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Butter CMS
&lt;/h2&gt;

&lt;p&gt;Butter CMS doesn't seem to care about search that much. They seem to only provide a search endpoint for their blog engine, and even that is very limited.&lt;/p&gt;

&lt;h3&gt;
  
  
  Advantages of Butter CMS full-text search
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Can't think of anything, sorry.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Disadvantages of Butter CMS full-text search
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Minimal support, only in the blog engine part.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ie89_WoG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/coaj1siuekkgfd3nqgdo.png" alt="Contentstack asks to use other services for search"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Although most headless CMS solutions offer some kind of search - it's often constrained. &lt;/p&gt;

&lt;p&gt;Having a powerful search engine, which is wrapped in a set of convenient APIs, seems a must in order to provide the end-users with search results that can be easily navigated, sorted and faceted. Yet, the most popular systems, like Contentful or ButterCMS, seem to ignore the problem and significantly limit the support for search. &lt;/p&gt;

&lt;p&gt;The contending systems, like Cloud CMS, Flotiq or Gentics Mesh - offer better support for search by providing access to ElasticSearch, either directly (Gentics, Cloud) or by wrapping it into more straightforward and more familiar APIs (Flotiq).&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Fun project - use voice to push content to Flotiq headless CMS</title>
      <dc:creator>andrzejwp</dc:creator>
      <pubDate>Fri, 06 Mar 2020 16:39:53 +0000</pubDate>
      <link>https://forem.com/flotiq/fun-project-use-voice-to-push-content-to-flotiq-headless-cms-4ddp</link>
      <guid>https://forem.com/flotiq/fun-project-use-voice-to-push-content-to-flotiq-headless-cms-4ddp</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article was originally published on &lt;a href="https://flotiq.com/blog/voice-cms-google-assistant"&gt;Flotiq blog&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Teaser Video
&lt;/h2&gt;

&lt;p&gt;Check video below that covers everything in this article:&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/FEiSIunbjHw"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Voice assistants
&lt;/h2&gt;

&lt;p&gt;So far, there are two main voice assistants: Alexa and Google Assistant. They were invented to simplify our everyday tasks like answering simple questions, checking weather and so on. With technology progress the usage purpose of voice assistants is also expanding. With every day passing by, presence of voice assistants at work is more and more visible. You can use these to create meetings, to-do list, reminders, control smart home, take notes and so on. &lt;/p&gt;

&lt;p&gt;At the beginning of 2020, Google Assistant appeared on the Zapier platform in Beta stage, so we decided to take this oportunity and create a flow that will allow our users to literally talk to Flotiq. That's what we call effortless content!&lt;/p&gt;

&lt;p&gt;In this post we will cover only basis of this topic. At the end you can find a video where we show step-by-step how to make such integration to be able to insert data to Flotiq by talking to Google Assistant. Let's dive deep into it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;For this integration to work you will have to meet following conditions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Have a Google Account&lt;/li&gt;
&lt;li&gt;Have a Zapier Account&lt;/li&gt;
&lt;li&gt;Have a Flotiq Account&lt;/li&gt;
&lt;li&gt;Created at least one own Content Type Definition in Flotiq&lt;/li&gt;
&lt;li&gt;Have Google Assistant installed on your phone.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Enabling Zapier in Google Assistant
&lt;/h2&gt;

&lt;p&gt;By default you can’t speak to Zapier in Google Assistant. You have to allow it by yourself. Go to Google Assistant Page, then hover over “What it can do” and click “Explore all actions”.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uDYU5wi2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/2oc86okyf0rg11kipb2m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uDYU5wi2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/2oc86okyf0rg11kipb2m.png" alt="Explore actions in Google Assistant"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the search box type "Zapier" and then click "Link" in the Zapier integration description page. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_GtWmO0d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/lxah67u0yhzkb2oa0hyo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_GtWmO0d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/lxah67u0yhzkb2oa0hyo.png" alt="Link Zapier to Google Assistant"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can validate connection by going to "Authorized Apps" section in your Zapier account settings page. &lt;/p&gt;

&lt;p&gt;For questions or doubts be sure to check &lt;a href="https://zapier.com/apps/google-assistant/help"&gt;Google Assistant FAQ in Zapier&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Make a Zap / Use a Zap Template
&lt;/h2&gt;

&lt;p&gt;To build the integration itself - follow these steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click "Make a Zap" on your Zapier dashboard page,&lt;/li&gt;
&lt;li&gt;For the triggering application select Google Assistant,&lt;/li&gt;
&lt;li&gt;Enter a running phrase (word, sentence etc. - you will use it later in Google Assistant),&lt;/li&gt;
&lt;li&gt;Enter prompt questions (&lt;strong&gt;recommended&lt;/strong&gt;) that match your Content Type Definition fields (see video below for example),&lt;/li&gt;
&lt;li&gt;Click Test&amp;amp;Review or Continue to let Zapier create sample object that will be used in Action step,&lt;/li&gt;
&lt;li&gt;Select Flotiq as an application in Action step (it will select our only action, New Content Object,  automatically),&lt;/li&gt;
&lt;li&gt;Log in with your &lt;strong&gt;Flotiq API KEY (don't use the read only one!)&lt;/strong&gt; ,&lt;/li&gt;
&lt;li&gt;Select proper Content Type Definition from dropdown,&lt;/li&gt;
&lt;li&gt;Match field values with response fields from trigger step,&lt;/li&gt;
&lt;li&gt;You can avoid skip testing here, to prevent sending dummy data,&lt;/li&gt;
&lt;li&gt;Click "Turn Zap On" and have fun!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Remember to check the video on the bottom of the page that provides a live example of everything mentioned here!&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Voice assistans making a step into our worklife can be extremely helpful and can speed up solving various problems. Google Assistant presence in workflow automation systems is only the beginning and we can't wait to see what will grow of it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Read more about our Zapier integration on &lt;a href="https://flotiq.com/blog/flotiq-zapier-integration"&gt;Flotiq blog&lt;/a&gt; and in the &lt;a href="https://flotiq.com/docs/API/zapier/"&gt;Flotiq docs&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>voice</category>
      <category>headless</category>
      <category>flotiq</category>
    </item>
    <item>
      <title>Headless CMS Contact forms with Serverless and Zapier</title>
      <dc:creator>andrzejwp</dc:creator>
      <pubDate>Tue, 03 Mar 2020 15:11:17 +0000</pubDate>
      <link>https://forem.com/flotiq/headless-cms-contact-forms-with-serverless-and-zapier-37a</link>
      <guid>https://forem.com/flotiq/headless-cms-contact-forms-with-serverless-and-zapier-37a</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article was originally posted as a Flotiq Deep Dive, &lt;a href="https://flotiq.com/docs/Deep-Dives/Headless-CMS-Contact-Forms/"&gt;Contact form using Flotiq&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;You can easily use headless CMS systems like Flotiq to store data from contact forms or other places where you collect information from your users. With Flotiq it's super easy to create Content Types, push new data to the system and integrate it with other systems through Zapier. Follow along for a complete, working example of how this can be done.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you'll learn in this deep dive
&lt;/h2&gt;

&lt;p&gt;Create a contact form with notifications, without backend code, in 10 minutes.&lt;/p&gt;

&lt;p&gt;Steps: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a model in Flotiq&lt;/li&gt;
&lt;li&gt;Create a simple form on your website&lt;/li&gt;
&lt;li&gt;Zapier - sending notifications to email&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Configuring Flotiq
&lt;/h2&gt;

&lt;p&gt;Create a simple Content Type Definition "Contact Form".&lt;/p&gt;

&lt;p&gt;We need a type with two attributes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field name&lt;/th&gt;
&lt;th&gt;Field type&lt;/th&gt;
&lt;th&gt;Additional attributes&lt;/th&gt;
&lt;th&gt;Comments&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;email&lt;/td&gt;
&lt;td&gt;email&lt;/td&gt;
&lt;td&gt;Not required&lt;/td&gt;
&lt;td&gt;Optional e-mail address of your guest&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;message&lt;/td&gt;
&lt;td&gt;textarea&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;The message&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Here's how you would create that Content Type Definition using the &lt;a href="https://editor.flotiq.com/register.html"&gt;Flotiq editor&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3tMZeEl9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/25eldv980zhvwmab9hm4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3tMZeEl9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/25eldv980zhvwmab9hm4.png" alt="Configuring a content type for contact forms in Flotiq"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you save that Content Type - you can see the endpoints that were generated to support it in your API documentation (click "API doc" link in the menu):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--udlI7Wfl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/nccbii0jlox82mdsg74j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--udlI7Wfl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/nccbii0jlox82mdsg74j.png" alt="Contact Form API docs"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now you can manage contact form entries via Flotiq. Let's now create a contact form on your site to post data directly to the FLotiq API.&lt;/p&gt;

&lt;h2&gt;
  
  
  HTML Form implementation
&lt;/h2&gt;

&lt;p&gt;We will use a simple HTML form. The code below code is a complete, working solution. You only need to replace the "FLOTIQ_TOKEN" variable. Here, we also use classes from the Bootstrap4 CSS framework, but it's optional.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- form --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"container"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"contact_form"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"form-group"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Email address&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"form-control"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"form-group"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"message"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Message&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;textarea&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"form-control"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"message"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"message"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"btn btn-primary"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Submit&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;We need also a few lines of javascript to pass data from our form to the Flotiq API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;
&lt;span class="c"&gt;&amp;lt;!-- we use jQuery to handle form data --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://code.jquery.com/jquery-3.4.1.min.js"&lt;/span&gt;
        &lt;span class="na"&gt;integrity=&lt;/span&gt;&lt;span class="s"&gt;"sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo="&lt;/span&gt;
        &lt;span class="na"&gt;crossorigin=&lt;/span&gt;&lt;span class="s"&gt;"anonymous"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;

    &lt;span class="c1"&gt;// Handle form submit - push to Flotiq instead of default HTML Form action.&lt;/span&gt;
    &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#contact_form&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;submit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ev&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="nx"&gt;ev&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;preventDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="c1"&gt;// Prepare form data and generate id for Flotiq Content Object&lt;/span&gt;
        &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;formData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;_&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;random&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[name=email]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;val&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[name=message]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;val&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// Caution! Other users can see your token, and can use it&lt;/span&gt;
        &lt;span class="c1"&gt;// not only for creating contact messages, but also for listing or&lt;/span&gt;
        &lt;span class="c1"&gt;// deleting. You can hide this token using Cloudflare&lt;/span&gt;
        &lt;span class="c1"&gt;// (see: https://flotiq.com/docs/Deep-Dives/securing-write-api-access/) or custom backend&lt;/span&gt;
        &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;FLOTIQ_TOKEN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;_YOUR_FLOTIQ_READ_WRITE_TOKEN_&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ajax&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.flotiq.com/api/v1/content/contact_form?auth_token=&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;FLOTIQ_TOKEN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;formData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;dataType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#contact_form&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;h5 class='text-success'&amp;gt;Thank you for getting in touch!&amp;lt;/h5&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;errorResponse&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;errorResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="nx"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Please fill all required fields&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="nx"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Server error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;With the recent updates in Flotiq it's super simple to create a dedicated, scoped API key that will narrow down the access to a specific Content Type and a specific action. &lt;br&gt;
For example - if you'd like to use the key for storing contact form entries, although the key is hidden in Cloudflare, we would recommend to set it up as follows: &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--U9frgQsr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/wfk5wnx2v3ddbdd0s905.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--U9frgQsr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/wfk5wnx2v3ddbdd0s905.png" alt="Flotiq Scoped API key for contact form submissions"&gt;&lt;/a&gt;&lt;br&gt;
Read more about &lt;a href="https://flotiq.com/docs/Deep-Dives/securing-write-api-access/"&gt;How to secure a JAMstack app with Cloudflare workers&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now you can test if this form is sending data to your Contact Form type in Flotiq app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hooking-up Zapier e-mail notifications
&lt;/h2&gt;

&lt;p&gt;If you want to receive emails when the form is submitted you can use Flotiq and Zapier integration. You can also adapt this step to push your contacts to other sources, e.g. CRM systems, Mailchimp, Google Sheets, whatever you like. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Log in or register in &lt;a href="https://zapier.com"&gt;Zapier&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a zap - select connection between Flotiq and Gmail (you can use other integrations if you want). It should look like:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--s-EEvGk7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/oyyz636fxg2kz9lv9b6b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--s-EEvGk7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/oyyz636fxg2kz9lv9b6b.png" alt="Zapier configuration for Flotiq-based Contact Forms"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Next you need to pass your Flotiq API Key in Choose Account section (it should be your global read-only API KEY), &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In Customize content object section select "contact_form".&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In the "Do this..." field you need to configure email address and content. See our example config:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rlJ9fcFo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/xvfzn9l8onllj1qu94ln.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rlJ9fcFo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/xvfzn9l8onllj1qu94ln.png" alt="Zapier configuration for Flotiq-based Contact Forms"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's all. You will now get an email notification about every message left through your Contact Form.&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Read more about Flotiq &amp;amp; Zapier integration &lt;a href="//../../API/zapier/"&gt;here&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Set up your own integration with one of 1000+ systems &lt;a href="https://zapier.com/apps/flotiq/integrations"&gt;here&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;It's super easy to create forms without any backend code.&lt;/li&gt;
&lt;li&gt;Flotiq's Integration with Zapier allows you to use your data with many applications, check more ways to &lt;a href="https://zapier.com/apps/flotiq/integrations"&gt;integrate with Flotiq&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Contact form data will be available in your Flotiq account.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>serverless</category>
      <category>flotiq</category>
      <category>headless</category>
    </item>
  </channel>
</rss>
