Can I Build a Micro-SaaS Platform to Collect User Feedback?

Can I Build a Micro-SaaS Platform to Collect User Feedback?

From Frontend to Backend: The Architecture of User Feedback Popups Explained

Introduction

Hi Folks, In this article, we'll take a deep dive into the architecture of user feedback popups, exploring the frontend and backend components that work together to make them tick. We'll examine the technologies and techniques used to create these popups, from the client-side rendering of the popup itself to the server-side processing of user input.

Back story

As a curious engineer, I've always been on the lookout for innovative micro SaaS ideas to kickstart my side hustle. One day, while browsing online, I stumbled upon a fascinating platform that caught my attention. It allowed website owners to create a feedback form, integrate it with their site using a simple JavaScript script, and receive user feedback via email. The elegance of this solution sparked my curiosity - what magic happens behind the scenes to make this seamless experience possible?

Intrigued, I began to dig deeper, researching the high-level architecture of such platforms. How do they enable website owners to create customizable feedback forms? How do these forms communicate with the website, and what triggers the popup to appear? What about the back-end infrastructure that processes and forwards the user feedback to the website owner?

In the following sections, I'll take you through the high-level architecture of a user feedback platform, explaining how the popup communicates with the website and the magic that happens behind the scenes to deliver a seamless user experience.

💡
This article aims to provide a comprehensive overview of the platforms and techniques that power these platforms. We not focusing on scalability & performance.

High-level design

Backend Service and User Interface

To build a user feedback platform, we need a robust backend service to store and manage feedback forms and responses. A simple database design can include two tables: Users and Forms. The Users table stores information about the website owners who create accounts on our platform, while the Forms table stores the feedback forms and responses.

Onboarding and Creating Feedback Forms

The user interface is straightforward. When a website owner signs up for our platform, we onboard them and ask them to create a question for their feedback form. We also provide a simple UI for them to customize the feedback form's appearance and settings.

Loading the Feedback Form on the User's Website

Once the feedback form is created, we need to figure out a way to load it on the user's website. Here's where things get interesting. Our approach is to create a user-specific endpoint or route that loads the user's feedback form in HTML. This endpoint will serve as a bridge between our platform and the user's website.

Loading the Feedback Form using a Script

To load the feedback form on the user's website, we provide a script file that loads the form in an iframe and attaches it to the website's body. The form is already equipped with an API that submits the user's response to our server. This way, the feedback form is seamlessly integrated into the user's website, and responses are sent to our server for processing.

This approach allows us to decouple the feedback form from the user's website, making it easy to manage and update the form without affecting the website's codebase.

Simple Implementation

As a backend engineer, I've had my fair share of experience building robust backend services for user onboarding and storing forms and responses. However, things get interesting when it comes to loading a popup on a client's website. In this article, I'll dive deep into the magic of making this happen.

The Challenge

My goal was to load a feedback popup on a client's website, which seemed like a daunting task at first. I had an HTML file that loaded the form on an HTML page, but I needed to inject that into the client's website. To achieve this, I came up with a solution that involved hosting a script file that injects an iframe into the user's website. The user needs to pass a token to initiate the feedback form with the token.

The Solution

I used Vue.js for the front end and Laravel 10 for the back end. I created an HTML file that loads the form on an HTML page and then injected it into the client's website using an iframe. Here's the code snippet that creates the iframe. I have hosted it on js deliver.

let iframe = document.createElement("iframe");

function prepareFrame() {
  let container = document.getElementById("popup");
  iframe.setAttribute("src", "http://localhost:5173/");
  iframe.setAttribute("allowfullscreen", true);
  iframe.setAttribute("allow", "fullscreen");
  iframe.setAttribute("allowtransparency", true);
  iframe.setAttribute("scrolling", "no");
  iframe.style.width = "420px";
  iframe.style.height = "580px";
  container.appendChild(iframe);
}

function toggleFrame() {
  let action = message;
  iframe.contentWindow.postMessage({ action }, "*");
}
window.addEventListener("message", (event) => {
  if (event.data.type == "message") {
    alert(event.data.message);
  }
});
prepareFrame();

When the script loads. I can load the feedback into the iframe. The above example is super simplified to keep the code simple. This enabled me to load the popup on the user's site.

Making the Form Interactive

The next challenge was to make the form interactive. I wanted to show the popup only when the user clicks the feedback button and closes it when they press the close button. After some trial and error, I discovered the magic of JavaScript's Window.parent.postMessage. This allowed me to pass messages to the iframe and communicate with the parent window.

Working Example

This code sets up a reference to the isOpen variable, which tracks the state of the popup. It also defines a toggle function that toggles the isOpen state. The sendMessageToSite function sends a message to the parent window using Window.parent.postMessage. The onMounted hook sets up an event listener for messages from the parent window, which updates the isOpen state accordingly.

Conclusion

In conclusion, loading a feedback popup on a client's website requires some creative problem-solving and a good understanding of JavaScript's Window.parent.postMessage API. By hosting the script file on a CDN and using the postMessage API, I was able to load the popup on the user's site and make it interactive. I hope this article has provided valuable insights into the magic of loading a feedback popup on a client's website.

Did you find this article valuable?

Support Saravana sai blog by becoming a sponsor. Any amount is appreciated!