5 ms·
Ask HN: What do devs use for quickly setting up a feedback form?
I'm a software engineer who keeps building little web apps / MVP landing pages in the hopes that they make me a pretty penny (they never do). I like adding basic forms to the websites; usually to collect feedback, sometimes with an optional email address so I can get back to people.
I've tried 3 options so far:
- fully-fledged forms embedded onto the website (eg Google Forms) - quickest to set up but absolutely hideous and bad for SEO
- 3rd-party form backends - I'm constantly worried about hitting the free plan limit; and some services have some deliverability/uptime issues
- writing up my own server (I use Go) and hooking it up to a 3rd-party email service; cheapest but more worried about deliverability/uptime
Right now I'm gravitating towards the 2nd option, but am curious how other developers approach this problem.
- solardev 2y agoInstead of embedding, just add a "Feedback" link somewhere that goes to a different page, like Google Forms or Airtable. Or you can put a little feedback icon in the corner that opens a small popup to ask for quick feedback (or be dismissed). There's also a bunch of SAAS stuff in this space, like UserVoice or Hotjar or Aha. I think it's important to distinguish the frontend from the back here. The form shouldn't be intrusive, but that need not be related to the deliverability issue. Whatever service you choose, there's usually a way to hook up the form to the backend reliably (via API and real-time confirmations). If you really want to DIY this, you can probably put the responses into a cloud serverless KV store for very cheap or free, instead of having an always-on server. But that doesn't seem any better than just using Google Forms or Airtable to collect those responses.
- mmarian 2y ago> add a "Feedback" link somewhere that goes to a different page, like Google Forms or Airtable I think that would cause too much friction for something that should be a 5-seconds-or-less kind of experience. > Or you can put a little feedback icon in the corner that opens a small popup to ask for quick feedback (or be dismissed). Good idea! So far I've been adding a section at the end of my website that's a couple of scrolls in length. But I'm conscious people might not bother scrolling to the end. > There's also a bunch of SAAS stuff in this space, like UserVoice or Hotjar or Aha. I don't really want a complex setup, with user heatmaps and such; these are projects that have very limited features and likely to shut down in a few months. > you can probably put the responses into a cloud serverless KV store for very cheap or free, instead of having an always-on server. How would you set up the schema to store the data, while allowing for migrations that will probably happen quite often? One setup I've hosted involves a Go/Gin server with embedded SQLite on Hetzner using Caprover, which I felt worked quite nice. It's costing me about $5/month, which I need to spend for another server I need to host. > that doesn't seem any better than just using Google Forms or Airtable to collect those responses. Mind if I ask why? I think DIY is better than those because of the smaller friction in collecting feedback.
- Rastonbury 2y agoI think you are over thinking it, when there are times I really want to give feedback I'll look for a contact email and just send it straight there. If I encounter some small bug, I won't close the tab because it links to Google form, this isn't an onboarding flow. Just do what's easiest for you, I say this respectfully it is not worth your time agonizing over a feedback form. Your time is better spent looking for a problem painful enough that when something doesn't work, I feel compelled to send you feedback because I want the product to work.
- mmarian 2y ago> Just do what's easiest for you, I say this respectfully it is not worth your time agonizing over a feedback form I agree, it's not worth agonizing over the form before every single project. But I've done a few projects with feedback forms and I realised I can't answer what's the easiest way to do it, and it annoyed me. I'm glad I posted this question because I discovered much simpler solutions. > when there are times I really want to give feedback I'll look for a contact email and just send it straight there I wouldn't choose showing my contact email, it'll get spammed for eternity.
- solardev 2y ago> I think that would cause too much friction for something that should be a 5-seconds-or-less kind of experience. I don't think I'd agree with that, but that's just my intuition thinking a link is less annoying than a popup. I have no data to back that up either way. But put it this way: A popup or embed annoys every single visitor, as soon as they show up. Very few of them will want to send you anything at all, but they all get annoyed. I know that every time I see a popup, my first instinct is to close it without even reading it. (I only suggested this because it's a very common pattern, often insisted on by product owners... but as a frontend dev, I hate floating things like that). On the other hand, a link is a word or two I can quickly scan and ignore if I don't want to use it. If I do, I know exactly what happens if I click it... it opens. Maybe a compromise is just to have a "Contact" link in the header (instead of the very bottom) that goes to a contact page with an embedded form. (Or a drop-down form if you really must). > I don't really want a complex setup, with user heatmaps and such; these are projects that have very limited features and likely to shut down in a few months. > [...] > Mind if I ask why? I think DIY is better than those because of the smaller friction in collecting feedback. To me that's all the more reason to just find some drop-in feedback widget. It takes like one line of code and 5 min to set up and it's going to be like 95%+ reliable. Someone else did all the design work, testing, CDN stuff, etc. If it's not core business logic for your startup, why waste time on it at this early state? It's literally just a text box for someone to send you a message. It could be a mailto link if that's easier. The trouble with rolling your own is just that it's a hassle. You gotta do the frontend for your visitors and make sure the popup is responsive and has the right z-index vs everything else on the page, etc. You have to design a backend and make sure it's authed and protected from drive-by bots and such. You have to either be willing to parse entries in a DB/KV browser or else design a viewer frontend for yourself. That's like hours/days of work, in my mind, vs a drop-in one-line script (or a link), under a vendor's free or cheapest plan. And if you want to accept files (like screenshots or recordings), it becomes quite a bit harder. But if you really want to DIY it... > How would you set up the schema to store the data, while allowing for migrations that will probably happen quite often? One setup I've hosted involves a Go/Gin server with embedded SQLite on Hetzner using Caprover, which I felt worked quite nice. It's costing me about $5/month, which I need to spend for another server I need to host. I think this use case is simple enough you could do it however you want. If your app has a DB already, it can just write to another table there (with proper sanitization and and bot blocking, etc.). It does run the risk of bad actors damaging your prod DB, though. If I were doing it, it'd be like a few lines of code in a serverless func writing to a serverless KV, like a Cloudflare Worker writing to a Workers KV: https://developers.cloudflare.com/kv/ https://developers.cloudflare.com/kv/ It should be free up to 1000 writes/day, 1 GB of stored data. The schema can just be something simple, like: { feedback_api_version: 0.01, email: "nicefellow@gmail.com", comment: "Hi, blah blah blah, I love your product but...." } If you version it every time you change the schema, it should be simple to write an importer/normalizer in the future. If you want to put it in a DB instead of a KV, go ahead. Doesn't seem like the kind of thing that really needs its own server, but if you prefer that architecture and don't mind paying for it, why not? You can probably put it on a free plan somewhere ( Vercel, Firebase, wherever: https://gist.github.com/bmaupin/0ce79806467804fdbbf8761970511b8c https://gist.github.com/bmaupin/0ce79806467804fdbbf876197051...). But it just seems like overkill to me. You're just reinventing Google Forms and Airtables, who already has all that done and tested and deployed and battle-tested thousands if not millions of times a day.
- gtirloni 2y ago> bad for SEO How so?
- mmarian 2y agoThe embedded form takes a while to load (relatively speaking), and page speed is a ranking factor for search engines.
- stocknoob 2y agoLoad the form asynchronously, or after the user clicks “feedback”. If Google forms are ugly, write your own form that submits to the same endpoint: https://blog.webjeda.com/google-form-customize/ https://blog.webjeda.com/google-form-customize/
- mmarian 2y agoOh that's a really neat trick, I'm guessing I could also send via JS if I set up a FormData with the same fields (probably just a generic text input that I'll just dump everything to). And then I can automatically get email notifications. I think that's the best option so far, thank you!
- stocknoob 2y agoNp, hope it works out!
- curiousfab 2y agoI am running a few websites which have a simple feedback forms which POST to a simple PHP script that sends me an email. By filtering for a few keywords, you can get of 99% of the form spam. Deliverability has never been an issue for me since (of course) I run my own mail server. But I doubt it's a serious issue when you take the little time it takes to set up DKIM etc. I wouldn't make it more complicated than it has to be :-)
- handzhiev 2y agoI would add a simple db to save the form submissions - this way there would be no risk of losing data in case the email did not arrive
- mmarian 2y agoI agree, I even went the other way and removed the email notification and just kept an embedded SQLite database. I figured that's more reliable than hoping the emails always end up in my inbox.
- mmarian 2y agoMy Go script is pretty simple too, I'm more worried about the stuff around it really. How do you host your PHP script by the way? > By filtering for a few keywords, you can get of 99% of the form spam. Interesting, didn't think about it. You do this in the UI logic before the form is submitted? What keywords do you use? > Deliverability has never been an issue for me since (of course) I run my own mail server. Fair enough, I assumed this would be an issue so I never explored the possibility of hosting my own mail server.
- manuelmoreale 2y agoI have a form on my website to leave a message on the /guestbook I added the simplest and most basic of captchas and so far I got 0 spam. It’s been online for months at this point. Sometimes a stupidly basic solution works incredibly well.
- ulrischa 2y agoTrue. No Service needed. Just a cheap php webhosting, a simple Form and a php script
- manmtstream 2y agoTally is great, unlimited submissions https://tally.so/ https://tally.so/
- leros 2y agoA link to a Google Form is fine IMO. Don't embed it. I use Canny.io for some sites. You have to jump through a few hoops to enable their free plan, but it's decent. Honestly, the Google Form is simpler to setup and a better user experience.
- nahtnam 2y agoHave you tried https://tally.so https://tally.so? Load the embed after the user clicks a button and that should solve your SEO problem
- superkuh 2y agoThere's no need for additional software or third party complexity. Have your webserver create a custom logfile of HTTP POST to a certain url, ie POST to "example.com/feedback". Then write a static HTML snippet form that POSTs the comment content to that URL from the user's browser when they visit your webpage(s) and hit [submit]. Read this logfile with a text editor or do whatever you want. It should be possible with any webserver but I know it's possible with nginx. No attack surface beyond spamming the log to cause filling up of disk space. But you can limit this by setting a max POST content size in nginx and a rate limit then doing a logrotate on the host OS. No moving parts to fail or maintain. Just pure comment form.
- mmarian 2y agoOh my god that's actually brilliant!! I kept thinking about how to store the data, handle migrations, and I totally missed out that I could just write the whole damn thing to a file. Thank you!
- superkuh 2y agoIf you're actually interested he's a write up showing the nginx config tricks (like proxy passing to itself to get the POST contents), http://superkuh.com/blog/2020-01-10-1.html http://superkuh.com/blog/2020-01-10-1.html
- mmarian 2y agoCheers, what I'd probably do is the following: - use my Go/Gin server - host as a Docker container inside my Docker Swarm cluster managed by CapRover, so I don't have to pay for a new VM - given a request from a new origin, my server creates a log file with the origin name and writes the data - given a request from an existing origin, my server appends the data to the file - I expose an endpoint with an api key that serves all the contents of a file for a given origin Let me know if I missed something out though.
- mmarian 2y agoJust checked out your website by the way and wanted to say the comment system is really neat. Recommend everyone else to have a look.
- jaredtking 2y agoI really like Feature Upvote, featureupvote.com
- mmarian 2y agoThere's no free plan and I need to pay $59/month from the get-go. It makes no sense for my projects I'm afraid.
- jaredtking 2y agoYeah I agree. When I first started using them it was a single price point for multiple products and didn’t realize the new pricing was higher.
- mmarian 2y agoFair enough, thanks for the suggestion anyway.
- magnio 2y agoIn my opinion, a link to a Google Form is superior, not necessarily because Google Form has the best UX, but because it has the most familiar UX. Many people would probably have filled in a Google Form before, so having the de facto default form solution is the easiest on users.
- mmarian 2y agoI agree Google Forms a familiar experience, but I'm worried that it will look amateurish. Especially if you come from a crisp landing page and you don't know/trust the website you've gone to (it's the first time you've seen it, after all).
- snarkyturtle 2y agoNetlify forms: https://docs.netlify.com/forms/setup/ https://docs.netlify.com/forms/setup/ First-party support, generous free tier (and cheap enough if you go over 100 submissions in a month), simple implementation, just POST to it like any other form.
- arcanemachiner 2y agoI also use this. Spam is nearly nonexistent and I can embed analytics in the GET request to the form page (fixes an issue with Google Forms mentioned by another commenter).
- mmarian 2y agoIn case anyone else is wondering, the other commenter that had analytics issues was @mellow-lake-day
- mmarian 2y agoA trustworthy choice, though I'm confused what happens after you exceed the 100 subs/month. Their pricing page seems to suggest that you pay more than $19/month since the Pro plan also has the 100 subs limit. Looks like I'm not the only one: https://answers.netlify.com/t/netlify-forms-pricing-model-19-for-every-100-over-100-or-a-flat-19-fee-for-unlimited-submissions-over-100/102855 https://answers.netlify.com/t/netlify-forms-pricing-model-19...
- saurik 2y ago<a href="mailto:..."> Just using email is not only easier to implement, it is easier for the user to use, makes the user feel better about the process (web forms are almost always designed to prevent feedback: an email address might still connect to a ticketing system but mentally implies a human will read and triage the message), and gives them context and history for their message (as the user has a copy of what they sent in their client).
- mmarian 2y agoI did that before and I ended up being sentenced to bombardment by spam on that address for forever.
- rrr_oh_man 2y ago> easier for the user to use, makes the user feel better about the process I'd nope out of there in a millisecond if a "give feedback" button would be a mailto.
- saurik 2y agoReally? You find it more likely that some form POST is going to result in a useful response?!? I have to often coordinate things with a ton of people who work on random projects or with the customer support of various companies, and FWIW my experience doesn't match that at all :/.
- rrr_oh_man 2y agoI'm going against the grain here probably, but I love those customer chat tools where the customer service is not a half-baked "AI" bot, but a direct line to someone knowledgeable. Or a Whatsapp/Telegram link. E.g. over the years, Raidboxes.io has frequently answered to my questions on a Sunday, in the am, in less than 15 minutes. That's an outlier, but it has anchored my expectations for the future. At the last startup I worked at we have tried to implement a similar responsiveness by utilizing a distributed team across the globe. If you funnel your customer comms into one more or less decent system (most are different shades of crappy), it can work pretty well for both customers & team.
- whitefang 2y agoWith Formester you have options for both 1 and 2. I also like to think myself as hacker and write blogs and launch apps. And it made me realize the current offerings are ugly and not neat. I'll love to get your feedback too.
- aantix 2y agoYouForm is a good-looking (and much cheaper) alternative to Typeform. Beautiful conversational forms. https://youform.com/ https://youform.com/ Unlimited forms and responses for the free tier. Embeddable.
- webdevfe 2y agoI have built a tool for this. Its free to try. I didn't put enough effort to grow it, however. I don't want to spam here but if anyone is interested please let me know and I'll provide a link. The service includes a dashboard with Metrics and Insights, customization and more.
- webdevfe 2y agoAlso, I felt like this space is dead. But if there are still believers I'd be interested in collaboration and maybe even offer a paid gig.
- IndianScamOps 2y ago[dead]
- IndianScamOps 2y ago[dead]
- mellow-lake-day 2y agoI use a google form for my app. Downside is that I'm not able to gather statistics or additional info from form (such as os version, phone model, etc).
- racl101 2y agoGoogle Form.
- SoftTalker 2y ago"feedback form" to me implies something pretty simple, like a text box. Why not just have an HTML form that saves to a database or file(s)? If you actually mean a survey or a lot of questions with multiple-choice answers and nicely tabulated results, then yeah you probably want to just go with a 3rd party backend, or you will end up in a rabbit hole and ultimately reinvent one.
- mmarian 2y agoI agree, it should be something very simple. I ended up trying the database approach in my latest project, but then I started thinking about schema/migrations. I totally missed out the file option that you and @superkuh suggested. It's either that or the Google Forms hack that @stocknoob pointed out, which I'm hoping could be used for ajax requests too.
- SkyPuncher 2y agoWhy would you need a migration for this?
- mmarian 2y agoIn case I change the schema for whatever reason.
- SkyPuncher 2y agoBut why? This data doesn’t need to persist forever. You could literally drop the table (after doing a backup) anytime you need to make a migration.
- mmarian 2y agoI agree the data doesn't need to persist forever, but I don't want to think about backups either. Fussy, I know :)
- dmitrygr 2y ago<a href="mailto:feedback@mydomain.com">Send feedback</a>
- SkyPuncher 2y agoThis is something that you just go with the cheapest/easiest solution. The type of signal you get from these forms is almost zero. Putting effort into it is basically like polishing a turd. Put as little effort as you can into it. A link to a Google Form is always my default. In the past, I’ve built a very, very simple submission form. No validation, no error handling, etc. just a post to a simple server that dumps it in a DB. This was only necessary to meat some compliance requirements.
- rrr_oh_man 2y agoTypeform hits the right spot in terms of professional looking vs easy to use and to setup.
- Leftium 2y agoYou can POST to Google forms from a custom form on your website: https://g.leftium.com/r/sample https://g.leftium.com/r/sample This should solve both aesthetic and speed (SEO) problems. I built a Google forms prettifier: https://g.leftium.com/pretty https://g.leftium.com/pretty You simply have to "mimic" the Google form own your own site: https://github.com/Leftium/cloud9dancehall.com/blob/c17c5a66cd911e5297f3797a22facec5bda96c8a/src/routes/(no-nav)/pretty/form/%2Bpage.svelte#L25-L40 https://github.com/Leftium/cloud9dancehall.com/blob/c17c5a66...
- Ladyady 2y agoDon't think anyone has mentioned https://web3forms.com/ https://web3forms.com/ which normally means there's a good reason not to... Anyone advise against it?
- rman666 2y agoJust put your physical mailing address on the bottom of your site, in small print, and allow 6-10 weeks for a response. That’ll stop the spam. /s
- oliwarner 2y agoThe third option has the ability to be customised beyond the others. I have a client who needed their prospective clients to upload photos. None of the usual suspects would handle that at the time. This also allows us to do client-side resizing, cropping. On deliverability, you don't only have to send them on, you can store them in a database and build an interface onto that. If you already have a backend system (eg Django and its Admin), that's easy. Great if there are multiple people handling emails. The downside isn't running it, it's spam. But for another client, I skipped forms altogether. Raw email address on the contact page alongside a WhatsApp link and a phone number. Will some people drop through the cracks? Maybe.
- mmarian 2y agoI prefer the 3rd option as well, and I like the idea of avoiding email sending and just storing the data on the VM, then making it available via an interface. @superkuh had a really nice idea to just store the data in files, that way I don't have to think about which database / what schema to pick. Definitely wouldn't want to share email/phone number though. I've done it before and ended up with spam.